UNPKG

@h4ad/serverless-adapter

Version:

Run REST APIs and other web applications using your existing Node.js application framework (NestJS, Express, Koa, Hapi, Fastify and many others), on top of AWS, Azure, Digital Ocean and many other clouds.

1 lines 8.84 kB
{"version":3,"sources":["../src/serverless-adapter.ts"],"sourcesContent":["//#region Imports\n\nimport type { BinarySettings } from './@types';\nimport type {\n AdapterContract,\n FrameworkContract,\n HandlerContract,\n ResolverContract,\n ServerlessHandler,\n} from './contracts';\nimport {\n DEFAULT_BINARY_CONTENT_TYPES,\n DEFAULT_BINARY_ENCODINGS,\n type ILogger,\n createDefaultLogger,\n} from './core';\n\n//#endregion\n\n/**\n * The class used to build the serverless handler.\n *\n * @example\n * ```typescript\n * const app = express();\n * export const handler = ServerlessAdapter.new(app)\n * .setFramework(new ExpressFramework())\n * .setHandler(new DefaultHandler())\n * .setResolver(new PromiseResolver())\n * .setRespondWithErrors(true)\n * .addAdapter(new AlbAdapter())\n * .addAdapter(new SQSAdapter())\n * .addAdapter(new SNSAdapter())\n * .build();\n * ```\n *\n * @breadcrumb ServerlessAdapter\n * @public\n */\nexport class ServerlessAdapter<\n TApp,\n TEvent,\n TContext,\n TCallback,\n TResponse,\n TReturn,\n> {\n //#region Constructor\n\n /**\n * Default constructor\n */\n private constructor(app: TApp) {\n this.app = app;\n }\n\n //#endregion\n\n //#region Protected Properties\n\n /**\n * The instance of the app (express, hapi, koa, etc...)\n */\n protected app: TApp;\n\n //#endregion\n\n //#region Protected Properties\n\n /**\n * Settings for whether the response should be treated as binary or not\n *\n * @defaultValue `contentEncodings` and `contentTypes` are set with {@link DEFAULT_BINARY_ENCODINGS} and {@link DEFAULT_BINARY_CONTENT_TYPES}, respectively.\n */\n protected binarySettings: BinarySettings = {\n contentEncodings: DEFAULT_BINARY_ENCODINGS,\n contentTypes: DEFAULT_BINARY_CONTENT_TYPES,\n };\n\n /**\n * Indicates whether the error stack should be included in the response or not\n *\n * @remarks These errors will only be included when an error occurs while forwarding the event to the framework\n * @defaultValue True when NODE_ENV is equal to `development`\n */\n protected respondWithErrors: boolean = process.env.NODE_ENV === 'development';\n\n /**\n * The instance of the logger service\n */\n protected log: ILogger = createDefaultLogger();\n\n /**\n * The list of adapters used to handle an event's request and response\n */\n protected adapters: AdapterContract<TEvent, TContext, TResponse>[] = [];\n\n /**\n * The framework that will process requests\n */\n protected framework?: FrameworkContract<TApp>;\n\n /**\n * The resolver that aims to resolve the response to serverless and stop its execution when the request ends\n */\n protected resolver?: ResolverContract<\n TEvent,\n TContext,\n TCallback,\n TResponse,\n TReturn\n >;\n\n /**\n * The handler that will get the event, context and callback and pass it to the adapter and framework\n */\n protected handler?: HandlerContract<\n TApp,\n TEvent,\n TContext,\n TCallback,\n TResponse,\n TReturn\n >;\n\n //#endregion\n\n //#region Static Methods\n\n /**\n * Creates a new instance of the builder with app (express, hapi, koa, etc...)\n *\n * @param app - The instance of the app\n */\n public static new<\n TApp,\n TEvent,\n TContext = any,\n TCallback = any,\n TResponse = any,\n TReturn = any,\n >(\n app: TApp,\n ): ServerlessAdapter<TApp, TEvent, TContext, TCallback, TResponse, TReturn> {\n return new ServerlessAdapter(app);\n }\n\n //#endregion\n\n //#region Builder Methods\n\n /**\n * Defines the handler that will get the event, context and callback and pass it to the adapter and framework\n *\n * @param handler - The implementation of the handler contract\n */\n public setHandler(\n handler: HandlerContract<\n TApp,\n TEvent,\n TContext,\n TCallback,\n TResponse,\n TReturn\n >,\n ): Omit<this, 'setHandler'> {\n if (this.handler)\n throw new Error('SERVERLESS_ADAPTER: The handler should not set twice.');\n\n this.handler = handler;\n\n return this;\n }\n\n /**\n * Defines the resolver that aims to resolve the response to serverless and stop its execution when the request ends\n *\n * @param resolver - The implementation of the resolver contract\n */\n public setResolver(\n resolver: ResolverContract<TEvent, TContext, TCallback, TResponse, TReturn>,\n ): Omit<this, 'setResolver'> {\n if (this.resolver)\n throw new Error('SERVERLESS_ADAPTER: The resolver should not set twice.');\n\n this.resolver = resolver;\n\n return this;\n }\n\n /**\n * Defines the framework that will process requests\n *\n * @param framework - The implementation of the framework contract\n */\n public setFramework(\n framework: FrameworkContract<TApp>,\n ): Omit<this, 'setFramework'> {\n if (this.framework) {\n throw new Error(\n 'SERVERLESS_ADAPTER: The framework should not set twice.',\n );\n }\n\n this.framework = framework;\n\n return this;\n }\n\n /**\n * Defines the logger service used during the execution of the handler\n *\n * @param logger - The implementation of the logger\n */\n public setLogger(logger: ILogger): Omit<this, 'setLogger'> {\n this.log = logger;\n\n return this;\n }\n\n /**\n * Defines the binary settings for whether the response should be treated as binary or not\n *\n * @param binarySettings - The binary settings\n */\n public setBinarySettings(\n binarySettings: BinarySettings,\n ): Omit<this, 'setBinarySettings'> {\n this.binarySettings = {\n ...this.binarySettings,\n ...binarySettings,\n };\n\n return this;\n }\n\n /**\n * Defines the responseWithErrors, a property that indicates whether the error stack should be included in the response or not\n *\n * @param respondWithErrors - Should include or not the errors in response\n */\n public setRespondWithErrors(\n respondWithErrors: boolean,\n ): Omit<this, 'setRespondWithErrors'> {\n this.respondWithErrors = respondWithErrors;\n\n return this;\n }\n\n /**\n * Add an adapter to the adapters list to handle the event coming from any serverless event source\n *\n * @param adapter - The implementation of the adapter contract\n */\n public addAdapter(\n adapter: AdapterContract<TEvent, TContext, TResponse>,\n ): Pick<this, 'addAdapter' | 'build'> {\n this.adapters.push(adapter);\n\n return this;\n }\n\n /**\n * The builder method that returns the handler function to be exported for serverless consumption\n */\n public build(): ServerlessHandler<TReturn> {\n if (!this.resolver) {\n throw new Error(\n 'SERVERLESS_ADAPTER: Is required to set a resolver before build.',\n );\n }\n\n if (!this.framework) {\n throw new Error(\n 'SERVERLESS_ADAPTER: Is required to set a framework before build.',\n );\n }\n\n if (!this.handler) {\n throw new Error(\n 'SERVERLESS_ADAPTER: Is required to set a handler before build.',\n );\n }\n\n if (this.adapters.length === 0) {\n throw new Error(\n 'SERVERLESS_ADAPTER: Is required to set at least one adapter.',\n );\n }\n\n return this.handler.getHandler(\n this.app,\n this.framework,\n this.adapters,\n this.resolver,\n this.binarySettings,\n this.respondWithErrors,\n this.log,\n );\n }\n\n //#endregion\n}\n"],"mappings":"+RAuCO,IAAMA,EAAN,MAAMC,CAOX,CA9CF,MA8CE,CAAAC,EAAA,0BAMQ,YAAYC,EAAW,CAC7B,KAAK,IAAMA,CACb,CASU,IAWA,eAAiC,CACzC,iBAAkBC,EAClB,aAAcC,CAChB,EAQU,kBAA6B,QAAQ,IAAI,WAAa,cAKtD,IAAeC,EAAoB,EAKnC,SAA2D,CAAC,EAK5D,UAKA,SAWA,QAkBV,OAAc,IAQZH,EAC0E,CAC1E,OAAO,IAAIF,EAAkBE,CAAG,CAClC,CAWO,WACLI,EAQ0B,CAC1B,GAAI,KAAK,QACP,MAAM,IAAI,MAAM,uDAAuD,EAEzE,YAAK,QAAUA,EAER,IACT,CAOO,YACLC,EAC2B,CAC3B,GAAI,KAAK,SACP,MAAM,IAAI,MAAM,wDAAwD,EAE1E,YAAK,SAAWA,EAET,IACT,CAOO,aACLC,EAC4B,CAC5B,GAAI,KAAK,UACP,MAAM,IAAI,MACR,yDACF,EAGF,YAAK,UAAYA,EAEV,IACT,CAOO,UAAUC,EAA0C,CACzD,YAAK,IAAMA,EAEJ,IACT,CAOO,kBACLC,EACiC,CACjC,YAAK,eAAiB,CACpB,GAAG,KAAK,eACR,GAAGA,CACL,EAEO,IACT,CAOO,qBACLC,EACoC,CACpC,YAAK,kBAAoBA,EAElB,IACT,CAOO,WACLC,EACoC,CACpC,YAAK,SAAS,KAAKA,CAAO,EAEnB,IACT,CAKO,OAAoC,CACzC,GAAI,CAAC,KAAK,SACR,MAAM,IAAI,MACR,iEACF,EAGF,GAAI,CAAC,KAAK,UACR,MAAM,IAAI,MACR,kEACF,EAGF,GAAI,CAAC,KAAK,QACR,MAAM,IAAI,MACR,gEACF,EAGF,GAAI,KAAK,SAAS,SAAW,EAC3B,MAAM,IAAI,MACR,8DACF,EAGF,OAAO,KAAK,QAAQ,WAClB,KAAK,IACL,KAAK,UACL,KAAK,SACL,KAAK,SACL,KAAK,eACL,KAAK,kBACL,KAAK,GACP,CACF,CAGF","names":["ServerlessAdapter","_ServerlessAdapter","__name","app","DEFAULT_BINARY_ENCODINGS","DEFAULT_BINARY_CONTENT_TYPES","createDefaultLogger","handler","resolver","framework","logger","binarySettings","respondWithErrors","adapter"]}