From a37bf2bde42888d663b4e0e0bf08ed0d14cc5a40 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 5 Jul 2022 12:08:08 +0200 Subject: [PATCH] fix(llc): fix connecting while connecting and disconneting (#1237) * fix(llc): fix connecting while connecting and disconneting * chore(llc): update changelog * chore(llc): add test * chore(llc): improve test * fix(llc): _resetRequestFlags regardless of the connection status --- packages/stream_chat/CHANGELOG.md | 6 ++++ .../stream_chat/lib/src/ws/websocket.dart | 4 +++ .../test/src/ws/websocket_test.dart | 34 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 2d17f32e..d336e017 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +🐞 Fixed + +- Fix WebSocket contemporary connection calls while disconnecting + ## 4.3.0 🐞 Fixed diff --git a/packages/stream_chat/lib/src/ws/websocket.dart b/packages/stream_chat/lib/src/ws/websocket.dart index 2287481e..a86ba6c5 100644 --- a/packages/stream_chat/lib/src/ws/websocket.dart +++ b/packages/stream_chat/lib/src/ws/websocket.dart @@ -436,6 +436,9 @@ class WebSocket with TimerHelper { /// Disconnects the WS and releases eventual resources void disconnect() { if (connectionStatus == ConnectionStatus.disconnected) return; + + _resetRequestFlags(resetAttempts: true); + _connectionStatus = ConnectionStatus.disconnected; _logger?.info('Disconnecting web-socket connection'); @@ -447,6 +450,7 @@ class WebSocket with TimerHelper { _stopMonitoringEvents(); _manuallyClosed = true; + _closeWebSocketChannel(); } } diff --git a/packages/stream_chat/test/src/ws/websocket_test.dart b/packages/stream_chat/test/src/ws/websocket_test.dart index 68242333..9489bc78 100644 --- a/packages/stream_chat/test/src/ws/websocket_test.dart +++ b/packages/stream_chat/test/src/ws/websocket_test.dart @@ -131,6 +131,40 @@ void main() { addTearDown(timer.cancel); }); + test('`connect`, `disconnect` and `connect` again without waiting', () async { + final user = OwnUser( + id: 'test-user', + name: 'test', + ); + const connectionId = 'test-connection-id'; + // Sends connect event to web-socket stream + final timer = Timer.periodic(const Duration(milliseconds: 300), (_) { + final event = Event( + type: EventType.healthCheck, + connectionId: connectionId, + me: user, + ); + webSocketSink.add(json.encode(event)); + }); + + await webSocket.connect( + user, + ); + + webSocket + ..disconnect() + ..connect(user) + ..disconnect(); + final event = await webSocket.connect(user); + + expect(event.type, EventType.healthCheck); + expect(event.connectionId, connectionId); + expect(event.me, isNotNull); + expect(event.me!.id, user.id); + + addTearDown(timer.cancel); + }); + test('`connect` should throw if already in connection attempt', () async { final user = OwnUser(id: 'test-user'); webSocket.connect(user);