From 61f24f0438ec07b14a7f8b92872dc8efbc411c57 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 18 Jul 2024 11:49:59 +0545 Subject: [PATCH 1/4] retry realtime on error or close --- lib/src/realtime_mixin.dart | 81 +++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/lib/src/realtime_mixin.dart b/lib/src/realtime_mixin.dart index 389acea8..0841237e 100644 --- a/lib/src/realtime_mixin.dart +++ b/lib/src/realtime_mixin.dart @@ -23,6 +23,8 @@ mixin RealtimeMixin { int? get closeCode => _websok?.closeCode; Map _subscriptions = {}; bool _notifyDone = true; + bool _reconnect = true; + int _retries = 0; StreamSubscription? _websocketSubscription; bool _creatingSocket = false; @@ -30,29 +32,32 @@ mixin RealtimeMixin { await _websocketSubscription?.cancel(); await _websok?.sink.close(status.normalClosure, 'Ending session'); _lastUrl = null; + _retries = 0; + _reconnect = false; } _createSocket() async { if (_creatingSocket || _channels.isEmpty) return; _creatingSocket = true; final uri = _prepareUri(); - if (_websok == null) { - _websok = await getWebSocket(uri); - _lastUrl = uri.toString(); - } else { - if (_lastUrl == uri.toString() && _websok?.closeCode == null) { - _creatingSocket = false; - return; + try { + if (_websok == null || _websok?.closeCode != null) { + _websok = await getWebSocket(uri); + _lastUrl = uri.toString(); + } else { + if (_lastUrl == uri.toString() && _websok?.closeCode == null) { + _creatingSocket = false; + return; + } + _notifyDone = false; + await _closeConnection(); + _lastUrl = uri.toString(); + _websok = await getWebSocket(uri); + _notifyDone = true; } - _notifyDone = false; - await _closeConnection(); - _lastUrl = uri.toString(); - _websok = await getWebSocket(uri); - _notifyDone = true; - } - debugPrint('subscription: $_lastUrl'); + debugPrint('subscription: $_lastUrl'); + _retries = 0; - try { _websocketSubscription = _websok?.stream.listen((response) { final data = RealtimeResponse.fromJson(response); switch (data.type) { @@ -87,34 +92,45 @@ mixin RealtimeMixin { break; } }, onDone: () { - final subscriptions = List.from(_subscriptions.values); - for (var subscription in subscriptions) { - subscription.close(); - } - _channels.clear(); - _closeConnection(); + _retry(); }, onError: (err, stack) { for (var subscription in _subscriptions.values) { subscription.controller.addError(err, stack); } - if (_websok?.closeCode != null && _websok?.closeCode != 1008) { - debugPrint("Reconnecting in one second."); - Future.delayed(Duration(seconds: 1), _createSocket); - } + + _retry(); }); } catch (e) { if (e is AppwriteException) { rethrow; } - if (e is WebSocketChannelException) { - throw AppwriteException(e.message); - } - throw AppwriteException(e.toString()); + debugPrint(e.toString()); + _retry(); } finally { _creatingSocket = false; } } + void _retry() async { + if (!_reconnect || _websok?.closeCode == status.policyViolation) { + _reconnect = true; + return; + } + _retries++; + debugPrint("Reconnecting in ${_getTimeout()} seconds."); + Future.delayed(Duration(seconds: _getTimeout()), _createSocket); + } + + int _getTimeout() { + return _retries < 5 + ? 1 + : _retries < 15 + ? 5 + : _retries < 100 + ? 10 + : 60; + } + Uri _prepareUri() { if (client.endPointRealtime == null) { throw AppwriteException( @@ -167,13 +183,10 @@ mixin RealtimeMixin { } void handleError(RealtimeResponse response) { - if (response.data['code'] == 1008) { + if (response.data['code'] == status.policyViolation) { throw AppwriteException(response.data["message"], response.data["code"]); } else { - debugPrint("Reconnecting in one second."); - Future.delayed(const Duration(seconds: 1), () { - _createSocket(); - }); + _retry(); } } } From 68a58593957e26fb498efbcfdd1c66a8030f5aab Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 1 Aug 2024 07:26:58 +0545 Subject: [PATCH 2/4] Update lib/src/realtime_mixin.dart Co-authored-by: Steven Nguyen <1477010+stnguyen90@users.noreply.github.com> --- lib/src/realtime_mixin.dart | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/src/realtime_mixin.dart b/lib/src/realtime_mixin.dart index 0841237e..773fa196 100644 --- a/lib/src/realtime_mixin.dart +++ b/lib/src/realtime_mixin.dart @@ -122,13 +122,12 @@ mixin RealtimeMixin { } int _getTimeout() { - return _retries < 5 - ? 1 - : _retries < 15 - ? 5 - : _retries < 100 - ? 10 - : 60; + return switch (_retries) { + < 5 => 1, + < 15 => 5, + < 100 => 10, + _ => 60, + }; } Uri _prepareUri() { From b775934a892251c0192db4bbd52834379778952a Mon Sep 17 00:00:00 2001 From: lohanidamodar Date: Thu, 1 Aug 2024 01:42:22 +0000 Subject: [PATCH 3/4] Commit from GitHub Actions (Format and push) --- lib/src/realtime_mixin.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/realtime_mixin.dart b/lib/src/realtime_mixin.dart index 773fa196..b2919ad7 100644 --- a/lib/src/realtime_mixin.dart +++ b/lib/src/realtime_mixin.dart @@ -122,12 +122,12 @@ mixin RealtimeMixin { } int _getTimeout() { - return switch (_retries) { - < 5 => 1, - < 15 => 5, - < 100 => 10, - _ => 60, - }; + return switch (_retries) { + < 5 => 1, + < 15 => 5, + < 100 => 10, + _ => 60, + }; } Uri _prepareUri() { From 35344b57fcb79c5704926aaf0d28eb5fd55274e2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 9 Aug 2024 08:02:52 +0545 Subject: [PATCH 4/4] Update realtime_mixin.dart --- lib/src/realtime_mixin.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/src/realtime_mixin.dart b/lib/src/realtime_mixin.dart index b2919ad7..0841237e 100644 --- a/lib/src/realtime_mixin.dart +++ b/lib/src/realtime_mixin.dart @@ -122,12 +122,13 @@ mixin RealtimeMixin { } int _getTimeout() { - return switch (_retries) { - < 5 => 1, - < 15 => 5, - < 100 => 10, - _ => 60, - }; + return _retries < 5 + ? 1 + : _retries < 15 + ? 5 + : _retries < 100 + ? 10 + : 60; } Uri _prepareUri() {