From 077c75f506725cfaeab515c7721d771329c4abd7 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 11:58:39 +0200 Subject: [PATCH 1/5] style(batch): apply stricter linting --- packages/batch/src/BasePartialProcessor.ts | 4 +--- packages/batch/src/BatchProcessorSync.ts | 2 +- packages/batch/tests/helpers/handlers.ts | 4 ++-- packages/batch/tests/unit/BasePartialProcessor.test.ts | 2 +- packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts | 2 +- packages/batch/tests/unit/processPartialResponse.test.ts | 6 +++--- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/batch/src/BasePartialProcessor.ts b/packages/batch/src/BasePartialProcessor.ts index 23b7cdc9cc..da09f22557 100644 --- a/packages/batch/src/BasePartialProcessor.ts +++ b/packages/batch/src/BasePartialProcessor.ts @@ -239,9 +239,7 @@ abstract class BasePartialProcessor { /** * Processes records in parallel using `Promise.all`. */ - async #processRecordsInParallel(): Promise< - (SuccessResponse | FailureResponse)[] - > { + #processRecordsInParallel(): Promise<(SuccessResponse | FailureResponse)[]> { return Promise.all( this.records.map((record) => this.processRecord(record)) ); diff --git a/packages/batch/src/BatchProcessorSync.ts b/packages/batch/src/BatchProcessorSync.ts index a3613a3d51..45f47a6e21 100644 --- a/packages/batch/src/BatchProcessorSync.ts +++ b/packages/batch/src/BatchProcessorSync.ts @@ -88,7 +88,7 @@ import type { BaseRecord, FailureResponse, SuccessResponse } from './types.js'; * * @param _record The record to be processed */ - public async processRecord( + public processRecord( _record: BaseRecord ): Promise { throw new BatchProcessingError('Not implemented. Use process() instead.'); diff --git a/packages/batch/tests/helpers/handlers.ts b/packages/batch/tests/helpers/handlers.ts index 24dff02799..ab28348359 100644 --- a/packages/batch/tests/helpers/handlers.ts +++ b/packages/batch/tests/helpers/handlers.ts @@ -39,7 +39,7 @@ const dynamodbRecordHandler = (record: DynamoDBRecord): object => { return body; }; -const asyncDynamodbRecordHandler = async ( +const asyncDynamodbRecordHandler = ( record: DynamoDBRecord ): Promise => { return Promise.resolve(dynamodbRecordHandler(record)); @@ -57,7 +57,7 @@ const handlerWithContext = (record: SQSRecord, context: Context): string => { return record.body; }; -const asyncHandlerWithContext = async ( +const asyncHandlerWithContext = ( record: SQSRecord, context: Context ): Promise => { diff --git a/packages/batch/tests/unit/BasePartialProcessor.test.ts b/packages/batch/tests/unit/BasePartialProcessor.test.ts index 6c5421c01b..5e61ebe294 100644 --- a/packages/batch/tests/unit/BasePartialProcessor.test.ts +++ b/packages/batch/tests/unit/BasePartialProcessor.test.ts @@ -25,7 +25,7 @@ describe('Class: BasePartialBatchProcessor', () => { super(EventType.SQS); } - public async processRecord( + public processRecord( _record: BaseRecord ): Promise { throw new Error('Not implemented'); diff --git a/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts b/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts index 6071464039..a4b55da062 100644 --- a/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts +++ b/packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts @@ -186,7 +186,7 @@ describe('SQS FIFO Processors', () => { }); } - it('continues processing and moves to the next group when `skipGroupOnError` is true', async () => { + it('continues processing and moves to the next group when `skipGroupOnError` is true', () => { // Prepare const firstRecord = sqsRecordFactory('fail', '1'); const secondRecord = sqsRecordFactory('success', '2'); diff --git a/packages/batch/tests/unit/processPartialResponse.test.ts b/packages/batch/tests/unit/processPartialResponse.test.ts index d9c6d56a20..78b4ca3760 100644 --- a/packages/batch/tests/unit/processPartialResponse.test.ts +++ b/packages/batch/tests/unit/processPartialResponse.test.ts @@ -36,7 +36,7 @@ describe('Function: processPartialResponse()', () => { context, }; - const handlerWithSqsEvent = async ( + const handlerWithSqsEvent = ( event: SQSEvent, options: BatchProcessingOptions ) => { @@ -51,7 +51,7 @@ describe('Function: processPartialResponse()', () => { return handler(event, context); }; - const handlerWithKinesisEvent = async ( + const handlerWithKinesisEvent = ( event: KinesisStreamEvent, options: BatchProcessingOptions ) => { @@ -71,7 +71,7 @@ describe('Function: processPartialResponse()', () => { return handler(event, context); }; - const handlerWithDynamoDBEvent = async ( + const handlerWithDynamoDBEvent = ( event: DynamoDBStreamEvent, options: BatchProcessingOptions ) => { From 5d8bd6775c6797a545ef995ea14203fb4313dd39 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 12:27:19 +0200 Subject: [PATCH 2/5] style(batch): address SonarCloud issues --- packages/batch/tests/helpers/handlers.ts | 59 ++++++++++++++++++------ 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/packages/batch/tests/helpers/handlers.ts b/packages/batch/tests/helpers/handlers.ts index ab28348359..2a42616614 100644 --- a/packages/batch/tests/helpers/handlers.ts +++ b/packages/batch/tests/helpers/handlers.ts @@ -1,4 +1,5 @@ import type { + AttributeValue, Context, DynamoDBRecord, KinesisStreamRecord, @@ -8,19 +9,25 @@ import type { const sqsRecordHandler = (record: SQSRecord): string => { const body = record.body; if (body.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; }; -const asyncSqsRecordHandler = async (record: SQSRecord): Promise => - Promise.resolve(sqsRecordHandler(record)); +const asyncSqsRecordHandler = async (record: SQSRecord): Promise => { + const body = record.body; + if (body.includes('fail')) { + throw new Error('Failed to process record.'); + } + await new Promise((resolve) => setTimeout(resolve, 1)); + return body; +}; const kinesisRecordHandler = (record: KinesisStreamRecord): string => { const body = record.kinesis.data; if (body.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; @@ -28,40 +35,64 @@ const kinesisRecordHandler = (record: KinesisStreamRecord): string => { const asyncKinesisRecordHandler = async ( record: KinesisStreamRecord -): Promise => Promise.resolve(kinesisRecordHandler(record)); +): Promise => { + const body = record.kinesis.data; + if (body.includes('fail')) { + throw new Error('Failed to process record.'); + } + await new Promise((resolve) => setTimeout(resolve, 1)); + return body; +}; -const dynamodbRecordHandler = (record: DynamoDBRecord): object => { +const dynamodbRecordHandler = (record: DynamoDBRecord): AttributeValue => { const body = record.dynamodb?.NewImage?.Message || { S: 'fail' }; if (body.S?.includes('fail')) { - throw Error('Failed to process record.'); + throw new Error('Failed to process record.'); } return body; }; -const asyncDynamodbRecordHandler = ( +const asyncDynamodbRecordHandler = async ( record: DynamoDBRecord -): Promise => { - return Promise.resolve(dynamodbRecordHandler(record)); +): Promise => { + const body = record.dynamodb?.NewImage?.Message || { S: 'fail' }; + if (body.S?.includes('fail')) { + throw new Error('Failed to process record.'); + } + await new Promise((resolve) => setTimeout(resolve, 1)); + return body; }; const handlerWithContext = (record: SQSRecord, context: Context): string => { try { if (context.getRemainingTimeInMillis() === 0) { - throw Error('No time remaining.'); + throw new Error('No time remaining.'); } } catch { - throw Error(`Context possibly malformed. Displaying context:\n${context}`); + throw new Error( + `Context possibly malformed. Displaying context:\n${context}` + ); } return record.body; }; -const asyncHandlerWithContext = ( +const asyncHandlerWithContext = async ( record: SQSRecord, context: Context ): Promise => { - return Promise.resolve(handlerWithContext(record, context)); + try { + if (context.getRemainingTimeInMillis() === 0) { + throw new Error('No time remaining.'); + } + } catch { + throw new Error( + `Context possibly malformed. Displaying context:\n${context}` + ); + } + await new Promise((resolve) => setTimeout(resolve, 1)); + return record.body; }; export { From 2da7c9ec852780ad20be37b830467cfbef86550d Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 13:04:49 +0200 Subject: [PATCH 3/5] chore: use setTimeout from node:timers --- packages/batch/tests/helpers/handlers.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/batch/tests/helpers/handlers.ts b/packages/batch/tests/helpers/handlers.ts index 2a42616614..5f0b63eb88 100644 --- a/packages/batch/tests/helpers/handlers.ts +++ b/packages/batch/tests/helpers/handlers.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers/promises'; import type { AttributeValue, Context, @@ -20,7 +21,7 @@ const asyncSqsRecordHandler = async (record: SQSRecord): Promise => { if (body.includes('fail')) { throw new Error('Failed to process record.'); } - await new Promise((resolve) => setTimeout(resolve, 1)); + await setTimeout(1); // simulate some processing time return body; }; @@ -40,7 +41,7 @@ const asyncKinesisRecordHandler = async ( if (body.includes('fail')) { throw new Error('Failed to process record.'); } - await new Promise((resolve) => setTimeout(resolve, 1)); + await setTimeout(1); // simulate some processing time return body; }; @@ -60,7 +61,7 @@ const asyncDynamodbRecordHandler = async ( if (body.S?.includes('fail')) { throw new Error('Failed to process record.'); } - await new Promise((resolve) => setTimeout(resolve, 1)); + await setTimeout(1); // simulate some processing time return body; }; @@ -91,7 +92,7 @@ const asyncHandlerWithContext = async ( `Context possibly malformed. Displaying context:\n${context}` ); } - await new Promise((resolve) => setTimeout(resolve, 1)); + await setTimeout(1); // simulate some processing time return record.body; }; From 605704893dcdf855770b7f3ff594ee7de637a0b4 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 16:34:20 +0200 Subject: [PATCH 4/5] chore: add return type --- packages/batch/tests/unit/processPartialResponse.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/batch/tests/unit/processPartialResponse.test.ts b/packages/batch/tests/unit/processPartialResponse.test.ts index 78b4ca3760..9bb8f89148 100644 --- a/packages/batch/tests/unit/processPartialResponse.test.ts +++ b/packages/batch/tests/unit/processPartialResponse.test.ts @@ -39,7 +39,7 @@ describe('Function: processPartialResponse()', () => { const handlerWithSqsEvent = ( event: SQSEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.SQS); const handler = async ( From 86619157c4b49f6e53f4153bc41998eb6d1d2257 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 24 Sep 2025 17:03:54 +0200 Subject: [PATCH 5/5] chore: add return type --- packages/batch/tests/unit/processPartialResponse.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/batch/tests/unit/processPartialResponse.test.ts b/packages/batch/tests/unit/processPartialResponse.test.ts index 9bb8f89148..60b6a31cb4 100644 --- a/packages/batch/tests/unit/processPartialResponse.test.ts +++ b/packages/batch/tests/unit/processPartialResponse.test.ts @@ -54,7 +54,7 @@ describe('Function: processPartialResponse()', () => { const handlerWithKinesisEvent = ( event: KinesisStreamEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.KinesisDataStreams); const handler = async ( @@ -74,7 +74,7 @@ describe('Function: processPartialResponse()', () => { const handlerWithDynamoDBEvent = ( event: DynamoDBStreamEvent, options: BatchProcessingOptions - ) => { + ): Promise => { const processor = new BatchProcessor(EventType.DynamoDBStreams); const handler = async (