From 37acda655e202025373311624e19589ae7ef5970 Mon Sep 17 00:00:00 2001 From: Simon Nilsson Date: Fri, 28 Jul 2023 15:00:06 +0200 Subject: [PATCH] fix: resubscribe when no session present (#895) (#1650) --- src/lib/client.ts | 5 +++- test/abstract_client.ts | 33 +++++++++++++++++++++++++ test/server_helpers_for_client_tests.ts | 3 +++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/lib/client.ts b/src/lib/client.ts index 0f24f1971..9c90d4474 100644 --- a/src/lib/client.ts +++ b/src/lib/client.ts @@ -2105,8 +2105,11 @@ export default class MqttClient extends TypedEventEmitter= 4 && !this.connackPacket.sessionPresent)) && _resubscribeTopicsKeys.length > 0 ) { diff --git a/test/abstract_client.ts b/test/abstract_client.ts index abe89dec8..2c85e3a8d 100644 --- a/test/abstract_client.ts +++ b/test/abstract_client.ts @@ -3165,6 +3165,39 @@ export default function abstractTest(server, config) { }) }) + it('should resubscribe when clean=false and sessionPresent=false', function _test(done) { + const client = connect({ + clientId: 'test', + reconnectPeriod: 100, + clean: false, + protocolVersion: 4, + }) + let tryReconnect = true + let reconnectEvent = false + + client.on('reconnect', () => { + reconnectEvent = true + }) + + client.on('connect', () => { + if (tryReconnect) { + client.subscribe('hello', () => { + client.stream.end() + + server.once('client', (serverClient) => { + serverClient.on('subscribe', () => { + client.end(done) + }) + }) + }) + + tryReconnect = false + } else { + assert.isTrue(reconnectEvent) + } + }) + }) + it('should not resubscribe when reconnecting if resubscribe is disabled', function _test(done) { const client = connect({ reconnectPeriod: 100, resubscribe: false }) let tryReconnect = true diff --git a/test/server_helpers_for_client_tests.ts b/test/server_helpers_for_client_tests.ts index 833f23eb3..27b962cf5 100644 --- a/test/server_helpers_for_client_tests.ts +++ b/test/server_helpers_for_client_tests.ts @@ -36,6 +36,9 @@ export default function serverBuilder( if (!serverClient.writable) return false let rc = 'returnCode' const connack = {} + if (serverClient.options.protocolVersion >= 4) { + connack['sessionPresent'] = false + } if ( serverClient.options && serverClient.options.protocolVersion === 5