@db-bridge/redis 1.0.0
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/LICENSE +21 -0
- package/README.md +468 -0
- package/dist/index.d.ts +330 -0
- package/dist/index.js +1676 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/eventemitter3/index.js","../../../node_modules/eventemitter3/index.mjs","../src/commands/redis-commands.ts","../src/adapter/redis-adapter.ts","../src/adapter/redis-cache-adapter.ts","../src/adapter/traits/connection-trait.ts","../src/adapter/traits/basic-operations-trait.ts","../src/adapter/traits/batch-operations-trait.ts","../src/adapter/traits/counter-operations-trait.ts","../src/adapter/modular-redis-adapter.ts","../src/streams/traits/stream-base-trait.ts","../src/streams/traits/stream-crud-trait.ts","../src/streams/traits/stream-read-trait.ts","../src/streams/traits/stream-consumer-trait.ts","../src/streams/traits/stream-info-trait.ts","../src/streams/modular-stream-manager.ts"],"names":["exports","EventEmitter","Redis","withTimeout","ConnectionError","CacheError"],"mappings":"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","file":"index.js","sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","import type { RedisAdapter } from '../adapter/redis-adapter';\n\nexport class RedisCommands {\n constructor(private adapter: RedisAdapter) {}\n\n private get client() {\n const client = this.adapter.getClient();\n if (!client) {\n throw new Error('Redis client not connected');\n }\n return client;\n }\n\n async hget(key: string, field: string): Promise<string | null> {\n const result = await this.client.hget(this.adapter.getFullKey(key), field);\n return result;\n }\n\n async hset(key: string, field: string, value: string): Promise<number> {\n const result = await this.client.hset(this.adapter.getFullKey(key), field, value);\n return result;\n }\n\n async hgetall(key: string): Promise<Record<string, string>> {\n const result = await this.client.hgetall(this.adapter.getFullKey(key));\n return result;\n }\n\n async hmset(key: string, data: Record<string, string>): Promise<string> {\n const result = await this.client.hmset(this.adapter.getFullKey(key), data);\n return result;\n }\n\n async hdel(key: string, ...fields: string[]): Promise<number> {\n const result = await this.client.hdel(this.adapter.getFullKey(key), ...fields);\n return result;\n }\n\n async lpush(key: string, ...values: string[]): Promise<number> {\n const result = await this.client.lpush(this.adapter.getFullKey(key), ...values);\n return result;\n }\n\n async rpush(key: string, ...values: string[]): Promise<number> {\n const result = await this.client.rpush(this.adapter.getFullKey(key), ...values);\n return result;\n }\n\n async lpop(key: string): Promise<string | null> {\n const result = await this.client.lpop(this.adapter.getFullKey(key));\n return result;\n }\n\n async rpop(key: string): Promise<string | null> {\n const result = await this.client.rpop(this.adapter.getFullKey(key));\n return result;\n }\n\n async lrange(key: string, start: number, stop: number): Promise<string[]> {\n const result = await this.client.lrange(this.adapter.getFullKey(key), start, stop);\n return result;\n }\n\n async llen(key: string): Promise<number> {\n const result = await this.client.llen(this.adapter.getFullKey(key));\n return result;\n }\n\n async sadd(key: string, ...members: string[]): Promise<number> {\n const result = await this.client.sadd(this.adapter.getFullKey(key), ...members);\n return result;\n }\n\n async srem(key: string, ...members: string[]): Promise<number> {\n const result = await this.client.srem(this.adapter.getFullKey(key), ...members);\n return result;\n }\n\n async smembers(key: string): Promise<string[]> {\n const result = await this.client.smembers(this.adapter.getFullKey(key));\n return result;\n }\n\n async sismember(key: string, member: string): Promise<number> {\n const result = await this.client.sismember(this.adapter.getFullKey(key), member);\n return result;\n }\n\n async scard(key: string): Promise<number> {\n const result = await this.client.scard(this.adapter.getFullKey(key));\n return result;\n }\n\n async zadd(key: string, ...args: (string | number)[]): Promise<number> {\n const result = await this.client.zadd(this.adapter.getFullKey(key), ...args);\n return result;\n }\n\n async zrem(key: string, ...members: string[]): Promise<number> {\n const result = await this.client.zrem(this.adapter.getFullKey(key), ...members);\n return result;\n }\n\n async zrange(key: string, start: number, stop: number, withScores?: boolean): Promise<string[]> {\n if (withScores) {\n return this.client.zrange(this.adapter.getFullKey(key), start, stop, 'WITHSCORES');\n }\n return this.client.zrange(this.adapter.getFullKey(key), start, stop);\n }\n\n async zrevrange(\n key: string,\n start: number,\n stop: number,\n withScores?: boolean,\n ): Promise<string[]> {\n if (withScores) {\n return this.client.zrevrange(this.adapter.getFullKey(key), start, stop, 'WITHSCORES');\n }\n return this.client.zrevrange(this.adapter.getFullKey(key), start, stop);\n }\n\n async zcard(key: string): Promise<number> {\n const result = await this.client.zcard(this.adapter.getFullKey(key));\n return result;\n }\n\n async publish(channel: string, message: string): Promise<number> {\n const result = await this.client.publish(channel, message);\n return result;\n }\n\n async subscribe(\n channels: string[],\n callback: (channel: string, message: string) => void,\n ): Promise<void> {\n const subscriber = this.client.duplicate();\n\n subscriber.on('message', callback);\n\n await subscriber.subscribe(...channels);\n }\n\n async unsubscribe(channels?: string[]): Promise<void> {\n if (channels) {\n await this.client.unsubscribe(...channels);\n } else {\n await this.client.unsubscribe();\n }\n }\n}\n","import { CacheError, ConnectionError, withTimeout } from '@db-bridge/core';\nimport { EventEmitter } from 'eventemitter3';\nimport Redis from 'ioredis';\n\nimport { RedisCommands } from '../commands/redis-commands';\n\nimport type { CacheAdapter, Logger } from '@db-bridge/core';\nimport type { RedisOptions } from 'ioredis';\n\nexport interface RedisAdapterOptions {\n redis?: RedisOptions;\n keyPrefix?: string;\n ttl?: number;\n logger?: Logger;\n enableCompression?: boolean;\n connectionTimeout?: number;\n commandTimeout?: number;\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n };\n}\n\nexport class RedisAdapter extends EventEmitter implements CacheAdapter {\n private client?: Redis;\n private isConnected = false;\n private _commands?: RedisCommands;\n private readonly options: Omit<Required<RedisAdapterOptions>, 'logger' | 'retryOptions'> & {\n logger?: Logger;\n retryOptions: {\n maxRetries: number;\n retryDelay: number;\n };\n };\n\n constructor(options: RedisAdapterOptions = {}) {\n super();\n\n this.options = {\n redis: options.redis || {},\n keyPrefix: options.keyPrefix || 'db-bridge:',\n ttl: options.ttl || 3600,\n logger: options.logger,\n enableCompression: options.enableCompression || false,\n connectionTimeout: options.connectionTimeout || 10000,\n commandTimeout: options.commandTimeout || 5000,\n retryOptions: {\n maxRetries: options.retryOptions?.maxRetries ?? 3,\n retryDelay: options.retryOptions?.retryDelay ?? 1000,\n },\n } as any;\n }\n\n async connect(config?: RedisOptions): Promise<void> {\n if (this.isConnected) {\n return;\n }\n\n const redisConfig: RedisOptions = {\n ...this.options.redis,\n ...config,\n lazyConnect: true,\n enableOfflineQueue: false,\n retryStrategy: (times: number) => {\n const retryOptions = this.options.retryOptions;\n if (times > retryOptions.maxRetries) {\n return null;\n }\n return Math.min(times * retryOptions.retryDelay, 5000);\n },\n };\n\n this.client = new Redis(redisConfig);\n\n this.client.on('error', (error: Error) => {\n this.options.logger?.error('Redis client error', error);\n this.emit('error', error);\n });\n\n this.client.on('connect', () => {\n this.isConnected = true;\n this.options.logger?.info('Connected to Redis');\n this.emit('connect');\n });\n\n this.client.on('close', () => {\n this.isConnected = false;\n this.options.logger?.info('Disconnected from Redis');\n this.emit('disconnect');\n });\n\n try {\n await withTimeout(\n this.client.connect(),\n this.options.connectionTimeout,\n 'Redis connection timeout',\n );\n } catch (error) {\n throw new ConnectionError('Failed to connect to Redis', error as Error);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.client = undefined;\n this.isConnected = false;\n }\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const value = await withTimeout(this.client!.get(fullKey), this.options.commandTimeout);\n\n if (!value) {\n return null;\n }\n\n return this.deserialize<T>(value);\n } catch (error) {\n throw new CacheError(`Failed to get key \"${key}\"`, key, error as Error);\n }\n }\n\n async set<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const serialized = this.serialize(value);\n const expiry = ttl || this.options.ttl;\n\n if (expiry > 0) {\n await withTimeout(\n this.client!.setex(fullKey, expiry, serialized),\n this.options.commandTimeout,\n );\n } else {\n await withTimeout(this.client!.set(fullKey, serialized), this.options.commandTimeout);\n }\n\n this.emit('set', { key, ttl: expiry });\n } catch (error) {\n throw new CacheError(`Failed to set key \"${key}\"`, key, error as Error);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.del(fullKey), this.options.commandTimeout);\n\n const deleted = result > 0;\n if (deleted) {\n this.emit('delete', { key });\n }\n\n return deleted;\n } catch (error) {\n throw new CacheError(`Failed to delete key \"${key}\"`, key, error as Error);\n }\n }\n\n async exists(key: string): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.exists(fullKey), this.options.commandTimeout);\n\n return result > 0;\n } catch (error) {\n throw new CacheError(`Failed to check existence of key \"${key}\"`, key, error as Error);\n }\n }\n\n async clear(): Promise<void> {\n this.ensureConnected();\n\n try {\n const pattern = `${this.options.keyPrefix}*`;\n const keys = await this.keys(pattern);\n\n if (keys.length > 0) {\n const pipeline = this.client!.pipeline();\n keys.forEach((key) => pipeline.del(key));\n await pipeline.exec();\n }\n\n this.emit('clear', { count: keys.length });\n } catch (error) {\n throw new CacheError('Failed to clear cache', undefined, error as Error);\n }\n }\n\n async mget<T = unknown>(keys: string[]): Promise<(T | null)[]> {\n this.ensureConnected();\n\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const fullKeys = keys.map((key) => this.getFullKey(key));\n const values = await withTimeout(this.client!.mget(...fullKeys), this.options.commandTimeout);\n\n return values.map((value) => {\n if (!value) {\n return null;\n }\n return this.deserialize<T>(value);\n });\n } catch (error) {\n throw new CacheError('Failed to get multiple keys', undefined, error as Error);\n }\n }\n\n async mset<T = unknown>(items: Array<{ key: string; value: T; ttl?: number }>): Promise<void> {\n this.ensureConnected();\n\n if (items.length === 0) {\n return;\n }\n\n try {\n const pipeline = this.client!.pipeline();\n\n items.forEach(({ key, value, ttl }) => {\n const fullKey = this.getFullKey(key);\n const serialized = this.serialize(value);\n const expiry = ttl || this.options.ttl;\n\n if (expiry > 0) {\n pipeline.setex(fullKey, expiry, serialized);\n } else {\n pipeline.set(fullKey, serialized);\n }\n });\n\n await pipeline.exec();\n this.emit('mset', { count: items.length });\n } catch (error) {\n throw new CacheError('Failed to set multiple keys', undefined, error as Error);\n }\n }\n\n async keys(pattern = '*'): Promise<string[]> {\n this.ensureConnected();\n\n try {\n const fullPattern = pattern.startsWith(this.options.keyPrefix)\n ? pattern\n : this.getFullKey(pattern);\n\n const keys = await withTimeout(this.scanKeys(fullPattern), this.options.commandTimeout * 5);\n\n return keys.map((key) => key.replace(this.options.keyPrefix, ''));\n } catch (error) {\n throw new CacheError('Failed to get keys', undefined, error as Error);\n }\n }\n\n async ttl(key: string): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const ttl = await withTimeout(this.client!.ttl(fullKey), this.options.commandTimeout);\n\n return ttl >= 0 ? ttl : -1;\n } catch (error) {\n throw new CacheError(`Failed to get TTL for key \"${key}\"`, key, error as Error);\n }\n }\n\n async expire(key: string, ttl: number): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(\n this.client!.expire(fullKey, ttl),\n this.options.commandTimeout,\n );\n\n return result === 1;\n } catch (error) {\n throw new CacheError(`Failed to set expiry for key \"${key}\"`, key, error as Error);\n }\n }\n\n async increment(key: string, value = 1): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(\n this.client!.incrby(fullKey, value),\n this.options.commandTimeout,\n );\n\n return result;\n } catch (error) {\n throw new CacheError(`Failed to increment key \"${key}\"`, key, error as Error);\n }\n }\n\n /**\n * Alias for delete() to match Redis command naming\n */\n async del(key: string): Promise<boolean> {\n return this.delete(key);\n }\n\n async decrement(key: string, value = 1): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(\n this.client!.decrby(fullKey, value),\n this.options.commandTimeout,\n );\n\n return result;\n } catch (error) {\n throw new CacheError(`Failed to decrement key \"${key}\"`, key, error as Error);\n }\n }\n\n async ping(): Promise<string> {\n this.ensureConnected();\n return this.client!.ping();\n }\n\n async flushdb(): Promise<void> {\n this.ensureConnected();\n await this.client!.flushdb();\n }\n\n async mdel(keys: string[]): Promise<number> {\n this.ensureConnected();\n if (keys.length === 0) {\n return 0;\n }\n const fullKeys = keys.map((k) => this.getFullKey(k));\n return this.client!.del(...fullKeys);\n }\n\n async persist(key: string): Promise<boolean> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n const result = await this.client!.persist(fullKey);\n return result === 1;\n }\n\n /**\n * Set key with NX (only if not exists) - useful for distributed locking\n */\n async setNX(key: string, value: unknown, ttl?: number): Promise<boolean> {\n this.ensureConnected();\n const fullKey = this.getFullKey(key);\n const serialized = JSON.stringify(value);\n\n if (ttl) {\n // SET key value EX ttl NX\n const result = await this.client!.set(fullKey, serialized, 'EX', ttl, 'NX');\n return result === 'OK';\n } else {\n const result = await this.client!.setnx(fullKey, serialized);\n return result === 1;\n }\n }\n\n // Hash operations\n async hset(key: string, field: string, value: string): Promise<number> {\n this.ensureConnected();\n return this.client!.hset(this.getFullKey(key), field, value);\n }\n\n async hget(key: string, field: string): Promise<string | null> {\n this.ensureConnected();\n return this.client!.hget(this.getFullKey(key), field);\n }\n\n async hgetall(key: string): Promise<Record<string, string>> {\n this.ensureConnected();\n return this.client!.hgetall(this.getFullKey(key));\n }\n\n async hexists(key: string, field: string): Promise<boolean> {\n this.ensureConnected();\n const result = await this.client!.hexists(this.getFullKey(key), field);\n return result === 1;\n }\n\n async hdel(key: string, ...fields: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.hdel(this.getFullKey(key), ...fields);\n }\n\n // List operations\n async lpush(key: string, ...values: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.lpush(this.getFullKey(key), ...values);\n }\n\n async rpush(key: string, ...values: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.rpush(this.getFullKey(key), ...values);\n }\n\n async lpop(key: string): Promise<string | null> {\n this.ensureConnected();\n return this.client!.lpop(this.getFullKey(key));\n }\n\n async rpop(key: string): Promise<string | null> {\n this.ensureConnected();\n return this.client!.rpop(this.getFullKey(key));\n }\n\n async llen(key: string): Promise<number> {\n this.ensureConnected();\n return this.client!.llen(this.getFullKey(key));\n }\n\n async lrange(key: string, start: number, stop: number): Promise<string[]> {\n this.ensureConnected();\n return this.client!.lrange(this.getFullKey(key), start, stop);\n }\n\n // Set operations\n async sadd(key: string, ...members: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.sadd(this.getFullKey(key), ...members);\n }\n\n async srem(key: string, ...members: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.srem(this.getFullKey(key), ...members);\n }\n\n async smembers(key: string): Promise<string[]> {\n this.ensureConnected();\n return this.client!.smembers(this.getFullKey(key));\n }\n\n async sismember(key: string, member: string): Promise<boolean> {\n this.ensureConnected();\n const result = await this.client!.sismember(this.getFullKey(key), member);\n return result === 1;\n }\n\n async scard(key: string): Promise<number> {\n this.ensureConnected();\n return this.client!.scard(this.getFullKey(key));\n }\n\n // Sorted set operations\n async zadd(key: string, score: number, member: string): Promise<number> {\n this.ensureConnected();\n return this.client!.zadd(this.getFullKey(key), score, member);\n }\n\n async zrem(key: string, ...members: string[]): Promise<number> {\n this.ensureConnected();\n return this.client!.zrem(this.getFullKey(key), ...members);\n }\n\n async zrange(key: string, start: number, stop: number): Promise<string[]> {\n this.ensureConnected();\n return this.client!.zrange(this.getFullKey(key), start, stop);\n }\n\n async zrangeWithScores(key: string, start: number, stop: number): Promise<[string, number][]> {\n this.ensureConnected();\n const result = await this.client!.zrange(this.getFullKey(key), start, stop, 'WITHSCORES');\n const pairs: [string, number][] = [];\n for (let i = 0; i < result.length; i += 2) {\n const member = result[i];\n const score = result[i + 1];\n if (member !== undefined && score !== undefined) {\n pairs.push([member, Number.parseFloat(score)]);\n }\n }\n return pairs;\n }\n\n async zscore(key: string, member: string): Promise<number | null> {\n this.ensureConnected();\n const result = await this.client!.zscore(this.getFullKey(key), member);\n return result === null ? null : Number.parseFloat(result);\n }\n\n async zcard(key: string): Promise<number> {\n this.ensureConnected();\n return this.client!.zcard(this.getFullKey(key));\n }\n\n // Scan iterator\n async *scan(pattern: string): AsyncGenerator<string> {\n this.ensureConnected();\n const fullPattern = this.getFullKey(pattern);\n let cursor = '0';\n do {\n const [nextCursor, keys] = await this.client!.scan(\n cursor,\n 'MATCH',\n fullPattern,\n 'COUNT',\n 100,\n );\n cursor = nextCursor;\n for (const key of keys) {\n yield key.replace(this.options.keyPrefix, '');\n }\n } while (cursor !== '0');\n }\n\n private ensureConnected(): void {\n if (!this.client || !this.isConnected) {\n throw new ConnectionError('Redis client not connected');\n }\n }\n\n get commands(): RedisCommands {\n if (!this._commands) {\n this._commands = new RedisCommands(this);\n }\n return this._commands;\n }\n\n getClient(): Redis | undefined {\n return this.client;\n }\n\n getFullKey(key: string): string {\n return `${this.options.keyPrefix}${key}`;\n }\n\n private serialize<T>(value: T): string {\n try {\n const json = JSON.stringify(value);\n\n if (this.options.enableCompression && json.length > 1024) {\n return this.compress(json);\n }\n\n return json;\n } catch (error) {\n throw new CacheError('Failed to serialize value', undefined, error as Error);\n }\n }\n\n private deserialize<T>(value: string): T {\n try {\n if (this.options.enableCompression && this.isCompressed(value)) {\n value = this.decompress(value);\n }\n\n return JSON.parse(value) as T;\n } catch (error) {\n throw new CacheError('Failed to deserialize value', undefined, error as Error);\n }\n }\n\n private compress(data: string): string {\n return data;\n }\n\n private decompress(data: string): string {\n return data;\n }\n\n private isCompressed(_data: string): boolean {\n return false;\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n\n do {\n const [nextCursor, scannedKeys] = await this.client!.scan(\n cursor,\n 'MATCH',\n pattern,\n 'COUNT',\n 1000,\n );\n\n cursor = nextCursor;\n keys.push(...scannedKeys);\n } while (cursor !== '0');\n\n return keys;\n }\n}\n","import type { RedisAdapter } from './redis-adapter';\nimport type {\n CacheAdapter,\n DatabaseAdapter,\n QueryResult,\n CacheOptions,\n QueryParams,\n QueryOptions,\n} from '@db-bridge/core';\n\nexport interface RedisCacheAdapterOptions {\n redis: RedisAdapter;\n defaultTTL?: number;\n keyPrefix?: string;\n invalidationPatterns?: Map<string, string[]>;\n}\n\nexport class RedisCacheAdapter {\n private redis: RedisAdapter;\n private defaultTTL: number;\n private keyPrefix: string;\n private invalidationPatterns: Map<string, string[]>;\n\n constructor(options: RedisCacheAdapterOptions) {\n this.redis = options.redis;\n this.defaultTTL = options.defaultTTL || 3600;\n this.keyPrefix = options.keyPrefix || 'query:';\n this.invalidationPatterns = options.invalidationPatterns || new Map();\n }\n\n async getCachedQuery<T = unknown>(\n key: string,\n options?: CacheOptions,\n ): Promise<QueryResult<T> | null> {\n const fullKey = this.getQueryKey(key, options);\n return this.redis.get<QueryResult<T>>(fullKey);\n }\n\n async setCachedQuery<T = unknown>(\n key: string,\n result: QueryResult<T>,\n options?: CacheOptions,\n ): Promise<void> {\n const fullKey = this.getQueryKey(key, options);\n const ttl = options?.ttl || this.defaultTTL;\n\n await this.redis.set(fullKey, result, ttl);\n\n if (options?.invalidateOn) {\n await this.registerInvalidation(fullKey, options.invalidateOn);\n }\n }\n\n async invalidateQueries(patterns: string[]): Promise<number> {\n let invalidatedCount = 0;\n\n for (const pattern of patterns) {\n const keys = await this.redis.keys(`${this.keyPrefix}${pattern}`);\n\n for (const key of keys) {\n const deleted = await this.redis.delete(key);\n if (deleted) {\n invalidatedCount++;\n }\n }\n\n const registeredKeys = this.invalidationPatterns.get(pattern) || [];\n for (const key of registeredKeys) {\n const deleted = await this.redis.delete(key);\n if (deleted) {\n invalidatedCount++;\n }\n }\n }\n\n return invalidatedCount;\n }\n\n async invalidateAll(): Promise<void> {\n const keys = await this.redis.keys(`${this.keyPrefix}*`);\n\n if (keys.length > 0) {\n await Promise.all(keys.map((key) => this.redis.delete(key)));\n }\n\n this.invalidationPatterns.clear();\n }\n\n async getStatistics(): Promise<{\n totalKeys: number;\n totalSize: number;\n patterns: string[];\n }> {\n const keys = await this.redis.keys(`${this.keyPrefix}*`);\n\n const totalSize = 0;\n const patterns = new Set<string>();\n\n return {\n totalKeys: keys.length,\n totalSize,\n patterns: Array.from(patterns),\n };\n }\n\n private getQueryKey(key: string, options?: CacheOptions): string {\n if (options?.key) {\n return `${this.keyPrefix}${options.key}`;\n }\n return `${this.keyPrefix}${key}`;\n }\n\n private async registerInvalidation(key: string, patterns: string[]): Promise<void> {\n for (const pattern of patterns) {\n const existing = this.invalidationPatterns.get(pattern) || [];\n existing.push(key);\n this.invalidationPatterns.set(pattern, existing);\n }\n }\n}\n\nexport function createDatabaseAdapterWithCache(\n adapter: DatabaseAdapter,\n cacheAdapter: CacheAdapter,\n options?: {\n defaultTTL?: number;\n cacheableCommands?: string[];\n },\n): DatabaseAdapter {\n const cacheableCommands = options?.cacheableCommands || ['SELECT'];\n const defaultTTL = options?.defaultTTL || 3600;\n\n const originalQuery = adapter.query.bind(adapter);\n\n adapter.query = async function <T = unknown>(\n sql: string,\n params?: QueryParams,\n queryOptions?: QueryOptions,\n ): Promise<QueryResult<T>> {\n const command = sql.trim().split(' ')[0]?.toUpperCase();\n\n if (!queryOptions?.cache || !cacheableCommands.includes(command!)) {\n return originalQuery<T>(sql, params, queryOptions);\n }\n\n const cacheOptions = typeof queryOptions.cache === 'object' ? queryOptions.cache : {};\n const cacheKey = generateQueryCacheKey(sql, params);\n\n const cached = await cacheAdapter.get<QueryResult<T>>(cacheKey);\n if (cached) {\n return cached;\n }\n\n const result = await originalQuery<T>(sql, params, queryOptions);\n\n const ttl = cacheOptions.ttl || defaultTTL;\n await cacheAdapter.set(cacheKey, result, ttl);\n\n return result;\n };\n\n return adapter;\n}\n\nfunction generateQueryCacheKey(sql: string, params?: QueryParams): string {\n const crypto = require('node:crypto');\n const hash = crypto.createHash('sha256');\n hash.update(sql);\n\n if (params) {\n hash.update(JSON.stringify(params));\n }\n\n return hash.digest('hex');\n}\n","import { ConnectionError, withTimeout } from '@db-bridge/core';\nimport { EventEmitter } from 'eventemitter3';\nimport Redis from 'ioredis';\n\nimport type { RedisOptions } from 'ioredis';\n\nexport interface ConnectionConfig {\n redis?: RedisOptions;\n keyPrefix?: string;\n connectionTimeout?: number;\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n };\n}\n\nexport class RedisConnectionManager extends EventEmitter {\n protected client?: Redis;\n protected isConnected = false;\n protected config: ConnectionConfig;\n\n constructor(config: ConnectionConfig = {}) {\n super();\n this.config = {\n keyPrefix: config.keyPrefix || 'db-bridge:',\n connectionTimeout: config.connectionTimeout || 10000,\n retryOptions: {\n maxRetries: config.retryOptions?.maxRetries ?? 3,\n retryDelay: config.retryOptions?.retryDelay ?? 1000,\n },\n redis: config.redis || {},\n };\n }\n\n async connect(overrideConfig?: RedisOptions): Promise<void> {\n if (this.isConnected) {\n return;\n }\n\n const redisConfig: RedisOptions = {\n ...this.config.redis,\n ...overrideConfig,\n lazyConnect: true,\n enableOfflineQueue: false,\n retryStrategy: (times: number) => {\n if (times > this.config.retryOptions!.maxRetries!) {\n return null;\n }\n return Math.min(times * this.config.retryOptions!.retryDelay!, 5000);\n },\n };\n\n this.client = new Redis(redisConfig);\n this.setupEventHandlers();\n\n try {\n await withTimeout(\n this.client.connect(),\n this.config.connectionTimeout!,\n 'Redis connection timeout',\n );\n } catch (error) {\n throw new ConnectionError('Failed to connect to Redis', error as Error);\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.client && this.isConnected) {\n await this.client.quit();\n this.client = undefined;\n this.isConnected = false;\n }\n }\n\n getClient(): Redis | undefined {\n return this.client;\n }\n\n ensureConnected(): void {\n if (!this.client || !this.isConnected) {\n throw new ConnectionError('Redis client not connected');\n }\n }\n\n getFullKey(key: string): string {\n return `${this.config.keyPrefix}${key}`;\n }\n\n private setupEventHandlers(): void {\n if (!this.client) {\n return;\n }\n\n this.client.on('error', (error: Error) => {\n this.emit('error', error);\n });\n\n this.client.on('connect', () => {\n this.isConnected = true;\n this.emit('connect');\n });\n\n this.client.on('close', () => {\n this.isConnected = false;\n this.emit('disconnect');\n });\n }\n}\n","import { CacheError, withTimeout } from '@db-bridge/core';\n\nimport { RedisConnectionManager } from './connection-trait';\n\nexport class BasicOperationsTrait extends RedisConnectionManager {\n protected commandTimeout = 5000;\n\n setCommandTimeout(timeout: number): void {\n this.commandTimeout = timeout;\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const value = await withTimeout(this.client!.get(fullKey), this.commandTimeout);\n\n if (!value) {\n return null;\n }\n\n return this.deserialize<T>(value);\n } catch (error) {\n throw new CacheError(`Failed to get key \"${key}\"`, key, error as Error);\n }\n }\n\n async set<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const serialized = this.serialize(value);\n\n if (ttl && ttl > 0) {\n await withTimeout(this.client!.setex(fullKey, ttl, serialized), this.commandTimeout);\n } else {\n await withTimeout(this.client!.set(fullKey, serialized), this.commandTimeout);\n }\n\n this.emit('set', { key, ttl });\n } catch (error) {\n throw new CacheError(`Failed to set key \"${key}\"`, key, error as Error);\n }\n }\n\n async delete(key: string): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.del(fullKey), this.commandTimeout);\n\n const deleted = result > 0;\n if (deleted) {\n this.emit('delete', { key });\n }\n\n return deleted;\n } catch (error) {\n throw new CacheError(`Failed to delete key \"${key}\"`, key, error as Error);\n }\n }\n\n async del(key: string): Promise<boolean> {\n return this.delete(key);\n }\n\n async exists(key: string): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.exists(fullKey), this.commandTimeout);\n\n return result > 0;\n } catch (error) {\n throw new CacheError(`Failed to check existence of key \"${key}\"`, key, error as Error);\n }\n }\n\n async ttl(key: string): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const ttl = await withTimeout(this.client!.ttl(fullKey), this.commandTimeout);\n\n return ttl >= 0 ? ttl : -1;\n } catch (error) {\n throw new CacheError(`Failed to get TTL for key \"${key}\"`, key, error as Error);\n }\n }\n\n async expire(key: string, ttl: number): Promise<boolean> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.expire(fullKey, ttl), this.commandTimeout);\n\n return result === 1;\n } catch (error) {\n throw new CacheError(`Failed to set expiry for key \"${key}\"`, key, error as Error);\n }\n }\n\n protected serialize<T>(value: T): string {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new CacheError('Failed to serialize value', undefined, error as Error);\n }\n }\n\n protected deserialize<T>(value: string): T {\n try {\n return JSON.parse(value) as T;\n } catch (error) {\n throw new CacheError('Failed to deserialize value', undefined, error as Error);\n }\n }\n}\n","import { CacheError, withTimeout } from '@db-bridge/core';\n\nimport { BasicOperationsTrait } from './basic-operations-trait';\n\nexport class BatchOperationsTrait extends BasicOperationsTrait {\n async mget<T = unknown>(keys: string[]): Promise<(T | null)[]> {\n this.ensureConnected();\n\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const fullKeys = keys.map((key) => this.getFullKey(key));\n const values = await withTimeout(this.client!.mget(...fullKeys), this.commandTimeout);\n\n return values.map((value) => {\n if (!value) {\n return null;\n }\n return this.deserialize<T>(value);\n });\n } catch (error) {\n throw new CacheError('Failed to get multiple keys', undefined, error as Error);\n }\n }\n\n async mset<T = unknown>(items: Array<{ key: string; value: T; ttl?: number }>): Promise<void> {\n this.ensureConnected();\n\n if (items.length === 0) {\n return;\n }\n\n try {\n const pipeline = this.client!.pipeline();\n\n items.forEach(({ key, value, ttl }) => {\n const fullKey = this.getFullKey(key);\n const serialized = this.serialize(value);\n\n if (ttl && ttl > 0) {\n pipeline.setex(fullKey, ttl, serialized);\n } else {\n pipeline.set(fullKey, serialized);\n }\n });\n\n await pipeline.exec();\n this.emit('mset', { count: items.length });\n } catch (error) {\n throw new CacheError('Failed to set multiple keys', undefined, error as Error);\n }\n }\n\n async clear(): Promise<void> {\n this.ensureConnected();\n\n try {\n const pattern = `${this.config.keyPrefix}*`;\n const keys = await this.scanKeys(pattern);\n\n if (keys.length > 0) {\n const pipeline = this.client!.pipeline();\n keys.forEach((key) => pipeline.del(key));\n await pipeline.exec();\n }\n\n this.emit('clear', { count: keys.length });\n } catch (error) {\n throw new CacheError('Failed to clear cache', undefined, error as Error);\n }\n }\n\n async keys(pattern = '*'): Promise<string[]> {\n this.ensureConnected();\n\n try {\n const fullPattern = pattern.startsWith(this.config.keyPrefix!)\n ? pattern\n : this.getFullKey(pattern);\n\n const keys = await withTimeout(this.scanKeys(fullPattern), this.commandTimeout * 5);\n\n return keys.map((key) => key.replace(this.config.keyPrefix!, ''));\n } catch (error) {\n throw new CacheError('Failed to get keys', undefined, error as Error);\n }\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = [];\n let cursor = '0';\n\n do {\n const [nextCursor, scannedKeys] = await this.client!.scan(\n cursor,\n 'MATCH',\n pattern,\n 'COUNT',\n 1000,\n );\n\n cursor = nextCursor;\n keys.push(...scannedKeys);\n } while (cursor !== '0');\n\n return keys;\n }\n}\n","import { CacheError, withTimeout } from '@db-bridge/core';\n\nimport { BatchOperationsTrait } from './batch-operations-trait';\n\nexport class CounterOperationsTrait extends BatchOperationsTrait {\n async increment(key: string, value = 1): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.incrby(fullKey, value), this.commandTimeout);\n\n return result;\n } catch (error) {\n throw new CacheError(`Failed to increment key \"${key}\"`, key, error as Error);\n }\n }\n\n async decrement(key: string, value = 1): Promise<number> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(this.client!.decrby(fullKey, value), this.commandTimeout);\n\n return result;\n } catch (error) {\n throw new CacheError(`Failed to decrement key \"${key}\"`, key, error as Error);\n }\n }\n\n async incr(key: string): Promise<number> {\n return this.increment(key, 1);\n }\n\n async decr(key: string): Promise<number> {\n return this.decrement(key, 1);\n }\n\n async incrby(key: string, value: number): Promise<number> {\n return this.increment(key, value);\n }\n\n async decrby(key: string, value: number): Promise<number> {\n return this.decrement(key, value);\n }\n\n async incrbyfloat(key: string, value: number): Promise<string> {\n this.ensureConnected();\n\n try {\n const fullKey = this.getFullKey(key);\n const result = await withTimeout(\n this.client!.incrbyfloat(fullKey, value),\n this.commandTimeout,\n );\n\n return result;\n } catch (error) {\n throw new CacheError(`Failed to increment float key \"${key}\"`, key, error as Error);\n }\n }\n}\n","import { CounterOperationsTrait } from './traits/counter-operations-trait';\nimport { RedisCommands } from '../commands/redis-commands';\n\nimport type { CacheAdapter, Logger } from '@db-bridge/core';\nimport type { RedisOptions } from 'ioredis';\n\nexport interface RedisAdapterOptions {\n redis?: RedisOptions;\n keyPrefix?: string;\n ttl?: number;\n logger?: Logger;\n enableCompression?: boolean;\n connectionTimeout?: number;\n commandTimeout?: number;\n retryOptions?: {\n maxRetries?: number;\n retryDelay?: number;\n };\n}\n\nexport class ModularRedisAdapter extends CounterOperationsTrait implements CacheAdapter {\n private _commands?: RedisCommands;\n private defaultTtl: number;\n private logger?: Logger;\n private enableCompression: boolean;\n\n constructor(options: RedisAdapterOptions = {}) {\n super({\n redis: options.redis,\n keyPrefix: options.keyPrefix,\n connectionTimeout: options.connectionTimeout,\n retryOptions: options.retryOptions,\n });\n\n this.defaultTtl = options.ttl || 3600;\n this.logger = options.logger;\n this.enableCompression = options.enableCompression || false;\n\n if (options.commandTimeout) {\n this.setCommandTimeout(options.commandTimeout);\n }\n\n this.setupLogging();\n }\n\n override async connect(config?: RedisOptions): Promise<void> {\n await super.connect(config);\n this.logger?.info('Connected to Redis');\n }\n\n override async disconnect(): Promise<void> {\n await super.disconnect();\n this.logger?.info('Disconnected from Redis');\n }\n\n override async set<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n const effectiveTtl = ttl === undefined ? this.defaultTtl : ttl;\n await super.set(key, value, effectiveTtl);\n }\n\n get commands(): RedisCommands {\n if (!this._commands) {\n this._commands = new RedisCommands(this as any);\n }\n return this._commands;\n }\n\n protected override serialize<T>(value: T): string {\n try {\n const json = super.serialize(value);\n\n if (this.enableCompression && json.length > 1024) {\n return this.compress(json);\n }\n\n return json;\n } catch (error) {\n this.logger?.error('Serialization error', error as Error);\n throw error;\n }\n }\n\n protected override deserialize<T>(value: string): T {\n try {\n if (this.enableCompression && this.isCompressed(value)) {\n value = this.decompress(value);\n }\n\n return super.deserialize<T>(value);\n } catch (error) {\n this.logger?.error('Deserialization error', error as Error);\n throw error;\n }\n }\n\n private compress(data: string): string {\n // Placeholder for compression logic\n return data;\n }\n\n private decompress(data: string): string {\n // Placeholder for decompression logic\n return data;\n }\n\n private isCompressed(_data: string): boolean {\n // Placeholder for compression detection\n return false;\n }\n\n private setupLogging(): void {\n if (!this.logger) {\n return;\n }\n\n this.on('error', (error: Error) => {\n this.logger?.error('Redis client error', error);\n });\n\n this.on('connect', () => {\n this.logger?.debug('Redis connected');\n });\n\n this.on('disconnect', () => {\n this.logger?.debug('Redis disconnected');\n });\n\n this.on('set', ({ key, ttl }) => {\n this.logger?.debug('Cache set', { key, ttl });\n });\n\n this.on('delete', ({ key }) => {\n this.logger?.debug('Cache delete', { key });\n });\n\n this.on('clear', ({ count }) => {\n this.logger?.debug('Cache cleared', { count });\n });\n\n this.on('mset', ({ count }) => {\n this.logger?.debug('Multiple cache set', { count });\n });\n }\n}\n","import { CacheError } from '@db-bridge/core';\nimport { EventEmitter } from 'eventemitter3';\n\nimport type Redis from 'ioredis';\n\nexport interface StreamEntry {\n id: string;\n fields: Record<string, string>;\n}\n\nexport interface StreamInfo {\n length: number;\n radixTreeKeys: number;\n radixTreeNodes: number;\n groups: number;\n lastGeneratedId: string;\n firstEntry?: StreamEntry;\n lastEntry?: StreamEntry;\n}\n\nexport class StreamBaseTrait extends EventEmitter {\n constructor(protected client: Redis) {\n super();\n }\n\n protected parseEntries(raw: any[]): StreamEntry[] {\n return raw.map(([id, fields]) => ({\n id,\n fields: this.parseFields(fields),\n }));\n }\n\n protected parseFields(raw: string[]): Record<string, string> {\n const fields: Record<string, string> = {};\n\n for (let i = 0; i < raw.length; i += 2) {\n fields[raw[i]!] = raw[i + 1]!;\n }\n\n return fields;\n }\n\n protected parseStreamResults(raw: any[]): Array<[string, StreamEntry[]]> {\n return raw.map(([stream, entries]) => [stream, this.parseEntries(entries)]);\n }\n\n protected camelCase(str: string): string {\n return str.replaceAll(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n }\n\n protected throwError(message: string, key?: string, error?: Error): never {\n throw new CacheError(message, key, error);\n }\n}\n","import { StreamBaseTrait } from './stream-base-trait';\n\nexport class StreamCrudTrait extends StreamBaseTrait {\n async xadd(\n key: string,\n _id: string | '*' = '*',\n fields: Record<string, string | number | boolean>,\n options?: {\n maxlen?: number;\n approximate?: boolean;\n },\n ): Promise<string> {\n try {\n const args: (string | number)[] = [key];\n\n if (options?.maxlen) {\n args.push('MAXLEN');\n if (options.approximate) {\n args.push('~');\n }\n args.push(options.maxlen);\n }\n\n args.push(_id);\n\n // Flatten fields\n Object.entries(fields).forEach(([field, value]) => {\n args.push(field, String(value));\n });\n\n const resultId = await this.client.xadd(\n key,\n args[1] as string,\n ...(args.slice(2) as string[]),\n );\n return resultId || '';\n } catch (error) {\n this.throwError(`Failed to add to stream ${key}`, key, error as Error);\n }\n }\n\n async xdel(key: string, ...ids: string[]): Promise<number> {\n try {\n return await this.client.xdel(key, ...ids);\n } catch (error) {\n this.throwError(`Failed to delete from stream ${key}`, key, error as Error);\n }\n }\n\n async xtrim(key: string, maxlen: number, approximate = false): Promise<number> {\n try {\n const args: (string | number)[] = [key, 'MAXLEN'];\n\n if (approximate) {\n args.push('~');\n }\n\n args.push(maxlen);\n\n return approximate\n ? await this.client.xtrim(key, 'MAXLEN', '~', maxlen)\n : await this.client.xtrim(key, 'MAXLEN', maxlen);\n } catch (error) {\n this.throwError(`Failed to trim stream ${key}`, key, error as Error);\n }\n }\n\n async xlen(key: string): Promise<number> {\n try {\n return await this.client.xlen(key);\n } catch (error) {\n this.throwError(`Failed to get stream length ${key}`, key, error as Error);\n }\n }\n}\n","import { StreamCrudTrait } from './stream-crud-trait';\n\nimport type { StreamEntry } from './stream-base-trait';\n\nexport class StreamReadTrait extends StreamCrudTrait {\n async xread(\n streams: Record<string, string>,\n options?: {\n count?: number;\n block?: number;\n },\n ): Promise<Array<[string, StreamEntry[]]>> {\n try {\n const args: (string | number)[] = [];\n\n if (options?.count) {\n args.push('COUNT', options.count);\n }\n if (options?.block !== undefined) {\n args.push('BLOCK', options.block);\n }\n\n args.push('STREAMS');\n\n const keys = Object.keys(streams);\n const ids = Object.values(streams);\n args.push(...keys, ...ids);\n\n const result = await (this.client as any).xread(...args);\n\n if (!result) {\n return [];\n }\n\n return this.parseStreamResults(result);\n } catch (error) {\n this.throwError('Failed to read from streams', undefined, error as Error);\n }\n }\n\n async xrange(\n key: string,\n start: string = '-',\n end: string = '+',\n count?: number,\n ): Promise<StreamEntry[]> {\n try {\n const args: (string | number)[] = [key, start, end];\n\n if (count) {\n args.push('COUNT', count);\n }\n\n const result = count\n ? await this.client.xrange(key, start, end, 'COUNT', count)\n : await this.client.xrange(key, start, end);\n return this.parseEntries(result as any);\n } catch (error) {\n this.throwError(`Failed to read range from stream ${key}`, key, error as Error);\n }\n }\n\n async xrevrange(\n key: string,\n end: string = '+',\n start: string = '-',\n count?: number,\n ): Promise<StreamEntry[]> {\n try {\n const args: (string | number)[] = [key, end, start];\n\n if (count) {\n args.push('COUNT', count);\n }\n\n const result = count\n ? await this.client.xrevrange(key, end, start, 'COUNT', count)\n : await this.client.xrevrange(key, end, start);\n return this.parseEntries(result as any);\n } catch (error) {\n this.throwError(`Failed to read reverse range from stream ${key}`, key, error as Error);\n }\n }\n}\n","import { StreamReadTrait } from './stream-read-trait';\n\nimport type { StreamEntry } from './stream-base-trait';\n\nexport interface ConsumerGroupInfo {\n name: string;\n consumers: number;\n pending: number;\n lastDeliveredId: string;\n}\n\nexport class StreamConsumerTrait extends StreamReadTrait {\n async xgroupCreate(\n key: string,\n groupName: string,\n id: string = '$',\n mkstream = false,\n ): Promise<void> {\n try {\n const args: (string | boolean)[] = [key, groupName, id];\n\n if (mkstream) {\n args.push('MKSTREAM');\n }\n\n if (mkstream) {\n await this.client.xgroup('CREATE', key, groupName, id, 'MKSTREAM');\n } else {\n await this.client.xgroup('CREATE', key, groupName, id);\n }\n } catch (error) {\n // Ignore error if group already exists\n if (!(error as any).message?.includes('BUSYGROUP')) {\n this.throwError(`Failed to create consumer group ${groupName}`, key, error as Error);\n }\n }\n }\n\n async xgroupDestroy(key: string, groupName: string): Promise<boolean> {\n try {\n const result = await this.client.xgroup('DESTROY', key, groupName);\n return result === 1;\n } catch (error) {\n this.throwError(`Failed to destroy consumer group ${groupName}`, key, error as Error);\n }\n }\n\n async xgroupSetId(key: string, groupName: string, id: string): Promise<void> {\n try {\n await this.client.xgroup('SETID', key, groupName, id);\n } catch (error) {\n this.throwError(`Failed to set ID for consumer group ${groupName}`, key, error as Error);\n }\n }\n\n async xreadgroup(\n groupName: string,\n consumerName: string,\n streams: Record<string, string>,\n options?: {\n count?: number;\n block?: number;\n noack?: boolean;\n },\n ): Promise<Array<[string, StreamEntry[]]>> {\n try {\n const args: (string | number)[] = ['GROUP', groupName, consumerName];\n\n if (options?.count) {\n args.push('COUNT', options.count);\n }\n if (options?.block !== undefined) {\n args.push('BLOCK', options.block);\n }\n if (options?.noack) {\n args.push('NOACK');\n }\n\n args.push('STREAMS');\n\n const keys = Object.keys(streams);\n const ids = Object.values(streams);\n args.push(...keys, ...ids);\n\n const result = await (this.client as any).xreadgroup(...args);\n\n if (!result) {\n return [];\n }\n\n return this.parseStreamResults(result);\n } catch (error) {\n this.throwError('Failed to read from consumer group', undefined, error as Error);\n }\n }\n\n async xack(key: string, groupName: string, ...ids: string[]): Promise<number> {\n try {\n return await this.client.xack(key, groupName, ...ids);\n } catch (error) {\n this.throwError(`Failed to acknowledge messages in group ${groupName}`, key, error as Error);\n }\n }\n\n async xpending(\n key: string,\n groupName: string,\n options?: {\n start?: string;\n end?: string;\n count?: number;\n consumer?: string;\n },\n ): Promise<any> {\n try {\n const args: (string | number)[] = [key, groupName];\n\n if (options?.start && options?.end) {\n args.push(options.start, options.end, options.count || 10);\n\n if (options.consumer) {\n args.push(options.consumer);\n }\n }\n\n return await ((this.client as any).xpending(...args) as Promise<unknown>);\n } catch (error) {\n this.throwError(`Failed to get pending messages for group ${groupName}`, key, error as Error);\n }\n }\n\n async xclaim(\n key: string,\n groupName: string,\n consumerName: string,\n minIdleTime: number,\n ids: string[],\n options?: {\n idle?: number;\n time?: number;\n retrycount?: number;\n force?: boolean;\n justid?: boolean;\n },\n ): Promise<StreamEntry[] | string[]> {\n try {\n const args: (string | number)[] = [key, groupName, consumerName, minIdleTime, ...ids];\n\n if (options?.idle) {\n args.push('IDLE', options.idle);\n }\n if (options?.time) {\n args.push('TIME', options.time);\n }\n if (options?.retrycount) {\n args.push('RETRYCOUNT', options.retrycount);\n }\n if (options?.force) {\n args.push('FORCE');\n }\n if (options?.justid) {\n args.push('JUSTID');\n }\n\n const result = await (this.client as any).xclaim(...args);\n\n if (options?.justid) {\n return result as string[];\n }\n\n return this.parseEntries(result);\n } catch (error) {\n this.throwError(`Failed to claim messages for consumer ${consumerName}`, key, error as Error);\n }\n }\n}\n","import { StreamConsumerTrait } from './stream-consumer-trait';\n\nimport type { StreamInfo } from './stream-base-trait';\nimport type { ConsumerGroupInfo } from './stream-consumer-trait';\n\nexport class StreamInfoTrait extends StreamConsumerTrait {\n async xinfo(\n subcommand: 'STREAM' | 'GROUPS' | 'CONSUMERS',\n key: string,\n groupName?: string,\n ): Promise<StreamInfo | ConsumerGroupInfo[] | any[]> {\n try {\n const args: string[] = [subcommand, key];\n\n if (groupName && subcommand === 'CONSUMERS') {\n args.push(groupName);\n }\n\n const result = await (this.client as any).xinfo(...args);\n\n if (subcommand === 'STREAM') {\n return this.parseStreamInfo(result);\n } else if (subcommand === 'GROUPS') {\n return this.parseGroupsInfo(result);\n } else {\n return result as any[];\n }\n } catch (error) {\n this.throwError(`Failed to get info for stream ${key}`, key, error as Error);\n }\n }\n\n private parseStreamInfo(raw: any[]): StreamInfo {\n const info: any = {};\n\n for (let i = 0; i < raw.length; i += 2) {\n const key = raw[i];\n const value = raw[i + 1];\n\n switch (key) {\n case 'length':\n case 'radix-tree-keys':\n case 'radix-tree-nodes':\n case 'groups': {\n info[this.camelCase(key)] = value;\n break;\n }\n case 'last-generated-id': {\n info.lastGeneratedId = value;\n break;\n }\n case 'first-entry':\n case 'last-entry': {\n if (value) {\n info[this.camelCase(key)] = {\n id: value[0],\n fields: this.parseFields(value[1]),\n };\n }\n break;\n }\n }\n }\n\n return info as StreamInfo;\n }\n\n private parseGroupsInfo(raw: any[]): ConsumerGroupInfo[] {\n return raw.map((group) => {\n const info: any = {};\n\n for (let i = 0; i < group.length; i += 2) {\n const key = group[i];\n const value = group[i + 1];\n\n switch (key) {\n case 'name':\n case 'consumers':\n case 'pending': {\n info[key] = value;\n break;\n }\n case 'last-delivered-id': {\n info.lastDeliveredId = value;\n break;\n }\n }\n }\n\n return info as ConsumerGroupInfo;\n });\n }\n}\n","import { StreamInfoTrait } from './traits/stream-info-trait';\n\nimport type Redis from 'ioredis';\n\nexport * from './traits/stream-base-trait';\nexport * from './traits/stream-consumer-trait';\n\n/**\n * Modular Redis Stream Manager\n * Refactored from 453 lines to modular traits\n */\nexport class ModularRedisStreamManager extends StreamInfoTrait {\n constructor(client: Redis) {\n super(client);\n }\n\n // Additional high-level methods can be added here\n async createStreamWithGroup(\n key: string,\n groupName: string,\n options?: {\n maxlen?: number;\n approximate?: boolean;\n },\n ): Promise<void> {\n // Create stream with initial entry if needed\n await this.xadd(key, '*', { init: 'true' }, options);\n\n // Create consumer group\n await this.xgroupCreate(key, groupName, '0');\n\n // Delete the init entry\n const entries = await this.xrange(key, '-', '+', 1);\n if (entries.length > 0 && entries[0]?.fields['init'] === 'true') {\n await this.xdel(key, entries[0].id);\n }\n }\n\n async getStreamStats(key: string): Promise<{\n length: number;\n info: any;\n groups?: any[];\n }> {\n const length = await this.xlen(key);\n const info = await this.xinfo('STREAM', key);\n\n let groups: any[] | undefined;\n try {\n const groupsInfo = await this.xinfo('GROUPS', key);\n groups = Array.isArray(groupsInfo) ? groupsInfo : undefined;\n } catch {\n // Stream might not have consumer groups\n }\n\n return { length, info, groups };\n }\n\n async consumeStream(\n groupName: string,\n consumerName: string,\n keys: string[],\n options?: {\n count?: number;\n block?: number;\n processMessage: (key: string, message: any) => Promise<void>;\n autoAck?: boolean;\n },\n ): Promise<number> {\n const streams: Record<string, string> = {};\n keys.forEach((key) => {\n streams[key] = '>';\n });\n\n const messages = await this.xreadgroup(groupName, consumerName, streams, {\n count: options?.count,\n block: options?.block,\n noack: options?.autoAck,\n });\n\n let processedCount = 0;\n\n for (const [streamKey, entries] of messages) {\n for (const entry of entries) {\n if (options?.processMessage) {\n await options.processMessage(streamKey, entry);\n }\n\n if (!options?.autoAck) {\n await this.xack(streamKey, groupName, entry.id);\n }\n\n processedCount++;\n }\n }\n\n return processedCount;\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "module",
|
|
3
|
+
"name": "@db-bridge/redis",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Redis caching and operations for db-bridge",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/**/*",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsup --watch",
|
|
21
|
+
"test": "vitest",
|
|
22
|
+
"test:coverage": "vitest --coverage",
|
|
23
|
+
"lint": "eslint src --ext .ts",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rimraf dist"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@db-bridge/core": "^1.0.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"ioredis": "^5.4.0"
|
|
32
|
+
},
|
|
33
|
+
"peerDependenciesMeta": {
|
|
34
|
+
"ioredis": {
|
|
35
|
+
"optional": false
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
41
|
+
"ioredis": "^5.9.0",
|
|
42
|
+
"tsup": "^8.0.1",
|
|
43
|
+
"typescript": "^5.3.0",
|
|
44
|
+
"vitest": "^3.0.0"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=16.0.0"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"gitHead": "7aaca822d0d43120f453562de592e48e7d3e8d32"
|
|
54
|
+
}
|