@@ -3,6 +3,8 @@ import { isDeepStrictEqual } from 'util';
33import { getRequestObject , resolveError } from './triggers' ;
44import Deprecator from './Deprecator/Deprecator' ;
55import { logger } from './logger' ;
6+ import RestQuery from './RestQuery' ;
7+ import RestWrite from './RestWrite' ;
68
79// An Auth object tells you who is requesting something and whether
810// the master key was used.
@@ -66,6 +68,47 @@ function nobody(config) {
6668 return new Auth ( { config, isMaster : false } ) ;
6769}
6870
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+
69112// Returns a promise that resolves to an Auth object
70113const getAuthForSessionToken = async function ( {
71114 config,
@@ -78,6 +121,7 @@ const getAuthForSessionToken = async function ({
78121 const userJSON = await cacheController . user . get ( sessionToken ) ;
79122 if ( userJSON ) {
80123 const cachedUser = Parse . Object . fromJSON ( userJSON ) ;
124+ renewSessionIfNeeded ( { config, sessionToken } ) ;
81125 return Promise . resolve (
82126 new Auth ( {
83127 config,
@@ -112,18 +156,20 @@ const getAuthForSessionToken = async function ({
112156 if ( results . length !== 1 || ! results [ 0 ] [ 'user' ] ) {
113157 throw new Parse . Error ( Parse . Error . INVALID_SESSION_TOKEN , 'Invalid session token' ) ;
114158 }
159+ const session = results [ 0 ] ;
115160 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 ;
117162 if ( expiresAt < now ) {
118163 throw new Parse . Error ( Parse . Error . INVALID_SESSION_TOKEN , 'Session token is expired.' ) ;
119164 }
120- const obj = results [ 0 ] [ ' user' ] ;
165+ const obj = session . user ;
121166 delete obj . password ;
122167 obj [ 'className' ] = '_User' ;
123168 obj [ 'sessionToken' ] = sessionToken ;
124169 if ( cacheController ) {
125170 cacheController . user . put ( sessionToken , obj ) ;
126171 }
172+ renewSessionIfNeeded ( { config, session, sessionToken } ) ;
127173 const userObject = Parse . Object . fromJSON ( obj ) ;
128174 return new Auth ( {
129175 config,
0 commit comments