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