From 63933283d38b76942cc942677587d1f184b9b4e5 Mon Sep 17 00:00:00 2001 From: Jim O'Donnell Date: Tue, 27 Jun 2023 15:00:31 +0100 Subject: [PATCH] Remove session caching Remove session caching from `auth.checkCurrent()`. Instead, add a `_fetching` state which is true while a user session is being fetched from Panoptes. --- lib/auth.js | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/auth.js b/lib/auth.js index 7522cf7..b4e9f82 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -17,6 +17,7 @@ const authClient = new Model({ _bearerTokenExpiration: NaN, _refreshToken: '', _tokenRefreshPromise: null, + _fetching: false, _getBearerToken: function() { console.log('Getting bearer token'); @@ -124,6 +125,7 @@ const authClient = new Model({ return this.register.apply(this, originalArguments); }.bind(this)); } else { + this._fetching = true; console.log('Registering new account', given.login); var registrationRequest = getCSRFToken(config.host).then(function(token) { var data = { @@ -144,18 +146,21 @@ const authClient = new Model({ .then(function() { return this._getBearerToken().then(function() { return this._getSession().then(function(user) { + this._fetching = false; console.info('Registered account', user.login, user.id); return user; }); }.bind(this)); }.bind(this)) .catch(function(request) { + this._fetching = false; console.error('Failed to register'); return apiClient.handleError(request); }); }.bind(this)); this.update({ + _fetching: true, _currentUserPromise: registrationRequest.catch(function() { return null; }), @@ -167,18 +172,25 @@ const authClient = new Model({ }, checkCurrent: function() { - if (!this._currentUserPromise) { - console.log('Checking current user'); + console.log('Checking current user'); + if (!this._fetching) { + var fetchUser = this._getBearerToken() + .then(function() { + return this._getSession(); + }.bind(this)) + .catch(function() { + // Nobody's signed in. This isn't an error. + console.info('No current user'); + return null; + }) + .then(function (user) { + this.fetching = false; + return user; + }.bind(this)); + this.update({ - _currentUserPromise: this._getBearerToken() - .then(function() { - return this._getSession(); - }.bind(this)) - .catch(function() { - // Nobody's signed in. This isn't an error. - console.info('No current user'); - return null; - }), + _fetching = true, + _currentUserPromise: fetchUser }); } @@ -204,6 +216,7 @@ const authClient = new Model({ }.bind(this)); } else { console.log('Signing in', credentials.login); + this._fetching = true; var signInRequest = getCSRFToken(config.host).then(function(token) { var url = config.host + '/users/sign_in'; @@ -220,18 +233,21 @@ const authClient = new Model({ .then(function() { return this._getBearerToken().then(function() { return this._getSession().then(function(user) { + this._fetching = false; console.info('Signed in', user.login, user.id); return user; }.bind(this)); }.bind(this)); }.bind(this)) .catch(function(request) { + this._fetching = false; console.error('Failed to sign in'); return apiClient.handleError(request); }); }.bind(this)); this.update({ + _fetching: true, _currentUserPromise: signInRequest.catch(function() { return null; }),