UNPKG

3.7 kBTypeScriptView Raw
1import {
2 Context as LambdaContext,
3 Handler as LambdaHandler
4} from 'aws-lambda'
5
6declare type PluginHook = () => void
7declare type PluginHookWithMiddlewareName = (middlewareName: string) => void
8declare type PluginHookPromise = () => Promise<any>
9
10interface PluginObject {
11 beforePrefetch?: PluginHook
12 requestStart?: PluginHook
13 beforeMiddleware?: PluginHookWithMiddlewareName
14 afterMiddleware?: PluginHookWithMiddlewareName
15 beforeHandler?: PluginHook
16 afterHandler?: PluginHook
17 requestEnd?: PluginHookPromise
18}
19
20interface Request<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> {
21 event: TEvent
22 context: TContext
23 response: TResult | null
24 error: TErr | null
25 internal: {
26 [key: string]: any
27 }
28}
29
30declare type MiddlewareFn<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> = (request: Request<TEvent, TResult, TErr, TContext>) => any
31
32export interface MiddlewareObj<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> {
33 before?: MiddlewareFn<TEvent, TResult, TErr, TContext>
34 after?: MiddlewareFn<TEvent, TResult, TErr, TContext>
35 onError?: MiddlewareFn<TEvent, TResult, TErr>
36}
37
38type MiddyInputHandler<TEvent, TResult, TContext> = (event: TEvent, context: TContext) => Promise<TResult>
39
40export interface MiddyfiedHandler<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> extends MiddyInputHandler<TEvent, TResult, TContext> {
41 use: UseFn<TEvent, TResult, TErr, TContext>
42 applyMiddleware: AttachMiddlewareObj<TEvent, TResult, TErr, TContext>
43 before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
44 after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
45 onError: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
46 __middlewares: {
47 before: Array<MiddlewareFn<TEvent, TResult, TErr, TContext>>
48 after: Array<MiddlewareFn<TEvent, TResult, TErr, TContext>>
49 onError: Array<MiddlewareFn<TEvent, TResult, TErr, TContext>>
50 }
51 (event: TEvent, context: TContext): Promise<TResult>
52}
53
54declare type AttachMiddlewareFn<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> = (middleware: MiddlewareFn) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
55
56declare type AttachMiddlewareObj<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> = (middleware: MiddlewareObj) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
57
58declare type UseFn<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> =
59 (middlewares: MiddlewareObj<TEvent, TResult, TErr, TContext> | Array<MiddlewareObj<TEvent, TResult, TErr, TContext>>) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
60
61declare type MiddlewareHandler<THandler extends LambdaHandler<any, any>, TContext> =
62 THandler extends LambdaHandler<infer TEvent, infer TResult> // always true
63 ? (event: TEvent, context: TContext) => Promise<TResult>
64 : never
65
66/**
67 * Middy factory function. Use it to wrap your existing handler to enable middlewares on it.
68 * @param handler your original AWS Lambda function
69 * @param plugin wraps around each middleware and handler to add custom lifecycle behaviours (e.g. to profile performance)
70 */
71declare function middy<TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = any> (handler?: MiddlewareHandler<LambdaHandler<TEvent, TResult>, TContext>, plugin?: PluginObject): MiddyfiedHandler<TEvent, TResult, TErr, TContext>
72
73declare namespace middy {
74 export {
75 Request,
76 PluginHook,
77 PluginHookWithMiddlewareName,
78 PluginObject,
79 MiddlewareFn,
80 MiddlewareObj,
81 MiddyfiedHandler
82 }
83}
84
85export default middy