diff options
Diffstat (limited to 'node_modules/ylru/index.js')
| -rw-r--r-- | node_modules/ylru/index.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/node_modules/ylru/index.js b/node_modules/ylru/index.js new file mode 100644 index 00000000..1dd4b330 --- /dev/null +++ b/node_modules/ylru/index.js @@ -0,0 +1,106 @@ +'use strict'; + +class LRU { + constructor(max) { + this.max = max; + this.size = 0; + this.cache = new Map(); + this._cache = new Map(); + } + + get(key, options) { + let item = this.cache.get(key); + const maxAge = options && options.maxAge; + // only call Date.now() when necessary + let now; + function getNow() { + now = now || Date.now(); + return now; + } + if (item) { + // check expired + if (item.expired && getNow() > item.expired) { + item.expired = 0; + item.value = undefined; + } else { + // update expired in get + if (maxAge !== undefined) { + const expired = maxAge ? getNow() + maxAge : 0; + item.expired = expired; + } + } + return item.value; + } + + // try to read from _cache + item = this._cache.get(key); + if (item) { + // check expired + if (item.expired && getNow() > item.expired) { + item.expired = 0; + item.value = undefined; + } else { + // not expired, save to cache + this._update(key, item); + // update expired in get + if (maxAge !== undefined) { + const expired = maxAge ? getNow() + maxAge : 0; + item.expired = expired; + } + } + return item.value; + } + } + + set(key, value, options) { + const maxAge = options && options.maxAge; + const expired = maxAge ? Date.now() + maxAge : 0; + let item = this.cache.get(key); + if (item) { + item.expired = expired; + item.value = value; + } else { + item = { + value, + expired, + }; + this._update(key, item); + } + } + + keys() { + const cacheKeys = new Set(); + const now = Date.now(); + + for (const entry of this.cache.entries()) { + checkEntry(entry); + } + + for (const entry of this._cache.entries()) { + checkEntry(entry); + } + + function checkEntry(entry) { + const key = entry[0]; + const item = entry[1]; + if (entry[1].value && (!entry[1].expired) || item.expired >= now) { + cacheKeys.add(key); + } + } + + return Array.from(cacheKeys.keys()); + } + + _update(key, item) { + this.cache.set(key, item); + this.size++; + if (this.size >= this.max) { + this.size = 0; + this._cache = this.cache; + this.cache = new Map(); + } + } +} + +module.exports = LRU; + |
