UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

63 lines (51 loc) 2.14 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; /** * Simple cache that caches exactly one item. */ export class SimpleCache { /** * @param initialValue The initial value, if undefined then the first get() call when initiate the cache value * * @param supplier The callback that will be called if the cache times out or if no existing value exists for the cache. * In the case that the supplier throws an exception the error will not be cached. If there's an error * we will instead return the last known good value but will attempt to refresh the cache again the next time * get() is called. * Any parameters passed into get() will be passed through to supplier. Unlike memoize the cache does not * care about the parameters and will not be invalidated if these parameters change. * * @param timeoutMs The time to wait before allowing the cache to refresh, this defaults to 15 mins. */ constructor(initialValue, supplier, timeoutMs = SimpleCache.DEFAULT_TIMEOUT_IN_MS) { _defineProperty(this, "nextCacheRefreshTime", Date.now()); this.timeoutMs = timeoutMs; this.supplier = supplier; if (initialValue) { this.currentValue = initialValue; this.updateNextRefreshTime(); } } get(...args) { if (this.currentValue && Date.now() < this.nextCacheRefreshTime) { return this.currentValue; } this.updateNextRefreshTime(); try { const result = this.supplier(...args); this.currentValue = result; } catch (e) { // If there's an error we will return the last good value but will attempt again on the next get() this.invalidate(); } if (!this.currentValue) { throw new Error('Failed to initialise a value for the cache'); } return this.currentValue; } invalidate() { this.nextCacheRefreshTime = Date.now(); } updateNextRefreshTime() { this.nextCacheRefreshTime = Date.now() + this.timeoutMs; } } _defineProperty(SimpleCache, "DEFAULT_TIMEOUT_IN_MS", 15 * 60 * 1000);