@crvouga/mockingbird-service-redis 0.1.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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/clock.ts", "../src/bytes.ts", "../src/protocol.ts", "../src/sha1.ts", "../src/lua.ts", "../src/store.ts", "../src/engine.ts"],
4
+ "sourcesContent": ["export interface RedisClock {\n now(): number\n advance(ms: number): void\n subscribe(listener: () => void): () => void\n readonly manual: boolean\n}\n\nexport function manualClock(start = 0): RedisClock {\n let current = start\n const listeners = new Set<() => void>()\n return {\n manual: true,\n now: () => current,\n advance(ms: number) {\n current += ms\n for (const listener of [...listeners]) listener()\n },\n subscribe(listener: () => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\nexport function wallClock(): RedisClock {\n let offset = 0\n const listeners = new Set<() => void>()\n return {\n manual: false,\n now: () => Date.now() + offset,\n advance(ms: number) {\n offset += ms\n for (const listener of [...listeners]) listener()\n },\n subscribe(listener: () => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n", "/** Byte helpers. Keys and Lua strings are Latin-1 so client bytes round-trip. */\n\nexport function latin1(bytes: Uint8Array): string {\n let out = \"\"\n for (let i = 0; i < bytes.length; i++) out += String.fromCharCode(bytes[i] ?? 0)\n return out\n}\n\nexport function fromLatin1(value: string): Uint8Array {\n const out = new Uint8Array(value.length)\n for (let i = 0; i < value.length; i++) out[i] = value.charCodeAt(i) & 0xff\n return out\n}\n\nexport function utf8(value: string): Uint8Array {\n return new TextEncoder().encode(value)\n}\n\nexport function utf8Text(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes)\n}\n\nexport function eqBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\n return true\n}\n\nexport function cmpBytes(a: Uint8Array, b: Uint8Array): number {\n const n = Math.min(a.length, b.length)\n for (let i = 0; i < n; i++) {\n const d = (a[i] ?? 0) - (b[i] ?? 0)\n if (d !== 0) return d\n }\n return a.length - b.length\n}\n\nconst INT64_MAX = 9223372036854775807n\nconst INT64_MIN = -9223372036854775808n\n\nexport function parseI64(bytes: Uint8Array): bigint | null {\n const text = latin1(bytes)\n if (!/^-?\\d+$/.test(text)) return null\n try {\n const value = BigInt(text)\n if (value > INT64_MAX || value < INT64_MIN) return null\n return value\n } catch {\n return null\n }\n}\n\nexport function intReply(value: bigint): number | bigint {\n if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) {\n return Number(value)\n }\n return value\n}\n\n/** Redis glob: `*`, `?`, `[abc]`, `[a-z]`, `[^a]` / `[!a]`, and backslash escapes. */\nexport function globMatch(pattern: string, value: string): boolean {\n const match = (p: number, v: number): boolean => {\n if (p === pattern.length) return v === value.length\n const ch = pattern[p]\n if (ch === \"\\\\\") {\n if (p + 1 >= pattern.length) return false\n if (v >= value.length || value[v] !== pattern[p + 1]) return false\n return match(p + 2, v + 1)\n }\n if (ch === \"*\") {\n for (let i = v; i <= value.length; i++) if (match(p + 1, i)) return true\n return false\n }\n if (ch === \"?\") {\n if (v >= value.length) return false\n return match(p + 1, v + 1)\n }\n if (ch === \"[\") {\n if (v >= value.length) return false\n let i = p + 1\n let negate = false\n if (pattern[i] === \"^\" || pattern[i] === \"!\") {\n negate = true\n i++\n }\n let ok = false\n if (pattern[i] === \"]\") return false\n while (i < pattern.length && pattern[i] !== \"]\") {\n if (pattern[i] === \"\\\\\" && i + 1 < pattern.length) i++\n const start = pattern[i] ?? \"\"\n if (pattern[i + 1] === \"-\" && pattern[i + 2] !== undefined && pattern[i + 2] !== \"]\") {\n const end = pattern[i + 2] ?? \"\"\n const cur = value[v] ?? \"\"\n if (cur >= start && cur <= end) ok = true\n i += 3\n } else {\n if (value[v] === start) ok = true\n i++\n }\n }\n if (pattern[i] !== \"]\") return false\n if (ok === negate) return false\n return match(i + 1, v + 1)\n }\n if (v >= value.length || value[v] !== ch) return false\n return match(p + 1, v + 1)\n }\n return match(0, 0)\n}\n", "import { fromLatin1, latin1, utf8 } from \"./bytes.ts\"\n\nexport type Protocol = 2 | 3\n\nexport type Reply =\n | { t: \"simple\"; v: string }\n | { t: \"error\"; v: string }\n | { t: \"int\"; v: number | bigint }\n | { t: \"bulk\"; v: Uint8Array | null }\n | { t: \"array\"; v: Reply[] | null }\n | { t: \"null\" }\n | { t: \"bool\"; v: boolean }\n | { t: \"double\"; v: number }\n | { t: \"map\"; v: Array<[Reply, Reply]> }\n | { t: \"push\"; v: Reply[] }\n\nexport const ok = (): Reply => ({ t: \"simple\", v: \"OK\" })\nexport const queued = (): Reply => ({ t: \"simple\", v: \"QUEUED\" })\nexport const pong = (): Reply => ({ t: \"simple\", v: \"PONG\" })\nexport const simple = (v: string): Reply => ({ t: \"simple\", v })\nexport const err = (v: string): Reply => ({ t: \"error\", v })\nexport const int = (v: number | bigint): Reply => ({ t: \"int\", v })\nexport const bulk = (v: Uint8Array | string | null): Reply => ({\n t: \"bulk\",\n v: v === null ? null : typeof v === \"string\" ? utf8(v) : v,\n})\nexport const arr = (v: Reply[] | null): Reply => ({ t: \"array\", v })\nexport const nil = (): Reply => ({ t: \"bulk\", v: null })\nexport const nilArray = (): Reply => ({ t: \"array\", v: null })\nexport const push = (v: Reply[]): Reply => ({ t: \"push\", v })\nexport const map = (v: Array<[Reply, Reply]>): Reply => ({ t: \"map\", v })\n\nexport const wrongType = (): Reply =>\n err(\"WRONGTYPE Operation against a key holding the wrong kind of value\")\n\nexport function arityError(name: string): Reply {\n return err(`ERR wrong number of arguments for '${name}' command`)\n}\n\nexport const syntaxError = (): Reply => err(\"ERR syntax error\")\n\nexport function unknownCommand(name: string, args: Uint8Array[]): Reply {\n const shown = args\n .slice(0, 10)\n .map((arg) => `'${latin1(arg)}'`)\n .join(\" \")\n const extra = shown.length > 0 ? `${shown} ` : \"\"\n return err(`ERR unknown command '${name}', with args beginning with: ${extra}`)\n}\n\nexport const notInteger = (): Reply => err(\"ERR value is not an integer or out of range\")\nexport const notFloat = (): Reply => err(\"ERR value is not a valid float\")\nexport const noScript = (): Reply => err(\"NOSCRIPT No matching script. Please use EVAL.\")\nexport const readonlyError = (): Reply =>\n err(\"READONLY You can't write against a read only replica.\")\nexport const oomError = (): Reply => err(\"OOM command not allowed when used memory > 'maxmemory'.\")\nexport const busyError = (): Reply =>\n err(\"BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\")\nexport const noAuth = (): Reply => err(\"NOAUTH Authentication required.\")\nexport const wrongPass = (): Reply =>\n err(\"WRONGPASS invalid username-password pair or user is disabled.\")\nexport function authWithoutPassword(password: string): Reply {\n return err(\n `ERR AUTH <${password}> called without any password configured for the default user. Are you sure your configuration is correct?`,\n )\n}\nexport const clusterDisabled = (): Reply => err(\"ERR This instance has cluster support disabled\")\nexport const noSuchKey = (): Reply => err(\"ERR no such key\")\nexport const execWithoutMulti = (): Reply => err(\"ERR EXEC without MULTI\")\nexport const discardWithoutMulti = (): Reply => err(\"ERR DISCARD without MULTI\")\nexport const nestedMulti = (): Reply => err(\"ERR MULTI calls can not be nested\")\nexport const execAbort = (): Reply =>\n err(\"EXECABORT Transaction discarded because of previous errors.\")\nexport const scriptDenied = (): Reply => err(\"ERR This Redis command is not allowed from scripts\")\nexport const notBusy = (): Reply => err(\"NOTBUSY No scripts in execution right now.\")\n\nexport function pubsubOnly(name: string): Reply {\n return err(\n `ERR Can't execute '${name}': only (P|S)SUBSCRIBE / (P|S)UNSUBSCRIBE / PING / QUIT / RESET are allowed in this context`,\n )\n}\n\nexport function noPerm(name: string): Reply {\n return err(`NOPERM this user has no permissions to run the '${name}' command`)\n}\n\nconst CRLF = utf8(\"\\r\\n\")\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n let size = 0\n for (const part of parts) size += part.length\n const out = new Uint8Array(size)\n let offset = 0\n for (const part of parts) {\n out.set(part, offset)\n offset += part.length\n }\n return out\n}\n\nfunction formatDouble(value: number): string {\n if (Number.isNaN(value)) return \"nan\"\n if (value === Infinity) return \"inf\"\n if (value === -Infinity) return \"-inf\"\n if (Object.is(value, -0)) return \"-0\"\n if (Number.isInteger(value)) return String(value)\n return String(value)\n}\n\nexport function encodeReply(reply: Reply, protocol: Protocol = 2): Uint8Array {\n const parts: Uint8Array[] = []\n const text = (value: string) => {\n parts.push(utf8(value))\n }\n const walk = (value: Reply): void => {\n switch (value.t) {\n case \"simple\":\n text(`+${value.v}\\r\\n`)\n return\n case \"error\":\n text(`-${value.v}\\r\\n`)\n return\n case \"int\":\n text(`:${value.v.toString()}\\r\\n`)\n return\n case \"bulk\":\n if (value.v === null) {\n text(protocol === 3 ? \"_\\r\\n\" : \"$-1\\r\\n\")\n return\n }\n text(`$${value.v.length}\\r\\n`)\n parts.push(value.v)\n parts.push(CRLF)\n return\n case \"array\":\n if (value.v === null) {\n text(protocol === 3 ? \"_\\r\\n\" : \"*-1\\r\\n\")\n return\n }\n text(`*${value.v.length}\\r\\n`)\n for (const item of value.v) walk(item)\n return\n case \"null\":\n text(protocol === 3 ? \"_\\r\\n\" : \"$-1\\r\\n\")\n return\n case \"bool\":\n if (protocol === 3) text(value.v ? \"#t\\r\\n\" : \"#f\\r\\n\")\n else text(value.v ? \":1\\r\\n\" : \":0\\r\\n\")\n return\n case \"double\":\n if (protocol === 3) text(`,${formatDouble(value.v)}\\r\\n`)\n else walk(bulk(formatDouble(value.v)))\n return\n case \"map\":\n if (protocol === 3) {\n text(`%${value.v.length}\\r\\n`)\n for (const [key, item] of value.v) {\n walk(key)\n walk(item)\n }\n return\n }\n text(`*${value.v.length * 2}\\r\\n`)\n for (const [key, item] of value.v) {\n walk(key)\n walk(item)\n }\n return\n case \"push\":\n text(protocol === 3 ? `>${value.v.length}\\r\\n` : `*${value.v.length}\\r\\n`)\n for (const item of value.v) walk(item)\n return\n default: {\n const never: never = value\n throw new Error(`unknown reply ${(never as Reply).t}`)\n }\n }\n }\n walk(reply)\n return concat(parts)\n}\n\nexport class RespParser {\n private buf = new Uint8Array(0)\n private pos = 0\n\n push(chunk: Uint8Array): Reply[] {\n if (this.pos > 0) this.buf = this.buf.slice(this.pos)\n this.pos = 0\n if (chunk.length > 0) {\n const next = new Uint8Array(this.buf.length + chunk.length)\n next.set(this.buf)\n next.set(chunk, this.buf.length)\n this.buf = next\n }\n const out: Reply[] = []\n while (this.pos < this.buf.length) {\n const saved = this.pos\n const reply = this.tryOne()\n if (reply === undefined) {\n this.pos = saved\n break\n }\n out.push(reply)\n }\n return out\n }\n\n private tryOne(): Reply | undefined {\n if (this.pos >= this.buf.length) return undefined\n const marker = this.buf[this.pos] ?? 0\n if (\n marker !== 43 &&\n marker !== 45 &&\n marker !== 58 &&\n marker !== 36 &&\n marker !== 42 &&\n marker !== 95 &&\n marker !== 35 &&\n marker !== 44 &&\n marker !== 37 &&\n marker !== 126 &&\n marker !== 62 &&\n marker !== 33\n ) {\n return this.inline()\n }\n this.pos++\n if (marker === 43) {\n const line = this.readLine()\n if (line === null) return undefined\n return simple(line)\n }\n if (marker === 45) {\n const line = this.readLine()\n if (line === null) return undefined\n return err(line)\n }\n if (marker === 58) {\n const line = this.readLine()\n if (line === null) return undefined\n if (!/^-?\\d+$/.test(line)) return err(\"ERR protocol error: invalid integer\")\n const value = BigInt(line)\n return int(\n value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(value)\n : value,\n )\n }\n if (marker === 36) return this.bulk()\n if (marker === 42) return this.aggregate(\"array\")\n if (marker === 95) {\n const line = this.readLine()\n if (line === null) return undefined\n return { t: \"null\" }\n }\n if (marker === 35) {\n const line = this.readLine()\n if (line === null) return undefined\n return { t: \"bool\", v: line === \"t\" }\n }\n if (marker === 44) {\n const line = this.readLine()\n if (line === null) return undefined\n return { t: \"double\", v: Number(line) }\n }\n if (marker === 37) return this.map()\n if (marker === 126) return this.aggregate(\"set\")\n if (marker === 62) return this.aggregate(\"push\")\n if (marker === 33) return this.bulk()\n return undefined\n }\n\n private inline(): Reply | undefined {\n const line = this.readLine()\n if (line === null) return undefined\n if (line.length === 0) return arr([])\n const parts: string[] = []\n let current = \"\"\n let quote: string | null = null\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]\n if (quote) {\n if (ch === quote) quote = null\n else current += ch ?? \"\"\n continue\n }\n if (ch === \"'\" || ch === '\"') {\n quote = ch\n continue\n }\n if (ch === \" \") {\n if (current.length > 0) {\n parts.push(current)\n current = \"\"\n }\n continue\n }\n current += ch ?? \"\"\n }\n if (current.length > 0) parts.push(current)\n return arr(parts.map((part) => bulk(fromLatin1(part))))\n }\n\n private readLine(): string | null {\n for (let i = this.pos; i < this.buf.length; i++) {\n if (this.buf[i] !== 10) continue\n let end = i\n if (end > this.pos && this.buf[end - 1] === 13) end--\n const line = latin1(this.buf.subarray(this.pos, end))\n this.pos = i + 1\n return line\n }\n return null\n }\n\n private bulk(): Reply | undefined {\n const line = this.readLine()\n if (line === null) return undefined\n const size = Number(line)\n if (!Number.isInteger(size)) return err(\"ERR protocol error: invalid bulk length\")\n if (size < 0) return nil()\n if (this.buf.length < this.pos + size + 2) return undefined\n const value = this.buf.slice(this.pos, this.pos + size)\n this.pos += size + 2\n return { t: \"bulk\", v: value }\n }\n\n private aggregate(kind: \"array\" | \"push\" | \"set\"): Reply | undefined {\n const line = this.readLine()\n if (line === null) return undefined\n const count = Number(line)\n if (!Number.isInteger(count)) return err(\"ERR protocol error: invalid multibulk length\")\n if (count < 0) return nilArray()\n const items: Reply[] = []\n for (let i = 0; i < count; i++) {\n const item = this.tryOne()\n if (item === undefined) return undefined\n items.push(item)\n }\n if (kind === \"push\") return push(items)\n return arr(items)\n }\n\n private map(): Reply | undefined {\n const line = this.readLine()\n if (line === null) return undefined\n const count = Number(line)\n if (!Number.isInteger(count) || count < 0) return err(\"ERR protocol error: invalid map length\")\n const pairs: Array<[Reply, Reply]> = []\n for (let i = 0; i < count; i++) {\n const key = this.tryOne()\n if (key === undefined) return undefined\n const value = this.tryOne()\n if (value === undefined) return undefined\n pairs.push([key, value])\n }\n return map(pairs)\n }\n}\n\nexport function asCommand(reply: Reply): { name: string; args: Uint8Array[] } | Reply {\n if (reply.t !== \"array\" || reply.v === null || reply.v.length === 0) {\n return err(\"ERR protocol error: expected command array\")\n }\n const name = reply.v[0]\n if (name?.t !== \"bulk\" || name.v === null) return err(\"ERR protocol error: expected command name\")\n const args: Uint8Array[] = []\n for (let i = 1; i < reply.v.length; i++) {\n const arg = reply.v[i]\n if (arg?.t !== \"bulk\" || arg.v === null)\n return err(\"ERR protocol error: expected bulk argument\")\n args.push(arg.v)\n }\n return { name: latin1(name.v), args }\n}\n", "/** SHA-1, lowercase hex. Used for EVALSHA / SCRIPT LOAD. No WebAssembly. */\n\nconst K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6] as const\n\nfunction rotl(value: number, bits: number): number {\n return ((value << bits) | (value >>> (32 - bits))) >>> 0\n}\n\nexport function sha1Hex(data: Uint8Array): string {\n const bitLength = data.length * 8\n const padded = new Uint8Array(((data.length + 9 + 63) & ~63) >>> 0)\n padded.set(data)\n padded[data.length] = 0x80\n const view = new DataView(padded.buffer)\n view.setUint32(padded.length - 8, Math.floor(bitLength / 0x100000000), false)\n view.setUint32(padded.length - 4, bitLength >>> 0, false)\n\n let h0 = 0x67452301\n let h1 = 0xefcdab89\n let h2 = 0x98badcfe\n let h3 = 0x10325476\n let h4 = 0xc3d2e1f0\n const w = new Uint32Array(80)\n\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let i = 0; i < 16; i++) w[i] = view.getUint32(offset + i * 4, false)\n for (let i = 16; i < 80; i++) {\n w[i] = rotl((w[i - 3] ?? 0) ^ (w[i - 8] ?? 0) ^ (w[i - 14] ?? 0) ^ (w[i - 16] ?? 0), 1)\n }\n let a = h0\n let b = h1\n let c = h2\n let d = h3\n let e = h4\n for (let i = 0; i < 80; i++) {\n const stage = Math.floor(i / 20)\n let f = 0\n if (stage === 0) f = (b & c) | (~b & d)\n else if (stage === 1 || stage === 3) f = b ^ c ^ d\n else f = (b & c) | (b & d) | (c & d)\n const temp = (rotl(a, 5) + f + e + (K[stage] ?? 0) + (w[i] ?? 0)) >>> 0\n e = d\n d = c\n c = rotl(b, 30)\n b = a\n a = temp\n }\n h0 = (h0 + a) >>> 0\n h1 = (h1 + b) >>> 0\n h2 = (h2 + c) >>> 0\n h3 = (h3 + d) >>> 0\n h4 = (h4 + e) >>> 0\n }\n\n return [h0, h1, h2, h3, h4].map((part) => part.toString(16).padStart(8, \"0\")).join(\"\")\n}\n", "import { fromLatin1, latin1, utf8, utf8Text } from \"./bytes.ts\"\nimport { sha1Hex } from \"./sha1.ts\"\n\nexport class LuaTable {\n readonly array = new Map<number, LuaValue>()\n readonly map = new Map<string, LuaValue>()\n\n set(key: LuaValue, value: LuaValue): void {\n if (typeof key === \"number\" && Number.isInteger(key) && key >= 1) {\n if (value === null) this.array.delete(key)\n else this.array.set(key, value)\n return\n }\n const name = keyString(key)\n if (value === null) this.map.delete(name)\n else this.map.set(name, value)\n }\n\n get(key: LuaValue): LuaValue {\n if (typeof key === \"number\" && Number.isInteger(key) && key >= 1) {\n return this.array.has(key) ? (this.array.get(key) ?? null) : null\n }\n const name = keyString(key)\n return this.map.has(name) ? (this.map.get(name) ?? null) : null\n }\n\n has(key: LuaValue): boolean {\n if (typeof key === \"number\" && Number.isInteger(key) && key >= 1) return this.array.has(key)\n return this.map.has(keyString(key))\n }\n\n length(): number {\n let n = 0\n while (this.array.has(n + 1)) n++\n return n\n }\n}\n\nexport class LuaStatus {\n constructor(readonly ok: string) {}\n}\n\nexport class LuaFailure {\n constructor(readonly err: string) {}\n}\n\nexport class LuaClosure {\n constructor(\n readonly params: string[],\n readonly vararg: boolean,\n readonly body: Stmt[],\n readonly env: Env,\n ) {}\n}\n\nexport type LuaHost = (args: LuaValue[]) => LuaValue[]\nexport type LuaValue =\n | null\n | boolean\n | number\n | string\n | LuaTable\n | LuaClosure\n | LuaHost\n | LuaStatus\n | LuaFailure\n\nfunction keyString(key: LuaValue): string {\n if (typeof key === \"string\") return key\n if (typeof key === \"number\") return String(key)\n if (typeof key === \"boolean\") return key ? \"true\" : \"false\"\n if (key === null) throw new Error(\"table index is nil\")\n return `value:${typeof key}`\n}\n\nexport class Env {\n readonly vars = new Map<string, LuaValue>()\n varargs: LuaValue[] = []\n\n constructor(readonly parent: Env | null) {}\n\n get(name: string): LuaValue {\n if (this.vars.has(name)) return this.vars.get(name) ?? null\n return this.parent ? this.parent.get(name) : null\n }\n\n define(name: string, value: LuaValue): void {\n this.vars.set(name, value)\n }\n\n set(name: string, value: LuaValue): void {\n if (this.vars.has(name) || this.parent === null) {\n this.vars.set(name, value)\n return\n }\n this.parent.set(name, value)\n }\n}\n\ntype Expr =\n | { k: \"nil\" }\n | { k: \"bool\"; v: boolean }\n | { k: \"num\"; v: number }\n | { k: \"str\"; v: string }\n | { k: \"name\"; v: string }\n | { k: \"dots\" }\n | { k: \"un\"; op: string; e: Expr }\n | { k: \"bin\"; op: string; l: Expr; r: Expr }\n | { k: \"and\"; l: Expr; r: Expr }\n | { k: \"or\"; l: Expr; r: Expr }\n | { k: \"index\"; t: Expr; i: Expr }\n | { k: \"field\"; t: Expr; n: string }\n | { k: \"call\"; callee: Expr; args: Expr[]; method?: string }\n | { k: \"table\"; fields: Field[] }\n | { k: \"fn\"; params: string[]; vararg: boolean; body: Stmt[] }\n\ninterface Field {\n key?: Expr\n name?: string\n value: Expr\n}\n\ntype Stmt =\n | { k: \"if\"; arms: Array<{ cond: Expr; body: Stmt[] }>; elseBody: Stmt[] }\n | { k: \"while\"; cond: Expr; body: Stmt[] }\n | { k: \"for\"; name: string; start: Expr; stop: Expr; step: Expr | null; body: Stmt[] }\n | { k: \"forin\"; names: string[]; iter: Expr[]; body: Stmt[] }\n | { k: \"do\"; body: Stmt[] }\n | { k: \"return\"; values: Expr[] }\n | { k: \"local\"; names: string[]; values: Expr[] }\n | { k: \"localfn\"; name: string; params: string[]; vararg: boolean; body: Stmt[] }\n | { k: \"assign\"; targets: Target[]; values: Expr[] }\n | { k: \"call\"; expr: Expr }\n | { k: \"break\" }\n\ntype Target =\n | { k: \"name\"; name: string }\n | { k: \"index\"; table: Expr; key: Expr }\n | { k: \"field\"; table: Expr; name: string }\n\ntype Flow = { k: \"next\" } | { k: \"return\"; values: LuaValue[] } | { k: \"break\" }\n\nconst NEXT: Flow = { k: \"next\" }\n\nfunction truthy(value: LuaValue): boolean {\n return value !== null && value !== false\n}\n\nfunction luaEqual(a: LuaValue, b: LuaValue): boolean {\n if (typeof a === \"number\" && typeof b === \"string\") return numberEqualsString(a, b)\n if (typeof b === \"number\" && typeof a === \"string\") return numberEqualsString(b, a)\n if (a instanceof LuaTable || b instanceof LuaTable) return a === b\n return a === b\n}\n\nfunction numberEqualsString(value: number, text: string): boolean {\n const trimmed = text.trim()\n if (!/^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?$/.test(trimmed)) return false\n return Number(trimmed) === value\n}\n\nfunction asNumber(value: LuaValue): number {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\" && /^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?$/.test(value.trim())) {\n return Number(value.trim())\n }\n throw new Error(\"attempt to perform arithmetic on a non-number\")\n}\n\nfunction asString(value: LuaValue): string {\n if (typeof value === \"string\") return value\n if (typeof value === \"number\") return Number.isInteger(value) ? String(value) : String(value)\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\"\n if (value === null) throw new Error(\"attempt to concatenate a nil value\")\n throw new Error(\"attempt to concatenate a non-string value\")\n}\n\nfunction execBlock(body: Stmt[], env: Env): Flow {\n for (const stmt of body) {\n const flow = exec(stmt, env)\n if (flow.k !== \"next\") return flow\n }\n return NEXT\n}\n\nfunction exec(stmt: Stmt, env: Env): Flow {\n switch (stmt.k) {\n case \"if\": {\n for (const arm of stmt.arms) {\n if (truthy(first(evalExpr(arm.cond, env)))) return execBlock(arm.body, new Env(env))\n }\n return execBlock(stmt.elseBody, new Env(env))\n }\n case \"while\": {\n while (truthy(first(evalExpr(stmt.cond, env)))) {\n const flow = execBlock(stmt.body, new Env(env))\n if (flow.k === \"return\") return flow\n if (flow.k === \"break\") break\n }\n return NEXT\n }\n case \"for\": {\n const start = asNumber(first(evalExpr(stmt.start, env)))\n const stop = asNumber(first(evalExpr(stmt.stop, env)))\n const step = stmt.step ? asNumber(first(evalExpr(stmt.step, env))) : 1\n if (step === 0) throw new Error(\"'for' step is zero\")\n for (let i = start; step > 0 ? i <= stop : i >= stop; i += step) {\n const local = new Env(env)\n local.define(stmt.name, i)\n const flow = execBlock(stmt.body, local)\n if (flow.k === \"return\") return flow\n if (flow.k === \"break\") break\n }\n return NEXT\n }\n case \"forin\": {\n const produced = evalList(stmt.iter, env)\n const iter = produced[0] ?? null\n const state = produced[1] ?? null\n let control = produced[2] ?? null\n if (typeof iter !== \"function\" && !(iter instanceof LuaClosure)) {\n throw new Error(\"attempt to call a non-function\")\n }\n for (;;) {\n const values = callValue(iter, [state, control])\n const next = values[0] ?? null\n if (next === null) break\n control = next\n const local = new Env(env)\n stmt.names.forEach((name, index) => {\n local.define(name, values[index] ?? null)\n })\n const flow = execBlock(stmt.body, local)\n if (flow.k === \"return\") return flow\n if (flow.k === \"break\") break\n }\n return NEXT\n }\n case \"do\":\n return execBlock(stmt.body, new Env(env))\n case \"return\":\n return { k: \"return\", values: evalList(stmt.values, env) }\n case \"local\": {\n const values = evalList(stmt.values, env)\n stmt.names.forEach((name, index) => {\n env.define(name, values[index] ?? null)\n })\n return NEXT\n }\n case \"localfn\": {\n const closure = new LuaClosure(stmt.params, stmt.vararg, stmt.body, env)\n env.define(stmt.name, closure)\n return NEXT\n }\n case \"assign\": {\n const values = evalList(stmt.values, env)\n stmt.targets.forEach((target, index) => {\n assign(target, values[index] ?? null, env)\n })\n return NEXT\n }\n case \"call\":\n evalExpr(stmt.expr, env)\n return NEXT\n case \"break\":\n return { k: \"break\" }\n default: {\n const never: never = stmt\n return never\n }\n }\n}\n\nfunction assign(target: Target, value: LuaValue, env: Env): void {\n if (target.k === \"name\") {\n env.set(target.name, value)\n return\n }\n const table = first(evalExpr(target.k === \"index\" ? target.table : target.table, env))\n if (!(table instanceof LuaTable)) throw new Error(\"attempt to index a non-table\")\n if (target.k === \"field\") table.set(target.name, value)\n else table.set(first(evalExpr(target.key, env)), value)\n}\n\nfunction evalList(exprs: Expr[], env: Env): LuaValue[] {\n if (exprs.length === 0) return []\n const out: LuaValue[] = []\n for (let i = 0; i < exprs.length; i++) {\n const expr = exprs[i]\n if (!expr) continue\n const values = evalExpr(expr, env)\n if (i === exprs.length - 1) out.push(...values)\n else out.push(values[0] ?? null)\n }\n return out\n}\n\nfunction first(values: LuaValue[]): LuaValue {\n return values[0] ?? null\n}\n\nfunction evalExpr(expr: Expr, env: Env): LuaValue[] {\n switch (expr.k) {\n case \"nil\":\n return [null]\n case \"bool\":\n return [expr.v]\n case \"num\":\n return [expr.v]\n case \"str\":\n return [expr.v]\n case \"name\":\n return [env.get(expr.v)]\n case \"dots\":\n return env.varargs\n case \"un\": {\n const value = first(evalExpr(expr.e, env))\n if (expr.op === \"not\") return [!truthy(value)]\n if (expr.op === \"#\") {\n if (typeof value === \"string\") return [value.length]\n if (value instanceof LuaTable) return [value.length()]\n throw new Error(\"attempt to get length of a non-table\")\n }\n return [-asNumber(value)]\n }\n case \"bin\": {\n if (expr.op === \"..\") {\n return [asString(first(evalExpr(expr.l, env))) + asString(first(evalExpr(expr.r, env)))]\n }\n if (expr.op === \"==\" || expr.op === \"~=\") {\n const equal = luaEqual(first(evalExpr(expr.l, env)), first(evalExpr(expr.r, env)))\n return [expr.op === \"==\" ? equal : !equal]\n }\n if (expr.op === \"<\" || expr.op === \">\" || expr.op === \"<=\" || expr.op === \">=\") {\n const op = expr.op\n return [\n compare(expr.l, expr.r, env, (a, b) =>\n op === \"<\" ? a < b : op === \">\" ? a > b : op === \"<=\" ? a <= b : a >= b,\n ),\n ]\n }\n const left = asNumber(first(evalExpr(expr.l, env)))\n const right = asNumber(first(evalExpr(expr.r, env)))\n switch (expr.op) {\n case \"+\":\n return [left + right]\n case \"-\":\n return [left - right]\n case \"*\":\n return [left * right]\n case \"/\":\n return [left / right]\n case \"%\":\n return [left % right]\n case \"^\":\n return [left ** right]\n default:\n throw new Error(`unexpected operator ${expr.op}`)\n }\n }\n case \"and\": {\n const left = evalExpr(expr.l, env)\n if (!truthy(first(left))) return [first(left)]\n return evalExpr(expr.r, env)\n }\n case \"or\": {\n const left = evalExpr(expr.l, env)\n if (truthy(first(left))) return [first(left)]\n return evalExpr(expr.r, env)\n }\n case \"index\": {\n const table = first(evalExpr(expr.t, env))\n if (!(table instanceof LuaTable)) throw new Error(\"attempt to index a non-table\")\n return [table.get(first(evalExpr(expr.i, env)))]\n }\n case \"field\": {\n const table = first(evalExpr(expr.t, env))\n if (!(table instanceof LuaTable)) throw new Error(\"attempt to index a non-table\")\n return [table.get(expr.n)]\n }\n case \"call\":\n return callExpr(expr, env)\n case \"table\":\n return [buildTable(expr, env)]\n case \"fn\":\n return [new LuaClosure(expr.params, expr.vararg, expr.body, env)]\n default: {\n const never: never = expr\n return never\n }\n }\n}\n\nfunction compare(\n left: Expr,\n right: Expr,\n env: Env,\n op: (a: number | string, b: number | string) => boolean,\n): boolean {\n const a = first(evalExpr(left, env))\n const b = first(evalExpr(right, env))\n if (typeof a === \"number\" && typeof b === \"number\") return op(a, b)\n if (typeof a === \"string\" && typeof b === \"string\") return op(a, b)\n throw new Error(\"attempt to compare incompatible values\")\n}\n\nfunction callExpr(expr: Extract<Expr, { k: \"call\" }>, env: Env): LuaValue[] {\n if (expr.method) {\n const self = first(evalExpr(expr.callee, env))\n if (!(self instanceof LuaTable)) throw new Error(\"attempt to index a non-table\")\n const fn = self.get(expr.method)\n const args = evalList(expr.args, env)\n return callValue(fn, [self, ...args])\n }\n const fn = first(evalExpr(expr.callee, env))\n return callValue(fn, evalList(expr.args, env))\n}\n\nfunction callValue(fn: LuaValue, args: LuaValue[]): LuaValue[] {\n if (fn instanceof LuaClosure) {\n const local = new Env(fn.env)\n fn.params.forEach((name, index) => {\n local.define(name, args[index] ?? null)\n })\n local.varargs = fn.vararg ? args.slice(fn.params.length) : []\n const flow = execBlock(fn.body, local)\n return flow.k === \"return\" ? flow.values : [null]\n }\n if (typeof fn === \"function\") return fn(args)\n throw new Error(\"attempt to call a non-function\")\n}\n\nfunction buildTable(expr: Extract<Expr, { k: \"table\" }>, env: Env): LuaTable {\n const table = new LuaTable()\n let index = 1\n expr.fields.forEach((field, fieldIndex) => {\n if (field.name !== undefined) {\n table.set(field.name, first(evalExpr(field.value, env)))\n return\n }\n if (field.key) {\n table.set(first(evalExpr(field.key, env)), first(evalExpr(field.value, env)))\n return\n }\n const values = evalExpr(field.value, env)\n const last = fieldIndex === expr.fields.length - 1\n const produced = last ? values : [values[0] ?? null]\n if (produced.length === 0) return\n for (const value of produced) {\n if (value !== null) table.set(index, value)\n index++\n }\n })\n return table\n}\n\ntype Tok =\n | { k: \"num\"; v: number; line: number }\n | { k: \"str\"; v: string; line: number }\n | { k: \"name\"; v: string; line: number }\n | { k: \"sym\"; v: string; line: number }\n | { k: \"eof\"; line: number }\n\nfunction tokenize(source: string): Tok[] {\n const toks: Tok[] = []\n let i = 0\n let line = 1\n const peek = (offset = 0) => source[i + offset]\n while (i < source.length) {\n const ch = peek()\n if (ch === \"\\n\") {\n line++\n i++\n continue\n }\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\") {\n i++\n continue\n }\n if (ch === \"-\" && peek(1) === \"-\") {\n if (peek(2) === \"[\") {\n const close = longBracket(source, i + 2)\n if (close) {\n const end = source.indexOf(close.end, close.next)\n if (end < 0) throw new Error(`unfinished long comment at line ${line}`)\n const skipped = source.slice(i, end)\n line += skipped.split(\"\\n\").length - 1\n i = end + close.end.length\n continue\n }\n }\n while (i < source.length && source[i] !== \"\\n\") i++\n continue\n }\n if (ch === \"'\" || ch === '\"') {\n const quote = ch\n i++\n let value = \"\"\n while (i < source.length && source[i] !== quote) {\n if (source[i] === \"\\n\") line++\n if (source[i] === \"\\\\\") {\n i++\n const esc = source[i]\n const map: Record<string, string> = {\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n a: \"\\u0007\",\n b: \"\\b\",\n f: \"\\f\",\n v: \"\\v\",\n \"\\\\\": \"\\\\\",\n \"'\": \"'\",\n '\"': '\"',\n \"\\n\": \"\\n\",\n }\n if (esc !== undefined && map[esc] !== undefined) value += map[esc]\n else if (esc !== undefined && esc >= \"0\" && esc <= \"9\") {\n let digits = esc\n for (let n = 0; n < 2; n++) {\n const next = source[i + 1]\n if (next === undefined || next < \"0\" || next > \"9\") break\n i++\n digits += next\n }\n value += String.fromCharCode(Number(digits) & 0xff)\n } else value += esc ?? \"\"\n i++\n continue\n }\n value += source[i] ?? \"\"\n i++\n }\n if (source[i] !== quote) throw new Error(`unfinished string at line ${line}`)\n i++\n toks.push({ k: \"str\", v: value, line })\n continue\n }\n if (ch === \"[\") {\n const bracket = longBracket(source, i)\n if (bracket) {\n let start = bracket.next\n if (source[start] === \"\\n\") {\n start++\n line++\n }\n const end = source.indexOf(bracket.end, start)\n if (end < 0) throw new Error(`unfinished long string at line ${line}`)\n const value = source.slice(start, end)\n line += value.split(\"\\n\").length - 1\n i = end + bracket.end.length\n toks.push({ k: \"str\", v: value, line })\n continue\n }\n }\n const digit = peek(1)\n if (\n (ch !== undefined && ch >= \"0\" && ch <= \"9\") ||\n (ch === \".\" && digit !== undefined && digit >= \"0\" && digit <= \"9\")\n ) {\n const start = i\n if (ch === \"0\" && (peek(1) === \"x\" || peek(1) === \"X\")) {\n i += 2\n while (i < source.length && /[0-9a-fA-F]/.test(source[i] ?? \"\")) i++\n toks.push({ k: \"num\", v: Number(source.slice(start, i)), line })\n continue\n }\n while (i < source.length && /[0-9]/.test(source[i] ?? \"\")) i++\n if (source[i] === \".\") {\n i++\n while (i < source.length && /[0-9]/.test(source[i] ?? \"\")) i++\n }\n if (source[i] === \"e\" || source[i] === \"E\") {\n i++\n if (source[i] === \"+\" || source[i] === \"-\") i++\n while (i < source.length && /[0-9]/.test(source[i] ?? \"\")) i++\n }\n toks.push({ k: \"num\", v: Number(source.slice(start, i)), line })\n continue\n }\n if (ch !== undefined && /[A-Za-z_]/.test(ch)) {\n const start = i\n i++\n while (i < source.length && /[A-Za-z0-9_]/.test(source[i] ?? \"\")) i++\n toks.push({ k: \"name\", v: source.slice(start, i), line })\n continue\n }\n const three = source.slice(i, i + 3)\n const two = source.slice(i, i + 2)\n if (three === \"...\") {\n toks.push({ k: \"sym\", v: \"...\", line })\n i += 3\n continue\n }\n if ([\"==\", \"~=\", \"<=\", \">=\", \"..\"].includes(two)) {\n toks.push({ k: \"sym\", v: two, line })\n i += 2\n continue\n }\n toks.push({ k: \"sym\", v: ch ?? \"\", line })\n i++\n }\n toks.push({ k: \"eof\", line })\n return toks\n}\n\nfunction longBracket(source: string, at: number): { next: number; end: string } | null {\n if (source[at] !== \"[\") return null\n let i = at + 1\n while (source[i] === \"=\") i++\n if (source[i] !== \"[\") return null\n const marks = i - (at + 1)\n return { next: i + 1, end: `]${\"=\".repeat(marks)}]` }\n}\n\nclass Parser {\n private i = 0\n constructor(private readonly toks: Tok[]) {}\n\n private cur(): Tok {\n return this.toks[this.i] ?? { k: \"eof\", line: 0 }\n }\n\n private line(): number {\n return this.cur().line\n }\n\n private eat(): Tok {\n const tok = this.cur()\n this.i++\n return tok\n }\n\n private eatSym(value: string): boolean {\n const tok = this.cur()\n if (tok.k === \"sym\" && tok.v === value) {\n this.i++\n return true\n }\n return false\n }\n\n private expectSym(value: string): void {\n if (!this.eatSym(value)) throw new Error(`expected '${value}' at line ${this.line()}`)\n }\n\n private isName(value?: string): boolean {\n const tok = this.cur()\n return tok.k === \"name\" && (value === undefined || tok.v === value)\n }\n\n private eatName(value?: string): string | null {\n if (!this.isName(value)) return null\n const tok = this.eat()\n return tok.k === \"name\" ? tok.v : null\n }\n\n private expectName(): string {\n const name = this.eatName()\n if (name === null) throw new Error(`expected name at line ${this.line()}`)\n return name\n }\n\n parseChunk(): Stmt[] {\n const body = this.parseBlock()\n if (this.cur().k !== \"eof\") throw new Error(`unexpected token at line ${this.line()}`)\n return body\n }\n\n private parseBlock(): Stmt[] {\n const body: Stmt[] = []\n while (!this.blockEnd()) {\n if (this.isName(\"return\")) {\n body.push(this.parseReturn())\n this.eatSym(\";\")\n break\n }\n body.push(this.parseStmt())\n this.eatSym(\";\")\n }\n return body\n }\n\n private blockEnd(): boolean {\n return (\n this.cur().k === \"eof\" ||\n this.isName(\"end\") ||\n this.isName(\"else\") ||\n this.isName(\"elseif\") ||\n this.isName(\"until\")\n )\n }\n\n private parseStmt(): Stmt {\n if (this.isName(\"if\")) return this.parseIf()\n if (this.isName(\"while\")) return this.parseWhile()\n if (this.isName(\"for\")) return this.parseFor()\n if (this.isName(\"do\")) {\n this.eat()\n const body = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { k: \"do\", body }\n }\n if (this.isName(\"local\")) {\n this.eat()\n if (this.isName(\"function\")) {\n this.eat()\n const name = this.expectName()\n const fn = this.parseFunctionTail()\n return { k: \"localfn\", name, params: fn.params, vararg: fn.vararg, body: fn.body }\n }\n const names = [this.expectName()]\n while (this.eatSym(\",\")) names.push(this.expectName())\n const values: Expr[] = []\n if (this.eatSym(\"=\")) values.push(...this.parseExprList())\n return { k: \"local\", names, values }\n }\n if (this.isName(\"function\")) {\n this.eat()\n const name = this.expectName()\n const fn = this.parseFunctionTail()\n return {\n k: \"assign\",\n targets: [{ k: \"name\", name }],\n values: [{ k: \"fn\", params: fn.params, vararg: fn.vararg, body: fn.body }],\n }\n }\n if (this.isName(\"break\")) {\n this.eat()\n return { k: \"break\" }\n }\n const expr = this.parsePrefix()\n if (\n this.cur().k === \"sym\" &&\n this.cur().k === \"sym\" &&\n ((this.cur() as { v: string }).v === \"=\" || (this.cur() as { v: string }).v === \",\")\n ) {\n const targets = [this.asTarget(expr)]\n while (this.eatSym(\",\")) targets.push(this.asTarget(this.parsePrefix()))\n this.expectSym(\"=\")\n return { k: \"assign\", targets, values: this.parseExprList() }\n }\n if (expr.k !== \"call\") throw new Error(`expected statement at line ${this.line()}`)\n return { k: \"call\", expr }\n }\n\n private parseReturn(): Stmt {\n this.eat()\n if (\n this.blockEnd() ||\n (this.cur().k === \"sym\" && this.cur().k === \"sym\" && (this.cur() as { v: string }).v === \";\")\n ) {\n return { k: \"return\", values: [] }\n }\n return { k: \"return\", values: this.parseExprList() }\n }\n\n private parseIf(): Stmt {\n this.eat()\n const arms: Array<{ cond: Expr; body: Stmt[] }> = []\n arms.push({ cond: this.parseExpr(), body: this.afterThen() })\n while (this.eatName(\"elseif\")) arms.push({ cond: this.parseExpr(), body: this.afterThen() })\n let elseBody: Stmt[] = []\n if (this.eatName(\"else\")) elseBody = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { k: \"if\", arms, elseBody }\n }\n\n private afterThen(): Stmt[] {\n if (!this.eatName(\"then\")) throw new Error(`expected 'then' at line ${this.line()}`)\n return this.parseBlock()\n }\n\n private parseWhile(): Stmt {\n this.eat()\n const cond = this.parseExpr()\n if (!this.eatName(\"do\")) throw new Error(`expected 'do' at line ${this.line()}`)\n const body = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { k: \"while\", cond, body }\n }\n\n private parseFor(): Stmt {\n this.eat()\n const name = this.expectName()\n if (this.eatSym(\"=\")) {\n const start = this.parseExpr()\n this.expectSym(\",\")\n const stop = this.parseExpr()\n const step = this.eatSym(\",\") ? this.parseExpr() : null\n if (!this.eatName(\"do\")) throw new Error(`expected 'do' at line ${this.line()}`)\n const body = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { k: \"for\", name, start, stop, step, body }\n }\n const names = [name]\n while (this.eatSym(\",\")) names.push(this.expectName())\n if (!this.eatName(\"in\")) throw new Error(`expected 'in' at line ${this.line()}`)\n const iter = this.parseExprList()\n if (!this.eatName(\"do\")) throw new Error(`expected 'do' at line ${this.line()}`)\n const body = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { k: \"forin\", names, iter, body }\n }\n\n private asTarget(expr: Expr): Target {\n if (expr.k === \"name\") return { k: \"name\", name: expr.v }\n if (expr.k === \"index\") return { k: \"index\", table: expr.t, key: expr.i }\n if (expr.k === \"field\") return { k: \"field\", table: expr.t, name: expr.n }\n throw new Error(`invalid assignment target at line ${this.line()}`)\n }\n\n private parseExprList(): Expr[] {\n const exprs = [this.parseExpr()]\n while (this.eatSym(\",\")) exprs.push(this.parseExpr())\n return exprs\n }\n\n private parseExpr(): Expr {\n return this.parseOr()\n }\n\n private parseOr(): Expr {\n let left = this.parseAnd()\n while (this.eatName(\"or\")) left = { k: \"or\", l: left, r: this.parseAnd() }\n return left\n }\n\n private parseAnd(): Expr {\n let left = this.parseCmp()\n while (this.eatName(\"and\")) left = { k: \"and\", l: left, r: this.parseCmp() }\n return left\n }\n\n private parseCmp(): Expr {\n let left = this.parseConcat()\n const tok = this.cur()\n if (tok.k === \"sym\" && [\"==\", \"~=\", \"<\", \">\", \"<=\", \">=\"].includes(tok.v)) {\n this.eat()\n left = { k: \"bin\", op: tok.v, l: left, r: this.parseConcat() }\n }\n return left\n }\n\n private parseConcat(): Expr {\n const left = this.parseAdd()\n if (this.eatSym(\"..\")) return { k: \"bin\", op: \"..\", l: left, r: this.parseConcat() }\n return left\n }\n\n private parseAdd(): Expr {\n let left = this.parseMul()\n while (\n this.cur().k === \"sym\" &&\n this.cur().k === \"sym\" &&\n ((this.cur() as { v: string }).v === \"+\" || (this.cur() as { v: string }).v === \"-\")\n ) {\n const op = (this.eat() as { v: string }).v\n left = { k: \"bin\", op, l: left, r: this.parseMul() }\n }\n return left\n }\n\n private parseMul(): Expr {\n let left = this.parseUnary()\n while (this.cur().k === \"sym\" && [\"*\", \"/\", \"%\"].includes((this.cur() as { v: string }).v)) {\n const op = (this.eat() as { v: string }).v\n left = { k: \"bin\", op, l: left, r: this.parseUnary() }\n }\n return left\n }\n\n private parseUnary(): Expr {\n if (this.eatName(\"not\")) return { k: \"un\", op: \"not\", e: this.parseUnary() }\n if (this.eatSym(\"#\")) return { k: \"un\", op: \"#\", e: this.parseUnary() }\n if (this.eatSym(\"-\")) return { k: \"un\", op: \"-\", e: this.parseUnary() }\n return this.parsePower()\n }\n\n private parsePower(): Expr {\n const left = this.parsePrimary()\n if (this.eatSym(\"^\")) return { k: \"bin\", op: \"^\", l: left, r: this.parseUnary() }\n return left\n }\n\n private parsePrimary(): Expr {\n if (this.eatName(\"nil\")) return { k: \"nil\" }\n if (this.eatName(\"false\")) return { k: \"bool\", v: false }\n if (this.eatName(\"true\")) return { k: \"bool\", v: true }\n if (this.eatSym(\"...\")) return { k: \"dots\" }\n const tok = this.cur()\n if (tok.k === \"num\") {\n this.eat()\n return { k: \"num\", v: tok.v }\n }\n if (tok.k === \"str\") {\n this.eat()\n return { k: \"str\", v: tok.v }\n }\n if (this.isName(\"function\")) {\n this.eat()\n const fn = this.parseFunctionTail()\n return { k: \"fn\", params: fn.params, vararg: fn.vararg, body: fn.body }\n }\n if (this.eatSym(\"{\")) return this.parseTable()\n return this.parsePrefix()\n }\n\n private parsePrefix(): Expr {\n let expr: Expr\n if (this.eatSym(\"(\")) {\n expr = this.parseExpr()\n this.expectSym(\")\")\n } else if (this.cur().k === \"name\") {\n expr = { k: \"name\", v: this.expectName() }\n } else throw new Error(`expected expression at line ${this.line()}`)\n for (;;) {\n if (this.eatSym(\".\")) {\n expr = { k: \"field\", t: expr, n: this.expectName() }\n continue\n }\n if (this.eatSym(\"[\")) {\n const index = this.parseExpr()\n this.expectSym(\"]\")\n expr = { k: \"index\", t: expr, i: index }\n continue\n }\n if (this.eatSym(\":\")) {\n const method = this.expectName()\n const args = this.parseCallArgs()\n expr = { k: \"call\", callee: expr, args, method }\n continue\n }\n if (this.startsArgs()) {\n expr = { k: \"call\", callee: expr, args: this.parseCallArgs() }\n continue\n }\n return expr\n }\n }\n\n private startsArgs(): boolean {\n return this.eatSymPeek(\"(\") || this.eatSymPeek(\"{\") || this.cur().k === \"str\"\n }\n\n private eatSymPeek(value: string): boolean {\n const tok = this.cur()\n return tok.k === \"sym\" && tok.v === value\n }\n\n private parseCallArgs(): Expr[] {\n if (this.eatSym(\"(\")) {\n const args =\n this.cur().k === \"sym\" && (this.cur() as { v: string }).v === \")\"\n ? []\n : this.parseExprList()\n this.expectSym(\")\")\n return args\n }\n if (this.eatSym(\"{\")) return [this.parseTable()]\n const tok = this.cur()\n if (tok.k === \"str\") {\n this.eat()\n return [{ k: \"str\", v: tok.v }]\n }\n throw new Error(`expected arguments at line ${this.line()}`)\n }\n\n private parseFunctionTail(): { params: string[]; vararg: boolean; body: Stmt[] } {\n this.expectSym(\"(\")\n const params: string[] = []\n let vararg = false\n if (!this.eatSym(\")\")) {\n for (;;) {\n if (this.eatSym(\"...\")) {\n vararg = true\n break\n }\n params.push(this.expectName())\n if (!this.eatSym(\",\")) break\n }\n this.expectSym(\")\")\n }\n const body = this.parseBlock()\n if (!this.eatName(\"end\")) throw new Error(`expected 'end' at line ${this.line()}`)\n return { params, vararg, body }\n }\n\n private parseTable(): Expr {\n const fields: Field[] = []\n while (!(this.cur().k === \"sym\" && (this.cur() as { v: string }).v === \"}\")) {\n if (this.eatSym(\"[\")) {\n const key = this.parseExpr()\n this.expectSym(\"]\")\n this.expectSym(\"=\")\n fields.push({ key, value: this.parseExpr() })\n } else if (\n this.cur().k === \"name\" &&\n this.toks[this.i + 1]?.k === \"sym\" &&\n (this.toks[this.i + 1] as { v: string }).v === \"=\"\n ) {\n const name = this.expectName()\n this.expectSym(\"=\")\n fields.push({ name, value: this.parseExpr() })\n } else fields.push({ value: this.parseExpr() })\n if (!this.eatSym(\",\") && !this.eatSym(\";\")) break\n }\n this.expectSym(\"}\")\n return { k: \"table\", fields }\n }\n}\n\nfunction stringSub(value: string, startRaw: number, endRaw?: number): string {\n const n = value.length\n const normalize = (index: number) => (index < 0 ? n + index + 1 : index)\n const start = normalize(startRaw)\n const end = endRaw === undefined ? n : normalize(endRaw)\n if (start > end) return \"\"\n return value.slice(Math.max(start, 1) - 1, Math.min(end, n))\n}\n\nfunction toJson(value: LuaValue): unknown {\n if (value === null) return null\n if (typeof value === \"boolean\" || typeof value === \"number\") return value\n if (typeof value === \"string\") return utf8Text(fromLatin1(value))\n if (value instanceof LuaTable) {\n const named = [...value.map.keys()]\n if (named.length === 0 && value.length() === 0) return {}\n if (named.length === 0) {\n const list: unknown[] = []\n for (let i = 1; i <= value.length(); i++) list.push(toJson(value.get(i)))\n return list\n }\n const object: Record<string, unknown> = {}\n for (const [key, item] of value.map) object[utf8Text(fromLatin1(key))] = toJson(item)\n return object\n }\n return null\n}\n\nfunction fromJson(value: unknown): LuaValue {\n if (value === null || value === undefined) return null\n if (typeof value === \"boolean\" || typeof value === \"number\") return value\n if (typeof value === \"string\") return latin1(utf8(value))\n if (Array.isArray(value)) {\n const table = new LuaTable()\n value.forEach((item, index) => {\n table.set(index + 1, fromJson(item))\n })\n return table\n }\n if (typeof value === \"object\") {\n const table = new LuaTable()\n for (const [key, item] of Object.entries(value)) table.set(key, fromJson(item))\n return table\n }\n return null\n}\n\nexport interface LuaRedisHost {\n call(args: LuaValue[]): LuaValue[]\n pcall(args: LuaValue[]): LuaValue[]\n}\n\nexport function luaGlobals(host: LuaRedisHost): Env {\n const env = new Env(null)\n const redis = new LuaTable()\n redis.set(\"call\", host.call)\n redis.set(\"pcall\", host.pcall)\n redis.set(\"error_reply\", (args) => [new LuaFailure(asString(args[0] ?? null))])\n redis.set(\"status_reply\", (args) => [new LuaStatus(asString(args[0] ?? null))])\n redis.set(\"sha1hex\", (args) => [sha1Hex(fromLatin1(asString(args[0] ?? null)))])\n redis.set(\"log\", () => [null])\n redis.set(\"replicate_commands\", () => [1])\n redis.set(\"set_repl\", () => [null])\n redis.set(\"LOG_DEBUG\", 0)\n redis.set(\"LOG_VERBOSE\", 1)\n redis.set(\"LOG_NOTICE\", 2)\n redis.set(\"LOG_WARNING\", 3)\n env.define(\"redis\", redis)\n\n const stringLib = new LuaTable()\n stringLib.set(\"len\", (args) => [asString(args[0] ?? null).length])\n stringLib.set(\"sub\", (args) => [\n stringSub(\n asString(args[0] ?? null),\n asNumber(args[1] ?? 1),\n args[2] === undefined ? undefined : asNumber(args[2] ?? 0),\n ),\n ])\n stringLib.set(\"byte\", (args) => {\n const value = asString(args[0] ?? null)\n const start = args[1] === undefined ? 1 : asNumber(args[1] ?? 1)\n const end = args[2] === undefined ? start : asNumber(args[2] ?? start)\n const slice = stringSub(value, start, end)\n return [...slice].map((ch) => ch.charCodeAt(0))\n })\n stringLib.set(\"char\", (args) => [\n args.map((arg) => String.fromCharCode(asNumber(arg) & 0xff)).join(\"\"),\n ])\n stringLib.set(\"format\", (args) => [formatString(asString(args[0] ?? \"\"), args.slice(1))])\n stringLib.set(\"find\", (args) => {\n const hay = asString(args[0] ?? null)\n const needle = asString(args[1] ?? \"\")\n const init = args[2] === undefined ? 1 : asNumber(args[2] ?? 1)\n const at = hay.indexOf(needle, Math.max(0, init - 1))\n if (at < 0) return [null]\n return [at + 1, at + needle.length]\n })\n stringLib.set(\"lower\", (args) => [asString(args[0] ?? null).toLowerCase()])\n stringLib.set(\"upper\", (args) => [asString(args[0] ?? null).toUpperCase()])\n stringLib.set(\"rep\", (args) => [asString(args[0] ?? \"\").repeat(asNumber(args[1] ?? 0))])\n env.define(\"string\", stringLib)\n\n const tableLib = new LuaTable()\n tableLib.set(\"insert\", (args) => {\n const table = args[0]\n if (!(table instanceof LuaTable)) throw new Error(\"bad argument to table.insert\")\n if (args.length >= 3) {\n const pos = asNumber(args[1] ?? 1)\n const value = args[2] ?? null\n for (let i = table.length(); i >= pos; i--) table.set(i + 1, table.get(i))\n table.set(pos, value)\n } else table.set(table.length() + 1, args[1] ?? null)\n return [null]\n })\n tableLib.set(\"remove\", (args) => {\n const table = args[0]\n if (!(table instanceof LuaTable)) throw new Error(\"bad argument to table.remove\")\n const pos = args[1] === undefined ? table.length() : asNumber(args[1] ?? 1)\n const value = table.get(pos)\n const len = table.length()\n for (let i = pos; i < len; i++) table.set(i, table.get(i + 1))\n table.set(len, null)\n return [value]\n })\n tableLib.set(\"concat\", (args) => {\n const table = args[0]\n if (!(table instanceof LuaTable)) throw new Error(\"bad argument to table.concat\")\n const sep = args[1] === undefined || args[1] === null ? \"\" : asString(args[1])\n const start = args[2] === undefined ? 1 : asNumber(args[2] ?? 1)\n const finish = args[3] === undefined ? table.length() : asNumber(args[3] ?? 0)\n const parts: string[] = []\n for (let i = start; i <= finish; i++) parts.push(asString(table.get(i)))\n return [parts.join(sep)]\n })\n tableLib.set(\"unpack\", (args) => unpackTable(args))\n env.define(\"table\", tableLib)\n\n const mathLib = new LuaTable()\n mathLib.set(\"floor\", (args) => [Math.floor(asNumber(args[0] ?? 0))])\n mathLib.set(\"ceil\", (args) => [Math.ceil(asNumber(args[0] ?? 0))])\n mathLib.set(\"abs\", (args) => [Math.abs(asNumber(args[0] ?? 0))])\n mathLib.set(\"max\", (args) => [Math.max(...args.map((arg) => asNumber(arg)))])\n mathLib.set(\"min\", (args) => [Math.min(...args.map((arg) => asNumber(arg)))])\n mathLib.set(\"huge\", Infinity)\n env.define(\"math\", mathLib)\n\n const cjson = new LuaTable()\n cjson.set(\"encode\", (args) => [latin1(utf8(JSON.stringify(toJson(args[0] ?? null)) ?? \"null\"))])\n cjson.set(\"decode\", (args) => {\n const text = utf8Text(fromLatin1(asString(args[0] ?? \"null\")))\n return [fromJson(JSON.parse(text))]\n })\n env.define(\"cjson\", cjson)\n\n env.define(\"tonumber\", (args) => {\n const value = args[0] ?? null\n if (typeof value === \"number\") return [value]\n if (typeof value !== \"string\") return [null]\n if (!/^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?$/.test(value.trim())) return [null]\n return [Number(value.trim())]\n })\n env.define(\"tostring\", (args) => {\n const value = args[0] ?? null\n if (value === null) return [\"nil\"]\n if (typeof value === \"boolean\") return [value ? \"true\" : \"false\"]\n if (typeof value === \"number\" || typeof value === \"string\") return [String(value)]\n if (value instanceof LuaTable) return [\"table\"]\n if (value instanceof LuaStatus) return [value.ok]\n return [\"userdata\"]\n })\n env.define(\"type\", (args) => {\n const value = args[0] ?? null\n if (value === null) return [\"nil\"]\n if (typeof value === \"boolean\") return [\"boolean\"]\n if (typeof value === \"number\") return [\"number\"]\n if (typeof value === \"string\") return [\"string\"]\n if (value instanceof LuaTable) return [\"table\"]\n if (typeof value === \"function\" || value instanceof LuaClosure) return [\"function\"]\n return [\"userdata\"]\n })\n env.define(\"unpack\", (args) => unpackTable(args))\n env.define(\"ipairs\", (args) => {\n const table = args[0]\n const iter: LuaHost = (callArgs) => {\n const subject = callArgs[0]\n const index = (typeof callArgs[1] === \"number\" ? callArgs[1] : 0) + 1\n if (!(subject instanceof LuaTable) || !subject.has(index)) return [null]\n return [index, subject.get(index)]\n }\n return [iter, table ?? null, 0]\n })\n env.define(\"pairs\", (args) => {\n const table = args[0]\n if (!(table instanceof LuaTable)) throw new Error(\"bad argument to pairs\")\n const keys: LuaValue[] = [...table.array.keys(), ...table.map.keys()]\n let cursor = 0\n const iter: LuaHost = () => {\n const key = keys[cursor]\n cursor++\n if (key === undefined) return [null]\n return [key, table.get(key)]\n }\n return [iter, table, null]\n })\n env.define(\"error\", (args) => {\n throw new Error(asString(args[0] ?? \"error\"))\n })\n env.define(\"select\", (args) => {\n const index = args[0]\n const rest = args.slice(1)\n if (index === \"#\") return [rest.length]\n const at = asNumber(index ?? 1)\n if (at < 1) throw new Error(\"bad argument to select\")\n return rest.slice(at - 1)\n })\n env.define(\"next\", () => {\n throw new Error(\"next is not implemented\")\n })\n return env\n}\n\nfunction unpackTable(args: LuaValue[]): LuaValue[] {\n const table = args[0]\n if (!(table instanceof LuaTable)) throw new Error(\"bad argument to unpack\")\n const start = args[1] === undefined ? 1 : asNumber(args[1] ?? 1)\n const finish = args[2] === undefined ? table.length() : asNumber(args[2] ?? 0)\n const out: LuaValue[] = []\n for (let i = start; i <= finish; i++) out.push(table.get(i))\n return out\n}\n\nfunction formatString(fmt: string, args: LuaValue[]): string {\n let out = \"\"\n let arg = 0\n for (let i = 0; i < fmt.length; i++) {\n if (fmt[i] !== \"%\") {\n out += fmt[i] ?? \"\"\n continue\n }\n const spec = fmt[++i]\n if (spec === \"%\") {\n out += \"%\"\n continue\n }\n const value = args[arg++] ?? null\n if (spec === \"s\") out += value === null ? \"nil\" : asString(value)\n else if (spec === \"d\" || spec === \"i\") out += String(Math.trunc(asNumber(value)))\n else if (spec === \"f\") out += String(asNumber(value))\n else if (spec === \"q\")\n out += `\"${asString(value).replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`\n else out += spec ?? \"\"\n }\n return out\n}\n\nexport function runLua(source: string, env: Env): LuaValue[] {\n let body: Stmt[]\n try {\n body = new Parser(tokenize(source)).parseChunk()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Error compiling script: ${message}`)\n }\n const flow = execBlock(body, env)\n return flow.k === \"return\" ? flow.values : [null]\n}\n\n/** Top-level Redis conversion. Nil ends an array; false becomes a null bulk. */\nexport function luaToReplyValue(\n value: LuaValue,\n): \"null\" | \"true\" | \"status\" | \"failure\" | \"number\" | \"string\" | \"table\" {\n if (value === null || value === false) return \"null\"\n if (value === true) return \"true\"\n if (value instanceof LuaStatus) return \"status\"\n if (value instanceof LuaFailure) return \"failure\"\n if (typeof value === \"number\") return \"number\"\n if (typeof value === \"string\") return \"string\"\n if (value instanceof LuaTable) return \"table\"\n return \"null\"\n}\n", "import { cmpBytes, globMatch, latin1 } from \"./bytes.ts\"\nimport type { RedisClock } from \"./clock.ts\"\n\nexport type { RedisClock }\nexport { globMatch }\n\nexport interface StreamEntry {\n id: string\n ms: bigint\n seq: bigint\n fields: Uint8Array[]\n}\n\nexport interface PelItem {\n id: string\n consumer: string\n deliveries: number\n deliveredAt: number\n}\n\nexport interface StreamConsumer {\n seenAt: number\n}\n\nexport interface ConsumerGroup {\n name: string\n lastId: string\n consumers: Map<string, StreamConsumer>\n pel: Map<string, PelItem>\n}\n\nexport interface StreamState {\n entries: StreamEntry[]\n groups: Map<string, ConsumerGroup>\n lastMs: bigint\n lastSeq: bigint\n}\n\nexport interface ZMember {\n member: Uint8Array\n score: number\n}\n\nexport type Value =\n | { kind: \"string\"; bytes: Uint8Array }\n | { kind: \"list\"; items: Uint8Array[] }\n | { kind: \"set\"; members: Map<string, Uint8Array> }\n | { kind: \"zset\"; members: Map<string, ZMember> }\n | { kind: \"hash\"; fields: Map<string, Uint8Array> }\n | { kind: \"stream\"; stream: StreamState }\n\nexport function emptyStream(): StreamState {\n return { entries: [], groups: new Map(), lastMs: -1n, lastSeq: 0n }\n}\n\nexport function typeName(value: Value | undefined): string {\n return value ? value.kind : \"none\"\n}\n\nexport function parseStreamId(id: string): { ms: bigint; seq: bigint } | null {\n const dash = id.indexOf(\"-\")\n if (dash <= 0 || dash === id.length - 1) return null\n const msText = id.slice(0, dash)\n const seqText = id.slice(dash + 1)\n if (!/^\\d+$/.test(msText) || !/^\\d+$/.test(seqText)) return null\n return { ms: BigInt(msText), seq: BigInt(seqText) }\n}\n\nexport function cmpId(a: string, b: string): number {\n const left = parseStreamId(a)\n const right = parseStreamId(b)\n if (!left || !right) return a < b ? -1 : a > b ? 1 : 0\n if (left.ms !== right.ms) return left.ms < right.ms ? -1 : 1\n if (left.seq !== right.seq) return left.seq < right.seq ? -1 : 1\n return 0\n}\n\nexport class Database {\n private values = new Map<string, Value>()\n private expires = new Map<string, number>()\n private gens = new Map<string, number>()\n private lru = new Map<string, number>()\n private order: string[] = []\n private tick = 0\n\n constructor(private readonly clock: RedisClock) {}\n\n now(): number {\n return this.clock.now()\n }\n\n private bump(key: string): void {\n this.gens.set(key, (this.gens.get(key) ?? 0) + 1)\n }\n\n sweep(key: string): void {\n const expiry = this.expires.get(key)\n if (expiry === undefined || expiry > this.clock.now()) return\n this.expires.delete(key)\n if (this.values.delete(key)) {\n this.bump(key)\n this.order = this.order.filter((item) => item !== key)\n this.lru.delete(key)\n }\n }\n\n generation(key: string): number {\n this.sweep(key)\n return this.gens.get(key) ?? 0\n }\n\n get(key: string): Value | undefined {\n this.sweep(key)\n const value = this.values.get(key)\n if (value) this.lru.set(key, ++this.tick)\n return value\n }\n\n has(key: string): boolean {\n return this.get(key) !== undefined\n }\n\n put(key: string, value: Value): void {\n this.sweep(key)\n if (!this.values.has(key)) this.order.push(key)\n this.values.set(key, value)\n this.bump(key)\n this.lru.set(key, ++this.tick)\n }\n\n /** Remove the key when a collection has no elements left. Streams are kept. */\n dropIfEmpty(key: string): void {\n const value = this.values.get(key)\n if (!value) return\n const empty =\n (value.kind === \"list\" && value.items.length === 0) ||\n (value.kind === \"set\" && value.members.size === 0) ||\n (value.kind === \"zset\" && value.members.size === 0) ||\n (value.kind === \"hash\" && value.fields.size === 0)\n if (empty) this.delete(key)\n }\n\n setExpiry(key: string, at: number | null): void {\n if (!this.values.has(key)) return\n if (at === null) this.expires.delete(key)\n else this.expires.set(key, at)\n this.bump(key)\n }\n\n expiry(key: string): number | null {\n this.sweep(key)\n return this.expires.get(key) ?? null\n }\n\n pttl(key: string): number {\n this.sweep(key)\n if (!this.values.has(key)) return -2\n const expiry = this.expires.get(key)\n if (expiry === undefined) return -1\n return Math.max(0, expiry - this.clock.now())\n }\n\n delete(key: string): boolean {\n this.sweep(key)\n this.expires.delete(key)\n const had = this.values.delete(key)\n if (had) {\n this.bump(key)\n this.order = this.order.filter((item) => item !== key)\n this.lru.delete(key)\n }\n return had\n }\n\n rename(source: string, dest: string): boolean {\n const value = this.get(source)\n if (!value) return false\n const expiry = this.expires.get(source) ?? null\n this.delete(source)\n this.put(dest, value)\n if (expiry !== null) this.expires.set(dest, expiry)\n return true\n }\n\n keys(): string[] {\n const live: string[] = []\n for (const key of this.order) {\n this.sweep(key)\n if (this.values.has(key)) live.push(key)\n }\n this.order = live\n return live\n }\n\n matching(pattern: string): string[] {\n return this.keys().filter((key) => globMatch(pattern, key))\n }\n\n clear(): void {\n for (const key of [...this.values.keys()]) this.delete(key)\n this.values.clear()\n this.expires.clear()\n this.order = []\n this.lru.clear()\n }\n\n memory(): number {\n let total = 0\n for (const [key, value] of this.values) total += key.length + valueBytes(value)\n return total\n }\n\n evictLru(): string | null {\n let best: string | null = null\n let bestTick = Number.POSITIVE_INFINITY\n for (const [key, tick] of this.lru) {\n if (!this.values.has(key)) continue\n if (tick < bestTick) {\n best = key\n bestTick = tick\n }\n }\n if (best === null) return null\n this.delete(best)\n return best\n }\n\n zsetOrdered(value: Extract<Value, { kind: \"zset\" }>): ZMember[] {\n return [...value.members.values()].sort((a, b) => {\n if (a.score !== b.score) return a.score - b.score\n return cmpBytes(a.member, b.member)\n })\n }\n}\n\nfunction valueBytes(value: Value): number {\n switch (value.kind) {\n case \"string\":\n return value.bytes.length\n case \"list\":\n return value.items.reduce((sum, item) => sum + item.length, 0)\n case \"set\":\n return [...value.members.values()].reduce((sum, item) => sum + item.length, 0)\n case \"zset\":\n return [...value.members.values()].reduce((sum, item) => sum + item.member.length + 8, 0)\n case \"hash\":\n return [...value.fields.entries()].reduce(\n (sum, [field, item]) => sum + field.length + item.length,\n 0,\n )\n case \"stream\":\n return value.stream.entries.reduce(\n (sum, entry) =>\n sum + entry.id.length + entry.fields.reduce((inner, field) => inner + field.length, 0),\n 0,\n )\n default: {\n const never: never = value\n return never\n }\n }\n}\n\nexport function memberKey(bytes: Uint8Array): string {\n return latin1(bytes)\n}\n", "import { fromLatin1, globMatch, intReply, latin1, parseI64, utf8, utf8Text } from \"./bytes.ts\"\nimport { type RedisClock, wallClock } from \"./clock.ts\"\nimport { LuaFailure, LuaStatus, LuaTable, type LuaValue, luaGlobals, runLua } from \"./lua.ts\"\nimport {\n arityError,\n arr,\n authWithoutPassword,\n bulk,\n busyError,\n clusterDisabled,\n discardWithoutMulti,\n err,\n execAbort,\n execWithoutMulti,\n int,\n map,\n nestedMulti,\n nil,\n nilArray,\n noAuth,\n noPerm,\n noScript,\n noSuchKey,\n notBusy,\n notFloat,\n notInteger,\n ok,\n oomError,\n pubsubOnly,\n push,\n queued,\n type Reply,\n readonlyError,\n scriptDenied,\n simple,\n syntaxError,\n unknownCommand,\n wrongPass,\n wrongType,\n} from \"./protocol.ts\"\nimport { sha1Hex } from \"./sha1.ts\"\nimport {\n cmpId,\n Database,\n emptyStream,\n memberKey,\n parseStreamId,\n type StreamEntry,\n type Value,\n} from \"./store.ts\"\n\nexport type { RedisClock } from \"./clock.ts\"\nexport type { Reply } from \"./protocol.ts\"\n\nexport class RedisConnectionError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"RedisConnectionError\"\n }\n}\n\nexport class RedisReplyError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"RedisReplyError\"\n }\n}\n\nexport interface RedisUser {\n name: string\n password: string\n readOnly?: boolean\n}\n\nexport interface RedisOptions {\n clock?: RedisClock\n databases?: number\n password?: string\n users?: RedisUser[]\n maxmemory?: number\n maxmemoryPolicy?: \"noeviction\" | \"allkeys-lru\"\n seed?: number\n}\n\nexport type RedisFault =\n | \"readonly\"\n | \"oom\"\n | \"busy\"\n | \"disconnect\"\n | \"timeout\"\n | { latencyMs: number }\n | null\n\ninterface Session {\n id: number\n db: number\n protocol: 2 | 3\n name: string\n libName: string\n libVer: string\n authenticated: boolean\n username: string\n readOnly: boolean\n multi: Array<{ name: string; args: Uint8Array[] }> | null\n multiFailed: boolean\n watching: Array<{ db: number; key: string; gen: number }>\n channels: Set<string>\n patterns: Set<string>\n dead: boolean\n quit: boolean\n inExec: boolean\n onPush: (reply: Reply) => void\n}\n\ninterface Waiter {\n kind: \"list\" | \"zset\" | \"stream\"\n keys: string[]\n db: number\n side: \"left\" | \"right\"\n destKey?: string\n destSide?: \"left\" | \"right\"\n deadline?: number\n group?: string\n consumer?: string\n streamIds?: string[]\n count: number\n noack?: boolean\n max?: boolean\n settled: boolean\n resolve: (reply: Reply) => void\n reject: (error: Error) => void\n unsub?: () => void\n timer?: ReturnType<typeof setTimeout>\n}\n\nconst PREAUTH = new Set([\"auth\", \"hello\", \"quit\", \"reset\"])\nconst PUBSUB_OK = new Set([\n \"subscribe\",\n \"unsubscribe\",\n \"psubscribe\",\n \"punsubscribe\",\n \"ssubscribe\",\n \"sunsubscribe\",\n \"ping\",\n \"quit\",\n \"reset\",\n])\nconst IMMEDIATE = new Set([\n \"exec\",\n \"discard\",\n \"multi\",\n \"watch\",\n \"unwatch\",\n \"quit\",\n \"reset\",\n \"subscribe\",\n \"unsubscribe\",\n \"psubscribe\",\n \"punsubscribe\",\n])\nconst WRITES = new Set([\n \"set\",\n \"setnx\",\n \"setex\",\n \"psetex\",\n \"mset\",\n \"append\",\n \"setrange\",\n \"incr\",\n \"incrby\",\n \"incrbyfloat\",\n \"decr\",\n \"decrby\",\n \"getset\",\n \"getdel\",\n \"getex\",\n \"del\",\n \"unlink\",\n \"expire\",\n \"pexpire\",\n \"expireat\",\n \"pexpireat\",\n \"persist\",\n \"rename\",\n \"renamenx\",\n \"copy\",\n \"flushdb\",\n \"flushall\",\n \"hset\",\n \"hmset\",\n \"hdel\",\n \"hincrby\",\n \"hincrbyfloat\",\n \"hsetnx\",\n \"lpush\",\n \"rpush\",\n \"lpop\",\n \"rpop\",\n \"lset\",\n \"lrem\",\n \"ltrim\",\n \"linsert\",\n \"lmove\",\n \"rpoplpush\",\n \"blpop\",\n \"brpop\",\n \"sadd\",\n \"srem\",\n \"spop\",\n \"smove\",\n \"zadd\",\n \"zrem\",\n \"zincrby\",\n \"zpopmin\",\n \"zpopmax\",\n \"bzpopmin\",\n \"bzpopmax\",\n \"zremrangebyrank\",\n \"zremrangebyscore\",\n \"xadd\",\n \"xdel\",\n \"xtrim\",\n \"xgroup\",\n \"xreadgroup\",\n \"xack\",\n \"xclaim\",\n \"xautoclaim\",\n \"eval\",\n \"evalsha\",\n])\nconst SCRIPT_BLOCKED = new Set([\n \"blpop\",\n \"brpop\",\n \"bzpopmin\",\n \"bzpopmax\",\n \"auth\",\n \"select\",\n \"watch\",\n \"multi\",\n \"exec\",\n \"discard\",\n \"subscribe\",\n \"unsubscribe\",\n \"psubscribe\",\n \"punsubscribe\",\n \"shutdown\",\n])\n\nconst VERSION = \"7.2.4\"\n\nfunction text(bytes: Uint8Array | undefined): string {\n return bytes ? latin1(bytes) : \"\"\n}\n\nfunction upper(bytes: Uint8Array | undefined): string {\n return text(bytes).toUpperCase()\n}\n\nfunction scoreText(score: number): string {\n if (Number.isNaN(score)) return \"nan\"\n if (score === Infinity) return \"inf\"\n if (score === -Infinity) return \"-inf\"\n if (Number.isInteger(score)) return String(score)\n return String(score)\n}\n\nfunction parseScore(bytes: Uint8Array | undefined): number | null {\n if (!bytes) return null\n const value = text(bytes).trim().toLowerCase()\n if (value === \"+inf\" || value === \"inf\") return Infinity\n if (value === \"-inf\") return -Infinity\n if (!/^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?$/.test(value)) return null\n const score = Number(value)\n return Number.isFinite(score) ? score : null\n}\n\nfunction parseTimeout(bytes: Uint8Array | undefined): number | null {\n if (!bytes) return null\n const value = Number(text(bytes))\n if (!Number.isFinite(value) || value < 0) return null\n return value\n}\n\nfunction decodeReply(reply: Reply): unknown {\n switch (reply.t) {\n case \"simple\":\n return reply.v\n case \"error\":\n throw new RedisReplyError(reply.v)\n case \"int\":\n return typeof reply.v === \"bigint\" ? intReply(reply.v) : reply.v\n case \"bulk\":\n return reply.v === null ? null : utf8Text(reply.v)\n case \"array\":\n return reply.v === null ? null : reply.v.map((item) => decodeReply(item))\n case \"null\":\n return null\n case \"bool\":\n return reply.v\n case \"double\":\n return reply.v\n case \"map\": {\n const record: Record<string, unknown> = {}\n for (const [key, value] of reply.v) record[String(decodeReply(key))] = decodeReply(value)\n return record\n }\n case \"push\":\n return reply.v.map((item) => decodeReply(item))\n default: {\n const never: never = reply\n return never\n }\n }\n}\n\nfunction luaToBytes(value: LuaValue): Uint8Array {\n if (typeof value === \"string\") return fromLatin1(value)\n if (typeof value === \"number\")\n return utf8(Number.isInteger(value) ? String(value) : String(value))\n if (typeof value === \"boolean\") return utf8(value ? \"1\" : \"\")\n if (value === null) return utf8(\"\")\n if (value instanceof LuaStatus) return utf8(value.ok)\n return utf8(\"\")\n}\n\nfunction replyToLua(reply: Reply): LuaValue {\n switch (reply.t) {\n case \"error\":\n throw new Error(reply.v)\n case \"simple\":\n return new LuaStatus(reply.v)\n case \"int\":\n return typeof reply.v === \"bigint\" ? Number(reply.v) : reply.v\n case \"bulk\":\n return reply.v === null ? false : latin1(reply.v)\n case \"array\":\n case \"push\": {\n if (reply.t === \"array\" && reply.v === null) return false\n const items = reply.v ?? []\n const table = new LuaTable()\n items.forEach((item, index) => {\n table.set(index + 1, replyToLua(item))\n })\n return table\n }\n case \"null\":\n return false\n case \"bool\":\n return reply.v\n case \"double\":\n return reply.v\n case \"map\": {\n const table = new LuaTable()\n for (const [key, value] of reply.v) {\n const luaKey = replyToLua(key)\n table.set(luaKey === false ? \"\" : luaKey, replyToLua(value))\n }\n return table\n }\n default: {\n const never: never = reply\n return never\n }\n }\n}\n\nfunction luaToReply(value: LuaValue): Reply {\n if (value === null || value === false) return nil()\n if (value === true) return int(1)\n if (value instanceof LuaStatus) return simple(value.ok)\n if (value instanceof LuaFailure) return err(value.err)\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return int(value)\n return bulk(String(value))\n }\n if (typeof value === \"string\") return { t: \"bulk\", v: fromLatin1(value) }\n if (value instanceof LuaTable) {\n const okField = value.get(\"ok\")\n const errField = value.get(\"err\")\n if (typeof okField === \"string\") return simple(okField)\n if (typeof errField === \"string\") return err(errField)\n const items: Reply[] = []\n for (let i = 1; value.has(i); i++) items.push(luaToReply(value.get(i)))\n return arr(items)\n }\n return nil()\n}\n\nfunction entryFields(entry: StreamEntry): Reply {\n return arr([bulk(entry.id), arr(entry.fields.map((field) => ({ t: \"bulk\", v: field })))])\n}\n\nexport class Redis {\n readonly clock: RedisClock\n private readonly dbs: Database[]\n private readonly password: string | undefined\n private readonly users: RedisUser[]\n private readonly authRequired: boolean\n readonly maxmemory: number\n private policy: \"noeviction\" | \"allkeys-lru\"\n private rngState: number\n private faultValue: RedisFault = null\n private tail: Promise<void> = Promise.resolve()\n private sessions = new Set<Session>()\n private nextClientId = 1\n private waiters: Waiter[] = []\n private channelSubs = new Map<string, Set<Session>>()\n private patternSubs = new Map<string, Set<Session>>()\n private scripts = new Map<string, string>()\n private invoked = \"\"\n private scriptDepth = 0\n private commandCount = 0\n private closed = false\n consumersPaused = false\n private readonly disconnectListeners = new Set<(session: Session) => void>()\n\n constructor(options: RedisOptions = {}) {\n this.clock = options.clock ?? wallClock()\n const count = options.databases ?? 16\n this.dbs = Array.from({ length: count }, () => new Database(this.clock))\n this.password = options.password\n this.users = options.users ?? []\n this.authRequired = options.password !== undefined || this.users.length > 0\n this.maxmemory = options.maxmemory ?? 0\n this.policy = options.maxmemoryPolicy ?? \"noeviction\"\n this.rngState = options.seed ?? 1\n }\n\n client(): RedisClient {\n return new RedisClient(this, this.createSession())\n }\n\n advance(ms: number): void {\n this.clock.advance(ms)\n }\n\n fault(value: RedisFault): void {\n this.faultValue = value\n if (value === \"busy\") return\n if (value === \"disconnect\" || value === \"timeout\") {\n for (const session of [...this.sessions]) this.dropSession(session, value)\n }\n }\n\n pauseConsumers(paused = true): void {\n this.consumersPaused = paused\n if (!paused) this.enqueue(() => this.wakeAll())\n }\n\n waiterCount(): number {\n return this.waiters.length\n }\n\n inspect(db = 0): Array<{ key: string; type: string; pttl: number }> {\n const database = this.database(db)\n return database.keys().map((key) => ({\n key,\n type: database.get(key)?.kind ?? \"none\",\n pttl: database.pttl(key),\n }))\n }\n\n reset(): void {\n for (const database of this.dbs) database.clear()\n this.scripts.clear()\n for (const waiter of [...this.waiters]) {\n this.finishWaiter(waiter, nilArray())\n }\n for (const session of this.sessions) {\n session.multi = null\n session.multiFailed = false\n session.watching = []\n }\n }\n\n close(): void {\n this.closed = true\n for (const waiter of [...this.waiters]) {\n this.failWaiter(waiter, new RedisConnectionError(\"Connection is closed\"))\n }\n for (const session of [...this.sessions]) session.dead = true\n }\n\n onDisconnect(listener: (session: Session) => void): () => void {\n this.disconnectListeners.add(listener)\n return () => this.disconnectListeners.delete(listener)\n }\n\n createSession(): Session {\n const session: Session = {\n id: this.nextClientId++,\n db: 0,\n protocol: 2,\n name: \"\",\n libName: \"\",\n libVer: \"\",\n authenticated: !this.authRequired,\n username: \"default\",\n readOnly: false,\n multi: null,\n multiFailed: false,\n watching: [],\n channels: new Set(),\n patterns: new Set(),\n dead: false,\n quit: false,\n inExec: false,\n onPush: () => undefined,\n }\n this.sessions.add(session)\n return session\n }\n\n perform(session: Session, name: string, args: Uint8Array[]): Promise<Reply> {\n if (session.dead || this.closed) {\n return Promise.reject(new RedisConnectionError(\"Connection is closed\"))\n }\n return new Promise((resolve, reject) => {\n this.enqueue(async () => {\n try {\n if (session.dead || this.closed) {\n reject(new RedisConnectionError(\"Connection is closed\"))\n return\n }\n if (this.faultValue === \"disconnect\" || this.faultValue === \"timeout\") {\n const message = this.faultValue === \"timeout\" ? \"Command timed out\" : \"Connection reset\"\n this.dropSession(session, this.faultValue)\n reject(new RedisConnectionError(message))\n return\n }\n await this.applyLatency()\n if (session.dead || this.closed) {\n reject(new RedisConnectionError(\"Connection is closed\"))\n return\n }\n const result = this.dispatch(session, name, args)\n if (result instanceof Promise) {\n result.then(resolve, reject)\n return\n }\n resolve(result)\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n })\n })\n }\n\n private enqueue(task: () => Promise<void> | void): void {\n this.tail = this.tail.then(task, task).then(\n () => undefined,\n () => undefined,\n )\n }\n\n private applyLatency(): Promise<void> {\n const fault = this.faultValue\n if (fault === null || typeof fault === \"string\") return Promise.resolve()\n const target = this.clock.now() + fault.latencyMs\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const finish = () => {\n if (this.clock.now() < target) return\n unsub()\n if (timer !== undefined) clearTimeout(timer)\n resolve()\n }\n const unsub = this.clock.subscribe(finish)\n if (!this.clock.manual) timer = setTimeout(finish, fault.latencyMs)\n finish()\n })\n }\n\n private dropSession(session: Session, reason: \"disconnect\" | \"timeout\"): void {\n session.dead = true\n const message = reason === \"timeout\" ? \"Command timed out\" : \"Connection reset\"\n for (const waiter of [...this.waiters]) {\n if (waiter.db >= 0 && this.sessionOf(waiter) === session) {\n this.failWaiter(waiter, new RedisConnectionError(message))\n }\n }\n this.leavePubsub(session)\n this.sessions.delete(session)\n for (const listener of this.disconnectListeners) listener(session)\n }\n\n private sessionOf(waiter: Waiter): Session | null {\n for (const session of this.sessions) {\n if (session === waiterSession.get(waiter)) return session\n }\n return waiterSession.get(waiter) ?? null\n }\n\n private database(index: number): Database {\n const database = this.dbs[index]\n if (!database) throw new Error(\"db index out of range\")\n return database\n }\n\n private random(): number {\n this.rngState = (Math.imul(1664525, this.rngState) + 1013904223) >>> 0\n return this.rngState / 4294967296\n }\n\n private memory(): number {\n return this.dbs.reduce((sum, database) => sum + database.memory(), 0)\n }\n\n private dispatch(session: Session, nameRaw: string, args: Uint8Array[]): Reply | Promise<Reply> {\n const command = nameRaw.toLowerCase()\n this.invoked = nameRaw\n this.commandCount++\n if (this.authRequired && !session.authenticated && !PREAUTH.has(command)) return noAuth()\n if (session.channels.size + session.patterns.size > 0 && !PUBSUB_OK.has(command)) {\n return pubsubOnly(command)\n }\n if (this.faultValue === \"busy\" && command !== \"script\" && command !== \"shutdown\")\n return busyError()\n if (session.multi && !IMMEDIATE.has(command)) {\n const checked = this.execCmd(session, command, args, false)\n if (checked instanceof Promise || checked.t === \"error\") {\n session.multiFailed = true\n return checked instanceof Promise ? syntaxError() : checked\n }\n session.multi.push({\n name: command,\n args: args.map((arg) => Uint8Array.from(arg)),\n })\n return queued()\n }\n return this.execCmd(session, command, args, true)\n }\n\n private execCmd(\n session: Session,\n command: string,\n args: Uint8Array[],\n apply: boolean,\n ): Reply | Promise<Reply> {\n if (apply && this.scriptDepth > 0 && SCRIPT_BLOCKED.has(command)) return scriptDenied()\n if (\n apply &&\n command === \"xread\" &&\n args.some((arg) => text(arg).toUpperCase() === \"BLOCK\") &&\n this.scriptDepth > 0\n ) {\n return scriptDenied()\n }\n if (\n apply &&\n command === \"xreadgroup\" &&\n args.some((arg) => text(arg).toUpperCase() === \"BLOCK\") &&\n this.scriptDepth > 0\n ) {\n return scriptDenied()\n }\n const denied = this.guardWrite(session, command, apply)\n if (denied) return denied\n switch (command) {\n case \"ping\":\n return this.cmdPing(session, args)\n case \"echo\":\n return args.length === 1 ? bulk(args[0] ?? null) : arityError(\"echo\")\n case \"quit\":\n session.quit = true\n return ok()\n case \"auth\":\n return this.cmdAuth(session, args)\n case \"hello\":\n return this.cmdHello(session, args)\n case \"select\":\n return this.cmdSelect(session, args)\n case \"reset\":\n return this.cmdReset(session)\n case \"client\":\n return this.cmdClient(session, args, apply)\n case \"info\":\n return bulk(this.info(session, args[0] ? text(args[0]) : \"default\"))\n case \"time\":\n return this.cmdTime()\n case \"role\":\n return arr([simple(\"master\"), int(0), arr([])])\n case \"readonly\":\n case \"asking\":\n return clusterDisabled()\n case \"cluster\":\n return clusterDisabled()\n case \"module\":\n return args.length >= 1 && upper(args[0]) === \"LIST\" ? arr([]) : arityError(\"module\")\n case \"command\":\n return arr([])\n case \"config\":\n return this.cmdConfig(args, apply)\n case \"dbsize\":\n return int(this.database(session.db).keys().length)\n case \"flushdb\":\n if (!apply) return queued()\n this.database(session.db).clear()\n return ok()\n case \"flushall\":\n if (!apply) return queued()\n for (const database of this.dbs) database.clear()\n return ok()\n case \"randomkey\":\n return this.cmdRandomKey(session)\n case \"scan\":\n return this.cmdScan(session, args)\n case \"keys\":\n return this.cmdKeys(session, args)\n case \"type\":\n return this.cmdType(session, args)\n case \"exists\":\n return this.cmdExists(session, args)\n case \"del\":\n case \"unlink\":\n return this.cmdDel(session, args, apply)\n case \"rename\":\n return this.cmdRename(session, args, apply, false)\n case \"renamenx\":\n return this.cmdRename(session, args, apply, true)\n case \"expire\":\n case \"pexpire\":\n case \"expireat\":\n case \"pexpireat\":\n return this.cmdExpire(session, command, args, apply)\n case \"ttl\":\n case \"pttl\":\n return this.cmdTtl(session, command, args)\n case \"persist\":\n return this.cmdPersist(session, args, apply)\n case \"get\":\n return this.cmdGet(session, args)\n case \"set\":\n return this.cmdSet(session, args, apply)\n case \"setnx\":\n return args.length === 2\n ? this.cmdSet(session, [args[0] ?? utf8(\"\"), args[1] ?? utf8(\"\"), utf8(\"NX\")], apply)\n : arityError(\"setnx\")\n case \"setex\":\n return args.length === 3\n ? this.cmdSet(\n session,\n [args[0] ?? utf8(\"\"), args[2] ?? utf8(\"\"), utf8(\"EX\"), args[1] ?? utf8(\"\")],\n apply,\n )\n : arityError(\"setex\")\n case \"psetex\":\n return args.length === 3\n ? this.cmdSet(\n session,\n [args[0] ?? utf8(\"\"), args[2] ?? utf8(\"\"), utf8(\"PX\"), args[1] ?? utf8(\"\")],\n apply,\n )\n : arityError(\"psetex\")\n case \"mget\":\n return this.cmdMget(session, args)\n case \"mset\":\n return this.cmdMset(session, args, apply)\n case \"append\":\n return this.cmdAppend(session, args, apply)\n case \"strlen\":\n return this.cmdStrlen(session, args)\n case \"getrange\":\n return this.cmdGetRange(session, args)\n case \"setrange\":\n return this.cmdSetRange(session, args, apply)\n case \"incr\":\n return this.cmdIncr(session, args, 1n, apply)\n case \"decr\":\n return this.cmdIncr(session, args, -1n, apply)\n case \"incrby\":\n case \"decrby\":\n return this.cmdIncrBy(session, command, args, apply)\n case \"incrbyfloat\":\n return this.cmdIncrByFloat(session, args, apply, false)\n case \"getset\":\n return args.length === 2\n ? this.cmdSet(session, [args[0] ?? utf8(\"\"), args[1] ?? utf8(\"\"), utf8(\"GET\")], apply)\n : arityError(\"getset\")\n case \"getdel\":\n return this.cmdGetDel(session, args, apply)\n case \"getex\":\n return this.cmdGetEx(session, args, apply)\n case \"hset\":\n case \"hmset\":\n case \"hsetnx\":\n case \"hget\":\n case \"hdel\":\n case \"hexists\":\n case \"hgetall\":\n case \"hkeys\":\n case \"hvals\":\n case \"hlen\":\n case \"hmget\":\n case \"hincrby\":\n case \"hincrbyfloat\":\n case \"hstrlen\":\n return this.cmdHash(session, command, args, apply)\n case \"lpush\":\n case \"rpush\":\n case \"lpop\":\n case \"rpop\":\n case \"llen\":\n case \"lrange\":\n case \"lindex\":\n case \"lset\":\n case \"lrem\":\n case \"ltrim\":\n case \"linsert\":\n case \"lmove\":\n case \"rpoplpush\":\n return this.cmdList(session, command, args, apply)\n case \"blpop\":\n return this.cmdBlockingList(session, args, apply, \"left\")\n case \"brpop\":\n return this.cmdBlockingList(session, args, apply, \"right\")\n case \"sadd\":\n case \"srem\":\n case \"sismember\":\n case \"smismember\":\n case \"smembers\":\n case \"scard\":\n case \"spop\":\n case \"srandmember\":\n case \"sinter\":\n case \"sunion\":\n case \"sdiff\":\n case \"smove\":\n return this.cmdSetFamily(session, command, args, apply)\n case \"zadd\":\n case \"zrem\":\n case \"zcard\":\n case \"zscore\":\n case \"zmscore\":\n case \"zrank\":\n case \"zrevrank\":\n case \"zrange\":\n case \"zrevrange\":\n case \"zrangebyscore\":\n case \"zrevrangebyscore\":\n case \"zcount\":\n case \"zpopmin\":\n case \"zpopmax\":\n case \"zincrby\":\n case \"zremrangebyscore\":\n case \"zremrangebyrank\":\n return this.cmdZset(session, command, args, apply)\n case \"bzpopmin\":\n return this.cmdBlockingZset(session, args, apply, false)\n case \"bzpopmax\":\n return this.cmdBlockingZset(session, args, apply, true)\n case \"xadd\":\n case \"xlen\":\n case \"xrange\":\n case \"xrevrange\":\n case \"xdel\":\n case \"xtrim\":\n case \"xgroup\":\n case \"xread\":\n case \"xreadgroup\":\n case \"xack\":\n case \"xpending\":\n case \"xclaim\":\n case \"xautoclaim\":\n case \"xinfo\":\n return this.cmdStream(session, command, args, apply)\n case \"subscribe\":\n case \"unsubscribe\":\n case \"psubscribe\":\n case \"punsubscribe\":\n return this.cmdSub(session, command, args)\n case \"publish\":\n return this.cmdPublish(args)\n case \"pubsub\":\n return this.cmdPubsub(args)\n case \"multi\":\n if (session.multi) return nestedMulti()\n session.multi = []\n session.multiFailed = false\n return ok()\n case \"exec\":\n return this.cmdExec(session)\n case \"discard\":\n return this.cmdDiscard(session)\n case \"watch\":\n return this.cmdWatch(session, args)\n case \"unwatch\":\n session.watching = []\n return ok()\n case \"eval\":\n case \"evalsha\":\n return this.cmdEval(session, command, args, apply)\n case \"script\":\n return this.cmdScript(args, apply)\n case \"shutdown\":\n return ok()\n default:\n return unknownCommand(this.invoked, args)\n }\n }\n\n private guardWrite(session: Session, command: string, apply: boolean): Reply | null {\n if (!apply || !WRITES.has(command)) return null\n if (session.readOnly) return noPerm(command)\n if (this.faultValue === \"readonly\") return readonlyError()\n if (this.faultValue === \"oom\") return oomError()\n if (this.maxmemory > 0 && this.memory() > this.maxmemory && this.policy === \"noeviction\") {\n return oomError()\n }\n if (this.maxmemory > 0 && this.policy === \"allkeys-lru\") {\n while (this.memory() > this.maxmemory) {\n let evicted = false\n for (const database of this.dbs) {\n if (database.evictLru()) {\n evicted = true\n break\n }\n }\n if (!evicted) break\n }\n }\n return null\n }\n\n private cmdPing(session: Session, args: Uint8Array[]): Reply {\n if (args.length > 1) return arityError(\"ping\")\n if (session.channels.size + session.patterns.size > 0) {\n return push([bulk(\"pong\"), args[0] ? { t: \"bulk\", v: args[0] } : bulk(\"\")])\n }\n if (args.length === 1) return { t: \"bulk\", v: args[0] ?? null }\n return simple(\"PONG\")\n }\n\n private cmdAuth(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1 && args.length !== 2) return arityError(\"auth\")\n const user = args.length === 2 ? text(args[0]) : \"default\"\n const password = text(args.length === 2 ? args[1] : args[0])\n if (!this.authRequired) return authWithoutPassword(password)\n const account =\n user === \"default\"\n ? {\n password: this.users.find((item) => item.name === \"default\")?.password ?? this.password,\n readOnly: this.users.find((item) => item.name === \"default\")?.readOnly === true,\n }\n : this.users.find((item) => item.name === user)\n if (!account || account.password === undefined || account.password !== password)\n return wrongPass()\n session.authenticated = true\n session.username = user\n session.readOnly = account.readOnly === true\n return ok()\n }\n\n private cmdHello(session: Session, args: Uint8Array[]): Reply {\n let protocol = session.protocol\n let index = 0\n if (args.length > 0) {\n const requested = Number(text(args[0]))\n if (requested !== 2 && requested !== 3) return err(\"NOPROTO unsupported protocol version\")\n protocol = requested\n index = 1\n }\n while (index < args.length) {\n const option = upper(args[index])\n if (option === \"AUTH\") {\n const user = args[index + 1]\n const pass = args[index + 2]\n if (!user || !pass) return syntaxError()\n const result = this.cmdAuth(session, [user, pass])\n if (result.t === \"error\") return result\n index += 3\n continue\n }\n if (option === \"SETNAME\") {\n const name = args[index + 1]\n if (!name) return syntaxError()\n session.name = text(name)\n index += 2\n continue\n }\n return syntaxError()\n }\n session.protocol = protocol\n return map([\n [bulk(\"server\"), bulk(\"redis\")],\n [bulk(\"version\"), bulk(VERSION)],\n [bulk(\"proto\"), int(protocol)],\n [bulk(\"id\"), int(session.id)],\n [bulk(\"mode\"), bulk(\"standalone\")],\n [bulk(\"role\"), bulk(\"master\")],\n [bulk(\"modules\"), arr([])],\n ])\n }\n\n private cmdSelect(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(\"select\")\n const index = parseI64(args[0] ?? utf8(\"\"))\n if (index === null) return notInteger()\n if (index < 0n || index >= BigInt(this.dbs.length)) return err(\"ERR DB index is out of range\")\n session.db = Number(index)\n return ok()\n }\n\n private cmdReset(session: Session): Reply {\n session.multi = null\n session.multiFailed = false\n session.watching = []\n this.leavePubsub(session)\n session.name = \"\"\n session.db = 0\n session.protocol = 2\n session.authenticated = !this.authRequired\n session.readOnly = false\n return simple(\"RESET\")\n }\n\n private cmdClient(session: Session, args: Uint8Array[], apply: boolean): Reply {\n const sub = upper(args[0])\n if (sub === \"SETNAME\") {\n if (args.length !== 2) return arityError(\"client|setname\")\n if (!apply) return queued()\n session.name = text(args[1])\n return ok()\n }\n if (sub === \"GETNAME\") return session.name ? bulk(session.name) : nil()\n if (sub === \"SETINFO\") {\n if (args.length !== 3) return arityError(\"client|setinfo\")\n const kind = upper(args[1])\n if (kind !== \"LIB-NAME\" && kind !== \"LIB-VER\") return syntaxError()\n if (!apply) return queued()\n if (kind === \"LIB-NAME\") session.libName = text(args[2])\n else session.libVer = text(args[2])\n return ok()\n }\n if (sub === \"ID\") return int(session.id)\n if (sub === \"INFO\") return bulk(this.clientInfo(session))\n if (sub === \"LIST\") {\n return bulk([...this.sessions].map((item) => this.clientInfo(item)).join(\"\\n\"))\n }\n if (sub === \"PAUSE\" || sub === \"UNPAUSE\") return ok()\n if (!sub) return arityError(\"client\")\n return err(`ERR unknown subcommand '${text(args[0]).toLowerCase()}'. Try CLIENT HELP.`)\n }\n\n private clientInfo(session: Session): string {\n return `id=${session.id} addr=127.0.0.1:${session.id} laddr=127.0.0.1:6379 name=${session.name} db=${session.db} sub=${session.channels.size} psub=${session.patterns.size} multi=${session.multi ? session.multi.length : -1} lib-name=${session.libName} lib-ver=${session.libVer}`\n }\n\n private info(session: Session, section: string): string {\n const wanted = section.toLowerCase()\n const blocks: Array<[string, string[]]> = [\n [\n \"server\",\n [\n \"# Server\",\n `redis_version:${VERSION}`,\n \"redis_mode:standalone\",\n \"os:mockingbird\",\n \"arch_bits:64\",\n \"tcp_port:6379\",\n \"uptime_in_seconds:0\",\n ],\n ],\n [\"clients\", [\"# Clients\", `connected_clients:${this.sessions.size}`]],\n [\n \"memory\",\n [\n \"# Memory\",\n `used_memory:${this.memory()}`,\n `maxmemory:${this.maxmemory}`,\n `maxmemory_policy:${this.policy}`,\n ],\n ],\n [\n \"persistence\",\n [\"# Persistence\", \"loading:0\", \"rdb_changes_since_last_save:0\", \"aof_enabled:0\"],\n ],\n [\"stats\", [\"# Stats\", `total_commands_processed:${this.commandCount}`]],\n [\"replication\", [\"# Replication\", \"role:master\", \"connected_slaves:0\"]],\n [\"keyspace\", [\"# Keyspace\", ...this.keyspaceLines()]],\n ]\n const chosen =\n wanted === \"default\" || wanted === \"all\" || wanted === \"\"\n ? blocks\n : blocks.filter((block) => block[0] === wanted)\n const lines = chosen.flatMap((block) => block[1])\n if (session.id < 0) return \"\"\n return `${lines.join(\"\\r\\n\")}\\r\\n`\n }\n\n private keyspaceLines(): string[] {\n const lines: string[] = []\n this.dbs.forEach((database, index) => {\n const keys = database.keys()\n if (keys.length === 0) return\n let expires = 0\n for (const key of keys) if (database.pttl(key) >= 0) expires++\n lines.push(`db${index}:keys=${keys.length},expires=${expires},avg_ttl=0`)\n })\n return lines\n }\n\n private cmdTime(): Reply {\n const now = Math.trunc(this.clock.now())\n const seconds = Math.trunc(now / 1000)\n const micros = (now % 1000) * 1000\n return arr([bulk(String(seconds)), bulk(String(micros))])\n }\n\n private cmdConfig(args: Uint8Array[], apply: boolean): Reply {\n const sub = upper(args[0])\n if (sub === \"GET\") {\n if (args.length !== 2) return arityError(\"config|get\")\n const key = text(args[1]).toLowerCase()\n const value =\n key === \"maxmemory\"\n ? String(this.maxmemory)\n : key === \"maxmemory-policy\"\n ? this.policy\n : key === \"timeout\"\n ? \"0\"\n : key === \"databases\"\n ? String(this.dbs.length)\n : null\n if (value === null) return arr([])\n return arr([bulk(key), bulk(value)])\n }\n if (sub === \"SET\") {\n if (args.length !== 3) return arityError(\"config|set\")\n if (!apply) return queued()\n const key = text(args[1]).toLowerCase()\n const value = text(args[2])\n if (key === \"maxmemory\") {\n const parsed = Number(value)\n if (!Number.isFinite(parsed) || parsed < 0) return err(\"ERR Invalid argument\")\n return ok()\n }\n if (key === \"maxmemory-policy\") {\n if (value !== \"noeviction\" && value !== \"allkeys-lru\") return err(\"ERR Invalid argument\")\n this.policy = value\n return ok()\n }\n return err(\"ERR Unsupported CONFIG parameter\")\n }\n return arityError(\"config\")\n }\n\n private cmdRandomKey(session: Session): Reply {\n const keys = this.database(session.db).keys()\n if (keys.length === 0) return nil()\n const key = keys[Math.floor(this.random() * keys.length)] ?? keys[0]\n return key === undefined ? nil() : { t: \"bulk\", v: fromLatin1(key) }\n }\n\n private cmdScan(session: Session, args: Uint8Array[]): Reply {\n if (args.length < 1) return arityError(\"scan\")\n const cursor = Number(text(args[0]))\n if (!Number.isInteger(cursor) || cursor < 0) return err(\"ERR invalid cursor\")\n let pattern = \"*\"\n let count = 10\n for (let i = 1; i < args.length; i++) {\n const option = upper(args[i])\n if (option === \"MATCH\") {\n const value = args[++i]\n if (!value) return syntaxError()\n pattern = text(value)\n } else if (option === \"COUNT\") {\n const value = args[++i]\n const parsed = value ? parseI64(value) : null\n if (parsed === null || parsed <= 0n) return syntaxError()\n count = Number(parsed)\n } else return syntaxError()\n }\n const keys = this.database(session.db).matching(pattern)\n const slice = keys.slice(cursor, cursor + count)\n const next = cursor + count >= keys.length ? 0 : cursor + count\n return arr([\n bulk(String(next)),\n arr(slice.map((key) => ({ t: \"bulk\" as const, v: fromLatin1(key) }))),\n ])\n }\n\n private cmdKeys(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(\"keys\")\n const keys = this.database(session.db).matching(text(args[0]))\n return arr(keys.map((key) => ({ t: \"bulk\" as const, v: fromLatin1(key) })))\n }\n\n private cmdType(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(\"type\")\n const value = this.database(session.db).get(text(args[0]))\n return simple(value?.kind ?? \"none\")\n }\n\n private cmdExists(session: Session, args: Uint8Array[]): Reply {\n if (args.length < 1) return arityError(\"exists\")\n const database = this.database(session.db)\n return int(args.filter((arg) => database.has(text(arg))).length)\n }\n\n private cmdDel(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 1) return arityError(\"del\")\n if (!apply) return queued()\n const database = this.database(session.db)\n let removed = 0\n for (const arg of args) if (database.delete(text(arg))) removed++\n return int(removed)\n }\n\n private cmdRename(session: Session, args: Uint8Array[], apply: boolean, nx: boolean): Reply {\n if (args.length !== 2) return arityError(nx ? \"renamenx\" : \"rename\")\n const source = text(args[0])\n const dest = text(args[1])\n if (source === dest) return err(\"ERR source and destination objects are the same\")\n const database = this.database(session.db)\n if (!database.has(source)) return noSuchKey()\n if (nx && database.has(dest)) return int(0)\n if (!apply) return queued()\n database.rename(source, dest)\n return nx ? int(1) : ok()\n }\n\n private cmdExpire(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 2) return arityError(command)\n const key = text(args[0])\n const amount = parseI64(args[1] ?? utf8(\"\"))\n if (amount === null) return notInteger()\n let flag = \"\"\n if (args.length === 3) flag = upper(args[2])\n else if (args.length > 3) return syntaxError()\n if (flag && ![\"NX\", \"XX\", \"GT\", \"LT\"].includes(flag)) return syntaxError()\n const database = this.database(session.db)\n if (!database.has(key)) return int(0)\n if (!apply) return queued()\n if (amount < 0n && (command === \"expire\" || command === \"pexpire\")) {\n database.delete(key)\n return int(1)\n }\n const now = database.now()\n const absolute =\n command === \"expire\"\n ? now + Number(amount) * 1000\n : command === \"pexpire\"\n ? now + Number(amount)\n : command === \"expireat\"\n ? Number(amount) * 1000\n : Number(amount)\n const current = database.expiry(key)\n if (flag === \"NX\" && current !== null) return int(0)\n if (flag === \"XX\" && current === null) return int(0)\n if ((flag === \"GT\" || flag === \"LT\") && current === null) return int(0)\n if (flag === \"GT\" && current !== null && absolute <= current) return int(0)\n if (flag === \"LT\" && current !== null && absolute >= current) return int(0)\n database.setExpiry(key, absolute)\n return int(1)\n }\n\n private cmdTtl(session: Session, command: string, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(command)\n const pttl = this.database(session.db).pttl(text(args[0]))\n if (pttl < 0) return int(pttl)\n return int(command === \"pttl\" ? pttl : Math.floor(pttl / 1000))\n }\n\n private cmdPersist(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length !== 1) return arityError(\"persist\")\n const database = this.database(session.db)\n const key = text(args[0])\n if (database.pttl(key) < 0) return int(0)\n if (!apply) return queued()\n database.setExpiry(key, null)\n return int(1)\n }\n\n private stringAt(database: Database, key: string): Uint8Array | Reply | null {\n const value = database.get(key)\n if (!value) return null\n if (value.kind !== \"string\") return wrongType()\n return value.bytes\n }\n\n private cmdGet(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(\"get\")\n const value = this.stringAt(this.database(session.db), text(args[0]))\n if (value instanceof Uint8Array) return { t: \"bulk\", v: value }\n if (value === null) return nil()\n return value\n }\n\n private cmdSet(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 2) return arityError(\"set\")\n const key = text(args[0])\n const value = args[1]\n if (!value) return arityError(\"set\")\n let nx = false\n let xx = false\n let get = false\n let mode: \"ex\" | \"px\" | \"exat\" | \"pxat\" | \"keep\" | null = null\n let amount = 0\n for (let i = 2; i < args.length; i++) {\n const option = upper(args[i])\n if (option === \"NX\") nx = true\n else if (option === \"XX\") xx = true\n else if (option === \"GET\") get = true\n else if (option === \"KEEPTTL\") {\n if (mode) return syntaxError()\n mode = \"keep\"\n } else if (option === \"EX\" || option === \"PX\" || option === \"EXAT\" || option === \"PXAT\") {\n if (mode) return syntaxError()\n const raw = args[++i]\n const parsed = raw ? parseI64(raw) : null\n if (parsed === null) return notInteger()\n mode = option.toLowerCase() as \"ex\" | \"px\" | \"exat\" | \"pxat\"\n amount = Number(parsed)\n } else return syntaxError()\n }\n if (nx && xx) return syntaxError()\n const database = this.database(session.db)\n const existing = database.get(key)\n if (existing && existing.kind !== \"string\") return wrongType()\n const previous = existing ? ({ t: \"bulk\", v: existing.bytes } as Reply) : nil()\n if ((nx && existing) || (xx && !existing)) return get ? previous : nil()\n if (!apply) return queued()\n const kept = mode === \"keep\" ? database.expiry(key) : null\n database.put(key, { kind: \"string\", bytes: value })\n const now = database.now()\n if (mode === \"ex\") database.setExpiry(key, now + amount * 1000)\n else if (mode === \"px\") database.setExpiry(key, now + amount)\n else if (mode === \"exat\") database.setExpiry(key, amount * 1000)\n else if (mode === \"pxat\") database.setExpiry(key, amount)\n else if (mode === \"keep\") {\n if (kept !== null) database.setExpiry(key, kept)\n } else database.setExpiry(key, null)\n return get ? previous : ok()\n }\n\n private cmdMget(session: Session, args: Uint8Array[]): Reply {\n if (args.length < 1) return arityError(\"mget\")\n return arr(args.map((arg) => this.cmdGet(session, [arg])))\n }\n\n private cmdMset(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 2 || args.length % 2 !== 0) return arityError(\"mset\")\n if (!apply) return queued()\n for (let i = 0; i < args.length; i += 2) {\n const result = this.cmdSet(session, [args[i] ?? utf8(\"\"), args[i + 1] ?? utf8(\"\")], true)\n if (result.t === \"error\") return result\n }\n return ok()\n }\n\n private cmdAppend(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length !== 2) return arityError(\"append\")\n const database = this.database(session.db)\n const key = text(args[0])\n const extra = args[1] ?? utf8(\"\")\n const current = this.stringAt(database, key)\n if (current && !(current instanceof Uint8Array)) return current\n if (!apply) return queued()\n const bytes = current instanceof Uint8Array ? concatBytes(current, extra) : extra\n database.put(key, { kind: \"string\", bytes })\n return int(bytes.length)\n }\n\n private cmdStrlen(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 1) return arityError(\"strlen\")\n const value = this.stringAt(this.database(session.db), text(args[0]))\n if (value instanceof Uint8Array) return int(value.length)\n if (value === null) return int(0)\n return value\n }\n\n private cmdGetRange(session: Session, args: Uint8Array[]): Reply {\n if (args.length !== 3) return arityError(\"getrange\")\n const value = this.stringAt(this.database(session.db), text(args[0]))\n if (value && !(value instanceof Uint8Array)) return value\n const bytes = value instanceof Uint8Array ? value : utf8(\"\")\n const [start, end] = indexes(bytes.length, args[1], args[2])\n if (start > end) return bulk(\"\")\n return { t: \"bulk\", v: bytes.slice(start, end + 1) }\n }\n\n private cmdSetRange(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length !== 3) return arityError(\"setrange\")\n const offset = parseI64(args[1] ?? utf8(\"\"))\n if (offset === null || offset < 0n) return err(\"ERR offset is out of range\")\n const database = this.database(session.db)\n const key = text(args[0])\n const current = this.stringAt(database, key)\n if (current && !(current instanceof Uint8Array)) return current\n if (!apply) return queued()\n const patch = args[2] ?? utf8(\"\")\n const base = current instanceof Uint8Array ? current : new Uint8Array()\n const next = new Uint8Array(Math.max(base.length, Number(offset) + patch.length))\n next.set(base)\n next.set(patch, Number(offset))\n database.put(key, { kind: \"string\", bytes: next })\n return int(next.length)\n }\n\n private cmdIncr(session: Session, args: Uint8Array[], delta: bigint, apply: boolean): Reply {\n if (args.length !== 1) return arityError(delta < 0n ? \"decr\" : \"incr\")\n return this.addInteger(session, text(args[0]), delta, apply)\n }\n\n private cmdIncrBy(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n if (args.length !== 2) return arityError(command)\n const delta = parseI64(args[1] ?? utf8(\"\"))\n if (delta === null) return notInteger()\n return this.addInteger(session, text(args[0]), command === \"decrby\" ? -delta : delta, apply)\n }\n\n private addInteger(session: Session, key: string, delta: bigint, apply: boolean): Reply {\n const database = this.database(session.db)\n const current = this.stringAt(database, key)\n if (current && !(current instanceof Uint8Array)) return current\n let value = 0n\n if (current instanceof Uint8Array) {\n const parsed = parseI64(current)\n if (parsed === null) return notInteger()\n value = parsed\n }\n const next = value + delta\n if (next > 9223372036854775807n || next < -9223372036854775808n) return notInteger()\n if (!apply) return queued()\n database.put(key, { kind: \"string\", bytes: utf8(next.toString()) })\n return int(intReply(next))\n }\n\n private cmdIncrByFloat(\n session: Session,\n args: Uint8Array[],\n apply: boolean,\n hash: boolean,\n ): Reply {\n if (hash) return syntaxError()\n if (args.length !== 2) return arityError(\"incrbyfloat\")\n const delta = parseScore(args[1])\n if (delta === null) return notFloat()\n const database = this.database(session.db)\n const key = text(args[0])\n const current = this.stringAt(database, key)\n if (current && !(current instanceof Uint8Array)) return current\n const base = current instanceof Uint8Array ? parseScore(current) : 0\n if (base === null) return notFloat()\n if (!apply) return queued()\n const next = scoreText(base + delta)\n database.put(key, { kind: \"string\", bytes: utf8(next) })\n return bulk(next)\n }\n\n private cmdGetDel(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length !== 1) return arityError(\"getdel\")\n const got = this.cmdGet(session, args)\n if (got.t === \"error\" || got.t !== \"bulk\" || got.v === null) return got\n if (!apply) return queued()\n this.database(session.db).delete(text(args[0]))\n return got\n }\n\n private cmdGetEx(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 1) return arityError(\"getex\")\n const got = this.cmdGet(session, [args[0] ?? utf8(\"\")])\n if (got.t === \"error\") return got\n if (args.length === 1) return got\n if (!apply) return queued()\n const option = upper(args[1])\n if (option === \"PERSIST\") {\n this.database(session.db).setExpiry(text(args[0]), null)\n return got\n }\n const result = this.cmdExpire(\n session,\n option === \"EX\"\n ? \"expire\"\n : option === \"PX\"\n ? \"pexpire\"\n : option === \"EXAT\"\n ? \"expireat\"\n : \"pexpireat\",\n [args[0] ?? utf8(\"\"), args[2] ?? utf8(\"\")],\n true,\n )\n if (result.t === \"error\") return result\n return got\n }\n\n private requireHash(\n database: Database,\n key: string,\n create: boolean,\n ): Extract<Value, { kind: \"hash\" }> | Reply | null {\n const value = database.get(key)\n if (!value) {\n if (!create) return null\n const created: Extract<Value, { kind: \"hash\" }> = { kind: \"hash\", fields: new Map() }\n database.put(key, created)\n return created\n }\n if (value.kind !== \"hash\") return wrongType()\n return value\n }\n\n private cmdHash(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n const database = this.database(session.db)\n const key = text(args[0])\n if (command === \"hset\" || command === \"hmset\" || command === \"hsetnx\") {\n if (args.length < 3 || (args.length - 1) % 2 !== 0) return arityError(command)\n const hash = this.requireHash(database, key, false)\n if (hash && !(hash instanceof Object && \"fields\" in hash) && hash !== null)\n return hash as Reply\n if (!apply) return queued()\n const target = this.requireHash(database, key, true)\n if (!target || !(\"fields\" in target)) return target ?? wrongType()\n let added = 0\n for (let i = 1; i < args.length; i += 2) {\n const field = memberKey(args[i] ?? utf8(\"\"))\n const value = args[i + 1] ?? utf8(\"\")\n if (command === \"hsetnx\" && target.fields.has(field)) continue\n if (!target.fields.has(field)) added++\n target.fields.set(field, value)\n }\n database.put(key, target)\n return command === \"hmset\" ? ok() : int(command === \"hsetnx\" ? (added > 0 ? 1 : 0) : added)\n }\n if (command === \"hget\") {\n if (args.length !== 2) return arityError(\"hget\")\n const hash = this.requireHash(database, key, false)\n if (hash === null) return nil()\n if (!(\"fields\" in hash)) return hash\n const value = hash.fields.get(memberKey(args[1] ?? utf8(\"\")))\n return value ? { t: \"bulk\", v: value } : nil()\n }\n if (command === \"hdel\") {\n if (args.length < 2) return arityError(\"hdel\")\n const hash = this.requireHash(database, key, false)\n if (hash === null) return int(0)\n if (!(\"fields\" in hash)) return hash\n if (!apply) return queued()\n let removed = 0\n for (let i = 1; i < args.length; i++) {\n if (hash.fields.delete(memberKey(args[i] ?? utf8(\"\")))) removed++\n }\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, hash)\n return int(removed)\n }\n if (command === \"hexists\") {\n if (args.length !== 2) return arityError(\"hexists\")\n const hash = this.requireHash(database, key, false)\n if (hash === null) return int(0)\n if (!(\"fields\" in hash)) return hash\n return int(hash.fields.has(memberKey(args[1] ?? utf8(\"\"))) ? 1 : 0)\n }\n if (command === \"hlen\") {\n if (args.length !== 1) return arityError(\"hlen\")\n const hash = this.requireHash(database, key, false)\n if (hash === null) return int(0)\n if (!(\"fields\" in hash)) return hash\n return int(hash.fields.size)\n }\n if (command === \"hstrlen\") {\n if (args.length !== 2) return arityError(\"hstrlen\")\n const hash = this.requireHash(database, key, false)\n if (hash === null) return int(0)\n if (!(\"fields\" in hash)) return hash\n return int(hash.fields.get(memberKey(args[1] ?? utf8(\"\")))?.length ?? 0)\n }\n if (command === \"hkeys\" || command === \"hvals\" || command === \"hgetall\") {\n if (args.length !== 1) return arityError(command)\n const hash = this.requireHash(database, key, false)\n if (hash === null) return arr([])\n if (!(\"fields\" in hash)) return hash\n const items: Reply[] = []\n for (const [field, value] of hash.fields) {\n if (command !== \"hvals\") items.push({ t: \"bulk\", v: fromLatin1(field) })\n if (command !== \"hkeys\") items.push({ t: \"bulk\", v: value })\n }\n return arr(items)\n }\n if (command === \"hmget\") {\n if (args.length < 2) return arityError(\"hmget\")\n const hash = this.requireHash(database, key, false)\n if (hash && !(\"fields\" in hash)) return hash\n return arr(\n args.slice(1).map((field) => {\n const value = hash && \"fields\" in hash ? hash.fields.get(memberKey(field)) : undefined\n return value ? { t: \"bulk\" as const, v: value } : nil()\n }),\n )\n }\n if (command === \"hincrby\" || command === \"hincrbyfloat\") {\n if (args.length !== 3) return arityError(command)\n const hash = this.requireHash(database, key, false)\n if (hash && !(\"fields\" in hash)) return hash\n const field = memberKey(args[1] ?? utf8(\"\"))\n const current = hash && \"fields\" in hash ? hash.fields.get(field) : undefined\n if (command === \"hincrby\") {\n const delta = parseI64(args[2] ?? utf8(\"\"))\n if (delta === null) return notInteger()\n const base = current ? parseI64(current) : 0n\n if (base === null) return notInteger()\n if (!apply) return queued()\n const target = this.requireHash(database, key, true)\n if (!target || !(\"fields\" in target)) return target ?? wrongType()\n const next = base + delta\n target.fields.set(field, utf8(next.toString()))\n database.put(key, target)\n return int(intReply(next))\n }\n const delta = parseScore(args[2])\n if (delta === null) return notFloat()\n const base = current ? parseScore(current) : 0\n if (base === null) return notFloat()\n if (!apply) return queued()\n const target = this.requireHash(database, key, true)\n if (!target || !(\"fields\" in target)) return target ?? wrongType()\n const next = scoreText(base + delta)\n target.fields.set(field, utf8(next))\n database.put(key, target)\n return bulk(next)\n }\n return unknownCommand(command, args)\n }\n\n private requireList(\n database: Database,\n key: string,\n create: boolean,\n ): Extract<Value, { kind: \"list\" }> | Reply | null {\n const value = database.get(key)\n if (!value) {\n if (!create) return null\n const created: Extract<Value, { kind: \"list\" }> = { kind: \"list\", items: [] }\n database.put(key, created)\n return created\n }\n if (value.kind !== \"list\") return wrongType()\n return value\n }\n\n private cmdList(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n const database = this.database(session.db)\n const key = text(args[0])\n if (command === \"lpush\" || command === \"rpush\") {\n if (args.length < 2) return arityError(command)\n const existing = this.requireList(database, key, false)\n if (existing && !(\"items\" in existing)) return existing\n if (!apply) return queued()\n const list = this.requireList(database, key, true)\n if (!list || !(\"items\" in list)) return list ?? wrongType()\n const items = args.slice(1)\n if (command === \"lpush\") for (const item of items) list.items.unshift(item)\n else for (const item of items) list.items.push(item)\n database.put(key, list)\n const length = list.items.length\n this.wake(session.db, key)\n return int(length)\n }\n if (command === \"lpop\" || command === \"rpop\") {\n if (args.length < 1 || args.length > 2) return arityError(command)\n const list = this.requireList(database, key, false)\n if (list === null) return args.length === 2 ? nilArray() : nil()\n if (!(\"items\" in list)) return list\n const count = args.length === 2 ? parseI64(args[1] ?? utf8(\"\")) : null\n if (args.length === 2 && (count === null || count < 0n)) return notInteger()\n if (!apply) return queued()\n const take = count === null ? 1 : Number(count)\n const popped: Uint8Array[] = []\n for (let i = 0; i < take && list.items.length > 0; i++) {\n const item = command === \"lpop\" ? list.items.shift() : list.items.pop()\n if (item) popped.push(item)\n }\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, list)\n if (count === null) return popped[0] ? { t: \"bulk\", v: popped[0] } : nil()\n return arr(popped.map((item) => ({ t: \"bulk\" as const, v: item })))\n }\n if (command === \"llen\") {\n if (args.length !== 1) return arityError(\"llen\")\n const list = this.requireList(database, key, false)\n if (list === null) return int(0)\n if (!(\"items\" in list)) return list\n return int(list.items.length)\n }\n if (command === \"lrange\") {\n if (args.length !== 3) return arityError(\"lrange\")\n const list = this.requireList(database, key, false)\n if (list === null) return arr([])\n if (!(\"items\" in list)) return list\n const [start, end] = indexes(list.items.length, args[1], args[2])\n if (start > end) return arr([])\n return arr(list.items.slice(start, end + 1).map((item) => ({ t: \"bulk\" as const, v: item })))\n }\n if (command === \"lindex\") {\n if (args.length !== 2) return arityError(\"lindex\")\n const list = this.requireList(database, key, false)\n if (list === null) return nil()\n if (!(\"items\" in list)) return list\n const at = listIndex(list.items.length, args[1])\n const item = at === null ? undefined : list.items[at]\n return item ? { t: \"bulk\", v: item } : nil()\n }\n if (command === \"lset\") {\n if (args.length !== 3) return arityError(\"lset\")\n const list = this.requireList(database, key, false)\n if (list === null) return err(\"ERR no such key\")\n if (!(\"items\" in list)) return list\n const at = listIndex(list.items.length, args[1])\n if (at === null || list.items[at] === undefined) return err(\"ERR index out of range\")\n if (!apply) return queued()\n list.items[at] = args[2] ?? utf8(\"\")\n database.put(key, list)\n return ok()\n }\n if (command === \"lrem\") {\n if (args.length !== 3) return arityError(\"lrem\")\n const list = this.requireList(database, key, false)\n if (list === null) return int(0)\n if (!(\"items\" in list)) return list\n const count = parseI64(args[1] ?? utf8(\"\"))\n if (count === null) return notInteger()\n if (!apply) return queued()\n const target = args[2] ?? utf8(\"\")\n const matches = list.items\n .map((item, index) => ({ item, index }))\n .filter(\n (item) =>\n item.item.length === target.length &&\n item.item.every((byte, index) => byte === target[index]),\n )\n const chosen =\n count === 0n\n ? matches\n : count > 0n\n ? matches.slice(0, Number(count))\n : matches.slice(matches.length + Number(count))\n const remove = new Set(chosen.map((item) => item.index))\n list.items = list.items.filter((_, index) => !remove.has(index))\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, list)\n return int(chosen.length)\n }\n if (command === \"ltrim\") {\n if (args.length !== 3) return arityError(\"ltrim\")\n const list = this.requireList(database, key, false)\n if (list === null) return ok()\n if (!(\"items\" in list)) return list\n if (!apply) return queued()\n const [start, end] = indexes(list.items.length, args[1], args[2])\n list.items = start > end ? [] : list.items.slice(start, end + 1)\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, list)\n return ok()\n }\n if (command === \"linsert\") {\n if (args.length !== 4) return arityError(\"linsert\")\n const list = this.requireList(database, key, false)\n if (list === null) return int(0)\n if (!(\"items\" in list)) return list\n const where = upper(args[1])\n if (where !== \"BEFORE\" && where !== \"AFTER\") return syntaxError()\n const pivot = args[2] ?? utf8(\"\")\n const at = list.items.findIndex(\n (item) =>\n item.length === pivot.length && item.every((byte, index) => byte === pivot[index]),\n )\n if (at < 0) return int(-1)\n if (!apply) return queued()\n list.items.splice(where === \"BEFORE\" ? at : at + 1, 0, args[3] ?? utf8(\"\"))\n database.put(key, list)\n this.wake(session.db, key)\n return int(list.items.length)\n }\n if (command === \"lmove\" || command === \"rpoplpush\") {\n const source = key\n const dest = command === \"rpoplpush\" ? text(args[1]) : text(args[1])\n const from = command === \"rpoplpush\" ? \"right\" : upper(args[2])\n const to = command === \"rpoplpush\" ? \"left\" : upper(args[3])\n if (command === \"lmove\" && args.length !== 4) return arityError(\"lmove\")\n if (command === \"rpoplpush\" && args.length !== 2) return arityError(\"rpoplpush\")\n if (from !== \"LEFT\" && from !== \"RIGHT\" && command === \"lmove\") return syntaxError()\n if (to !== \"LEFT\" && to !== \"RIGHT\" && command === \"lmove\") return syntaxError()\n const list = this.requireList(database, source, false)\n if (list === null) return nil()\n if (!(\"items\" in list)) return list\n const destList = this.requireList(database, dest, false)\n if (destList && !(\"items\" in destList)) return destList\n if (!apply) return queued()\n const item =\n (command === \"rpoplpush\" || from === \"RIGHT\" ? list.items.pop() : list.items.shift()) ??\n null\n if (!item) return nil()\n database.dropIfEmpty(source)\n if (database.has(source)) database.put(source, list)\n const target = this.requireList(database, dest, true)\n if (!target || !(\"items\" in target)) return target ?? wrongType()\n if (command === \"rpoplpush\" || to === \"LEFT\") target.items.unshift(item)\n else target.items.push(item)\n database.put(dest, target)\n this.wake(session.db, dest)\n return { t: \"bulk\", v: item }\n }\n return unknownCommand(command, args)\n }\n\n private cmdBlockingList(\n session: Session,\n args: Uint8Array[],\n apply: boolean,\n side: \"left\" | \"right\",\n ): Reply | Promise<Reply> {\n const name = side === \"left\" ? \"blpop\" : \"brpop\"\n if (args.length < 2) return arityError(name)\n const timeout = parseTimeout(args[args.length - 1])\n if (timeout === null) return err(\"ERR timeout is not a float or out of range\")\n const keys = args.slice(0, -1).map((arg) => text(arg))\n for (const key of keys) {\n const value = this.database(session.db).get(key)\n if (value && value.kind !== \"list\") return wrongType()\n }\n if (!apply) return queued()\n const immediate = this.takeList(session.db, keys, side)\n if (immediate) return immediate\n if (session.inExec || this.scriptDepth > 0) return nilArray()\n return this.block({\n kind: \"list\",\n keys,\n db: session.db,\n side,\n count: 1,\n ...(timeout > 0 ? { deadline: this.clock.now() + timeout * 1000 } : {}),\n session,\n })\n }\n\n private takeList(dbIndex: number, keys: string[], side: \"left\" | \"right\"): Reply | null {\n if (this.consumersPaused) return null\n const database = this.database(dbIndex)\n for (const key of keys) {\n const value = database.get(key)\n if (!value) continue\n if (value.kind !== \"list\") return wrongType()\n const item = side === \"left\" ? value.items.shift() : value.items.pop()\n if (!item) continue\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, value)\n return arr([bulk(key), { t: \"bulk\", v: item }])\n }\n return null\n }\n\n private requireSet(database: Database, key: string, create: boolean) {\n const value = database.get(key)\n if (!value) {\n if (!create) return null\n const created: Extract<Value, { kind: \"set\" }> = { kind: \"set\", members: new Map() }\n database.put(key, created)\n return created\n }\n if (value.kind !== \"set\") return wrongType()\n return value\n }\n\n private cmdSetFamily(\n session: Session,\n command: string,\n args: Uint8Array[],\n apply: boolean,\n ): Reply {\n const database = this.database(session.db)\n const key = text(args[0])\n if (command === \"sadd\" || command === \"srem\") {\n if (args.length < 2) return arityError(command)\n const existing = this.requireSet(database, key, false)\n if (existing && !(\"members\" in existing)) return existing\n if (!apply) return queued()\n if (command === \"srem\" && existing === null) return int(0)\n const set = this.requireSet(database, key, command === \"sadd\")\n if (!set || !(\"members\" in set)) return set ?? int(0)\n let changed = 0\n for (const arg of args.slice(1)) {\n const member = memberKey(arg)\n if (command === \"sadd\" && !set.members.has(member)) {\n set.members.set(member, arg)\n changed++\n }\n if (command === \"srem\" && set.members.delete(member)) changed++\n }\n if (command === \"sadd\") database.put(key, set)\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, set)\n return int(changed)\n }\n if (command === \"sismember\") {\n if (args.length !== 2) return arityError(\"sismember\")\n const set = this.requireSet(database, key, false)\n if (set === null) return int(0)\n if (!(\"members\" in set)) return set\n return int(set.members.has(memberKey(args[1] ?? utf8(\"\"))) ? 1 : 0)\n }\n if (command === \"smismember\") {\n if (args.length < 2) return arityError(\"smismember\")\n const set = this.requireSet(database, key, false)\n if (set && !(\"members\" in set)) return set\n return arr(\n args\n .slice(1)\n .map((arg) => int(set && \"members\" in set && set.members.has(memberKey(arg)) ? 1 : 0)),\n )\n }\n if (command === \"smembers\" || command === \"scard\") {\n if (args.length !== 1) return arityError(command)\n const set = this.requireSet(database, key, false)\n if (set === null) return command === \"scard\" ? int(0) : arr([])\n if (!(\"members\" in set)) return set\n if (command === \"scard\") return int(set.members.size)\n const members = [...set.members.values()].sort((a, b) => compareBytes(a, b))\n return arr(members.map((member) => ({ t: \"bulk\" as const, v: member })))\n }\n if (command === \"spop\" || command === \"srandmember\") {\n if (args.length < 1 || args.length > 2) return arityError(command)\n const set = this.requireSet(database, key, false)\n if (set === null) return args.length === 2 ? arr([]) : nil()\n if (!(\"members\" in set)) return set\n const count = args.length === 2 ? parseI64(args[1] ?? utf8(\"\")) : null\n if (args.length === 2 && count === null) return notInteger()\n if (!apply && command === \"spop\") return queued()\n const members = [...set.members.values()]\n if (members.length === 0) return count === null ? nil() : arr([])\n const picked: Uint8Array[] = []\n const pool = members.slice()\n const times =\n count === null\n ? 1\n : Math.min(\n Math.abs(Number(count)),\n command === \"srandmember\" && count < 0n ? Number(-count) : pool.length,\n )\n for (\n let i = 0;\n i < (count !== null && count < 0n && command === \"srandmember\" ? Number(-count) : times);\n i++\n ) {\n const index = Math.floor(\n this.random() *\n (command === \"srandmember\" && count !== null && count < 0n\n ? members.length\n : pool.length),\n )\n const member =\n command === \"srandmember\" && count !== null && count < 0n\n ? members[index]\n : pool.splice(index, 1)[0]\n if (member) picked.push(member)\n }\n if (command === \"spop\") {\n for (const member of picked) set.members.delete(memberKey(member))\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, set)\n }\n if (count === null) return picked[0] ? { t: \"bulk\", v: picked[0] } : nil()\n return arr(picked.map((member) => ({ t: \"bulk\" as const, v: member })))\n }\n if (command === \"sinter\" || command === \"sunion\" || command === \"sdiff\") {\n if (args.length < 1) return arityError(command)\n const sets = []\n for (const arg of args) {\n const set = this.requireSet(database, text(arg), false)\n if (set && !(\"members\" in set)) return set\n sets.push(set && \"members\" in set ? set : null)\n }\n const [first, ...rest] = sets\n let members = new Map(first?.members ?? [])\n if (command === \"sinter\") {\n for (const set of rest) {\n members = new Map([...members].filter(([member]) => set?.members.has(member)))\n }\n } else if (command === \"sunion\") {\n for (const set of rest)\n for (const [member, bytes] of set?.members ?? []) members.set(member, bytes)\n } else {\n for (const set of rest)\n for (const member of set?.members.keys() ?? []) members.delete(member)\n }\n const ordered = [...members.values()].sort((a, b) => compareBytes(a, b))\n return arr(ordered.map((member) => ({ t: \"bulk\" as const, v: member })))\n }\n if (command === \"smove\") {\n if (args.length !== 3) return arityError(\"smove\")\n const source = this.requireSet(database, key, false)\n if (source && !(\"members\" in source)) return source\n const destKey = text(args[1])\n const dest = this.requireSet(database, destKey, false)\n if (dest && !(\"members\" in dest)) return dest\n const member = memberKey(args[2] ?? utf8(\"\"))\n if (!source || !(\"members\" in source) || !source.members.has(member)) return int(0)\n if (!apply) return queued()\n const bytes = source.members.get(member) ?? utf8(\"\")\n source.members.delete(member)\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, source)\n const target = this.requireSet(database, destKey, true)\n if (!target || !(\"members\" in target)) return target ?? wrongType()\n target.members.set(member, bytes)\n database.put(destKey, target)\n return int(1)\n }\n return unknownCommand(command, args)\n }\n\n private requireZset(database: Database, key: string, create: boolean) {\n const value = database.get(key)\n if (!value) {\n if (!create) return null\n const created: Extract<Value, { kind: \"zset\" }> = { kind: \"zset\", members: new Map() }\n database.put(key, created)\n return created\n }\n if (value.kind !== \"zset\") return wrongType()\n return value\n }\n\n private cmdZset(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n const database = this.database(session.db)\n const key = text(args[0])\n if (command === \"zadd\") return this.cmdZadd(session, args, apply)\n if (command === \"zrem\") {\n if (args.length < 2) return arityError(\"zrem\")\n const zset = this.requireZset(database, key, false)\n if (zset === null) return int(0)\n if (!(\"members\" in zset)) return zset\n if (!apply) return queued()\n let removed = 0\n for (const arg of args.slice(1)) if (zset.members.delete(memberKey(arg))) removed++\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, zset)\n return int(removed)\n }\n if (command === \"zcard\") {\n if (args.length !== 1) return arityError(\"zcard\")\n const zset = this.requireZset(database, key, false)\n if (zset === null) return int(0)\n if (!(\"members\" in zset)) return zset\n return int(zset.members.size)\n }\n if (command === \"zscore\" || command === \"zmscore\") {\n if (command === \"zscore\" && args.length !== 2) return arityError(\"zscore\")\n if (command === \"zmscore\" && args.length < 2) return arityError(\"zmscore\")\n const zset = this.requireZset(database, key, false)\n if (zset && !(\"members\" in zset)) return zset\n const scores = args.slice(1).map((arg) => {\n const member = zset && \"members\" in zset ? zset.members.get(memberKey(arg)) : undefined\n return member ? bulk(scoreText(member.score)) : nil()\n })\n return command === \"zscore\" ? (scores[0] ?? nil()) : arr(scores)\n }\n if (command === \"zincrby\") {\n if (args.length !== 3) return arityError(\"zincrby\")\n const delta = parseScore(args[1])\n if (delta === null) return notFloat()\n if (!apply) return queued()\n const zset = this.requireZset(database, key, true)\n if (!zset || !(\"members\" in zset)) return zset ?? wrongType()\n const member = args[2] ?? utf8(\"\")\n const current = zset.members.get(memberKey(member))\n const score = (current?.score ?? 0) + delta\n zset.members.set(memberKey(member), { member, score })\n database.put(key, zset)\n this.wake(session.db, key)\n return bulk(scoreText(score))\n }\n if (command === \"zrank\" || command === \"zrevrank\") {\n if (args.length !== 2) return arityError(command)\n const zset = this.requireZset(database, key, false)\n if (zset === null) return nil()\n if (!(\"members\" in zset)) return zset\n const ordered = database.zsetOrdered(zset)\n const at = ordered.findIndex(\n (item) => memberKey(item.member) === memberKey(args[1] ?? utf8(\"\")),\n )\n if (at < 0) return nil()\n return int(command === \"zrevrank\" ? ordered.length - 1 - at : at)\n }\n if (\n command === \"zrange\" ||\n command === \"zrevrange\" ||\n command === \"zrangebyscore\" ||\n command === \"zrevrangebyscore\"\n ) {\n return this.cmdZrange(database, command, args)\n }\n if (command === \"zcount\") {\n if (args.length !== 3) return arityError(\"zcount\")\n const zset = this.requireZset(database, key, false)\n if (zset === null) return int(0)\n if (!(\"members\" in zset)) return zset\n const min = parseBound(text(args[1]))\n const max = parseBound(text(args[2]))\n if (!min || !max) return notFloat()\n return int(database.zsetOrdered(zset).filter((item) => inBound(item.score, min, max)).length)\n }\n if (command === \"zpopmin\" || command === \"zpopmax\") {\n if (args.length < 1 || args.length > 2) return arityError(command)\n const zset = this.requireZset(database, key, false)\n if (zset === null) return arr([])\n if (!(\"members\" in zset)) return zset\n const count = args.length === 2 ? parseI64(args[1] ?? utf8(\"\")) : 1n\n if (count === null || count < 0n) return notInteger()\n if (!apply) return queued()\n const ordered = database.zsetOrdered(zset)\n const picked =\n command === \"zpopmax\"\n ? ordered.slice(-Number(count)).reverse()\n : ordered.slice(0, Number(count))\n for (const item of picked) zset.members.delete(memberKey(item.member))\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, zset)\n return arr(\n picked.flatMap((item) => [\n { t: \"bulk\" as const, v: item.member },\n bulk(scoreText(item.score)),\n ]),\n )\n }\n if (command === \"zremrangebyscore\" || command === \"zremrangebyrank\") {\n if (args.length !== 3) return arityError(command)\n const zset = this.requireZset(database, key, false)\n if (zset === null) return int(0)\n if (!(\"members\" in zset)) return zset\n if (!apply) return queued()\n const ordered = database.zsetOrdered(zset)\n let removed = 0\n if (command === \"zremrangebyrank\") {\n const [start, end] = indexes(ordered.length, args[1], args[2])\n ordered.forEach((item, index) => {\n if (index >= start && index <= end) {\n zset.members.delete(memberKey(item.member))\n removed++\n }\n })\n } else {\n const min = parseBound(text(args[1]))\n const max = parseBound(text(args[2]))\n if (!min || !max) return notFloat()\n for (const item of ordered) {\n if (!inBound(item.score, min, max)) continue\n zset.members.delete(memberKey(item.member))\n removed++\n }\n }\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, zset)\n return int(removed)\n }\n return unknownCommand(command, args)\n }\n\n private cmdZadd(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 3) return arityError(\"zadd\")\n let index = 1\n let nx = false\n let xx = false\n let gt = false\n let lt = false\n let ch = false\n let incr = false\n while (index < args.length) {\n const option = upper(args[index])\n if (![\"NX\", \"XX\", \"GT\", \"LT\", \"CH\", \"INCR\"].includes(option)) break\n if (option === \"NX\") nx = true\n if (option === \"XX\") xx = true\n if (option === \"GT\") gt = true\n if (option === \"LT\") lt = true\n if (option === \"CH\") ch = true\n if (option === \"INCR\") incr = true\n index++\n }\n if ((gt || lt) && nx)\n return err(\"ERR GT, LT, and/or NX options at the same time are not compatible\")\n if ((args.length - index) % 2 !== 0 || index >= args.length) return syntaxError()\n if (incr && args.length - index !== 2)\n return err(\"ERR INCR option supports a single increment-element pair\")\n const database = this.database(session.db)\n const key = text(args[0])\n const existing = this.requireZset(database, key, false)\n if (existing && !(\"members\" in existing)) return existing\n if (!apply) return queued()\n const zset = this.requireZset(database, key, true)\n if (!zset || !(\"members\" in zset)) return zset ?? wrongType()\n let changed = 0\n let added = 0\n let updatedScore = 0\n for (let i = index; i < args.length; i += 2) {\n const score = parseScore(args[i])\n if (score === null) return notFloat()\n const member = args[i + 1] ?? utf8(\"\")\n const current = zset.members.get(memberKey(member))\n if (nx && current) continue\n if ((xx || gt || lt) && !current) continue\n if (gt && current && score <= current.score) continue\n if (lt && current && score >= current.score) continue\n const next = incr ? (current?.score ?? 0) + score : score\n if (!current) added++\n else if (current.score !== next) updatedScore++\n zset.members.set(memberKey(member), { member, score: next })\n if (incr) {\n database.put(key, zset)\n this.wake(session.db, key)\n return bulk(scoreText(next))\n }\n }\n changed = ch ? added + updatedScore : added\n database.put(key, zset)\n this.wake(session.db, key)\n return int(changed)\n }\n\n private cmdZrange(database: Database, command: string, args: Uint8Array[]): Reply {\n if (args.length < 3) return arityError(command)\n const zset = this.requireZset(database, text(args[0]), false)\n if (zset === null) return arr([])\n if (!(\"members\" in zset)) return zset\n let byScore = command === \"zrangebyscore\" || command === \"zrevrangebyscore\"\n let rev = command === \"zrevrange\" || command === \"zrevrangebyscore\"\n let withScores = false\n let limit: { offset: number; count: number } | null = null\n const rest = args.slice(3)\n for (let i = 0; i < rest.length; i++) {\n const option = upper(rest[i])\n if (option === \"BYSCORE\") byScore = true\n else if (option === \"REV\") rev = true\n else if (option === \"WITHSCORES\") withScores = true\n else if (option === \"LIMIT\") {\n const offset = parseI64(rest[++i] ?? utf8(\"\"))\n const count = parseI64(rest[++i] ?? utf8(\"\"))\n if (offset === null || count === null) return notInteger()\n limit = { offset: Number(offset), count: Number(count) }\n } else return syntaxError()\n }\n let ordered = database.zsetOrdered(zset)\n if (byScore) {\n const left = parseBound(text(args[1]))\n const right = parseBound(text(args[2]))\n if (!left || !right) return notFloat()\n const min = rev ? right : left\n const max = rev ? left : right\n ordered = ordered.filter((item) => inBound(item.score, min, max))\n } else {\n const [start, end] = indexes(ordered.length, args[1], args[2])\n ordered = start > end ? [] : ordered.slice(start, end + 1)\n }\n if (rev) ordered.reverse()\n if (limit) ordered = ordered.slice(limit.offset, limit.offset + limit.count)\n return arr(\n ordered.flatMap((item) => {\n const member = { t: \"bulk\" as const, v: item.member }\n return withScores ? [member, bulk(scoreText(item.score))] : [member]\n }),\n )\n }\n\n private cmdBlockingZset(\n session: Session,\n args: Uint8Array[],\n apply: boolean,\n max: boolean,\n ): Reply | Promise<Reply> {\n const name = max ? \"bzpopmax\" : \"bzpopmin\"\n if (args.length < 2) return arityError(name)\n const timeout = parseTimeout(args[args.length - 1])\n if (timeout === null) return err(\"ERR timeout is not a float or out of range\")\n const keys = args.slice(0, -1).map((arg) => text(arg))\n for (const key of keys) {\n const value = this.database(session.db).get(key)\n if (value && value.kind !== \"zset\") return wrongType()\n }\n if (!apply) return queued()\n const immediate = this.takeZset(session.db, keys, max)\n if (immediate) return immediate\n if (session.inExec || this.scriptDepth > 0) return nilArray()\n return this.block({\n kind: \"zset\",\n keys,\n db: session.db,\n side: \"left\",\n max,\n count: 1,\n ...(timeout > 0 ? { deadline: this.clock.now() + timeout * 1000 } : {}),\n session,\n })\n }\n\n private takeZset(dbIndex: number, keys: string[], max: boolean): Reply | null {\n if (this.consumersPaused) return null\n const database = this.database(dbIndex)\n for (const key of keys) {\n const value = database.get(key)\n if (!value) continue\n if (value.kind !== \"zset\") return wrongType()\n const ordered = database.zsetOrdered(value)\n const member = max ? ordered[ordered.length - 1] : ordered[0]\n if (!member) continue\n value.members.delete(memberKey(member.member))\n database.dropIfEmpty(key)\n if (database.has(key)) database.put(key, value)\n return arr([bulk(key), { t: \"bulk\", v: member.member }, bulk(scoreText(member.score))])\n }\n return null\n }\n\n private cmdStream(\n session: Session,\n command: string,\n args: Uint8Array[],\n apply: boolean,\n ): Reply | Promise<Reply> {\n if (command === \"xadd\") return this.cmdXadd(session, args, apply)\n if (command === \"xlen\") {\n if (args.length !== 1) return arityError(\"xlen\")\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return int(0)\n if (!(stream instanceof Object) || !(\"entries\" in stream)) return stream\n return int(stream.entries.length)\n }\n if (command === \"xrange\" || command === \"xrevrange\")\n return this.cmdXrange(session, command, args)\n if (command === \"xdel\") return this.cmdXdel(session, args, apply)\n if (command === \"xtrim\") return this.cmdXtrim(session, args, apply)\n if (command === \"xgroup\") return this.cmdXgroup(session, args, apply)\n if (command === \"xread\") return this.cmdXread(session, args, apply, false)\n if (command === \"xreadgroup\") return this.cmdXread(session, args, apply, true)\n if (command === \"xack\") return this.cmdXack(session, args, apply)\n if (command === \"xpending\") return this.cmdXpending(session, args)\n if (command === \"xclaim\") return this.cmdXclaim(session, args, apply, false)\n if (command === \"xautoclaim\") return this.cmdXclaim(session, args, apply, true)\n if (command === \"xinfo\") return this.cmdXinfo(session, args)\n return unknownCommand(command, args)\n }\n\n private stream(session: Session, key: string, create: boolean) {\n const database = this.database(session.db)\n const value = database.get(key)\n if (!value) {\n if (!create) return null\n const created: Extract<Value, { kind: \"stream\" }> = { kind: \"stream\", stream: emptyStream() }\n database.put(key, created)\n return created.stream\n }\n if (value.kind !== \"stream\") return wrongType()\n return value.stream\n }\n\n private cmdXadd(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 4) return arityError(\"xadd\")\n let index = 1\n let nomk = false\n let maxlen: number | null = null\n const key = text(args[0])\n while (index < args.length) {\n const option = upper(args[index])\n if (option === \"NOMKSTREAM\") {\n nomk = true\n index++\n continue\n }\n if (option === \"MAXLEN\" || option === \"MINID\") {\n index++\n if (upper(args[index]) === \"~\" || upper(args[index]) === \"=\") index++\n const parsed = parseI64(args[index] ?? utf8(\"\"))\n if (parsed === null || parsed < 0n) return syntaxError()\n if (option === \"MAXLEN\") maxlen = Number(parsed)\n index++\n continue\n }\n break\n }\n const idArg = text(args[index])\n const fields = args.slice(index + 1)\n if (fields.length < 2 || fields.length % 2 !== 0) return syntaxError()\n const database = this.database(session.db)\n if (!database.has(key) && nomk) return nil()\n const stream = this.stream(session, key, true)\n if (!stream || !(\"entries\" in stream)) return stream ?? wrongType()\n if (!apply) return queued()\n const id = this.nextId(stream, idArg)\n if (typeof id !== \"string\") return id\n stream.entries.push({ id, ...(parseStreamId(id) ?? { ms: 0n, seq: 0n }), fields })\n if (maxlen !== null && stream.entries.length > maxlen) {\n stream.entries.splice(0, stream.entries.length - maxlen)\n }\n const value = database.get(key)\n if (value && value.kind === \"stream\") database.put(key, value)\n this.wake(session.db, key)\n return bulk(id)\n }\n\n private nextId(\n stream: Extract<ReturnType<Redis[\"stream\"]>, { entries: StreamEntry[] }>,\n requested: string,\n ): string | Reply {\n if (requested === \"*\") {\n let ms = BigInt(Math.max(0, Math.trunc(this.clock.now())))\n if (ms > stream.lastMs) {\n stream.lastMs = ms\n stream.lastSeq = 0n\n } else {\n ms = stream.lastMs\n stream.lastSeq += 1n\n }\n if (stream.lastMs === 0n && stream.lastSeq === 0n) stream.lastSeq = 1n\n return `${stream.lastMs}-${stream.lastSeq}`\n }\n const parsed = parseStreamId(requested)\n if (!parsed) return err(\"ERR Invalid stream ID specified as stream command argument\")\n if (parsed.ms === 0n && parsed.seq === 0n) {\n return err(\"ERR The ID specified in XADD must be greater than 0-0\")\n }\n const top = stream.entries[stream.entries.length - 1]\n if (top && cmpId(requested, top.id) <= 0) {\n return err(\"ERR The ID specified in XADD is equal or smaller than the target stream top item\")\n }\n if (parsed.ms > stream.lastMs || (parsed.ms === stream.lastMs && parsed.seq > stream.lastSeq)) {\n stream.lastMs = parsed.ms\n stream.lastSeq = parsed.seq\n }\n return `${parsed.ms}-${parsed.seq}`\n }\n\n private cmdXrange(session: Session, command: string, args: Uint8Array[]): Reply {\n if (args.length < 3) return arityError(command)\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return arr([])\n if (!(\"entries\" in stream)) return stream\n const start = text(args[1])\n const end = text(args[2])\n let count = Infinity\n if (upper(args[3]) === \"COUNT\") {\n const parsed = parseI64(args[4] ?? utf8(\"\"))\n if (parsed === null) return syntaxError()\n count = Number(parsed)\n }\n let entries = stream.entries.filter((entry) => {\n const afterStart = start === \"-\" || cmpId(entry.id, start) >= 0\n const beforeEnd = end === \"+\" || cmpId(entry.id, end) <= 0\n return afterStart && beforeEnd\n })\n if (command === \"xrevrange\") entries = entries.slice().reverse()\n return arr(entries.slice(0, count).map((entry) => entryFields(entry)))\n }\n\n private cmdXdel(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 2) return arityError(\"xdel\")\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return int(0)\n if (!(\"entries\" in stream)) return stream\n if (!apply) return queued()\n const ids = new Set(args.slice(1).map((arg) => text(arg)))\n const before = stream.entries.length\n stream.entries = stream.entries.filter((entry) => !ids.has(entry.id))\n return int(before - stream.entries.length)\n }\n\n private cmdXtrim(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 3) return arityError(\"xtrim\")\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return int(0)\n if (!(\"entries\" in stream)) return stream\n let index = 1\n const strategy = upper(args[index])\n if (strategy !== \"MAXLEN\" && strategy !== \"MINID\") return syntaxError()\n index++\n if (upper(args[index]) === \"~\" || upper(args[index]) === \"=\") index++\n if (!apply) return queued()\n const before = stream.entries.length\n if (strategy === \"MAXLEN\") {\n const length = parseI64(args[index] ?? utf8(\"\"))\n if (length === null) return syntaxError()\n if (stream.entries.length > Number(length)) {\n stream.entries.splice(0, stream.entries.length - Number(length))\n }\n }\n return int(before - stream.entries.length)\n }\n\n private cmdXgroup(session: Session, args: Uint8Array[], apply: boolean): Reply {\n const sub = upper(args[0])\n if (sub === \"CREATE\") {\n if (args.length < 4) return arityError(\"xgroup\")\n const key = text(args[1])\n const group = text(args[2])\n const id = text(args[3])\n const mk = args.some((arg) => upper(arg) === \"MKSTREAM\")\n let stream = this.stream(session, key, false)\n if (stream === null) {\n if (!mk) {\n return err(\n \"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 )\n }\n if (!apply) return queued()\n stream = this.stream(session, key, true)\n }\n if (!stream || !(\"groups\" in stream)) return stream ?? wrongType()\n if (stream.groups.has(group)) return err(\"BUSYGROUP Consumer Group name already exists\")\n if (!apply) return queued()\n const last = stream.entries[stream.entries.length - 1]\n const lastId = id === \"$\" ? (last?.id ?? \"0-0\") : id === \"0\" ? \"0-0\" : id\n if (lastId !== \"0-0\" && !parseStreamId(lastId)) {\n return err(\"ERR Invalid stream ID specified as stream command argument\")\n }\n stream.groups.set(group, { name: group, lastId, consumers: new Map(), pel: new Map() })\n return ok()\n }\n if (sub === \"DESTROY\") {\n if (args.length !== 3) return arityError(\"xgroup\")\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream)) return int(0)\n if (!apply) return queued()\n return int(stream.groups.delete(text(args[2])) ? 1 : 0)\n }\n if (sub === \"CREATECONSUMER\") {\n if (args.length !== 4) return arityError(\"xgroup\")\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream))\n return err(\"ERR The XGROUP subcommand requires the key to exist\")\n const group = stream.groups.get(text(args[2]))\n if (!group) return err(\"NOGROUP No such consumer group\")\n if (!apply) return queued()\n const name = text(args[3])\n const created = !group.consumers.has(name)\n group.consumers.set(name, { seenAt: this.clock.now() })\n return int(created ? 1 : 0)\n }\n if (sub === \"DELCONSUMER\") {\n if (args.length !== 4) return arityError(\"xgroup\")\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream)) return int(0)\n const group = stream.groups.get(text(args[2]))\n if (!group) return int(0)\n if (!apply) return queued()\n const name = text(args[3])\n let pending = 0\n for (const [id, item] of group.pel) {\n if (item.consumer !== name) continue\n group.pel.delete(id)\n pending++\n }\n group.consumers.delete(name)\n return int(pending)\n }\n if (sub === \"SETID\") {\n if (args.length < 4) return arityError(\"xgroup\")\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream))\n return err(\"ERR The XGROUP subcommand requires the key to exist\")\n const group = stream.groups.get(text(args[2]))\n if (!group) return err(\"NOGROUP No such consumer group\")\n if (!apply) return queued()\n const id = text(args[3])\n group.lastId = id === \"$\" ? (stream.entries[stream.entries.length - 1]?.id ?? \"0-0\") : id\n return ok()\n }\n return err(`ERR unknown subcommand '${text(args[0]).toLowerCase()}'. Try XGROUP HELP.`)\n }\n\n private cmdXread(\n session: Session,\n args: Uint8Array[],\n apply: boolean,\n group: boolean,\n ): Reply | Promise<Reply> {\n let index = 0\n let groupName = \"\"\n let consumer = \"\"\n let count = Infinity\n let block: number | null = null\n let noack = false\n if (group) {\n if (upper(args[0]) !== \"GROUP\") return syntaxError()\n groupName = text(args[1])\n consumer = text(args[2])\n index = 3\n }\n while (index < args.length && upper(args[index]) !== \"STREAMS\") {\n const option = upper(args[index])\n if (option === \"COUNT\") {\n const parsed = parseI64(args[++index] ?? utf8(\"\"))\n if (parsed === null || parsed < 0n) return syntaxError()\n count = Number(parsed)\n } else if (option === \"BLOCK\") {\n const parsed = parseI64(args[++index] ?? utf8(\"\"))\n if (parsed === null || parsed < 0n) return syntaxError()\n block = Number(parsed)\n } else if (option === \"NOACK\") noack = true\n else return syntaxError()\n index++\n }\n if (upper(args[index]) !== \"STREAMS\") return syntaxError()\n const rest = args.slice(index + 1)\n if (rest.length < 2 || rest.length % 2 !== 0) return syntaxError()\n const half = rest.length / 2\n const keys = rest.slice(0, half).map((arg) => text(arg))\n const ids = rest.slice(half).map((arg) => text(arg))\n if (!apply) return queued()\n for (const key of keys) {\n const value = this.database(session.db).get(key)\n if (value && value.kind !== \"stream\") return wrongType()\n }\n const read = this.readStreams(session, keys, ids, count, group, groupName, consumer, noack)\n if (read.t === \"error\") return read\n if (\n !(this.consumersPaused && block !== null) &&\n read.t === \"array\" &&\n read.v &&\n read.v.length > 0\n ) {\n return read\n }\n if (block === null || session.inExec) return nilArray()\n if (this.scriptDepth > 0) return scriptDenied()\n const streamIds = ids.map((id, idIndex) => {\n if (id !== \"$\") return id\n const existing = this.stream(session, keys[idIndex] ?? \"\", false)\n if (existing && \"entries\" in existing) return existing.entries.at(-1)?.id ?? \"0-0\"\n return \"0-0\"\n })\n return this.block({\n kind: \"stream\",\n keys,\n db: session.db,\n side: \"left\",\n count,\n streamIds,\n ...(group ? { group: groupName, consumer, ...(noack ? { noack: true } : {}) } : {}),\n ...(block > 0 ? { deadline: this.clock.now() + block } : {}),\n session,\n })\n }\n\n private readStreams(\n session: Session,\n keys: string[],\n ids: string[],\n count: number,\n grouped: boolean,\n groupName: string,\n consumer: string,\n noack: boolean,\n ): Reply {\n const rows: Reply[] = []\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i] ?? \"\"\n const id = ids[i] ?? \"0-0\"\n const stream = this.stream(session, key, false)\n if (stream === null) continue\n if (!(\"entries\" in stream)) return stream\n let chosen: StreamEntry[] = []\n if (!grouped) {\n chosen = stream.entries\n .filter((entry) => (id === \"$\" ? false : cmpId(entry.id, id) > 0))\n .slice(0, count)\n } else {\n const group = stream.groups.get(groupName)\n if (!group) return err(\"NOGROUP No such key or consumer group\")\n if (id === \">\") {\n chosen = stream.entries\n .filter((entry) => cmpId(entry.id, group.lastId) > 0)\n .slice(0, count)\n for (const entry of chosen) {\n group.lastId = entry.id\n if (!noack) {\n const pending = group.pel.get(entry.id)\n group.pel.set(entry.id, {\n id: entry.id,\n consumer,\n deliveries: (pending?.deliveries ?? 0) + 1,\n deliveredAt: this.clock.now(),\n })\n }\n group.consumers.set(consumer, { seenAt: this.clock.now() })\n }\n } else {\n chosen = [...group.pel.values()]\n .filter((item) => item.consumer === consumer && cmpId(item.id, id) > 0)\n .map((item) => stream.entries.find((entry) => entry.id === item.id))\n .filter((entry): entry is StreamEntry => entry !== undefined)\n .slice(0, count)\n }\n }\n if (chosen.length > 0)\n rows.push(arr([bulk(key), arr(chosen.map((entry) => entryFields(entry)))]))\n }\n return rows.length > 0 ? arr(rows) : nilArray()\n }\n\n private cmdXack(session: Session, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 3) return arityError(\"xack\")\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return int(0)\n if (!(\"groups\" in stream)) return stream\n const group = stream.groups.get(text(args[1]))\n if (!group) return int(0)\n if (!apply) return queued()\n let acked = 0\n for (const id of args.slice(2).map((arg) => text(arg))) {\n if (group.pel.delete(id)) acked++\n }\n return int(acked)\n }\n\n private cmdXpending(session: Session, args: Uint8Array[]): Reply {\n if (args.length < 2) return arityError(\"xpending\")\n const stream = this.stream(session, text(args[0]), false)\n if (stream === null) return err(\"ERR no such key\")\n if (!(\"groups\" in stream)) return stream\n const group = stream.groups.get(text(args[1]))\n if (!group) return err(\"NOGROUP No such consumer group\")\n if (args.length === 2) {\n if (group.pel.size === 0) return arr([int(0), nil(), nil(), arr([])])\n const ids = [...group.pel.keys()].sort(cmpId)\n const counts = new Map<string, number>()\n for (const item of group.pel.values())\n counts.set(item.consumer, (counts.get(item.consumer) ?? 0) + 1)\n return arr([\n int(group.pel.size),\n bulk(ids[0] ?? \"\"),\n bulk(ids[ids.length - 1] ?? \"\"),\n arr([...counts].map(([name, count]) => arr([bulk(name), bulk(String(count))]))),\n ])\n }\n const start = text(args[2])\n const end = text(args[3])\n const count = parseI64(args[4] ?? utf8(\"\"))\n if (count === null) return syntaxError()\n const consumer = args[5] ? text(args[5]) : null\n const rows = [...group.pel.values()]\n .filter(\n (item) =>\n (start === \"-\" || cmpId(item.id, start) >= 0) &&\n (end === \"+\" || cmpId(item.id, end) <= 0),\n )\n .filter((item) => consumer === null || item.consumer === consumer)\n .sort((a, b) => cmpId(a.id, b.id))\n .slice(0, Number(count))\n return arr(\n rows.map((item) =>\n arr([\n bulk(item.id),\n bulk(item.consumer),\n int(Math.max(0, this.clock.now() - item.deliveredAt)),\n int(item.deliveries),\n ]),\n ),\n )\n }\n\n private cmdXclaim(session: Session, args: Uint8Array[], apply: boolean, auto: boolean): Reply {\n const minIdleIndex = auto ? 3 : 3\n if (args.length < (auto ? 5 : 5)) return arityError(auto ? \"xautoclaim\" : \"xclaim\")\n const stream = this.stream(session, text(args[0]), false)\n if (!stream || !(\"groups\" in stream)) return auto ? nilArray() : arr([])\n const group = stream.groups.get(text(args[1]))\n if (!group) return err(\"NOGROUP No such consumer group\")\n const consumer = text(args[2])\n const minIdle = Number(text(args[minIdleIndex]))\n if (!Number.isFinite(minIdle) || minIdle < 0) return syntaxError()\n if (!apply) return queued()\n let count = auto ? 100 : Infinity\n let justId = false\n const ids: string[] = []\n if (auto) {\n const start = text(args[4])\n for (let i = 5; i < args.length; i++) {\n if (upper(args[i]) === \"COUNT\") {\n const parsed = parseI64(args[++i] ?? utf8(\"\"))\n if (parsed === null) return syntaxError()\n count = Number(parsed)\n } else if (upper(args[i]) === \"JUSTID\") justId = true\n }\n const claimed: StreamEntry[] = []\n const deleted: string[] = []\n let finished = true\n for (const id of [...group.pel.keys()].sort(cmpId)) {\n if (cmpId(id, start) <= 0) continue\n if (claimed.length >= count) {\n finished = false\n break\n }\n const item = group.pel.get(id)\n if (!item) continue\n const entry = stream.entries.find((candidate) => candidate.id === id)\n if (!entry) {\n group.pel.delete(id)\n deleted.push(id)\n continue\n }\n if (this.clock.now() - item.deliveredAt < minIdle) continue\n item.consumer = consumer\n item.deliveries++\n item.deliveredAt = this.clock.now()\n group.consumers.set(consumer, { seenAt: this.clock.now() })\n claimed.push(entry)\n }\n return arr([\n bulk(finished ? \"0-0\" : (claimed[claimed.length - 1]?.id ?? \"0-0\")),\n arr(claimed.map((entry) => (justId ? bulk(entry.id) : entryFields(entry)))),\n arr(deleted.map((id) => bulk(id))),\n ])\n }\n for (let i = 4; i < args.length; i++) {\n const option = upper(args[i])\n if (option === \"IDLE\" || option === \"TIME\" || option === \"RETRYCOUNT\") i++\n else if (option === \"FORCE\" || option === \"JUSTID\") {\n if (option === \"JUSTID\") justId = true\n } else ids.push(text(args[i]))\n }\n const claimed: StreamEntry[] = []\n for (const id of ids) {\n const item = group.pel.get(id)\n const entry = stream.entries.find((candidate) => candidate.id === id)\n if (!item || !entry) continue\n if (this.clock.now() - item.deliveredAt < minIdle) continue\n item.consumer = consumer\n item.deliveries++\n item.deliveredAt = this.clock.now()\n claimed.push(entry)\n }\n group.consumers.set(consumer, { seenAt: this.clock.now() })\n return arr(claimed.map((entry) => (justId ? bulk(entry.id) : entryFields(entry))))\n }\n\n private cmdXinfo(session: Session, args: Uint8Array[]): Reply {\n const sub = upper(args[0])\n if (sub === \"STREAM\") {\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"entries\" in stream)) return err(\"ERR no such key\")\n const first = stream.entries[0]\n const last = stream.entries[stream.entries.length - 1]\n return arr([\n bulk(\"length\"),\n int(stream.entries.length),\n bulk(\"radix-tree-keys\"),\n int(0),\n bulk(\"radix-tree-nodes\"),\n int(0),\n bulk(\"last-generated-id\"),\n bulk(last?.id ?? \"0-0\"),\n bulk(\"groups\"),\n int(stream.groups.size),\n bulk(\"first-entry\"),\n first ? entryFields(first) : nil(),\n bulk(\"last-entry\"),\n last ? entryFields(last) : nil(),\n ])\n }\n if (sub === \"GROUPS\") {\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream)) return err(\"ERR no such key\")\n return arr(\n [...stream.groups.values()].map((group) =>\n arr([\n bulk(\"name\"),\n bulk(group.name),\n bulk(\"consumers\"),\n int(group.consumers.size),\n bulk(\"pending\"),\n int(group.pel.size),\n bulk(\"last-delivered-id\"),\n bulk(group.lastId),\n ]),\n ),\n )\n }\n if (sub === \"CONSUMERS\") {\n const stream = this.stream(session, text(args[1]), false)\n if (!stream || !(\"groups\" in stream)) return err(\"ERR no such key\")\n const group = stream.groups.get(text(args[2]))\n if (!group) return err(\"NOGROUP No such consumer group\")\n return arr(\n [...group.consumers].map(([name, info]) => {\n let pending = 0\n for (const item of group.pel.values()) if (item.consumer === name) pending++\n return arr([\n bulk(\"name\"),\n bulk(name),\n bulk(\"pending\"),\n int(pending),\n bulk(\"idle\"),\n int(Math.max(0, this.clock.now() - info.seenAt)),\n ])\n }),\n )\n }\n return syntaxError()\n }\n\n private cmdSub(session: Session, command: string, args: Uint8Array[]): Reply {\n const pattern = command.startsWith(\"p\")\n const leaving = command.includes(\"unsubscribe\")\n const names = args.map((arg) => text(arg))\n if (!leaving && names.length === 0) return arityError(command)\n const targets = names.length > 0 ? names : [...(pattern ? session.patterns : session.channels)]\n if (targets.length === 0) {\n return push([bulk(command), nil(), int(session.channels.size + session.patterns.size)])\n }\n let last: Reply = ok()\n targets.forEach((name, index) => {\n if (leaving) {\n if (pattern) {\n session.patterns.delete(name)\n this.patternSubs.get(name)?.delete(session)\n } else {\n session.channels.delete(name)\n this.channelSubs.get(name)?.delete(session)\n }\n } else if (pattern) {\n session.patterns.add(name)\n const set = this.patternSubs.get(name) ?? new Set()\n set.add(session)\n this.patternSubs.set(name, set)\n } else {\n session.channels.add(name)\n const set = this.channelSubs.get(name) ?? new Set()\n set.add(session)\n this.channelSubs.set(name, set)\n }\n const reply = push([\n bulk(command),\n bulk(name),\n int(session.channels.size + session.patterns.size),\n ])\n if (index < targets.length - 1) session.onPush(reply)\n else last = reply\n })\n return last\n }\n\n private cmdPublish(args: Uint8Array[]): Reply {\n if (args.length !== 2) return arityError(\"publish\")\n const channel = text(args[0])\n const message = args[1] ?? utf8(\"\")\n let delivered = 0\n for (const session of this.channelSubs.get(channel) ?? []) {\n session.onPush(push([bulk(\"message\"), bulk(channel), { t: \"bulk\", v: message }]))\n delivered++\n }\n for (const [pattern, sessions] of this.patternSubs) {\n if (!globMatch(pattern, channel)) continue\n for (const session of sessions) {\n session.onPush(\n push([bulk(\"pmessage\"), bulk(pattern), bulk(channel), { t: \"bulk\", v: message }]),\n )\n delivered++\n }\n }\n return int(delivered)\n }\n\n private cmdPubsub(args: Uint8Array[]): Reply {\n const sub = upper(args[0])\n if (sub === \"NUMSUB\") {\n const rows: Reply[] = []\n for (const arg of args.slice(1)) {\n rows.push(bulk(text(arg)), int(this.channelSubs.get(text(arg))?.size ?? 0))\n }\n return arr(rows)\n }\n if (sub === \"CHANNELS\") {\n const pattern = args[1] ? text(args[1]) : \"*\"\n return arr(\n [...this.channelSubs.keys()]\n .filter((channel) => globMatch(pattern, channel))\n .map((channel) => bulk(channel)),\n )\n }\n if (sub === \"NUMPAT\") return int(this.patternSubs.size)\n return arityError(\"pubsub\")\n }\n\n private cmdExec(session: Session): Reply {\n if (!session.multi) return execWithoutMulti()\n const queuedCommands = session.multi\n const failed = session.multiFailed\n const watching = session.watching\n session.multi = null\n session.multiFailed = false\n session.watching = []\n if (failed) return execAbort()\n for (const watch of watching) {\n if (this.database(watch.db).generation(watch.key) !== watch.gen) return nilArray()\n }\n const replies: Reply[] = []\n session.inExec = true\n try {\n for (const command of queuedCommands) {\n const reply = this.execCmd(session, command.name, command.args, true)\n replies.push(reply instanceof Promise ? nilArray() : reply)\n }\n } finally {\n session.inExec = false\n }\n return arr(replies)\n }\n\n private cmdDiscard(session: Session): Reply {\n if (!session.multi) return discardWithoutMulti()\n session.multi = null\n session.multiFailed = false\n session.watching = []\n return ok()\n }\n\n private cmdWatch(session: Session, args: Uint8Array[]): Reply {\n if (args.length < 1) return arityError(\"watch\")\n if (session.multi) return err(\"ERR WATCH inside MULTI is not allowed\")\n for (const arg of args) {\n const key = text(arg)\n session.watching.push({ db: session.db, key, gen: this.database(session.db).generation(key) })\n }\n return ok()\n }\n\n private cmdEval(session: Session, command: string, args: Uint8Array[], apply: boolean): Reply {\n if (args.length < 2) return arityError(command)\n const source =\n command === \"eval\" ? text(args[0]) : this.scripts.get(text(args[0]).toLowerCase())\n if (command === \"evalsha\" && source === undefined) return noScript()\n const numkeys = parseI64(args[1] ?? utf8(\"\"))\n if (numkeys === null) return notInteger()\n if (numkeys < 0n) return err(\"ERR Number of keys can't be negative\")\n if (args.length < 2 + Number(numkeys)) {\n return err(\"ERR Number of keys can't be greater than number of args\")\n }\n if (!apply || source === undefined) return queued()\n const keys = args.slice(2, 2 + Number(numkeys))\n const argv = args.slice(2 + Number(numkeys))\n return this.runScript(session, source, keys, argv)\n }\n\n private cmdScript(args: Uint8Array[], apply: boolean): Reply {\n const sub = upper(args[0])\n if (sub === \"LOAD\") {\n if (args.length !== 2) return arityError(\"script|load\")\n if (!apply) return queued()\n const source = text(args[1])\n const digest = sha1Hex(utf8(source))\n this.scripts.set(digest, source)\n return bulk(digest)\n }\n if (sub === \"EXISTS\") {\n return arr(args.slice(1).map((arg) => int(this.scripts.has(text(arg).toLowerCase()) ? 1 : 0)))\n }\n if (sub === \"FLUSH\") {\n if (!apply) return queued()\n this.scripts.clear()\n return ok()\n }\n if (sub === \"KILL\") {\n if (this.faultValue !== \"busy\" && this.scriptDepth === 0) return notBusy()\n if (this.faultValue === \"busy\") this.faultValue = null\n return ok()\n }\n return arityError(\"script\")\n }\n\n private runScript(\n session: Session,\n source: string,\n keys: Uint8Array[],\n argv: Uint8Array[],\n ): Reply {\n const host = {\n call: (callArgs: LuaValue[]) => this.luaDispatch(session, callArgs, false),\n pcall: (callArgs: LuaValue[]) => this.luaDispatch(session, callArgs, true),\n }\n const env = luaGlobals(host)\n const keyTable = env.get(\"redis\")\n const keysTable = new LuaTable()\n const argvTable = new LuaTable()\n keys.forEach((key, index) => {\n keysTable.set(index + 1, latin1(key))\n })\n argv.forEach((arg, index) => {\n argvTable.set(index + 1, latin1(arg))\n })\n env.define(\"KEYS\", keysTable)\n env.define(\"ARGV\", argvTable)\n if (keyTable instanceof LuaTable) keyTable.set(\"pcall\", host.pcall)\n this.scriptDepth++\n try {\n const values = runLua(source, env)\n return luaToReply(values[0] ?? null)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return err(`ERR Error running script: ${message}`)\n } finally {\n this.scriptDepth--\n }\n }\n\n private luaDispatch(session: Session, args: LuaValue[], trap: boolean): LuaValue[] {\n const name = typeof args[0] === \"string\" ? args[0].toLowerCase() : \"\"\n const bytes = args.slice(1).map((arg) => luaToBytes(arg))\n try {\n const reply = this.execCmd(session, name, bytes, true)\n if (reply instanceof Promise)\n throw new Error(\"This Redis command is not allowed from scripts\")\n if (reply.t === \"error\") {\n if (!trap) throw new Error(reply.v)\n const table = new LuaTable()\n table.set(\"err\", reply.v)\n return [table]\n }\n return [replyToLua(reply)]\n } catch (error) {\n if (!trap) throw error\n const table = new LuaTable()\n table.set(\"err\", error instanceof Error ? error.message : String(error))\n return [table]\n }\n }\n\n private block(spec: {\n kind: Waiter[\"kind\"]\n keys: string[]\n db: number\n side: \"left\" | \"right\"\n count: number\n deadline?: number\n group?: string\n consumer?: string\n streamIds?: string[]\n noack?: boolean\n max?: boolean\n destKey?: string\n destSide?: \"left\" | \"right\"\n session: Session\n }): Promise<Reply> {\n return new Promise((resolve, reject) => {\n const waiter: Waiter = {\n kind: spec.kind,\n keys: spec.keys,\n db: spec.db,\n side: spec.side,\n count: spec.count,\n settled: false,\n resolve,\n reject,\n ...(spec.deadline !== undefined ? { deadline: spec.deadline } : {}),\n ...(spec.group !== undefined ? { group: spec.group } : {}),\n ...(spec.consumer !== undefined ? { consumer: spec.consumer } : {}),\n ...(spec.streamIds !== undefined ? { streamIds: spec.streamIds } : {}),\n ...(spec.noack ? { noack: true } : {}),\n ...(spec.max ? { max: true } : {}),\n ...(spec.destKey !== undefined ? { destKey: spec.destKey } : {}),\n ...(spec.destSide !== undefined ? { destSide: spec.destSide } : {}),\n }\n waiterSession.set(waiter, spec.session)\n this.waiters.push(waiter)\n if (spec.deadline !== undefined) {\n const deadline = spec.deadline\n const fire = () => {\n if (this.clock.now() < deadline) return\n this.enqueue(() => this.finishWaiter(waiter, nilArray()))\n }\n waiter.unsub = this.clock.subscribe(fire)\n if (!this.clock.manual) {\n waiter.timer = setTimeout(fire, Math.max(0, deadline - this.clock.now()))\n }\n }\n })\n }\n\n private wake(dbIndex: number, key: string): void {\n for (const waiter of [...this.waiters]) {\n if (waiter.settled || waiter.db !== dbIndex || !waiter.keys.includes(key)) continue\n const reply = this.satisfy(waiter)\n if (reply) this.finishWaiter(waiter, reply)\n }\n }\n\n private wakeAll(): void {\n for (const waiter of [...this.waiters]) {\n const reply = this.satisfy(waiter)\n if (reply) this.finishWaiter(waiter, reply)\n }\n }\n\n private satisfy(waiter: Waiter): Reply | null {\n const session = waiterSession.get(waiter)\n if (!session || session.dead) return nilArray()\n if (this.consumersPaused) return null\n if (waiter.kind === \"list\") return this.takeList(waiter.db, waiter.keys, waiter.side)\n if (waiter.kind === \"zset\") return this.takeZset(waiter.db, waiter.keys, waiter.max === true)\n const reply = this.readStreams(\n session,\n waiter.keys,\n waiter.streamIds ?? waiter.keys.map(() => \">\"),\n waiter.count,\n waiter.group !== undefined,\n waiter.group ?? \"\",\n waiter.consumer ?? \"\",\n waiter.noack === true,\n )\n if (reply.t === \"array\" && reply.v && reply.v.length > 0) return reply\n if (reply.t === \"error\") return reply\n return null\n }\n\n private finishWaiter(waiter: Waiter, reply: Reply): void {\n if (waiter.settled) return\n waiter.settled = true\n waiter.unsub?.()\n if (waiter.timer !== undefined) clearTimeout(waiter.timer)\n this.waiters = this.waiters.filter((item) => item !== waiter)\n waiterSession.delete(waiter)\n waiter.resolve(reply)\n }\n\n private failWaiter(waiter: Waiter, error: Error): void {\n if (waiter.settled) return\n waiter.settled = true\n waiter.unsub?.()\n if (waiter.timer !== undefined) clearTimeout(waiter.timer)\n this.waiters = this.waiters.filter((item) => item !== waiter)\n waiterSession.delete(waiter)\n waiter.reject(error)\n }\n\n private leavePubsub(session: Session): void {\n for (const channel of session.channels) this.channelSubs.get(channel)?.delete(session)\n for (const pattern of session.patterns) this.patternSubs.get(pattern)?.delete(session)\n session.channels.clear()\n session.patterns.clear()\n }\n}\n\nconst waiterSession = new WeakMap<Waiter, Session>()\n\nfunction concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n const out = new Uint8Array(left.length + right.length)\n out.set(left)\n out.set(right, left.length)\n return out\n}\n\nfunction compareBytes(left: Uint8Array, right: Uint8Array): number {\n const length = Math.min(left.length, right.length)\n for (let i = 0; i < length; i++) {\n const diff = (left[i] ?? 0) - (right[i] ?? 0)\n if (diff !== 0) return diff\n }\n return left.length - right.length\n}\n\nfunction indexes(\n length: number,\n startRaw: Uint8Array | undefined,\n endRaw: Uint8Array | undefined,\n): [number, number] {\n let start = Number(text(startRaw))\n let end = Number(text(endRaw))\n if (!Number.isInteger(start)) start = 0\n if (!Number.isInteger(end)) end = -1\n if (start < 0) start = length + start\n if (end < 0) end = length + end\n if (start < 0) start = 0\n if (end >= length) end = length - 1\n return [start, end]\n}\n\nfunction listIndex(length: number, raw: Uint8Array | undefined): number | null {\n const parsed = parseI64(raw ?? utf8(\"\"))\n if (parsed === null) return null\n let index = Number(parsed)\n if (index < 0) index = length + index\n if (index < 0 || index >= length) return null\n return index\n}\n\ninterface Bound {\n value: number\n exclusive: boolean\n}\n\nfunction parseBound(value: string): Bound | null {\n if (value === \"+inf\" || value === \"inf\") return { value: Infinity, exclusive: false }\n if (value === \"-inf\") return { value: -Infinity, exclusive: false }\n let exclusive = false\n let textValue = value\n if (textValue.startsWith(\"(\")) {\n exclusive = true\n textValue = textValue.slice(1)\n }\n const score = parseScore(utf8(textValue))\n if (score === null) return null\n return { value: score, exclusive }\n}\n\nfunction inBound(score: number, min: Bound, max: Bound): boolean {\n if (min.exclusive ? score <= min.value : score < min.value) return false\n if (max.exclusive ? score >= max.value : score > max.value) return false\n return true\n}\n\nfunction toArg(value: string | number | Uint8Array): Uint8Array {\n if (typeof value === \"number\") return utf8(String(value))\n if (typeof value === \"string\") return utf8(value)\n return value\n}\n\nexport class RedisClient {\n constructor(\n private readonly redis: Redis,\n private readonly session: Session,\n ) {}\n\n get protocol(): 2 | 3 {\n return this.session.protocol\n }\n\n onPush(listener: (reply: Reply) => void): void {\n const previous = this.session.onPush\n this.session.onPush = (reply) => {\n previous(reply)\n listener(reply)\n }\n }\n\n call(command: string, ...args: Array<string | number | Uint8Array>): Promise<unknown> {\n return this.raw(command, ...args).then((reply) => decodeReply(reply))\n }\n\n raw(command: string, ...args: Array<string | number | Uint8Array>): Promise<Reply> {\n return this.redis.perform(\n this.session,\n command,\n args.map((arg) => toArg(arg)),\n )\n }\n\n pipeline(): RedisPipeline {\n return new RedisPipeline(this)\n }\n\n async quit(): Promise<string> {\n const reply = await this.call(\"QUIT\")\n this.session.dead = true\n return String(reply)\n }\n}\n\nexport class RedisPipeline {\n private readonly commands: Array<{ name: string; args: Array<string | number | Uint8Array> }> = []\n\n constructor(private readonly client: RedisClient) {}\n\n call(name: string, ...args: Array<string | number | Uint8Array>): this {\n this.commands.push({ name, args })\n return this\n }\n\n async exec(): Promise<unknown[]> {\n const out: unknown[] = []\n for (const command of this.commands) {\n try {\n out.push(await this.client.call(command.name, ...command.args))\n } catch (error) {\n out.push(error)\n }\n }\n return out\n }\n}\n\nexport function createRedis(options?: RedisOptions): Redis {\n return new Redis(options ?? {})\n}\n\nexport { manualClock, wallClock } from \"./clock.ts\"\nexport { encodeReply } from \"./protocol.ts\"\n"],
5
+ "mappings": "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",
6
+ "names": ["text", "ok", "text", "ok", "err", "text", "fn", "map", "body", "delta", "base", "target", "next", "first", "count", "claimed"]
7
+ }