UNPKG

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