66 lines
1.5 KiB
JavaScript
66 lines
1.5 KiB
JavaScript
import Parse from 'parse/node';
|
|
import LRU from 'lru-cache';
|
|
import logger from '../logger';
|
|
|
|
function userForSessionToken(sessionToken) {
|
|
var q = new Parse.Query('_Session');
|
|
q.equalTo('sessionToken', sessionToken);
|
|
return q.first({ useMasterKey: true }).then(function(session) {
|
|
if (!session) {
|
|
return Promise.reject('No session found for session token');
|
|
}
|
|
return session.get('user');
|
|
});
|
|
}
|
|
|
|
class SessionTokenCache {
|
|
cache: Object;
|
|
|
|
constructor(
|
|
timeout: number = 30 * 24 * 60 * 60 * 1000,
|
|
maxSize: number = 10000
|
|
) {
|
|
this.cache = new LRU({
|
|
max: maxSize,
|
|
maxAge: timeout,
|
|
});
|
|
}
|
|
|
|
getUserId(sessionToken: string): any {
|
|
if (!sessionToken) {
|
|
return Promise.reject('Empty sessionToken');
|
|
}
|
|
const userId = this.cache.get(sessionToken);
|
|
if (userId) {
|
|
logger.verbose(
|
|
'Fetch userId %s of sessionToken %s from Cache',
|
|
userId,
|
|
sessionToken
|
|
);
|
|
return Promise.resolve(userId);
|
|
}
|
|
return userForSessionToken(sessionToken).then(
|
|
user => {
|
|
logger.verbose(
|
|
'Fetch userId %s of sessionToken %s from Parse',
|
|
user.id,
|
|
sessionToken
|
|
);
|
|
const userId = user.id;
|
|
this.cache.set(sessionToken, userId);
|
|
return Promise.resolve(userId);
|
|
},
|
|
error => {
|
|
logger.error(
|
|
'Can not fetch userId for sessionToken %j, error %j',
|
|
sessionToken,
|
|
error
|
|
);
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
export { SessionTokenCache };
|