@thermopylae/lib.cache
Version:
108 lines (107 loc) • 3.02 kB
JavaScript
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 };