import type { Server } from "bun"; import { ConsoleTracingLogger, TracingLogger } from "@/shared/log"; import { WidgetRequest } from "@/shared/schema"; import { ProcessorResponse, SQSWidgetRequestProcessor, WidgetRequestProcessor, } from "./processors"; import { SQSClient } from "@aws-sdk/client-sqs"; export class WidgetRequestHandler { private processor: WidgetRequestProcessor; private logger: TracingLogger; constructor(processor: WidgetRequestProcessor, logger: TracingLogger) { this.processor = processor; this.logger = logger; } public async handleRequest(request: Request): Promise { let headers = new Headers({ "Content-Type": "application/json", }); let response: ProcessorResponse = { success: true, message: "success" }; let status = 200; let widgetRequest; if (request.body) { const body = (await request.json()) as { event: any }; if (body) { const event = body.event!; this.logger.info(`received Body=(${JSON.stringify(event)})`); widgetRequest = WidgetRequest.safeParse(event); } } if (!widgetRequest || !widgetRequest.success) { status = 400; response = { success: false, message: widgetRequest?.error ? widgetRequest.error.toString() : "invalid request body", }; } else { try { response = await this.processor.handle(widgetRequest.data); } catch (e) { status = 500; response = { success: false, message: e?.toString() ?? "failed to process", }; } } return new Response(JSON.stringify(response), { status, headers, }); } } const lambdaHandler = async ( request: Request, _server: Server ): Promise => { const logger = new ConsoleTracingLogger("handler"); const sourceQueueUrl = process.env.SOURCE_QUEUE!; const sqsClient = new SQSClient({ region: process.env.AWS_REGION!, }); const processor = new SQSWidgetRequestProcessor( sqsClient, sourceQueueUrl, logger.createChild("WidgetRequestProcessor") ); const handler = new WidgetRequestHandler( processor, logger.createChild("WidgetRequestHandler") ); return await handler.handleRequest(request); }; export default lambdaHandler;