From cf069671f44a4b03d6d5d34f17160b2253f29654 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Jun 2023 15:42:29 +0200 Subject: Use promise cache to load remote thumbnails --- server/helpers/promise-cache.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'server/helpers/promise-cache.ts') diff --git a/server/helpers/promise-cache.ts b/server/helpers/promise-cache.ts index 07e8a9962..303bab976 100644 --- a/server/helpers/promise-cache.ts +++ b/server/helpers/promise-cache.ts @@ -1,4 +1,4 @@ -export class PromiseCache { +export class CachePromiseFactory { private readonly running = new Map>() constructor ( @@ -8,14 +8,32 @@ export class PromiseCache { } run (arg: A) { + return this.runWithContext(null, arg) + } + + runWithContext (ctx: any, arg: A) { const key = this.keyBuilder(arg) if (this.running.has(key)) return this.running.get(key) - const p = this.fn(arg) + const p = this.fn.apply(ctx || this, [ arg ]) this.running.set(key, p) return p.finally(() => this.running.delete(key)) } } + +export function CachePromise (options: { + keyBuilder: (...args: any[]) => string +}) { + return function (_target, _key, descriptor: PropertyDescriptor) { + const promiseCache = new CachePromiseFactory(descriptor.value, options.keyBuilder) + + descriptor.value = function () { + if (arguments.length !== 1) throw new Error('Cache promise only support methods with 1 argument') + + return promiseCache.runWithContext(this, arguments[0]) + } + } +} -- cgit v1.2.3