From ee245d3c4c125720192e6a88c98cd4a04d8a74ca Mon Sep 17 00:00:00 2001 From: gleip Date: Wed, 5 Nov 2025 17:19:35 +0300 Subject: [PATCH] fix: logic for default request timeout --- src/Root.ts | 10 +++++----- src/Service.ts | 2 +- src/__tests__/Client.ts | 27 ++++++++++++++++++++------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/Root.ts b/src/Root.ts index 85002d3..9db35ea 100644 --- a/src/Root.ts +++ b/src/Root.ts @@ -47,15 +47,15 @@ export class Root { protected getExpired(expired?: number, ownTimeout?: number) { try { - if (!expired) { - const timeout = ownTimeout || this.castToNumber(this.getSettingFromEnv('DEFAULT_RESPONSE_TIMEOUT')); + if (!expired && !ownTimeout) { + const timeout = this.castToNumber(this.getSettingFromEnv('DEFAULT_RESPONSE_TIMEOUT')); return Date.now() + timeout; } if (ownTimeout) { - const customExpired = Date.now() + ownTimeout; - return Math.min(customExpired, expired); + return Date.now() + ownTimeout; } - return expired; + + return expired!; } catch (error) { this.logger.error(error); process.exit(1); diff --git a/src/Service.ts b/src/Service.ts index 9b3eb20..c586a0e 100644 --- a/src/Service.ts +++ b/src/Service.ts @@ -334,7 +334,7 @@ export class Service extends Root { this.rootSpans.set(newBaggage.traceId, span); return { ...newBaggage, - expired: this.getExpired(undefined, ownTimeout), + expired: this.getExpired(newBaggage.expired, ownTimeout), }; } diff --git a/src/__tests__/Client.ts b/src/__tests__/Client.ts index dfee740..bc98cc3 100644 --- a/src/__tests__/Client.ts +++ b/src/__tests__/Client.ts @@ -71,19 +71,23 @@ describe('Testing Client class methods', () => { test('Successful subscription and event processing for a streaming event', () => { const payload = { data: { elapsed: 42 } }; - jetstreamNextMock.mockResolvedValue({ data: codec.encode(payload.data), sid: '1', ack: jest.fn(), nak: jest.fn() }); + jetstreamNextMock.mockResolvedValue({ + data: codec.encode(payload.data), + sid: '1', + ack: jest.fn(), + nak: jest.fn(), + }); const result = mathClient.getListener('Test'); - const handler = event => { + const handler = (event: any) => { expect(event.data.elapsed).toBe(payload.data.elapsed); result.off('Elapsed', handler); - } + }; result.on('Elapsed', handler); - }); test('Successful unsubscribe from the event', () => { - const subscribe = new PassThrough(); + const subscribe: PassThrough & { unsubscribe?: jest.Mock } = new PassThrough(); subscribe['unsubscribe'] = jest.fn(); broker.subscribe.mockReturnValue(subscribe); @@ -248,9 +252,18 @@ describe('Testing Client class methods', () => { expired: Date.now() - 1, }); - const payload = { a: 5, b: 5 }; + await expect(mathClient.fibonacci({ length: 5 })).rejects.toThrow(); + }); - await expect(mathClient.sum(payload)).rejects.toThrow(); + test('If a method has own timeout, own timeout is more priority', async () => { + const mathClient = new MathClient(broker as any, { + spanId: '1', + traceId: '1', + traceFlags: 1, + expired: Date.now() - 1, + }); + + await mathClient.sum({ a: 5, b: 5 }); }); test('If the request returns an error, then an error is generated', async () => {