UNPKG

@middy/core

Version:

🛵 The stylish Node.js middleware engine for AWS Lambda (core package)

171 lines (156 loc) • 4.77 kB
import { Callback as LambdaCallback, Context as LambdaContext, Handler as LambdaHandler } from 'aws-lambda' declare type PluginHook = () => void declare type PluginHookWithMiddlewareName = (middlewareName: string) => void declare type PluginHookPromise = ( request: Request ) => Promise<unknown> | unknown interface PluginObject { internal?: any beforePrefetch?: PluginHook requestStart?: PluginHook beforeMiddleware?: PluginHookWithMiddlewareName afterMiddleware?: PluginHookWithMiddlewareName beforeHandler?: PluginHook timeoutEarlyInMillis?: number timeoutEarlyResponse?: PluginHook afterHandler?: PluginHook requestEnd?: PluginHookPromise streamifyResponse?: Boolean } export interface Request< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > { event: TEvent context: TContext response: TResult | null error: TErr | null internal: { [key: string]: any } } declare type MiddlewareFn< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > = (request: Request<TEvent, TResult, TErr, TContext>) => any export interface MiddlewareObj< TEvent = unknown, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > { before?: MiddlewareFn<TEvent, TResult, TErr, TContext> after?: MiddlewareFn<TEvent, TResult, TErr, TContext> onError?: MiddlewareFn<TEvent, TResult, TErr, TContext> } // The AWS provided Handler type uses void | Promise<TResult> so we have no choice but to follow and suppress the linter warning // eslint-disable-next-line @typescript-eslint/no-invalid-void-type type MiddyInputHandler< TEvent, TResult, TContext extends LambdaContext = LambdaContext > = ( event: TEvent, context: TContext, callback: LambdaCallback<TResult> ) => // eslint-disable-next-line @typescript-eslint/no-invalid-void-type void | Promise<TResult> | TResult type MiddyInputPromiseHandler< TEvent, TResult, TContext extends LambdaContext = LambdaContext > = (event: TEvent, context: TContext) => Promise<TResult> export interface MiddyfiedHandler< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > extends MiddyInputHandler<TEvent, TResult, TContext>, MiddyInputPromiseHandler<TEvent, TResult, TContext> { use: UseFn<TEvent, TResult, TErr, TContext> before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext> after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext> onError: AttachMiddlewareFn<TEvent, TResult, TErr, TContext> handler: <TAdditional>( handler: MiddlewareHandler< LambdaHandler<TEvent & TAdditional, TResult>, TContext > ) => MiddyfiedHandler<TEvent, TResult, TErr, TContext> } declare type AttachMiddlewareFn< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > = ( middleware: MiddlewareFn<TEvent, TResult, TErr, TContext> ) => MiddyfiedHandler<TEvent, TResult, TErr, TContext> declare type AttachMiddlewareObj< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > = ( middleware: MiddlewareObj<TEvent, TResult, TErr, TContext> ) => MiddyfiedHandler<TEvent, TResult, TErr, TContext> declare type UseFn< TEvent = any, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > = <TMiddleware extends MiddlewareObj<any, any, Error, any>>( middlewares: TMiddleware | TMiddleware[] ) => TMiddleware extends MiddlewareObj< infer TMiddlewareEvent, any, Error, infer TMiddlewareContext > ? MiddyfiedHandler< TMiddlewareEvent & TEvent, TResult, TErr, TMiddlewareContext & TContext > // always true : never declare type MiddlewareHandler< THandler extends LambdaHandler<any, any>, TContext extends LambdaContext = LambdaContext > = THandler extends LambdaHandler<infer TEvent, infer TResult> // always true ? MiddyInputHandler<TEvent, TResult, TContext> : never /** * Middy factory function. Use it to wrap your existing handler to enable middlewares on it. * @param handler your original AWS Lambda function * @param plugin wraps around each middleware and handler to add custom lifecycle behaviours (e.g. to profile performance) */ declare function middy< TEvent = unknown, TResult = any, TErr = Error, TContext extends LambdaContext = LambdaContext > ( handler?: MiddlewareHandler<LambdaHandler<TEvent, TResult>, TContext> | PluginObject, plugin?: PluginObject ): MiddyfiedHandler<TEvent, TResult, TErr, TContext> declare namespace middy { export { Request, PluginHook, PluginHookWithMiddlewareName, PluginObject, MiddlewareFn, MiddlewareObj, MiddyfiedHandler } } export default middy