X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Foauth-model.ts;h=086856f41e3a0fc64469f450e6b8044f8a694ba2;hb=598edb8af1cc7e5ea3ead1ec9c96c4853b90be36;hp=eb0e63bc84def749e2ad7b33841765298e17d74e;hpb=6dd9de95dfa39bd5c1faed00d1dbd52cd112bae0;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/oauth-model.ts b/server/lib/oauth-model.ts index eb0e63bc8..086856f41 100644 --- a/server/lib/oauth-model.ts +++ b/server/lib/oauth-model.ts @@ -4,13 +4,16 @@ import { logger } from '../helpers/logger' import { UserModel } from '../models/account/user' import { OAuthClientModel } from '../models/oauth/oauth-client' import { OAuthTokenModel } from '../models/oauth/oauth-token' -import { CACHE } from '../initializers/constants' +import { LRU_CACHE } from '../initializers/constants' import { Transaction } from 'sequelize' import { CONFIG } from '../initializers/config' +import * as LRUCache from 'lru-cache' +import { MOAuthTokenUser } from '@server/typings/models/oauth/oauth-token' type TokenInfo = { accessToken: string, refreshToken: string, accessTokenExpiresAt: Date, refreshTokenExpiresAt: Date } -let accessTokenCache: { [ accessToken: string ]: OAuthTokenModel } = {} -let userHavingToken: { [ userId: number ]: string } = {} + +const accessTokenCache = new LRUCache({ max: LRU_CACHE.USER_TOKENS.MAX_SIZE }) +const userHavingToken = new LRUCache({ max: LRU_CACHE.USER_TOKENS.MAX_SIZE }) // --------------------------------------------------------------------------- @@ -21,37 +24,35 @@ function deleteUserToken (userId: number, t?: Transaction) { } function clearCacheByUserId (userId: number) { - const token = userHavingToken[userId] + const token = userHavingToken.get(userId) + if (token !== undefined) { - accessTokenCache[ token ] = undefined - userHavingToken[ userId ] = undefined + accessTokenCache.del(token) + userHavingToken.del(userId) } } function clearCacheByToken (token: string) { - const tokenModel = accessTokenCache[ token ] + const tokenModel = accessTokenCache.get(token) + if (tokenModel !== undefined) { - userHavingToken[tokenModel.userId] = undefined - accessTokenCache[ token ] = undefined + userHavingToken.del(tokenModel.userId) + accessTokenCache.del(token) } } function getAccessToken (bearerToken: string) { logger.debug('Getting access token (bearerToken: ' + bearerToken + ').') - if (accessTokenCache[bearerToken] !== undefined) return Bluebird.resolve(accessTokenCache[bearerToken]) + if (!bearerToken) return Bluebird.resolve(undefined) + + if (accessTokenCache.has(bearerToken)) return Bluebird.resolve(accessTokenCache.get(bearerToken)) return OAuthTokenModel.getByTokenAndPopulateUser(bearerToken) .then(tokenModel => { if (tokenModel) { - // Reinit our cache - if (Object.keys(accessTokenCache).length > CACHE.USER_TOKENS.MAX_SIZE) { - accessTokenCache = {} - userHavingToken = {} - } - - accessTokenCache[ bearerToken ] = tokenModel - userHavingToken[ tokenModel.userId ] = tokenModel.accessToken + accessTokenCache.set(bearerToken, tokenModel) + userHavingToken.set(tokenModel.userId, tokenModel.accessToken) } return tokenModel