UNPKG

@bitblit/ratchet-aws

Version:

Common tools for use with AWS browser and node

65 lines 2.37 kB
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