{"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"]}