@@ -3,6 +3,8 @@ import { isDeepStrictEqual } from 'util';
3
3
import { getRequestObject , resolveError } from './triggers' ;
4
4
import Deprecator from './Deprecator/Deprecator' ;
5
5
import { logger } from './logger' ;
6
+ import RestQuery from './RestQuery' ;
7
+ import RestWrite from './RestWrite' ;
6
8
7
9
// An Auth object tells you who is requesting something and whether
8
10
// the master key was used.
@@ -66,6 +68,47 @@ function nobody(config) {
66
68
return new Auth ( { config, isMaster : false } ) ;
67
69
}
68
70
71
+ const throttle = { } ;
72
+ const renewSessionIfNeeded = async ( { config, session, sessionToken } ) => {
73
+ if ( ! config ?. extendSessionOnUse ) {
74
+ return ;
75
+ }
76
+ clearTimeout ( throttle [ sessionToken ] ) ;
77
+ throttle [ sessionToken ] = setTimeout ( async ( ) => {
78
+ try {
79
+ if ( ! session ) {
80
+ const { results } = await new RestQuery (
81
+ config ,
82
+ master ( config ) ,
83
+ '_Session' ,
84
+ { sessionToken } ,
85
+ { limit : 1 }
86
+ ) . execute ( ) ;
87
+ console . log ( { results } ) ;
88
+ session = results [ 0 ] ;
89
+ }
90
+ const lastUpdated = new Date ( session ?. updatedAt ) ;
91
+ const yesterday = new Date ( ) ;
92
+ yesterday . setDate ( yesterday . getDate ( ) - 1 ) ;
93
+ if ( lastUpdated > yesterday || ! session ) {
94
+ return ;
95
+ }
96
+ const expiresAt = config . generateSessionExpiresAt ( ) ;
97
+ await new RestWrite (
98
+ config ,
99
+ master ( config ) ,
100
+ '_Session' ,
101
+ { objectId : session . objectId } ,
102
+ { expiresAt : Parse . _encode ( expiresAt ) }
103
+ ) . execute ( ) ;
104
+ } catch ( e ) {
105
+ if ( e ?. code !== Parse . Error . OBJECT_NOT_FOUND ) {
106
+ logger . error ( 'Could not update session expiry: ' , e ) ;
107
+ }
108
+ }
109
+ } , 500 ) ;
110
+ } ;
111
+
69
112
// Returns a promise that resolves to an Auth object
70
113
const getAuthForSessionToken = async function ( {
71
114
config,
@@ -78,6 +121,7 @@ const getAuthForSessionToken = async function ({
78
121
const userJSON = await cacheController . user . get ( sessionToken ) ;
79
122
if ( userJSON ) {
80
123
const cachedUser = Parse . Object . fromJSON ( userJSON ) ;
124
+ renewSessionIfNeeded ( { config, sessionToken } ) ;
81
125
return Promise . resolve (
82
126
new Auth ( {
83
127
config,
@@ -112,18 +156,20 @@ const getAuthForSessionToken = async function ({
112
156
if ( results . length !== 1 || ! results [ 0 ] [ 'user' ] ) {
113
157
throw new Parse . Error ( Parse . Error . INVALID_SESSION_TOKEN , 'Invalid session token' ) ;
114
158
}
159
+ const session = results [ 0 ] ;
115
160
const now = new Date ( ) ,
116
- expiresAt = results [ 0 ] . expiresAt ? new Date ( results [ 0 ] . expiresAt . iso ) : undefined ;
161
+ expiresAt = session . expiresAt ? new Date ( session . expiresAt . iso ) : undefined ;
117
162
if ( expiresAt < now ) {
118
163
throw new Parse . Error ( Parse . Error . INVALID_SESSION_TOKEN , 'Session token is expired.' ) ;
119
164
}
120
- const obj = results [ 0 ] [ ' user' ] ;
165
+ const obj = session . user ;
121
166
delete obj . password ;
122
167
obj [ 'className' ] = '_User' ;
123
168
obj [ 'sessionToken' ] = sessionToken ;
124
169
if ( cacheController ) {
125
170
cacheController . user . put ( sessionToken , obj ) ;
126
171
}
172
+ renewSessionIfNeeded ( { config, session, sessionToken } ) ;
127
173
const userObject = Parse . Object . fromJSON ( obj ) ;
128
174
return new Auth ( {
129
175
config,
0 commit comments