From d3e6cc7eebcd623c9778d403f277154cabc31f08 Mon Sep 17 00:00:00 2001 From: Paolo Insogna Date: Fri, 3 Apr 2026 10:48:39 +0200 Subject: [PATCH] fix: Fixed retries overriding for idempotent. Signed-off-by: Paolo Insogna --- docs/producer.md | 2 ++ src/clients/producer/producer.ts | 4 +++- test/clients/producer/producer.test.ts | 27 +++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/producer.md b/docs/producer.md index 2d612c1..83c04ae 100644 --- a/docs/producer.md +++ b/docs/producer.md @@ -31,6 +31,8 @@ Options: It also supports all the constructor options of `Base`. +When `idempotent` is enabled, `retries` defaults to `Number.MAX_SAFE_INTEGER` when not set, and it is raised to `Number.MAX_SAFE_INTEGER` for values less than or equal to `1` to avoid unsafe idempotent retry behavior. + Notes: `zstd` is not available in node `v20` ## Basic Methods diff --git a/src/clients/producer/producer.ts b/src/clients/producer/producer.ts index e7d6b46..52d4755 100644 --- a/src/clients/producer/producer.ts +++ b/src/clients/producer/producer.ts @@ -115,7 +115,9 @@ export class Producer { + const producer = createProducer(t, { + idempotent: true, + retries: 7 + }) + + strictEqual((producer[kOptions] as { retries: number }).retries, 7) +}) + +test('constructor should default retries to safe value only when not set', t => { + const producer = createProducer(t, { idempotent: true }) + + strictEqual((producer[kOptions] as { retries: number }).retries, Number.MAX_SAFE_INTEGER) +}) + +test('constructor should set retries to safe value when idempotent and too low', t => { + const producerZero = createProducer(t, { idempotent: true, retries: 0 }) + const producerOne = createProducer(t, { idempotent: true, retries: 1 }) + const producerNone = createProducer(t, { idempotent: true }) + + strictEqual((producerZero[kOptions] as { retries: number }).retries, Number.MAX_SAFE_INTEGER) + strictEqual((producerOne[kOptions] as { retries: number }).retries, Number.MAX_SAFE_INTEGER) + strictEqual((producerNone[kOptions] as { retries: number }).retries, Number.MAX_SAFE_INTEGER) +}) + test('constructor should emit warnings for experimental APIs', () => { const warnings: string[] = [] const originalEmitWarning = process.emitWarning