From 99b85a3bebfdc4fada03e6c71c2703807ac6d3cd Mon Sep 17 00:00:00 2001 From: enisdenjo Date: Thu, 22 Apr 2021 23:49:32 +0200 Subject: [PATCH] fix(client): Lazy connects after successful reconnects are not retries --- src/client.ts | 1 + src/tests/client.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/client.ts b/src/client.ts index 33a384a3..badd9d94 100644 --- a/src/client.ts +++ b/src/client.ts @@ -410,6 +410,7 @@ export function createClient(options: ClientOptions): Client { ); acknowledged = true; emitter.emit('connected', socket, message.payload); // connected = socket opened + acknowledged + retrying = false; // future lazy connects are not retries retries = 0; // reset the retries on connect connected([ socket, diff --git a/src/tests/client.ts b/src/tests/client.ts index 5704fe05..55eaa018 100644 --- a/src/tests/client.ts +++ b/src/tests/client.ts @@ -1142,6 +1142,48 @@ describe('reconnecting', () => { fail("Client shouldn't have reconnected"); }, 20); }); + + it('should not count lazy connect after succesful reconnect as another retry', async () => { + const { url, ...server } = await startTServer(); + + const retry = jest.fn(); + const client = createClient({ + url, + retryAttempts: 1, + retryWait: () => { + retry(); + return Promise.resolve(); + }, + }); + + let sub = tsubscribe(client, { + query: 'subscription { ping }', + }); + + // closed connection, retried and successfully subscribed + await server.waitForClient((client) => { + client.close(); + }); + await server.waitForClientClose(); + await server.waitForClient(); + + // complete subscription and close connection (because lazy) + sub.dispose(); + await server.waitForClientClose(); + + // new subscription, connect again + sub = tsubscribe(client, { + query: 'subscription { ping }', + }); + await server.waitForClient(); + + // complete subscription and close connection (because lazy) + sub.dispose(); + await server.waitForClientClose(); + + // only one retry had happened (for first subscription) + expect(retry).toBeCalledTimes(1); + }); }); describe('events', () => {