@@ -2,6 +2,7 @@ const Parse = require('parse/node');
2
2
import { isDeepStrictEqual } from 'util' ;
3
3
import { getRequestObject , resolveError } from './triggers' ;
4
4
import { logger } from './logger' ;
5
+ import { LRUCache as LRU } from 'lru-cache' ;
5
6
import RestQuery from './RestQuery' ;
6
7
import RestWrite from './RestWrite' ;
7
8
@@ -67,6 +68,10 @@ function nobody(config) {
67
68
return new Auth ( { config, isMaster : false } ) ;
68
69
}
69
70
71
+ const throttle = new LRU ( {
72
+ max : 10000 ,
73
+ ttl : 500 ,
74
+ } ) ;
70
75
/**
71
76
* Checks whether session should be updated based on last update time & session length.
72
77
*/
@@ -78,44 +83,45 @@ function shouldUpdateSessionExpiry(config, session) {
78
83
return lastUpdated <= skipRange ;
79
84
}
80
85
81
- const throttle = { } ;
82
86
const renewSessionIfNeeded = async ( { config, session, sessionToken } ) => {
83
87
if ( ! config ?. extendSessionOnUse ) {
84
88
return ;
85
89
}
86
- clearTimeout ( throttle [ sessionToken ] ) ;
87
- throttle [ sessionToken ] = setTimeout ( async ( ) => {
88
- try {
89
- if ( ! session ) {
90
- const query = await RestQuery ( {
91
- method : RestQuery . Method . get ,
92
- config,
93
- auth : master ( config ) ,
94
- runBeforeFind : false ,
95
- className : '_Session' ,
96
- restWhere : { sessionToken } ,
97
- restOptions : { limit : 1 } ,
98
- } ) ;
99
- const { results } = await query . execute ( ) ;
100
- session = results [ 0 ] ;
101
- }
102
- if ( ! shouldUpdateSessionExpiry ( config , session ) || ! session ) {
103
- return ;
104
- }
105
- const expiresAt = config . generateSessionExpiresAt ( ) ;
106
- await new RestWrite (
90
+ if ( throttle . get ( sessionToken ) ) {
91
+ return ;
92
+ }
93
+ throttle . set ( sessionToken , true ) ;
94
+ try {
95
+ if ( ! session ) {
96
+ const query = await RestQuery ( {
97
+ method : RestQuery . Method . get ,
107
98
config,
108
- master ( config ) ,
109
- '_Session' ,
110
- { objectId : session . objectId } ,
111
- { expiresAt : Parse . _encode ( expiresAt ) }
112
- ) . execute ( ) ;
113
- } catch ( e ) {
114
- if ( e ?. code !== Parse . Error . OBJECT_NOT_FOUND ) {
115
- logger . error ( 'Could not update session expiry: ' , e ) ;
116
- }
99
+ auth : master ( config ) ,
100
+ runBeforeFind : false ,
101
+ className : '_Session' ,
102
+ restWhere : { sessionToken } ,
103
+ restOptions : { limit : 1 } ,
104
+ } ) ;
105
+ const { results } = await query . execute ( ) ;
106
+ session = results [ 0 ] ;
107
+ }
108
+
109
+ if ( ! shouldUpdateSessionExpiry ( config , session ) || ! session ) {
110
+ return ;
117
111
}
118
- } , 500 ) ;
112
+ const expiresAt = config . generateSessionExpiresAt ( ) ;
113
+ await new RestWrite (
114
+ config ,
115
+ master ( config ) ,
116
+ '_Session' ,
117
+ { objectId : session . objectId } ,
118
+ { expiresAt : Parse . _encode ( expiresAt ) }
119
+ ) . execute ( ) ;
120
+ } catch ( e ) {
121
+ if ( e ?. code !== Parse . Error . OBJECT_NOT_FOUND ) {
122
+ logger . error ( 'Could not update session expiry: ' , e ) ;
123
+ }
124
+ }
119
125
} ;
120
126
121
127
// Returns a promise that resolves to an Auth object
0 commit comments