@warlock.js/cache 4.0.42 → 4.0.46

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.
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../warlock.js/cache/src/types.ts","../../../../../../../warlock.js/cache/src/cache-manager.ts","../../../../../../../warlock.js/cache/src/tagged-cache.ts","../../../../../../../warlock.js/cache/src/utils.ts","../../../../../../../warlock.js/cache/src/drivers/base-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/file-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/lru-memory-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/memory-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/memory-extended-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/null-cache-driver.ts","../../../../../../../warlock.js/cache/src/drivers/redis-cache-driver.ts"],"names":["rtrim","CACHE_FOR","log","removeDirectoryAsync","path","ensureDirectoryAsync","putJsonFileAsync","getJsonFileAsync","unset","get","set"],"mappings":"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","file":"index.js","sourcesContent":["import type { GenericObject } from \"@mongez/reinforcements\";\r\nimport type { RedisClientOptions } from \"redis\";\r\nimport type {\r\n BaseCacheDriver,\r\n FileCacheDriver,\r\n LRUMemoryCacheDriver,\r\n MemoryCacheDriver,\r\n MemoryExtendedCacheDriver,\r\n NullCacheDriver,\r\n RedisCacheDriver,\r\n} from \"./drivers\";\r\n\r\n/**\r\n * Base error class for cache-related errors\r\n */\r\nexport class CacheError extends Error {\r\n public constructor(message: string) {\r\n super(message);\r\n this.name = \"CacheError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when cache connection fails\r\n */\r\nexport class CacheConnectionError extends CacheError {\r\n public constructor(message: string) {\r\n super(message);\r\n this.name = \"CacheConnectionError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when cache driver configuration is invalid\r\n */\r\nexport class CacheConfigurationError extends CacheError {\r\n public constructor(message: string) {\r\n super(message);\r\n this.name = \"CacheConfigurationError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when cache driver is not initialized\r\n */\r\nexport class CacheDriverNotInitializedError extends CacheError {\r\n public constructor(\r\n message: string = \"No cache driver initialized. Call cache.init() or cache.use() first.\",\r\n ) {\r\n super(message);\r\n this.name = \"CacheDriverNotInitializedError\";\r\n }\r\n}\r\n\r\n/**\r\n * Cache key type - can be a string or an object\r\n */\r\nexport type CacheKey = string | GenericObject;\r\n\r\nexport type CacheOperationType =\r\n | \"fetching\"\r\n | \"fetched\"\r\n | \"caching\"\r\n | \"cached\"\r\n | \"flushing\"\r\n | \"flushed\"\r\n | \"removing\"\r\n | \"removed\"\r\n | \"clearing\"\r\n | \"cleared\"\r\n | \"expired\"\r\n | \"notFound\"\r\n | \"connecting\"\r\n | \"error\"\r\n | \"connected\"\r\n | \"disconnecting\"\r\n | \"disconnected\";\r\n\r\n/**\r\n * Cache event types for observability\r\n */\r\nexport type CacheEventType =\r\n | \"hit\"\r\n | \"miss\"\r\n | \"set\"\r\n | \"removed\"\r\n | \"flushed\"\r\n | \"expired\"\r\n | \"connected\"\r\n | \"disconnected\"\r\n | \"error\";\r\n\r\n/**\r\n * Cache event data structure\r\n */\r\nexport type CacheEventData = {\r\n /**\r\n * The cache key involved in the event\r\n */\r\n key?: string;\r\n /**\r\n * The value (for set/hit events)\r\n */\r\n value?: any;\r\n /**\r\n * TTL in seconds (for set events)\r\n */\r\n ttl?: number;\r\n /**\r\n * Driver name that emitted the event\r\n */\r\n driver: string;\r\n /**\r\n * Error object (for error events)\r\n */\r\n error?: any;\r\n /**\r\n * Namespace (for namespace operations)\r\n */\r\n namespace?: string;\r\n};\r\n\r\n/**\r\n * Event handler function type\r\n */\r\nexport type CacheEventHandler = (\r\n eventData: CacheEventData,\r\n) => void | Promise<void>;\r\n\r\n/**\r\n * Tagged cache interface for working with cache tags\r\n */\r\nexport interface TaggedCacheDriver {\r\n /**\r\n * Set a value in cache with tags\r\n */\r\n set(key: CacheKey, value: any, ttl?: number): Promise<any>;\r\n /**\r\n * Get a value from cache (checks tags)\r\n */\r\n get(key: CacheKey): Promise<any | null>;\r\n /**\r\n * Remove a specific key\r\n */\r\n remove(key: CacheKey): Promise<void>;\r\n /**\r\n * Invalidate (clear) all keys associated with the current tags\r\n */\r\n invalidate(): Promise<void>;\r\n /**\r\n * Flush all keys associated with the current tags\r\n * @deprecated Use invalidate() instead\r\n */\r\n flush(): Promise<void>;\r\n /**\r\n * Check if a key exists\r\n */\r\n has(key: CacheKey): Promise<boolean>;\r\n /**\r\n * Remember pattern with tags\r\n */\r\n remember(\r\n key: CacheKey,\r\n ttl: number,\r\n callback: () => Promise<any>,\r\n ): Promise<any>;\r\n /**\r\n * Pull value with tags\r\n */\r\n pull(key: CacheKey): Promise<any | null>;\r\n /**\r\n * Forever with tags\r\n */\r\n forever(key: CacheKey, value: any): Promise<any>;\r\n /**\r\n * Increment with tags\r\n */\r\n increment(key: CacheKey, value?: number): Promise<number>;\r\n /**\r\n * Decrement with tags\r\n */\r\n decrement(key: CacheKey, value?: number): Promise<number>;\r\n}\r\n\r\nexport type MemoryCacheOptions = {\r\n /**\r\n * The global prefix for the cache key\r\n */\r\n globalPrefix?: string | (() => string);\r\n /**\r\n * The default TTL for the cache in seconds\r\n *\r\n * @default Infinity\r\n */\r\n ttl?: number;\r\n /**\r\n * Maximum number of items in cache\r\n * When exceeded, least recently used items will be evicted\r\n *\r\n * @default undefined (no limit)\r\n */\r\n maxSize?: number;\r\n};\r\n\r\nexport type MemoryExtendedCacheOptions = MemoryCacheOptions;\r\n\r\nexport type LRUMemoryCacheOptions = {\r\n /**\r\n * The maximum number of items in the cache\r\n *\r\n * @default 1000\r\n */\r\n capacity?: number;\r\n};\r\n\r\nexport type FileCacheOptions = {\r\n /**\r\n * The global prefix for the cache key\r\n */\r\n globalPrefix?: string | (() => string);\r\n /**\r\n * The default TTL for the cache in seconds\r\n *\r\n * @default 0\r\n */\r\n ttl?: number;\r\n /**\r\n * Storage cache directory\r\n *\r\n * @default storagePath(\"cache\")\r\n */\r\n directory: string | (() => string);\r\n /**\r\n * File name\r\n *\r\n * @default cache.json\r\n */\r\n fileName?: string | (() => string);\r\n};\r\n\r\nexport type RedisOptions = {\r\n /**\r\n * Redis Port\r\n *\r\n * @default 6379\r\n */\r\n port?: number;\r\n /**\r\n * Redis Host\r\n */\r\n host?: string;\r\n /**\r\n * Redis Username\r\n */\r\n username?: string;\r\n /**\r\n * Redis Password\r\n */\r\n password?: string;\r\n /**\r\n * Redis URL\r\n *\r\n * If used, it will override the host and port options\r\n */\r\n url?: string;\r\n /**\r\n * Global prefix for the cache key\r\n */\r\n globalPrefix?: string | (() => string);\r\n /**\r\n * Time to live in seconds\r\n *\r\n * @default Infinity\r\n */\r\n ttl?: number;\r\n /**\r\n * Redis client options\r\n */\r\n clientOptions?: RedisClientOptions;\r\n};\r\n\r\nexport type NullCacheDriverOptions = GenericObject;\r\n\r\nexport interface CacheDriver<ClientType, Options> {\r\n /**\r\n * The cache driver options\r\n */\r\n options: Options;\r\n /**\r\n * Cache driver name\r\n */\r\n name: string;\r\n /**\r\n * Remove all cached items by namespace\r\n */\r\n removeNamespace(namespace: string): Promise<any>;\r\n /**\r\n * Set the cache driver options\r\n */\r\n setOptions(options: Options): any;\r\n /**\r\n * Parse the key to be used in the cache\r\n */\r\n parseKey(key: CacheKey): string;\r\n /**\r\n * Set a value in the cache\r\n *\r\n * @param key The cache key, could be an object or string\r\n * @param value The value to be stored in the cache\r\n * @param ttl The time to live in seconds\r\n */\r\n set(key: CacheKey, value: any, ttl?: number): Promise<any>;\r\n /**\r\n * Get a value from the cache\r\n */\r\n get(key: CacheKey): Promise<any | null>;\r\n /**\r\n * Remove a value from the cache\r\n */\r\n remove(key: CacheKey): Promise<void>;\r\n /**\r\n * Flush the entire cache\r\n */\r\n flush(): Promise<void>;\r\n /**\r\n * Connect to the cache driver\r\n */\r\n connect(): Promise<any>;\r\n /**\r\n * The cache client\r\n */\r\n client?: ClientType;\r\n /**\r\n * Disconnect the cache driver\r\n */\r\n disconnect(): Promise<void>;\r\n /**\r\n * Check if a key exists in the cache without fetching its value\r\n */\r\n has(key: CacheKey): Promise<boolean>;\r\n /**\r\n * Get value from cache or execute callback and cache the result\r\n *\r\n * @param key The cache key\r\n * @param ttl Time to live in seconds\r\n * @param callback Function to execute if cache miss\r\n */\r\n remember(\r\n key: CacheKey,\r\n ttl: number,\r\n callback: () => Promise<any>,\r\n ): Promise<any>;\r\n /**\r\n * Get value and remove it from cache (atomic operation)\r\n */\r\n pull(key: CacheKey): Promise<any | null>;\r\n /**\r\n * Set a value in cache permanently (no expiration)\r\n */\r\n forever(key: CacheKey, value: any): Promise<any>;\r\n /**\r\n * Increment a numeric value in cache\r\n *\r\n * @param key The cache key\r\n * @param value The value to increment by (default 1)\r\n */\r\n increment(key: CacheKey, value?: number): Promise<number>;\r\n /**\r\n * Decrement a numeric value in cache\r\n *\r\n * @param key The cache key\r\n * @param value The value to decrement by (default 1)\r\n */\r\n decrement(key: CacheKey, value?: number): Promise<number>;\r\n /**\r\n * Get multiple values from cache at once\r\n */\r\n many(keys: CacheKey[]): Promise<any[]>;\r\n /**\r\n * Set multiple values in cache at once\r\n */\r\n setMany(items: Record<string, any>, ttl?: number): Promise<void>;\r\n /**\r\n * Register an event listener\r\n */\r\n on(event: CacheEventType, handler: CacheEventHandler): this;\r\n /**\r\n * Remove an event listener\r\n */\r\n off(event: CacheEventType, handler: CacheEventHandler): this;\r\n /**\r\n * Register a one-time event listener\r\n */\r\n once(event: CacheEventType, handler: CacheEventHandler): this;\r\n /**\r\n * Set if not exists (atomic operation)\r\n * Returns true if key was set, false if key already existed\r\n * Note: Not all drivers support this operation\r\n */\r\n setNX?(key: CacheKey, value: any, ttl?: number): Promise<boolean>;\r\n /**\r\n * Create a tagged cache instance for the given tags\r\n */\r\n tags(tags: string[]): TaggedCacheDriver;\r\n}\r\n\r\nexport type CacheData = {\r\n /**\r\n * Value stored in the cache\r\n */\r\n data: any;\r\n /**\r\n * The expiration date in milliseconds\r\n */\r\n expiresAt?: number;\r\n /**\r\n * Time to live in seconds\r\n */\r\n ttl?: number;\r\n};\r\n\r\nexport type DriverClass = new () => CacheDriver<any, any>;\r\n\r\ntype DefaultDrivers =\r\n | \"redis\"\r\n | \"file\"\r\n | \"memory\"\r\n | \"memoryExtended\"\r\n | \"null\"\r\n | \"lru\";\r\n\r\ntype MergeWithDefaultDrivers<T> = T extends undefined\r\n ? DefaultDrivers\r\n : DefaultDrivers | T;\r\n\r\nexport type CacheConfigurations<\r\n T extends string | undefined = undefined,\r\n DriverName = MergeWithDefaultDrivers<T>,\r\n> = {\r\n /**\r\n * The default cache driver name\r\n */\r\n default?: DriverName;\r\n /**\r\n * The cache drivers list\r\n */\r\n drivers: {\r\n redis?: typeof RedisCacheDriver;\r\n file?: typeof FileCacheDriver;\r\n null?: typeof NullCacheDriver;\r\n memory?: typeof MemoryCacheDriver;\r\n memoryExtended?: typeof MemoryExtendedCacheDriver;\r\n lru?: typeof LRUMemoryCacheDriver;\r\n } & {\r\n [key in Extract<T, string>]?: typeof BaseCacheDriver<any, any> | undefined;\r\n };\r\n /**\r\n * The cache driver options\r\n */\r\n options: {\r\n redis?: RedisOptions;\r\n file?: FileCacheOptions;\r\n memory?: MemoryCacheOptions;\r\n memoryExtended?: MemoryExtendedCacheOptions;\r\n null?: NullCacheDriverOptions;\r\n lru?: LRUMemoryCacheOptions;\r\n } & {\r\n [key in Extract<T, string>]?: GenericObject;\r\n };\r\n};\r\n","import type {\r\n CacheConfigurations,\r\n CacheDriver,\r\n CacheEventHandler,\r\n CacheEventType,\r\n CacheKey,\r\n DriverClass,\r\n TaggedCacheDriver,\r\n} from \"./types\";\r\nimport {\r\n CacheConfigurationError,\r\n CacheDriverNotInitializedError,\r\n} from \"./types\";\r\n\r\nexport class CacheManager implements CacheDriver<any, any> {\r\n /**\r\n * Cache Driver\r\n */\r\n public currentDriver?: CacheDriver<any, any>;\r\n\r\n /**\r\n * Loaded drivers\r\n */\r\n public loadedDrivers: Record<string, CacheDriver<any, any>> = {};\r\n\r\n /**\r\n * Configurations list\r\n */\r\n protected configurations: CacheConfigurations = {\r\n drivers: {},\r\n options: {},\r\n };\r\n\r\n /**\r\n * Global event listeners\r\n */\r\n protected globalEventListeners: Map<CacheEventType, Set<CacheEventHandler>> =\r\n new Map();\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"cacheManager\";\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public get client() {\r\n return this.currentDriver?.client;\r\n }\r\n\r\n /**\r\n * Set the cache configurations\r\n */\r\n public setCacheConfigurations(configurations: CacheConfigurations) {\r\n this.configurations.default = configurations.default;\r\n this.configurations.drivers = configurations.drivers;\r\n this.configurations.options = configurations.options;\r\n }\r\n\r\n /**\r\n * Use the given driver\r\n */\r\n public async use(driver: string | CacheDriver<any, any>) {\r\n if (typeof driver === \"string\") {\r\n const driverInstance = await this.load(driver);\r\n\r\n if (!driverInstance) {\r\n throw new CacheConfigurationError(\r\n `Cache driver ${driver} is not found, please declare it in the cache drivers in the configurations list.`,\r\n );\r\n }\r\n\r\n driver = driverInstance;\r\n }\r\n\r\n // Attach global listeners to the new driver\r\n this.attachGlobalListeners(driver);\r\n\r\n this.currentDriver = driver;\r\n return this;\r\n }\r\n\r\n /**\r\n * Ensure driver is initialized before operations\r\n */\r\n protected ensureDriverInitialized(): void {\r\n if (!this.currentDriver) {\r\n throw new CacheDriverNotInitializedError();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.get(key);\r\n }\r\n\r\n /**\r\n * Set a value in the cache\r\n *\r\n * @param key The cache key, could be an object or string\r\n * @param value The value to be stored in the cache\r\n * @param ttl The time to live in seconds\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.set(key, value, ttl);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.remove(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async removeNamespace(namespace: string) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.removeNamespace(namespace);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async flush() {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.flush();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async connect() {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.connect();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public parseKey(key: CacheKey) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.parseKey(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public get options() {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.options;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public setOptions(options: Record<string, any>) {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.setOptions(options || {});\r\n }\r\n\r\n /**\r\n * Get an instance of the cache driver\r\n */\r\n public async driver(driverName: string) {\r\n return this.loadedDrivers[driverName] || (await this.load(driverName));\r\n }\r\n\r\n /**\r\n * Initialize the cache manager and pick the default driver\r\n */\r\n public async init() {\r\n const defaultCacheDriverName = this.configurations.default;\r\n\r\n if (!defaultCacheDriverName) {\r\n return;\r\n }\r\n\r\n const driver = await this.driver(defaultCacheDriverName);\r\n\r\n await this.use(driver);\r\n }\r\n\r\n /**\r\n * Load the given cache driver name\r\n */\r\n public async load(driver: string) {\r\n if (this.loadedDrivers[driver]) return this.loadedDrivers[driver];\r\n\r\n const Driver = this.configurations.drivers[\r\n driver as keyof typeof this.configurations.drivers\r\n ] as DriverClass | undefined;\r\n\r\n if (!Driver) {\r\n throw new CacheConfigurationError(\r\n `Cache driver ${driver} is not found, please declare it in the cache drivers in the configurations list.`,\r\n );\r\n }\r\n\r\n const driverInstance = new Driver();\r\n\r\n driverInstance.setOptions(\r\n this.configurations.options[\r\n driver as keyof typeof this.configurations.options\r\n ] || {},\r\n );\r\n\r\n await driverInstance.connect();\r\n\r\n // Attach global listeners to newly loaded driver\r\n this.attachGlobalListeners(driverInstance);\r\n\r\n this.loadedDrivers[driver] = driverInstance;\r\n\r\n return driverInstance as CacheDriver<any, any>;\r\n }\r\n\r\n /**\r\n * Register and bind a driver\r\n */\r\n public registerDriver(driverName: string, driverClass: DriverClass) {\r\n (this.configurations.drivers as Record<string, DriverClass>)[driverName] =\r\n driverClass;\r\n }\r\n\r\n /**\r\n * Disconnect the cache manager\r\n */\r\n public async disconnect() {\r\n if (this.currentDriver) {\r\n await this.currentDriver.disconnect();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async has(key: CacheKey): Promise<boolean> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.has(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remember(\r\n key: CacheKey,\r\n ttl: number,\r\n callback: () => Promise<any>,\r\n ): Promise<any> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.remember(key, ttl, callback);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async pull(key: CacheKey): Promise<any | null> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.pull(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async forever(key: CacheKey, value: any): Promise<any> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.forever(key, value);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async increment(key: CacheKey, value?: number): Promise<number> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.increment(key, value);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async decrement(key: CacheKey, value?: number): Promise<number> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.decrement(key, value);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async many(keys: CacheKey[]): Promise<any[]> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.many(keys);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async setMany(\r\n items: Record<string, any>,\r\n ttl?: number,\r\n ): Promise<void> {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.setMany(items, ttl);\r\n }\r\n\r\n /**\r\n * Register a global event listener (applies to all drivers)\r\n */\r\n public on(event: CacheEventType, handler: CacheEventHandler): this {\r\n if (!this.globalEventListeners.has(event)) {\r\n this.globalEventListeners.set(event, new Set());\r\n }\r\n this.globalEventListeners.get(event)!.add(handler);\r\n\r\n // Also attach to current driver if exists\r\n if (this.currentDriver) {\r\n this.currentDriver.on(event, handler);\r\n }\r\n\r\n // Attach to all loaded drivers\r\n for (const driver of Object.values(this.loadedDrivers)) {\r\n driver.on(event, handler);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a global event listener\r\n */\r\n public off(event: CacheEventType, handler: CacheEventHandler): this {\r\n const handlers = this.globalEventListeners.get(event);\r\n if (handlers) {\r\n handlers.delete(handler);\r\n }\r\n\r\n // Also remove from current driver\r\n if (this.currentDriver) {\r\n this.currentDriver.off(event, handler);\r\n }\r\n\r\n // Remove from all loaded drivers\r\n for (const driver of Object.values(this.loadedDrivers)) {\r\n driver.off(event, handler);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one-time global event listener\r\n */\r\n public once(event: CacheEventType, handler: CacheEventHandler): this {\r\n const onceHandler: CacheEventHandler = async data => {\r\n await handler(data);\r\n this.off(event, onceHandler);\r\n };\r\n return this.on(event, onceHandler);\r\n }\r\n\r\n /**\r\n * Attach global listeners to a driver\r\n */\r\n protected attachGlobalListeners(driver: CacheDriver<any, any>) {\r\n for (const [event, handlers] of this.globalEventListeners) {\r\n for (const handler of handlers) {\r\n driver.on(event, handler);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set if not exists (atomic operation)\r\n * Returns true if key was set, false if key already existed\r\n * Note: Only supported by drivers that implement setNX (e.g., Redis)\r\n */\r\n public async setNX(\r\n key: CacheKey,\r\n value: any,\r\n ttl?: number,\r\n ): Promise<boolean> {\r\n this.ensureDriverInitialized();\r\n\r\n if (!this.currentDriver!.setNX) {\r\n throw new Error(\r\n `setNX is not supported by the current cache driver: ${this.currentDriver!.name}`,\r\n );\r\n }\r\n\r\n return this.currentDriver!.setNX(key, value, ttl);\r\n }\r\n\r\n /**\r\n * Create a tagged cache instance for the given tags\r\n */\r\n public tags(tags: string[]): TaggedCacheDriver {\r\n this.ensureDriverInitialized();\r\n return this.currentDriver!.tags(tags);\r\n }\r\n}\r\n\r\nexport const cache = new CacheManager();\r\n","import type { CacheDriver, CacheKey, TaggedCacheDriver } from \"./types\";\r\n\r\n/**\r\n * Tagged Cache Wrapper\r\n * Wraps a cache driver to automatically manage tag relationships\r\n */\r\nexport class TaggedCache implements TaggedCacheDriver {\r\n /**\r\n * The tags associated with this tagged cache instance\r\n */\r\n protected cacheTags: string[];\r\n\r\n /**\r\n * The underlying cache driver\r\n */\r\n protected driver: CacheDriver<any, any>;\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(tags: string[], driver: CacheDriver<any, any>) {\r\n this.cacheTags = tags;\r\n this.driver = driver;\r\n }\r\n\r\n /**\r\n * Get the tag key prefix for storing tag-key relationships\r\n */\r\n protected tagKey(tag: string): string {\r\n return `cache:tags:${tag}`;\r\n }\r\n\r\n /**\r\n * Store tag-key relationship\r\n */\r\n protected async storeTaggedKey(key: string): Promise<void> {\r\n for (const tag of this.cacheTags) {\r\n const tagKey = this.tagKey(tag);\r\n const keys = (await this.driver.get(tagKey)) || [];\r\n\r\n if (!keys.includes(key)) {\r\n keys.push(key);\r\n // Store tag relationships permanently\r\n await this.driver.set(tagKey, keys, Infinity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get all keys associated with tags\r\n */\r\n protected async getTaggedKeys(): Promise<Set<string>> {\r\n const allKeys = new Set<string>();\r\n\r\n for (const tag of this.cacheTags) {\r\n const tagKey = this.tagKey(tag);\r\n const keys = (await this.driver.get(tagKey)) || [];\r\n\r\n for (const key of keys) {\r\n allKeys.add(key);\r\n }\r\n }\r\n\r\n return allKeys;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number): Promise<any> {\r\n const parsedKey = this.driver.parseKey(key);\r\n\r\n // Store the value\r\n await this.driver.set(key, value, ttl);\r\n\r\n // Store tag-key relationship\r\n await this.storeTaggedKey(parsedKey);\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey): Promise<any | null> {\r\n return this.driver.get(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey): Promise<void> {\r\n const parsedKey = this.driver.parseKey(key);\r\n\r\n // Remove the value\r\n await this.driver.remove(key);\r\n\r\n // Remove from all tag relationships\r\n for (const tag of this.cacheTags) {\r\n const tagKey = this.tagKey(tag);\r\n const keys = (await this.driver.get(tagKey)) || [];\r\n const updatedKeys = keys.filter((k: string) => k !== parsedKey);\r\n await this.driver.set(tagKey, updatedKeys, Infinity);\r\n }\r\n }\r\n\r\n /**\r\n * Invalidate (clear) all keys associated with the current tags\r\n */\r\n public async invalidate(): Promise<void> {\r\n const keysToRemove = await this.getTaggedKeys();\r\n\r\n // Remove all tagged keys\r\n for (const key of keysToRemove) {\r\n await this.driver.remove(key);\r\n }\r\n\r\n // Clear tag relationship keys\r\n for (const tag of this.cacheTags) {\r\n await this.driver.remove(this.tagKey(tag));\r\n }\r\n }\r\n\r\n /**\r\n * Flush all keys associated with the current tags\r\n * @deprecated Use invalidate() instead for better semantics\r\n */\r\n public async flush(): Promise<void> {\r\n return this.invalidate();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async has(key: CacheKey): Promise<boolean> {\r\n return this.driver.has(key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remember(\r\n key: CacheKey,\r\n ttl: number,\r\n callback: () => Promise<any>,\r\n ): Promise<any> {\r\n const value = await this.get(key);\r\n\r\n if (value !== null) {\r\n return value;\r\n }\r\n\r\n const result = await callback();\r\n await this.set(key, result, ttl);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async pull(key: CacheKey): Promise<any | null> {\r\n const value = await this.get(key);\r\n\r\n if (value !== null) {\r\n await this.remove(key);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async forever(key: CacheKey, value: any): Promise<any> {\r\n return this.set(key, value, Infinity);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async increment(key: CacheKey, value: number = 1): Promise<number> {\r\n const current = (await this.get(key)) || 0;\r\n\r\n if (typeof current !== \"number\") {\r\n throw new Error(\r\n `Cannot increment non-numeric value for key: ${this.driver.parseKey(key)}`,\r\n );\r\n }\r\n\r\n const newValue = current + value;\r\n await this.set(key, newValue);\r\n\r\n return newValue;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async decrement(key: CacheKey, value: number = 1): Promise<number> {\r\n return this.increment(key, -value);\r\n }\r\n}\r\n","import { rtrim } from \"@mongez/reinforcements\";\r\nimport type { CacheKey } from \"./types\";\r\n\r\n/**\r\n * Make a proper key for the cache\r\n */\r\nexport function parseCacheKey(\r\n key: CacheKey,\r\n options: { globalPrefix?: string | (() => string) } = {},\r\n): string {\r\n if (typeof key === \"object\") {\r\n key = JSON.stringify(key);\r\n }\r\n\r\n // remove any curly braces and double quotes along with []\r\n key = key.replace(/[{}\"[\\]]/g, \"\").replaceAll(/[:,]/g, \".\");\r\n\r\n const cachePrefix =\r\n typeof options.globalPrefix === \"function\" ? options.globalPrefix() : options.globalPrefix;\r\n\r\n return rtrim(String(cachePrefix ? rtrim(cachePrefix, \".\") + \".\" + key : key), \".\");\r\n}\r\n\r\nexport enum CACHE_FOR {\r\n /**\r\n * Cache for 30 Minutes (in seconds)\r\n */\r\n HALF_HOUR = 1800,\r\n /**\r\n * Cache for 1 Hour (in seconds)\r\n */\r\n ONE_HOUR = 3600,\r\n /**\r\n * Cache for 12 Hours (in seconds)\r\n */\r\n HALF_DAY = 43200,\r\n /**\r\n * Cache for 24 Hours (in seconds)\r\n */\r\n ONE_DAY = 86400,\r\n /**\r\n * Cache for 7 Days (in seconds)\r\n */\r\n ONE_WEEK = 604800,\r\n /**\r\n * Cache for 15 Days (in seconds)\r\n */\r\n HALF_MONTH = 1296000,\r\n /**\r\n * Cache for 30 Days (in seconds)\r\n */\r\n ONE_MONTH = 2592000,\r\n /**\r\n * Cache for 60 Days (in seconds)\r\n */\r\n TWO_MONTHS = 5184000,\r\n /**\r\n * Cache for 180 Days (in seconds)\r\n */\r\n SIX_MONTHS = 15768000,\r\n /**\r\n * Cache for 365 Days (in seconds)\r\n */\r\n ONE_YEAR = 31536000,\r\n}\r\n","import { log } from \"@warlock.js/logger\";\r\nimport { TaggedCache } from \"../tagged-cache\";\r\nimport type {\r\n CacheData,\r\n CacheDriver,\r\n CacheEventData,\r\n CacheEventHandler,\r\n CacheEventType,\r\n CacheKey,\r\n CacheOperationType,\r\n} from \"../types\";\r\nimport { parseCacheKey } from \"../utils\";\r\n\r\nconst messages = {\r\n clearing: \"Clearing namespace\",\r\n cleared: \"Namespace cleared\",\r\n fetching: \"Fetching key\",\r\n fetched: \"Key fetched\",\r\n caching: \"Caching key\",\r\n cached: \"Key cached\",\r\n flushing: \"Flushing cache\",\r\n flushed: \"Cache flushed\",\r\n removing: \"Removing key\",\r\n removed: \"Key removed\",\r\n expired: \"Key expired\",\r\n notFound: \"Key not found\",\r\n connecting: \"Connecting to the cache engine.\",\r\n connected: \"Connected to the cache engine.\",\r\n disconnecting: \"Disconnecting from the cache engine.\",\r\n disconnected: \"Disconnected from the cache engine.\",\r\n error: \"Error occurred\",\r\n};\r\n\r\nexport abstract class BaseCacheDriver<\r\n ClientType,\r\n Options extends Record<string, any>,\r\n> implements CacheDriver<ClientType, Options> {\r\n /**\r\n * CLient driver\r\n */\r\n protected clientDriver!: ClientType;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public get client() {\r\n return (this.clientDriver || this) as unknown as ClientType;\r\n }\r\n\r\n /**\r\n * Set client driver\r\n */\r\n public set client(client: ClientType) {\r\n this.clientDriver = client;\r\n }\r\n\r\n /**\r\n * Get the cache driver name\r\n */\r\n public abstract name: string;\r\n\r\n /**\r\n * Options list\r\n */\r\n public options!: Options;\r\n\r\n /**\r\n * Event listeners storage\r\n */\r\n protected eventListeners: Map<CacheEventType, Set<CacheEventHandler>> = new Map();\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public parseKey(key: CacheKey) {\r\n return parseCacheKey(key, this.options);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public setOptions(options: Options) {\r\n this.options = options || {};\r\n return this;\r\n }\r\n\r\n /**\r\n * Register an event listener\r\n */\r\n public on(event: CacheEventType, handler: CacheEventHandler): this {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, new Set());\r\n }\r\n this.eventListeners.get(event)!.add(handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n public off(event: CacheEventType, handler: CacheEventHandler): this {\r\n const handlers = this.eventListeners.get(event);\r\n if (handlers) {\r\n handlers.delete(handler);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a one-time event listener\r\n */\r\n public once(event: CacheEventType, handler: CacheEventHandler): this {\r\n const onceHandler: CacheEventHandler = async (data) => {\r\n await handler(data);\r\n this.off(event, onceHandler);\r\n };\r\n return this.on(event, onceHandler);\r\n }\r\n\r\n /**\r\n * Emit an event to all registered listeners\r\n */\r\n protected async emit(event: CacheEventType, data: Partial<CacheEventData> = {}): Promise<void> {\r\n const handlers = this.eventListeners.get(event);\r\n if (!handlers || handlers.size === 0) return;\r\n\r\n const eventData: CacheEventData = {\r\n driver: this.name,\r\n ...data,\r\n };\r\n\r\n // Execute all handlers\r\n const promises: Promise<void>[] = [];\r\n for (const handler of handlers) {\r\n try {\r\n const result = handler(eventData);\r\n if (result instanceof Promise) {\r\n promises.push(result);\r\n }\r\n } catch (error) {\r\n this.logError(`Error in event handler for '${event}'`, error);\r\n }\r\n }\r\n\r\n // Wait for all async handlers\r\n if (promises.length > 0) {\r\n await Promise.allSettled(promises);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public abstract removeNamespace(namespace: string): Promise<any>;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public abstract set(key: CacheKey, value: any, ttl?: number): Promise<any>;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public abstract get(key: CacheKey): Promise<any>;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public abstract remove(key: CacheKey): Promise<void>;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public abstract flush(): Promise<void>;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async has(key: CacheKey): Promise<boolean> {\r\n const value = await this.get(key);\r\n // Event is emitted by get() method\r\n return value !== null;\r\n }\r\n\r\n /**\r\n * Lock storage for preventing cache stampede\r\n */\r\n protected locks: Map<string, Promise<any>> = new Map();\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remember(key: CacheKey, ttl: number, callback: () => Promise<any>): Promise<any> {\r\n const parsedKey = this.parseKey(key);\r\n\r\n // Check cache first\r\n const cachedValue = await this.get(key);\r\n if (cachedValue !== null) {\r\n return cachedValue;\r\n }\r\n\r\n // Check if another request is already computing this value\r\n const existingLock = this.locks.get(parsedKey);\r\n if (existingLock) {\r\n return existingLock;\r\n }\r\n\r\n // Create lock and compute value\r\n const promise = callback()\r\n .then(async (result) => {\r\n await this.set(key, result, ttl);\r\n this.locks.delete(parsedKey);\r\n return result;\r\n })\r\n .catch((err) => {\r\n this.locks.delete(parsedKey);\r\n throw err;\r\n });\r\n\r\n this.locks.set(parsedKey, promise);\r\n return promise;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async pull(key: CacheKey): Promise<any | null> {\r\n const value = await this.get(key);\r\n if (value !== null) {\r\n await this.remove(key);\r\n }\r\n // Events are emitted by get() and remove() methods\r\n return value;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async forever(key: CacheKey, value: any): Promise<any> {\r\n // Event is emitted by set() method\r\n return this.set(key, value, Infinity);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async increment(key: CacheKey, value: number = 1): Promise<number> {\r\n const current = (await this.get(key)) || 0;\r\n\r\n if (typeof current !== \"number\") {\r\n throw new Error(`Cannot increment non-numeric value for key: ${this.parseKey(key)}`);\r\n }\r\n\r\n const newValue = current + value;\r\n await this.set(key, newValue);\r\n return newValue;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async decrement(key: CacheKey, value: number = 1): Promise<number> {\r\n return this.increment(key, -value);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async many(keys: CacheKey[]): Promise<any[]> {\r\n return Promise.all(keys.map((key) => this.get(key)));\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async setMany(items: Record<string, any>, ttl?: number): Promise<void> {\r\n await Promise.all(Object.entries(items).map(([key, value]) => this.set(key, value, ttl)));\r\n }\r\n\r\n /**\r\n * Log the operation\r\n */\r\n protected log(operation: CacheOperationType, key?: string) {\r\n if (key) {\r\n // this will be likely used with file cache driver as it will convert the dot to slash\r\n // to make it consistent and not to confuse developers we will output the key by making sure it's a dot\r\n key = key.replaceAll(\"/\", \".\");\r\n }\r\n\r\n if (operation == \"notFound\" || operation == \"expired\") {\r\n return log.warn(\r\n \"cache:\" + this.name,\r\n operation,\r\n (key ? key + \" \" : \"\") + messages[operation],\r\n );\r\n }\r\n\r\n if (operation.endsWith(\"ed\")) {\r\n return log.success(\r\n \"cache:\" + this.name,\r\n operation,\r\n (key ? key + \" \" : \"\") + messages[operation],\r\n );\r\n }\r\n\r\n log.info(\"cache:\" + this.name, operation, (key ? key + \" \" : \"\") + messages[operation]);\r\n }\r\n\r\n /**\r\n * Log error message\r\n */\r\n protected logError(message: string, error?: any) {\r\n log.error(\"cache:\" + this.name, \"error\", message);\r\n if (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get time to live value\r\n */\r\n public get ttl() {\r\n return this.options.ttl !== undefined ? this.options.ttl : Infinity;\r\n }\r\n\r\n /**\r\n * Get time to live value in milliseconds\r\n */\r\n public getExpiresAt(ttl: number = this.ttl) {\r\n if (ttl) {\r\n return new Date().getTime() + ttl * 1000;\r\n }\r\n }\r\n\r\n /**\r\n * Prepare data for storage\r\n */\r\n protected prepareDataForStorage(data: any, ttl?: number) {\r\n const preparedData: CacheData = {\r\n data,\r\n };\r\n\r\n if (ttl) {\r\n preparedData.ttl = ttl;\r\n preparedData.expiresAt = this.getExpiresAt(ttl);\r\n }\r\n\r\n return preparedData;\r\n }\r\n\r\n /**\r\n * Parse fetched data from cache\r\n */\r\n protected async parseCachedData(key: string, data: CacheData) {\r\n this.log(\"fetched\", key);\r\n\r\n if (data.expiresAt && data.expiresAt < Date.now()) {\r\n this.remove(key);\r\n return null;\r\n }\r\n\r\n const value = data.data;\r\n\r\n // Skip cloning for primitives (immutable types)\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n\r\n const type = typeof value;\r\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\r\n return value;\r\n }\r\n\r\n // Deep clone objects/arrays to prevent cache mutation\r\n try {\r\n return structuredClone(value);\r\n } catch (error) {\r\n console.log(value);\r\n\r\n this.logError(\r\n `Failed to clone cached value for ${key}, typeof value: ${typeof value}`,\r\n error,\r\n );\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async connect() {\r\n this.log(\"connecting\");\r\n this.log(\"connected\");\r\n await this.emit(\"connected\");\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async disconnect() {\r\n this.log(\"disconnected\");\r\n await this.emit(\"disconnected\");\r\n }\r\n\r\n /**\r\n * Create a tagged cache instance for the given tags\r\n */\r\n public tags(tags: string[]): any {\r\n return new TaggedCache(tags, this);\r\n }\r\n}\r\n","import {\r\n ensureDirectoryAsync,\r\n getJsonFileAsync,\r\n putJsonFileAsync,\r\n removeDirectoryAsync,\r\n} from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport type { CacheDriver, CacheKey, FileCacheOptions } from \"../types\";\r\nimport { CacheConfigurationError } from \"../types\";\r\nimport { BaseCacheDriver } from \"./base-cache-driver\";\r\n\r\nexport class FileCacheDriver\r\n extends BaseCacheDriver<FileCacheDriver, FileCacheOptions>\r\n implements CacheDriver<FileCacheDriver, FileCacheOptions>\r\n{\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"file\";\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public setOptions(options: FileCacheOptions) {\r\n if (!options.directory) {\r\n throw new CacheConfigurationError(\r\n \"File driver requires 'directory' option to be configured.\",\r\n );\r\n }\r\n\r\n return super.setOptions(options);\r\n }\r\n\r\n /**\r\n * Get the cache directory\r\n */\r\n public get directory() {\r\n const directory = this.options.directory;\r\n\r\n if (typeof directory === \"function\") {\r\n return directory();\r\n }\r\n\r\n throw new CacheConfigurationError(\r\n \"Cache directory is not defined, please define it in the file driver options\",\r\n );\r\n }\r\n\r\n /**\r\n * Get file name\r\n */\r\n public get fileName() {\r\n const fileName = this.options.fileName;\r\n\r\n if (typeof fileName === \"function\") {\r\n return fileName();\r\n }\r\n\r\n return \"cache.json\";\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async removeNamespace(namespace: string) {\r\n this.log(\"clearing\", namespace);\r\n\r\n try {\r\n await removeDirectoryAsync(path.resolve(this.directory, namespace));\r\n\r\n this.log(\"cleared\", namespace);\r\n } catch (error) {\r\n //\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number) {\r\n key = this.parseKey(key);\r\n\r\n this.log(\"caching\", key);\r\n\r\n const data = this.prepareDataForStorage(value, ttl);\r\n\r\n const fileDirectory = path.resolve(this.directory, key);\r\n\r\n await ensureDirectoryAsync(fileDirectory);\r\n\r\n await putJsonFileAsync(path.resolve(fileDirectory, this.fileName), data);\r\n\r\n this.log(\"cached\", key);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key, value, ttl });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"fetching\", parsedKey);\r\n\r\n const fileDirectory = path.resolve(this.directory, parsedKey);\r\n\r\n try {\r\n const value = await getJsonFileAsync(\r\n path.resolve(fileDirectory, this.fileName),\r\n );\r\n\r\n const result = await this.parseCachedData(parsedKey, value);\r\n\r\n if (result === null) {\r\n // Expired\r\n await this.emit(\"miss\", { key: parsedKey });\r\n } else {\r\n // Emit hit event\r\n await this.emit(\"hit\", { key: parsedKey, value: result });\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n this.log(\"notFound\", parsedKey);\r\n // Emit miss event\r\n await this.emit(\"miss\", { key: parsedKey });\r\n this.remove(key);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n this.log(\"removing\", parsedKey);\r\n\r\n const fileDirectory = path.resolve(this.directory, parsedKey);\r\n\r\n try {\r\n await removeDirectoryAsync(fileDirectory);\r\n\r\n this.log(\"removed\", parsedKey);\r\n // Emit removed event\r\n await this.emit(\"removed\", { key: parsedKey });\r\n } catch (error) {\r\n //\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async flush() {\r\n this.log(\"flushing\");\r\n\r\n if (this.options.globalPrefix) {\r\n await this.removeNamespace(\"\");\r\n } else {\r\n await removeDirectoryAsync(this.directory);\r\n }\r\n\r\n this.log(\"flushed\");\r\n\r\n // Emit flushed event\r\n await this.emit(\"flushed\");\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async connect() {\r\n this.log(\"connecting\");\r\n await ensureDirectoryAsync(this.directory);\r\n this.log(\"connected\");\r\n await this.emit(\"connected\");\r\n }\r\n}\r\n","import type { CacheDriver, CacheKey, LRUMemoryCacheOptions } from \"../types\";\r\nimport { BaseCacheDriver } from \"./base-cache-driver\";\r\n\r\nclass CacheNode {\r\n public next: CacheNode | null = null;\r\n public prev: CacheNode | null = null;\r\n public expiresAt?: number;\r\n public constructor(\r\n public key: string,\r\n public value: any,\r\n ttl?: number,\r\n ) {\r\n if (ttl && ttl !== Infinity) {\r\n this.expiresAt = Date.now() + ttl * 1000;\r\n }\r\n }\r\n\r\n public get isExpired(): boolean {\r\n return this.expiresAt !== undefined && this.expiresAt < Date.now();\r\n }\r\n}\r\n\r\n/**\r\n * LRU Memory Cache Driver\r\n * The concept of LRU is to remove the least recently used data\r\n * whenever the cache is full\r\n * The question that resides here is how to tell the cache is full?\r\n */\r\nexport class LRUMemoryCacheDriver\r\n extends BaseCacheDriver<LRUMemoryCacheDriver, LRUMemoryCacheOptions>\r\n implements CacheDriver<LRUMemoryCacheDriver, LRUMemoryCacheOptions>\r\n{\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"lru\";\r\n\r\n /**\r\n * Cache map\r\n */\r\n protected cache: Map<string, CacheNode> = new Map();\r\n\r\n /**\r\n * Head of the cache\r\n */\r\n protected head: CacheNode = new CacheNode(\"\", null);\r\n\r\n /**\r\n * Tail of the cache\r\n */\r\n protected tail: CacheNode = new CacheNode(\"\", null);\r\n\r\n /**\r\n * Cleanup interval reference\r\n */\r\n protected cleanupInterval?: NodeJS.Timeout;\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public constructor() {\r\n super();\r\n\r\n this.init();\r\n this.startCleanup();\r\n }\r\n\r\n /**\r\n * Initialize the cache\r\n */\r\n public init() {\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n\r\n /**\r\n * Start the cleanup process for expired items\r\n */\r\n public startCleanup() {\r\n // Clear existing interval if any\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n }\r\n\r\n this.cleanupInterval = setInterval(async () => {\r\n const now = Date.now();\r\n const expiredKeys: string[] = [];\r\n\r\n for (const [key, node] of this.cache) {\r\n if (node.expiresAt && node.expiresAt <= now) {\r\n expiredKeys.push(key);\r\n }\r\n }\r\n\r\n for (const key of expiredKeys) {\r\n const node = this.cache.get(key);\r\n if (node) {\r\n this.removeNode(node);\r\n this.cache.delete(key);\r\n this.log(\"expired\", key);\r\n // Emit expired event\r\n await this.emit(\"expired\", { key });\r\n }\r\n }\r\n }, 1000);\r\n\r\n // do not block the process from exiting\r\n this.cleanupInterval.unref();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async removeNamespace(_namespace: string) {\r\n throw new Error(\"Namespace is not supported in LRU cache driver.\");\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number) {\r\n key = this.parseKey(key);\r\n\r\n this.log(\"caching\", key);\r\n\r\n if (ttl === undefined) {\r\n ttl = this.ttl;\r\n }\r\n\r\n const existingNode = this.cache.get(key);\r\n if (existingNode) {\r\n existingNode.value = value;\r\n // Update TTL\r\n if (ttl && ttl !== Infinity) {\r\n existingNode.expiresAt = Date.now() + ttl * 1000;\r\n } else {\r\n existingNode.expiresAt = undefined;\r\n }\r\n\r\n this.moveHead(existingNode);\r\n } else {\r\n const newNode = new CacheNode(key, value, ttl);\r\n\r\n this.cache.set(key, newNode);\r\n\r\n this.addNode(newNode);\r\n if (this.cache.size > this.capacity) {\r\n this.removeTail();\r\n }\r\n }\r\n\r\n this.log(\"cached\", key);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key, value, ttl });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Move the node to the head\r\n */\r\n protected moveHead(node: CacheNode) {\r\n this.removeNode(node);\r\n this.addNode(node);\r\n }\r\n\r\n /**\r\n * Remove the node from the cache\r\n */\r\n protected removeNode(node: CacheNode) {\r\n node.prev!.next = node.next;\r\n node.next!.prev = node.prev;\r\n }\r\n\r\n /**\r\n * Add the node to the head\r\n */\r\n protected addNode(node: CacheNode) {\r\n node.next = this.head.next;\r\n node.prev = this.head;\r\n this.head.next!.prev = node;\r\n this.head.next = node;\r\n }\r\n\r\n /**\r\n * Remove the tail node\r\n */\r\n protected removeTail() {\r\n const node = this.tail.prev!;\r\n\r\n this.removeNode(node);\r\n\r\n this.cache.delete(node.key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"fetching\", parsedKey);\r\n\r\n const node = this.cache.get(parsedKey);\r\n\r\n if (!node) {\r\n this.log(\"notFound\", parsedKey);\r\n // Emit miss event\r\n await this.emit(\"miss\", { key: parsedKey });\r\n return null;\r\n }\r\n\r\n // Check if expired\r\n if (node.isExpired) {\r\n this.removeNode(node);\r\n this.cache.delete(parsedKey);\r\n this.log(\"expired\", parsedKey);\r\n // Emit expired event\r\n await this.emit(\"expired\", { key: parsedKey });\r\n // Also emit miss since we're returning null\r\n await this.emit(\"miss\", { key: parsedKey });\r\n return null;\r\n }\r\n\r\n this.moveHead(node);\r\n\r\n this.log(\"fetched\", parsedKey);\r\n\r\n const value = node.value;\r\n\r\n // Apply cloning for immutability protection\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n\r\n const type = typeof value;\r\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\r\n // Emit hit event\r\n await this.emit(\"hit\", { key: parsedKey, value });\r\n return value;\r\n }\r\n\r\n try {\r\n const clonedValue = structuredClone(value);\r\n // Emit hit event\r\n await this.emit(\"hit\", { key: parsedKey, value: clonedValue });\r\n return clonedValue;\r\n } catch (error) {\r\n this.logError(`Failed to clone cached value for ${parsedKey}`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"removing\", parsedKey);\r\n\r\n const node = this.cache.get(parsedKey);\r\n\r\n if (node) {\r\n this.removeNode(node);\r\n this.cache.delete(parsedKey);\r\n }\r\n\r\n this.log(\"removed\", parsedKey);\r\n\r\n // Emit removed event\r\n await this.emit(\"removed\", { key: parsedKey });\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async flush() {\r\n this.log(\"flushing\");\r\n\r\n this.cache.clear();\r\n\r\n this.init();\r\n\r\n this.log(\"flushed\");\r\n\r\n // Emit flushed event\r\n await this.emit(\"flushed\");\r\n }\r\n\r\n /**\r\n * Get lru capacity\r\n */\r\n public get capacity() {\r\n return this.options.capacity || 1000;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async disconnect() {\r\n // Clear the cleanup interval to prevent memory leaks\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n this.cleanupInterval = undefined;\r\n }\r\n\r\n await super.disconnect();\r\n }\r\n}\r\n","import type { GenericObject } from \"@mongez/reinforcements\";\r\nimport { get, set, unset } from \"@mongez/reinforcements\";\r\nimport type {\r\n CacheData,\r\n CacheDriver,\r\n CacheKey,\r\n MemoryCacheOptions,\r\n} from \"../types\";\r\nimport { BaseCacheDriver } from \"./base-cache-driver\";\r\n\r\nexport class MemoryCacheDriver\r\n extends BaseCacheDriver<MemoryCacheDriver, MemoryCacheOptions>\r\n implements CacheDriver<MemoryCacheDriver, MemoryCacheOptions>\r\n{\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"memory\";\r\n\r\n /**\r\n * Cached data\r\n */\r\n public data: GenericObject = {};\r\n\r\n /**\r\n * List of data that will be cleared from cache\r\n */\r\n protected temporaryData: Record<\r\n string,\r\n {\r\n key: string;\r\n expiresAt: number;\r\n }\r\n > = {};\r\n\r\n /**\r\n * Cleanup interval reference\r\n */\r\n protected cleanupInterval?: NodeJS.Timeout;\r\n\r\n /**\r\n * Access order tracking for LRU eviction (when maxSize is set)\r\n */\r\n protected accessOrder: string[] = [];\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public constructor() {\r\n super();\r\n\r\n this.startCleanup();\r\n }\r\n\r\n /**\r\n * Start the cleanup process whenever a data that has a cache key is set\r\n */\r\n public startCleanup() {\r\n // Clear existing interval if any\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n }\r\n\r\n this.cleanupInterval = setInterval(async () => {\r\n const now = Date.now();\r\n\r\n for (const key in this.temporaryData) {\r\n if (this.temporaryData[key].expiresAt <= now) {\r\n await this.remove(this.temporaryData[key].key);\r\n delete this.temporaryData[key];\r\n\r\n this.log(\"expired\", key);\r\n // Emit expired event\r\n await this.emit(\"expired\", { key });\r\n }\r\n }\r\n }, 1000);\r\n\r\n // do not block the process from exiting\r\n this.cleanupInterval.unref();\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async removeNamespace(namespace: string) {\r\n this.log(\"clearing\", namespace);\r\n\r\n namespace = this.parseKey(namespace);\r\n\r\n unset(this.data, [namespace]);\r\n\r\n this.log(\"cleared\", namespace);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"caching\", parsedKey);\r\n\r\n if (ttl === undefined) {\r\n ttl = this.ttl;\r\n }\r\n\r\n const data = this.prepareDataForStorage(value, ttl);\r\n\r\n if (ttl) {\r\n // it means we need to check for expiration\r\n this.setTemporaryData(key, parsedKey, ttl);\r\n }\r\n\r\n // Check if key already exists\r\n const existingData = get(this.data, parsedKey);\r\n const isNewKey = !existingData;\r\n\r\n set(this.data, parsedKey, data);\r\n\r\n // Track access for LRU eviction\r\n this.trackAccess(parsedKey);\r\n\r\n // Check size limit and evict if necessary\r\n if (isNewKey && this.options.maxSize) {\r\n await this.enforceMaxSize();\r\n }\r\n\r\n this.log(\"cached\", parsedKey);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key: parsedKey, value, ttl });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"fetching\", parsedKey);\r\n\r\n const value: CacheData = get(this.data, parsedKey);\r\n\r\n if (!value) {\r\n this.log(\"notFound\", parsedKey);\r\n // Emit miss event\r\n await this.emit(\"miss\", { key: parsedKey });\r\n return null;\r\n }\r\n\r\n const result = await this.parseCachedData(parsedKey, value);\r\n\r\n if (result === null) {\r\n // Expired\r\n await this.emit(\"miss\", { key: parsedKey });\r\n } else {\r\n // Track access for LRU\r\n this.trackAccess(parsedKey);\r\n // Emit hit event\r\n await this.emit(\"hit\", { key: parsedKey, value: result });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"removing\", parsedKey);\r\n\r\n unset(this.data, [parsedKey]);\r\n\r\n // Clean up from temporaryData as well\r\n delete this.temporaryData[parsedKey];\r\n\r\n // Remove from access order\r\n this.removeFromAccessOrder(parsedKey);\r\n\r\n this.log(\"removed\", parsedKey);\r\n\r\n // Emit removed event\r\n await this.emit(\"removed\", { key: parsedKey });\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async flush() {\r\n this.log(\"flushing\");\r\n if (this.options.globalPrefix) {\r\n this.removeNamespace(\"\");\r\n } else {\r\n this.data = {};\r\n this.accessOrder = [];\r\n }\r\n\r\n this.log(\"flushed\");\r\n\r\n // Emit flushed event\r\n await this.emit(\"flushed\");\r\n }\r\n\r\n /**\r\n * Set the temporary data\r\n */\r\n protected setTemporaryData(key: CacheKey, parsedKey: string, ttl: number) {\r\n this.temporaryData[parsedKey] = {\r\n key: JSON.stringify(key),\r\n expiresAt: Date.now() + ttl * 1000,\r\n };\r\n }\r\n\r\n /**\r\n * Track access for LRU eviction\r\n */\r\n protected trackAccess(key: string) {\r\n if (!this.options.maxSize) return;\r\n\r\n // Remove key from current position\r\n const index = this.accessOrder.indexOf(key);\r\n if (index > -1) {\r\n this.accessOrder.splice(index, 1);\r\n }\r\n\r\n // Add to end (most recently used)\r\n this.accessOrder.push(key);\r\n }\r\n\r\n /**\r\n * Remove key from access order tracking\r\n */\r\n protected removeFromAccessOrder(key: string) {\r\n const index = this.accessOrder.indexOf(key);\r\n if (index > -1) {\r\n this.accessOrder.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Enforce max size by evicting least recently used items\r\n */\r\n protected async enforceMaxSize() {\r\n if (!this.options.maxSize) return;\r\n\r\n // Count actual cache items (excluding internal metadata)\r\n const cacheSize = this.getCacheSize();\r\n\r\n while (cacheSize > this.options.maxSize && this.accessOrder.length > 0) {\r\n // Evict least recently used (first in array)\r\n const lruKey = this.accessOrder.shift();\r\n if (lruKey) {\r\n this.log(\"removing\", lruKey);\r\n unset(this.data, [lruKey]);\r\n delete this.temporaryData[lruKey];\r\n this.log(\"removed\", lruKey);\r\n // Could emit 'evicted' event if we add that type\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get current cache size (number of cached items)\r\n */\r\n protected getCacheSize(): number {\r\n // Count top-level keys in data object\r\n return Object.keys(this.data).length;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async disconnect() {\r\n // Clear the cleanup interval to prevent memory leaks\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n this.cleanupInterval = undefined;\r\n }\r\n\r\n await super.disconnect();\r\n }\r\n}\r\n","import { get } from \"@mongez/reinforcements\";\r\nimport type { CacheData, CacheDriver, CacheKey, MemoryExtendedCacheOptions } from \"../types\";\r\nimport { MemoryCacheDriver } from \"./memory-cache-driver\";\r\n\r\nexport class MemoryExtendedCacheDriver\r\n extends MemoryCacheDriver\r\n implements CacheDriver<MemoryExtendedCacheDriver, MemoryExtendedCacheOptions>\r\n{\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"memoryExtended\";\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"fetching\", parsedKey);\r\n\r\n const value: CacheData = get(this.data, parsedKey);\r\n\r\n if (!value) {\r\n this.log(\"notFound\", parsedKey);\r\n return null;\r\n }\r\n\r\n const ttl = value.ttl || this.options.ttl;\r\n\r\n if (ttl) {\r\n // reset the expiration time\r\n this.setTemporaryData(key, parsedKey, ttl);\r\n value.expiresAt = this.getExpiresAt(ttl);\r\n }\r\n\r\n return this.parseCachedData(parsedKey, value);\r\n }\r\n}\r\n","import type { GenericObject } from \"@mongez/reinforcements\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport type { CacheDriver, CacheKey, NullCacheDriverOptions } from \"../types\";\r\nimport { BaseCacheDriver } from \"./base-cache-driver\";\r\n\r\nexport class NullCacheDriver\r\n extends BaseCacheDriver<NullCacheDriver, NullCacheDriverOptions>\r\n implements CacheDriver<NullCacheDriver, NullCacheDriverOptions>\r\n{\r\n /**\r\n * Options list\r\n */\r\n public options: GenericObject = {};\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public name = \"null\";\r\n\r\n /**\r\n * Cached data\r\n */\r\n public data: GenericObject = {};\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public get client() {\r\n return this;\r\n }\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(options: GenericObject = {}) {\r\n super();\r\n this.setOptions(options);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public setOptions(options: GenericObject) {\r\n this.options = options;\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public parseKey(_key: CacheKey) {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async removeNamespace(namespace: string) {\r\n log.info(\"cache\", \"clearing namespace\", namespace);\r\n\r\n log.success(\"cache\", \"namespace cleared\", namespace);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async set(key: CacheKey, _value: any) {\r\n log.info(\"cache\", \"setting key\", key);\r\n\r\n log.success(\"cache\", \"key set\", key);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async get(key: CacheKey) {\r\n log.info(\"cache\", \"fetching\", key);\r\n\r\n log.success(\"cache\", \"fetched\", key);\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n log.info(\"cache\", \"removing\", key);\r\n\r\n log.success(\"cache\", \"removed\", key);\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async flush() {\r\n log.info(\"cache\", \"flushing\", \"all\");\r\n\r\n log.success(\"cache\", \"flushed\", \"all\");\r\n }\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public async connect() {\r\n log.success(\"cache\", \"connected\", \"Connected to null cache driver\");\r\n }\r\n}\r\n","import { log } from \"@warlock.js/logger\";\r\nimport type { createClient } from \"redis\";\r\nimport type { CacheDriver, CacheKey, RedisOptions } from \"../types\";\r\nimport { CacheConfigurationError } from \"../types\";\r\nimport { BaseCacheDriver } from \"./base-cache-driver\";\r\n\r\nexport class RedisCacheDriver\r\n extends BaseCacheDriver<ReturnType<typeof createClient>, RedisOptions>\r\n implements CacheDriver<ReturnType<typeof createClient>, RedisOptions>\r\n{\r\n /**\r\n * Cache driver name\r\n */\r\n public name = \"redis\";\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public setOptions(options: RedisOptions) {\r\n if (!options.url && !options.host) {\r\n throw new CacheConfigurationError(\r\n \"Redis driver requires either 'url' or 'host' option to be configured.\",\r\n );\r\n }\r\n\r\n return super.setOptions(options);\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async removeNamespace(namespace: string) {\r\n namespace = this.parseKey(namespace);\r\n\r\n this.log(\"clearing\", namespace);\r\n\r\n const keys = await this.client?.keys(`${namespace}*`);\r\n\r\n if (!keys || keys.length === 0) {\r\n this.log(\"notFound\", namespace);\r\n return;\r\n }\r\n\r\n await this.client?.del(keys);\r\n\r\n this.log(\"cleared\", namespace);\r\n\r\n return keys;\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async set(key: CacheKey, value: any, ttl?: number) {\r\n key = this.parseKey(key);\r\n\r\n this.log(\"caching\", key);\r\n\r\n if (ttl === undefined) {\r\n ttl = this.ttl;\r\n }\r\n\r\n // Use Redis native expiration instead of manual checking\r\n if (ttl && ttl !== Infinity) {\r\n await this.client?.set(key, JSON.stringify(value), { EX: ttl });\r\n } else {\r\n await this.client?.set(key, JSON.stringify(value));\r\n }\r\n\r\n this.log(\"cached\", key);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key, value, ttl });\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async get(key: CacheKey) {\r\n key = this.parseKey(key);\r\n\r\n this.log(\"fetching\", key);\r\n\r\n const value = await this.client?.get(key);\r\n\r\n if (!value) {\r\n this.log(\"notFound\", key);\r\n // Emit miss event\r\n await this.emit(\"miss\", { key });\r\n return null;\r\n }\r\n\r\n this.log(\"fetched\", key);\r\n\r\n // Parse and return the value directly (Redis handles expiration natively)\r\n const parsedValue = JSON.parse(value);\r\n\r\n // Apply cloning for immutability protection\r\n if (parsedValue === null || parsedValue === undefined) {\r\n // Emit hit event\r\n await this.emit(\"hit\", { key, value: parsedValue });\r\n return parsedValue;\r\n }\r\n\r\n const type = typeof parsedValue;\r\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\r\n // Emit hit event\r\n await this.emit(\"hit\", { key, value: parsedValue });\r\n return parsedValue;\r\n }\r\n\r\n try {\r\n const clonedValue = structuredClone(parsedValue);\r\n // Emit hit event\r\n await this.emit(\"hit\", { key, value: clonedValue });\r\n return clonedValue;\r\n } catch (error) {\r\n this.logError(`Failed to clone cached value for ${key}`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async remove(key: CacheKey) {\r\n key = this.parseKey(key);\r\n\r\n this.log(\"removing\", key);\r\n\r\n await this.client?.del(key);\r\n\r\n this.log(\"removed\", key);\r\n\r\n // Emit removed event\r\n await this.emit(\"removed\", { key });\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async flush() {\r\n this.log(\"flushing\");\r\n\r\n if (this.options.globalPrefix) {\r\n await this.removeNamespace(\"\");\r\n } else {\r\n await this.client?.flushAll();\r\n }\r\n\r\n this.log(\"flushed\");\r\n\r\n // Emit flushed event\r\n await this.emit(\"flushed\");\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async connect() {\r\n if (this.clientDriver) return;\r\n\r\n const options = this.options;\r\n\r\n if (options && !options.url && options.host) {\r\n const auth =\r\n options.password || options.username ? `${options.username}:${options.password}@` : \"\";\r\n\r\n if (!options.url) {\r\n const host = options.host || \"localhost\";\r\n const port = options.port || 6379;\r\n options.url = `redis://${auth}${host}:${port}`;\r\n }\r\n }\r\n\r\n const clientOptions = {\r\n ...options,\r\n ...(this.options.clientOptions || {}),\r\n };\r\n\r\n this.log(\"connecting\");\r\n const { createClient } = await import(\"redis\");\r\n\r\n this.client = createClient(clientOptions);\r\n\r\n this.client.on(\"error\", (error: Error) => {\r\n this.log(\"error\", error.message);\r\n });\r\n try {\r\n await this.client.connect();\r\n\r\n this.log(\"connected\");\r\n await this.emit(\"connected\");\r\n } catch (error) {\r\n log.error(\"cache\", \"redis\", error);\r\n await this.emit(\"error\", { error });\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc}\r\n */\r\n public async disconnect() {\r\n if (!this.client) return;\r\n\r\n this.log(\"disconnecting\");\r\n\r\n await this.client.quit();\r\n\r\n this.log(\"disconnected\");\r\n await this.emit(\"disconnected\");\r\n }\r\n\r\n /**\r\n * Atomic increment using Redis native INCRBY command\r\n * {@inheritdoc}\r\n */\r\n public async increment(key: CacheKey, value: number = 1): Promise<number> {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"caching\", parsedKey);\r\n\r\n const result = await this.client?.incrBy(parsedKey, value);\r\n\r\n this.log(\"cached\", parsedKey);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key: parsedKey, value: result, ttl: undefined });\r\n\r\n return result || 0;\r\n }\r\n\r\n /**\r\n * Atomic decrement using Redis native DECRBY command\r\n * {@inheritdoc}\r\n */\r\n public async decrement(key: CacheKey, value: number = 1): Promise<number> {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"caching\", parsedKey);\r\n\r\n const result = await this.client?.decrBy(parsedKey, value);\r\n\r\n this.log(\"cached\", parsedKey);\r\n\r\n // Emit set event\r\n await this.emit(\"set\", { key: parsedKey, value: result, ttl: undefined });\r\n\r\n return result || 0;\r\n }\r\n\r\n /**\r\n * Set if not exists (atomic operation)\r\n * Returns true if key was set, false if key already existed\r\n */\r\n public async setNX(key: CacheKey, value: any, ttl?: number): Promise<boolean> {\r\n const parsedKey = this.parseKey(key);\r\n\r\n this.log(\"caching\", parsedKey);\r\n\r\n if (ttl === undefined) {\r\n ttl = this.ttl;\r\n }\r\n\r\n let result: string | null;\r\n\r\n // Use Redis native SET with NX option\r\n if (ttl && ttl !== Infinity) {\r\n result = await this.client?.set(parsedKey, JSON.stringify(value), {\r\n NX: true,\r\n EX: ttl,\r\n });\r\n } else {\r\n result = await this.client?.set(parsedKey, JSON.stringify(value), {\r\n NX: true,\r\n });\r\n }\r\n\r\n const wasSet = result === \"OK\";\r\n\r\n if (wasSet) {\r\n this.log(\"cached\", parsedKey);\r\n // Emit set event\r\n await this.emit(\"set\", { key: parsedKey, value, ttl });\r\n } else {\r\n this.log(\"notFound\", parsedKey);\r\n }\r\n\r\n return wasSet;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}