UNPKG

@smooai/utils

Version:

A collection of shared utilities and tools used across SmooAI projects. This package provides common functionality to standardize and simplify development across all SmooAI repositories.

1 lines 10.8 kB
{"version":3,"sources":["../../src/api/apiHandler.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from '@/api/ApiError';\nimport { errorHandler } from '@/error/errorHandler';\nimport { HumanReadableSchemaError } from '@/validation/standardSchema';\nimport ServerLogger from '@smooai/logger/AwsLambdaLogger';\nimport { APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2, Context, EventBridgeEvent, SQSEvent } from 'aws-lambda';\nimport { getReasonPhrase, StatusCodes } from 'http-status-codes';\nimport { ZodError } from 'zod';\nimport { fromZodError } from 'zod-validation-error';\n\nconst logger = new ServerLogger();\n\nexport type LambdaResponseOrError<T = any> = Omit<APIGatewayProxyStructuredResultV2, 'body'> & {\n body?: T | string | { error: { message: string } & Record<string, any> };\n};\n\nexport async function lambdaApiHandler<T = any>(\n event: APIGatewayProxyEventV2,\n context: Context,\n handler: (event: APIGatewayProxyEventV2, context: Context) => Promise<LambdaResponseOrError<T>>,\n): Promise<APIGatewayProxyStructuredResultV2> {\n try {\n logger.addLambdaContext(event, context);\n return (await errorHandler<[APIGatewayProxyEventV2, Context], APIGatewayProxyStructuredResultV2>(\n async (event: APIGatewayProxyEventV2, context: Context) => {\n const response = await handler(event, context);\n const awsLambdaResponse: APIGatewayProxyStructuredResultV2 = {\n ...response,\n body: response.body ? (typeof response.body === 'string' ? response.body : JSON.stringify(response.body)) : undefined,\n };\n return awsLambdaResponse;\n },\n event,\n context,\n )) as Promise<APIGatewayProxyStructuredResultV2>;\n } catch (error) {\n if (error instanceof ApiError) {\n logger.error(error, `An API error occurred: Status: ${error.status} (${error.statusText}); Message: ${error.message}`);\n return {\n body: JSON.stringify({\n error: { message: error.message, statusText: error.statusText },\n }),\n statusCode: error.status,\n headers: { 'Content-type': 'application/json' },\n };\n } else if (error instanceof HumanReadableSchemaError) {\n logger.error(error, `A schema validation error occurred: ${error.message}`);\n return {\n body: JSON.stringify({\n error: {\n message: error.message,\n statusText: getReasonPhrase(StatusCodes.BAD_REQUEST),\n },\n }),\n statusCode: StatusCodes.BAD_REQUEST,\n headers: { 'Content-type': 'application/json' },\n };\n } else if (error instanceof ZodError) {\n const validationError = fromZodError(error);\n logger.error(error, `A validation error occurred: ${validationError}`);\n return {\n body: JSON.stringify({\n error: {\n message: error.message,\n statusText: getReasonPhrase(StatusCodes.BAD_REQUEST),\n },\n }),\n statusCode: StatusCodes.BAD_REQUEST,\n headers: { 'Content-type': 'application/json' },\n };\n } else if (error instanceof Error) {\n logger.error(error, `An unexpected error occurred: ${error.message}`);\n return {\n body: JSON.stringify({\n error: {\n message: error.message,\n statusText: getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR),\n },\n }),\n statusCode: StatusCodes.INTERNAL_SERVER_ERROR,\n headers: { 'Content-type': 'application/json' },\n };\n } else {\n logger.error(error, `An unexpected error occurred: ${error}`);\n return {\n body: JSON.stringify({\n error: {\n message: 'An unexpected error occurred.',\n statusCode: StatusCodes.INTERNAL_SERVER_ERROR,\n statusText: getReasonPhrase(StatusCodes.INTERNAL_SERVER_ERROR),\n headers: { 'Content-type': 'application/json' },\n },\n }),\n };\n }\n }\n}\n\nexport async function eventBridgeHandler(\n event: EventBridgeEvent<any, any>,\n context: Context,\n handler: (event: EventBridgeEvent<any, any>, context: Context) => Promise<void>,\n): Promise<void> {\n try {\n logger.addLambdaContext(undefined, context);\n return (await errorHandler<[EventBridgeEvent<any, any>, Context], void>(\n async (event: EventBridgeEvent<any, any>, context: Context) => {\n await handler(event, context);\n },\n event,\n context,\n )) as void;\n } catch (error) {\n if (error instanceof ApiError) {\n logger.error(error, `An API error occurred: Status: ${error.status} (${error.statusText}); Message: ${error.message}`);\n } else if (error instanceof HumanReadableSchemaError) {\n logger.error(error, `A schema validation error occurred: ${error.message}`);\n } else if (error instanceof ZodError) {\n const validationError = fromZodError(error);\n logger.error(error, `A validation error occurred: ${validationError}`);\n } else if (error instanceof Error) {\n logger.error(error, `An unexpected error occurred: ${error.message}`);\n } else {\n logger.error(error, `An unexpected error occurred: ${error}`);\n }\n }\n}\n\nexport async function sqsHandler(\n event: SQSEvent,\n context: Context,\n handler: (event: SQSEvent, context: Context) => Promise<PromiseSettledResult<void>[]>,\n): Promise<PromiseSettledResult<void>[]> {\n try {\n logger.addLambdaContext(undefined, context);\n return (await errorHandler<[SQSEvent, Context], void>(\n async (event: SQSEvent, context: Context) => {\n return await handler(event, context);\n },\n event,\n context,\n )) as PromiseSettledResult<void>[];\n } catch (error) {\n if (error instanceof ApiError) {\n logger.error(error, `An API error occurred: Status: ${error.status} (${error.statusText}); Message: ${error.message}`);\n } else if (error instanceof HumanReadableSchemaError) {\n logger.error(error, `A schema validation error occurred: ${error.message}`);\n } else if (error instanceof ZodError) {\n const validationError = fromZodError(error);\n logger.error(error, `A validation error occurred: ${validationError}`);\n } else if (error instanceof Error) {\n logger.error(error, `An unexpected error occurred: ${error.message}`);\n } else {\n logger.error(error, `An unexpected error occurred: ${error}`);\n }\n\n if (event.Records?.length) {\n return Promise.allSettled(event.Records.map((_record) => Promise.reject(error)));\n } else {\n return Promise.reject(error);\n }\n }\n}\n"],"mappings":"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","names":["event","context"]}