{"version":3,"sources":["../../../src/adapters/huawei/huawei-api-gateway.adapter.ts"],"sourcesContent":["//#region Imports\n\nimport type {\n  HuaweiApiGatewayEvent,\n  HuaweiApiGatewayResponse,\n  HuaweiContext,\n} from '../../@types/huawei';\nimport type {\n  AdapterContract,\n  AdapterRequest,\n  GetResponseAdapterProps,\n  OnErrorProps,\n} from '../../contracts';\nimport {\n  getDefaultIfUndefined,\n  getEventBodyAsBuffer,\n  getFlattenedHeadersMap,\n  getMultiValueHeadersMap,\n  getPathWithQueryStringParams,\n} from '../../core';\n\n//#endregion\n\n/**\n * The options to customize the {@link HuaweiApiGatewayAdapter}\n *\n * @breadcrumb Adapters / Huawei / HuaweiApiGatewayAdapter\n * @public\n */\nexport interface HuaweiApiGatewayOptions {\n  /**\n   * Strip base path for custom domains\n   *\n   * @defaultValue ''\n   */\n  stripBasePath?: string;\n}\n\n/**\n * The adapter to handle requests from Huawei Api Gateway\n *\n * @example\n * ```typescript\n * const stripBasePath = '/any/custom/base/path'; // default ''\n * const adapter = new ApiGatewayAdapter({ stripBasePath });\n * ```\n *\n * @breadcrumb Adapters / Huawei / HuaweiApiGatewayAdapter\n * @public\n *\n * {@link https://support.huaweicloud.com/intl/en-us/devg-functiongraph/functiongraph_02_0102.html#functiongraph_02_0102__li5178638110137 | Event Reference}\n */\nexport class HuaweiApiGatewayAdapter\n  implements\n    AdapterContract<\n      HuaweiApiGatewayEvent,\n      HuaweiContext,\n      HuaweiApiGatewayResponse\n    >\n{\n  //#region Constructor\n\n  /**\n   * Default constructor\n   *\n   * @param options - The options to customize the {@link HuaweiApiGatewayAdapter}\n   */\n  constructor(protected readonly options?: HuaweiApiGatewayOptions) {}\n\n  //#endregion\n\n  //#region Public Methods\n\n  /**\n   * {@inheritDoc}\n   */\n  public getAdapterName(): string {\n    return HuaweiApiGatewayAdapter.name;\n  }\n\n  /**\n   * {@inheritDoc}\n   */\n  public canHandle(event: unknown): event is HuaweiApiGatewayEvent {\n    const apiGatewayEvent = event as Partial<HuaweiApiGatewayEvent>;\n\n    return !!(\n      apiGatewayEvent &&\n      apiGatewayEvent.httpMethod &&\n      apiGatewayEvent.requestContext &&\n      apiGatewayEvent.requestContext.apiId &&\n      apiGatewayEvent.requestContext.stage &&\n      apiGatewayEvent.requestContext.requestId &&\n      // to avoid conflict with api gateway v1 of aws\n      !('multiValueQueryStringParameters' in apiGatewayEvent)\n    );\n  }\n\n  /**\n   * {@inheritDoc}\n   */\n  public getRequest(event: HuaweiApiGatewayEvent): AdapterRequest {\n    const method = event.httpMethod;\n    const path = this.getPathFromEvent(event);\n\n    const headers = getFlattenedHeadersMap(event.headers, ',', true);\n\n    let body: Buffer | undefined;\n\n    if (event.body) {\n      const [bufferBody, contentLength] = getEventBodyAsBuffer(\n        event.body,\n        event.isBase64Encoded,\n      );\n\n      body = bufferBody;\n      headers['content-length'] = String(contentLength);\n    }\n\n    const remoteAddress = headers['x-real-ip'];\n\n    return {\n      method,\n      headers,\n      body,\n      remoteAddress,\n      path,\n    };\n  }\n\n  /**\n   * {@inheritDoc}\n   */\n  public getResponse({\n    headers: responseHeaders,\n    body,\n    isBase64Encoded,\n    statusCode,\n  }: GetResponseAdapterProps<HuaweiApiGatewayEvent>): HuaweiApiGatewayResponse {\n    const headers = getMultiValueHeadersMap(responseHeaders);\n\n    return {\n      statusCode,\n      body,\n      headers,\n      isBase64Encoded,\n    };\n  }\n\n  /**\n   * {@inheritDoc}\n   */\n  public onErrorWhileForwarding({\n    error,\n    delegatedResolver,\n    respondWithErrors,\n    event,\n    log,\n  }: OnErrorProps<HuaweiApiGatewayEvent, HuaweiApiGatewayResponse>): void {\n    const body = respondWithErrors ? error.stack : '';\n    const errorResponse = this.getResponse({\n      event,\n      statusCode: 500,\n      body: body || '',\n      headers: {},\n      isBase64Encoded: false,\n      log,\n    });\n\n    delegatedResolver.succeed(errorResponse);\n  }\n\n  //#endregion\n\n  //#region Protected Methods\n\n  /**\n   * Get path from event with query strings\n   *\n   * @param event - The event sent by serverless\n   */\n  protected getPathFromEvent(event: HuaweiApiGatewayEvent): string {\n    const stripBasePath = getDefaultIfUndefined(\n      this.options?.stripBasePath,\n      '',\n    );\n    const replaceRegex = new RegExp(`^${stripBasePath}`);\n    const path = event.path.replace(replaceRegex, '');\n\n    const queryParams = event.queryStringParameters;\n\n    return getPathWithQueryStringParams(path, queryParams);\n  }\n\n  //#endregion\n}\n"],"mappings":"sHAoDO,IAAMA,EAAN,MAAMC,CAOb,CAQE,YAA+BC,EAAmC,CAAnC,aAAAA,CAAoC,CAnErE,MA2DA,CAAAC,EAAA,gCAiBS,gBAAyB,CAC9B,OAAOF,EAAwB,IACjC,CAKO,UAAUG,EAAgD,CAC/D,IAAMC,EAAkBD,EAExB,MAAO,CAAC,EACNC,GACAA,EAAgB,YAChBA,EAAgB,gBAChBA,EAAgB,eAAe,OAC/BA,EAAgB,eAAe,OAC/BA,EAAgB,eAAe,WAE/B,EAAE,oCAAqCA,GAE3C,CAKO,WAAWD,EAA8C,CAC9D,IAAME,EAASF,EAAM,WACfG,EAAO,KAAK,iBAAiBH,CAAK,EAElCI,EAAUC,EAAuBL,EAAM,QAAS,IAAK,EAAI,EAE3DM,EAEJ,GAAIN,EAAM,KAAM,CACd,GAAM,CAACO,EAAYC,CAAa,EAAIC,EAClCT,EAAM,KACNA,EAAM,eACR,EAEAM,EAAOC,EACPH,EAAQ,gBAAgB,EAAI,OAAOI,CAAa,CAClD,CAEA,IAAME,EAAgBN,EAAQ,WAAW,EAEzC,MAAO,CACL,OAAAF,EACA,QAAAE,EACA,KAAAE,EACA,cAAAI,EACA,KAAAP,CACF,CACF,CAKO,YAAY,CACjB,QAASQ,EACT,KAAAL,EACA,gBAAAM,EACA,WAAAC,CACF,EAA6E,CAC3E,IAAMT,EAAUU,EAAwBH,CAAe,EAEvD,MAAO,CACL,WAAAE,EACA,KAAAP,EACA,QAAAF,EACA,gBAAAQ,CACF,CACF,CAKO,uBAAuB,CAC5B,MAAAG,EACA,kBAAAC,EACA,kBAAAC,EACA,MAAAjB,EACA,IAAAkB,CACF,EAAwE,CACtE,IAAMZ,EAAOW,EAAoBF,EAAM,MAAQ,GACzCI,EAAgB,KAAK,YAAY,CACrC,MAAAnB,EACA,WAAY,IACZ,KAAMM,GAAQ,GACd,QAAS,CAAC,EACV,gBAAiB,GACjB,IAAAY,CACF,CAAC,EAEDF,EAAkB,QAAQG,CAAa,CACzC,CAWU,iBAAiBnB,EAAsC,CAC/D,IAAMoB,EAAgBC,EACpB,KAAK,SAAS,cACd,EACF,EACMC,EAAe,IAAI,OAAO,IAAIF,CAAa,EAAE,EAC7CjB,EAAOH,EAAM,KAAK,QAAQsB,EAAc,EAAE,EAE1CC,EAAcvB,EAAM,sBAE1B,OAAOwB,EAA6BrB,EAAMoB,CAAW,CACvD,CAGF","names":["HuaweiApiGatewayAdapter","_HuaweiApiGatewayAdapter","options","__name","event","apiGatewayEvent","method","path","headers","getFlattenedHeadersMap","body","bufferBody","contentLength","getEventBodyAsBuffer","remoteAddress","responseHeaders","isBase64Encoded","statusCode","getMultiValueHeadersMap","error","delegatedResolver","respondWithErrors","log","errorResponse","stripBasePath","getDefaultIfUndefined","replaceRegex","queryParams","getPathWithQueryStringParams"]}