X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fmodel-cache.ts;h=3651267e7c5c10028c0dcb62eec8505ed9f27aa5;hb=a94b02e11ac730cd7512ea47c4b7d1320d842baa;hp=bfa163b6b5a3438086b58a1f23231fbe996b3876;hpb=0ffd6d32c13b3b59f96a212ebfd324ba06cbdf1f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/model-cache.ts b/server/models/model-cache.ts index bfa163b6b..3651267e7 100644 --- a/server/models/model-cache.ts +++ b/server/models/model-cache.ts @@ -1,11 +1,15 @@ import { Model } from 'sequelize-typescript' -import * as Bluebird from 'bluebird' import { logger } from '@server/helpers/logger' type ModelCacheType = 'local-account-name' | 'local-actor-name' | 'local-actor-url' + | 'load-video-immutable-id' + | 'load-video-immutable-url' + +type DeleteKey = + 'video' class ModelCache { @@ -14,7 +18,15 @@ class ModelCache { private readonly localCache: { [id in ModelCacheType]: Map } = { 'local-account-name': new Map(), 'local-actor-name': new Map(), - 'local-actor-url': new Map() + 'local-actor-url': new Map(), + 'load-video-immutable-id': new Map(), + 'load-video-immutable-url': new Map() + } + + private readonly deleteIds: { + [deleteKey in DeleteKey]: Map + } = { + video: new Map() } private constructor () { @@ -27,10 +39,11 @@ class ModelCache { doCache (options: { cacheType: ModelCacheType key: string - fun: () => Bluebird + fun: () => Promise whitelist?: () => boolean + deleteKey?: DeleteKey }) { - const { cacheType, key, fun, whitelist } = options + const { cacheType, key, fun, whitelist, deleteKey } = options if (whitelist && whitelist() !== true) return fun() @@ -38,15 +51,38 @@ class ModelCache { if (cache.has(key)) { logger.debug('Model cache hit for %s -> %s.', cacheType, key) - return Bluebird.resolve(cache.get(key)) + return Promise.resolve(cache.get(key)) } return fun().then(m => { + if (!m) return m + if (!whitelist || whitelist()) cache.set(key, m) + if (deleteKey) { + const map = this.deleteIds[deleteKey] + if (!map.has(m.id)) map.set(m.id, []) + + const a = map.get(m.id) + a.push({ cacheType, key }) + } + return m }) } + + invalidateCache (deleteKey: DeleteKey, modelId: number) { + const map = this.deleteIds[deleteKey] + + if (!map.has(modelId)) return + + for (const toDelete of map.get(modelId)) { + logger.debug('Removing %s -> %d of model cache %s -> %s.', deleteKey, modelId, toDelete.cacheType, toDelete.key) + this.localCache[toDelete.cacheType].delete(toDelete.key) + } + + map.delete(modelId) + } } export {