UNPKG

@thermopylae/lib.cache

Version:
108 lines (107 loc) 3.02 kB
class RenewableCache { options; constructor(options) { if (options.keyConfigProvider == null) { options.keyConfigProvider = RenewableCache.defaultKeyConfigProvider; } this.options = options; } get size() { return this.options.cache.size; } get(key, argsBundle) { let promiseHolder; try { promiseHolder = this.options.cache.get(key); if (promiseHolder) { return promiseHolder.promise; } if (argsBundle == null) { argsBundle = this.options.keyConfigProvider(key); } } catch (e) { return Promise.reject(e); } try { promiseHolder = RenewableCache.buildPromiseHolder(); } catch (e) { return Promise.reject(e); } try { this.options.cache.set(key, promiseHolder, argsBundle); } catch (e) { promiseHolder.reject(e); return promiseHolder.promise; } return this.options .keyRetriever(key) .then((result) => { let value; [value, argsBundle] = result; if (value === undefined) { this.options.cache.del(key); } else if (argsBundle != null) { this.options.cache.set(key, promiseHolder, argsBundle); } promiseHolder.resolve(value); return promiseHolder.promise; }) .catch((e) => { try { this.options.cache.del(key); } catch { } promiseHolder.reject(e); return promiseHolder.promise; }); } has(key) { return this.options.cache.has(key); } set(key, value, argsBundle) { const promiseHolder = RenewableCache.buildPromiseHolder(); promiseHolder.resolve(value); if (argsBundle == null) { argsBundle = this.options.keyConfigProvider(key); } this.options.cache.set(key, promiseHolder, argsBundle); } del(key) { return this.options.cache.del(key); } clear() { this.options.cache.clear(); } keys() { return this.options.cache.keys(); } on(event, listener) { this.options.cache.on(event, listener); return this; } off(event, listener) { this.options.cache.off(event, listener); return this; } static buildPromiseHolder() { const promiseHolder = { promise: null, reject: null, resolve: null }; promiseHolder.promise = new Promise((resolve, reject) => { promiseHolder.resolve = resolve; promiseHolder.reject = reject; }); return promiseHolder; } static defaultKeyConfigProvider() { return undefined; } } export { RenewableCache };