@nestjs-redisx/testing 1.5.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 +76 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1750 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1739 -0
- package/dist/index.mjs.map +1 -0
- package/dist/memory/api/redis-testing.module.d.ts +20 -0
- package/dist/memory/api/redis-testing.module.d.ts.map +1 -0
- package/dist/memory/api/register-memory-driver.d.ts +8 -0
- package/dist/memory/api/register-memory-driver.d.ts.map +1 -0
- package/dist/memory/application/ports/command-executor.port.d.ts +9 -0
- package/dist/memory/application/ports/command-executor.port.d.ts.map +1 -0
- package/dist/memory/application/services/command-executor.service.d.ts +49 -0
- package/dist/memory/application/services/command-executor.service.d.ts.map +1 -0
- package/dist/memory/domain/lua/lua-interpreter.d.ts +46 -0
- package/dist/memory/domain/lua/lua-interpreter.d.ts.map +1 -0
- package/dist/memory/domain/lua/lua-lexer.d.ts +11 -0
- package/dist/memory/domain/lua/lua-lexer.d.ts.map +1 -0
- package/dist/memory/domain/lua/lua-parser.d.ts +67 -0
- package/dist/memory/domain/lua/lua-parser.d.ts.map +1 -0
- package/dist/memory/domain/lua/redis-call.port.d.ts +7 -0
- package/dist/memory/domain/lua/redis-call.port.d.ts.map +1 -0
- package/dist/memory/domain/store/memory-store.d.ts +59 -0
- package/dist/memory/domain/store/memory-store.d.ts.map +1 -0
- package/dist/memory/domain/store/stream-value.d.ts +74 -0
- package/dist/memory/domain/store/stream-value.d.ts.map +1 -0
- package/dist/memory/infrastructure/adapters/memory-redis.adapter.d.ts +22 -0
- package/dist/memory/infrastructure/adapters/memory-redis.adapter.d.ts.map +1 -0
- package/dist/shared/constants/index.d.ts +6 -0
- package/dist/shared/constants/index.d.ts.map +1 -0
- package/dist/shared/errors/index.d.ts +22 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +19 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants/index.ts","../src/shared/errors/index.ts","../src/memory/domain/store/stream-value.ts","../src/memory/domain/store/memory-store.ts","../src/memory/domain/lua/lua-lexer.ts","../src/memory/domain/lua/lua-parser.ts","../src/memory/domain/lua/lua-interpreter.ts","../src/memory/application/services/command-executor.service.ts","../src/memory/infrastructure/adapters/memory-redis.adapter.ts","../src/memory/api/register-memory-driver.ts","../src/memory/api/redis-testing.module.ts","../src/index.ts"],"names":["RedisXError","ErrorCode","createHash","BaseRedisDriver","registerDriver","RedisModule"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Driver type identifier registered with the core driver registry.\n * Use it via `RedisModule.forRoot({ clients: { type: MEMORY_DRIVER_TYPE } })`.\n */\nexport const MEMORY_DRIVER_TYPE = 'memory';\n","import { RedisXError, ErrorCode } from '@nestjs-redisx/core';\n\n/**\n * Base error for the in-memory testing driver.\n */\nexport class MemoryDriverError extends RedisXError {\n constructor(message: string, cause?: Error) {\n super(message, ErrorCode.OP_FAILED, cause);\n this.name = 'MemoryDriverError';\n }\n}\n\n/**\n * Thrown when a Lua script uses a construct or command the in-memory\n * interpreter does not support. Failing loudly prevents silent wrong results.\n */\nexport class LuaExecutionError extends MemoryDriverError {\n constructor(message: string, cause?: Error) {\n super(`Lua execution error: ${message}`, cause);\n this.name = 'LuaExecutionError';\n }\n}\n\n/**\n * Thrown when a command targets a key holding the wrong data type\n * (mirrors Redis WRONGTYPE).\n */\nexport class WrongTypeError extends MemoryDriverError {\n constructor() {\n super('WRONGTYPE Operation against a key holding the wrong kind of value');\n this.name = 'WrongTypeError';\n }\n}\n","import { MemoryDriverError } from '../../../shared/errors';\n\n/** A single stream entry: an id and a flat [field, value, ...] array. */\nexport type StreamEntry = {\n id: string;\n fields: string[];\n};\n\n/** A pending (delivered, not-yet-acked) entry in a group's PEL. */\nexport type PendingEntry = {\n consumer: string;\n /** Last delivery time (epoch ms) — used to compute idle time. */\n deliveryTime: number;\n deliveryCount: number;\n};\n\n/** A consumer group: its delivery cursor and pending-entries list (PEL). */\nexport type StreamGroup = {\n lastDeliveredId: string;\n pending: Map<string, PendingEntry>;\n consumers: Set<string>;\n};\n\n/** Parsed stream id `<ms>-<seq>`. */\ntype ParsedId = { ms: number; seq: number };\n\nfunction parseId(id: string): ParsedId {\n const [msPart, seqPart = '0'] = id.split('-');\n return { ms: Number(msPart), seq: Number(seqPart) };\n}\n\n/** Compares two `<ms>-<seq>` ids. Returns <0, 0, or >0. */\nexport function compareIds(a: string, b: string): number {\n const pa = parseId(a);\n const pb = parseId(b);\n return pa.ms !== pb.ms ? pa.ms - pb.ms : pa.seq - pb.seq;\n}\n\n/** Resolves a range bound token (`-`, `+`, `(id`, `id`, or `ms`) to an id + exclusivity. */\nfunction resolveRangeBound(token: string, isStart: boolean): { id: string; exclusive: boolean } {\n let exclusive = false;\n let t = token;\n if (t.startsWith('(')) {\n exclusive = true;\n t = t.slice(1);\n }\n if (t === '-') return { id: '0-0', exclusive };\n if (t === '+') return { id: `${Number.MAX_SAFE_INTEGER}-${Number.MAX_SAFE_INTEGER}`, exclusive };\n // A bare `ms` (no `-seq`) spans the whole millisecond: seq 0 for start, max for end.\n if (!t.includes('-')) t = isStart ? `${t}-0` : `${t}-${Number.MAX_SAFE_INTEGER}`;\n return { id: t, exclusive };\n}\n\n/**\n * In-memory Redis Stream: an ordered entry log plus consumer groups with\n * per-group delivery cursors and pending-entries lists (PEL). Pure data\n * structure — the caller passes the current time so it stays deterministic.\n */\nexport class StreamValue {\n readonly entries: StreamEntry[] = [];\n lastId = '0-0';\n readonly groups = new Map<string, StreamGroup>();\n\n /** Computes the next auto id (`*`) given the current time, keeping ids monotonic. */\n private nextAutoId(now: number): string {\n const last = parseId(this.lastId);\n if (now > last.ms) return `${now}-0`;\n return `${last.ms}-${last.seq + 1}`;\n }\n\n /** Resolves an explicit or `*` id for XADD, validating monotonicity. */\n private resolveAddId(id: string, now: number): string {\n if (id === '*') return this.nextAutoId(now);\n // Support `ms-*` (auto seq within a millisecond).\n let resolved = id;\n if (id.endsWith('-*')) {\n const ms = Number(id.slice(0, -2));\n const last = parseId(this.lastId);\n resolved = last.ms === ms ? `${ms}-${last.seq + 1}` : `${ms}-0`;\n }\n if (compareIds(resolved, this.lastId) <= 0 && this.lastId !== '0-0') {\n throw new MemoryDriverError('ERR The ID specified in XADD is equal or smaller than the target stream top item');\n }\n return resolved;\n }\n\n /** Appends an entry. Returns its id. */\n add(id: string, fields: string[], now: number): string {\n const resolved = this.resolveAddId(id, now);\n this.entries.push({ id: resolved, fields });\n this.lastId = resolved;\n return resolved;\n }\n\n len(): number {\n return this.entries.length;\n }\n\n /** Entries within [start, end] (inclusive bounds, `-`/`+`/`(` supported). */\n range(start: string, end: string, count?: number, reverse = false): StreamEntry[] {\n const lo = resolveRangeBound(start, true);\n const hi = resolveRangeBound(end, false);\n let out = this.entries.filter((e) => {\n const geLo = lo.exclusive ? compareIds(e.id, lo.id) > 0 : compareIds(e.id, lo.id) >= 0;\n const leHi = hi.exclusive ? compareIds(e.id, hi.id) < 0 : compareIds(e.id, hi.id) <= 0;\n return geLo && leHi;\n });\n if (reverse) out = out.reverse();\n if (count !== undefined && count >= 0) out = out.slice(0, count);\n return out;\n }\n\n /** Deletes entries by id. Returns the number removed. */\n del(ids: string[]): number {\n let removed = 0;\n for (const id of ids) {\n const idx = this.entries.findIndex((e) => e.id === id);\n if (idx !== -1) {\n this.entries.splice(idx, 1);\n removed += 1;\n }\n }\n return removed;\n }\n\n /** Trims to at most `maxLen` newest entries. Returns the number removed. */\n trimMaxLen(maxLen: number): number {\n if (maxLen < 0 || this.entries.length <= maxLen) return 0;\n const removed = this.entries.length - maxLen;\n this.entries.splice(0, removed);\n return removed;\n }\n\n // --- consumer groups ------------------------------------------------------\n\n createGroup(name: string, startId: string): void {\n if (this.groups.has(name)) {\n throw new MemoryDriverError(`BUSYGROUP Consumer Group name already exists`);\n }\n const lastDeliveredId = startId === '$' ? this.lastId : startId === '0' ? '0-0' : startId;\n this.groups.set(name, { lastDeliveredId, pending: new Map(), consumers: new Set() });\n }\n\n destroyGroup(name: string): number {\n return this.groups.delete(name) ? 1 : 0;\n }\n\n setGroupId(name: string, id: string): void {\n const group = this.requireGroup(name);\n group.lastDeliveredId = id === '$' ? this.lastId : id === '0' ? '0-0' : id;\n }\n\n delConsumer(name: string, consumer: string): number {\n const group = this.requireGroup(name);\n let removed = 0;\n for (const [id, p] of group.pending) {\n if (p.consumer === consumer) {\n group.pending.delete(id);\n removed += 1;\n }\n }\n group.consumers.delete(consumer);\n return removed;\n }\n\n private requireGroup(name: string): StreamGroup {\n const group = this.groups.get(name);\n if (!group) throw new MemoryDriverError(`NOGROUP No such consumer group '${name}'`);\n return group;\n }\n\n /**\n * XREADGROUP semantics. `id === '>'` delivers never-delivered entries and adds\n * them to the consumer's PEL; an explicit id re-reads that consumer's pending\n * history with id greater than the given one.\n */\n readGroup(name: string, consumer: string, id: string, now: number, count: number | undefined, noAck: boolean): StreamEntry[] {\n const group = this.requireGroup(name);\n group.consumers.add(consumer);\n\n if (id === '>') {\n let fresh = this.entries.filter((e) => compareIds(e.id, group.lastDeliveredId) > 0);\n if (count !== undefined) fresh = fresh.slice(0, count);\n for (const entry of fresh) {\n group.lastDeliveredId = entry.id;\n if (!noAck) group.pending.set(entry.id, { consumer, deliveryTime: now, deliveryCount: 1 });\n }\n return fresh;\n }\n\n // History re-read: this consumer's pending entries with id >= given.\n const from = resolveRangeBound(id, true);\n const pendingIds = [...group.pending.entries()]\n .filter(([eid, p]) => p.consumer === consumer && compareIds(eid, from.id) >= 0)\n .map(([eid]) => eid)\n .sort(compareIds);\n const limited = count !== undefined ? pendingIds.slice(0, count) : pendingIds;\n return limited.map((eid) => this.entries.find((e) => e.id === eid)).filter((e): e is StreamEntry => e !== undefined);\n }\n\n ack(name: string, ids: string[]): number {\n const group = this.requireGroup(name);\n let acked = 0;\n for (const id of ids) {\n if (group.pending.delete(id)) acked += 1;\n }\n return acked;\n }\n\n /** XPENDING summary: total, min/max pending id, and per-consumer counts. */\n pendingSummary(name: string): { count: number; minId: string | null; maxId: string | null; consumers: Array<[string, number]> } {\n const group = this.requireGroup(name);\n const ids = [...group.pending.keys()].sort(compareIds);\n const perConsumer = new Map<string, number>();\n for (const p of group.pending.values()) perConsumer.set(p.consumer, (perConsumer.get(p.consumer) ?? 0) + 1);\n return {\n count: ids.length,\n minId: ids[0] ?? null,\n maxId: ids[ids.length - 1] ?? null,\n consumers: [...perConsumer.entries()],\n };\n }\n\n /** XPENDING range: pending entries in [start,end], optionally filtered by consumer. */\n pendingRange(name: string, start: string, end: string, count: number, now: number, consumer?: string): Array<{ id: string; consumer: string; idleTime: number; deliveryCount: number }> {\n const group = this.requireGroup(name);\n const lo = resolveRangeBound(start, true);\n const hi = resolveRangeBound(end, false);\n return [...group.pending.entries()]\n .filter(([id]) => compareIds(id, lo.id) >= 0 && compareIds(id, hi.id) <= 0)\n .filter(([, p]) => (consumer ? p.consumer === consumer : true))\n .sort((a, b) => compareIds(a[0], b[0]))\n .slice(0, count)\n .map(([id, p]) => ({ id, consumer: p.consumer, idleTime: Math.max(0, now - p.deliveryTime), deliveryCount: p.deliveryCount }));\n }\n\n /** XCLAIM: reassign pending entries idle >= minIdle to `consumer`. Returns claimed entries. */\n claim(name: string, consumer: string, minIdle: number, ids: string[], now: number): StreamEntry[] {\n const group = this.requireGroup(name);\n group.consumers.add(consumer);\n const claimed: StreamEntry[] = [];\n for (const id of ids) {\n const p = group.pending.get(id);\n if (!p) continue;\n if (now - p.deliveryTime < minIdle) continue;\n const entry = this.entries.find((e) => e.id === id);\n if (!entry) {\n // Entry was deleted from the stream — drop it from the PEL like Redis does.\n group.pending.delete(id);\n continue;\n }\n group.pending.set(id, { consumer, deliveryTime: now, deliveryCount: p.deliveryCount + 1 });\n claimed.push(entry);\n }\n return claimed;\n }\n\n /** Entries strictly greater than `id` (XREAD); `$` resolves to the current last id. */\n readAfter(id: string, count?: number): StreamEntry[] {\n const after = id === '$' ? this.lastId : resolveRangeBound(id, true).id;\n let out = this.entries.filter((e) => compareIds(e.id, after) > 0);\n if (count !== undefined) out = out.slice(0, count);\n return out;\n }\n}\n","import { WrongTypeError } from '../../../shared/errors';\nimport { StreamValue } from './stream-value';\n\n/**\n * Tagged union of the Redis value types the in-memory store supports:\n * string, hash, set, sorted set, list (Phase 1) and stream (Phase 2).\n */\nexport type StoredValue = { kind: 'string'; value: string } | { kind: 'hash'; value: Map<string, string> } | { kind: 'set'; value: Set<string> } | { kind: 'zset'; value: Map<string, number> } | { kind: 'list'; value: string[] } | { kind: 'stream'; value: StreamValue };\n\nexport type RedisValueKind = StoredValue['kind'];\n\n/** The concrete value type backing a given Redis kind. */\nexport type ValueOfKind<K extends RedisValueKind> = K extends 'string' ? string : K extends 'hash' ? Map<string, string> : K extends 'set' ? Set<string> : K extends 'zset' ? Map<string, number> : K extends 'list' ? string[] : K extends 'stream' ? StreamValue : never;\n\ntype Entry = {\n data: StoredValue;\n /** Absolute expiry in epoch ms, or null for no expiry. */\n expireAt: number | null;\n};\n\n/**\n * A single in-memory Redis keyspace with lazy TTL expiry.\n *\n * Pure data structure (no NestJS, no I/O). All command behavior lives in the\n * application CommandExecutor; the store only stores and type-checks.\n */\nexport class MemoryStore {\n private readonly keyspace = new Map<string, Entry>();\n\n /** Current logical time (epoch ms). Overridable for deterministic TTL tests. */\n now(): number {\n return Date.now();\n }\n\n /** Returns the live entry for a key, lazily evicting it if expired. */\n private live(key: string): Entry | undefined {\n const entry = this.keyspace.get(key);\n if (!entry) return undefined;\n if (entry.expireAt !== null && entry.expireAt <= this.now()) {\n this.keyspace.delete(key);\n return undefined;\n }\n return entry;\n }\n\n has(key: string): boolean {\n return this.live(key) !== undefined;\n }\n\n /** Deletes a key. Returns true if a live key was removed. */\n delete(key: string): boolean {\n const existed = this.live(key) !== undefined;\n this.keyspace.delete(key);\n return existed;\n }\n\n /** Returns the Redis type name, or 'none' if missing. */\n type(key: string): string {\n return this.live(key)?.data.kind ?? 'none';\n }\n\n flush(): void {\n this.keyspace.clear();\n }\n\n keys(): string[] {\n const out: string[] = [];\n for (const key of [...this.keyspace.keys()]) {\n if (this.has(key)) out.push(key);\n }\n return out;\n }\n\n // --- expiry ---------------------------------------------------------------\n\n /** Sets absolute expiry (epoch ms) or null to persist. Returns true if key exists. */\n setExpireAt(key: string, atMs: number | null): boolean {\n const entry = this.live(key);\n if (!entry) return false;\n entry.expireAt = atMs;\n return true;\n }\n\n /** Remaining TTL in ms: -2 missing, -1 no expiry, else >= 0. */\n pttl(key: string): number {\n const entry = this.live(key);\n if (!entry) return -2;\n if (entry.expireAt === null) return -1;\n return Math.max(0, entry.expireAt - this.now());\n }\n\n // --- typed access ---------------------------------------------------------\n\n /** Reads a container of the expected kind; undefined if missing; throws on type mismatch. */\n read<K extends RedisValueKind>(key: string, kind: K): ValueOfKind<K> | undefined {\n const entry = this.live(key);\n if (!entry) return undefined;\n if (entry.data.kind !== kind) throw new WrongTypeError();\n return entry.data.value as unknown as ValueOfKind<K>;\n }\n\n /** Gets the existing container of `kind`, creating an empty one (no expiry) if absent. Throws on type mismatch. */\n readOrCreate<K extends RedisValueKind>(key: string, kind: K): ValueOfKind<K> {\n const existing = this.read(key, kind);\n if (existing !== undefined) return existing;\n const value = this.emptyContainer(kind);\n this.keyspace.set(key, { data: { kind, value } as unknown as StoredValue, expireAt: null });\n return value as unknown as ValueOfKind<K>;\n }\n\n /** Overwrites a key with a string value, clearing any previous type and expiry. */\n writeString(key: string, value: string): void {\n this.keyspace.set(key, { data: { kind: 'string', value }, expireAt: null });\n }\n\n private emptyContainer(kind: RedisValueKind): StoredValue['value'] {\n switch (kind) {\n case 'string':\n return '';\n case 'hash':\n return new Map<string, string>();\n case 'set':\n return new Set<string>();\n case 'zset':\n return new Map<string, number>();\n case 'list':\n return [];\n case 'stream':\n return new StreamValue();\n }\n }\n}\n","import { LuaExecutionError } from '../../../shared/errors';\n\nexport type TokenType = 'number' | 'string' | 'name' | 'keyword' | 'op' | 'eof';\n\nexport type Token = {\n type: TokenType;\n value: string;\n};\n\nconst KEYWORDS = new Set(['local', 'if', 'then', 'elseif', 'else', 'end', 'for', 'do', 'return', 'and', 'or', 'not', 'nil', 'true', 'false']);\n\n// Multi-character operators must be matched before single-character ones.\nconst MULTI_OPS = ['==', '~=', '<=', '>=', '..'];\nconst SINGLE_OPS = new Set(['+', '-', '*', '/', '%', '<', '>', '=', '#', '(', ')', '[', ']', '{', '}', ',', '.']);\n\n/**\n * Tokenizes the supported Lua subset. Supports `--` line comments, single/double\n * quoted strings, integer/float numbers, identifiers, keywords and operators.\n */\nexport function tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n const n = src.length;\n\n const isDigit = (c: string): boolean => c >= '0' && c <= '9';\n const isNameStart = (c: string): boolean => c === '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n const isNamePart = (c: string): boolean => isNameStart(c) || isDigit(c);\n\n while (i < n) {\n const c = src[i]!;\n\n // whitespace\n if (c === ' ' || c === '\\t' || c === '\\r' || c === '\\n') {\n i++;\n continue;\n }\n\n // line comment: -- ... (note: long comments --[[ ]] are not used by our scripts)\n if (c === '-' && src[i + 1] === '-') {\n i += 2;\n while (i < n && src[i] !== '\\n') i++;\n continue;\n }\n\n // strings\n if (c === '\"' || c === \"'\") {\n const quote = c;\n i++;\n let str = '';\n while (i < n && src[i] !== quote) {\n if (src[i] === '\\\\') {\n const next = src[i + 1];\n str += next === 'n' ? '\\n' : next === 't' ? '\\t' : (next ?? '');\n i += 2;\n } else {\n str += src[i];\n i++;\n }\n }\n if (i >= n) throw new LuaExecutionError('unterminated string literal');\n i++; // closing quote\n tokens.push({ type: 'string', value: str });\n continue;\n }\n\n // numbers (integer or float). A leading '.' followed by a digit is a number;\n // otherwise '.' / '..' are operators handled below.\n if (isDigit(c) || (c === '.' && isDigit(src[i + 1] ?? ''))) {\n let num = '';\n while (i < n && (isDigit(src[i]!) || src[i] === '.')) {\n num += src[i];\n i++;\n }\n tokens.push({ type: 'number', value: num });\n continue;\n }\n\n // identifiers / keywords\n if (isNameStart(c)) {\n let name = '';\n while (i < n && isNamePart(src[i]!)) {\n name += src[i];\n i++;\n }\n tokens.push({ type: KEYWORDS.has(name) ? 'keyword' : 'name', value: name });\n continue;\n }\n\n // multi-char operators\n const two = src.slice(i, i + 2);\n if (MULTI_OPS.includes(two)) {\n tokens.push({ type: 'op', value: two });\n i += 2;\n continue;\n }\n\n // single-char operators\n if (SINGLE_OPS.has(c)) {\n tokens.push({ type: 'op', value: c });\n i++;\n continue;\n }\n\n throw new LuaExecutionError(`unexpected character '${c}'`);\n }\n\n tokens.push({ type: 'eof', value: '' });\n return tokens;\n}\n","import { LuaExecutionError } from '../../../shared/errors';\nimport { Token, tokenize } from './lua-lexer';\n\n// --- AST -------------------------------------------------------------------\n\nexport type Expr = { kind: 'num'; value: number } | { kind: 'str'; value: string } | { kind: 'bool'; value: boolean } | { kind: 'nil' } | { kind: 'name'; name: string } | { kind: 'index'; obj: Expr; key: Expr } | { kind: 'call'; callee: Expr; args: Expr[] } | { kind: 'table'; items: Expr[] } | { kind: 'unop'; op: string; expr: Expr } | { kind: 'binop'; op: string; left: Expr; right: Expr };\n\nexport type Stmt = { kind: 'local'; name: string; expr?: Expr } | { kind: 'assign'; target: Expr; expr: Expr } | { kind: 'if'; clauses: Array<{ cond: Expr; body: Stmt[] }>; elseBody?: Stmt[] } | { kind: 'for'; varName: string; from: Expr; to: Expr; step?: Expr; body: Stmt[] } | { kind: 'return'; expr?: Expr } | { kind: 'exprStmt'; expr: Expr };\n\n// --- Parser ----------------------------------------------------------------\n\nconst BINARY_PRECEDENCE: Record<string, number> = {\n or: 1,\n and: 2,\n '==': 3,\n '~=': 3,\n '<': 3,\n '<=': 3,\n '>': 3,\n '>=': 3,\n '..': 4,\n '+': 5,\n '-': 5,\n '*': 6,\n '/': 6,\n '%': 6,\n};\n\nconst BLOCK_TERMINATORS = new Set(['end', 'else', 'elseif']);\n\n/** Parses the supported Lua subset into a statement list. */\nexport function parse(src: string): Stmt[] {\n const tokens = tokenize(src);\n let pos = 0;\n\n const peek = (): Token => tokens[pos]!;\n const next = (): Token => tokens[pos++]!;\n const isKeyword = (kw: string): boolean => peek().type === 'keyword' && peek().value === kw;\n const isOp = (op: string): boolean => peek().type === 'op' && peek().value === op;\n\n const expectOp = (op: string): void => {\n if (!isOp(op)) throw new LuaExecutionError(`expected '${op}' but got '${peek().value}'`);\n pos++;\n };\n const expectKeyword = (kw: string): void => {\n if (!isKeyword(kw)) throw new LuaExecutionError(`expected '${kw}' but got '${peek().value}'`);\n pos++;\n };\n\n function parseBlock(): Stmt[] {\n const stmts: Stmt[] = [];\n while (peek().type !== 'eof' && !(peek().type === 'keyword' && BLOCK_TERMINATORS.has(peek().value))) {\n stmts.push(parseStatement());\n }\n return stmts;\n }\n\n function parseStatement(): Stmt {\n if (isKeyword('local')) {\n next();\n const name = next();\n if (name.type !== 'name') throw new LuaExecutionError(`expected name after 'local'`);\n let expr: Expr | undefined;\n if (isOp('=')) {\n next();\n expr = parseExpr();\n }\n return { kind: 'local', name: name.value, expr };\n }\n\n if (isKeyword('if')) return parseIf();\n if (isKeyword('for')) return parseFor();\n\n if (isKeyword('return')) {\n next();\n // return may be empty (before a block terminator / eof)\n if (peek().type === 'eof' || (peek().type === 'keyword' && BLOCK_TERMINATORS.has(peek().value))) {\n return { kind: 'return' };\n }\n return { kind: 'return', expr: parseExpr() };\n }\n\n // assignment or expression-statement: parse a prefix expression first\n const prefix = parseExpr();\n if (isOp('=')) {\n next();\n const value = parseExpr();\n if (prefix.kind !== 'name' && prefix.kind !== 'index') {\n throw new LuaExecutionError('invalid assignment target');\n }\n return { kind: 'assign', target: prefix, expr: value };\n }\n return { kind: 'exprStmt', expr: prefix };\n }\n\n function parseIf(): Stmt {\n expectKeyword('if');\n const clauses: Array<{ cond: Expr; body: Stmt[] }> = [];\n const cond = parseExpr();\n expectKeyword('then');\n clauses.push({ cond, body: parseBlock() });\n while (isKeyword('elseif')) {\n next();\n const c = parseExpr();\n expectKeyword('then');\n clauses.push({ cond: c, body: parseBlock() });\n }\n let elseBody: Stmt[] | undefined;\n if (isKeyword('else')) {\n next();\n elseBody = parseBlock();\n }\n expectKeyword('end');\n return { kind: 'if', clauses, elseBody };\n }\n\n function parseFor(): Stmt {\n expectKeyword('for');\n const varTok = next();\n if (varTok.type !== 'name') throw new LuaExecutionError(`expected loop variable name`);\n expectOp('=');\n const from = parseExpr();\n expectOp(',');\n const to = parseExpr();\n let step: Expr | undefined;\n if (isOp(',')) {\n next();\n step = parseExpr();\n }\n expectKeyword('do');\n const body = parseBlock();\n expectKeyword('end');\n return { kind: 'for', varName: varTok.value, from, to, step, body };\n }\n\n // expression parsing with precedence climbing\n function parseExpr(minPrec = 0): Expr {\n let left = parseUnary();\n for (;;) {\n const t = peek();\n const opName = t.type === 'keyword' && (t.value === 'and' || t.value === 'or') ? t.value : t.type === 'op' ? t.value : undefined;\n if (opName === undefined) break;\n const prec = BINARY_PRECEDENCE[opName];\n if (prec === undefined || prec < minPrec) break;\n next();\n // '..' is right-associative; others left-associative\n const nextMin = opName === '..' ? prec : prec + 1;\n const right = parseExpr(nextMin);\n left = { kind: 'binop', op: opName, left, right };\n }\n return left;\n }\n\n function parseUnary(): Expr {\n if (isKeyword('not')) {\n next();\n return { kind: 'unop', op: 'not', expr: parseUnary() };\n }\n if (isOp('-')) {\n next();\n return { kind: 'unop', op: '-', expr: parseUnary() };\n }\n if (isOp('#')) {\n next();\n return { kind: 'unop', op: '#', expr: parseUnary() };\n }\n return parsePostfix();\n }\n\n function parsePostfix(): Expr {\n let expr = parsePrimary();\n for (;;) {\n if (isOp('.')) {\n next();\n const name = next();\n if (name.type !== 'name' && name.type !== 'keyword') throw new LuaExecutionError('expected field name after .');\n expr = { kind: 'index', obj: expr, key: { kind: 'str', value: name.value } };\n } else if (isOp('[')) {\n next();\n const key = parseExpr();\n expectOp(']');\n expr = { kind: 'index', obj: expr, key };\n } else if (isOp('(')) {\n next();\n const args: Expr[] = [];\n if (!isOp(')')) {\n args.push(parseExpr());\n while (isOp(',')) {\n next();\n args.push(parseExpr());\n }\n }\n expectOp(')');\n expr = { kind: 'call', callee: expr, args };\n } else {\n break;\n }\n }\n return expr;\n }\n\n function parsePrimary(): Expr {\n const t = peek();\n if (t.type === 'number') {\n next();\n return { kind: 'num', value: Number(t.value) };\n }\n if (t.type === 'string') {\n next();\n return { kind: 'str', value: t.value };\n }\n if (t.type === 'keyword') {\n if (t.value === 'nil') {\n next();\n return { kind: 'nil' };\n }\n if (t.value === 'true' || t.value === 'false') {\n next();\n return { kind: 'bool', value: t.value === 'true' };\n }\n }\n if (t.type === 'name') {\n next();\n return { kind: 'name', name: t.value };\n }\n if (isOp('(')) {\n next();\n const e = parseExpr();\n expectOp(')');\n return e;\n }\n if (isOp('{')) {\n next();\n const items: Expr[] = [];\n if (!isOp('}')) {\n items.push(parseExpr());\n while (isOp(',')) {\n next();\n if (isOp('}')) break; // trailing comma\n items.push(parseExpr());\n }\n }\n expectOp('}');\n return { kind: 'table', items };\n }\n throw new LuaExecutionError(`unexpected token '${t.value}'`);\n }\n\n const block = parseBlock();\n if (peek().type !== 'eof') throw new LuaExecutionError(`unexpected trailing token '${peek().value}'`);\n return block;\n}\n","import { LuaExecutionError } from '../../../shared/errors';\nimport { Expr, Stmt, parse } from './lua-parser';\nimport { RedisCallPort } from './redis-call.port';\n\n/**\n * A Lua table: a unified array+hash map. Integer keys 1..n form the array part.\n */\nexport class LuaTable {\n readonly map = new Map<number | string, LuaValue>();\n\n get(key: number | string): LuaValue {\n return this.map.has(key) ? (this.map.get(key) as LuaValue) : null;\n }\n\n set(key: number | string, value: LuaValue): void {\n if (value === null) this.map.delete(key);\n else this.map.set(key, value);\n }\n\n /** Lua `#t`: length of the array part (largest n with 1..n present). */\n length(): number {\n let n = 0;\n while (this.map.has(n + 1)) n++;\n return n;\n }\n}\n\nexport type LuaValue = number | string | boolean | null | LuaTable;\n\ntype ReturnSignal = {\n returned: true;\n value: LuaValue;\n};\n\n/** Lua truthiness: only nil and false are falsy. */\nfunction truthy(v: LuaValue): boolean {\n return v !== null && v !== false;\n}\n\nfunction luaToString(v: LuaValue): string {\n if (v === null) return 'nil';\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (typeof v === 'number') return Number.isInteger(v) ? String(v) : String(v);\n if (typeof v === 'string') return v;\n throw new LuaExecutionError('cannot convert table to string');\n}\n\nfunction toNumber(v: LuaValue): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') {\n const n = Number(v);\n if (Number.isNaN(n)) throw new LuaExecutionError(`cannot convert '${v}' to number`);\n return n;\n }\n throw new LuaExecutionError('arithmetic on non-number');\n}\n\n/**\n * Tree-walking interpreter for the supported Lua subset, executing Redis scripts\n * against an in-memory store via a RedisCallPort. Pure (no NestJS / no I/O).\n */\nexport class LuaInterpreter {\n /**\n * Runs a Redis Lua script.\n *\n * @param source - Lua source\n * @param keys - KEYS array (strings)\n * @param argv - ARGV array (strings)\n * @param redisCall - bridge to execute redis.call(cmd, ...args)\n * @returns the script's return value converted to a Redis reply\n */\n run(source: string, keys: string[], argv: string[], redisCall: RedisCallPort): unknown {\n const program = parse(source);\n const env = new Map<string, LuaValue>();\n env.set('KEYS', this.arrayTable(keys));\n env.set('ARGV', this.arrayTable(argv));\n\n const result = this.execBlock(program, env, redisCall);\n return result ? this.luaToRedis(result.value) : null;\n }\n\n private arrayTable(items: string[]): LuaTable {\n const t = new LuaTable();\n items.forEach((item, idx) => t.set(idx + 1, item));\n return t;\n }\n\n private execBlock(stmts: Stmt[], env: Map<string, LuaValue>, redisCall: RedisCallPort): ReturnSignal | undefined {\n for (const stmt of stmts) {\n const sig = this.execStmt(stmt, env, redisCall);\n if (sig) return sig;\n }\n return undefined;\n }\n\n private execStmt(stmt: Stmt, env: Map<string, LuaValue>, redisCall: RedisCallPort): ReturnSignal | undefined {\n switch (stmt.kind) {\n case 'local':\n env.set(stmt.name, stmt.expr ? this.evalExpr(stmt.expr, env, redisCall) : null);\n return undefined;\n\n case 'assign': {\n const value = this.evalExpr(stmt.expr, env, redisCall);\n if (stmt.target.kind === 'name') {\n env.set(stmt.target.name, value);\n } else if (stmt.target.kind === 'index') {\n const obj = this.evalExpr(stmt.target.obj, env, redisCall);\n if (!(obj instanceof LuaTable)) throw new LuaExecutionError('index assignment on non-table');\n const key = this.normalizeKey(this.evalExpr(stmt.target.key, env, redisCall));\n obj.set(key, value);\n } else {\n throw new LuaExecutionError('invalid assignment target');\n }\n return undefined;\n }\n\n case 'if': {\n for (const clause of stmt.clauses) {\n if (truthy(this.evalExpr(clause.cond, env, redisCall))) {\n return this.execBlock(clause.body, env, redisCall);\n }\n }\n if (stmt.elseBody) return this.execBlock(stmt.elseBody, env, redisCall);\n return undefined;\n }\n\n case 'for': {\n const from = toNumber(this.evalExpr(stmt.from, env, redisCall));\n const to = toNumber(this.evalExpr(stmt.to, env, redisCall));\n const step = stmt.step ? toNumber(this.evalExpr(stmt.step, env, redisCall)) : 1;\n if (step === 0) throw new LuaExecutionError(\"'for' step is zero\");\n const had = env.has(stmt.varName);\n const prev = env.get(stmt.varName);\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n env.set(stmt.varName, i);\n const sig = this.execBlock(stmt.body, env, redisCall);\n if (sig) {\n this.restore(env, stmt.varName, had, prev);\n return sig;\n }\n }\n this.restore(env, stmt.varName, had, prev);\n return undefined;\n }\n\n case 'return':\n return { returned: true, value: stmt.expr ? this.evalExpr(stmt.expr, env, redisCall) : null };\n\n case 'exprStmt':\n this.evalExpr(stmt.expr, env, redisCall);\n return undefined;\n }\n }\n\n private restore(env: Map<string, LuaValue>, name: string, had: boolean, prev: LuaValue | undefined): void {\n if (had) env.set(name, prev as LuaValue);\n else env.delete(name);\n }\n\n private evalExpr(expr: Expr, env: Map<string, LuaValue>, redisCall: RedisCallPort): LuaValue {\n switch (expr.kind) {\n case 'num':\n return expr.value;\n case 'str':\n return expr.value;\n case 'bool':\n return expr.value;\n case 'nil':\n return null;\n case 'name':\n return env.has(expr.name) ? (env.get(expr.name) as LuaValue) : null;\n\n case 'index': {\n const obj = this.evalExpr(expr.obj, env, redisCall);\n if (!(obj instanceof LuaTable)) {\n // `redis`/`math` namespaces are not real tables; field access handled in 'call'\n throw new LuaExecutionError('attempt to index a non-table value');\n }\n return obj.get(this.normalizeKey(this.evalExpr(expr.key, env, redisCall)));\n }\n\n case 'table': {\n const t = new LuaTable();\n expr.items.forEach((item, idx) => t.set(idx + 1, this.evalExpr(item, env, redisCall)));\n return t;\n }\n\n case 'unop':\n return this.evalUnop(expr.op, this.evalExpr(expr.expr, env, redisCall));\n\n case 'binop':\n return this.evalBinop(expr, env, redisCall);\n\n case 'call':\n return this.evalCall(expr, env, redisCall);\n }\n }\n\n private normalizeKey(key: LuaValue): number | string {\n if (typeof key === 'number') return key;\n if (typeof key === 'string') return key;\n throw new LuaExecutionError('invalid table key');\n }\n\n private evalUnop(op: string, v: LuaValue): LuaValue {\n switch (op) {\n case 'not':\n return !truthy(v);\n case '-':\n return -toNumber(v);\n case '#':\n if (typeof v === 'string') return v.length;\n if (v instanceof LuaTable) return v.length();\n throw new LuaExecutionError('attempt to get length of a non-string/table');\n default:\n throw new LuaExecutionError(`unsupported unary operator '${op}'`);\n }\n }\n\n private evalBinop(expr: Extract<Expr, { kind: 'binop' }>, env: Map<string, LuaValue>, redisCall: RedisCallPort): LuaValue {\n const { op } = expr;\n // short-circuit logicals\n if (op === 'and') {\n const left = this.evalExpr(expr.left, env, redisCall);\n return truthy(left) ? this.evalExpr(expr.right, env, redisCall) : left;\n }\n if (op === 'or') {\n const left = this.evalExpr(expr.left, env, redisCall);\n return truthy(left) ? left : this.evalExpr(expr.right, env, redisCall);\n }\n\n const l = this.evalExpr(expr.left, env, redisCall);\n const r = this.evalExpr(expr.right, env, redisCall);\n\n switch (op) {\n case '..':\n return luaToString(l) + luaToString(r);\n case '==':\n return this.luaEquals(l, r);\n case '~=':\n return !this.luaEquals(l, r);\n case '<':\n return this.compare(l, r) < 0;\n case '<=':\n return this.compare(l, r) <= 0;\n case '>':\n return this.compare(l, r) > 0;\n case '>=':\n return this.compare(l, r) >= 0;\n case '+':\n return toNumber(l) + toNumber(r);\n case '-':\n return toNumber(l) - toNumber(r);\n case '*':\n return toNumber(l) * toNumber(r);\n case '/':\n return toNumber(l) / toNumber(r);\n case '%': {\n const a = toNumber(l);\n const b = toNumber(r);\n return a - Math.floor(a / b) * b;\n }\n default:\n throw new LuaExecutionError(`unsupported operator '${op}'`);\n }\n }\n\n private luaEquals(a: LuaValue, b: LuaValue): boolean {\n if (typeof a !== typeof b) return false; // Lua: no cross-type numeric/string equality\n return a === b;\n }\n\n private compare(a: LuaValue, b: LuaValue): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'string' && typeof b === 'string') return a < b ? -1 : a > b ? 1 : 0;\n throw new LuaExecutionError('attempt to compare incompatible values');\n }\n\n private evalCall(expr: Extract<Expr, { kind: 'call' }>, env: Map<string, LuaValue>, redisCall: RedisCallPort): LuaValue {\n const callee = expr.callee;\n const args = expr.args.map((a) => this.evalExpr(a, env, redisCall));\n\n // redis.call(...) / redis.pcall(...)\n if (callee.kind === 'index' && callee.obj.kind === 'name' && callee.obj.name === 'redis' && callee.key.kind === 'str') {\n if (callee.key.value === 'call' || callee.key.value === 'pcall') {\n return this.doRedisCall(args, redisCall);\n }\n throw new LuaExecutionError(`unsupported redis.${callee.key.value}()`);\n }\n\n // math.floor/ceil/min/max/abs\n if (callee.kind === 'index' && callee.obj.kind === 'name' && callee.obj.name === 'math' && callee.key.kind === 'str') {\n return this.doMath(callee.key.value, args);\n }\n\n // tonumber(x)\n if (callee.kind === 'name' && callee.name === 'tonumber') {\n const v = args[0] ?? null;\n if (typeof v === 'number') return v;\n if (typeof v === 'string') {\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n }\n return null;\n }\n\n // tostring(x)\n if (callee.kind === 'name' && callee.name === 'tostring') {\n return luaToString(args[0] ?? null);\n }\n\n throw new LuaExecutionError('unsupported function call');\n }\n\n private doMath(fn: string, args: LuaValue[]): LuaValue {\n const nums = args.map(toNumber);\n switch (fn) {\n case 'floor':\n return Math.floor(nums[0]!);\n case 'ceil':\n return Math.ceil(nums[0]!);\n case 'abs':\n return Math.abs(nums[0]!);\n case 'min':\n return Math.min(...nums);\n case 'max':\n return Math.max(...nums);\n default:\n throw new LuaExecutionError(`unsupported math.${fn}()`);\n }\n }\n\n private doRedisCall(args: LuaValue[], redisCall: RedisCallPort): LuaValue {\n if (args.length === 0) throw new LuaExecutionError('redis.call requires a command');\n const command = luaToString(args[0]!);\n const callArgs = args.slice(1).map((a): string | number => {\n if (typeof a === 'number') return a;\n if (typeof a === 'string') return a;\n throw new LuaExecutionError('redis.call argument must be string or number');\n });\n return this.redisToLua(redisCall(command, callArgs));\n }\n\n /** Converts a Redis reply (from the executor) into a Lua value. */\n private redisToLua(reply: unknown): LuaValue {\n if (reply === null || reply === undefined) return null;\n if (typeof reply === 'number') return reply;\n if (typeof reply === 'string') return reply;\n if (typeof reply === 'boolean') return reply ? 1 : null;\n if (Array.isArray(reply)) {\n const t = new LuaTable();\n reply.forEach((el, idx) => t.set(idx + 1, this.redisToLua(el)));\n return t;\n }\n if (typeof reply === 'object') {\n // HGETALL is returned by the executor as an object for the JS driver API,\n // but Redis Lua sees it as a flat [field, value, ...] array. Flatten it.\n const t = new LuaTable();\n let idx = 1;\n for (const [field, value] of Object.entries(reply as Record<string, unknown>)) {\n t.set(idx++, field);\n t.set(idx++, this.redisToLua(value));\n }\n return t;\n }\n throw new LuaExecutionError('unsupported redis reply type from in-memory executor');\n }\n\n /** Converts a Lua return value into a Redis reply. */\n private luaToRedis(v: LuaValue): unknown {\n if (v === null) return null;\n if (typeof v === 'boolean') return v ? 1 : null;\n if (typeof v === 'number') return Math.floor(v);\n if (typeof v === 'string') return v;\n // LuaTable -> array (stop at first nil, Redis semantics)\n const out: unknown[] = [];\n const len = v.length();\n for (let i = 1; i <= len; i++) {\n out.push(this.luaToRedis(v.get(i)));\n }\n return out;\n }\n}\n","import { createHash } from 'crypto';\n\nimport { MemoryStore } from '../../domain/store/memory-store';\nimport { StreamEntry, compareIds } from '../../domain/store/stream-value';\nimport { LuaInterpreter } from '../../domain/lua/lua-interpreter';\nimport { MemoryDriverError } from '../../../shared/errors';\nimport { ICommandExecutor } from '../ports/command-executor.port';\n\nconst OK = 'OK';\n\n/** Converts a Redis glob pattern to a RegExp (supports * and ?). */\nfunction globToRegExp(glob: string): RegExp {\n let re = '^';\n for (const ch of glob) {\n if (ch === '*') re += '.*';\n else if (ch === '?') re += '.';\n else if ('.+^${}()|\\\\/['.includes(ch)) re += `\\\\${ch}`;\n else re += ch;\n }\n return new RegExp(`${re}$`);\n}\n\ntype ScoreBound = {\n value: number;\n exclusive: boolean;\n};\n\nfunction parseScoreBound(raw: unknown): ScoreBound {\n let str = String(raw);\n let exclusive = false;\n if (str.startsWith('(')) {\n exclusive = true;\n str = str.slice(1);\n }\n if (str === '-inf') return { value: -Infinity, exclusive };\n if (str === '+inf' || str === 'inf') return { value: Infinity, exclusive };\n return { value: Number(str), exclusive };\n}\n\n/**\n * Executes Redis commands against an in-memory store, returning Redis-shaped\n * replies that match what `BaseRedisDriver` expects from `executeCommand`.\n * Also runs Lua scripts (EVAL/EVALSHA) via the interpreter, whose `redis.call`\n * re-enters this same executor (single-threaded → atomic, like Redis).\n */\nexport class CommandExecutor implements ICommandExecutor {\n private readonly scripts = new Map<string, string>();\n private readonly redisCall = (command: string, args: Array<string | number>): unknown => this.execute(command, args);\n\n constructor(\n private readonly store: MemoryStore,\n private readonly interpreter: LuaInterpreter = new LuaInterpreter(),\n ) {}\n\n execute(command: string, args: unknown[]): unknown {\n const cmd = command.toUpperCase();\n switch (cmd) {\n // --- connection / server ---\n case 'PING':\n return args.length ? this.str(args[0]) : 'PONG';\n case 'DBSIZE':\n return this.store.keys().length;\n case 'FLUSHDB':\n case 'FLUSHALL':\n this.store.flush();\n return OK;\n\n // --- strings ---\n case 'GET':\n return this.store.read(this.str(args[0]), 'string') ?? null;\n case 'SET':\n return this.cmdSet(args);\n case 'SETEX':\n return this.cmdSet([args[0], args[2], 'EX', args[1]]);\n case 'SETNX':\n return this.cmdSet([args[0], args[1], 'NX']) === OK ? 1 : 0;\n case 'DEL':\n case 'UNLINK':\n return args.reduce<number>((acc, k) => acc + (this.store.delete(this.str(k)) ? 1 : 0), 0);\n case 'EXISTS':\n return args.reduce<number>((acc, k) => acc + (this.store.has(this.str(k)) ? 1 : 0), 0);\n case 'INCR':\n return this.incrBy(this.str(args[0]), 1);\n case 'INCRBY':\n return this.incrBy(this.str(args[0]), this.num(args[1]));\n case 'DECR':\n return this.incrBy(this.str(args[0]), -1);\n case 'DECRBY':\n return this.incrBy(this.str(args[0]), -this.num(args[1]));\n case 'APPEND': {\n const key = this.str(args[0]);\n const cur = this.store.read(key, 'string') ?? '';\n const next = cur + this.str(args[1]);\n this.preserveTtl(key, () => this.store.writeString(key, next));\n return next.length;\n }\n case 'STRLEN':\n return (this.store.read(this.str(args[0]), 'string') ?? '').length;\n case 'MGET':\n return args.map((k) => this.store.read(this.str(k), 'string') ?? null);\n case 'MSET': {\n for (let i = 0; i < args.length; i += 2) this.store.writeString(this.str(args[i]), this.str(args[i + 1]));\n return OK;\n }\n\n // --- keys / TTL ---\n case 'EXPIRE':\n return this.store.setExpireAt(this.str(args[0]), this.store.now() + this.num(args[1]) * 1000) ? 1 : 0;\n case 'PEXPIRE':\n return this.store.setExpireAt(this.str(args[0]), this.store.now() + this.num(args[1])) ? 1 : 0;\n case 'EXPIREAT':\n return this.store.setExpireAt(this.str(args[0]), this.num(args[1]) * 1000) ? 1 : 0;\n case 'PEXPIREAT':\n return this.store.setExpireAt(this.str(args[0]), this.num(args[1])) ? 1 : 0;\n case 'PERSIST':\n return this.store.setExpireAt(this.str(args[0]), null) ? 1 : 0;\n case 'TTL': {\n const ms = this.store.pttl(this.str(args[0]));\n return ms < 0 ? ms : Math.ceil(ms / 1000);\n }\n case 'PTTL':\n return this.store.pttl(this.str(args[0]));\n case 'TYPE':\n return this.store.type(this.str(args[0]));\n case 'KEYS': {\n const re = globToRegExp(this.str(args[0]));\n return this.store.keys().filter((k) => re.test(k));\n }\n case 'SCAN':\n return this.cmdScan(args);\n\n // --- hashes ---\n case 'HSET':\n case 'HMSET':\n return this.cmdHset(cmd, args);\n case 'HGET': {\n const hash = this.store.read(this.str(args[0]), 'hash');\n return hash?.get(this.str(args[1])) ?? null;\n }\n case 'HMGET': {\n const hash = this.store.read(this.str(args[0]), 'hash');\n return args.slice(1).map((f) => hash?.get(this.str(f)) ?? null);\n }\n case 'HGETALL': {\n const hash = this.store.read(this.str(args[0]), 'hash');\n const obj: Record<string, string> = {};\n if (hash) for (const [f, v] of hash) obj[f] = v;\n return obj;\n }\n case 'HDEL': {\n const key = this.str(args[0]);\n const hash = this.store.read(key, 'hash');\n if (!hash) return 0;\n let removed = 0;\n for (const f of args.slice(1)) if (hash.delete(this.str(f))) removed++;\n if (hash.size === 0) this.store.delete(key);\n return removed;\n }\n case 'HEXISTS':\n return this.store.read(this.str(args[0]), 'hash')?.has(this.str(args[1])) ? 1 : 0;\n case 'HLEN':\n return this.store.read(this.str(args[0]), 'hash')?.size ?? 0;\n case 'HKEYS':\n return [...(this.store.read(this.str(args[0]), 'hash')?.keys() ?? [])];\n case 'HVALS':\n return [...(this.store.read(this.str(args[0]), 'hash')?.values() ?? [])];\n case 'HINCRBY': {\n const key = this.str(args[0]);\n const field = this.str(args[1]);\n const hash = this.store.readOrCreate(key, 'hash');\n const next = Number(hash.get(field) ?? '0') + this.num(args[2]);\n hash.set(field, String(next));\n return next;\n }\n\n // --- lists ---\n case 'LPUSH': {\n const list = this.store.readOrCreate(this.str(args[0]), 'list');\n for (const v of args.slice(1)) list.unshift(this.str(v));\n return list.length;\n }\n case 'RPUSH': {\n const list = this.store.readOrCreate(this.str(args[0]), 'list');\n for (const v of args.slice(1)) list.push(this.str(v));\n return list.length;\n }\n case 'LPOP':\n case 'RPOP':\n return this.cmdPop(cmd, args);\n case 'LLEN':\n return this.store.read(this.str(args[0]), 'list')?.length ?? 0;\n case 'LRANGE':\n return this.cmdLrange(args);\n case 'LINDEX': {\n const list = this.store.read(this.str(args[0]), 'list');\n if (!list) return null;\n let idx = this.num(args[1]);\n if (idx < 0) idx = list.length + idx;\n return list[idx] ?? null;\n }\n case 'LREM': {\n const key = this.str(args[0]);\n const list = this.store.read(key, 'list');\n if (!list) return 0;\n const target = this.str(args[2]);\n const before = list.length;\n const kept = list.filter((v) => v !== target);\n list.length = 0;\n list.push(...kept);\n if (list.length === 0) this.store.delete(key);\n return before - list.length;\n }\n\n // --- sets ---\n case 'SADD': {\n const set = this.store.readOrCreate(this.str(args[0]), 'set');\n let added = 0;\n for (const m of args.slice(1)) {\n const member = this.str(m);\n if (!set.has(member)) {\n set.add(member);\n added++;\n }\n }\n return added;\n }\n case 'SREM': {\n const key = this.str(args[0]);\n const set = this.store.read(key, 'set');\n if (!set) return 0;\n let removed = 0;\n for (const m of args.slice(1)) if (set.delete(this.str(m))) removed++;\n if (set.size === 0) this.store.delete(key);\n return removed;\n }\n case 'SMEMBERS':\n return [...(this.store.read(this.str(args[0]), 'set') ?? [])];\n case 'SISMEMBER':\n return this.store.read(this.str(args[0]), 'set')?.has(this.str(args[1])) ? 1 : 0;\n case 'SCARD':\n return this.store.read(this.str(args[0]), 'set')?.size ?? 0;\n\n // --- sorted sets ---\n case 'ZADD':\n return this.cmdZadd(args);\n case 'ZCARD':\n return this.store.read(this.str(args[0]), 'zset')?.size ?? 0;\n case 'ZSCORE': {\n const score = this.store.read(this.str(args[0]), 'zset')?.get(this.str(args[1]));\n return score === undefined ? null : String(score);\n }\n case 'ZREM': {\n const key = this.str(args[0]);\n const zset = this.store.read(key, 'zset');\n if (!zset) return 0;\n let removed = 0;\n for (const m of args.slice(1)) if (zset.delete(this.str(m))) removed++;\n if (zset.size === 0) this.store.delete(key);\n return removed;\n }\n case 'ZRANGE':\n return this.cmdZrange(args);\n case 'ZRANGEBYSCORE':\n return this.cmdZrangeByScore(args);\n case 'ZREMRANGEBYSCORE':\n return this.cmdZremRangeByScore(args);\n case 'ZCOUNT': {\n const zset = this.store.read(this.str(args[0]), 'zset');\n if (!zset) return 0;\n const min = parseScoreBound(args[1]);\n const max = parseScoreBound(args[2]);\n return [...zset.values()].filter((s) => this.inRange(s, min, max)).length;\n }\n\n // --- streams ---\n case 'XADD':\n return this.cmdXadd(args);\n case 'XLEN':\n return this.store.read(this.str(args[0]), 'stream')?.len() ?? 0;\n case 'XRANGE':\n return this.cmdXrange(args, false);\n case 'XREVRANGE':\n return this.cmdXrange(args, true);\n case 'XDEL':\n return this.store.read(this.str(args[0]), 'stream')?.del(args.slice(1).map((i) => this.str(i))) ?? 0;\n case 'XTRIM':\n return this.cmdXtrim(args);\n case 'XINFO':\n return this.cmdXinfo(args);\n case 'XGROUP':\n return this.cmdXgroup(args);\n case 'XREADGROUP':\n return this.cmdXreadgroup(args);\n case 'XREAD':\n return this.cmdXread(args);\n case 'XACK':\n return this.cmdXack(args);\n case 'XPENDING':\n return this.cmdXpending(args);\n case 'XCLAIM':\n return this.cmdXclaim(args);\n\n // --- scripting ---\n case 'SCRIPT':\n if (this.str(args[0]).toUpperCase() === 'LOAD') {\n const source = this.str(args[1]);\n const sha = createHash('sha1').update(source).digest('hex');\n this.scripts.set(sha, source);\n return sha;\n }\n return OK;\n case 'EVAL':\n return this.runScript(this.str(args[0]), args);\n case 'EVALSHA': {\n const sha = this.str(args[0]);\n const source = this.scripts.get(sha);\n if (!source) throw new MemoryDriverError('NOSCRIPT No matching script. Please use EVAL.');\n return this.runScript(source, args);\n }\n\n default:\n throw new MemoryDriverError(`In-memory driver does not implement command: ${cmd}`);\n }\n }\n\n // --- helpers --------------------------------------------------------------\n\n private str(v: unknown): string {\n return String(v);\n }\n\n private num(v: unknown): number {\n const n = Number(v);\n if (Number.isNaN(n)) throw new MemoryDriverError(`value is not an integer or out of range: ${String(v)}`);\n return n;\n }\n\n private preserveTtl(key: string, mutate: () => void): void {\n const ttl = this.store.pttl(key);\n mutate();\n if (ttl >= 0) this.store.setExpireAt(key, this.store.now() + ttl);\n }\n\n private incrBy(key: string, by: number): number {\n const cur = this.store.read(key, 'string');\n const next = (cur === undefined ? 0 : this.num(cur)) + by;\n this.preserveTtl(key, () => this.store.writeString(key, String(next)));\n return next;\n }\n\n private cmdSet(args: unknown[]): 'OK' | string | null {\n const key = this.str(args[0]);\n const value = this.str(args[1]);\n let nx = false;\n let xx = false;\n let ex: number | undefined;\n let px: number | undefined;\n let getOld = false;\n for (let i = 2; i < args.length; i++) {\n const opt = this.str(args[i]).toUpperCase();\n if (opt === 'NX') nx = true;\n else if (opt === 'XX') xx = true;\n else if (opt === 'GET') getOld = true;\n else if (opt === 'EX') ex = this.num(args[++i]);\n else if (opt === 'PX') px = this.num(args[++i]);\n }\n const exists = this.store.has(key);\n const old = exists ? (this.store.read(key, 'string') ?? null) : null;\n if ((nx && exists) || (xx && !exists)) return getOld ? old : null;\n this.store.writeString(key, value);\n if (ex !== undefined) this.store.setExpireAt(key, this.store.now() + ex * 1000);\n else if (px !== undefined) this.store.setExpireAt(key, this.store.now() + px);\n return getOld ? old : OK;\n }\n\n private cmdPop(cmd: string, args: unknown[]): string | string[] | null {\n const key = this.str(args[0]);\n const list = this.store.read(key, 'list');\n if (!list || list.length === 0) return args.length > 1 ? [] : null;\n const take = (fn: () => string | undefined): string | undefined => fn();\n const pop = (): string | undefined => (cmd === 'LPOP' ? list.shift() : list.pop());\n if (args.length > 1) {\n const count = this.num(args[1]);\n const out: string[] = [];\n for (let i = 0; i < count && list.length > 0; i++) out.push(take(pop) as string);\n if (list.length === 0) this.store.delete(key);\n return out;\n }\n const value = pop() ?? null;\n if (list.length === 0) this.store.delete(key);\n return value;\n }\n\n private cmdLrange(args: unknown[]): string[] {\n const list = this.store.read(this.str(args[0]), 'list');\n if (!list) return [];\n const len = list.length;\n let start = this.num(args[1]);\n let stop = this.num(args[2]);\n if (start < 0) start = Math.max(0, len + start);\n if (stop < 0) stop = len + stop;\n return list.slice(start, stop + 1);\n }\n\n private cmdScan(args: unknown[]): [string, string[]] {\n let match: string | undefined;\n for (let i = 1; i < args.length; i++) {\n const opt = this.str(args[i]).toUpperCase();\n if (opt === 'MATCH') match = this.str(args[++i]);\n else if (opt === 'COUNT') i++; // ignored (single-pass)\n }\n const re = match ? globToRegExp(match) : undefined;\n const keys = re ? this.store.keys().filter((k) => re.test(k)) : this.store.keys();\n return ['0', keys];\n }\n\n private cmdHset(cmd: string, args: unknown[]): number | 'OK' {\n const hash = this.store.readOrCreate(this.str(args[0]), 'hash');\n let added = 0;\n for (let i = 1; i < args.length; i += 2) {\n const field = this.str(args[i]);\n if (!hash.has(field)) added++;\n hash.set(field, this.str(args[i + 1]));\n }\n return cmd === 'HMSET' ? OK : added;\n }\n\n private cmdZadd(args: unknown[]): number {\n const zset = this.store.readOrCreate(this.str(args[0]), 'zset');\n let added = 0;\n for (let i = 1; i < args.length; i += 2) {\n const score = this.num(args[i]);\n const member = this.str(args[i + 1]);\n if (!zset.has(member)) added++;\n zset.set(member, score);\n }\n return added;\n }\n\n private sortedMembers(key: string): Array<[string, number]> {\n const zset = this.store.read(key, 'zset');\n if (!zset) return [];\n return [...zset.entries()].sort((a, b) => (a[1] !== b[1] ? a[1] - b[1] : a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n }\n\n private cmdZrange(args: unknown[]): string[] {\n const sorted = this.sortedMembers(this.str(args[0]));\n let start = this.num(args[1]);\n let stop = this.num(args[2]);\n const withScores = args.slice(3).some((a) => this.str(a).toUpperCase() === 'WITHSCORES');\n const len = sorted.length;\n if (start < 0) start = Math.max(0, len + start);\n if (stop < 0) stop = len + stop;\n const slice = sorted.slice(start, stop + 1);\n return this.flatten(slice, withScores);\n }\n\n private cmdZrangeByScore(args: unknown[]): string[] {\n const sorted = this.sortedMembers(this.str(args[0]));\n const min = parseScoreBound(args[1]);\n const max = parseScoreBound(args[2]);\n const withScores = args.slice(3).some((a) => this.str(a).toUpperCase() === 'WITHSCORES');\n return this.flatten(\n sorted.filter(([, s]) => this.inRange(s, min, max)),\n withScores,\n );\n }\n\n private cmdZremRangeByScore(args: unknown[]): number {\n const key = this.str(args[0]);\n const zset = this.store.read(key, 'zset');\n if (!zset) return 0;\n const min = parseScoreBound(args[1]);\n const max = parseScoreBound(args[2]);\n let removed = 0;\n for (const [member, score] of [...zset.entries()]) {\n if (this.inRange(score, min, max)) {\n zset.delete(member);\n removed++;\n }\n }\n if (zset.size === 0) this.store.delete(key);\n return removed;\n }\n\n private inRange(score: number, min: ScoreBound, max: ScoreBound): boolean {\n const okMin = min.exclusive ? score > min.value : score >= min.value;\n const okMax = max.exclusive ? score < max.value : score <= max.value;\n return okMin && okMax;\n }\n\n private flatten(entries: Array<[string, number]>, withScores: boolean): string[] {\n const out: string[] = [];\n for (const [member, score] of entries) {\n out.push(member);\n if (withScores) out.push(String(score));\n }\n return out;\n }\n\n // --- stream helpers -------------------------------------------------------\n\n /** Formats a stream entry as the Redis reply shape `[id, [field, value, ...]]`. */\n private entryReply(entry: StreamEntry): [string, string[]] {\n return [entry.id, entry.fields];\n }\n\n private cmdXadd(args: unknown[]): string | null {\n const key = this.str(args[0]);\n let i = 1;\n let noMkStream = false;\n let maxLen: number | undefined;\n let minId: string | undefined;\n for (; i < args.length; ) {\n const opt = this.str(args[i]).toUpperCase();\n if (opt === 'NOMKSTREAM') {\n noMkStream = true;\n i += 1;\n } else if (opt === 'MAXLEN') {\n i += 1;\n if (this.str(args[i]) === '~' || this.str(args[i]) === '=') i += 1;\n maxLen = this.num(args[i]);\n i += 1;\n } else if (opt === 'MINID') {\n i += 1;\n if (this.str(args[i]) === '~' || this.str(args[i]) === '=') i += 1;\n minId = this.str(args[i]);\n i += 1;\n } else {\n break;\n }\n }\n const id = this.str(args[i]);\n const fields = args.slice(i + 1).map((f) => this.str(f));\n\n if (noMkStream && !this.store.has(key)) return null;\n const stream = this.store.readOrCreate(key, 'stream');\n const newId = stream.add(id, fields, this.store.now());\n if (maxLen !== undefined) stream.trimMaxLen(maxLen);\n if (minId !== undefined) {\n const toDelete = stream\n .range('-', '+')\n .filter((e) => compareIds(e.id, minId) < 0)\n .map((e) => e.id);\n stream.del(toDelete);\n }\n return newId;\n }\n\n private cmdXrange(args: unknown[], reverse: boolean): Array<[string, string[]]> {\n const stream = this.store.read(this.str(args[0]), 'stream');\n if (!stream) return [];\n // XRANGE: start, end. XREVRANGE: end, start (swapped).\n const start = reverse ? this.str(args[2]) : this.str(args[1]);\n const end = reverse ? this.str(args[1]) : this.str(args[2]);\n let count: number | undefined;\n for (let i = 3; i < args.length; i++) {\n if (this.str(args[i]).toUpperCase() === 'COUNT') count = this.num(args[++i]);\n }\n return stream.range(start, end, count, reverse).map((e) => this.entryReply(e));\n }\n\n private cmdXtrim(args: unknown[]): number {\n const stream = this.store.read(this.str(args[0]), 'stream');\n if (!stream) return 0;\n let i = 1;\n const strategy = this.str(args[i]).toUpperCase();\n i += 1;\n if (this.str(args[i]) === '~' || this.str(args[i]) === '=') i += 1;\n if (strategy !== 'MAXLEN') throw new MemoryDriverError(`XTRIM strategy not supported: ${strategy}`);\n return stream.trimMaxLen(this.num(args[i]));\n }\n\n private cmdXinfo(args: unknown[]): unknown[] {\n const sub = this.str(args[0]).toUpperCase();\n if (sub !== 'STREAM') throw new MemoryDriverError(`XINFO subcommand not supported: ${sub}`);\n const stream = this.store.read(this.str(args[1]), 'stream');\n if (!stream) throw new MemoryDriverError('ERR no such key');\n const all = stream.range('-', '+');\n const first = all[0];\n const last = all[all.length - 1];\n return ['length', stream.len(), 'radix-tree-keys', 1, 'radix-tree-nodes', 2, 'last-generated-id', stream.lastId, 'groups', stream.groups.size, 'first-entry', first ? this.entryReply(first) : null, 'last-entry', last ? this.entryReply(last) : null];\n }\n\n private cmdXgroup(args: unknown[]): unknown {\n const sub = this.str(args[0]).toUpperCase();\n const key = this.str(args[1]);\n const group = this.str(args[2]);\n if (sub === 'CREATE') {\n const id = this.str(args[3]);\n const mkstream = args[4] !== undefined && this.str(args[4]).toUpperCase() === 'MKSTREAM';\n if (!this.store.has(key)) {\n if (!mkstream) throw new MemoryDriverError('ERR The XGROUP subcommand requires the key to exist. Note that for CREATE you may want to use the MKSTREAM option to create an empty stream automatically.');\n this.store.readOrCreate(key, 'stream');\n }\n this.store.read(key, 'stream')!.createGroup(group, id);\n return OK;\n }\n if (sub === 'DESTROY') return this.store.read(key, 'stream')?.destroyGroup(group) ?? 0;\n if (sub === 'DELCONSUMER') return this.store.read(key, 'stream')?.delConsumer(group, this.str(args[3])) ?? 0;\n if (sub === 'SETID') {\n this.store.read(key, 'stream')?.setGroupId(group, this.str(args[3]));\n return OK;\n }\n throw new MemoryDriverError(`XGROUP subcommand not supported: ${sub}`);\n }\n\n /** Parses the trailing `STREAMS key... id...` section into key/id pairs. */\n private parseStreamsSection(args: unknown[], fromIndex: number): { count?: number; pairs: Array<[string, string]> } {\n let count: number | undefined;\n let i = fromIndex;\n for (; i < args.length; i++) {\n const tok = this.str(args[i]).toUpperCase();\n if (tok === 'STREAMS') {\n i += 1;\n break;\n }\n if (tok === 'COUNT') count = this.num(args[++i]);\n else if (tok === 'BLOCK')\n i += 1; // ignored — the in-memory driver never blocks\n else if (tok === 'NOACK') continue;\n }\n const rest = args.slice(i).map((a) => this.str(a));\n const half = rest.length / 2;\n const keys = rest.slice(0, half);\n const ids = rest.slice(half);\n return { count, pairs: keys.map((k, idx) => [k, ids[idx]!]) };\n }\n\n private cmdXreadgroup(args: unknown[]): unknown {\n // GROUP <group> <consumer> [COUNT n] [BLOCK ms] [NOACK] STREAMS key... id...\n const group = this.str(args[1]);\n const consumer = this.str(args[2]);\n const noAck = args.slice(3).some((a) => this.str(a).toUpperCase() === 'NOACK');\n const { count, pairs } = this.parseStreamsSection(args, 3);\n const now = this.store.now();\n const out: Array<[string, Array<[string, string[]]>]> = [];\n for (const [key, id] of pairs) {\n const stream = this.store.read(key, 'stream');\n if (!stream) continue;\n const entries = stream.readGroup(group, consumer, id, now, count, noAck);\n if (entries.length > 0) out.push([key, entries.map((e) => this.entryReply(e))]);\n }\n return out.length > 0 ? out : null;\n }\n\n private cmdXread(args: unknown[]): unknown {\n const { count, pairs } = this.parseStreamsSection(args, 0);\n const out: Array<[string, Array<[string, string[]]>]> = [];\n for (const [key, id] of pairs) {\n const stream = this.store.read(key, 'stream');\n if (!stream) continue;\n const entries = stream.readAfter(id, count);\n if (entries.length > 0) out.push([key, entries.map((e) => this.entryReply(e))]);\n }\n return out.length > 0 ? out : null;\n }\n\n private cmdXack(args: unknown[]): number {\n const stream = this.store.read(this.str(args[0]), 'stream');\n const group = this.str(args[1]);\n if (!stream?.groups.has(group)) return 0;\n return stream.ack(\n group,\n args.slice(2).map((i) => this.str(i)),\n );\n }\n\n private cmdXpending(args: unknown[]): unknown {\n const stream = this.store.read(this.str(args[0]), 'stream');\n const group = this.str(args[1]);\n const now = this.store.now();\n if (args.length <= 2) {\n // Summary form: [count, minId, maxId, [[consumer, countStr], ...] | nil]\n if (!stream?.groups.has(group)) return [0, null, null, null];\n const s = stream.pendingSummary(group);\n return [s.count, s.minId, s.maxId, s.consumers.length > 0 ? s.consumers.map(([name, c]) => [name, String(c)]) : null];\n }\n // Range form: [key, group, start, end, count, (consumer)?]\n if (!stream?.groups.has(group)) return [];\n const start = this.str(args[2]);\n const end = this.str(args[3]);\n const count = this.num(args[4]);\n const consumer = args[5] !== undefined ? this.str(args[5]) : undefined;\n return stream.pendingRange(group, start, end, count, now, consumer).map((p) => [p.id, p.consumer, p.idleTime, p.deliveryCount]);\n }\n\n private cmdXclaim(args: unknown[]): Array<[string, string[]]> {\n const stream = this.store.read(this.str(args[0]), 'stream');\n const group = this.str(args[1]);\n if (!stream?.groups.has(group)) return [];\n const consumer = this.str(args[2]);\n const minIdle = this.num(args[3]);\n // Remaining args are ids until an option keyword appears (IDLE/TIME/RETRYCOUNT/FORCE/JUSTID).\n const ids: string[] = [];\n for (let i = 4; i < args.length; i++) {\n const tok = this.str(args[i]);\n if (['IDLE', 'TIME', 'RETRYCOUNT', 'FORCE', 'JUSTID', 'LASTID'].includes(tok.toUpperCase())) break;\n ids.push(tok);\n }\n return stream.claim(group, consumer, minIdle, ids, this.store.now()).map((e) => this.entryReply(e));\n }\n\n private runScript(source: string, args: unknown[]): unknown {\n const numKeys = this.num(args[1]);\n const keys = args.slice(2, 2 + numKeys).map((k) => this.str(k));\n const argv = args.slice(2 + numKeys).map((a) => this.str(a));\n return this.interpreter.run(source, keys, argv, this.redisCall);\n }\n}\n","import { BaseRedisDriver, type ConnectionConfig, type IPipeline, type IMulti, type ISetOptions } from '@nestjs-redisx/core';\n\nimport { MemoryStore } from '../../domain/store/memory-store';\nimport { CommandExecutor } from '../../application/services/command-executor.service';\nimport { ICommandExecutor } from '../../application/ports/command-executor.port';\n\n/**\n * Buffers commands and replays them sequentially over the in-memory executor.\n * (Plugins use Lua, not pipelines, for atomicity — this exists for API parity.)\n */\nclass MemoryPipeline implements IPipeline {\n protected queue: Array<{ cmd: string; args: unknown[] }> = [];\n\n constructor(protected readonly executor: ICommandExecutor) {}\n\n protected enqueue(cmd: string, args: unknown[]): this {\n this.queue.push({ cmd, args });\n return this;\n }\n\n get(key: string): this {\n return this.enqueue('GET', [key]);\n }\n set(key: string, value: string, options?: ISetOptions): this {\n const args: unknown[] = [key, value];\n if (options?.ex !== undefined) args.push('EX', options.ex);\n if (options?.px !== undefined) args.push('PX', options.px);\n if (options?.nx) args.push('NX');\n if (options?.xx) args.push('XX');\n return this.enqueue('SET', args);\n }\n del(...keys: string[]): this {\n return this.enqueue('DEL', keys);\n }\n mget(...keys: string[]): this {\n return this.enqueue('MGET', keys);\n }\n mset(data: Record<string, string>): this {\n return this.enqueue('MSET', Object.entries(data).flat());\n }\n expire(key: string, seconds: number): this {\n return this.enqueue('EXPIRE', [key, seconds]);\n }\n ttl(key: string): this {\n return this.enqueue('TTL', [key]);\n }\n incr(key: string): this {\n return this.enqueue('INCR', [key]);\n }\n incrby(key: string, increment: number): this {\n return this.enqueue('INCRBY', [key, increment]);\n }\n hget(key: string, field: string): this {\n return this.enqueue('HGET', [key, field]);\n }\n hset(key: string, field: string, value: string): this {\n return this.enqueue('HSET', [key, field, value]);\n }\n hmset(key: string, data: Record<string, string>): this {\n return this.enqueue('HMSET', [key, ...Object.entries(data).flat()]);\n }\n hgetall(key: string): this {\n return this.enqueue('HGETALL', [key]);\n }\n lpush(key: string, ...values: string[]): this {\n return this.enqueue('LPUSH', [key, ...values]);\n }\n rpush(key: string, ...values: string[]): this {\n return this.enqueue('RPUSH', [key, ...values]);\n }\n sadd(key: string, ...members: string[]): this {\n return this.enqueue('SADD', [key, ...members]);\n }\n srem(key: string, ...members: string[]): this {\n return this.enqueue('SREM', [key, ...members]);\n }\n zadd(key: string, ...args: Array<number | string>): this {\n return this.enqueue('ZADD', [key, ...args]);\n }\n zrem(key: string, ...members: string[]): this {\n return this.enqueue('ZREM', [key, ...members]);\n }\n\n exec(): Promise<Array<[Error | null, unknown]>> {\n const results: Array<[Error | null, unknown]> = [];\n for (const { cmd, args } of this.queue) {\n try {\n results.push([null, this.executor.execute(cmd, args)]);\n } catch (error) {\n results.push([error as Error, null]);\n }\n }\n this.queue = [];\n return Promise.resolve(results);\n }\n}\n\nclass MemoryMulti extends MemoryPipeline implements IMulti {\n discard(): void {\n this.queue = [];\n }\n}\n\n/**\n * In-memory `IRedisDriver` for tests. Implements the 5 `BaseRedisDriver`\n * abstract methods over an in-memory store + Lua interpreter; the other ~186\n * driver methods are inherited.\n */\nexport class MemoryRedisAdapter extends BaseRedisDriver {\n private readonly store: MemoryStore;\n private readonly executor: CommandExecutor;\n\n constructor(config: ConnectionConfig, options?: { enableLogging?: boolean }) {\n super(config, options);\n this.store = new MemoryStore();\n this.executor = new CommandExecutor(this.store);\n }\n\n /** Exposes the backing store for assertions / manual reset in tests. */\n getStore(): MemoryStore {\n return this.store;\n }\n\n protected doConnect(): Promise<void> {\n // No real connection — in-memory.\n return Promise.resolve();\n }\n\n protected doDisconnect(): Promise<void> {\n // No real connection — keep data; a fresh adapter starts empty.\n return Promise.resolve();\n }\n\n protected async executeCommand(command: string, ...args: unknown[]): Promise<unknown> {\n const result = this.executor.execute(command, args);\n\n // The in-memory driver never truly blocks, but a blocking XREAD/XREADGROUP\n // poll loop with no data would otherwise hot-spin on microtasks and starve\n // the event loop. When such a call comes back empty, yield with a short real\n // (macrotask) delay so producers and timers can run between polls.\n const cmd = command.toUpperCase();\n if (result === null && (cmd === 'XREADGROUP' || cmd === 'XREAD')) {\n const blockIdx = args.findIndex((a) => String(a).toUpperCase() === 'BLOCK');\n if (blockIdx !== -1) {\n const blockMs = Number(args[blockIdx + 1]);\n const delay = Number.isFinite(blockMs) && blockMs > 0 ? Math.min(blockMs, 20) : 20;\n await new Promise<void>((resolve) => setTimeout(resolve, delay));\n }\n }\n\n return result;\n }\n\n protected createPipeline(): IPipeline {\n return new MemoryPipeline(this.executor);\n }\n\n protected createMulti(): IMulti {\n return new MemoryMulti(this.executor);\n }\n}\n","import { registerDriver, type ConnectionConfig, type IDriverFactoryOptions } from '@nestjs-redisx/core';\n\nimport { MEMORY_DRIVER_TYPE } from '../../shared/constants';\nimport { MemoryRedisAdapter } from '../infrastructure/adapters/memory-redis.adapter';\n\nlet registered = false;\n\n/**\n * Registers the in-memory driver under the `'memory'` type with the core driver\n * registry, so `RedisModule.forRoot({ global: { driver: 'memory' } })` works.\n *\n * Idempotent. Called automatically when `@nestjs-redisx/testing` is imported.\n */\nexport function registerMemoryDriver(): void {\n if (registered) return;\n registerDriver(MEMORY_DRIVER_TYPE, (config: ConnectionConfig, options?: IDriverFactoryOptions) => new MemoryRedisAdapter(config, options));\n registered = true;\n}\n","import { DynamicModule } from '@nestjs/common';\nimport { RedisModule, type IRedisModuleOptions, type IRedisModuleAsyncOptions } from '@nestjs-redisx/core';\n\nimport { MEMORY_DRIVER_TYPE } from '../../shared/constants';\nimport { registerMemoryDriver } from './register-memory-driver';\n\n/** Default (ignored) connection config — the memory driver never connects. */\nconst DEFAULT_CLIENTS: IRedisModuleOptions['clients'] = { type: 'single', host: 'localhost', port: 6379 };\n\n/** Module options where `clients` is optional — the in-memory driver never connects. */\nexport type RedisTestingModuleOptions = Omit<IRedisModuleOptions, 'clients'> & {\n clients?: IRedisModuleOptions['clients'];\n};\n\n/** Async options whose factory may omit `clients`. */\nexport type RedisTestingModuleAsyncOptions = Omit<IRedisModuleAsyncOptions, 'useFactory'> & {\n useFactory?: (...args: unknown[]) => RedisTestingModuleOptions | Promise<RedisTestingModuleOptions>;\n};\n\n/**\n * Ergonomic wrapper around `RedisModule` that forces the in-memory driver,\n * so plugins run with real semantics and no Redis. Equivalent to calling\n * `RedisModule.forRoot({ global: { driver: 'memory' }, ... })`.\n */\nexport class RedisTestingModule {\n static forRoot(options: RedisTestingModuleOptions = {}): DynamicModule {\n registerMemoryDriver();\n return RedisModule.forRoot({\n ...options,\n clients: options.clients ?? DEFAULT_CLIENTS,\n global: { ...options.global, driver: MEMORY_DRIVER_TYPE },\n });\n }\n\n static forRootAsync(options: RedisTestingModuleAsyncOptions): DynamicModule {\n registerMemoryDriver();\n const userFactory = options.useFactory;\n return RedisModule.forRootAsync({\n ...options,\n useFactory: async (...args: unknown[]): Promise<IRedisModuleOptions> => {\n const resolved = userFactory ? await userFactory(...args) : ({} as RedisTestingModuleOptions);\n return {\n ...resolved,\n clients: resolved.clients ?? DEFAULT_CLIENTS,\n global: { ...resolved.global, driver: MEMORY_DRIVER_TYPE },\n };\n },\n });\n }\n}\n","/**\n * @nestjs-redisx/testing\n *\n * In-memory Redis driver and testing utilities for unit-testing NestJS RedisX\n * code (cache, locks, rate-limit, idempotency) without a running Redis.\n *\n * Importing this package registers the `'memory'` driver with the core driver\n * registry as a side effect.\n */\nimport { registerMemoryDriver } from './memory/api/register-memory-driver';\n\n// Register the in-memory driver on import.\nregisterMemoryDriver();\n\n// API\nexport { RedisTestingModule, type RedisTestingModuleOptions, type RedisTestingModuleAsyncOptions } from './memory/api/redis-testing.module';\nexport { registerMemoryDriver } from './memory/api/register-memory-driver';\n\n// Infrastructure\nexport { MemoryRedisAdapter } from './memory/infrastructure/adapters/memory-redis.adapter';\n\n// Domain (advanced/direct use)\nexport { MemoryStore } from './memory/domain/store/memory-store';\nexport { LuaInterpreter } from './memory/domain/lua/lua-interpreter';\nexport { CommandExecutor } from './memory/application/services/command-executor.service';\n\n// Shared\nexport { MEMORY_DRIVER_TYPE } from './shared/constants';\nexport { MemoryDriverError, LuaExecutionError, WrongTypeError } from './shared/errors';\nexport type { IMemoryDriverOptions } from './shared/types';\n"]}
|