UNPKG

@qrvey/function-gateway

Version:

![install size](https://packagephobia.com/badge?p=%40qrvey%2Ffunction-gateway) ![coverage](https://img.shields.io/badge/unit_test_coverage-100%25-brightgreen)

1 lines 11.7 kB
{"version":3,"sources":["../../src/helper/errors.ts","../../src/helper/functionMappingHelper.ts","../../src/services/gateways/aws-lambda/lambdaInvoke.ts","../../src/services/gateways/aws-lambda/model-invocation-template.json","../../src/services/gateways/aws-lambda/httpPayloadBuilder.ts","../../src/services/gateways/aws-lambda/lambdaGateway.service.ts","../../src/services/gateways/rest/restGateway.service.ts","../../src/services/functionGatewayFactory.service.ts","../../src/services/functionGateway.service.ts"],"names":[],"mappings":"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","sourcesContent":["export class FunctionMappingNotFound extends Error {\n constructor(functionName: string) {\n super(\n `Function Config not found for ${functionName} in the functionMapping param`,\n );\n this.name = 'FunctionMappingNotFound';\n }\n}\n","import { IFunctionMapping } from '../interfaces';\nimport { FunctionMappingType } from '../types';\nimport { FunctionMappingNotFound } from './errors';\n\nexport function readFunctionMapping(\n functionName: string,\n functionMapping: IFunctionMapping,\n params: unknown,\n functionMappingType: FunctionMappingType,\n) {\n const fnMapping = functionMapping[functionName];\n if (!fnMapping) throw new FunctionMappingNotFound(functionName);\n const functionConfig = fnMapping(params);\n return functionConfig?.[functionMappingType];\n}\n\nexport function existFunctionMappingTypeConfig(\n functionName: string,\n functionMapping: IFunctionMapping,\n params: unknown,\n functionMappingType: FunctionMappingType,\n): boolean {\n const fnMapping = functionMapping[functionName];\n if (!fnMapping) return false;\n\n const functionConfig = fnMapping(params);\n return !!functionConfig?.[functionMappingType];\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n LambdaClient,\n InvokeCommand,\n InvokeCommandInput,\n} from '@aws-sdk/client-lambda';\nimport { createLambdaPayload } from './httpPayloadBuilder';\nimport { IFnMappingLambdaOptions } from '../../../interfaces';\nimport { CallbackFunction } from '../../../types';\n\nconst lambdaClient = new LambdaClient({\n region: process.env.AWS_DEFAULT_REGION,\n});\nexport async function invokeLambda(\n functionName: string,\n payload = {},\n options: IFnMappingLambdaOptions = {},\n callback?: CallbackFunction,\n): Promise<any> {\n const lambdaParams: InvokeCommandInput = {\n ...options.invocationParams,\n Payload: options.asHttp\n ? createLambdaPayload(payload)\n : JSON.stringify(payload),\n FunctionName: functionName,\n };\n\n const lambdaResult = await lambdaClient.send(\n new InvokeCommand(lambdaParams),\n );\n\n const res = {\n Payload: lambdaResult.Payload\n ? Buffer.from(lambdaResult.Payload).toString()\n : undefined,\n };\n\n return callback ? callback(res) : res;\n}\n","{\n \"resource\": \"/{proxy+}\",\n \"path\": \"/$PATH\",\n \"httpMethod\": \"$HTTP_METHOD\",\n \"body\": null,\n \"headers\": null,\n \"isBase64Encoded\": false,\n \"queryStringParameters\": null,\n \"multiValueQueryStringParameters\": null,\n \"pathParameters\": {\n \"proxy\": \"$PATH\"\n },\n \"requestContext\": {\n \"resourcePath\": \"/{proxy+}\",\n \"httpMethod\": \"$HTTP_METHOD\",\n \"path\": \"/prod/$PATH\"\n }\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport LAMBDA_INVOCATION_TEMPLATE from './model-invocation-template.json';\nimport { ILambdaHttpConfig } from '../../../interfaces';\n\nfunction createLambdaPayload(httpConfig: ILambdaHttpConfig = {}) {\n const queryParams = httpConfig.queryParams || {};\n const queryStringParameters: any = {};\n for (const key in queryParams) {\n if (Object.hasOwnProperty.call(queryParams, key)) {\n const value = queryParams[key];\n queryStringParameters[key] = Array.isArray(value)\n ? value[0]\n : value;\n }\n }\n\n const payload = {\n ...LAMBDA_INVOCATION_TEMPLATE,\n body: httpConfig.body,\n headers: httpConfig.headers,\n multiValueQueryStringParameters: queryParams,\n queryStringParameters,\n };\n\n let payloadString = JSON.stringify(payload);\n\n payloadString = payloadString\n .replace(/\\$PATH/g, httpConfig.path || '/') // Path replacement\n .replace(/\\$HTTP_METHOD/g, httpConfig.method || 'GET'); // HTTP method replacement\n\n return payloadString;\n}\n\nexport { createLambdaPayload };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { readFunctionMapping } from '../../../helper';\nimport { invokeLambda } from './lambdaInvoke';\nimport {\n IFunctionGateway,\n IFunctionMapping,\n IFunctionMappingLambda,\n} from '../../../interfaces';\n\nexport class LambdaGatewayService implements IFunctionGateway {\n invoke(\n functionName: string,\n params: unknown,\n fnMapping: IFunctionMapping,\n ): Promise<any> {\n const lambdaConfig = readFunctionMapping(\n functionName,\n fnMapping,\n params,\n 'lambda',\n ) as IFunctionMappingLambda;\n\n return invokeLambda(\n lambdaConfig.name,\n lambdaConfig.payload,\n lambdaConfig.options,\n lambdaConfig.callback,\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { readFunctionMapping } from '../../../helper';\nimport {\n IFunctionGateway,\n IFunctionMapping,\n IFunctionMappingRest,\n} from '../../../interfaces';\nimport { FetchService } from '@qrvey/fetch';\nexport class RestGatewayService implements IFunctionGateway {\n invoke(\n functionName: string,\n params: unknown,\n fnMapping: IFunctionMapping,\n ): Promise<any> {\n const restConfig = readFunctionMapping(\n functionName,\n fnMapping,\n params,\n 'rest',\n ) as IFunctionMappingRest;\n\n const options = {\n ...restConfig.options,\n method: restConfig.method,\n };\n return FetchService.sendRequest(\n restConfig.endpoint,\n restConfig.body,\n options,\n );\n }\n}\n","import {\n IFunctionGateway,\n IFunctionMapping,\n IFunctionOptions,\n} from '../interfaces';\nimport { LambdaGatewayService, RestGatewayService } from './gateways';\nimport { existFunctionMappingTypeConfig } from '../helper';\n\nexport class FunctionGatewayFactory {\n static gateway(\n functionName: string,\n params: unknown,\n functionMapping: IFunctionMapping,\n options: IFunctionOptions = {},\n ): IFunctionGateway {\n const isMultiPlatformMode =\n process.env.PLATFORM_TYPE?.toLowerCase() === 'container';\n\n if (options.mappingType === 'rest') return new RestGatewayService();\n if (options.mappingType === 'lambda') return new LambdaGatewayService();\n\n if (isMultiPlatformMode) {\n const hasRestConfig = existFunctionMappingTypeConfig(\n functionName,\n functionMapping,\n params,\n 'rest',\n );\n if (hasRestConfig) return new RestGatewayService();\n }\n\n return new LambdaGatewayService();\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IFunctionMapping, IFunctionOptions } from '../interfaces';\nimport { FunctionGatewayFactory } from './functionGatewayFactory.service';\n\nexport default class FunctionGatewayService {\n /**\n * Invokes a function with the specified parameters and options.\n *\n * @param functionName - The name of the function to invoke.\n * @param params - This parameters is passed to the functionMapping config.\n * @param functionMapping - An object that maps function names to function implementations. This object should conform to the `IFunctionMapping` interface.\n * @param options - An object containing additional options for invoking the function. This may include settings such as the mappingType ('lambda' or 'rest').\n *\n * @returns - Returns a promise that resolves with the result of the invoked function or rejects with an error if the invocation fails.\n */\n static invoke(\n functionName: string,\n params: unknown,\n functionMapping: IFunctionMapping,\n options: IFunctionOptions = {},\n ): Promise<any> {\n const service = FunctionGatewayFactory.gateway(\n functionName,\n params,\n functionMapping,\n options,\n );\n return service.invoke(functionName, params, functionMapping);\n }\n}\n"]}