mastercache
Version:
Multi-tier cache module for Node.js. Redis, Upstash, CloudfareKV, File, in-memory and others drivers
1 lines • 49.6 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/cache/get-set-handler.ts","../../../../../node_modules/.pnpm/async-mutex@0.5.0/node_modules/async-mutex/index.mjs","../../../src/cache/locks.ts","../../../src/events/cache/cache-hit.ts","../../../src/events/cache/cache-miss.ts","../../../src/events/cache/cache-cleared.ts","../../../src/events/cache/cache-deleted.ts","../../../src/events/cache/cache-written.ts","../../../src/events/bus/bus-message-received.ts","../../../src/events/bus/bus-message-published.ts","../../../src/events/index.ts","../../../../../node_modules/.pnpm/p-timeout@6.1.3/node_modules/p-timeout/index.js","../../../src/libs/exception.ts","../../../src/errors.ts","../../../src/cache/factory-runner.ts"],"sourcesContent":["import type { MutexInterface } from 'async-mutex';\n\nimport { Locks } from './locks';\nimport { events } from '../events/index';\nimport type { Factory } from '../types/helpers';\nimport { FactoryRunner } from './factory-runner';\nimport type { CacheEvent } from '../types/events';\nimport { E_FACTORY_SOFT_TIMEOUT } from '../errors';\nimport type { CacheStack } from './stack/cache-stack';\nimport type { CacheEntry } from './cache-entry/cache-entry';\nimport type { CacheStackWriter } from './stack/cache-stack-writer';\nimport type { CacheEntryOptions } from './cache-entry/cache-entry-options';\n\nexport class GetSetHandler {\n /**\n * A map that will hold active locks for each key\n */\n #locks = new Locks();\n #factoryRunner: FactoryRunner;\n\n constructor(\n protected stack: CacheStack,\n protected stackWriter: CacheStackWriter,\n ) {\n this.#factoryRunner = new FactoryRunner(this.stack, this.stackWriter, this.#locks);\n }\n\n get logger() {\n return this.stack.logger;\n }\n\n get emitter() {\n return this.stack.emitter;\n }\n\n /**\n * Emit a CacheEvent using the emitter\n */\n #emit(event: CacheEvent) {\n return this.stack.emitter.emit(event.name, event.toJSON());\n }\n\n /**\n * Refresh a cache item before it expires\n */\n async #earlyExpirationRefresh(key: string, factory: Factory, options: CacheEntryOptions) {\n this.logger.debug({ key, name: this.stack.name, opId: options.id }, 'try to early refresh');\n const lock = this.#locks.getOrCreateForKey(key);\n\n /**\n * If lock is already acquired, then just exit. We only want to run\n * the factory once, in background.\n */\n if (lock.isLocked()) {\n return;\n }\n\n await lock\n .runExclusive(async () => {\n this.logger.trace(\n { key, cache: this.stack.name, opId: options.id },\n 'acquired lock for refresh',\n );\n\n await this.stackWriter.set(key, await factory(), options);\n })\n .catch((error) => {\n const msg = 'factory error in early refresh';\n this.logger.error({ key, cache: this.stack.name, opId: options.id, error }, msg);\n\n throw error;\n });\n }\n\n /**\n * Returns a value from the local cache and emit a CacheHit event\n */\n #returnLocalCacheValue(\n key: string,\n item: CacheEntry,\n options: CacheEntryOptions,\n logMsg?: string,\n ) {\n const isLogicallyExpired = item.isLogicallyExpired();\n logMsg = logMsg ?? 'local cache hit';\n\n this.#emit(new events.CacheHit(key, item.getValue(), this.stack.name, isLogicallyExpired));\n this.logger.trace({ key, cache: this.stack.name, opId: options.id }, logMsg);\n\n return item.getValue();\n }\n\n /**\n * Returns a value from the remote cache and emit a CacheHit event\n */\n async #returnRemoteCacheValue(key: string, item: CacheEntry, options: CacheEntryOptions) {\n this.logger.trace({ key, cache: this.stack.name, opId: options.id }, 'remote cache hit');\n\n this.stack.l1?.set(key, item.serialize(), options);\n\n this.#emit(new events.CacheHit(key, item.getValue(), this.stack.name));\n return item.getValue();\n }\n\n /**\n * Try acquiring a lock for a key\n *\n * If we have a fallback value, grace period enabled, and a soft timeout configured\n * we will wait at most the soft timeout to acquire the lock\n */\n #acquireLock(key: string, hasFallback: boolean, options: CacheEntryOptions) {\n const lock = this.#locks.getOrCreateForKey(key, options.getApplicableLockTimeout(hasFallback));\n return lock.acquire();\n }\n\n #returnGracedValueOrThrow(\n key: string,\n item: CacheEntry | undefined,\n options: CacheEntryOptions,\n err: Error,\n ) {\n if (options.isGracePeriodEnabled && item) {\n return this.#returnLocalCacheValue(key, item, options, 'local cache hit (graced)');\n }\n\n throw err;\n }\n\n async #applyFallbackAndReturnGracedValue(\n key: string,\n item: CacheEntry,\n options: CacheEntryOptions,\n ) {\n if (options.gracePeriod.enabled && options.gracePeriod.fallbackDuration) {\n this.logger.trace(\n { key, cache: this.stack.name, opId: options.id },\n 'apply fallback duration',\n );\n\n this.stack.l1?.set(\n key,\n item.applyFallbackDuration(options.gracePeriod.fallbackDuration).serialize(),\n options,\n );\n }\n\n this.logger.trace({ key, cache: this.stack.name, opId: options.id }, 'returns stale value');\n this.#emit(new events.CacheHit(key, item.getValue(), this.stack.name, true));\n return item.getValue();\n }\n\n /**\n * Check if a cache item is not undefined and not logically expired\n */\n #isItemValid(item: CacheEntry | undefined): item is CacheEntry {\n return !!item && !item.isLogicallyExpired();\n }\n\n async handle(key: string, factory: Factory, options: CacheEntryOptions) {\n let localItem: CacheEntry | undefined;\n\n /**\n * First we check the local cache. If we have a valid item, just\n * returns it without acquiring a lock.\n */\n localItem = this.stack.l1?.get(key, options);\n if (this.#isItemValid(localItem)) {\n if (localItem?.isEarlyExpired()) this.#earlyExpirationRefresh(key, factory, options);\n return this.#returnLocalCacheValue(key, localItem, options);\n }\n\n /**\n * Since we didn't find a valid item in the local cache, we need to\n * check the remote cache, or invoke the factory.\n *\n * We acquire a lock to prevent a cache stampede.\n */\n let releaser: MutexInterface.Releaser;\n try {\n releaser = await this.#acquireLock(key, !!localItem, options);\n } catch (err) {\n return this.#returnGracedValueOrThrow(key, localItem, options, err);\n }\n\n this.logger.trace({ key, cache: this.stack.name, opId: options.id }, 'acquired lock');\n\n /**\n * We need to check the local cache again, because another process\n * could have written a value while we were waiting for the lock.\n */\n localItem = this.stack.l1?.get(key, options);\n if (this.#isItemValid(localItem)) {\n this.#locks.release(key, releaser);\n return this.#returnLocalCacheValue(key, localItem, options, 'local cache hit after lock');\n }\n\n /**\n * If local cache was empty, maybe there is something in the remote\n * cache. If we find a valid item, we save it in the local cache\n * and returns it.\n */\n const remoteItem = await this.stack.l2?.get(key, options);\n if (this.#isItemValid(remoteItem)) {\n this.#locks.release(key, releaser);\n return this.#returnRemoteCacheValue(key, remoteItem, options);\n }\n\n try {\n const hasFallback = !!localItem || !!remoteItem;\n return await this.#factoryRunner.run(key, factory, hasFallback, options, releaser);\n } catch (err) {\n /**\n * If we hitted a soft timeout and we have a graced value, returns it\n */\n const staleItem = remoteItem ?? localItem;\n if (err instanceof E_FACTORY_SOFT_TIMEOUT && staleItem) {\n return this.#returnGracedValueOrThrow(key, staleItem, options, err);\n }\n\n /**\n * Otherwise, that means we had a factory error. If we have a graced\n * value, returns it\n */\n this.logger.trace(\n { key, cache: this.stack.name, opId: options.id, error: err },\n 'factory error',\n );\n\n if (staleItem && options.isGracePeriodEnabled) {\n this.#locks.release(key, releaser);\n return this.#applyFallbackAndReturnGracedValue(key, staleItem, options);\n }\n\n this.#locks.release(key, releaser);\n throw err;\n }\n }\n}\n","const E_TIMEOUT = new Error('timeout while waiting for mutex to become available');\nconst E_ALREADY_LOCKED = new Error('mutex already locked');\nconst E_CANCELED = new Error('request for lock canceled');\n\nvar __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Semaphore {\n constructor(_value, _cancelError = E_CANCELED) {\n this._value = _value;\n this._cancelError = _cancelError;\n this._queue = [];\n this._weightedWaiters = [];\n }\n acquire(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n return new Promise((resolve, reject) => {\n const task = { resolve, reject, weight, priority };\n const i = findIndexFromEnd(this._queue, (other) => priority <= other.priority);\n if (i === -1 && weight <= this._value) {\n // Needs immediate dispatch, skip the queue\n this._dispatchItem(task);\n }\n else {\n this._queue.splice(i + 1, 0, task);\n }\n });\n }\n runExclusive(callback_1) {\n return __awaiter$2(this, arguments, void 0, function* (callback, weight = 1, priority = 0) {\n const [value, release] = yield this.acquire(weight, priority);\n try {\n return yield callback(value);\n }\n finally {\n release();\n }\n });\n }\n waitForUnlock(weight = 1, priority = 0) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n if (this._couldLockImmediately(weight, priority)) {\n return Promise.resolve();\n }\n else {\n return new Promise((resolve) => {\n if (!this._weightedWaiters[weight - 1])\n this._weightedWaiters[weight - 1] = [];\n insertSorted(this._weightedWaiters[weight - 1], { resolve, priority });\n });\n }\n }\n isLocked() {\n return this._value <= 0;\n }\n getValue() {\n return this._value;\n }\n setValue(value) {\n this._value = value;\n this._dispatchQueue();\n }\n release(weight = 1) {\n if (weight <= 0)\n throw new Error(`invalid weight ${weight}: must be positive`);\n this._value += weight;\n this._dispatchQueue();\n }\n cancel() {\n this._queue.forEach((entry) => entry.reject(this._cancelError));\n this._queue = [];\n }\n _dispatchQueue() {\n this._drainUnlockWaiters();\n while (this._queue.length > 0 && this._queue[0].weight <= this._value) {\n this._dispatchItem(this._queue.shift());\n this._drainUnlockWaiters();\n }\n }\n _dispatchItem(item) {\n const previousValue = this._value;\n this._value -= item.weight;\n item.resolve([previousValue, this._newReleaser(item.weight)]);\n }\n _newReleaser(weight) {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n this.release(weight);\n };\n }\n _drainUnlockWaiters() {\n if (this._queue.length === 0) {\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n waiters.forEach((waiter) => waiter.resolve());\n this._weightedWaiters[weight - 1] = [];\n }\n }\n else {\n const queuedPriority = this._queue[0].priority;\n for (let weight = this._value; weight > 0; weight--) {\n const waiters = this._weightedWaiters[weight - 1];\n if (!waiters)\n continue;\n const i = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);\n (i === -1 ? waiters : waiters.splice(0, i))\n .forEach((waiter => waiter.resolve()));\n }\n }\n }\n _couldLockImmediately(weight, priority) {\n return (this._queue.length === 0 || this._queue[0].priority < priority) &&\n weight <= this._value;\n }\n}\nfunction insertSorted(a, v) {\n const i = findIndexFromEnd(a, (other) => v.priority <= other.priority);\n a.splice(i + 1, 0, v);\n}\nfunction findIndexFromEnd(a, predicate) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (predicate(a[i])) {\n return i;\n }\n }\n return -1;\n}\n\nvar __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Mutex {\n constructor(cancelError) {\n this._semaphore = new Semaphore(1, cancelError);\n }\n acquire() {\n return __awaiter$1(this, arguments, void 0, function* (priority = 0) {\n const [, releaser] = yield this._semaphore.acquire(1, priority);\n return releaser;\n });\n }\n runExclusive(callback, priority = 0) {\n return this._semaphore.runExclusive(() => callback(), 1, priority);\n }\n isLocked() {\n return this._semaphore.isLocked();\n }\n waitForUnlock(priority = 0) {\n return this._semaphore.waitForUnlock(1, priority);\n }\n release() {\n if (this._semaphore.isLocked())\n this._semaphore.release();\n }\n cancel() {\n return this._semaphore.cancel();\n }\n}\n\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nfunction withTimeout(sync, timeout, timeoutError = E_TIMEOUT) {\n return {\n acquire: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let isTimeout = false;\n const handle = setTimeout(() => {\n isTimeout = true;\n reject(timeoutError);\n }, timeout);\n try {\n const ticket = yield (isSemaphore(sync)\n ? sync.acquire(weight, priority)\n : sync.acquire(priority));\n if (isTimeout) {\n const release = Array.isArray(ticket) ? ticket[1] : ticket;\n release();\n }\n else {\n clearTimeout(handle);\n resolve(ticket);\n }\n }\n catch (e) {\n if (!isTimeout) {\n clearTimeout(handle);\n reject(e);\n }\n }\n }));\n },\n runExclusive(callback, weight, priority) {\n return __awaiter(this, void 0, void 0, function* () {\n let release = () => undefined;\n try {\n const ticket = yield this.acquire(weight, priority);\n if (Array.isArray(ticket)) {\n release = ticket[1];\n return yield callback(ticket[0]);\n }\n else {\n release = ticket;\n return yield callback();\n }\n }\n finally {\n release();\n }\n });\n },\n release(weight) {\n sync.release(weight);\n },\n cancel() {\n return sync.cancel();\n },\n waitForUnlock: (weightOrPriority, priority) => {\n let weight;\n if (isSemaphore(sync)) {\n weight = weightOrPriority;\n }\n else {\n weight = undefined;\n priority = weightOrPriority;\n }\n if (weight !== undefined && weight <= 0) {\n throw new Error(`invalid weight ${weight}: must be positive`);\n }\n return new Promise((resolve, reject) => {\n const handle = setTimeout(() => reject(timeoutError), timeout);\n (isSemaphore(sync)\n ? sync.waitForUnlock(weight, priority)\n : sync.waitForUnlock(priority)).then(() => {\n clearTimeout(handle);\n resolve();\n });\n });\n },\n isLocked: () => sync.isLocked(),\n getValue: () => sync.getValue(),\n setValue: (value) => sync.setValue(value),\n };\n}\nfunction isSemaphore(sync) {\n return sync.getValue !== undefined;\n}\n\n// eslint-disable-next-lisne @typescript-eslint/explicit-module-boundary-types\nfunction tryAcquire(sync, alreadyAcquiredError = E_ALREADY_LOCKED) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return withTimeout(sync, 0, alreadyAcquiredError);\n}\n\nexport { E_ALREADY_LOCKED, E_CANCELED, E_TIMEOUT, Mutex, Semaphore, tryAcquire, withTimeout };\n","import { Mutex, withTimeout, type MutexInterface } from 'async-mutex';\n\nexport class Locks {\n /**\n * A map that will hold active locks for each key\n */\n #locks = new Map<string, MutexInterface>();\n\n /**\n * For a given key, get or create a new lock\n *\n * @param key Key to get or create a lock for\n * @param timeout Time to wait to acquire the lock\n */\n getOrCreateForKey(key: string, timeout?: number) {\n let lock = this.#locks.get(key);\n if (!lock) {\n lock = new Mutex();\n this.#locks.set(key, lock);\n }\n\n return timeout ? withTimeout(lock, timeout) : lock;\n }\n\n release(key: string, releaser: MutexInterface.Releaser) {\n releaser();\n this.#locks.delete(key);\n }\n}\n","import type { CacheEvent } from '../../types/main';\n\n/**\n * Event emitted when a cache entry is hit\n */\nexport class CacheHit implements CacheEvent {\n name = 'cache:hit' as const;\n\n constructor(\n readonly key: string,\n readonly value: any,\n readonly store: string,\n readonly graced: boolean = false,\n ) {}\n\n toJSON() {\n return {\n key: this.key,\n value: this.value,\n store: this.store,\n graced: this.graced,\n };\n }\n}\n","import type { CacheEvent } from '../../types/main';\n\n/**\n * Event emitted when a cache entry is missed\n */\nexport class CacheMiss implements CacheEvent {\n name = 'cache:miss' as const;\n\n constructor(\n readonly key: string,\n readonly store: string,\n ) {}\n\n toJSON() {\n return {\n key: this.key,\n store: this.store,\n };\n }\n}\n","import type { CacheEvent } from '../../types/main';\n\n/**\n * Event emitted when a cache store is cleared\n * using `.clear()`\n */\nexport class CacheCleared implements CacheEvent {\n name = 'cache:cleared' as const;\n\n constructor(readonly store: string) {}\n\n toJSON() {\n return {\n store: this.store,\n };\n }\n}\n","import type { CacheEvent } from '../../types/main';\n\n/**\n * Event emitted when a cache entry is deleted\n * using `.delete()` or `.deleteMany()`\n */\nexport class CacheDeleted implements CacheEvent {\n name = 'cache:deleted' as const;\n\n constructor(\n readonly key: string,\n readonly store: string,\n ) {}\n\n toJSON() {\n return {\n key: this.key,\n store: this.store,\n };\n }\n}\n","import type { CacheEvent } from '../../types/main';\n\n/**\n * Event emitted when a cache entry is written\n * using `set`,`getOrSet`\n */\nexport class CacheWritten implements CacheEvent {\n name = 'cache:written' as const;\n\n constructor(\n readonly key: string,\n readonly value: any,\n readonly store: string,\n ) {}\n\n toJSON() {\n return {\n key: this.key,\n store: this.store,\n value: this.value,\n };\n }\n}\n","import type { CacheBusMessage, CacheEvent } from '../../types/main';\n\n/**\n * Event when the bus receives a message\n */\nexport class BusMessageReceived implements CacheEvent {\n name = 'bus:message:received' as const;\n\n constructor(readonly message: CacheBusMessage) {}\n\n toJSON() {\n return {\n keys: this.message.keys,\n type: this.message.type,\n };\n }\n}\n","import type { CacheBusMessage, CacheEvent } from '../../types/main';\n\n/**\n * Event when the bus publishes a message\n */\nexport class BusMessagePublished implements CacheEvent {\n name = 'bus:message:published' as const;\n\n constructor(readonly message: CacheBusMessage) {}\n\n toJSON() {\n return {\n keys: this.message.keys,\n type: this.message.type,\n };\n }\n}\n","import { CacheHit } from './cache/cache-hit';\nimport { CacheMiss } from './cache/cache-miss';\nimport { CacheCleared } from './cache/cache-cleared';\nimport { CacheDeleted } from './cache/cache-deleted';\nimport { CacheWritten } from './cache/cache-written';\nimport { BusMessageReceived } from './bus/bus-message-received';\nimport { BusMessagePublished } from './bus/bus-message-published';\n\nexport const events = {\n BusMessagePublished,\n BusMessageReceived,\n CacheHit,\n CacheMiss,\n CacheCleared,\n CacheDeleted,\n CacheWritten,\n};\n","export class TimeoutError extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = 'TimeoutError';\n\t}\n}\n\n/**\nAn error to be thrown when the request is aborted by AbortController.\nDOMException is thrown instead of this Error when DOMException is available.\n*/\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\n/**\nTODO: Remove AbortError and just throw DOMException when targeting Node 18.\n*/\nconst getDOMException = errorMessage => globalThis.DOMException === undefined\n\t? new AbortError(errorMessage)\n\t: new DOMException(errorMessage);\n\n/**\nTODO: Remove below function and just 'reject(signal.reason)' when targeting Node 18.\n*/\nconst getAbortedReason = signal => {\n\tconst reason = signal.reason === undefined\n\t\t? getDOMException('This operation was aborted.')\n\t\t: signal.reason;\n\n\treturn reason instanceof Error ? reason : getDOMException(reason);\n};\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} = options;\n\n\tlet timer;\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 (options.signal) {\n\t\t\tconst {signal} = options;\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t}\n\n\t\t\tconst abortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\n\t\t\tpromise.finally(() => {\n\t\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t\t});\n\t\t}\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\tpromise.then(resolve, reject);\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\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\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tresolve(await promise);\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t})();\n\t});\n\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n","/*\n * @poppinss/utils\n *\n * (c) Poppinss\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { format } from 'node:util';\n\n/**\n * Extended Error object with the option to set error `status` and `code`.\n * At AdonisJs, we prefer exceptions with proper error codes to handle\n * them without relying on message pattern matching.\n *\n * ```js\n * new Exception('message', 500, 'E_RUNTIME_EXCEPTION')\n * ```\n */\nexport class Exception extends Error {\n /**\n * Static properties to defined on the exception once\n * and then re-use them\n */\n declare static help?: string;\n declare static code?: string;\n declare static status?: number;\n declare static message?: string;\n\n /**\n * Name of the class that raised the exception.\n */\n name: string;\n\n /**\n * Optional help description for the error. You can use it to define additional\n * human readable information for the error.\n */\n declare help?: string;\n\n /**\n * A machine readable error code. This will allow the error handling logic\n * to narrow down exceptions based upon the error code.\n */\n declare code?: string;\n\n /**\n * A status code for the error. Usually helpful when converting errors\n * to HTTP responses.\n */\n status: number;\n\n constructor(message?: string, options?: ErrorOptions & { code?: string; status?: number }) {\n super(message, options);\n\n const ErrorConstructor = this.constructor as typeof Exception;\n\n this.name = ErrorConstructor.name;\n this.message = message || ErrorConstructor.message || '';\n this.status = options?.status || ErrorConstructor.status || 500;\n\n const code = options?.code || ErrorConstructor.code;\n if (code !== undefined) {\n this.code = code;\n }\n\n const help = ErrorConstructor.help;\n if (help !== undefined) {\n this.help = help;\n }\n\n Error.captureStackTrace(this, ErrorConstructor);\n }\n\n get [Symbol.toStringTag]() {\n return this.constructor.name;\n }\n\n toString() {\n if (this.code) {\n return `${this.name} [${this.code}]: ${this.message}`;\n }\n return `${this.name}: ${this.message}`;\n }\n}\n\n/**\n * Helper to create anonymous error classes\n */\nexport function createError<T extends any[] = never>(\n message: string,\n code: string,\n status?: number\n): typeof Exception & T extends never\n ? { new (args?: any, options?: ErrorOptions): Exception }\n : { new (args: T, options?: ErrorOptions): Exception } {\n return class extends Exception {\n static message = message;\n static code = code;\n static status = status;\n\n constructor(args: T, options?: ErrorOptions) {\n super(format(message, ...(args || [])), options);\n this.name = 'Exception';\n }\n };\n}","import { createError } from './libs/exception';\n\nexport const E_FACTORY_SOFT_TIMEOUT = createError(\n 'Factory has timed out after waiting for soft timeout',\n 'E_FACTORY_SOFT_TIMEOUT',\n);\n\nexport const E_FACTORY_HARD_TIMEOUT = createError(\n 'Factory has timed out after waiting for hard timeout',\n 'E_FACTORY_HARD_TIMEOUT',\n);\n","import pTimeout from 'p-timeout';\nimport type { MutexInterface } from 'async-mutex';\n\nimport type { Locks } from './locks';\nimport * as exceptions from '../errors';\nimport { events } from '../events/index';\nimport type { CacheStack } from './stack/cache-stack';\nimport type { GetSetFactory } from '../types/helpers';\nimport type { CacheStackWriter } from './stack/cache-stack-writer';\nimport type { CacheEntryOptions } from './cache-entry/cache-entry-options';\n\n/**\n * Factory Runner is responsible for executing factories\n */\nexport class FactoryRunner {\n #stack: CacheStack;\n #stackWriter: CacheStackWriter;\n #locks: Locks;\n\n constructor(stack: CacheStack, stackWriter: CacheStackWriter, locks: Locks) {\n this.#stack = stack;\n this.#stackWriter = stackWriter;\n this.#locks = locks;\n }\n\n async saveBackgroundFactoryResult(\n key: string,\n factoryResult: unknown,\n options: CacheEntryOptions,\n lockReleaser: MutexInterface.Releaser,\n ) {\n await this.#stackWriter.set(key, factoryResult, options);\n this.#locks.release(key, lockReleaser);\n }\n\n async writeFactoryResult(\n key: string,\n item: unknown,\n options: CacheEntryOptions,\n lockReleaser: MutexInterface.Releaser,\n ) {\n await this.#stackWriter.set(key, item, options);\n\n this.#stack.emit(new events.CacheMiss(key, this.#stack.name));\n this.#stack.logger.trace({ key, cache: this.#stack.name, opId: options.id }, 'cache miss');\n this.#locks.release(key, lockReleaser);\n }\n\n async run(\n key: string,\n factory: GetSetFactory,\n hasFallback: boolean,\n options: CacheEntryOptions,\n lockReleaser: MutexInterface.Releaser,\n ) {\n const timeoutDuration = options.factoryTimeout(hasFallback);\n const timeoutException =\n timeoutDuration === options.timeouts?.hard\n ? exceptions.E_FACTORY_HARD_TIMEOUT\n : exceptions.E_FACTORY_SOFT_TIMEOUT;\n\n const promisifiedFactory = async () => {\n return await factory({ setTtl: (ttl) => options.setLogicalTtl(ttl) });\n };\n\n const factoryPromise = promisifiedFactory();\n\n const factoryResult = await pTimeout(factoryPromise, {\n milliseconds: timeoutDuration ?? Number.POSITIVE_INFINITY,\n fallback: async () => {\n factoryPromise\n .then((result) => this.saveBackgroundFactoryResult(key, result, options, lockReleaser))\n .catch(() => {})\n .finally(() => this.#locks.release(key, lockReleaser));\n\n throw new timeoutException();\n },\n });\n\n await this.writeFactoryResult(key, factoryResult, options, lockReleaser);\n return factoryResult;\n }\n}\n"],"mappings":"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","names":[]}