From 4f6ca094cfb10293752e5b4acce3535474bc43bc Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 30 Jul 2024 06:50:37 +0545 Subject: [PATCH 1/3] realtime reconnection changes --- .../flutter/lib/src/realtime_mixin.dart.twig | 83 +++++++++++-------- 1 file changed, 47 insertions(+), 36 deletions(-) diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index 29a0bcc8f..bfc5d0265 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -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,31 @@ 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; - } - _notifyDone = false; - await _closeConnection(); - _lastUrl = uri.toString(); - _websok = await getWebSocket(uri); - _notifyDone = true; - } - debugPrint('subscription: $_lastUrl'); - 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; + } + debugPrint('subscription: $_lastUrl'); + _retries = 0; _websocketSubscription = _websok?.stream.listen((response) { final data = RealtimeResponse.fromJson(response); switch (data.type) { @@ -87,34 +91,44 @@ 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 {{spec.title | caseUcfirst}}Exception) { rethrow; } - if (e is WebSocketChannelException) { - throw {{spec.title | caseUcfirst}}Exception(e.message); - } - throw {{spec.title | caseUcfirst}}Exception(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 {{spec.title | caseUcfirst}}Exception( @@ -167,13 +181,10 @@ mixin RealtimeMixin { } void handleError(RealtimeResponse response) { - if (response.data['code'] == 1008) { - throw AppwriteException(response.data["message"], response.data["code"]); + if (response.data['code'] == status.policyViolation) { + throw {{spec.title | caseUcfirst}}Exception(response.data["message"], response.data["code"]); } else { - debugPrint("Reconnecting in one second."); - Future.delayed(const Duration(seconds: 1), () { - _createSocket(); - }); + _retry(); } } } From caa9c69c9bb468d9d093b5d3fcce217796d1a85a Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 1 Aug 2024 07:30:54 +0545 Subject: [PATCH 2/3] Update realtime_mixin.dart.twig --- templates/flutter/lib/src/realtime_mixin.dart.twig | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index bfc5d0265..acdff0c29 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -120,13 +120,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 bd63d03513aa1c59fc5b6958d67a730f06f93faa Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 4 Aug 2024 07:29:21 +0545 Subject: [PATCH 3/3] Update realtime_mixin.dart.twig --- templates/flutter/lib/src/realtime_mixin.dart.twig | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index acdff0c29..bfc5d0265 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -120,12 +120,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() {