UNPKG

4.77 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 = (
10 request: Request
11) => Promise<unknown> | unknown
12
13interface PluginObject {
14 internal?: any
15 beforePrefetch?: PluginHook
16 requestStart?: PluginHook
17 beforeMiddleware?: PluginHookWithMiddlewareName
18 afterMiddleware?: PluginHookWithMiddlewareName
19 beforeHandler?: PluginHook
20 timeoutEarlyInMillis?: number
21 timeoutEarlyResponse?: PluginHook
22 afterHandler?: PluginHook
23 requestEnd?: PluginHookPromise
24 streamifyResponse?: Boolean
25}
26
27export interface Request<
28 TEvent = any,
29 TResult = any,
30 TErr = Error,
31 TContext extends LambdaContext = LambdaContext
32> {
33 event: TEvent
34 context: TContext
35 response: TResult | null
36 error: TErr | null
37 internal: {
38 [key: string]: any
39 }
40}
41
42declare type MiddlewareFn<
43 TEvent = any,
44 TResult = any,
45 TErr = Error,
46 TContext extends LambdaContext = LambdaContext
47> = (request: Request<TEvent, TResult, TErr, TContext>) => any
48
49export interface MiddlewareObj<
50 TEvent = unknown,
51 TResult = any,
52 TErr = Error,
53 TContext extends LambdaContext = LambdaContext
54> {
55 before?: MiddlewareFn<TEvent, TResult, TErr, TContext>
56 after?: MiddlewareFn<TEvent, TResult, TErr, TContext>
57 onError?: MiddlewareFn<TEvent, TResult, TErr, TContext>
58}
59
60// The AWS provided Handler type uses void | Promise<TResult> so we have no choice but to follow and suppress the linter warning
61// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
62type MiddyInputHandler<
63 TEvent,
64 TResult,
65 TContext extends LambdaContext = LambdaContext
66> = (
67 event: TEvent,
68 context: TContext,
69 callback: LambdaCallback<TResult>
70) => // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
71void | Promise<TResult> | TResult
72type MiddyInputPromiseHandler<
73 TEvent,
74 TResult,
75 TContext extends LambdaContext = LambdaContext
76> = (event: TEvent, context: TContext) => Promise<TResult>
77
78export interface MiddyfiedHandler<
79 TEvent = any,
80 TResult = any,
81 TErr = Error,
82 TContext extends LambdaContext = LambdaContext
83> extends MiddyInputHandler<TEvent, TResult, TContext>,
84 MiddyInputPromiseHandler<TEvent, TResult, TContext> {
85 use: UseFn<TEvent, TResult, TErr, TContext>
86 before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
87 after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
88 onError: AttachMiddlewareFn<TEvent, TResult, TErr, TContext>
89 handler: <TAdditional>(
90 handler: MiddlewareHandler<
91 LambdaHandler<TEvent & TAdditional, TResult>,
92 TContext
93 >
94 ) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
95}
96
97declare type AttachMiddlewareFn<
98 TEvent = any,
99 TResult = any,
100 TErr = Error,
101 TContext extends LambdaContext = LambdaContext
102> = (
103 middleware: MiddlewareFn<TEvent, TResult, TErr, TContext>
104) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
105
106declare type AttachMiddlewareObj<
107 TEvent = any,
108 TResult = any,
109 TErr = Error,
110 TContext extends LambdaContext = LambdaContext
111> = (
112 middleware: MiddlewareObj<TEvent, TResult, TErr, TContext>
113) => MiddyfiedHandler<TEvent, TResult, TErr, TContext>
114
115declare type UseFn<
116 TEvent = any,
117 TResult = any,
118 TErr = Error,
119 TContext extends LambdaContext = LambdaContext
120> = <TMiddleware extends MiddlewareObj<any, any, Error, any>>(
121 middlewares: TMiddleware | TMiddleware[]
122) => TMiddleware extends MiddlewareObj<
123infer TMiddlewareEvent,
124any,
125Error,
126infer TMiddlewareContext
127>
128 ? MiddyfiedHandler<
129 TMiddlewareEvent & TEvent,
130 TResult,
131 TErr,
132 TMiddlewareContext & TContext
133 > // always true
134 : never
135
136declare type MiddlewareHandler<
137 THandler extends LambdaHandler<any, any>,
138 TContext extends LambdaContext = LambdaContext
139> = THandler extends LambdaHandler<infer TEvent, infer TResult> // always true
140 ? MiddyInputHandler<TEvent, TResult, TContext>
141 : never
142
143/**
144 * Middy factory function. Use it to wrap your existing handler to enable middlewares on it.
145 * @param handler your original AWS Lambda function
146 * @param plugin wraps around each middleware and handler to add custom lifecycle behaviours (e.g. to profile performance)
147 */
148declare function middy<
149 TEvent = unknown,
150 TResult = any,
151 TErr = Error,
152 TContext extends LambdaContext = LambdaContext
153> (
154 handler?: MiddlewareHandler<LambdaHandler<TEvent, TResult>, TContext> | PluginObject,
155 plugin?: PluginObject
156): MiddyfiedHandler<TEvent, TResult, TErr, TContext>
157
158declare namespace middy {
159 export {
160 Request,
161 PluginHook,
162 PluginHookWithMiddlewareName,
163 PluginObject,
164 MiddlewareFn,
165 MiddlewareObj,
166 MiddyfiedHandler
167 }
168}
169
170export default middy