diff options
| author | Joel Kronqvist <joel.h.kronqvist@gmail.com> | 2022-03-05 19:02:27 +0200 | 
|---|---|---|
| committer | Joel Kronqvist <joel.h.kronqvist@gmail.com> | 2022-03-05 19:02:27 +0200 | 
| commit | 5d309ff52cd399a6b71968a6b9a70c8ac0b98981 (patch) | |
| tree | 360f7eb50f956e2367ef38fa1fc6ac7ac5258042 /node_modules/lru-cache | |
| parent | b500a50f1b97d93c98b36ed9a980f8188d648147 (diff) | |
| download | LYLLRuoka-5d309ff52cd399a6b71968a6b9a70c8ac0b98981.tar.gz LYLLRuoka-5d309ff52cd399a6b71968a6b9a70c8ac0b98981.zip  | |
Added node_modules for the updating to work properly.
Diffstat (limited to 'node_modules/lru-cache')
| -rw-r--r-- | node_modules/lru-cache/LICENSE | 15 | ||||
| -rw-r--r-- | node_modules/lru-cache/README.md | 166 | ||||
| -rw-r--r-- | node_modules/lru-cache/index.js | 334 | ||||
| -rw-r--r-- | node_modules/lru-cache/package.json | 34 | 
4 files changed, 549 insertions, 0 deletions
diff --git a/node_modules/lru-cache/LICENSE b/node_modules/lru-cache/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/lru-cache/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/lru-cache/README.md b/node_modules/lru-cache/README.md new file mode 100644 index 0000000..435dfeb --- /dev/null +++ b/node_modules/lru-cache/README.md @@ -0,0 +1,166 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +[](https://travis-ci.org/isaacs/node-lru-cache) [](https://coveralls.io/github/isaacs/node-lru-cache) + +## Installation: + +```javascript +npm install lru-cache --save +``` + +## Usage: + +```javascript +var LRU = require("lru-cache") +  , options = { max: 500 +              , length: function (n, key) { return n * 2 + key.length } +              , dispose: function (key, n) { n.close() } +              , maxAge: 1000 * 60 * 60 } +  , cache = new LRU(options) +  , otherCache = new LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +// non-string keys ARE fully supported +// but note that it must be THE SAME object, not +// just a JSON-equivalent object. +var someObject = { a: 1 } +cache.set(someObject, 'a value') +// Object keys are not toString()-ed +cache.set('[object Object]', 'a different value') +assert.equal(cache.get(someObject), 'a value') +// A similar object with same keys/values won't work, +// because it's a different object identity +assert.equal(cache.get({ a: 1 }), undefined) + +cache.reset()    // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length +  function to all values in the cache.  Not setting this is kind of +  silly, since that's the whole purpose of this lib, but it defaults +  to `Infinity`.  Setting it to a non-number or negative number will +  throw a `TypeError`.  Setting it to 0 makes it be `Infinity`. +* `maxAge` Maximum age in ms.  Items are not pro-actively pruned out +  as they age, but if you try to get an item that is too old, it'll +  drop it and return undefined instead of giving it to you. +  Setting this to a negative value will make everything seem old! +  Setting it to a non-number will throw a `TypeError`. +* `length` Function that is used to calculate the length of stored +  items.  If you're storing strings or buffers, then you probably want +  to do something like `function(n, key){return n.length}`.  The default is +  `function(){return 1}`, which is fine if you want to store `max` +  like-sized things.  The item is passed as the first argument, and +  the key is passed as the second argumnet. +* `dispose` Function that is called on items when they are dropped +  from the cache.  This can be handy if you want to close file +  descriptors or do other cleanup tasks when items are no longer +  accessible.  Called with `key, value`.  It's called *before* +  actually removing the item from the internal cache, so if you want +  to immediately put it back in, you'll have to do that in a +  `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull +  stale items out of the cache when you `get(key)`.  (That is, it's +  not pre-emptively doing a `setTimeout` or anything.)  If you set +  `stale:true`, it'll return the stale value before deleting it.  If +  you don't set this, then it'll return `undefined` when you try to +  get a stale entry, as if it had already been deleted. +* `noDisposeOnSet` By default, if you set a `dispose()` method, then +  it'll be called whenever a `set()` operation overwrites an existing +  key.  If you set this option, `dispose()` will only be called when a +  key falls out of the cache, not when it is overwritten. +* `updateAgeOnGet` When using time-expiring entries with `maxAge`, +  setting this to `true` will make each item's effective time update +  to the current time whenever it is retrieved from cache, causing it +  to not expire.  (It can still fall out of cache based on recency of +  use, of course.) + +## API + +* `set(key, value, maxAge)` +* `get(key) => value` + +    Both of these will update the "recently used"-ness of the key. +    They do what you think. `maxAge` is optional and overrides the +    cache `maxAge` option if provided. + +    If the key is not found, `get()` will return `undefined`. + +    The key and val can be any value. + +* `peek(key)` + +    Returns the key value (or `undefined` if not found) without +    updating the "recently used"-ness of the key. + +    (If you find yourself using this a lot, you *might* be using the +    wrong sort of data structure, but there are some use cases where +    it's handy.) + +* `del(key)` + +    Deletes a key out of the cache. + +* `reset()` + +    Clear the cache entirely, throwing away all values. + +* `has(key)` + +    Check if a key is in the cache, without updating the recent-ness +    or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + +    Just like `Array.prototype.forEach`.  Iterates over all the keys +    in the cache, in order of recent-ness.  (Ie, more recently used +    items are iterated over first.) + +* `rforEach(function(value,key,cache), [thisp])` + +    The same as `cache.forEach(...)` but items are iterated over in +    reverse order.  (ie, less recently used items are iterated over +    first.) + +* `keys()` + +    Return an array of the keys in the cache. + +* `values()` + +    Return an array of the values in the cache. + +* `length` + +    Return total length of objects in cache taking into account +    `length` options function. + +* `itemCount` + +    Return total quantity of objects currently in cache. Note, that +    `stale` (see options) items are returned as part of this item +    count. + +* `dump()` + +    Return an array of the cache entries ready for serialization and usage +    with 'destinationCache.load(arr)`. + +* `load(cacheEntriesArray)` + +    Loads another cache entries array, obtained with `sourceCache.dump()`, +    into the cache. The destination cache is reset before loading new entries + +* `prune()` + +    Manually iterates over the entire cache proactively pruning old entries diff --git a/node_modules/lru-cache/index.js b/node_modules/lru-cache/index.js new file mode 100644 index 0000000..573b6b8 --- /dev/null +++ b/node_modules/lru-cache/index.js @@ -0,0 +1,334 @@ +'use strict' + +// A linked list to keep track of recently-used-ness +const Yallist = require('yallist') + +const MAX = Symbol('max') +const LENGTH = Symbol('length') +const LENGTH_CALCULATOR = Symbol('lengthCalculator') +const ALLOW_STALE = Symbol('allowStale') +const MAX_AGE = Symbol('maxAge') +const DISPOSE = Symbol('dispose') +const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') +const LRU_LIST = Symbol('lruList') +const CACHE = Symbol('cache') +const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') + +const naiveLength = () => 1 + +// lruList is a yallist where the head is the youngest +// item, and the tail is the oldest.  the list contains the Hit +// objects as the entries. +// Each Hit object has a reference to its Yallist.Node.  This +// never changes. +// +// cache is a Map (or PseudoMap) that matches the keys to +// the Yallist.Node object. +class LRUCache { +  constructor (options) { +    if (typeof options === 'number') +      options = { max: options } + +    if (!options) +      options = {} + +    if (options.max && (typeof options.max !== 'number' || options.max < 0)) +      throw new TypeError('max must be a non-negative number') +    // Kind of weird to have a default max of Infinity, but oh well. +    const max = this[MAX] = options.max || Infinity + +    const lc = options.length || naiveLength +    this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc +    this[ALLOW_STALE] = options.stale || false +    if (options.maxAge && typeof options.maxAge !== 'number') +      throw new TypeError('maxAge must be a number') +    this[MAX_AGE] = options.maxAge || 0 +    this[DISPOSE] = options.dispose +    this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false +    this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false +    this.reset() +  } + +  // resize the cache when the max changes. +  set max (mL) { +    if (typeof mL !== 'number' || mL < 0) +      throw new TypeError('max must be a non-negative number') + +    this[MAX] = mL || Infinity +    trim(this) +  } +  get max () { +    return this[MAX] +  } + +  set allowStale (allowStale) { +    this[ALLOW_STALE] = !!allowStale +  } +  get allowStale () { +    return this[ALLOW_STALE] +  } + +  set maxAge (mA) { +    if (typeof mA !== 'number') +      throw new TypeError('maxAge must be a non-negative number') + +    this[MAX_AGE] = mA +    trim(this) +  } +  get maxAge () { +    return this[MAX_AGE] +  } + +  // resize the cache when the lengthCalculator changes. +  set lengthCalculator (lC) { +    if (typeof lC !== 'function') +      lC = naiveLength + +    if (lC !== this[LENGTH_CALCULATOR]) { +      this[LENGTH_CALCULATOR] = lC +      this[LENGTH] = 0 +      this[LRU_LIST].forEach(hit => { +        hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) +        this[LENGTH] += hit.length +      }) +    } +    trim(this) +  } +  get lengthCalculator () { return this[LENGTH_CALCULATOR] } + +  get length () { return this[LENGTH] } +  get itemCount () { return this[LRU_LIST].length } + +  rforEach (fn, thisp) { +    thisp = thisp || this +    for (let walker = this[LRU_LIST].tail; walker !== null;) { +      const prev = walker.prev +      forEachStep(this, fn, walker, thisp) +      walker = prev +    } +  } + +  forEach (fn, thisp) { +    thisp = thisp || this +    for (let walker = this[LRU_LIST].head; walker !== null;) { +      const next = walker.next +      forEachStep(this, fn, walker, thisp) +      walker = next +    } +  } + +  keys () { +    return this[LRU_LIST].toArray().map(k => k.key) +  } + +  values () { +    return this[LRU_LIST].toArray().map(k => k.value) +  } + +  reset () { +    if (this[DISPOSE] && +        this[LRU_LIST] && +        this[LRU_LIST].length) { +      this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) +    } + +    this[CACHE] = new Map() // hash of items by key +    this[LRU_LIST] = new Yallist() // list of items in order of use recency +    this[LENGTH] = 0 // length of items in the list +  } + +  dump () { +    return this[LRU_LIST].map(hit => +      isStale(this, hit) ? false : { +        k: hit.key, +        v: hit.value, +        e: hit.now + (hit.maxAge || 0) +      }).toArray().filter(h => h) +  } + +  dumpLru () { +    return this[LRU_LIST] +  } + +  set (key, value, maxAge) { +    maxAge = maxAge || this[MAX_AGE] + +    if (maxAge && typeof maxAge !== 'number') +      throw new TypeError('maxAge must be a number') + +    const now = maxAge ? Date.now() : 0 +    const len = this[LENGTH_CALCULATOR](value, key) + +    if (this[CACHE].has(key)) { +      if (len > this[MAX]) { +        del(this, this[CACHE].get(key)) +        return false +      } + +      const node = this[CACHE].get(key) +      const item = node.value + +      // dispose of the old one before overwriting +      // split out into 2 ifs for better coverage tracking +      if (this[DISPOSE]) { +        if (!this[NO_DISPOSE_ON_SET]) +          this[DISPOSE](key, item.value) +      } + +      item.now = now +      item.maxAge = maxAge +      item.value = value +      this[LENGTH] += len - item.length +      item.length = len +      this.get(key) +      trim(this) +      return true +    } + +    const hit = new Entry(key, value, len, now, maxAge) + +    // oversized objects fall out of cache automatically. +    if (hit.length > this[MAX]) { +      if (this[DISPOSE]) +        this[DISPOSE](key, value) + +      return false +    } + +    this[LENGTH] += hit.length +    this[LRU_LIST].unshift(hit) +    this[CACHE].set(key, this[LRU_LIST].head) +    trim(this) +    return true +  } + +  has (key) { +    if (!this[CACHE].has(key)) return false +    const hit = this[CACHE].get(key).value +    return !isStale(this, hit) +  } + +  get (key) { +    return get(this, key, true) +  } + +  peek (key) { +    return get(this, key, false) +  } + +  pop () { +    const node = this[LRU_LIST].tail +    if (!node) +      return null + +    del(this, node) +    return node.value +  } + +  del (key) { +    del(this, this[CACHE].get(key)) +  } + +  load (arr) { +    // reset the cache +    this.reset() + +    const now = Date.now() +    // A previous serialized cache has the most recent items first +    for (let l = arr.length - 1; l >= 0; l--) { +      const hit = arr[l] +      const expiresAt = hit.e || 0 +      if (expiresAt === 0) +        // the item was created without expiration in a non aged cache +        this.set(hit.k, hit.v) +      else { +        const maxAge = expiresAt - now +        // dont add already expired items +        if (maxAge > 0) { +          this.set(hit.k, hit.v, maxAge) +        } +      } +    } +  } + +  prune () { +    this[CACHE].forEach((value, key) => get(this, key, false)) +  } +} + +const get = (self, key, doUse) => { +  const node = self[CACHE].get(key) +  if (node) { +    const hit = node.value +    if (isStale(self, hit)) { +      del(self, node) +      if (!self[ALLOW_STALE]) +        return undefined +    } else { +      if (doUse) { +        if (self[UPDATE_AGE_ON_GET]) +          node.value.now = Date.now() +        self[LRU_LIST].unshiftNode(node) +      } +    } +    return hit.value +  } +} + +const isStale = (self, hit) => { +  if (!hit || (!hit.maxAge && !self[MAX_AGE])) +    return false + +  const diff = Date.now() - hit.now +  return hit.maxAge ? diff > hit.maxAge +    : self[MAX_AGE] && (diff > self[MAX_AGE]) +} + +const trim = self => { +  if (self[LENGTH] > self[MAX]) { +    for (let walker = self[LRU_LIST].tail; +      self[LENGTH] > self[MAX] && walker !== null;) { +      // We know that we're about to delete this one, and also +      // what the next least recently used key will be, so just +      // go ahead and set it now. +      const prev = walker.prev +      del(self, walker) +      walker = prev +    } +  } +} + +const del = (self, node) => { +  if (node) { +    const hit = node.value +    if (self[DISPOSE]) +      self[DISPOSE](hit.key, hit.value) + +    self[LENGTH] -= hit.length +    self[CACHE].delete(hit.key) +    self[LRU_LIST].removeNode(node) +  } +} + +class Entry { +  constructor (key, value, length, now, maxAge) { +    this.key = key +    this.value = value +    this.length = length +    this.now = now +    this.maxAge = maxAge || 0 +  } +} + +const forEachStep = (self, fn, node, thisp) => { +  let hit = node.value +  if (isStale(self, hit)) { +    del(self, node) +    if (!self[ALLOW_STALE]) +      hit = undefined +  } +  if (hit) +    fn.call(thisp, hit.value, hit.key, self) +} + +module.exports = LRUCache diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json new file mode 100644 index 0000000..43b7502 --- /dev/null +++ b/node_modules/lru-cache/package.json @@ -0,0 +1,34 @@ +{ +  "name": "lru-cache", +  "description": "A cache object that deletes the least-recently-used items.", +  "version": "6.0.0", +  "author": "Isaac Z. Schlueter <i@izs.me>", +  "keywords": [ +    "mru", +    "lru", +    "cache" +  ], +  "scripts": { +    "test": "tap", +    "snap": "tap", +    "preversion": "npm test", +    "postversion": "npm publish", +    "prepublishOnly": "git push origin --follow-tags" +  }, +  "main": "index.js", +  "repository": "git://github.com/isaacs/node-lru-cache.git", +  "devDependencies": { +    "benchmark": "^2.1.4", +    "tap": "^14.10.7" +  }, +  "license": "ISC", +  "dependencies": { +    "yallist": "^4.0.0" +  }, +  "files": [ +    "index.js" +  ], +  "engines": { +    "node": ">=10" +  } +}  | 
