@bitblit/ratchet-aws
Version:
Common tools for use with AWS browser and node
65 lines • 2.37 kB
JavaScript
import { Logger } from '@bitblit/ratchet-common/logger/logger';
export class SimpleCache {
provider;
defaultTimeToLiveMS;
constructor(provider, defaultTimeToLiveMS = 1_000 * 60) {
this.provider = provider;
this.defaultTimeToLiveMS = defaultTimeToLiveMS;
}
createDefaultReadOptions() {
return {
maxStalenessMS: null,
timeToLiveMS: this.defaultTimeToLiveMS,
cacheNullValues: false,
};
}
async fetchWrapper(cacheKey, producer, opts = this.createDefaultReadOptions()) {
Logger.silly('Fetching %s', cacheKey);
const now = new Date().getTime();
let rval = await this.provider.readFromCache(cacheKey);
if (rval && rval.expiresEpochMS < now) {
Logger.debug('Object found, but expired - removing');
rval = null;
}
if (rval && opts && opts.maxStalenessMS && now - rval.createdEpochMS > opts.maxStalenessMS) {
Logger.debug('Object found by too stale - removing');
rval = null;
}
if (!rval) {
Logger.debug('%s not found in cache, generating', cacheKey);
const tmp = await producer();
if (tmp || opts?.cacheNullValues) {
Logger.debug('Writing %j to cache');
rval = {
cacheKey: cacheKey,
createdEpochMS: now,
expiresEpochMS: opts && opts.timeToLiveMS ? now + opts.timeToLiveMS : null,
value: tmp,
generated: false,
};
await this.provider.storeInCache(rval);
rval.generated = true;
}
}
return rval;
}
async fetch(cacheKey, producer, opts = null) {
const wrapper = await this.fetchWrapper(cacheKey, producer, opts);
return wrapper ? wrapper.value : null;
}
async removeFromCache(cacheKey, returnOldValue) {
let rval = null;
if (returnOldValue) {
rval = await this.fetchWrapper(cacheKey, () => null);
}
await this.provider.removeFromCache(cacheKey);
return rval;
}
async clearCache() {
return this.provider.clearCache();
}
async readAll() {
return this.provider.readAll();
}
}
//# sourceMappingURL=simple-cache.js.map