import type { Context as LambdaContext, SQSBatchItemFailure, SQSBatchResponse, SQSEvent, SQSRecord, } from 'aws-lambda'; import { lambdaContext, logger, recordContext, } from '#src/framework/logging.js'; type Handler = ( event: Event, ctx: LambdaContext, ) => Promise; export const createHandler = ( fn: (event: Event, ctx: LambdaContext) => Promise, ): Handler => async (event, ctx) => lambdaContext.run({ awsRequestId: ctx.awsRequestId }, async () => { try { const output = await fn(event, ctx); logger.debug({ output }, 'Function completed'); return output; } catch (err) { logger.error(err, 'Function failed'); throw new Error('Function failed'); } }); export const createBatchSQSHandler = ( fn: (record: SQSRecord, ctx: LambdaContext) => Promise, ): Handler => async (event, ctx) => { const processRecord = ( record: SQSRecord, ): Promise => recordContext.run({ sqsMessageId: record.messageId }, async () => { try { await fn(record, ctx); return; } catch (err) { logger.error(err, 'Processing record failed'); return { itemIdentifier: record.messageId, }; } }); const results = await Promise.all(event.Records.map(processRecord)); return { batchItemFailures: results.filter((item) => item !== undefined), }; };