@cloudnux/aws-cloud-provider 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,5 @@
1
- // ../core/dist/index.js
2
- var _cloudContainer = {
3
- storage: void 0,
4
- location: void 0,
5
- "event-broker": void 0,
6
- functions: void 0,
7
- websocket: void 0,
8
- invoke: void 0,
9
- logger: void 0
10
- };
11
- function getService(kind) {
12
- const service = _cloudContainer[kind];
13
- if (!service) {
14
- throw new Error(`Service of kind ${kind} is not registered.`);
15
- }
16
- return service();
17
- }
18
-
19
1
  // src/router/index.ts
2
+ import { getService } from "@cloudnux/core-cloud-provider";
20
3
  function createRouter() {
21
4
  const routes = [];
22
5
  function detectEventType(event) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../core/src/services/functions.ts","../../../core/src/services/websocket.ts","../../../core/src/cloud-container.ts","../../src/router/index.ts"],"sourcesContent":["import { IService } from \"../cloud-container\";\nimport { HandlerType, HttpMethod, WebSocketEvent } from \"../entrypoint\";\nimport { LoggerService } from \"./logger\";\n\n/**\n * Represents the context object for a function handler.\n */\nexport type FunctionContext = {\n /**\n * The underlying context handler type.\n */\n type: HandlerType;\n\n /**\n * Logger bound to this invocation's module name and request id.\n */\n logger: LoggerService;\n\n /**\n * Creates a success response. This should be called when the handler is done successfully.\n * @param data - The response body.\n */\n success<T>(data: T): void;\n\n /**\n * Creates a server error response. This should be called when the handler encounters an unexpected error.\n * @param err - The error object.\n */\n serverError(err: Error): void;\n /**\n * Creates an error response. This should be called when the handler is done with an error.\n * @param message - The response body.\n * \n */\n error(message: string, code?: ErrorCode, details?: Record<string, any>, stack?: string): void;\n /**\n * Creates a not found response. This should be called when the requested resource is not found.\n * @param resource - The name of the resource that was not found.\n * @param id - The id of the resource that was not found (optional).\n */\n notFound(resource: string, id?: string | number): void;\n};\n\n/**\n * Error codes for API error responses\n */\nexport enum ErrorCode {\n // Validation errors\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n INVALID_INPUT = 'INVALID_INPUT',\n\n // Authentication errors\n UNAUTHORIZED = 'UNAUTHORIZED',\n ACCESS_DENIED = 'ACCESS_DENIED',\n\n // Resource errors\n RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND',\n RESOURCE_ALREADY_EXISTS = 'RESOURCE_ALREADY_EXISTS',\n RESOURCE_CONFLICT = 'RESOURCE_CONFLICT',\n\n // System errors\n INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n DATABASE_ERROR = 'DATABASE_ERROR',\n\n // Business logic errors\n BUSINESS_RULE_VIOLATION = 'BUSINESS_RULE_VIOLATION',\n\n // External API errors\n EXTERNAL_API_ERROR = 'EXTERNAL_API_ERROR',\n\n // Other errors\n UNKNOWN_ERROR = 'UNKNOWN_ERROR'\n}\n\n//#region [ Http ]\n\nexport type HTTPRequest = {\n method: HttpMethod;\n body?: string;\n headers: Record<string, string | string[] | undefined>;\n url: string;\n params: Record<string, string | undefined>\n matchingKey?: string;\n rawQueryString?: string,\n requestId?: string,\n host?: string,\n moduleName?: string,\n};\n\nexport type HTTPResponse = {\n headers?: Record<string, string | string[] | undefined>;\n body?: string;\n status: number;\n};\n\nexport type HTTPAuth = {\n token: string;\n appId: string;\n memberId: string;\n customerId: string;\n claims: Record<string, string>;\n identity: \"facebook\" | \"google\" | \"apple\" | \"password\";\n};\n\nexport type HttpFunctionContext = FunctionContext & {\n type: \"Http\";\n request: HTTPRequest;\n auth?: HTTPAuth;\n response: HTTPResponse;\n model<T = Record<string, any>>(): T;\n params<T = Record<string, string>>(): T;\n\n list<T>(items: T[], page: number, pageSize: number, totalItems: number): void;\n cursorList<T>(items: T[], nextCursor: string | null, pageSize: number, prevCursor?: string | null): void;\n created<T>(data: T): void;\n deleted(id?: string | number): void;\n validationError(details: Record<string, any>): void;\n serverError(err: Error): void;\n businessError(message: string, details?: Record<string, any>): void;\n\n unauthorized(message?: string): void;\n forbidden(message?: string): void;\n output(status: number, body?: string | object, headers?: Record<string, string | string[]>): void;\n}\n\n//#endregion\n\n//#region [Schedule]\n\nexport type ScheduleResponse = {\n status: \"success\" | \"error\",\n body?: string | Record<string, any>;\n}\n\nexport type ScheduleRequest = {\n name: string,\n requestId?: string,\n moduleName?: string,\n};\n\nexport type ScheduleFunctionContext = FunctionContext & {\n response: ScheduleResponse;\n request: ScheduleRequest;\n type: \"Schedule\";\n}\n//#endregion\n\n//#region [Event]\nexport type EventRequest = {\n body: string | Record<string, any>,\n attributes: Record<string, string>,\n requestId?: string,\n timestamp: Date,\n attempts?: number;\n moduleName?: string,\n}\n\nexport type EventResponse = {\n status: \"success\" | \"error\",\n code?: ErrorCode,\n body?: Record<string, any>\n stack?: string,\n retryDelay?: number,\n};\n\nexport type EventFunctionContext = FunctionContext & {\n type: \"Event\";\n timestamp: Date;\n attempts?: number;\n request: EventRequest;\n response: EventResponse;\n message<T = Record<string, any>>(): T;\n attributes<T = Record<string, any>>(): T;\n retryWithDelay(seconds: number): void;\n}\n\nexport type EventBatchItemResult = { failureId: string } | undefined;\n//#endregion\n\n//#region [Invoke]\nexport type InvokeRequest = {\n payload: any,\n calledModule: string,\n invokeTriggerName: string,\n requestId?: string,\n}\n\nexport type InvokeResponse = {\n status: \"success\" | \"error\",\n body?: any,\n code?: ErrorCode,\n}\n\nexport type InvokeFunctionContext = FunctionContext & {\n type: \"Invoke\";\n request: InvokeRequest;\n response: InvokeResponse;\n payload<T = Record<string, any>>(): T;\n}\n//#endregion\n\n//#region [WebSocket]\nexport type WebSocketRequest = {\n connectionId: string,\n event: WebSocketEvent,\n route?: string,\n url?: string,\n params: Record<string, string | undefined> | null,\n body?: string | Record<string, any> | null,\n headers?: Record<string, string | string[] | undefined>,\n queryString: Record<string, string | undefined> | null,\n requestId?: string,\n moduleName?: string,\n}\n\nexport type WebSocketResponse = {\n status: \"success\" | \"error\",\n statusCode?: number,\n body?: any,\n}\n\nexport type WebSocketFunctionContext = FunctionContext & {\n type: \"WebSocket\";\n connectionId: string;\n event: WebSocketEvent;\n request: WebSocketRequest;\n response: WebSocketResponse;\n message<T = Record<string, any>>(): T;\n params<T = Record<string, string>>(): T;\n unauthorized(body?: any): void;\n forbidden(body?: any): void;\n validationError(details: Record<string, any>): void;\n}\n//#endregion\n\nexport interface FunctionsService extends IService {\n createHttRequest(...args: any[]): [HTTPRequest, HTTPAuth?];\n createScheduleRequest(...args: any[]): [ScheduleRequest];\n createEventRequest(...args: any[]): [EventRequest];\n createWebSocketRequest(...args: any[]): [WebSocketRequest];\n createInvokeRequest(...args: any[]): [InvokeRequest];\n\n buildHttpResponse(httpFunctionContext: HttpFunctionContext, ...args: any[]): any\n buildScheduleResponse(scheduleFunctionContext: ScheduleFunctionContext, ...args: any[]): any;\n buildEventResponse(eventFunctionContext: EventFunctionContext, ...args: any[]): Promise<EventBatchItemResult>;\n buildWebSocketResponse(webSocketFunctionContext: WebSocketFunctionContext, ...args: any[]): any;\n buildInvokeResponse(invokeFunctionContext: InvokeFunctionContext, ...args: any[]): any;\n}","/**\n * Thrown when a sendToClient/disconnect is attempted against a connectionId\n * that is no longer connected (AWS API Gateway GoneException equivalent, HTTP 410).\n */\nexport class WebSocketConnectionGoneError extends Error {\n public readonly connectionId: string;\n\n constructor(connectionId: string) {\n super(`WebSocket connection ${connectionId} is gone`);\n this.name = \"WebSocketConnectionGoneError\";\n this.connectionId = connectionId;\n }\n}\n\nexport interface WebSocketService {\n /**\n * Send a message to a specific connected client\n * @param connectionId The connection ID of the target client\n * @param data The data to send\n */\n sendToClient(connectionId: string, data: any): Promise<void>;\n\n /**\n * Disconnect a specific connected client\n * @param connectionId The connection ID of the client to disconnect\n */\n disconnect(connectionId: string): Promise<void>;\n}\n","export interface IService { };\nexport type ServiceKind = \"storage\" | \"location\" | \"event-broker\" | \"functions\" | \"websocket\" | \"invoke\" | \"logger\";\n\n\nconst _cloudContainer: Record<ServiceKind, (() => IService) | undefined> = {\n storage: undefined,\n location: undefined,\n \"event-broker\": undefined,\n functions: undefined,\n websocket: undefined,\n invoke: undefined,\n logger: undefined\n};\n\nexport function registerService(kind: ServiceKind, factory: () => IService) {\n _cloudContainer[kind] = factory;\n}\n\nexport function registerServices(services: Record<ServiceKind, () => IService>) {\n for (const kind in services) {\n if (services.hasOwnProperty(kind)) {\n _cloudContainer[kind as ServiceKind] = services[kind as ServiceKind];\n }\n }\n}\n\nexport function getService<T extends IService>(kind: ServiceKind): T {\n const service = _cloudContainer[kind];\n if (!service) {\n throw new Error(`Service of kind ${kind} is not registered.`);\n }\n return service() as T;\n}\n","import {\n APIGatewayProxyEventV2,\n APIGatewayProxyResultV2,\n SNSEvent,\n SQSEvent,\n ScheduledEvent,\n S3Event,\n Context,\n SNSEventRecord,\n SQSRecord,\n S3EventRecord,\n SQSBatchResponse,\n} from 'aws-lambda';\n\nimport { getService, HttpMethod, LoggerService, MessageFilter } from \"@cloudnux/core-cloud-provider\"\n\nexport type EventType = APIGatewayProxyEventV2 | SNSEvent | SQSEvent | ScheduledEvent | S3Event;\n\nexport type EventHndlerType = APIGatewayProxyEventV2 | SNSEventRecord | SQSRecord | ScheduledEvent | S3EventRecord | any;\nexport type HandlerFunction = (event: EventHndlerType, context: Context) => Promise<any>;\n\nexport interface RouteDefinition {\n type: 'http' | 'schedule' | 'event' | 'websocket' | 'invoke';\n handler: HandlerFunction;\n // HTTP specific\n method?: HttpMethod;\n routeKey?: string;\n // Schedule specific\n pattern?: string;\n name?: string;\n // Event specific\n source?: string;\n sourceType?: string;\n filter?: MessageFilter;\n // WebSocket specific\n wsRouteKey?: string;\n // Invoke specific\n invokeName?: string;\n}\n\nexport function createRouter() {\n\n const routes: RouteDefinition[] = [];\n\n function detectEventType(event: EventType): string {\n if ('requestContext' in event && 'connectionId' in event.requestContext) {\n return 'websocket';\n }\n if ('requestContext' in event && 'http' in event.requestContext) {\n return 'http';\n }\n if ('source' in event && event.source === 'aws.scheduler') {\n return 'schedule';\n }\n if ('Records' in event) {\n return 'event';\n }\n if ('calledModule' in event && 'invokeTriggerName' in event) {\n return 'invoke';\n }\n return 'unknown';\n }\n\n function getEventSourceInfo(event: any): {\n type: \"sns\" | \"sqs\" | \"s3\" | \"dynamodb\" | \"eventbridge\" | \"kinesis\" | \"unknown\";\n name: string;\n arn?: string\n } {\n // SQS Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:sqs') {\n const record = event.Records[0];\n const queueArn = record.eventSourceARN;\n // Extract queue name from ARN: arn:aws:sqs:region:account:queue-name\n const queueName = queueArn.split(':').pop();\n return {\n type: 'sqs',\n name: queueName,\n arn: queueArn\n };\n }\n\n // SNS Event\n if ('Records' in event && event.Records?.[0]?.EventSource === 'aws:sns') {\n const record = event.Records[0];\n const topicArn = record.Sns.TopicArn;\n // Extract topic name from ARN: arn:aws:sns:region:account:topic-name\n const topicName = topicArn.split(':').pop();\n return {\n type: 'sns',\n name: topicName,\n arn: topicArn\n };\n }\n\n // S3 Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:s3') {\n const record = event.Records[0];\n const bucketName = record.s3.bucket.name;\n const bucketArn = record.s3.bucket.arn;\n return {\n type: 's3',\n name: bucketName,\n arn: bucketArn\n };\n }\n\n // DynamoDB Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:dynamodb') {\n const record = event.Records[0];\n const tableArn = record.eventSourceARN;\n // Extract table name from ARN: arn:aws:dynamodb:region:account:table/table-name/stream/...\n const tableName = tableArn.split('/')[1];\n return {\n type: 'dynamodb',\n name: tableName,\n arn: tableArn\n };\n }\n\n // EventBridge/CloudWatch Events\n if ('source' in event && 'detail-type' in event) {\n return {\n type: 'eventbridge',\n name: event.source,\n arn: event.source\n };\n }\n\n // Kinesis Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:kinesis') {\n const record = event.Records[0];\n const streamArn = record.eventSourceARN;\n // Extract stream name from ARN: arn:aws:kinesis:region:account:stream/stream-name\n const streamName = streamArn.split('/').pop();\n return {\n type: 'kinesis',\n name: streamName,\n arn: streamArn\n };\n }\n\n return {\n type: 'unknown',\n name: 'unknown'\n };\n }\n\n async function handleHttpEvent(\n event: APIGatewayProxyEventV2,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<APIGatewayProxyResultV2> {\n const method = event.requestContext.http.method as HttpMethod;\n //remove the \"HTTP\" prefix from the routeKey\n const routeKey = event.routeKey.split(\" \")[1].toLowerCase();\n for (const route of routes) {\n if (route.type === 'http' &&\n route.method === method &&\n route.routeKey === routeKey) {\n try {\n const result = await route.handler(event, context);\n return result;\n } catch (error) {\n return {\n statusCode: 500,\n body: JSON.stringify({\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error'\n })\n };\n }\n\n }\n }\n\n return {\n statusCode: 404,\n body: JSON.stringify({ error: 'Not Found' })\n };\n }\n async function handleScheduleEvent(\n event: ScheduledEvent,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n const ndx = event.resources[0].lastIndexOf(\"/\");\n const name = event.resources[0].substring(ndx + 1, event.resources[0].length);\n\n for (const route of routes) {\n if (route.type === 'schedule' &&\n route.name === name) {\n try {\n return await route.handler(event, context);\n } catch (error) {\n throw error;\n }\n }\n }\n throw new Error('No schedule handler found');\n }\n async function handleEventBrokerEvent(\n event: EventType,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<SQSBatchResponse> {\n const eventSourceInfo = getEventSourceInfo(event);\n // Handle SQS only for now, we can expand to other event sources later\n for (const route of routes) {\n if (route.type === 'event' &&\n eventSourceInfo.type === route.sourceType &&\n eventSourceInfo.name === route.source) {\n const eventMessage = event as SNSEvent | SQSEvent | S3Event;\n const results = await Promise.all(eventMessage.Records.map(record => route.handler(record, context)));\n return {\n batchItemFailures: results\n .filter(r => r?.failureId)\n .map(r => ({ itemIdentifier: r!.failureId })),\n };\n }\n }\n\n throw new Error('No event handler found');\n }\n\n async function handleInvokeEvent(\n event: any,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n for (const route of routes) {\n if (route.type === 'invoke' &&\n route.invokeName === event.invokeTriggerName) {\n return await route.handler(event, context);\n }\n }\n throw new Error('No invoke handler found');\n }\n\n async function handleWebSocketEvent(\n event: any,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n const routeKey = event.requestContext?.routeKey;\n\n for (const route of routes) {\n if (route.type === 'websocket' && route.wsRouteKey === routeKey) {\n try {\n return await route.handler(event, context);\n } catch (error) {\n return {\n statusCode: 500,\n body: JSON.stringify({\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error'\n })\n };\n }\n }\n }\n\n throw new Error(`No WebSocket handler found for route key: ${routeKey}`);\n }\n\n return {\n // Register HTTP route\n http(method: HttpMethod, route: string, handler: HandlerFunction) {\n routes.push({\n type: 'http',\n method,\n routeKey: route.toLowerCase(),\n handler\n });\n },\n\n // Register schedule route\n schedule(name: string, pattern: string, handler: HandlerFunction) {\n routes.push({\n type: 'schedule',\n name,\n pattern,\n handler\n });\n },\n\n // Register event route SNS / SQS / EventBridge\n event(source: string, sourceType: string, handler: HandlerFunction, filter?: MessageFilter) {\n routes.push({\n type: 'event',\n source,\n sourceType,\n filter,\n handler\n });\n },\n\n // Register WebSocket route\n websocket(wsRouteKey: string, handler: HandlerFunction) {\n routes.push({\n type: 'websocket',\n wsRouteKey,\n handler\n });\n },\n\n // Register invoke route\n invoke(name: string, handler: HandlerFunction) {\n routes.push({\n type: 'invoke',\n invokeName: name,\n handler\n });\n },\n\n async run(event: EventType, context: Context): Promise<any> {\n const logger = getService<LoggerService>(\"logger\");\n logger.setBindings({\n module: context.functionName.split(\"_\")[0],\n reqId: context.awsRequestId,\n })\n logger.info({ requestId: context.awsRequestId }, \"request started\");\n logger.debug({ event, requestId: context.awsRequestId }, \"Received event\");\n let response;\n try {\n const eventType = detectEventType(event);\n switch (eventType) {\n case 'http':\n return await handleHttpEvent(event as APIGatewayProxyEventV2, context, routes);\n case 'schedule':\n return await handleScheduleEvent(event as ScheduledEvent, context, routes);\n case 'event':\n return await handleEventBrokerEvent(event, context, routes);\n case 'websocket':\n return await handleWebSocketEvent(event, context, routes);\n case 'invoke':\n return await handleInvokeEvent(event, context, routes);\n default:\n throw new Error(`Unsupported event type: ${eventType}`);\n }\n }\n catch (error) {\n logger.error({ error, requestId: context.awsRequestId }, \"Error occurred\");\n throw error;\n }\n finally {\n logger.info({ response, requestId: context.awsRequestId }, \"request finished\");\n }\n }\n }\n}"],"mappings":"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","names":["routes"]}
1
+ {"version":3,"sources":["../../src/router/index.ts"],"sourcesContent":["import {\n APIGatewayProxyEventV2,\n APIGatewayProxyResultV2,\n SNSEvent,\n SQSEvent,\n ScheduledEvent,\n S3Event,\n Context,\n SNSEventRecord,\n SQSRecord,\n S3EventRecord,\n SQSBatchResponse,\n} from 'aws-lambda';\n\nimport { getService, HttpMethod, LoggerService, MessageFilter } from \"@cloudnux/core-cloud-provider\"\n\nexport type EventType = APIGatewayProxyEventV2 | SNSEvent | SQSEvent | ScheduledEvent | S3Event;\n\nexport type EventHndlerType = APIGatewayProxyEventV2 | SNSEventRecord | SQSRecord | ScheduledEvent | S3EventRecord | any;\nexport type HandlerFunction = (event: EventHndlerType, context: Context) => Promise<any>;\n\nexport interface RouteDefinition {\n type: 'http' | 'schedule' | 'event' | 'websocket' | 'invoke';\n handler: HandlerFunction;\n // HTTP specific\n method?: HttpMethod;\n routeKey?: string;\n // Schedule specific\n pattern?: string;\n name?: string;\n // Event specific\n source?: string;\n sourceType?: string;\n filter?: MessageFilter;\n // WebSocket specific\n wsRouteKey?: string;\n // Invoke specific\n invokeName?: string;\n}\n\nexport function createRouter() {\n\n const routes: RouteDefinition[] = [];\n\n function detectEventType(event: EventType): string {\n if ('requestContext' in event && 'connectionId' in event.requestContext) {\n return 'websocket';\n }\n if ('requestContext' in event && 'http' in event.requestContext) {\n return 'http';\n }\n if ('source' in event && event.source === 'aws.scheduler') {\n return 'schedule';\n }\n if ('Records' in event) {\n return 'event';\n }\n if ('calledModule' in event && 'invokeTriggerName' in event) {\n return 'invoke';\n }\n return 'unknown';\n }\n\n function getEventSourceInfo(event: any): {\n type: \"sns\" | \"sqs\" | \"s3\" | \"dynamodb\" | \"eventbridge\" | \"kinesis\" | \"unknown\";\n name: string;\n arn?: string\n } {\n // SQS Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:sqs') {\n const record = event.Records[0];\n const queueArn = record.eventSourceARN;\n // Extract queue name from ARN: arn:aws:sqs:region:account:queue-name\n const queueName = queueArn.split(':').pop();\n return {\n type: 'sqs',\n name: queueName,\n arn: queueArn\n };\n }\n\n // SNS Event\n if ('Records' in event && event.Records?.[0]?.EventSource === 'aws:sns') {\n const record = event.Records[0];\n const topicArn = record.Sns.TopicArn;\n // Extract topic name from ARN: arn:aws:sns:region:account:topic-name\n const topicName = topicArn.split(':').pop();\n return {\n type: 'sns',\n name: topicName,\n arn: topicArn\n };\n }\n\n // S3 Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:s3') {\n const record = event.Records[0];\n const bucketName = record.s3.bucket.name;\n const bucketArn = record.s3.bucket.arn;\n return {\n type: 's3',\n name: bucketName,\n arn: bucketArn\n };\n }\n\n // DynamoDB Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:dynamodb') {\n const record = event.Records[0];\n const tableArn = record.eventSourceARN;\n // Extract table name from ARN: arn:aws:dynamodb:region:account:table/table-name/stream/...\n const tableName = tableArn.split('/')[1];\n return {\n type: 'dynamodb',\n name: tableName,\n arn: tableArn\n };\n }\n\n // EventBridge/CloudWatch Events\n if ('source' in event && 'detail-type' in event) {\n return {\n type: 'eventbridge',\n name: event.source,\n arn: event.source\n };\n }\n\n // Kinesis Event\n if ('Records' in event && event.Records?.[0]?.eventSource === 'aws:kinesis') {\n const record = event.Records[0];\n const streamArn = record.eventSourceARN;\n // Extract stream name from ARN: arn:aws:kinesis:region:account:stream/stream-name\n const streamName = streamArn.split('/').pop();\n return {\n type: 'kinesis',\n name: streamName,\n arn: streamArn\n };\n }\n\n return {\n type: 'unknown',\n name: 'unknown'\n };\n }\n\n async function handleHttpEvent(\n event: APIGatewayProxyEventV2,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<APIGatewayProxyResultV2> {\n const method = event.requestContext.http.method as HttpMethod;\n //remove the \"HTTP\" prefix from the routeKey\n const routeKey = event.routeKey.split(\" \")[1].toLowerCase();\n for (const route of routes) {\n if (route.type === 'http' &&\n route.method === method &&\n route.routeKey === routeKey) {\n try {\n const result = await route.handler(event, context);\n return result;\n } catch (error) {\n return {\n statusCode: 500,\n body: JSON.stringify({\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error'\n })\n };\n }\n\n }\n }\n\n return {\n statusCode: 404,\n body: JSON.stringify({ error: 'Not Found' })\n };\n }\n async function handleScheduleEvent(\n event: ScheduledEvent,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n const ndx = event.resources[0].lastIndexOf(\"/\");\n const name = event.resources[0].substring(ndx + 1, event.resources[0].length);\n\n for (const route of routes) {\n if (route.type === 'schedule' &&\n route.name === name) {\n try {\n return await route.handler(event, context);\n } catch (error) {\n throw error;\n }\n }\n }\n throw new Error('No schedule handler found');\n }\n async function handleEventBrokerEvent(\n event: EventType,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<SQSBatchResponse> {\n const eventSourceInfo = getEventSourceInfo(event);\n // Handle SQS only for now, we can expand to other event sources later\n for (const route of routes) {\n if (route.type === 'event' &&\n eventSourceInfo.type === route.sourceType &&\n eventSourceInfo.name === route.source) {\n const eventMessage = event as SNSEvent | SQSEvent | S3Event;\n const results = await Promise.all(eventMessage.Records.map(record => route.handler(record, context)));\n return {\n batchItemFailures: results\n .filter(r => r?.failureId)\n .map(r => ({ itemIdentifier: r!.failureId })),\n };\n }\n }\n\n throw new Error('No event handler found');\n }\n\n async function handleInvokeEvent(\n event: any,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n for (const route of routes) {\n if (route.type === 'invoke' &&\n route.invokeName === event.invokeTriggerName) {\n return await route.handler(event, context);\n }\n }\n throw new Error('No invoke handler found');\n }\n\n async function handleWebSocketEvent(\n event: any,\n context: Context,\n routes: RouteDefinition[]\n ): Promise<any> {\n const routeKey = event.requestContext?.routeKey;\n\n for (const route of routes) {\n if (route.type === 'websocket' && route.wsRouteKey === routeKey) {\n try {\n return await route.handler(event, context);\n } catch (error) {\n return {\n statusCode: 500,\n body: JSON.stringify({\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error'\n })\n };\n }\n }\n }\n\n throw new Error(`No WebSocket handler found for route key: ${routeKey}`);\n }\n\n return {\n // Register HTTP route\n http(method: HttpMethod, route: string, handler: HandlerFunction) {\n routes.push({\n type: 'http',\n method,\n routeKey: route.toLowerCase(),\n handler\n });\n },\n\n // Register schedule route\n schedule(name: string, pattern: string, handler: HandlerFunction) {\n routes.push({\n type: 'schedule',\n name,\n pattern,\n handler\n });\n },\n\n // Register event route SNS / SQS / EventBridge\n event(source: string, sourceType: string, handler: HandlerFunction, filter?: MessageFilter) {\n routes.push({\n type: 'event',\n source,\n sourceType,\n filter,\n handler\n });\n },\n\n // Register WebSocket route\n websocket(wsRouteKey: string, handler: HandlerFunction) {\n routes.push({\n type: 'websocket',\n wsRouteKey,\n handler\n });\n },\n\n // Register invoke route\n invoke(name: string, handler: HandlerFunction) {\n routes.push({\n type: 'invoke',\n invokeName: name,\n handler\n });\n },\n\n async run(event: EventType, context: Context): Promise<any> {\n const logger = getService<LoggerService>(\"logger\");\n logger.setBindings({\n module: context.functionName.split(\"_\")[0],\n reqId: context.awsRequestId,\n })\n logger.info({ requestId: context.awsRequestId }, \"request started\");\n logger.debug({ event, requestId: context.awsRequestId }, \"Received event\");\n let response;\n try {\n const eventType = detectEventType(event);\n switch (eventType) {\n case 'http':\n return await handleHttpEvent(event as APIGatewayProxyEventV2, context, routes);\n case 'schedule':\n return await handleScheduleEvent(event as ScheduledEvent, context, routes);\n case 'event':\n return await handleEventBrokerEvent(event, context, routes);\n case 'websocket':\n return await handleWebSocketEvent(event, context, routes);\n case 'invoke':\n return await handleInvokeEvent(event, context, routes);\n default:\n throw new Error(`Unsupported event type: ${eventType}`);\n }\n }\n catch (error) {\n logger.error({ error, requestId: context.awsRequestId }, \"Error occurred\");\n throw error;\n }\n finally {\n logger.info({ response, requestId: context.awsRequestId }, \"request finished\");\n }\n }\n }\n}"],"mappings":"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","names":["routes"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudnux/aws-cloud-provider",
3
3
  "description": "CloudNux AWS cloud provider implementation",
4
- "version": "0.20.0",
4
+ "version": "0.21.0",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -51,9 +51,10 @@
51
51
  "@aws-sdk/client-geo-routes": "^3.943.0",
52
52
  "@aws-sdk/client-lambda": "^3.1053.0",
53
53
  "@aws-sdk/client-s3": "^3.552.0",
54
+ "@aws-sdk/client-sesv2": "^3.943.0",
54
55
  "@aws-sdk/client-sns": "^3.817.0",
55
56
  "@aws-sdk/client-sqs": "^3.817.0",
56
- "@cloudnux/core-cloud-provider": "0.20.0",
57
+ "@cloudnux/core-cloud-provider": "0.21.0",
57
58
  "aws-lambda": "^1.0.7"
58
59
  },
59
60
  "devDependencies": {