2016-03-10 14:27:00 -08:00
|
|
|
import Parse from 'parse/node';
|
|
|
|
|
import LRU from 'lru-cache';
|
2016-08-12 13:25:24 -04:00
|
|
|
import logger from '../logger';
|
2016-03-10 14:27:00 -08:00
|
|
|
|
2017-02-18 16:36:20 -08:00
|
|
|
function userForSessionToken(sessionToken){
|
|
|
|
|
var q = new Parse.Query("_Session");
|
|
|
|
|
q.equalTo("sessionToken", sessionToken);
|
|
|
|
|
return q.first({useMasterKey:true}).then(function(session){
|
|
|
|
|
if(!session){
|
2018-08-05 13:58:07 -04:00
|
|
|
return Promise.reject("No session found for session token");
|
2017-02-18 16:36:20 -08:00
|
|
|
}
|
|
|
|
|
return session.get("user");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-10 14:27:00 -08:00
|
|
|
class SessionTokenCache {
|
|
|
|
|
cache: Object;
|
|
|
|
|
|
2017-01-11 12:31:40 -08:00
|
|
|
constructor(timeout: number = 30 * 24 * 60 * 60 * 1000, maxSize: number = 10000) {
|
2016-03-10 14:27:00 -08:00
|
|
|
this.cache = new LRU({
|
|
|
|
|
max: maxSize,
|
|
|
|
|
maxAge: timeout
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getUserId(sessionToken: string): any {
|
|
|
|
|
if (!sessionToken) {
|
2018-08-05 13:58:07 -04:00
|
|
|
return Promise.reject('Empty sessionToken');
|
2016-03-10 14:27:00 -08:00
|
|
|
}
|
2016-12-07 15:17:05 -08:00
|
|
|
const userId = this.cache.get(sessionToken);
|
2016-03-10 14:27:00 -08:00
|
|
|
if (userId) {
|
2016-08-12 13:25:24 -04:00
|
|
|
logger.verbose('Fetch userId %s of sessionToken %s from Cache', userId, sessionToken);
|
2018-08-05 13:58:07 -04:00
|
|
|
return Promise.resolve(userId);
|
2016-03-10 14:27:00 -08:00
|
|
|
}
|
2017-02-18 16:36:20 -08:00
|
|
|
return userForSessionToken(sessionToken).then((user) => {
|
2016-08-12 13:25:24 -04:00
|
|
|
logger.verbose('Fetch userId %s of sessionToken %s from Parse', user.id, sessionToken);
|
2016-12-07 15:17:05 -08:00
|
|
|
const userId = user.id;
|
2016-03-10 14:27:00 -08:00
|
|
|
this.cache.set(sessionToken, userId);
|
2018-08-05 13:58:07 -04:00
|
|
|
return Promise.resolve(userId);
|
2016-03-10 14:27:00 -08:00
|
|
|
}, (error) => {
|
2016-08-12 13:25:24 -04:00
|
|
|
logger.error('Can not fetch userId for sessionToken %j, error %j', sessionToken, error);
|
2018-08-05 13:58:07 -04:00
|
|
|
return Promise.reject(error);
|
2016-03-10 14:27:00 -08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export {
|
|
|
|
|
SessionTokenCache
|
|
|
|
|
}
|