From 135be443c2019aafd18eb9c863a833504049127c Mon Sep 17 00:00:00 2001 From: dblythy Date: Thu, 6 Jul 2023 20:32:18 +1000 Subject: [PATCH 1/7] Update Auth.js --- src/Auth.js | 60 +++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/src/Auth.js b/src/Auth.js index 0fe3b54460..ede2e481d9 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -3,7 +3,6 @@ import { isDeepStrictEqual } from 'util'; import { getRequestObject, resolveError } from './triggers'; import Deprecator from './Deprecator/Deprecator'; import { logger } from './logger'; -import RestQuery from './RestQuery'; import RestWrite from './RestWrite'; // An Auth object tells you who is requesting something and whether @@ -73,39 +72,33 @@ const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { if (!config?.extendSessionOnUse) { return; } - clearTimeout(throttle[sessionToken]); - throttle[sessionToken] = setTimeout(async () => { - try { - if (!session) { - const { results } = await new RestQuery( - config, - master(config), - '_Session', - { sessionToken }, - { limit: 1 } - ).execute(); - session = results[0]; - } - const lastUpdated = new Date(session?.updatedAt); - const yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - if (lastUpdated > yesterday || !session) { - return; - } - const expiresAt = config.generateSessionExpiresAt(); - await new RestWrite( - config, - master(config), - '_Session', - { objectId: session.objectId }, - { expiresAt: Parse._encode(expiresAt) } - ).execute(); - } catch (e) { - if (e?.code !== Parse.Error.OBJECT_NOT_FOUND) { - logger.error('Could not update session expiry: ', e); - } + if (throttle[sessionToken]) { + return; + } + throttle[sessionToken] = true; + setTimeout(() => { + delete throttle[sessionToken]; + }, 5000); + try { + const lastUpdated = new Date(session?.updatedAt); + const yesterday = new Date(); + yesterday.setDate(yesterday.getDate() - 1); + if (lastUpdated > yesterday || !session) { + return; } - }, 500); + const expiresAt = config.generateSessionExpiresAt(); + await new RestWrite( + config, + master(config), + '_Session', + { objectId: session.objectId }, + { expiresAt: Parse._encode(expiresAt) } + ).execute(); + } catch (e) { + if (e?.code !== Parse.Error.OBJECT_NOT_FOUND) { + logger.error('Could not update session expiry: ', e); + } + } }; // Returns a promise that resolves to an Auth object @@ -120,7 +113,6 @@ const getAuthForSessionToken = async function ({ const userJSON = await cacheController.user.get(sessionToken); if (userJSON) { const cachedUser = Parse.Object.fromJSON(userJSON); - renewSessionIfNeeded({ config, sessionToken }); return Promise.resolve( new Auth({ config, From 89f28c737a89b1ff07ce3b53fd11f054eff9cca7 Mon Sep 17 00:00:00 2001 From: dblythy Date: Thu, 6 Jul 2023 20:51:07 +1000 Subject: [PATCH 2/7] wip --- spec/Auth.spec.js | 2 ++ src/Auth.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/Auth.spec.js b/spec/Auth.spec.js index 26421487df..1a4ac8e4b7 100644 --- a/spec/Auth.spec.js +++ b/spec/Auth.spec.js @@ -117,6 +117,8 @@ describe('Auth', () => { updatedAt: updatedAt.toISOString(), } ); + Parse.Server.cacheController.clear(); + await new Promise(resolve => setTimeout(resolve, 1000)); await session.fetch(); await new Promise(resolve => setTimeout(resolve, 1000)); await session.fetch(); diff --git a/src/Auth.js b/src/Auth.js index ede2e481d9..dd88fa4bed 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -78,7 +78,7 @@ const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { throttle[sessionToken] = true; setTimeout(() => { delete throttle[sessionToken]; - }, 5000); + }, 500); try { const lastUpdated = new Date(session?.updatedAt); const yesterday = new Date(); From f6b21137b38f6488b548ff060470a9a195ef4db6 Mon Sep 17 00:00:00 2001 From: dblythy Date: Thu, 6 Jul 2023 22:56:55 +1000 Subject: [PATCH 3/7] Update Auth.js --- src/Auth.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Auth.js b/src/Auth.js index dd88fa4bed..b90073e9e3 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -3,6 +3,7 @@ import { isDeepStrictEqual } from 'util'; import { getRequestObject, resolveError } from './triggers'; import Deprecator from './Deprecator/Deprecator'; import { logger } from './logger'; +import { LRUCache as LRU } from 'lru-cache'; import RestWrite from './RestWrite'; // An Auth object tells you who is requesting something and whether @@ -67,18 +68,18 @@ function nobody(config) { return new Auth({ config, isMaster: false }); } -const throttle = {}; +const throttle = new LRU({ + max: 10000, + ttl: 500, +}); const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { if (!config?.extendSessionOnUse) { return; } - if (throttle[sessionToken]) { + if (throttle.get(sessionToken)) { return; } - throttle[sessionToken] = true; - setTimeout(() => { - delete throttle[sessionToken]; - }, 500); + throttle.set(sessionToken, true); try { const lastUpdated = new Date(session?.updatedAt); const yesterday = new Date(); From 24df469f6a69b1fb2dff4677ccd549cf36abfcd9 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 13 Jan 2025 21:22:36 +1100 Subject: [PATCH 4/7] Update Auth.js --- src/Auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Auth.js b/src/Auth.js index 9e358f6d7a..795475b8e3 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -97,7 +97,7 @@ const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { if (lastUpdated > yesterday || !session) { return; } - + const expiresAt = config.generateSessionExpiresAt(); await new RestWrite( config, From 7c77d64719ba102b432d3f3df0af707245a11756 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 29 Jan 2025 19:09:57 +1100 Subject: [PATCH 5/7] Update Auth.js --- src/Auth.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Auth.js b/src/Auth.js index 795475b8e3..7296dbd760 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -91,13 +91,23 @@ const renewSessionIfNeeded = async ({ config, session, sessionToken }) => { } throttle.set(sessionToken, true); try { - const lastUpdated = new Date(session?.updatedAt); - const yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - if (lastUpdated > yesterday || !session) { - return; + if (!session) { + const query = await RestQuery({ + method: RestQuery.Method.get, + config, + auth: master(config), + runBeforeFind: false, + className: '_Session', + restWhere: { sessionToken }, + restOptions: { limit: 1 }, + }); + const { results } = await query.execute(); + session = results[0]; } + if (!shouldUpdateSessionExpiry(config, session) || !session) { + return; + } const expiresAt = config.generateSessionExpiresAt(); await new RestWrite( config, From 70783d1b81e354ce0a2b8b0fde019545d9f2dce2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 29 Jan 2025 19:12:01 +1100 Subject: [PATCH 6/7] Update Auth.js --- src/Auth.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Auth.js b/src/Auth.js index 7296dbd760..47b06255cd 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -3,6 +3,7 @@ import { isDeepStrictEqual } from 'util'; import { getRequestObject, resolveError } from './triggers'; import { logger } from './logger'; import { LRUCache as LRU } from 'lru-cache'; +import RestQuery from './RestQuery'; import RestWrite from './RestWrite'; // An Auth object tells you who is requesting something and whether From 2aeaf9a741728fb3d6db69cb6003caeacee6ce28 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 29 Jan 2025 19:19:00 +1100 Subject: [PATCH 7/7] Update Auth.js --- src/Auth.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Auth.js b/src/Auth.js index 47b06255cd..d872b1fa62 100644 --- a/src/Auth.js +++ b/src/Auth.js @@ -136,6 +136,7 @@ const getAuthForSessionToken = async function ({ const userJSON = await cacheController.user.get(sessionToken); if (userJSON) { const cachedUser = Parse.Object.fromJSON(userJSON); + renewSessionIfNeeded({ config, sessionToken }); return Promise.resolve( new Auth({ config,