From 75c722fe96ef70bc5b7127ea0cd3e0a6ef1659f4 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 09:46:17 -0400 Subject: [PATCH 01/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index fcacd8ed..e7ceff45 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1058,7 +1058,9 @@ class GoTrueClient { String? accessToken, bool ignorePendingRequest = false, }) async { + print("🦁 CALLING REFRESH TOKEN 🦁"); if (_refreshTokenCompleter?.isCompleted ?? true) { + print("🦁 CREATING NEW FUTURE 🦁"); _refreshTokenCompleter = Completer(); // Catch any error in case nobody awaits the future _refreshTokenCompleter!.future.then( @@ -1066,8 +1068,10 @@ class GoTrueClient { onError: (error, stack) => null, ); } else if (!ignorePendingRequest) { + print("🦁 RETURNING EXISTING FUTURE 🦁"); return _refreshTokenCompleter!.future; } + print("🦁 REFRESHING SESSION 🦁"); final token = refreshToken ?? currentSession?.refreshToken; if (token == null) { throw AuthException('No current session.'); @@ -1100,6 +1104,8 @@ class GoTrueClient { notifyAllSubscribers(AuthChangeEvent.tokenRefreshed); return authResponse; } on ClientException catch (e, stack) { + print("🦁 CLIENT EXCEPTION 🦁: $e $stack"); + _setTokenRefreshTimer( Constants.retryInterval * pow(2, _refreshTokenRetryCount), refreshToken: token, @@ -1110,6 +1116,8 @@ class GoTrueClient { } rethrow; } catch (error, stack) { + print("🦁 OTHER EXCEPTION 🦁: $error $stack"); + if (error is AuthException) { if (error.message.startsWith('Invalid Refresh Token:')) { await signOut(); From d55cc5f3aec02bd6d4df8bfc8986c8a01a0e01ef Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:12:10 -0400 Subject: [PATCH 02/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index e7ceff45..e3b87875 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1067,6 +1067,11 @@ class GoTrueClient { (value) => null, onError: (error, stack) => null, ); + _refreshTokenCompleter!.future.timeout(const Duration(seconds: 10), onTimeout: () { + if (!_refreshTokenCompleter!.isCompleted) { + _refreshTokenCompleter!.completeError(TimeoutException(), StackTrace.current); + } + }); } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); return _refreshTokenCompleter!.future; From 31dc2eca44ec80d66143667e1c00f01cfaa93fab Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:22:22 -0400 Subject: [PATCH 03/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index e3b87875..d6432c17 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1067,10 +1067,12 @@ class GoTrueClient { (value) => null, onError: (error, stack) => null, ); - _refreshTokenCompleter!.future.timeout(const Duration(seconds: 10), onTimeout: () { + (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { if (!_refreshTokenCompleter!.isCompleted) { _refreshTokenCompleter!.completeError(TimeoutException(), StackTrace.current); } + + throw TimeoutException(); }); } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); From dbe4fd9d5054741afe44fe16a4df6122b1200408 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:26:01 -0400 Subject: [PATCH 04/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index d6432c17..59b0c44d 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1069,10 +1069,10 @@ class GoTrueClient { ); (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { if (!_refreshTokenCompleter!.isCompleted) { - _refreshTokenCompleter!.completeError(TimeoutException(), StackTrace.current); + _refreshTokenCompleter!.completeError(TimeoutException("Timeout"), StackTrace.current); } - throw TimeoutException(); + throw TimeoutException("Timeout"); }); } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); From eed46f42eeec5ecc8ff7590fff5f11ae134239f5 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:54:31 -0400 Subject: [PATCH 05/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index 59b0c44d..8e928fdc 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1067,14 +1067,19 @@ class GoTrueClient { (value) => null, onError: (error, stack) => null, ); - (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { - if (!_refreshTokenCompleter!.isCompleted) { - _refreshTokenCompleter!.completeError(TimeoutException("Timeout"), StackTrace.current); - } - - throw TimeoutException("Timeout"); - }); - } else if (!ignorePendingRequest) { + try { + (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { + if (!_refreshTokenCompleter!.isCompleted) { + _refreshTokenCompleter!.completeError(TimeoutException("Timeout"), StackTrace.current); + } + + throw TimeoutException("Timeout"); + }); + } catch (error, stackTrace) { + print("🦁 TIMED OUT SELF FUTURE 🦁"); + return Future.error(error, stackTrace); + } + } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); return _refreshTokenCompleter!.future; } From 23b1b264c2253bc423501ff5d66dcc3f6502f8c3 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 11:11:13 -0400 Subject: [PATCH 06/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index 8e928fdc..e96a120f 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1018,18 +1018,22 @@ class GoTrueClient { String? refreshToken, String? accessToken, }) { + print("🦁 SET TIMER REFRESH TOKEN 🦁"); _refreshTokenTimer?.cancel(); _refreshTokenRetryCount++; if (_refreshTokenRetryCount < Constants.maxRetryCount) { _refreshTokenTimer = Timer(timerDuration, () async { + print("🦁 CALL TIMER REFRESH TOKEN 🦁"); try { await _callRefreshToken( refreshToken: refreshToken, accessToken: accessToken, ignorePendingRequest: true, ); - } catch (_) { + print("🦁 SUCCESS TIMER REFRESH TOKEN 🦁"); + } catch (err, stack) { // Catch any error, because in this case they should be handled by listening to [onAuthStateChange] + print("🦁 ERROR TIMER REFRESH TOKEN 🦁: $err #stack"); } }); } else { From 78ec9a8c251e2b7e87bda2ee10752d026d027ba3 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 11:25:05 -0400 Subject: [PATCH 07/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index e96a120f..9cede047 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1130,7 +1130,7 @@ class GoTrueClient { if (!_refreshTokenCompleter!.isCompleted) { _refreshTokenCompleter!.completeError(e, stack); } - rethrow; + //rethrow; } catch (error, stack) { print("🦁 OTHER EXCEPTION 🦁: $error $stack"); From 6fa82cff0a7723b94907083e1c9cadbc1a54aa8c Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 13:47:43 -0400 Subject: [PATCH 08/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index 9cede047..ce92f207 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -581,7 +581,7 @@ class GoTrueClient { /// Force refreshes the session including the user data in case it was updated /// in a different session. - Future refreshSession() async { + Future refreshSession() async { if (currentSession?.accessToken == null) { throw AuthException('Not logged in.'); } @@ -707,7 +707,7 @@ class GoTrueClient { } /// Sets the session data from refresh_token and returns the current session. - Future setSession(String refreshToken) async { + Future setSession(String refreshToken) async { if (refreshToken.isEmpty) { throw AuthException('No current session.'); } @@ -916,7 +916,7 @@ class GoTrueClient { } /// Recover session from stringified [Session]. - Future recoverSession(String jsonStr) async { + Future recoverSession(String jsonStr) async { final session = Session.fromJson(json.decode(jsonStr)); if (session == null) { await signOut(); @@ -1057,7 +1057,7 @@ class GoTrueClient { /// To call [_callRefreshToken] during a running request [ignorePendingRequest] is used to bypass that check. /// /// When a [ClientException] occurs [_setTokenRefreshTimer] is used to schedule a retry in the background, which emits the result via [onAuthStateChange]. - Future _callRefreshToken({ + Future _callRefreshToken({ String? refreshToken, String? accessToken, bool ignorePendingRequest = false, @@ -1130,7 +1130,6 @@ class GoTrueClient { if (!_refreshTokenCompleter!.isCompleted) { _refreshTokenCompleter!.completeError(e, stack); } - //rethrow; } catch (error, stack) { print("🦁 OTHER EXCEPTION 🦁: $error $stack"); From 6b93476502b02e24c4b12c2ef53f94e21e73fd73 Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 13:58:30 -0400 Subject: [PATCH 09/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index ce92f207..b2a8dc63 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -55,7 +55,7 @@ class GoTrueClient { int _refreshTokenRetryCount = 0; /// Completer to combine multiple simultaneous token refresh requests. - Completer? _refreshTokenCompleter; + Completer? _refreshTokenCompleter; final _onAuthStateChangeController = BehaviorSubject(); final _onAuthStateChangeControllerSync = @@ -1065,7 +1065,7 @@ class GoTrueClient { print("🦁 CALLING REFRESH TOKEN 🦁"); if (_refreshTokenCompleter?.isCompleted ?? true) { print("🦁 CREATING NEW FUTURE 🦁"); - _refreshTokenCompleter = Completer(); + _refreshTokenCompleter = Completer(); // Catch any error in case nobody awaits the future _refreshTokenCompleter!.future.then( (value) => null, @@ -1074,14 +1074,14 @@ class GoTrueClient { try { (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { if (!_refreshTokenCompleter!.isCompleted) { - _refreshTokenCompleter!.completeError(TimeoutException("Timeout"), StackTrace.current); + _refreshTokenCompleter!.complete(null); } throw TimeoutException("Timeout"); }); } catch (error, stackTrace) { print("🦁 TIMED OUT SELF FUTURE 🦁"); - return Future.error(error, stackTrace); + return null; } } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); @@ -1128,8 +1128,9 @@ class GoTrueClient { accessToken: accessToken, ); if (!_refreshTokenCompleter!.isCompleted) { - _refreshTokenCompleter!.completeError(e, stack); + _refreshTokenCompleter!.complete(null); } + return null; } catch (error, stack) { print("🦁 OTHER EXCEPTION 🦁: $error $stack"); From e1a4bb50238136cf6cab27e54e18b8f0e565d6bc Mon Sep 17 00:00:00 2001 From: Conner <20548516+ConProgramming@users.noreply.github.com> Date: Wed, 27 Mar 2024 14:09:06 -0400 Subject: [PATCH 10/10] Update gotrue_client.dart --- packages/gotrue/lib/src/gotrue_client.dart | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index b2a8dc63..d5604164 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -1071,19 +1071,12 @@ class GoTrueClient { (value) => null, onError: (error, stack) => null, ); - try { - (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { - if (!_refreshTokenCompleter!.isCompleted) { - _refreshTokenCompleter!.complete(null); - } - - throw TimeoutException("Timeout"); - }); - } catch (error, stackTrace) { - print("🦁 TIMED OUT SELF FUTURE 🦁"); - return null; - } - } else if (!ignorePendingRequest) { + (_refreshTokenCompleter!.future as Future).timeout(const Duration(seconds: 10), onTimeout: () { + if (!_refreshTokenCompleter!.isCompleted) { + _refreshTokenCompleter!.complete(null); + } + }); + } else if (!ignorePendingRequest) { print("🦁 RETURNING EXISTING FUTURE 🦁"); return _refreshTokenCompleter!.future; }