From 0ffd6d32c13b3b59f96a212ebfd324ba06cbdf1f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Feb 2020 11:26:51 +0100 Subject: Use a singleton for model cache --- server/models/model-cache.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 server/models/model-cache.ts (limited to 'server/models/model-cache.ts') diff --git a/server/models/model-cache.ts b/server/models/model-cache.ts new file mode 100644 index 000000000..bfa163b6b --- /dev/null +++ b/server/models/model-cache.ts @@ -0,0 +1,54 @@ +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' + +class ModelCache { + + private static instance: ModelCache + + private readonly localCache: { [id in ModelCacheType]: Map } = { + 'local-account-name': new Map(), + 'local-actor-name': new Map(), + 'local-actor-url': new Map() + } + + private constructor () { + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } + + doCache (options: { + cacheType: ModelCacheType + key: string + fun: () => Bluebird + whitelist?: () => boolean + }) { + const { cacheType, key, fun, whitelist } = options + + if (whitelist && whitelist() !== true) return fun() + + const cache = this.localCache[cacheType] + + if (cache.has(key)) { + logger.debug('Model cache hit for %s -> %s.', cacheType, key) + return Bluebird.resolve(cache.get(key)) + } + + return fun().then(m => { + if (!whitelist || whitelist()) cache.set(key, m) + + return m + }) + } +} + +export { + ModelCache +} -- cgit v1.2.3