aboutsummaryrefslogtreecommitdiff
path: root/node_modules/ylru/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/ylru/index.js')
-rw-r--r--node_modules/ylru/index.js106
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;
+