@boredland/node-ts-cache 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["debug","_debug","storage: Storage","meta: CachedItem<typeof content>[\"meta\"]","#constructing","#perf","#starts","#ttls","#sizes","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#isBackgroundFetch","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","#max","#maxSize","#calculatedSize","#size","#fetchMethod","#memoMethod","#dispose","#onInsert","#disposeAfter","#hasFetchMethod","#disposed","#hasDispose","#hasOnInsert","#hasDisposeAfter","#initializeSizeTracking","#initializeTTLTracking","#setItemTTL","#delete","#updateItemAge","#statusTTL","#removeItemSize","#requireSize","#addItemSize","#evict","#isValidIndex","v","bf","#connect","#clear","EventEmitter","#queue","EventEmitter","#carryoverIntervalCount","#isIntervalIgnored","#intervalCap","#interval","#queue","#queueClass","#isPaused","#setupRateLimitTracking","#doesIntervalAllowAnother","#intervalCount","#doesConcurrentAllowAnother","#pending","#concurrency","#tryToStartAnother","#onInterval","#initializeIntervalIfNeeded","#timeoutId","#isIntervalPaused","#intervalId","#intervalEnd","#lastExecutionTime","#createIntervalTimeout","#onResumeInterval","#clearIntervalTimer","#clearTimeoutTimer","#scheduleRateLimitUpdate","#processQueue","#throwOnAbort","#idAssigner","#runningTasks","#next","#updateRateLimitState","#onEvent","#rateLimitFlushScheduled","#rateLimitedInInterval","typeGuess_1","hasher","hash","revalidationQueues: Record<string, PQueue>","prefix","hash"],"sources":["../src/debug.ts","../src/cacheContainer.ts","../node_modules/lru-cache/dist/esm/index.js","../src/lruStorage.ts","../node_modules/eventemitter3/index.js","../node_modules/eventemitter3/index.mjs","../node_modules/p-timeout/index.js","../node_modules/p-queue/dist/lower-bound.js","../node_modules/p-queue/dist/priority-queue.js","../node_modules/p-queue/dist/index.js","../node_modules/node-object-hash/dist/typeGuess.js","../node_modules/node-object-hash/dist/stringifiers.js","../node_modules/node-object-hash/dist/objectSorter.js","../node_modules/node-object-hash/dist/hasher.js","../src/hash.ts","../src/withCache.ts"],"sourcesContent":["import { debug as _debug } from \"node:util\";\n\nexport const debug = _debug(\"node-ts-cache\");\n","import { debug } from \"./debug.ts\";\nimport type { Storage } from \"./storage.ts\";\n\nexport type CachedItem<T = unknown> = {\n\tcontent: T;\n\tmeta: {\n\t\tcreatedAt: number;\n\t\tttl: number | null;\n\t\tisLazy: boolean;\n\t};\n};\n\nexport type CachingOptions = {\n\t/** Number of milliseconds to expire the cachte item - defaults to forever */\n\tttl: number | null;\n\t/** (Default: true) If true, expired cache entries will be deleted on touch and returned anyway. If false, entries will be deleted after the given ttl. */\n\tisLazy: boolean;\n\t/** (Default: JSON.stringify combination of className, methodName and call args) */\n\tcalculateKey: (data: {\n\t\t/** The class name for the method being decorated */\n\t\tclassName: string;\n\t\t/** The method name being decorated */\n\t\tmethodName: string;\n\t\t/** The arguments passed to the method when called */\n\t\targs: unknown[];\n\t}) => string;\n};\n\nexport class CacheContainer {\n\tconstructor(private storage: Storage) {}\n\n\tpublic async getItem<T>(\n\t\tkey: string,\n\t): Promise<\n\t\t{ content: T; meta: { expired: boolean; createdAt: number } } | undefined\n\t> {\n\t\tconst item = await this.storage.getItem(key);\n\n\t\tif (!item) return;\n\n\t\tconst result = {\n\t\t\tcontent: item.content as T,\n\t\t\tmeta: {\n\t\t\t\tcreatedAt: item.meta.createdAt,\n\t\t\t\texpired: this.isItemExpired(item),\n\t\t\t},\n\t\t};\n\n\t\tif (result.meta.expired) await this.unsetKey(key);\n\n\t\tif (result.meta.expired && !item.meta.isLazy) return undefined;\n\n\t\treturn result;\n\t}\n\n\tpublic async setItem(\n\t\tkey: string,\n\t\tcontent: unknown,\n\t\toptions?: Partial<CachingOptions>,\n\t): Promise<void> {\n\t\tconst finalOptions = {\n\t\t\tttl: null,\n\t\t\tisLazy: true,\n\t\t\t...options,\n\t\t};\n\n\t\tconst meta: CachedItem<typeof content>[\"meta\"] = {\n\t\t\tcreatedAt: Date.now(),\n\t\t\tisLazy: finalOptions.isLazy,\n\t\t\tttl: finalOptions.ttl,\n\t\t};\n\n\t\tawait this.storage.setItem(key, { meta, content });\n\t}\n\n\tpublic async clear(): Promise<void> {\n\t\tawait this.storage.clear();\n\n\t\tdebug(\"Cleared cache\");\n\t}\n\n\tprivate isItemExpired(item: CachedItem): boolean {\n\t\tif (item.meta.ttl === null) return false;\n\t\treturn Date.now() > item.meta.createdAt + item.meta.ttl;\n\t}\n\n\tpublic async unsetKey(key: string): Promise<void> {\n\t\tawait this.storage.removeItem(key);\n\t}\n}\n","/**\n * @module LRUCache\n */\nconst defaultPerf = (typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function') ?\n performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ?\n process\n : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function' ?\n PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max) ? null\n : max <= Math.pow(2, 8) ? Uint8Array\n : max <= Math.pow(2, 16) ? Uint16Array\n : max <= Math.pow(2, 32) ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache {\n // options that cannot be changed without disaster\n #max;\n #maxSize;\n #dispose;\n #onInsert;\n #disposeAfter;\n #fetchMethod;\n #memoMethod;\n #perf;\n /**\n * {@link LRUCache.OptionsBase.perf}\n */\n get perf() {\n return this.#perf;\n }\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n #hasOnInsert;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n get memoMethod() {\n return this.#memoMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.onInsert} (read-only)\n */\n get onInsert() {\n return this.#onInsert;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, onInsert, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, perf, } = options;\n if (perf !== undefined) {\n if (typeof perf?.now !== 'function') {\n throw new TypeError('perf option must have a now() method if specified');\n }\n }\n this.#perf = perf ?? defaultPerf;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (memoMethod !== undefined &&\n typeof memoMethod !== 'function') {\n throw new TypeError('memoMethod must be a function if defined');\n }\n this.#memoMethod = memoMethod;\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof onInsert === 'function') {\n this.#onInsert = onInsert;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasOnInsert = !!this.#onInsert;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0 ?\n ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = this.#perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index], 'expire');\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? this.#perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = this.#perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i], 'expire');\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n /* c8 ignore start - this isn't tested for the info function,\n * but it's the same logic as found in other places. */\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined)\n return undefined;\n /* c8 ignore end */\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (this.#perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = this.#perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = this.#perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set');\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0 ? this.#tail\n : this.#free.length !== 0 ? this.#free.pop()\n : this.#size === this.#max ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n if (this.#hasOnInsert) {\n this.#onInsert?.(v, k, 'add');\n }\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ?\n oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n if (this.#hasOnInsert) {\n this.onInsert?.(v, k, v === oldVal ? 'update' : 'replace');\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n // if nothing else has been written there but we're set to update the\n // cache and ignore the abort, or if it's still pending on this specific\n // background request, then write it to the cache.\n const vl = this.#valList[index];\n if (vl === p || ignoreAbort && updateCache && vl === undefined) {\n if (v === undefined) {\n if (bf.__staleWhileFetching !== undefined) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.#delete(k, 'fetch');\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.#delete(k, 'fetch');\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n async forceFetch(k, fetchOptions = {}) {\n const v = await this.fetch(k, fetchOptions);\n if (v === undefined)\n throw new Error('fetch() returned undefined');\n return v;\n }\n memo(k, memoOptions = {}) {\n const memoMethod = this.#memoMethod;\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor');\n }\n const { context, forceRefresh, ...options } = memoOptions;\n const v = this.get(k, options);\n if (!forceRefresh && v !== undefined)\n return v;\n const vv = memoMethod(k, v, {\n options,\n context,\n });\n this.set(k, vv, options);\n return vv;\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire');\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n return this.#delete(k, 'delete');\n }\n #delete(k, reason) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.#clear(reason);\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete');\n }\n #clear(reason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, reason);\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, reason]);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import { LRUCache } from \"lru-cache\";\nimport type { CachedItem } from \"./cacheContainer.ts\";\nimport type { Storage } from \"./storage.ts\";\n\nexport class LRUStorage implements Storage {\n\tprivate cache: LRUCache<string, CachedItem, unknown>;\n\n\tconstructor({\n\t\tmax = 10_000,\n\t}: Partial<LRUCache<string, CachedItem, unknown>> = {}) {\n\t\tthis.cache = new LRUCache<string, CachedItem, unknown>({\n\t\t\tmax,\n\t\t});\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.cache.clear();\n\t}\n\n\tasync getItem(key: string) {\n\t\tconst item = this.cache.get(key);\n\t\treturn item;\n\t}\n\n\tasync setItem(key: string, content: CachedItem) {\n\t\tthis.cache.set(key, content);\n\t}\n\n\tasync removeItem(key: string) {\n\t\tthis.cache.delete(key);\n\t}\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n","// Port of lower_bound from https://en.cppreference.com/w/cpp/algorithm/lower_bound\n// Used to compute insertion index to keep queue sorted after insertion\nexport default function lowerBound(array, value, comparator) {\n let first = 0;\n let count = array.length;\n while (count > 0) {\n const step = Math.trunc(count / 2);\n let it = first + step;\n if (comparator(array[it], value) <= 0) {\n first = ++it;\n count -= step + 1;\n }\n else {\n count = step;\n }\n }\n return first;\n}\n","import lowerBound from './lower-bound.js';\nexport default class PriorityQueue {\n #queue = [];\n enqueue(run, options) {\n const { priority = 0, id, } = options ?? {};\n const element = {\n priority,\n id,\n run,\n };\n if (this.size === 0 || this.#queue[this.size - 1].priority >= priority) {\n this.#queue.push(element);\n return;\n }\n const index = lowerBound(this.#queue, element, (a, b) => b.priority - a.priority);\n this.#queue.splice(index, 0, element);\n }\n setPriority(id, priority) {\n const index = this.#queue.findIndex((element) => element.id === id);\n if (index === -1) {\n throw new ReferenceError(`No promise function with the id \"${id}\" exists in the queue.`);\n }\n const [item] = this.#queue.splice(index, 1);\n this.enqueue(item.run, { priority, id });\n }\n dequeue() {\n const item = this.#queue.shift();\n return item?.run;\n }\n filter(options) {\n return this.#queue.filter((element) => element.priority === options.priority).map((element) => element.run);\n }\n get size() {\n return this.#queue.length;\n }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport pTimeout from 'p-timeout';\nimport PriorityQueue from './priority-queue.js';\n/**\nPromise queue with concurrency control.\n*/\nexport default class PQueue extends EventEmitter {\n #carryoverIntervalCount;\n #isIntervalIgnored;\n #intervalCount = 0;\n #intervalCap;\n #rateLimitedInInterval = false;\n #rateLimitFlushScheduled = false;\n #interval;\n #intervalEnd = 0;\n #lastExecutionTime = 0;\n #intervalId;\n #timeoutId;\n #queue;\n #queueClass;\n #pending = 0;\n // The `!` is needed because of https://github.com/microsoft/TypeScript/issues/32194\n #concurrency;\n #isPaused;\n // Use to assign a unique identifier to a promise function, if not explicitly specified\n #idAssigner = 1n;\n // Track currently running tasks for debugging\n #runningTasks = new Map();\n /**\n Get or set the default timeout for all tasks. Can be changed at runtime.\n\n Operations will throw a `TimeoutError` if they don't complete within the specified time.\n\n The timeout begins when the operation is dequeued and starts execution, not while it's waiting in the queue.\n\n @example\n ```\n const queue = new PQueue({timeout: 5000});\n\n // Change timeout for all future tasks\n queue.timeout = 10000;\n ```\n */\n timeout;\n constructor(options) {\n super();\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n options = {\n carryoverIntervalCount: false,\n intervalCap: Number.POSITIVE_INFINITY,\n interval: 0,\n concurrency: Number.POSITIVE_INFINITY,\n autoStart: true,\n queueClass: PriorityQueue,\n ...options,\n };\n if (!(typeof options.intervalCap === 'number' && options.intervalCap >= 1)) {\n throw new TypeError(`Expected \\`intervalCap\\` to be a number from 1 and up, got \\`${options.intervalCap?.toString() ?? ''}\\` (${typeof options.intervalCap})`);\n }\n if (options.interval === undefined || !(Number.isFinite(options.interval) && options.interval >= 0)) {\n throw new TypeError(`Expected \\`interval\\` to be a finite number >= 0, got \\`${options.interval?.toString() ?? ''}\\` (${typeof options.interval})`);\n }\n // TODO: Remove this fallback in the next major version\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.#carryoverIntervalCount = options.carryoverIntervalCount ?? options.carryoverConcurrencyCount ?? false;\n this.#isIntervalIgnored = options.intervalCap === Number.POSITIVE_INFINITY || options.interval === 0;\n this.#intervalCap = options.intervalCap;\n this.#interval = options.interval;\n this.#queue = new options.queueClass();\n this.#queueClass = options.queueClass;\n this.concurrency = options.concurrency;\n if (options.timeout !== undefined && !(Number.isFinite(options.timeout) && options.timeout > 0)) {\n throw new TypeError(`Expected \\`timeout\\` to be a positive finite number, got \\`${options.timeout}\\` (${typeof options.timeout})`);\n }\n this.timeout = options.timeout;\n this.#isPaused = options.autoStart === false;\n this.#setupRateLimitTracking();\n }\n get #doesIntervalAllowAnother() {\n return this.#isIntervalIgnored || this.#intervalCount < this.#intervalCap;\n }\n get #doesConcurrentAllowAnother() {\n return this.#pending < this.#concurrency;\n }\n #next() {\n this.#pending--;\n if (this.#pending === 0) {\n this.emit('pendingZero');\n }\n this.#tryToStartAnother();\n this.emit('next');\n }\n #onResumeInterval() {\n this.#onInterval(); // Already schedules update\n this.#initializeIntervalIfNeeded();\n this.#timeoutId = undefined;\n }\n get #isIntervalPaused() {\n const now = Date.now();\n if (this.#intervalId === undefined) {\n const delay = this.#intervalEnd - now;\n if (delay < 0) {\n // If the interval has expired while idle, check if we should enforce the interval\n // from the last task execution. This ensures proper spacing between tasks even\n // when the queue becomes empty and then new tasks are added.\n if (this.#lastExecutionTime > 0) {\n const timeSinceLastExecution = now - this.#lastExecutionTime;\n if (timeSinceLastExecution < this.#interval) {\n // Not enough time has passed since the last task execution\n this.#createIntervalTimeout(this.#interval - timeSinceLastExecution);\n return true;\n }\n }\n // Enough time has passed or no previous execution, allow execution\n this.#intervalCount = (this.#carryoverIntervalCount) ? this.#pending : 0;\n }\n else {\n // Act as the interval is pending\n this.#createIntervalTimeout(delay);\n return true;\n }\n }\n return false;\n }\n #createIntervalTimeout(delay) {\n if (this.#timeoutId !== undefined) {\n return;\n }\n this.#timeoutId = setTimeout(() => {\n this.#onResumeInterval();\n }, delay);\n }\n #clearIntervalTimer() {\n if (this.#intervalId) {\n clearInterval(this.#intervalId);\n this.#intervalId = undefined;\n }\n }\n #clearTimeoutTimer() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId);\n this.#timeoutId = undefined;\n }\n }\n #tryToStartAnother() {\n if (this.#queue.size === 0) {\n // We can clear the interval (\"pause\")\n // Because we can redo it later (\"resume\")\n this.#clearIntervalTimer();\n this.emit('empty');\n if (this.#pending === 0) {\n // Clear timeout as well when completely idle\n this.#clearTimeoutTimer();\n this.emit('idle');\n }\n return false;\n }\n let taskStarted = false;\n if (!this.#isPaused) {\n const canInitializeInterval = !this.#isIntervalPaused;\n if (this.#doesIntervalAllowAnother && this.#doesConcurrentAllowAnother) {\n const job = this.#queue.dequeue();\n // Increment interval count immediately to prevent race conditions\n if (!this.#isIntervalIgnored) {\n this.#intervalCount++;\n this.#scheduleRateLimitUpdate();\n }\n this.emit('active');\n this.#lastExecutionTime = Date.now();\n job();\n if (canInitializeInterval) {\n this.#initializeIntervalIfNeeded();\n }\n taskStarted = true;\n }\n }\n return taskStarted;\n }\n #initializeIntervalIfNeeded() {\n if (this.#isIntervalIgnored || this.#intervalId !== undefined) {\n return;\n }\n this.#intervalId = setInterval(() => {\n this.#onInterval();\n }, this.#interval);\n this.#intervalEnd = Date.now() + this.#interval;\n }\n #onInterval() {\n if (this.#intervalCount === 0 && this.#pending === 0 && this.#intervalId) {\n this.#clearIntervalTimer();\n }\n this.#intervalCount = this.#carryoverIntervalCount ? this.#pending : 0;\n this.#processQueue();\n this.#scheduleRateLimitUpdate();\n }\n /**\n Executes all queued functions until it reaches the limit.\n */\n #processQueue() {\n // eslint-disable-next-line no-empty\n while (this.#tryToStartAnother()) { }\n }\n get concurrency() {\n return this.#concurrency;\n }\n set concurrency(newConcurrency) {\n if (!(typeof newConcurrency === 'number' && newConcurrency >= 1)) {\n throw new TypeError(`Expected \\`concurrency\\` to be a number from 1 and up, got \\`${newConcurrency}\\` (${typeof newConcurrency})`);\n }\n this.#concurrency = newConcurrency;\n this.#processQueue();\n }\n async #throwOnAbort(signal) {\n return new Promise((_resolve, reject) => {\n signal.addEventListener('abort', () => {\n reject(signal.reason);\n }, { once: true });\n });\n }\n /**\n Updates the priority of a promise function by its id, affecting its execution order. Requires a defined concurrency limit to take effect.\n\n For example, this can be used to prioritize a promise function to run earlier.\n\n ```js\n import PQueue from 'p-queue';\n\n const queue = new PQueue({concurrency: 1});\n\n queue.add(async () => '🦄', {priority: 1});\n queue.add(async () => '🦀', {priority: 0, id: '🦀'});\n queue.add(async () => '🦄', {priority: 1});\n queue.add(async () => '🦄', {priority: 1});\n\n queue.setPriority('🦀', 2);\n ```\n\n In this case, the promise function with `id: '🦀'` runs second.\n\n You can also deprioritize a promise function to delay its execution:\n\n ```js\n import PQueue from 'p-queue';\n\n const queue = new PQueue({concurrency: 1});\n\n queue.add(async () => '🦄', {priority: 1});\n queue.add(async () => '🦀', {priority: 1, id: '🦀'});\n queue.add(async () => '🦄');\n queue.add(async () => '🦄', {priority: 0});\n\n queue.setPriority('🦀', -1);\n ```\n Here, the promise function with `id: '🦀'` executes last.\n */\n setPriority(id, priority) {\n if (typeof priority !== 'number' || !Number.isFinite(priority)) {\n throw new TypeError(`Expected \\`priority\\` to be a finite number, got \\`${priority}\\` (${typeof priority})`);\n }\n this.#queue.setPriority(id, priority);\n }\n async add(function_, options = {}) {\n // In case `id` is not defined.\n options.id ??= (this.#idAssigner++).toString();\n options = {\n timeout: this.timeout,\n ...options,\n };\n return new Promise((resolve, reject) => {\n // Create a unique symbol for tracking this task\n const taskSymbol = Symbol(`task-${options.id}`);\n this.#queue.enqueue(async () => {\n this.#pending++;\n // Track this running task\n this.#runningTasks.set(taskSymbol, {\n id: options.id,\n priority: options.priority ?? 0, // Match priority-queue default\n startTime: Date.now(),\n timeout: options.timeout,\n });\n try {\n // Check abort signal - if aborted, need to decrement the counter\n // that was incremented in tryToStartAnother\n try {\n options.signal?.throwIfAborted();\n }\n catch (error) {\n // Decrement the counter that was already incremented\n if (!this.#isIntervalIgnored) {\n this.#intervalCount--;\n }\n // Clean up tracking before throwing\n this.#runningTasks.delete(taskSymbol);\n throw error;\n }\n let operation = function_({ signal: options.signal });\n if (options.timeout) {\n operation = pTimeout(Promise.resolve(operation), {\n milliseconds: options.timeout,\n message: `Task timed out after ${options.timeout}ms (queue has ${this.#pending} running, ${this.#queue.size} waiting)`,\n });\n }\n if (options.signal) {\n operation = Promise.race([operation, this.#throwOnAbort(options.signal)]);\n }\n const result = await operation;\n resolve(result);\n this.emit('completed', result);\n }\n catch (error) {\n reject(error);\n this.emit('error', error);\n }\n finally {\n // Remove from running tasks\n this.#runningTasks.delete(taskSymbol);\n // Use queueMicrotask to prevent deep recursion while maintaining timing\n queueMicrotask(() => {\n this.#next();\n });\n }\n }, options);\n this.emit('add');\n this.#tryToStartAnother();\n });\n }\n async addAll(functions, options) {\n return Promise.all(functions.map(async (function_) => this.add(function_, options)));\n }\n /**\n Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)\n */\n start() {\n if (!this.#isPaused) {\n return this;\n }\n this.#isPaused = false;\n this.#processQueue();\n return this;\n }\n /**\n Put queue execution on hold.\n */\n pause() {\n this.#isPaused = true;\n }\n /**\n Clear the queue.\n */\n clear() {\n this.#queue = new this.#queueClass();\n // Note: We don't clear #runningTasks as those tasks are still running\n // They will be removed when they complete in the finally block\n // Force synchronous update since clear() should have immediate effect\n this.#updateRateLimitState();\n }\n /**\n Can be called multiple times. Useful if you for example add additional items at a later time.\n\n @returns A promise that settles when the queue becomes empty.\n */\n async onEmpty() {\n // Instantly resolve if the queue is empty\n if (this.#queue.size === 0) {\n return;\n }\n await this.#onEvent('empty');\n }\n /**\n @returns A promise that settles when the queue size is less than the given limit: `queue.size < limit`.\n\n If you want to avoid having the queue grow beyond a certain size you can `await queue.onSizeLessThan()` before adding a new item.\n\n Note that this only limits the number of items waiting to start. There could still be up to `concurrency` jobs already running that this call does not include in its calculation.\n */\n async onSizeLessThan(limit) {\n // Instantly resolve if the queue is empty.\n if (this.#queue.size < limit) {\n return;\n }\n await this.#onEvent('next', () => this.#queue.size < limit);\n }\n /**\n The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.\n\n @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.\n */\n async onIdle() {\n // Instantly resolve if none pending and if nothing else is queued\n if (this.#pending === 0 && this.#queue.size === 0) {\n return;\n }\n await this.#onEvent('idle');\n }\n /**\n The difference with `.onIdle` is that `.onPendingZero` only waits for currently running tasks to finish, ignoring queued tasks.\n\n @returns A promise that settles when all currently running tasks have completed; `queue.pending === 0`.\n */\n async onPendingZero() {\n if (this.#pending === 0) {\n return;\n }\n await this.#onEvent('pendingZero');\n }\n /**\n @returns A promise that settles when the queue becomes rate-limited due to intervalCap.\n */\n async onRateLimit() {\n if (this.isRateLimited) {\n return;\n }\n await this.#onEvent('rateLimit');\n }\n /**\n @returns A promise that settles when the queue is no longer rate-limited.\n */\n async onRateLimitCleared() {\n if (!this.isRateLimited) {\n return;\n }\n await this.#onEvent('rateLimitCleared');\n }\n /**\n @returns A promise that rejects when any task in the queue errors.\n\n Use with `Promise.race([queue.onError(), queue.onIdle()])` to fail fast on the first error while still resolving normally when the queue goes idle.\n\n Important: The promise returned by `add()` still rejects. You must handle each `add()` promise (for example, `.catch(() => {})`) to avoid unhandled rejections.\n\n @example\n ```\n import PQueue from 'p-queue';\n\n const queue = new PQueue({concurrency: 2});\n\n queue.add(() => fetchData(1)).catch(() => {});\n queue.add(() => fetchData(2)).catch(() => {});\n queue.add(() => fetchData(3)).catch(() => {});\n\n // Stop processing on first error\n try {\n await Promise.race([\n queue.onError(),\n queue.onIdle()\n ]);\n } catch (error) {\n queue.pause(); // Stop processing remaining tasks\n console.error('Queue failed:', error);\n }\n ```\n */\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n async onError() {\n return new Promise((_resolve, reject) => {\n const handleError = (error) => {\n this.off('error', handleError);\n reject(error);\n };\n this.on('error', handleError);\n });\n }\n async #onEvent(event, filter) {\n return new Promise(resolve => {\n const listener = () => {\n if (filter && !filter()) {\n return;\n }\n this.off(event, listener);\n resolve();\n };\n this.on(event, listener);\n });\n }\n /**\n Size of the queue, the number of queued items waiting to run.\n */\n get size() {\n return this.#queue.size;\n }\n /**\n Size of the queue, filtered by the given options.\n\n For example, this can be used to find the number of items remaining in the queue with a specific priority level.\n */\n sizeBy(options) {\n // eslint-disable-next-line unicorn/no-array-callback-reference\n return this.#queue.filter(options).length;\n }\n /**\n Number of running items (no longer in the queue).\n */\n get pending() {\n return this.#pending;\n }\n /**\n Whether the queue is currently paused.\n */\n get isPaused() {\n return this.#isPaused;\n }\n #setupRateLimitTracking() {\n // Only schedule updates when rate limiting is enabled\n if (this.#isIntervalIgnored) {\n return;\n }\n // Wire up to lifecycle events that affect rate limit state\n // Only 'add' and 'next' can actually change rate limit state\n this.on('add', () => {\n if (this.#queue.size > 0) {\n this.#scheduleRateLimitUpdate();\n }\n });\n this.on('next', () => {\n this.#scheduleRateLimitUpdate();\n });\n }\n #scheduleRateLimitUpdate() {\n // Skip if rate limiting is not enabled or already scheduled\n if (this.#isIntervalIgnored || this.#rateLimitFlushScheduled) {\n return;\n }\n this.#rateLimitFlushScheduled = true;\n queueMicrotask(() => {\n this.#rateLimitFlushScheduled = false;\n this.#updateRateLimitState();\n });\n }\n #updateRateLimitState() {\n const previous = this.#rateLimitedInInterval;\n const shouldBeRateLimited = !this.#isIntervalIgnored\n && this.#intervalCount >= this.#intervalCap\n && this.#queue.size > 0;\n if (shouldBeRateLimited !== previous) {\n this.#rateLimitedInInterval = shouldBeRateLimited;\n this.emit(shouldBeRateLimited ? 'rateLimit' : 'rateLimitCleared');\n }\n }\n /**\n Whether the queue is currently rate-limited due to intervalCap.\n */\n get isRateLimited() {\n return this.#rateLimitedInInterval;\n }\n /**\n Whether the queue is saturated. Returns `true` when:\n - All concurrency slots are occupied and tasks are waiting, OR\n - The queue is rate-limited and tasks are waiting\n\n Useful for detecting backpressure and potential hanging tasks.\n\n ```js\n import PQueue from 'p-queue';\n\n const queue = new PQueue({concurrency: 2});\n\n // Backpressure handling\n if (queue.isSaturated) {\n console.log('Queue is saturated, waiting for capacity...');\n await queue.onSizeLessThan(queue.concurrency);\n }\n\n // Monitoring for stuck tasks\n setInterval(() => {\n if (queue.isSaturated) {\n console.warn(`Queue saturated: ${queue.pending} running, ${queue.size} waiting`);\n }\n }, 60000);\n ```\n */\n get isSaturated() {\n return (this.#pending === this.#concurrency && this.#queue.size > 0)\n || (this.isRateLimited && this.#queue.size > 0);\n }\n /**\n The tasks currently being executed. Each task includes its `id`, `priority`, `startTime`, and `timeout` (if set).\n\n Returns an array of task info objects.\n\n ```js\n import PQueue from 'p-queue';\n\n const queue = new PQueue({concurrency: 2});\n\n // Add tasks with IDs for better debugging\n queue.add(() => fetchUser(123), {id: 'user-123'});\n queue.add(() => fetchPosts(456), {id: 'posts-456', priority: 1});\n\n // Check what's running\n console.log(queue.runningTasks);\n // => [{\n // id: 'user-123',\n // priority: 0,\n // startTime: 1759253001716,\n // timeout: undefined\n // }, {\n // id: 'posts-456',\n // priority: 1,\n // startTime: 1759253001916,\n // timeout: undefined\n // }]\n ```\n */\n get runningTasks() {\n // Return fresh array with fresh objects to prevent mutations\n return [...this.#runningTasks.values()].map(task => ({ ...task }));\n }\n}\n/**\nError thrown when a task times out.\n\n@example\n```\nimport PQueue, {TimeoutError} from 'p-queue';\n\nconst queue = new PQueue({timeout: 1000});\n\ntry {\n await queue.add(() => someTask());\n} catch (error) {\n if (error instanceof TimeoutError) {\n console.log('Task timed out');\n }\n}\n```\n*/\nexport { TimeoutError } from 'p-timeout';\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.instanceOfHashable = exports.guessType = exports.guessObjectType = exports.TYPE_MAP = void 0;\n/**\n * Type mapping rules.\n */\nexports.TYPE_MAP = {\n Array: 'array',\n Int8Array: 'typedarray',\n Uint8Array: 'typedarray',\n Uint8ClampedArray: 'typedarray',\n Int16Array: 'typedarray',\n Uint16Array: 'typedarray',\n Int32Array: 'typedarray',\n Uint32Array: 'typedarray',\n Float32Array: 'typedarray',\n Float64Array: 'typedarray',\n BigUint64Array: 'typedarray',\n BigInt64Array: 'typedarray',\n Buffer: 'typedarray',\n Map: 'map',\n Set: 'set',\n Date: 'date',\n String: 'string',\n Number: 'number',\n BigInt: 'bigint',\n Boolean: 'boolean',\n Object: 'object',\n};\n/**\n * Guess object type\n * @param obj analyzed object\n * @return object type\n */\nconst guessObjectType = (obj) => {\n if (obj === null) {\n return 'null';\n }\n if ((0, exports.instanceOfHashable)(obj)) {\n return 'hashable';\n }\n const type = obj?.constructor?.name ?? 'unknown';\n return exports.TYPE_MAP[type] || 'unknown';\n};\nexports.guessObjectType = guessObjectType;\n/**\n * Guess variable type\n * @param obj analyzed variable\n * @return variable type\n */\nconst guessType = (obj) => {\n const type = typeof obj;\n return type !== 'object' ? type : (0, exports.guessObjectType)(obj);\n};\nexports.guessType = guessType;\n/**\n * Identify if object is instance of Hashable interface\n * @param object analyzed variable\n * @return true if object has toHashableString property and this property is function\n * otherwise return false\n */\nconst instanceOfHashable = (object) => {\n return typeof object.toHashableString === 'function';\n};\nexports.instanceOfHashable = instanceOfHashable;\n//# sourceMappingURL=typeGuess.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._mapSort = exports._map = exports._objectSort = exports._object = exports._setCoerce = exports._set = exports._setSort = exports._setSortCoerce = exports._typedArray = exports._typedArraySort = exports._array = exports._arraySort = exports._date = exports._dateCoerce = exports._functionTrim = exports._functionTrimCoerce = exports._function = exports._functionCoerce = exports._null = exports._nullCoerce = exports._undefined = exports._undefinedCoerce = exports._symbol = exports._symbolCoerce = exports._boolean = exports._booleanCoerce = exports._bigInt = exports._bigIntCoerce = exports._number = exports._numberCoerce = exports._stringTrim = exports._stringTrimCoerce = exports._string = exports._stringCoerce = exports._hashable = exports.PREFIX = void 0;\nconst typeGuess_1 = require(\"./typeGuess\");\n/**\n * Prefixes that used when type coercion is disabled\n */\nexports.PREFIX = {\n string: '<:s>',\n number: '<:n>',\n bigint: '<:bi>',\n boolean: '<:b>',\n symbol: '<:smbl>',\n undefined: '<:undf>',\n null: '<:null>',\n function: '<:func>',\n array: '',\n date: '<:date>',\n set: '<:set>',\n map: '<:map>',\n};\n/**\n * Converts Hashable to string\n * @private\n * @param obj object to convert\n * @returns object string representation\n */\nfunction _hashable(obj) {\n return obj.toHashableString();\n}\nexports._hashable = _hashable;\n/**\n * Converts string to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _stringCoerce(obj) {\n return obj;\n}\nexports._stringCoerce = _stringCoerce;\n/**\n * Converts string to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _string(obj) {\n return exports.PREFIX.string + ':' + obj;\n}\nexports._string = _string;\n/**\n * Converts string to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _stringTrimCoerce(obj) {\n return obj.replace(/(\\s+|\\t|\\r\\n|\\n|\\r)/gm, ' ').trim();\n}\nexports._stringTrimCoerce = _stringTrimCoerce;\n/**\n * Converts string to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _stringTrim(obj) {\n return exports.PREFIX.string + ':' + obj.replace(/(\\s+|\\t|\\r\\n|\\n|\\r)/gm, ' ').trim();\n}\nexports._stringTrim = _stringTrim;\n/**\n * Converts number to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _numberCoerce(obj) {\n return obj.toString();\n}\nexports._numberCoerce = _numberCoerce;\n/**\n * Converts number to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _number(obj) {\n return `${exports.PREFIX.number}:${obj}`;\n}\nexports._number = _number;\n/**\n * Converts BigInt to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _bigIntCoerce(obj) {\n return obj.toString();\n}\nexports._bigIntCoerce = _bigIntCoerce;\n/**\n * Converts BigInt to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _bigInt(obj) {\n return `${exports.PREFIX.bigint}:${obj.toString()}`;\n}\nexports._bigInt = _bigInt;\n/**\n * Converts boolean to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _booleanCoerce(obj) {\n return obj ? '1' : '0';\n}\nexports._booleanCoerce = _booleanCoerce;\n/**\n * Converts boolean to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _boolean(obj) {\n return exports.PREFIX.boolean + ':' + obj.toString();\n}\nexports._boolean = _boolean;\n/**\n * Converts symbol to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _symbolCoerce() {\n return exports.PREFIX.symbol;\n}\nexports._symbolCoerce = _symbolCoerce;\n/**\n * Converts symbol to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _symbol(obj) {\n return exports.PREFIX.symbol + ':' + obj.toString();\n}\nexports._symbol = _symbol;\n/**\n * Converts undefined to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _undefinedCoerce() {\n return '';\n}\nexports._undefinedCoerce = _undefinedCoerce;\n/**\n * Converts undefined to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _undefined() {\n return exports.PREFIX.undefined;\n}\nexports._undefined = _undefined;\n/**\n * Converts null to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _nullCoerce() {\n return '';\n}\nexports._nullCoerce = _nullCoerce;\n/**\n * Converts null to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _null() {\n return exports.PREFIX.null;\n}\nexports._null = _null;\n/**\n * Converts function to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _functionCoerce(obj) {\n return obj.name + '=>' + obj.toString();\n}\nexports._functionCoerce = _functionCoerce;\n/**\n * Converts function to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _function(obj) {\n return exports.PREFIX.function + ':' + obj.name + '=>' + obj.toString();\n}\nexports._function = _function;\n/**\n * Converts function to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _functionTrimCoerce(obj) {\n return (obj.name +\n '=>' +\n obj\n .toString()\n .replace(/(\\s+|\\t|\\r\\n|\\n|\\r)/gm, ' ')\n .trim());\n}\nexports._functionTrimCoerce = _functionTrimCoerce;\n/**\n * Converts function to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction _functionTrim(obj) {\n return (exports.PREFIX.function +\n ':' +\n obj.name +\n '=>' +\n obj\n .toString()\n .replace(/(\\s+|\\t|\\r\\n|\\n|\\r)/gm, ' ')\n .trim());\n}\nexports._functionTrim = _functionTrim;\n/**\n * Converts date to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _dateCoerce(obj) {\n return obj.toISOString();\n}\nexports._dateCoerce = _dateCoerce;\n/**\n * Converts date to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _date(obj) {\n return exports.PREFIX.date + ':' + obj.toISOString();\n}\nexports._date = _date;\n/**\n * Converts array to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _arraySort(obj) {\n const stringifiers = this;\n return ('[' +\n obj\n .map((item) => {\n return stringifiers[(0, typeGuess_1.guessType)(item)](item);\n })\n .sort()\n .toString() +\n ']');\n}\nexports._arraySort = _arraySort;\n/**\n * Converts array to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _array(obj) {\n const stringifiers = this;\n return ('[' +\n obj\n .map((item) => {\n return stringifiers[(0, typeGuess_1.guessType)(item)](item);\n })\n .toString() +\n ']');\n}\nexports._array = _array;\n/**\n * Converts TypedArray to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _typedArraySort(obj) {\n const stringifiers = this;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n const values = Array.prototype.slice.call(obj);\n return ('[' +\n values\n .map((num) => {\n return stringifiers[(0, typeGuess_1.guessType)(num)](num);\n })\n .sort()\n .toString() +\n ']');\n}\nexports._typedArraySort = _typedArraySort;\n/**\n * Converts TypedArray to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _typedArray(obj) {\n const stringifiers = this;\n const values = Array.prototype.slice.call(obj);\n return ('[' +\n values\n .map((num) => {\n return stringifiers[(0, typeGuess_1.guessType)(num)](num);\n })\n .toString() +\n ']');\n}\nexports._typedArray = _typedArray;\n/**\n * Converts set to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _setSortCoerce(obj) {\n return _arraySort.call(this, Array.from(obj));\n}\nexports._setSortCoerce = _setSortCoerce;\n/**\n * Converts set to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _setSort(obj) {\n return `${exports.PREFIX.set}:${_arraySort.call(this, Array.from(obj))}`;\n}\nexports._setSort = _setSort;\n/**\n * Converts set to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _set(obj) {\n return `${exports.PREFIX.set}:${_array.call(this, Array.from(obj))}`;\n}\nexports._set = _set;\n/**\n * Converts set to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _setCoerce(obj) {\n return _array.call(this, Array.from(obj));\n}\nexports._setCoerce = _setCoerce;\n/**\n * Converts object to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _object(obj) {\n const stringifiers = this;\n const keys = Object.keys(obj);\n const objArray = [];\n for (const key of keys) {\n const val = obj[key];\n const valT = (0, typeGuess_1.guessType)(val);\n objArray.push(key + ':' + stringifiers[valT](val));\n }\n return '{' + objArray.toString() + '}';\n}\nexports._object = _object;\n/**\n * Converts object to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _objectSort(obj) {\n const stringifiers = this;\n const keys = Object.keys(obj).sort();\n const objArray = [];\n for (const key of keys) {\n const val = obj[key];\n const valT = (0, typeGuess_1.guessType)(val);\n objArray.push(key + ':' + stringifiers[valT](val));\n }\n return '{' + objArray.toString() + '}';\n}\nexports._objectSort = _objectSort;\n/**\n * Converts map to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _map(obj) {\n const stringifiers = this;\n const arr = Array.from(obj);\n const mapped = [];\n for (const item of arr) {\n const [key, value] = item;\n mapped.push([stringifiers[(0, typeGuess_1.guessType)(key)](key), stringifiers[(0, typeGuess_1.guessType)(value)](value)]);\n }\n return '[' + mapped.join(';') + ']';\n}\nexports._map = _map;\n/**\n * Converts map to string\n * @private\n * @param obj object to convert\n * @return object string representation\n */\nfunction _mapSort(obj) {\n const stringifiers = this;\n const arr = Array.from(obj);\n const mapped = [];\n for (const item of arr) {\n const [key, value] = item;\n mapped.push([stringifiers[(0, typeGuess_1.guessType)(key)](key), stringifiers[(0, typeGuess_1.guessType)(value)](value)]);\n }\n return '[' + mapped.sort().join(';') + ']';\n}\nexports._mapSort = _mapSort;\n//# sourceMappingURL=stringifiers.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.objectSorter = void 0;\nconst str = __importStar(require(\"./stringifiers\"));\nconst typeGuess_1 = require(\"./typeGuess\");\n/**\n * Object sorter consturctor\n * @param options object transformation options\n * @return function that transforms object to strings\n */\nconst objectSorter = (options) => {\n const { sort, coerce, trim } = {\n sort: true,\n coerce: true,\n trim: false,\n ...options,\n };\n const sortOptions = {\n array: typeof sort === 'boolean' ? sort : sort?.array ?? false,\n typedArray: typeof sort === 'boolean' ? false : sort?.typedArray ?? false,\n object: typeof sort === 'boolean' ? sort : sort?.object ?? false,\n set: typeof sort === 'boolean' ? sort : sort?.set ?? false,\n map: typeof sort === 'boolean' ? sort : sort?.map ?? false,\n };\n const coerceOptions = {\n boolean: typeof coerce === 'boolean' ? coerce : coerce?.boolean ?? false,\n number: typeof coerce === 'boolean' ? coerce : coerce?.number ?? false,\n bigint: typeof coerce === 'boolean' ? coerce : coerce?.bigint ?? false,\n string: typeof coerce === 'boolean' ? coerce : coerce?.string ?? false,\n undefined: typeof coerce === 'boolean' ? coerce : coerce?.undefined ?? false,\n null: typeof coerce === 'boolean' ? coerce : coerce?.null ?? false,\n symbol: typeof coerce === 'boolean' ? coerce : coerce?.symbol ?? false,\n function: typeof coerce === 'boolean' ? coerce : coerce?.function ?? false,\n date: typeof coerce === 'boolean' ? coerce : coerce?.date ?? false,\n set: typeof coerce === 'boolean' ? coerce : coerce?.set ?? false,\n };\n const trimOptions = {\n string: typeof trim === 'boolean' ? trim : trim?.string ?? false,\n function: typeof trim === 'boolean' ? trim : trim?.function ?? false,\n };\n const stringifiers = {\n // eslint-disable-next-line @typescript-eslint/ban-types\n unknown: function _unknown(obj) {\n // `unknonw` - is a typo, saved for backward compatibility\n const constructorName = obj.constructor?.name ?? 'unknonw';\n let objectName = 'unknown';\n if (typeof obj.toString === 'function') {\n objectName = obj.toString();\n }\n else if (Object.keys(obj).length > 0) {\n objectName = JSON.stringify(obj);\n }\n return `<:${constructorName}>:${objectName}`;\n },\n };\n stringifiers['hashable'] = str._hashable.bind(stringifiers);\n if (trimOptions.string) {\n stringifiers['string'] = coerceOptions.string\n ? str._stringTrimCoerce.bind(stringifiers)\n : str._stringTrim.bind(stringifiers);\n }\n else {\n stringifiers['string'] = coerceOptions.string\n ? str._stringCoerce.bind(stringifiers)\n : str._string.bind(stringifiers);\n }\n stringifiers['number'] = coerceOptions.number\n ? str._numberCoerce.bind(stringifiers)\n : str._number.bind(stringifiers);\n stringifiers['bigint'] = coerceOptions.bigint\n ? str._bigIntCoerce.bind(stringifiers)\n : str._bigInt.bind(stringifiers);\n stringifiers['boolean'] = coerceOptions.boolean\n ? str._booleanCoerce.bind(stringifiers)\n : str._boolean.bind(stringifiers);\n stringifiers['symbol'] = coerceOptions.symbol\n ? str._symbolCoerce.bind(stringifiers)\n : str._symbol.bind(stringifiers);\n stringifiers['undefined'] = coerceOptions.undefined\n ? str._undefinedCoerce.bind(stringifiers)\n : str._undefined.bind(stringifiers);\n stringifiers['null'] = coerceOptions.null\n ? str._nullCoerce.bind(stringifiers)\n : str._null.bind(stringifiers);\n if (trimOptions.function) {\n stringifiers['function'] = coerceOptions.function\n ? str._functionTrimCoerce.bind(stringifiers)\n : str._functionTrim.bind(stringifiers);\n }\n else {\n stringifiers['function'] = coerceOptions.function\n ? str._functionCoerce.bind(stringifiers)\n : str._function.bind(stringifiers);\n }\n stringifiers['date'] = coerceOptions.date\n ? str._dateCoerce.bind(stringifiers)\n : str._date.bind(stringifiers);\n stringifiers['array'] = sortOptions.array\n ? str._arraySort.bind(stringifiers)\n : str._array.bind(stringifiers);\n stringifiers['typedarray'] = sortOptions.typedArray\n ? str._typedArraySort.bind(stringifiers)\n : str._typedArray.bind(stringifiers);\n if (sortOptions.set) {\n stringifiers['set'] = coerceOptions.set\n ? str._setSortCoerce.bind(stringifiers)\n : str._setSort.bind(stringifiers);\n }\n else {\n stringifiers['set'] = coerceOptions.set\n ? str._setCoerce.bind(stringifiers)\n : str._set.bind(stringifiers);\n }\n stringifiers['object'] = sortOptions.object\n ? str._objectSort.bind(stringifiers)\n : str._object.bind(stringifiers);\n stringifiers['map'] = sortOptions.map\n ? str._mapSort.bind(stringifiers)\n : str._map.bind(stringifiers);\n /**\n * Serializes object to string\n * @param obj object\n */\n function objectToString(obj) {\n return stringifiers[(0, typeGuess_1.guessType)(obj)](obj);\n }\n return objectToString;\n};\nexports.objectSorter = objectSorter;\n//# sourceMappingURL=objectSorter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hasher = void 0;\nconst crypto_1 = require(\"crypto\");\nconst objectSorter_1 = require(\"./objectSorter\");\n/**\n * Default hash algorithm\n */\nconst DEFAULT_ALG = 'sha256';\n/**\n * Default hash string enoding\n */\nconst DEFAULT_ENC = 'hex';\n/**\n * Hasher constructor\n * @param options hasher options\n * @return hasher instance\n */\nconst hasher = (options) => {\n const sortObject = (0, objectSorter_1.objectSorter)(options);\n /**\n * Object hash function\n * @param obj object to hash\n * @param opts hasher options\n * @returns hash string\n */\n const hash = (obj, opts) => {\n const alg = opts?.alg || options?.alg || DEFAULT_ALG;\n const enc = opts?.enc || options?.enc || DEFAULT_ENC;\n const sorted = sortObject(obj);\n return (0, crypto_1.createHash)(alg).update(sorted).digest(enc);\n };\n return {\n hash,\n sort: sortObject,\n sortObject,\n };\n};\nexports.hasher = hasher;\n//# sourceMappingURL=hasher.js.map","import { hasher } from \"node-object-hash\";\n\n/**\n * Hash function for creating consistent, deterministic hashes from JavaScript objects.\n * Used primarily for generating cache keys and ensuring object equality checks.\n *\n * @param obj - Any JavaScript object to hash\n * @returns String hash of the object\n */\nconst { hash } = hasher({\n\tsort: true, // Ensures consistent order for object properties\n\tcoerce: true, // Converts values to a consistent type (e.g., numbers to strings)\n});\n\nexport default hash;\n","import PQueue from \"p-queue\";\nimport type { CacheContainer, CachingOptions } from \"./cacheContainer.ts\";\nimport hash from \"./hash.ts\";\n\nconst revalidationQueues: Record<string, PQueue> = {};\n\ntype WithCacheOptions<Parameters, Result> = Partial<\n Omit<CachingOptions, \"calculateKey\" | \"isLazy\">\n> & {\n /** an optional prefix to prepend to the key */\n prefix?: string;\n /** an optional function to calculate a key based on the parameters of the wrapped function */\n calculateKey?: (input: Parameters) => string;\n /** an optional function that is called just before the result is stored to the storage */\n shouldStore?: (result: Awaited<Result>) => boolean;\n /**\n * caching strategy to use\n * - \"lazy\": cache is populated in the background after returning the result\n * - \"swr\": stale-while-revalidate, cache is returned if present and updated in the background\n * - \"eager\": cache is populated before returning the result\n * @default \"eager\"\n */\n strategy?: \"lazy\" | \"swr\" | \"eager\";\n /**\n * Concurrency for revalidation queue\n * @default 1\n */\n revalidationConcurrency?: number;\n};\n\n/**\n * wrapped function factory\n * @param container - cache container to create the fn for\n * @returns wrapping function\n */\nexport const withCacheFactory = (container: CacheContainer) => {\n /**\n * function wrapper\n * @param operation - the function to be wrapped\n * @param options - caching options\n * @returns wrapped operation\n */\n const withCache = <\n Parameters extends Array<unknown>,\n Result extends Promise<unknown>,\n >(\n operation: (...parameters: Parameters) => Result,\n options: WithCacheOptions<Parameters, Result> = {},\n ) => {\n return async (...parameters: Parameters): Promise<Result> => {\n const {\n calculateKey,\n strategy = \"eager\",\n revalidationConcurrency: concurrency = 1,\n ...rest\n } = options;\n const prefix = options.prefix ?? \"default\";\n const key = `${operation.name}:${prefix}:${\n calculateKey ? calculateKey(parameters) : hash(parameters)\n }` as const;\n\n const queueName = `${operation.name}:${prefix}` as const;\n\n revalidationQueues[queueName] =\n revalidationQueues[queueName] ??\n new PQueue({\n concurrency,\n });\n revalidationQueues[queueName].concurrency = concurrency;\n\n const cachedResponse = await container.getItem<Awaited<Result>>(key);\n\n const refreshedItem = async () => {\n const result = await operation(...parameters);\n if (!options.shouldStore || options.shouldStore(result)) {\n await container.setItem(key, result, {\n ...rest,\n isLazy: strategy === \"lazy\" || strategy === \"swr\",\n });\n }\n return result;\n };\n\n /**\n * Stale-While-Revalidate strategy\n * If the cached response is expired, we return it immediately and\n * revalidate in the background\n */\n if (strategy === \"swr\" && cachedResponse?.meta.expired) {\n if (\n !revalidationQueues[queueName].runningTasks.some(\n (t) => t.id === key && t.startTime,\n )\n ) {\n revalidationQueues[queueName].add(refreshedItem, {\n id: key,\n });\n }\n }\n\n if (cachedResponse) {\n return cachedResponse.content;\n }\n\n const result = await refreshedItem();\n return result;\n };\n };\n return withCache;\n};\n"],"x_google_ignoreList":[2,4,5,6,7,8,9,10,11,12,13],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boredland/node-ts-cache",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/boredland/node-ts-cache.git"
@@ -36,5 +36,8 @@
36
36
  },
37
37
  "engines": {
38
38
  "node": ">=22.0.0"
39
- }
39
+ },
40
+ "files": [
41
+ "dist"
42
+ ]
40
43
  }
@@ -1,27 +0,0 @@
1
- name: test and release
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- test:
11
- runs-on: ubuntu-latest
12
- strategy:
13
- matrix:
14
- node-version: [22.x, 24.x]
15
- steps:
16
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # tag=v5.5.0
17
- with:
18
- token: ${{ github.token }}
19
- fetch-depth: 0
20
- - name: setup node ${{ matrix.node-version }}
21
- uses: actions/setup-node@dda4788290998366da86b6a4f497909644397bb2 # tag=v6.6.0
22
- with:
23
- node-version: ${{ matrix.node-version }}
24
- cache: "npm"
25
- - run: npm i --prefer-offline
26
- - run: npm run build
27
- - run: npm run test
package/biome.json DELETED
@@ -1,50 +0,0 @@
1
- {
2
- "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json",
3
- "vcs": {
4
- "enabled": true,
5
- "clientKind": "git",
6
- "useIgnoreFile": true
7
- },
8
- "files": {
9
- "ignoreUnknown": false
10
- },
11
- "formatter": {
12
- "enabled": true,
13
- "indentStyle": "tab"
14
- },
15
- "linter": {
16
- "enabled": true,
17
- "rules": {
18
- "recommended": true,
19
- "correctness": {
20
- "useImportExtensions": "error",
21
- "noUnsafeOptionalChaining": "error"
22
- },
23
- "suspicious": {
24
- "noConsole": "error"
25
- },
26
- "nursery": {
27
- "noFloatingPromises": "error",
28
- "noMisusedPromises": "error"
29
- },
30
- "style": {
31
- "noUnusedTemplateLiteral": "error",
32
- "noProcessEnv": "error",
33
- "useThrowNewError": "error"
34
- }
35
- }
36
- },
37
- "javascript": {
38
- "formatter": {
39
- "quoteStyle": "double"
40
- }
41
- },
42
- "assist": {
43
- "enabled": true,
44
- "actions": {
45
- "source": {
46
- "organizeImports": "on"
47
- }
48
- }
49
- }
50
- }
package/renovate.json DELETED
@@ -1,37 +0,0 @@
1
- {
2
- "automerge": true,
3
- "enabled": true,
4
- "extends": [
5
- ":pinDependencies",
6
- ":dependencyDashboard",
7
- ":semanticPrefixFixDepsChoreOthers",
8
- ":semanticCommits",
9
- "group:monorepos",
10
- "group:recommended",
11
- "workarounds:all",
12
- "helpers:pinGitHubActionDigests"
13
- ],
14
- "labels": ["dependency"],
15
- "lockFileMaintenance": {
16
- "automerge": true,
17
- "enabled": true
18
- },
19
- "major": {
20
- "dependencyDashboardApproval": true
21
- },
22
- "npm": {
23
- "enabled": true
24
- },
25
- "github-actions": {
26
- "enabled": true
27
- },
28
- "packageRules": [
29
- {
30
- "automerge": true,
31
- "automergeStrategy": "squash",
32
- "matchUpdateTypes": ["digest", "minor", "patch", "pin"]
33
- }
34
- ],
35
- "prConcurrentLimit": 1,
36
- "semanticCommits": "enabled"
37
- }