js-valkey-server 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +558 -0
- package/dist/cli.js +17420 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.mts +651 -0
- package/dist/core.d.ts +651 -0
- package/dist/core.js +17929 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +17691 -0
- package/dist/core.mjs.map +1 -0
- package/dist/index.d.mts +502 -0
- package/dist/index.d.ts +502 -0
- package/dist/index.js +18845 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +18749 -0
- package/dist/index.mjs.map +1 -0
- package/dist/redis-error-C96iHLJ-.d.mts +1392 -0
- package/dist/redis-error-C96iHLJ-.d.ts +1392 -0
- package/package.json +119 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/core/redis-error.ts","../src/core/compatibility/feature-gates.ts","../src/core/compatibility/profile.ts","../src/core/command-schema.ts","../src/core/redis-value.ts","../src/core/redis-result.ts","../src/core/response-stream.ts","../src/core/command-executor.ts","../src/core/command-registry.ts","../src/core/execution-policies/transaction-policy.ts","../src/core/execution-policies/auth-policy.ts","../src/core/execution-policies/subscribed-policy.ts","../src/core/execution-policies/cluster-policy.ts","../src/core/command-definition.ts","../src/commands/helpers.ts","../src/commands/bitmaps.ts","../src/commands/introspection.ts","../src/commands/command.ts","../src/state/data-types.ts","../src/state/mutation-events.ts","../src/state/monitor-feed.ts","../src/state/keyspace.ts","../src/core/turn-queue.ts","../src/state/stream-ids.ts","../src/state/stream-groups.ts","../src/state/tracked-values.ts","../src/state/database.ts","../src/state/keyspace-notifier.ts","../src/state/script-cache.ts","../src/state/function-registry.ts","../src/core/glob.ts","../src/state/pubsub-broker.ts","../src/state/cluster-topology.ts","../src/core/lua-runtime.ts","../src/state/server-state.ts","../src/commands/config.ts","../src/commands/connection.ts","../src/commands/geo/helpers.ts","../src/commands/geo/geoadd.ts","../src/commands/geo/geodist.ts","../src/commands/zsets/helpers.ts","../src/commands/geo/search-core.ts","../src/commands/geo/georadius.ts","../src/commands/geo/georadiusbymember.ts","../src/commands/geo/geohash.ts","../src/commands/geo/geopos.ts","../src/commands/geo/geosearch.ts","../src/commands/geo/geosearchstore.ts","../src/commands/geo/index.ts","../src/commands/hashes.ts","../src/commands/hyperloglog.ts","../src/commands/keys.ts","../src/commands/lists/helpers.ts","../src/commands/lists/move.ts","../src/commands/lists/blmove.ts","../src/commands/lists/lmpop.ts","../src/commands/lists/blpop.ts","../src/commands/lists/access.ts","../src/commands/lists/insert.ts","../src/commands/lists/lpos.ts","../src/commands/lists/pop.ts","../src/commands/lists/push.ts","../src/commands/lists/index.ts","../src/commands/monitor.ts","../src/commands/pubsub.ts","../src/commands/scan.ts","../src/commands/scripts.ts","../src/commands/sets.ts","../src/commands/streams/ids.ts","../src/commands/streams/groups.ts","../src/commands/streams/xack.ts","../src/commands/streams/trim.ts","../src/commands/streams/xadd.ts","../src/commands/streams/replies.ts","../src/commands/streams/xautoclaim.ts","../src/commands/streams/xclaim.ts","../src/commands/streams/xdel.ts","../src/commands/streams/xgroup.ts","../src/commands/streams/xinfo.ts","../src/commands/streams/xlen.ts","../src/commands/streams/xpending.ts","../src/commands/streams/xrange.ts","../src/commands/streams/xread.ts","../src/commands/streams/xreadgroup.ts","../src/commands/streams/xsetid.ts","../src/commands/streams/xtrim.ts","../src/commands/streams/index.ts","../src/commands/strings.ts","../src/commands/transactions.ts","../src/commands/zsets/zadd.ts","../src/commands/zsets/zrem.ts","../src/commands/zsets/zrank.ts","../src/commands/zsets/zscore.ts","../src/commands/zsets/lex.ts","../src/commands/zsets/zrandmember.ts","../src/commands/zsets/zincrby.ts","../src/commands/zsets/score.ts","../src/commands/zsets/zrange.ts","../src/commands/zsets/zrangebyscore.ts","../src/commands/zsets/zrangebylex.ts","../src/commands/zsets/zpop.ts","../src/commands/zsets/zmpop.ts","../src/commands/zsets/zsetops.ts","../src/commands/zsets/index.ts","../src/core/network-address.ts","../src/commands/cluster.ts","../src/commands/index.ts","../src/core/transports/resp2/server.ts","../src/core/redis-context.ts","../src/core/resp-encoder.ts","../src/core/client-session.ts","../src/core/transports/resp2/decoder.ts","../src/core/transports/resp2/session-adapter.ts","../src/core/transports/attach-session.ts","../src/core/transports/socket-connection-transport.ts","../src/cluster.ts","../src/cluster-server.ts","../src/mock.ts"],"sourcesContent":["import { createRedisServer } from './mock'\nimport type { Logger } from './logger'\nimport type { CompatibilitySpec } from './core/compatibility'\n\ntype Mode = 'single' | 'cluster'\n\nexport type CliOptions = {\n mode: Mode\n port: number\n masters: number\n slaves: number\n basePort: number\n compatibility?: CompatibilitySpec\n help: boolean\n debug: boolean\n}\n\nconst defaultOptions: CliOptions = {\n mode: 'single',\n port: 6379,\n masters: 3,\n slaves: 0,\n basePort: 30000,\n help: false,\n debug: false,\n}\n\nexport function parseArgs(args: string[]): CliOptions {\n const options: CliOptions = { ...defaultOptions }\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n\n if (arg === '--help' || arg === '-h') {\n options.help = true\n continue\n }\n\n if (arg === '--debug' || arg === '-d') {\n options.debug = true\n continue\n }\n\n if (arg === '--cluster') {\n options.mode = 'cluster'\n continue\n }\n\n if (arg === '--single') {\n options.mode = 'single'\n continue\n }\n\n if (arg === '--mode') {\n const value = args[++i]\n if (value !== 'single' && value !== 'cluster') {\n throw new Error(`Invalid mode \"${value}\"`)\n }\n options.mode = value\n continue\n }\n\n if (arg === '--port') {\n options.port = parseInteger(args[++i], '--port')\n continue\n }\n\n if (arg === '--base-port') {\n options.basePort = parseInteger(args[++i], '--base-port')\n continue\n }\n\n if (arg === '--masters') {\n options.masters = parseInteger(args[++i], '--masters')\n continue\n }\n\n if (arg === '--slaves') {\n options.slaves = parseInteger(args[++i], '--slaves')\n continue\n }\n\n if (arg === '--compat') {\n const value = args[++i]\n if (!value) {\n throw new Error('Missing value for --compat')\n }\n options.compatibility = value as CompatibilitySpec\n continue\n }\n\n throw new Error(`Unknown argument \"${arg}\"`)\n }\n\n return options\n}\n\nfunction parseInteger(value: string | undefined, name: string): number {\n if (!value) {\n throw new Error(`Missing value for ${name}`)\n }\n const parsed = Number(value)\n if (!Number.isInteger(parsed)) {\n throw new Error(`Invalid value for ${name}: ${value}`)\n }\n return parsed\n}\n\nfunction validatePort(port: number, name: string): void {\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(`Invalid ${name} ${port}`)\n }\n}\n\nfunction createLogger(debug = false): Logger {\n return {\n info: (msg, metadata) => {\n if (metadata) {\n console.log(msg, metadata)\n } else {\n console.log(msg)\n }\n },\n error: (msg, metadata) => {\n if (metadata) {\n console.error(msg, metadata)\n } else {\n console.error(msg)\n }\n },\n debug: (msg, metadata) => {\n if (debug) {\n if (metadata) {\n console.debug(msg, metadata)\n } else {\n console.debug(msg)\n }\n }\n },\n }\n}\n\nfunction printHelp() {\n console.log(`Usage: js-redis-server [options]\n js-valkey-server [options]\n\nModes:\n --single Run a single Redis server (default)\n --cluster Run a Redis cluster\n --mode <single|cluster>\n\nSingle server options:\n --port <number> Port to listen on (default 6379)\n\nCluster options:\n --masters <number> Number of masters (default 3)\n --slaves <number> Number of replicas per master (default 0)\n --base-port <number> Starting port for cluster nodes (default 30000)\n\nGeneral:\n --compat <preset> Compatibility profile (or REDIS_COMPAT env)\n -d, --debug Enable debug logging\n -h, --help Show help\n`)\n}\n\nasync function runSingle(options: CliOptions, logger: Logger) {\n validatePort(options.port, 'port')\n logger.debug('Starting single server mode', { port: options.port })\n\n const { server } = await createRedisServer({\n port: options.port,\n compatibility: resolveCliCompatibility(options),\n logger,\n })\n logger.info(`Single Redis server listening at ${server.getAddress()}`)\n\n const shutdown = async () => {\n await server.close()\n }\n\n process.once('SIGINT', shutdown)\n process.once('SIGTERM', shutdown)\n}\n\nasync function runCluster(options: CliOptions, logger: Logger) {\n validatePort(options.basePort, 'base-port')\n\n logger.debug('Starting cluster mode', {\n masters: options.masters,\n slaves: options.slaves,\n basePort: options.basePort,\n })\n\n const cluster = await createRedisServer({\n cluster: { masters: options.masters, replicas: options.slaves },\n basePort: options.basePort,\n compatibility: resolveCliCompatibility(options),\n logger,\n })\n\n const nodes = cluster.nodes.map(n => `${n.id} ${n.host}:${n.port}`).join(', ')\n logger.info(`Cluster nodes: ${nodes}`)\n\n const shutdown = async () => {\n await cluster.close()\n }\n\n process.once('SIGINT', shutdown)\n process.once('SIGTERM', shutdown)\n}\n\nfunction resolveCliCompatibility(\n options: CliOptions,\n): CompatibilitySpec | undefined {\n return (\n options.compatibility ??\n (process.env.REDIS_COMPAT as CompatibilitySpec | undefined)\n )\n}\n\nexport async function main(argv = process.argv.slice(2)) {\n const options = parseArgs(argv)\n if (options.help) {\n printHelp()\n return\n }\n\n const logger = createLogger(options.debug)\n\n if (options.mode === 'cluster') {\n await runCluster(options, logger)\n } else {\n await runSingle(options, logger)\n }\n}\n\n// Run when executed directly as CLI. Node resolves bin symlinks to realpath,\n// so require.main === module works for `npm link` / global installs too.\nif (require.main === module) {\n main().catch(err => {\n console.error(err)\n process.exitCode = 1\n })\n}\n","export class RedisCommandError extends Error {\n constructor(\n message: string,\n public readonly code = 'ERR',\n ) {\n super(message)\n this.name = code\n }\n}\n\nexport class WrongNumberOfArgumentsError extends RedisCommandError {\n constructor(commandName: string) {\n super(`wrong number of arguments for '${commandName}' command`)\n }\n}\n\nexport class RedisSyntaxError extends RedisCommandError {\n constructor() {\n super('syntax error')\n }\n}\n\n/** `AUTH <password>` (single-arg) when the server has no `requirepass` set. */\nexport class NoPasswordConfiguredError extends RedisCommandError {\n constructor() {\n super(\n 'AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?',\n )\n }\n}\n\n/** Wrong username/password pair on AUTH or HELLO AUTH. */\nexport class WrongPassError extends RedisCommandError {\n constructor() {\n super('invalid username-password pair or user is disabled.', 'WRONGPASS')\n }\n}\n\n/** A command was issued before authenticating on a password-protected server. */\nexport class NoAuthError extends RedisCommandError {\n constructor(message = 'Authentication required.') {\n super(message, 'NOAUTH')\n }\n}\n\n/** `HELLO <version>` with a syntactically valid but unsupported protocol version. */\nexport class NoProtoError extends RedisCommandError {\n constructor() {\n super('unsupported protocol version', 'NOPROTO')\n }\n}\n\n/** `HELLO <version>` where version is not a valid integer at all. */\nexport class HelloProtocolNotIntegerError extends RedisCommandError {\n constructor() {\n super('Protocol version is not an integer or out of range')\n }\n}\n\nexport class ExpectedIntegerError extends RedisCommandError {\n constructor() {\n super('value is not an integer or out of range')\n }\n}\n\nexport class IncrDecrOverflowError extends RedisCommandError {\n constructor(message = 'increment or decrement would overflow') {\n super(message)\n }\n}\n\nexport class ExpectedFloatError extends RedisCommandError {\n constructor() {\n super('value is not a valid float')\n }\n}\n\nexport class IncrByFloatNanOrInfinityError extends RedisCommandError {\n constructor() {\n super('increment would produce NaN or Infinity')\n }\n}\n\n/** A non-ALPHA SORT met an element that does not parse as a double. */\nexport class SortScoreNotDoubleError extends RedisCommandError {\n constructor() {\n super(\"One or more scores can't be converted into double\")\n }\n}\n\nexport class ResultingScoreNaNError extends RedisCommandError {\n constructor() {\n super('resulting score is not a number (NaN)')\n }\n}\n\nexport class MinMaxNotFloatError extends RedisCommandError {\n constructor() {\n super('min or max is not a float')\n }\n}\n\nexport class PositiveCountError extends RedisCommandError {\n constructor() {\n super('value is out of range, must be positive')\n }\n}\n\nexport class LposRankZeroError extends RedisCommandError {\n constructor() {\n super(\n \"RANK can't be zero: use 1 to start from the first match, 2 from the second ... or use negative to start from the end of the list\",\n )\n }\n}\n\nexport class LposCountNegativeError extends RedisCommandError {\n constructor() {\n super(\"COUNT can't be negative\")\n }\n}\n\nexport class LposMaxlenNegativeError extends RedisCommandError {\n constructor() {\n super(\"MAXLEN can't be negative\")\n }\n}\n\nexport class TimeoutNotFloatError extends RedisCommandError {\n constructor() {\n super('timeout is not a float or out of range')\n }\n}\n\nexport class TimeoutNegativeError extends RedisCommandError {\n constructor() {\n super('timeout is negative')\n }\n}\n\nexport class ZaddNxXxConflictError extends RedisCommandError {\n constructor() {\n super('XX and NX options at the same time are not compatible')\n }\n}\n\nexport class ZaddGtLtNxConflictError extends RedisCommandError {\n constructor() {\n super('GT, LT, and/or NX options at the same time are not compatible')\n }\n}\n\nexport class ExpireNxXxGtLtConflictError extends RedisCommandError {\n constructor() {\n super('NX and XX, GT or LT options at the same time are not compatible')\n }\n}\n\nexport class ExpireGtLtConflictError extends RedisCommandError {\n constructor() {\n super('GT and LT options at the same time are not compatible')\n }\n}\n\nexport class UnsupportedOptionError extends RedisCommandError {\n constructor(option: string) {\n super(`Unsupported option ${option}`)\n }\n}\n\nexport class ZaddIncrPairError extends RedisCommandError {\n constructor() {\n super('INCR option supports a single increment-element pair')\n }\n}\n\nexport class InvalidLongitudeLatitudeError extends RedisCommandError {\n constructor(lon: number, lat: number) {\n super(`invalid longitude,latitude pair ${lon.toFixed(6)},${lat.toFixed(6)}`)\n }\n}\n\nexport class GeoUnsupportedUnitError extends RedisCommandError {\n constructor() {\n super('unsupported unit provided. please use M, KM, FT, MI')\n }\n}\n\nexport class GeoMissingMemberError extends RedisCommandError {\n constructor() {\n super('could not decode requested zset member')\n }\n}\n\nexport class GeoCountNotPositiveError extends RedisCommandError {\n constructor() {\n super('COUNT must be > 0')\n }\n}\n\nexport class GeoAnyRequiresCountError extends RedisCommandError {\n constructor() {\n super('the ANY argument requires COUNT argument')\n }\n}\n\nexport class GeoRadiusNotNumericError extends RedisCommandError {\n constructor() {\n super('need numeric radius')\n }\n}\n\nexport class GeoRadiusNegativeError extends RedisCommandError {\n constructor() {\n super('radius cannot be negative')\n }\n}\n\nexport class GeoWidthNotNumericError extends RedisCommandError {\n constructor() {\n super('need numeric width')\n }\n}\n\nexport class GeoHeightNotNumericError extends RedisCommandError {\n constructor() {\n super('need numeric height')\n }\n}\n\nexport class GeoBoxNegativeError extends RedisCommandError {\n constructor() {\n super('height or width cannot be negative')\n }\n}\n\nexport class GeoRadiusStoreWithOptionsError extends RedisCommandError {\n constructor() {\n super(\n 'STORE option in GEORADIUS is not compatible with WITHDIST, WITHHASH and WITHCOORD options',\n )\n }\n}\n\nexport class GeoSearchStoreWithOptionsError extends RedisCommandError {\n constructor() {\n super(\n 'GEOSEARCHSTORE is not compatible with WITHDIST, WITHHASH and WITHCOORD options',\n )\n }\n}\n\nexport class OffsetOutOfRangeError extends RedisCommandError {\n constructor() {\n super('offset is out of range')\n }\n}\n\n/** SETBIT/GETBIT/BITFIELD offset that is negative, non-integer, or >= 2^32. */\nexport class BitOffsetError extends RedisCommandError {\n constructor() {\n super('bit offset is not an integer or out of range')\n }\n}\n\n/** SETBIT value that is not exactly 0 or 1. */\nexport class BitValueError extends RedisCommandError {\n constructor() {\n super('bit is not an integer or out of range')\n }\n}\n\n/** BITPOS bit argument that is not 0 or 1. */\nexport class BitPosBitError extends RedisCommandError {\n constructor() {\n super('The bit argument must be 1 or 0.')\n }\n}\n\n/** BITOP NOT invoked with more than one source key. */\nexport class BitOpNotSingleKeyError extends RedisCommandError {\n constructor() {\n super('BITOP NOT must be called with a single source key.')\n }\n}\n\n/** BITFIELD type token that is malformed or u64 (only i64 is allowed at 64 bits). */\nexport class BitfieldTypeError extends RedisCommandError {\n constructor() {\n super(\n 'Invalid bitfield type. Use something like i16 u8. Note that u64 is not supported but i64 is.',\n )\n }\n}\n\n/** BITFIELD OVERFLOW with a mode other than WRAP/SAT/FAIL. */\nexport class BitfieldOverflowTypeError extends RedisCommandError {\n constructor() {\n super('Invalid OVERFLOW type specified')\n }\n}\n\n/** A non-GET subcommand passed to BITFIELD_RO. */\nexport class BitfieldRoGetOnlyError extends RedisCommandError {\n constructor() {\n super('BITFIELD_RO only supports the GET subcommand')\n }\n}\n\nexport class WrongTypeRedisError extends RedisCommandError {\n constructor() {\n super(\n 'Operation against a key holding the wrong kind of value',\n 'WRONGTYPE',\n )\n }\n}\n\n/** A string-type key whose contents are not a valid HyperLogLog encoding. */\nexport class InvalidHllError extends RedisCommandError {\n constructor() {\n super('Key is not a valid HyperLogLog string value.', 'WRONGTYPE')\n }\n}\n\nexport class InvalidExpireTimeError extends RedisCommandError {\n constructor(commandName: string) {\n super(`invalid expire time in '${commandName}' command`)\n }\n}\n\nexport class RedisCrossSlotError extends RedisCommandError {\n constructor() {\n super(`Keys in request don't hash to the same slot`, 'CROSSSLOT')\n }\n}\n\nexport class RedisMovedError extends RedisCommandError {\n constructor(slot: number, host: string, port: number) {\n super(`${slot} ${host}:${port}`, 'MOVED')\n }\n}\n\nexport class RedisClusterDownError extends RedisCommandError {\n constructor() {\n super('Hash slot not served', 'CLUSTERDOWN')\n }\n}\n\nexport class UnknownScriptSubcommandError extends RedisCommandError {\n constructor(subcommand: string | Buffer) {\n super(`unknown subcommand '${subcommand}'. Try SCRIPT HELP.`)\n }\n}\n\nexport class UnknownClusterSubcommandError extends RedisCommandError {\n constructor(subcommand: string | Buffer) {\n super(`unknown subcommand '${subcommand}'. Try CLUSTER HELP.`)\n }\n}\n\nexport class ScriptFlushOptionError extends RedisCommandError {\n constructor() {\n super('SCRIPT FLUSH only support SYNC|ASYNC option')\n }\n}\n\nexport class ScriptDebugModeError extends RedisCommandError {\n constructor() {\n super('Use SCRIPT DEBUG YES/SYNC/NO')\n }\n}\n\nexport class ScriptUnknownCommandError extends RedisCommandError {\n constructor() {\n super('Unknown Redis command called from script')\n }\n}\n\nexport class ScriptNotAllowedCommandError extends RedisCommandError {\n constructor() {\n super('This Redis command is not allowed from script')\n }\n}\n\nexport class ScriptCallNoCommandError extends RedisCommandError {\n constructor() {\n super('Please specify at least one argument for this redis lib call')\n }\n}\n\nexport class WrongNumberOfKeysError extends RedisCommandError {\n constructor() {\n super(`Number of keys can't be greater than number of args`)\n }\n}\n\nexport class NumKeysGreaterThanZeroError extends RedisCommandError {\n constructor() {\n super('numkeys should be greater than 0')\n }\n}\n\n/** ZUNION/ZINTER/ZDIFF family when numkeys <= 0. */\nexport class AtLeastOneInputKeyError extends RedisCommandError {\n constructor(commandName: string) {\n super(`at least 1 input key is needed for '${commandName}' command`)\n }\n}\n\nexport class WeightNotFloatError extends RedisCommandError {\n constructor() {\n super('weight value is not a float')\n }\n}\n\nexport class CountGreaterThanZeroError extends RedisCommandError {\n constructor() {\n super('count should be greater than 0')\n }\n}\n\nexport class LimitCantBeNegativeError extends RedisCommandError {\n constructor() {\n super(`LIMIT can't be negative`)\n }\n}\n\nexport class StreamLimitRequiresApproxError extends RedisCommandError {\n constructor() {\n super('syntax error, LIMIT cannot be used without the special ~ option')\n }\n}\n\nexport class StreamLimitNegativeError extends RedisCommandError {\n constructor() {\n super('The LIMIT argument must be >= 0.')\n }\n}\n\nexport class InvalidLexRangeError extends RedisCommandError {\n constructor() {\n super('min or max not valid string range item')\n }\n}\n\nexport class ZrangeLimitWithoutByError extends RedisCommandError {\n constructor() {\n super(\n 'syntax error, LIMIT is only supported in combination with either BYSCORE or BYLEX',\n )\n }\n}\n\nexport class ZrangeWithScoresByLexError extends RedisCommandError {\n constructor() {\n super('syntax error, WITHSCORES not supported in combination with BYLEX')\n }\n}\n\nexport class NoScriptError extends RedisCommandError {\n constructor() {\n super('No matching script. Please use EVAL.', 'NOSCRIPT')\n }\n}\n\nexport class ExecWithoutMultiError extends RedisCommandError {\n constructor() {\n super('EXEC without MULTI')\n }\n}\n\nexport class DiscardWithoutMultiError extends RedisCommandError {\n constructor() {\n super('DISCARD without MULTI')\n }\n}\n\nexport class WatchInsideMultiError extends RedisCommandError {\n constructor() {\n super('WATCH inside MULTI is not allowed')\n }\n}\n\nexport class TransactionDiscardedError extends RedisCommandError {\n constructor() {\n super('Transaction discarded because of previous errors.', 'EXECABORT')\n }\n}\n\n/** EXEC itself is malformed (e.g. wrong arity) — discards the transaction immediately. */\nexport class ExecCommandAbortError extends RedisCommandError {\n constructor(reason: string) {\n super(`Transaction discarded because of: ${reason}`, 'EXECABORT')\n }\n}\n\nexport class IndexOutOfRangeError extends RedisCommandError {\n constructor() {\n super('index out of range')\n }\n}\n\nexport class NoSuchKeyError extends RedisCommandError {\n constructor() {\n super('no such key')\n }\n}\n\n/** `COPY src dst` (and `SELECT`) when source and destination resolve to the same object. */\nexport class SameObjectError extends RedisCommandError {\n constructor() {\n super('source and destination objects are the same')\n }\n}\n\n/** A database index outside `0 .. databaseCount - 1` (e.g. `COPY ... DB 99`, `SELECT 99`). */\nexport class DbIndexOutOfRangeError extends RedisCommandError {\n constructor() {\n super('DB index is out of range')\n }\n}\n\nexport class InvalidStreamIdError extends RedisCommandError {\n constructor() {\n super('Invalid stream ID specified as stream command argument')\n }\n}\n\nexport class StreamIdEqualOrSmallerError extends RedisCommandError {\n constructor() {\n super(\n 'The ID specified in XADD is equal or smaller than the target stream top item',\n )\n }\n}\n\nexport class StreamIdNotGreaterThanZeroError extends RedisCommandError {\n constructor() {\n super('The ID specified in XADD must be greater than 0-0')\n }\n}\n\nexport class StreamElementTooLargeError extends RedisCommandError {\n constructor() {\n super('Elements are too large to be stored')\n }\n}\n\nexport class StreamIdExhaustedError extends RedisCommandError {\n constructor() {\n super(\n 'The stream has exhausted the last possible ID, unable to add more items',\n )\n }\n}\n\nexport class HashValueNotIntegerError extends RedisCommandError {\n constructor() {\n super('hash value is not an integer')\n }\n}\n\nexport class HashValueNotFloatError extends RedisCommandError {\n constructor() {\n super('hash value is not a float')\n }\n}\n\nexport class UnknownRedisCommandError extends RedisCommandError {\n constructor(commandName: string | Buffer, args: readonly Buffer[]) {\n const argText = args\n .map(arg => `'${formatUnknownCommandArg(arg)}'`)\n .join(' ')\n const argsSuffix = argText.length > 0 ? `${argText} ` : ''\n super(\n `unknown command '${formatUnknownCommandName(commandName)}', with args beginning with: ${argsSuffix}`,\n )\n }\n}\n\nfunction formatUnknownCommandName(commandName: string | Buffer): string {\n return typeof commandName === 'string'\n ? commandName\n : formatUnknownCommandArg(commandName)\n}\n\nfunction formatUnknownCommandArg(arg: Buffer): string {\n const printable = arg.every(byte => byte >= 0x20 && byte <= 0x7e)\n const value = printable ? arg.toString() : `0x${arg.toString('hex')}`\n\n if (value.length <= 64) {\n return value\n }\n\n return `${value.slice(0, 61)}...`\n}\n","import type { FeatureId, VersionGate } from './profile'\n\nexport const FEATURE_GATES: Record<FeatureId, VersionGate> = {\n 'expire.conditions': { redis: '7.0.0', valkey: '7.2.0' },\n 'set.get': { redis: '6.2.0', valkey: '7.2.0' },\n 'set.nx-get': { redis: '7.0.0', valkey: '7.2.0' },\n 'set.exat-pxat': { redis: '6.2.0', valkey: '7.2.0' },\n 'command.docs': { redis: '7.0.0', valkey: '7.2.0' },\n 'command.getkeysandflags': { redis: '7.0.0', valkey: '7.2.0' },\n 'acl.dryrun': { redis: '7.0.0', valkey: '7.2.0' },\n 'client.no-evict': { redis: '7.0.0', valkey: '7.2.0' },\n 'client.kill.maxage': { redis: '7.4.0', valkey: '9.0.0' },\n 'client.setinfo': { redis: '7.2.0', valkey: '7.2.0' },\n 'client.setinfo.unknown-subcommand-error': {\n redis: '7.0.0',\n valkey: '7.2.0',\n },\n 'info.multi-section': { redis: '7.0.0', valkey: '7.2.0' },\n 'shutdown.now-force-abort': { redis: '7.0.0', valkey: '7.2.0' },\n 'pubsub.sharded': { redis: '7.0.0', valkey: '7.2.0' },\n 'pubsub.resp3-publish-reply-first': { redis: '7.2.0', valkey: '8.0.0' },\n 'stream.xautoclaim-deleted-ids': { redis: '7.0.0', valkey: '7.2.0' },\n // BITCOUNT/BITPOS BYTE|BIT range modifier — Redis 7.0 / Valkey 7.2.\n 'bit.byte-bit-range': { redis: '7.0.0', valkey: '7.2.0' },\n 'hscan.novalues': { redis: '7.4.0', valkey: '9.0.0' },\n 'xread.plus-id': { redis: '7.4.0' },\n 'cluster.multi-db': { valkey: '9.0.0' },\n}\n","import { FEATURE_GATES } from './feature-gates'\n\nexport type RedisFlavor = 'redis' | 'valkey'\n\nexport type VersionGate = { redis?: string; valkey?: string }\n\nexport type FeatureId =\n | 'expire.conditions'\n | 'set.get'\n | 'set.nx-get'\n | 'set.exat-pxat'\n | 'command.docs'\n | 'command.getkeysandflags'\n | 'acl.dryrun'\n | 'client.no-evict'\n | 'client.kill.maxage'\n | 'client.setinfo'\n | 'client.setinfo.unknown-subcommand-error'\n | 'info.multi-section'\n | 'shutdown.now-force-abort'\n | 'pubsub.sharded'\n | 'pubsub.resp3-publish-reply-first'\n | 'stream.xautoclaim-deleted-ids'\n | 'bit.byte-bit-range'\n | 'hscan.novalues'\n | 'xread.plus-id'\n | 'cluster.multi-db'\n\nexport interface CompatibilityProfile {\n readonly flavor: RedisFlavor\n readonly version: string\n readonly versionNum: number\n has(feature: FeatureId): boolean\n}\n\nexport type CompatibilitySpec =\n | CompatibilityProfile\n | { flavor?: RedisFlavor; version?: string }\n | 'redis-6.2'\n | 'redis-7.0'\n | 'redis-7.2'\n | 'redis-7.4'\n | 'redis-8.0'\n | 'valkey-8.0'\n | 'valkey-9.0'\n\nconst PRESETS: Record<\n Exclude<\n CompatibilitySpec,\n CompatibilityProfile | { flavor?: RedisFlavor; version?: string }\n >,\n { flavor: RedisFlavor; version: string }\n> = {\n 'redis-6.2': { flavor: 'redis', version: '6.2.14' },\n 'redis-7.0': { flavor: 'redis', version: '7.0.15' },\n 'redis-7.2': { flavor: 'redis', version: '7.2.4' },\n 'redis-7.4': { flavor: 'redis', version: '7.4.4' },\n 'redis-8.0': { flavor: 'redis', version: '8.0.0' },\n 'valkey-8.0': { flavor: 'valkey', version: '8.0.0' },\n 'valkey-9.0': { flavor: 'valkey', version: '9.0.0' },\n}\n\nconst DEFAULT_SPEC = 'redis-8.0'\n\nexport function parseVersion(version: string): number {\n const [majorRaw, minorRaw = '0', patchRaw = '0'] = version.split('.')\n const major = parseVersionPart(majorRaw, version)\n const minor = parseVersionPart(minorRaw, version)\n const patch = parseVersionPart(patchRaw, version)\n return major * 10000 + minor * 100 + patch\n}\n\nexport function resolveCompatibilityProfile(\n spec: CompatibilitySpec = DEFAULT_SPEC,\n): CompatibilityProfile {\n if (typeof spec === 'object' && 'has' in spec) {\n return spec\n }\n\n if (typeof spec === 'string' && !(spec in PRESETS)) {\n throw new Error(`Unknown compatibility profile ${spec}`)\n }\n\n const resolved = typeof spec === 'string' ? PRESETS[spec] : spec\n const flavor = resolved.flavor ?? 'redis'\n const version = resolved.version ?? PRESETS[DEFAULT_SPEC].version\n const versionNum = parseVersion(version)\n\n return {\n flavor,\n version,\n versionNum,\n has: feature =>\n gateSatisfied(FEATURE_GATES[feature], { flavor, versionNum }),\n }\n}\n\nexport function gateSatisfied(\n gate: VersionGate,\n profile: Pick<CompatibilityProfile, 'flavor' | 'versionNum'>,\n): boolean {\n const minimumVersion = gate[profile.flavor]\n return (\n minimumVersion !== undefined &&\n profile.versionNum >= parseVersion(minimumVersion)\n )\n}\n\nfunction parseVersionPart(raw: string | undefined, version: string): number {\n if (raw === undefined || !/^\\d+$/.test(raw)) {\n throw new Error(`Invalid compatibility version ${version}`)\n }\n return Number(raw)\n}\n","import {\n ExpectedFloatError,\n ExpectedIntegerError,\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from './redis-error'\nimport {\n resolveCompatibilityProfile,\n type CompatibilityProfile,\n} from './compatibility'\n\nexport type ParseContext = {\n commandName: string\n profile: CompatibilityProfile\n}\n\nexport type ParseNodeResult<TValue> = {\n value: TValue\n nextIndex: number\n}\n\nexport interface CommandSchema<TValue> {\n parse(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n ): ParseNodeResult<TValue>\n}\n\nexport type InferSchema<TSchema> =\n TSchema extends CommandSchema<infer TValue> ? TValue : never\n\ntype SchemaShape = Record<string, CommandSchema<unknown>>\n\ntype InferShape<TShape extends SchemaShape> = {\n [K in keyof TShape]: InferSchema<TShape[K]>\n}\n\nconst INTEGER_TOKEN_PATTERN = /^(0|-?[1-9]\\d*)$/\nconst FLOAT_TOKEN_PATTERN =\n /^[+-]?(?:(?:\\d+(?:\\.\\d*)?)|(?:\\.\\d+))(?:[eE][+-]?\\d+)?$/\n\nclass MissingInputError extends Error {\n constructor() {\n super('missing input')\n }\n}\n\nexport class SchemaMismatchError extends Error {\n constructor() {\n super('schema mismatch')\n }\n}\n\nexport function parseCommandArgs<TArgs>(\n schema: CommandSchema<TArgs>,\n input: readonly Buffer[],\n commandName: string,\n profile: CompatibilityProfile = resolveCompatibilityProfile(),\n): TArgs {\n try {\n const result = schema.parse(input, 0, { commandName, profile })\n if (result.nextIndex !== input.length) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n return result.value\n } catch (err) {\n if (err instanceof MissingInputError) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n if (err instanceof SchemaMismatchError) {\n throw new RedisSyntaxError()\n }\n\n throw err\n }\n}\n\nfunction readToken(input: readonly Buffer[], index: number): Buffer {\n const token = input[index]\n if (!token) {\n throw new MissingInputError()\n }\n\n return token\n}\n\nfunction keywordMatches(actual: Buffer, expected: string): boolean {\n return actual.toString().toUpperCase() === expected.toUpperCase()\n}\n\nexport function isIntegerToken(raw: string): boolean {\n return INTEGER_TOKEN_PATTERN.test(raw)\n}\n\nexport function parseFiniteFloatToken(raw: string): number | undefined {\n if (!FLOAT_TOKEN_PATTERN.test(raw)) {\n return undefined\n }\n\n const value = Number(raw)\n if (!Number.isFinite(value)) {\n return undefined\n }\n\n return value\n}\n\nfunction makeSchema<TValue>(\n parse: CommandSchema<TValue>['parse'],\n): CommandSchema<TValue> {\n return { parse }\n}\n\nexport const t = {\n custom<TValue>(parse: CommandSchema<TValue>['parse']): CommandSchema<TValue> {\n return makeSchema(parse)\n },\n\n key(): CommandSchema<Buffer> {\n return t.bulk()\n },\n\n bulk(): CommandSchema<Buffer> {\n return makeSchema((input, index) => ({\n value: readToken(input, index),\n nextIndex: index + 1,\n }))\n },\n\n string(): CommandSchema<string> {\n return makeSchema((input, index) => ({\n value: readToken(input, index).toString(),\n nextIndex: index + 1,\n }))\n },\n\n integer(options?: { min?: number; max?: number }): CommandSchema<number> {\n return makeSchema((input, index) => {\n const raw = readToken(input, index).toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) {\n throw new ExpectedIntegerError()\n }\n\n if (options?.min !== undefined && value < options.min) {\n throw new ExpectedIntegerError()\n }\n\n if (options?.max !== undefined && value > options.max) {\n throw new ExpectedIntegerError()\n }\n\n return { value, nextIndex: index + 1 }\n })\n },\n\n bigInteger(options?: { min?: bigint; max?: bigint }): CommandSchema<bigint> {\n return makeSchema((input, index) => {\n const raw = readToken(input, index).toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = BigInt(raw)\n\n if (options?.min !== undefined && value < options.min) {\n throw new ExpectedIntegerError()\n }\n\n if (options?.max !== undefined && value > options.max) {\n throw new ExpectedIntegerError()\n }\n\n return { value, nextIndex: index + 1 }\n })\n },\n\n float(): CommandSchema<number> {\n return makeSchema((input, index) => {\n const value = parseFiniteFloatToken(readToken(input, index).toString())\n if (value === undefined) {\n throw new ExpectedFloatError()\n }\n\n return { value, nextIndex: index + 1 }\n })\n },\n\n keyword<TKeyword extends string>(\n expected: TKeyword,\n ): CommandSchema<TKeyword> {\n return makeSchema((input, index) => {\n const token = readToken(input, index)\n if (!keywordMatches(token, expected)) {\n throw new SchemaMismatchError()\n }\n\n return { value: expected, nextIndex: index + 1 }\n })\n },\n\n optional<TValue>(\n schema: CommandSchema<TValue>,\n ): CommandSchema<TValue | undefined> {\n return makeSchema((input, index, ctx) => {\n if (index >= input.length) {\n return { value: undefined, nextIndex: index }\n }\n\n try {\n return schema.parse(input, index, ctx)\n } catch (err) {\n if (err instanceof SchemaMismatchError) {\n return { value: undefined, nextIndex: index }\n }\n\n throw err\n }\n })\n },\n\n variadic<TValue>(\n schema: CommandSchema<TValue>,\n options?: { min?: number },\n ): CommandSchema<TValue[]> {\n // Greedy by design for Phase 1. Do not place another positional schema\n // after a variadic field until the parser grows lookahead support.\n return makeSchema((input, index, ctx) => {\n const values: TValue[] = []\n let cursor = index\n\n while (cursor < input.length) {\n const result = schema.parse(input, cursor, ctx)\n values.push(result.value)\n cursor = result.nextIndex\n }\n\n if (options?.min !== undefined && values.length < options.min) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return { value: values, nextIndex: cursor }\n })\n },\n\n object<TShape extends SchemaShape>(\n shape: TShape,\n ): CommandSchema<InferShape<TShape>> {\n return makeSchema((input, index, ctx) => {\n const value: Partial<InferShape<TShape>> = {}\n let cursor = index\n const fields = Object.entries(shape) as Array<\n [keyof TShape, TShape[keyof TShape]]\n >\n\n for (const [name, fieldSchema] of fields) {\n const result = fieldSchema.parse(input, cursor, ctx)\n value[name] = result.value as InferShape<TShape>[keyof TShape]\n cursor = result.nextIndex\n }\n\n return { value: value as InferShape<TShape>, nextIndex: cursor }\n })\n },\n\n union<TValue>(\n schemas: readonly CommandSchema<TValue>[],\n ): CommandSchema<TValue> {\n return makeSchema((input, index, ctx) => {\n let commandError: RedisCommandError | null = null\n\n for (const schema of schemas) {\n try {\n return schema.parse(input, index, ctx)\n } catch (err) {\n if (err instanceof SchemaMismatchError) {\n continue\n }\n\n if (err instanceof RedisCommandError) {\n commandError = err\n }\n }\n }\n\n if (commandError) {\n throw commandError\n }\n\n throw new SchemaMismatchError()\n })\n },\n}\n","export type RedisValue =\n | { kind: 'simple-string'; value: string }\n | { kind: 'bulk-string'; value: Buffer | null }\n | { kind: 'integer'; value: number | bigint }\n | { kind: 'double'; value: number }\n | { kind: 'boolean'; value: boolean }\n | { kind: 'big-number'; value: bigint }\n | { kind: 'verbatim'; format: string; value: Buffer }\n | { kind: 'array'; items: RedisValue[] }\n | { kind: 'set'; items: RedisValue[] }\n | { kind: 'map'; entries: [RedisValue, RedisValue][] }\n | { kind: 'map-pairs'; entries: [RedisValue, RedisValue][] }\n | { kind: 'flat-pairs'; entries: [RedisValue, RedisValue][] }\n | { kind: 'push'; name: string; items: RedisValue[] }\n | { kind: 'null' }\n | { kind: 'null-array' }\n | { kind: 'error'; message: string; code?: string }\n\nexport const RedisValue = {\n simpleString: (value: string): RedisValue => ({\n kind: 'simple-string',\n value,\n }),\n bulkString: (value: Buffer | null): RedisValue => ({\n kind: 'bulk-string',\n value,\n }),\n integer: (value: number | bigint): RedisValue => ({ kind: 'integer', value }),\n double: (value: number): RedisValue => ({ kind: 'double', value }),\n boolean: (value: boolean): RedisValue => ({ kind: 'boolean', value }),\n bigNumber: (value: bigint): RedisValue => ({ kind: 'big-number', value }),\n verbatim: (format: string, value: Buffer): RedisValue => ({\n kind: 'verbatim',\n format,\n value,\n }),\n array: (items: RedisValue[]): RedisValue => ({ kind: 'array', items }),\n set: (items: RedisValue[]): RedisValue => ({ kind: 'set', items }),\n map: (entries: [RedisValue, RedisValue][]): RedisValue => ({\n kind: 'map',\n entries,\n }),\n mapPairs: (entries: [RedisValue, RedisValue][]): RedisValue => ({\n kind: 'map-pairs',\n entries,\n }),\n // Like map-pairs in RESP3 (an array of [k, v] pairs), but a *flat* array\n // [k, v, k, v, ...] in RESP2 — the shape sorted-set WITHSCORES /\n // HRANDFIELD WITHVALUES replies use (flat on RESP2, nested pairs on RESP3).\n flatPairs: (entries: [RedisValue, RedisValue][]): RedisValue => ({\n kind: 'flat-pairs',\n entries,\n }),\n push: (name: string, items: RedisValue[]): RedisValue => ({\n kind: 'push',\n name,\n items,\n }),\n null: (): RedisValue => ({ kind: 'null' }),\n nullArray: (): RedisValue => ({ kind: 'null-array' }),\n error: (message: string, code?: string): RedisValue => ({\n kind: 'error',\n message,\n code,\n }),\n}\n","import { RedisValue } from './redis-value'\n\nexport type RedisResultOptions = {\n close?: boolean\n disconnect?: boolean\n omitReply?: boolean\n afterReply?: () => void\n}\n\nexport class RedisResult {\n constructor(\n public readonly value: RedisValue,\n public readonly options?: RedisResultOptions,\n public readonly encoded?: Buffer,\n ) {}\n\n static create(value: RedisValue, options?: RedisResultOptions): RedisResult {\n return new RedisResult(value, options)\n }\n\n static preEncoded(\n value: RedisValue,\n encoded: Buffer,\n options?: RedisResultOptions,\n ): RedisResult {\n return new RedisResult(value, options, Buffer.from(encoded))\n }\n\n static nil(): RedisResult {\n return new RedisResult(RedisValue.null())\n }\n\n static ok(): RedisResult {\n return new RedisResult(RedisValue.simpleString('OK'))\n }\n\n static error(message: string, code?: string): RedisResult {\n return new RedisResult(RedisValue.error(message, code))\n }\n}\n","import { RedisResult } from './redis-result'\n\n/**\n * Single-reader stream of server-initiated Redis responses.\n *\n * Phase 1 intentionally keeps backpressure out of this interface. A transport\n * owns the single reader and may pause iteration if its underlying connection\n * applies backpressure. Implementations should treat a second `frames()` reader\n * as unsupported unless they document stronger behavior.\n */\nexport interface ResponseStream {\n readonly kind: 'response-stream'\n readonly closed: Promise<void>\n frames(signal: AbortSignal): AsyncIterable<RedisResult>\n close(reason?: string): void\n}\n\nexport function isResponseStream(value: unknown): value is ResponseStream {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n value.kind === 'response-stream'\n )\n}\n","import { CommandDefinition, CommandPlan } from './command-definition'\nimport { CommandRegistry } from './command-registry'\nimport { parseCommandArgs } from './command-schema'\nimport type { ExecutionPolicy } from './execution-policies'\nimport {\n ExecCommandAbortError,\n RedisCommandError,\n UnknownRedisCommandError,\n WrongNumberOfArgumentsError,\n} from './redis-error'\nimport type { RedisExecutionContext } from './redis-context'\nimport { RedisResult } from './redis-result'\nimport { isResponseStream, ResponseStream } from './response-stream'\nimport type { RedisMonitorCommandEvent } from '../state/monitor-feed'\nimport {\n resolveCompatibilityProfile,\n type CompatibilityProfile,\n} from './compatibility'\n\n/**\n * The result of running a command: either a finished {@link RedisResult} or a\n * long-lived {@link ResponseStream} (e.g. SUBSCRIBE / MONITOR) whose frames the\n * transport drains over time.\n */\nexport type ExecutorResult = RedisResult | ResponseStream\n\nexport type RawExecutionResult = {\n result: ExecutorResult\n plan?: CommandPlan\n}\n\nexport type CommandExecutorOptions = {\n registry: CommandRegistry\n policies?: readonly ExecutionPolicy[]\n profile?: CompatibilityProfile\n}\n\n/**\n * Central command pipeline shared by every client session.\n *\n * Responsibilities:\n * 1. Resolve a raw command name to a {@link CommandDefinition} (case-insensitive).\n * 2. Parse raw argument buffers into typed args and extract routing keys,\n * producing a {@link CommandPlan}.\n * 3. Run the configured {@link ExecutionPolicy} chain around the command's own\n * `execute`, giving policies (transaction, cluster, ...) a chance to\n * short-circuit, rewrite, or wrap the result.\n *\n * Two execution paths exist on purpose:\n * - {@link executePlan} / {@link executeRaw} — async, used for real network\n * clients; may return a {@link ResponseStream} and may await async commands.\n * - {@link executePlanSync} — synchronous mirror used by the Lua runtime, where\n * `redis.call` must complete in a single tick. Streams and promises are\n * rejected rather than awaited.\n *\n * The executor is stateless per-call: all mutable state lives on the\n * {@link RedisExecutionContext} (and the session it carries).\n */\nexport class CommandExecutor {\n private readonly registry: CommandRegistry\n private readonly policies: readonly ExecutionPolicy[]\n readonly profile: CompatibilityProfile\n\n constructor(options: CommandExecutorOptions) {\n this.registry = options.registry\n this.policies = options.policies ?? []\n this.profile = options.profile ?? resolveCompatibilityProfile()\n }\n\n getCommandDefinition(name: string): CommandDefinition<unknown> | undefined {\n return this.registry.get(name)\n }\n\n getCommandDefinitions(): readonly CommandDefinition<unknown>[] {\n return this.registry.getAll()\n }\n\n /**\n * Resolve a raw command + args into a {@link CommandPlan} without executing it.\n * The command name is matched case-insensitively against the registry.\n *\n * @throws {UnknownRedisCommandError} if no command is registered under the name.\n */\n plan(rawCommand: Buffer | string, rawArgs: readonly Buffer[]): CommandPlan {\n const commandName = CommandExecutor.normalizeCommandName(rawCommand)\n const definition = this.registry.get(commandName)\n\n if (!definition) {\n throw new UnknownRedisCommandError(rawCommand, rawArgs)\n }\n\n return this.createPlan(definition, rawCommand, rawArgs)\n }\n\n /**\n * Plan and execute a raw command in one step — the normal entry point for a\n * network client.\n *\n * Errors thrown during *planning* (unknown command, arity/parse failures) are\n * caught here and converted into a RESP error reply. Such a failure also marks\n * any open MULTI transaction dirty so a later EXEC is aborted, matching Redis:\n * a command that cannot even be parsed must not silently vanish from the queue.\n * Execution-time errors are handled inside {@link executePlan}.\n */\n async executeRaw(\n rawCommand: Buffer | string,\n rawArgs: readonly Buffer[],\n ctx: RedisExecutionContext,\n ): Promise<ExecutorResult> {\n return (await this.executeRawWithPlan(rawCommand, rawArgs, ctx)).result\n }\n\n async executeRawWithPlan(\n rawCommand: Buffer | string,\n rawArgs: readonly Buffer[],\n ctx: RedisExecutionContext,\n ): Promise<RawExecutionResult> {\n try {\n const plan = this.plan(rawCommand, rawArgs)\n return { plan, result: await this.executePlan(plan, ctx) }\n } catch (err) {\n if (err instanceof RedisCommandError) {\n return {\n result: this.rawCommandErrorResult(err, rawCommand, ctx),\n }\n }\n\n throw err\n }\n }\n\n private static normalizeCommandName(rawCommand: Buffer | string): string {\n return typeof rawCommand === 'string'\n ? rawCommand.toLowerCase()\n : rawCommand.toString().toLowerCase()\n }\n\n private rawCommandErrorResult(\n err: RedisCommandError,\n rawCommand: Buffer | string,\n ctx: RedisExecutionContext,\n ): RedisResult {\n // EXEC itself with bad arity (e.g. `EXEC foo`) discards the transaction\n // immediately and replies EXECABORT, matching Redis' execCommandAbort —\n // distinct from a *queued* command's arity error, which only dirties the\n // transaction for a later, well-formed EXEC.\n if (\n err instanceof WrongNumberOfArgumentsError &&\n ctx.session.mode === 'transaction' &&\n CommandExecutor.normalizeCommandName(rawCommand) === 'exec'\n ) {\n ctx.session.discardTransaction()\n const abortError = new ExecCommandAbortError(err.message)\n return RedisResult.error(abortError.message, abortError.code)\n }\n\n ctx.session.markTransactionDirty()\n return RedisResult.error(err.message, err.code)\n }\n\n /**\n * Run a pre-built plan through the full async pipeline.\n *\n * Order of operations:\n * 1. `beforeExecute` for each policy. The first policy that returns a result\n * short-circuits execution (e.g. the transaction policy queues the command\n * and returns \"+QUEUED\"; the cluster policy returns a MOVED/CROSSSLOT\n * error). A short-circuit error during MULTI also dirties the transaction.\n * 2. The command's own `execute`.\n * 3. If a {@link ResponseStream} is produced, run it through every policy's\n * `onStream` hook; otherwise await the value and run it through every\n * `afterExecute` hook (each may replace the result).\n *\n * Execution-time {@link RedisCommandError}s become RESP error replies (and\n * dirty an open transaction when appropriate). Non-Redis errors propagate.\n */\n async executePlan(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n ): Promise<ExecutorResult> {\n const monitorCtx = createMonitorDeferredContext(ctx)\n const result = await this.executePlanInternal(plan, monitorCtx)\n publishMonitorEvent(plan, monitorCtx, result)\n flushDeferredMonitorEvents(monitorCtx)\n return result\n }\n\n private async executePlanInternal(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n ): Promise<ExecutorResult> {\n try {\n for (const policy of this.policies) {\n const policyResult = await policy.beforeExecute?.(plan, ctx)\n if (policyResult) {\n if (isTransactionQueueError(plan, ctx, policyResult)) {\n ctx.session.markTransactionDirty()\n }\n\n return policyResult\n }\n }\n\n // Tag the database with the active command so keyspace notifications can\n // name write events after the originating command. Saved/restored so\n // nested (Lua redis.call) and parked/interleaved commands stay correct.\n const prevNotifyCommand = ctx.db.activeNotifyCommand\n ctx.db.activeNotifyCommand = plan.definition.name\n try {\n const rawResult = plan.definition.execute(plan.args, ctx)\n\n if (isResponseStream(rawResult)) {\n let finalStream = ensureNonThenableStream(rawResult)\n for (const policy of this.policies) {\n finalStream =\n (await policy.onStream?.(plan, ctx, finalStream)) ?? finalStream\n finalStream = ensureNonThenableStream(finalStream)\n }\n\n return finalStream\n }\n\n const result = await rawResult\n\n let finalResult = result\n for (const policy of this.policies) {\n finalResult =\n (await policy.afterExecute?.(plan, ctx, finalResult)) ?? finalResult\n }\n\n return finalResult\n } finally {\n ctx.db.activeNotifyCommand = prevNotifyCommand\n }\n } catch (err) {\n if (err instanceof RedisCommandError) {\n if (shouldDirtyTransaction(plan, ctx)) {\n ctx.session.markTransactionDirty()\n }\n\n return RedisResult.error(err.message, err.code)\n }\n\n throw err\n }\n }\n\n /**\n * Synchronous counterpart to {@link executePlan}, used by the Lua runtime for\n * `redis.call` / `redis.pcall`. Lua expects each nested command to resolve\n * immediately, so anything that would require awaiting — a command that\n * returns a promise, a {@link ResponseStream}, or an async policy hook — is\n * rejected with a {@link RedisCommandError} instead of being awaited. Async\n * command definitions are rejected before invocation so they cannot leave\n * orphaned work running after the script error (see\n * {@link assertSyncCommandDefinition}, {@link assertSyncCommandResult}, and\n * {@link assertSyncPolicyResult}).\n *\n * The policy chain and transaction-dirty handling otherwise mirror the async\n * path exactly.\n */\n executePlanSync(plan: CommandPlan, ctx: RedisExecutionContext): RedisResult {\n const monitorCtx = createMonitorDeferredContext(ctx)\n const result = this.executePlanSyncInternal(plan, monitorCtx)\n publishMonitorEvent(plan, monitorCtx, result)\n flushDeferredMonitorEvents(monitorCtx)\n return result\n }\n\n private executePlanSyncInternal(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n ): RedisResult {\n try {\n for (const policy of this.policies) {\n const policyResult = assertSyncPolicyResult(\n policy.name,\n 'beforeExecute',\n policy.beforeExecute?.(plan, ctx),\n )\n if (policyResult) {\n if (isTransactionQueueError(plan, ctx, policyResult)) {\n ctx.session.markTransactionDirty()\n }\n\n return policyResult\n }\n }\n\n assertSyncCommandDefinition(plan)\n\n const prevNotifyCommand = ctx.db.activeNotifyCommand\n ctx.db.activeNotifyCommand = plan.definition.name\n try {\n const rawResult = plan.definition.execute(plan.args, ctx)\n const result = assertSyncCommandResult(plan, rawResult)\n\n let finalResult = result\n for (const policy of this.policies) {\n finalResult =\n assertSyncPolicyResult(\n policy.name,\n 'afterExecute',\n policy.afterExecute?.(plan, ctx, finalResult),\n ) ?? finalResult\n }\n\n return finalResult\n } finally {\n ctx.db.activeNotifyCommand = prevNotifyCommand\n }\n } catch (err) {\n if (err instanceof RedisCommandError) {\n if (shouldDirtyTransaction(plan, ctx)) {\n ctx.session.markTransactionDirty()\n }\n\n return RedisResult.error(err.message, err.code)\n }\n\n throw err\n }\n }\n\n /**\n * Build a {@link CommandPlan} from a resolved definition: parse the raw buffers\n * against the command's schema (may throw arity/type errors) and extract the\n * routing keys used for cluster slot validation. Flags are copied onto the plan\n * so policies can inspect them without re-resolving the definition.\n */\n private createPlan<TArgs>(\n definition: CommandDefinition<TArgs>,\n rawCommand: Buffer | string,\n rawArgs: readonly Buffer[],\n ): CommandPlan<TArgs> {\n const args = parseCommandArgs(\n definition.schema,\n rawArgs,\n definition.name,\n this.profile,\n )\n const keys = definition.keys(args)\n\n return {\n definition,\n args,\n keys,\n flags: definition.flags,\n rawCommand: Buffer.from(rawCommand),\n rawArgs: rawArgs.map(arg => Buffer.from(arg)),\n }\n }\n}\n\nfunction publishMonitorEvent(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n result: ExecutorResult,\n): void {\n if (!shouldPublishMonitorEvent(plan, ctx, result)) {\n return\n }\n\n const event: RedisMonitorCommandEvent = {\n timestampMs: Date.now(),\n database: ctx.session.selectedDatabase,\n clientId: ctx.session.id,\n clientAddress: ctx.monitor?.clientAddress ?? ctx.session.clientAddress,\n command: Buffer.from(plan.rawCommand),\n args: redactMonitorArgs(plan),\n }\n\n if (ctx.monitor?.defer && ctx.monitor.deferredEvents) {\n ctx.monitor.deferredEvents.push(event)\n return\n }\n\n ctx.server.monitorFeed.publish(event)\n}\n\nfunction createMonitorDeferredContext(\n ctx: RedisExecutionContext,\n): RedisExecutionContext {\n if (ctx.monitor?.disabled || ctx.monitor?.defer) {\n return ctx\n }\n\n if (ctx.server.monitorFeed.subscriberCount === 0) {\n return ctx\n }\n\n return {\n get db() {\n return ctx.db\n },\n server: ctx.server,\n session: ctx.session,\n executor: ctx.executor,\n ...(ctx.transactionReplay\n ? { transactionReplay: ctx.transactionReplay }\n : {}),\n ...(ctx.nodeRole ? { nodeRole: ctx.nodeRole } : {}),\n monitor: {\n ...ctx.monitor,\n deferredEvents: [],\n },\n signal: ctx.signal,\n park: ctx.park,\n }\n}\n\nfunction flushDeferredMonitorEvents(ctx: RedisExecutionContext): void {\n const events = ctx.monitor?.deferredEvents\n if (!events || ctx.monitor?.defer) {\n return\n }\n\n for (const event of events) {\n ctx.server.monitorFeed.publish(event)\n }\n\n events.length = 0\n}\n\nfunction shouldPublishMonitorEvent(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n result: ExecutorResult,\n): boolean {\n if (ctx.monitor?.disabled) {\n return false\n }\n\n if (ctx.server.monitorFeed.subscriberCount === 0) {\n return false\n }\n\n if (plan.definition.monitor?.skip) {\n return false\n }\n\n if (!(result instanceof RedisResult)) {\n return true\n }\n\n if (isQueuedTransactionCommand(plan, ctx, result)) {\n return false\n }\n\n if (\n result.value.kind === 'error' &&\n CLUSTER_PRE_EXECUTION_ERROR_CODES.has(result.value.code ?? '')\n ) {\n return false\n }\n\n return true\n}\n\nfunction isQueuedTransactionCommand(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n result: RedisResult,\n): boolean {\n return (\n ctx.session.mode === 'transaction' &&\n !plan.flags.includes('transaction') &&\n result.value.kind === 'simple-string' &&\n result.value.value === 'QUEUED'\n )\n}\n\nfunction redactMonitorArgs(plan: CommandPlan): Buffer[] {\n const args =\n plan.definition.monitor?.redactArgs?.(plan.rawArgs) ?? plan.rawArgs\n return args.map(arg => Buffer.from(arg))\n}\n\nconst CLUSTER_PRE_EXECUTION_ERROR_CODES = new Set([\n 'ASK',\n 'CLUSTERDOWN',\n 'CROSSSLOT',\n 'MOVED',\n 'TRYAGAIN',\n])\n\n/**\n * A policy's `onStream` hook may return an object that is both a\n * {@link ResponseStream} and thenable (e.g. an async wrapper). Callers `await`\n * the executor result, and awaiting a thenable stream would unwrap it into its\n * resolved value, breaking streaming. This re-wraps such a stream in a plain,\n * non-thenable object so it survives the surrounding `await` untouched.\n */\nfunction ensureNonThenableStream(stream: ResponseStream): ResponseStream {\n if (!('then' in stream)) {\n return stream\n }\n\n return {\n kind: 'response-stream',\n get closed() {\n return stream.closed\n },\n frames: signal => stream.frames(signal),\n close: reason => stream.close(reason),\n }\n}\n\n/**\n * Guard for the synchronous (Lua) path: a command's result must be a ready\n * {@link RedisResult}. Streaming commands and async commands are not callable\n * from scripts, so a stream is closed and both cases are surfaced as a\n * script-facing {@link RedisCommandError}.\n */\nfunction assertSyncCommandResult(\n plan: CommandPlan,\n result: ReturnType<CommandDefinition['execute']>,\n): RedisResult {\n if (isResponseStream(result)) {\n result.close('Lua redis.call cannot run streaming commands')\n throw new RedisCommandError(\n `${plan.definition.name.toUpperCase()} is not allowed from scripts`,\n )\n }\n\n if (isThenable(result)) {\n throw new RedisCommandError(\n `${plan.definition.name.toUpperCase()} cannot run asynchronously from scripts`,\n )\n }\n\n return result\n}\n\nfunction assertSyncCommandDefinition(plan: CommandPlan): void {\n if (!isAsyncFunction(plan.definition.execute)) {\n return\n }\n\n throw new RedisCommandError(\n `${plan.definition.name.toUpperCase()} cannot run asynchronously from scripts`,\n )\n}\n\n/**\n * Same idea as {@link assertSyncCommandResult} but for policy hooks: an async\n * hook result cannot be awaited on the Lua path, so it is rejected with a\n * descriptive {@link RedisCommandError} naming the offending policy and hook.\n */\nfunction assertSyncPolicyResult<TValue>(\n policyName: string,\n hookName: string,\n value: TValue | Promise<TValue>,\n): TValue {\n if (isThenable(value)) {\n throw new RedisCommandError(\n `Execution policy '${policyName}' ${hookName} hook cannot run asynchronously from scripts`,\n )\n }\n\n return value\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n if (value === null || value === undefined) {\n return false\n }\n\n if (typeof value !== 'object' && typeof value !== 'function') {\n return false\n }\n\n return typeof (value as { then?: unknown }).then === 'function'\n}\n\nfunction isAsyncFunction(value: unknown): boolean {\n return (\n typeof value === 'function' && value.constructor?.name === 'AsyncFunction'\n )\n}\n\n/**\n * True when a policy short-circuit returned an error while queuing a command in\n * MULTI — i.e. the command was rejected at queue time. Redis aborts the whole\n * transaction on EXEC in that case, so the session must be marked dirty.\n */\nfunction isTransactionQueueError(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n result: RedisResult,\n): boolean {\n return shouldDirtyTransaction(plan, ctx) && result.value.kind === 'error'\n}\n\n/**\n * Whether an error on this plan should dirty the current transaction.\n *\n * Only meaningful while the session is in `transaction` mode. Commands flagged\n * `transaction` are the control commands themselves (MULTI/EXEC/DISCARD/WATCH);\n * their errors must not abort the transaction, so they are excluded.\n */\nfunction shouldDirtyTransaction(\n plan: CommandPlan,\n ctx: RedisExecutionContext,\n): boolean {\n return (\n ctx.session.mode === 'transaction' && !plan.flags.includes('transaction')\n )\n}\n","import type { CommandDefinition } from './command-definition'\n\nexport class CommandRegistry {\n private readonly commands = new Map<string, CommandDefinition<unknown>>()\n\n register<TArgs>(\n definition: CommandDefinition<TArgs>,\n options?: { override?: boolean },\n ): void {\n const name = definition.name.toLowerCase()\n if (!options?.override && this.commands.has(name)) {\n throw new Error(`Command '${name}' is already registered`)\n }\n\n this.commands.set(name, definition as CommandDefinition<unknown>)\n }\n\n override<TArgs>(definition: CommandDefinition<TArgs>): void {\n this.register(definition, { override: true })\n }\n\n registerAll(\n definitions: readonly CommandDefinition<unknown>[],\n options?: { override?: boolean },\n ): void {\n for (const definition of definitions) {\n this.register(definition, options)\n }\n }\n\n get(name: string): CommandDefinition<unknown> | undefined {\n return this.commands.get(name.toLowerCase())\n }\n\n has(name: string): boolean {\n return this.commands.has(name.toLowerCase())\n }\n\n getAll(): CommandDefinition<unknown>[] {\n return Array.from(this.commands.values())\n }\n\n getNames(): string[] {\n return Array.from(this.commands.keys())\n }\n}\n","import type { ExecutionPolicy } from './index'\nimport { RedisResult } from '../redis-result'\nimport { RedisValue } from '../redis-value'\n\nexport function createTransactionPolicy(): ExecutionPolicy {\n return {\n name: 'transaction',\n beforeExecute(plan, ctx) {\n if (ctx.session.mode !== 'transaction') {\n return\n }\n\n if (plan.flags.includes('transaction')) {\n return\n }\n\n ctx.session.queueTransaction(plan)\n return RedisResult.create(RedisValue.simpleString('QUEUED'))\n },\n }\n}\n","import type { ExecutionPolicy } from './index'\nimport { NoAuthError } from '../redis-error'\nimport { RedisResult } from '../redis-result'\n\n/**\n * Commands a client may issue before authenticating on a password-protected\n * server. Mirrors Redis' `no-auth` command flag: AUTH/HELLO let the client\n * authenticate, RESET clears connection state, QUIT closes the connection.\n * Everything else (including PING) is rejected with NOAUTH until the client\n * authenticates.\n */\nconst NO_AUTH_COMMANDS = new Set(['auth', 'hello', 'reset', 'quit'])\n\n/**\n * Enforces `requirepass`: when the server is password-protected and the session\n * has not yet authenticated, every command outside {@link NO_AUTH_COMMANDS} is\n * short-circuited with `-NOAUTH Authentication required.`. When no password is\n * configured the policy is a no-op, so the default `nopass` user can run\n * anything.\n */\nexport function createAuthPolicy(): ExecutionPolicy {\n return {\n name: 'auth',\n beforeExecute(plan, ctx) {\n if (!ctx.server.requirepass) {\n return\n }\n\n if (ctx.session.isAuthenticated) {\n return\n }\n\n if (NO_AUTH_COMMANDS.has(plan.definition.name)) {\n return\n }\n\n const error = new NoAuthError()\n return RedisResult.error(error.message, error.code)\n },\n }\n}\n","import type { ExecutionPolicy } from './index'\nimport { RedisResult } from '../redis-result'\n\nexport function createSubscribedModePolicy(): ExecutionPolicy {\n return {\n name: 'subscribed-mode',\n beforeExecute(plan, ctx) {\n if (!ctx.session.usesSubscribedReplyMode) {\n return\n }\n\n if (plan.flags.includes('subscribed')) {\n return\n }\n\n return RedisResult.error(\n `Can't execute '${plan.definition.name}': only (P|S)SUBSCRIBE / (P|S)UNSUBSCRIBE / PING / QUIT / RESET are allowed in this context`,\n 'ERR',\n )\n },\n }\n}\n","import type { ExecutionPolicy } from './index'\nimport type { CommandPlan } from '../command-definition'\nimport {\n RedisClusterDownError,\n RedisCommandError,\n RedisCrossSlotError,\n RedisMovedError,\n} from '../redis-error'\nimport type { RedisClientSession } from '../redis-context'\nimport type { RedisClusterTopology } from '../../state'\n\nexport type ClusterPolicyOptions = {\n localNodeId: string\n topology?: RedisClusterTopology\n}\n\nexport function createClusterPolicy(\n options: ClusterPolicyOptions,\n): ExecutionPolicy {\n const transactionSlots = new WeakMap<RedisClientSession, number>()\n let localNodeChecked = false\n\n return {\n name: 'cluster',\n beforeExecute(plan, ctx) {\n const topology = options.topology ?? ctx.server.clusterTopology\n\n if (!localNodeChecked) {\n if (!topology.getNode(options.localNodeId)) {\n throw new Error(\n `ClusterPolicy localNodeId ${options.localNodeId} is not present in topology`,\n )\n }\n localNodeChecked = true\n }\n\n const capabilities = plan.definition.capabilities\n\n if (capabilities?.clusterMode === 'forbidden') {\n throw new RedisCommandError(\n `${plan.definition.name.toUpperCase()} is not allowed in cluster mode`,\n )\n }\n\n if (capabilities?.clusterMode === 'singleDb') {\n // Cluster mode has a single logical database (0). DB 0 is a no-op and\n // accepted; any non-zero index is rejected like real Redis unless the\n // selected profile models Valkey's cluster multi-DB support.\n const index = (plan.args as { database: number }).database\n if (index !== 0 && !ctx.server.profile.has('cluster.multi-db')) {\n throw new RedisCommandError(\n `${plan.definition.name.toUpperCase()} is not allowed in cluster mode`,\n )\n }\n }\n\n // A transaction boundary resets the per-session pinned slot: 'begin'\n // (MULTI) starts fresh, 'end' (EXEC/DISCARD) releases the pin once the\n // current transaction is over.\n if (\n capabilities?.transactionBoundary === 'begin' &&\n ctx.session.mode !== 'transaction'\n ) {\n transactionSlots.delete(ctx.session)\n }\n\n if (\n capabilities?.transactionBoundary === 'end' &&\n ctx.session.mode === 'transaction'\n ) {\n transactionSlots.delete(ctx.session)\n }\n\n const sortPatternError = getSortClusterPatternError(plan, topology)\n if (sortPatternError) {\n throw sortPatternError\n }\n\n const slot = validateClusterSlot(\n topology,\n options.localNodeId,\n plan.keys,\n {\n allowReplicaRead:\n ctx.session.clusterReadOnly && plan.flags.includes('readonly'),\n },\n )\n\n if (slot === null || ctx.session.mode !== 'transaction') {\n return\n }\n\n const pinnedSlot = transactionSlots.get(ctx.session)\n if (pinnedSlot === undefined) {\n transactionSlots.set(ctx.session, slot)\n return\n }\n\n if (pinnedSlot !== slot) {\n throw new RedisCrossSlotError()\n }\n },\n }\n}\n\nfunction getSortClusterPatternError(\n plan: CommandPlan,\n topology: RedisClusterTopology,\n): RedisCommandError | null {\n if (plan.definition.name !== 'sort' && plan.definition.name !== 'sort_ro') {\n return null\n }\n\n const args = plan.args as {\n key?: unknown\n by?: unknown\n get?: unknown\n }\n if (!Buffer.isBuffer(args.key)) {\n return null\n }\n\n if (\n Buffer.isBuffer(args.by) &&\n sortPatternMayCrossSlot(args.key, args.by, topology)\n ) {\n return new RedisCommandError(\n 'BY option of SORT denied in Cluster mode when keys formed by the pattern may be in different slots.',\n )\n }\n\n const get = Array.isArray(args.get) ? args.get : []\n for (const pattern of get) {\n if (\n Buffer.isBuffer(pattern) &&\n !isSelfSortPattern(pattern) &&\n sortPatternMayCrossSlot(args.key, pattern, topology)\n ) {\n return new RedisCommandError(\n 'GET option of SORT denied in Cluster mode when keys formed by the pattern may be in different slots.',\n )\n }\n }\n\n return null\n}\n\nfunction sortPatternMayCrossSlot(\n source: Buffer,\n pattern: Buffer,\n topology: RedisClusterTopology,\n): boolean {\n if (!pattern.includes(0x2a)) {\n return topology.calculateSlotForKeys([source, pattern]) === -1\n }\n\n const sourceTag = hashTag(source)\n const patternTag = hashTag(pattern)\n return !sourceTag || !patternTag || !sourceTag.equals(patternTag)\n}\n\nfunction hashTag(key: Buffer): Buffer | null {\n const open = key.indexOf(0x7b)\n if (open === -1) {\n return null\n }\n\n const close = key.indexOf(0x7d, open + 1)\n if (close <= open + 1) {\n return null\n }\n\n return key.subarray(open + 1, close)\n}\n\nfunction isSelfSortPattern(pattern: Buffer): boolean {\n return pattern.length === 1 && pattern[0] === 0x23\n}\n\nfunction validateClusterSlot(\n topology: RedisClusterTopology,\n localNodeId: string,\n keys: readonly Buffer[],\n options: { allowReplicaRead?: boolean } = {},\n): number | null {\n const slot = topology.calculateSlotForKeys(keys)\n if (slot === null) {\n return null\n }\n\n if (slot === -1) {\n throw new RedisCrossSlotError()\n }\n\n if (topology.nodeOwnsSlot(localNodeId, slot)) {\n return slot\n }\n\n if (\n options.allowReplicaRead &&\n topology.nodeCanServeReadonlySlot(localNodeId, slot)\n ) {\n return slot\n }\n\n const owner = topology.getSlotOwner(slot)\n if (!owner) {\n throw new RedisClusterDownError()\n }\n\n throw new RedisMovedError(slot, owner.host, owner.port)\n}\n","import type { CommandSchema } from './command-schema'\nimport type { RedisExecutionContext } from './redis-context'\nimport type { RedisResult } from './redis-result'\nimport type { ResponseStream } from './response-stream'\nimport type { VersionGate } from './compatibility'\n\nexport type CommandFlag =\n | 'readonly'\n | 'write'\n | 'denyoom'\n | 'admin'\n | 'noscript'\n | 'random'\n | 'blocking'\n | 'fast'\n | 'movablekeys'\n | 'transaction'\n | 'pubsub'\n | 'subscribed'\n\nexport type CommandCapabilities = {\n blocking?: boolean\n pushOnly?: boolean\n movableKeys?: boolean\n scriptKeys?: boolean\n /**\n * How the command behaves under cluster mode. `'forbidden'` is always\n * rejected; `'singleDb'` is rejected only when it targets a non-zero\n * database. Consumed by `ClusterPolicy` instead of matching command names.\n */\n clusterMode?: 'forbidden' | 'singleDb'\n /**\n * Marks the command as a transaction boundary. `'begin'` opens a transaction\n * (MULTI); `'end'` closes one (EXEC/DISCARD). `ClusterPolicy` uses this to\n * reset the per-session pinned slot instead of matching command names.\n */\n transactionBoundary?: 'begin' | 'end'\n}\n\nexport type CommandMonitorMetadata = {\n skip?: boolean\n redactArgs?: (rawArgs: readonly Buffer[]) => readonly Buffer[]\n}\n\nexport type CommandKeySpec = {\n flags: readonly string[]\n beginSearchIndex: number\n lastKey: number\n keyStep: number\n limit?: number\n notes?: string\n}\n\nexport type CommandDocumentation = {\n summary: string\n since?: string\n group: string\n complexity?: string\n arguments?: readonly CommandDocumentationArgument[]\n}\n\nexport type CommandDocumentationArgument = {\n name: string\n type: string\n keySpecIndex?: number\n token?: string\n flags?: readonly string[]\n}\n\nexport type CommandIntrospection = {\n name?: string\n arity: number\n flags?: readonly string[]\n firstKey?: number\n lastKey?: number\n keyStep?: number\n categories?: readonly string[]\n tips?: readonly string[]\n keySpecs?: readonly CommandKeySpec[]\n subcommands?: readonly CommandIntrospection[]\n docs?: CommandDocumentation\n}\n\nexport type CommandExecutionResult =\n | RedisResult\n | Promise<RedisResult>\n | ResponseStream\n\nexport interface CommandDefinition<TArgs = unknown> {\n readonly name: string\n readonly since?: VersionGate\n readonly schema: CommandSchema<TArgs>\n readonly flags: readonly CommandFlag[]\n readonly capabilities?: CommandCapabilities\n readonly monitor?: CommandMonitorMetadata\n readonly introspection?: CommandIntrospection\n keys(args: TArgs): readonly Buffer[]\n execute(args: TArgs, ctx: RedisExecutionContext): CommandExecutionResult\n}\n\nexport type CommandPlan<TArgs = unknown> = {\n definition: CommandDefinition<TArgs>\n args: TArgs\n keys: readonly Buffer[]\n flags: readonly CommandFlag[]\n rawCommand: Buffer\n rawArgs: readonly Buffer[]\n}\n\nexport function defineCommand<TArgs>(\n definition: CommandDefinition<TArgs>,\n): CommandDefinition<TArgs> {\n return {\n ...definition,\n name: definition.name.toLowerCase(),\n }\n}\n","import { RedisValue } from '../core/redis-value'\nimport { RedisResult } from '../core/redis-result'\nimport { isIntegerToken } from '../core/command-schema'\nimport {\n ExpectedIntegerError,\n InvalidExpireTimeError,\n RedisSyntaxError,\n WrongTypeRedisError,\n} from '../core/redis-error'\nimport type { RedisDataTypeName, RedisDatabase } from '../state'\n\nexport function ok(): RedisResult {\n return RedisResult.ok()\n}\n\nexport function bulk(value: Buffer | null): RedisResult {\n return RedisResult.create(RedisValue.bulkString(value))\n}\n\nexport function integer(value: number | bigint): RedisResult {\n return RedisResult.create(RedisValue.integer(value))\n}\n\nexport function scoreBuffer(score: number): Buffer {\n if (score === Infinity) return Buffer.from('inf')\n if (score === -Infinity) return Buffer.from('-inf')\n return Buffer.from(score.toString())\n}\n\n// A sorted-set score reply. Protocol-aware: a bulk string on RESP2 (matching\n// scoreBuffer) and a `,double` on RESP3 — the shape real Redis uses for\n// ZSCORE/ZINCRBY/WITHSCORES scores. `-0` is normalized to `0` like Redis.\nexport function scoreValue(score: number): RedisValue {\n return RedisValue.double(Object.is(score, -0) ? 0 : score)\n}\n\n// member/score pairs for WITHSCORES-style replies: flat [m, s, ...] on RESP2,\n// nested [[m, s], ...] on RESP3, with scores as RESP3 doubles.\nexport function scorePairs(\n members: readonly { member: Buffer; score: number }[],\n): RedisValue {\n return RedisValue.flatPairs(\n members.map(entry => [\n RedisValue.bulkString(entry.member),\n scoreValue(entry.score),\n ]),\n )\n}\n\nexport function simpleString(value: string): RedisResult {\n return RedisResult.create(RedisValue.simpleString(value))\n}\n\nexport function array(items: RedisValue[]): RedisResult {\n return RedisResult.create(RedisValue.array(items))\n}\n\nexport function ensureStringOrMissing(\n db: RedisDatabase,\n key: Buffer,\n): Buffer | null {\n const type = db.getType(key)\n if (type === null) {\n return null\n }\n\n if (type !== 'string') {\n throw new WrongTypeRedisError()\n }\n\n return db.getString(key)\n}\n\nexport function typeName(type: RedisDataTypeName | null): string {\n return type ?? 'none'\n}\n\nexport function ttlSeconds(expiresAt: number): number {\n // Redis rounds remaining time to the nearest second ((ms+500)/1000),\n // not ceil/floor — matches EXPIRETIME and real TTL behavior.\n return Math.max(0, Math.round((expiresAt - Date.now()) / 1000))\n}\n\nexport function ttlMilliseconds(expiresAt: number): number {\n return Math.max(0, expiresAt - Date.now())\n}\n\nexport function parseIntegerToken(token: Buffer): number {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) {\n throw new ExpectedIntegerError()\n }\n\n return value\n}\n\nexport const INT64_MAX = 9223372036854775807n\nexport const INT64_MIN = -9223372036854775808n\n\n// Parse a stored token as a signed 64-bit integer, matching Redis' int64\n// semantics for INCR/DECR. Unlike parseIntegerToken this keeps full precision\n// above 2^53 and rejects values outside the int64 range.\nexport function parseInt64Token(token: Buffer): bigint {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = BigInt(raw)\n if (value < INT64_MIN || value > INT64_MAX) {\n throw new ExpectedIntegerError()\n }\n\n return value\n}\n\nexport function parsePositiveExpireToken(\n token: Buffer,\n commandName: string,\n): number {\n const value = parseIntegerToken(token)\n if (value <= 0) {\n throw new InvalidExpireTimeError(commandName)\n }\n\n return value\n}\n\nexport function requireNextOptionValue(\n args: readonly Buffer[],\n index: number,\n): Buffer {\n const value = args[index]\n if (!value) {\n throw new RedisSyntaxError()\n }\n\n return value\n}\n","import { defineCommand } from '../core/command-definition'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport {\n isIntegerToken,\n t,\n type CommandSchema,\n type ParseContext,\n} from '../core/command-schema'\nimport {\n BitOffsetError,\n BitOpNotSingleKeyError,\n BitPosBitError,\n BitValueError,\n BitfieldOverflowTypeError,\n BitfieldRoGetOnlyError,\n BitfieldTypeError,\n ExpectedIntegerError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport { ensureStringOrMissing, INT64_MAX, INT64_MIN, integer } from './helpers'\n\n// The highest addressable bit. Redis caps a bit offset's *start byte* at\n// proto-max-bulk-len (512MB) — i.e. the offset itself must be < 2^32 bits.\n// A field may still spill one type-width past this, growing the buffer.\nconst MAX_BIT_OFFSET = 0x1_0000_0000\n\nconst EMPTY = Buffer.alloc(0)\n\n// --- shared bit helpers ----------------------------------------------------\n\nfunction getBit(buf: Buffer, bitIndex: number): number {\n const byteIndex = bitIndex >>> 3\n if (byteIndex >= buf.length) {\n return 0\n }\n return (buf[byteIndex]! >> (7 - (bitIndex & 7))) & 1\n}\n\nfunction byteAt(buf: Buffer, index: number): number {\n return index < buf.length ? buf[index]! : 0\n}\n\nfunction parseBitOffset(token: Buffer | undefined): number {\n if (!token) {\n throw new BitOffsetError()\n }\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new BitOffsetError()\n }\n const value = Number(raw)\n if (!Number.isSafeInteger(value) || value < 0 || value >= MAX_BIT_OFFSET) {\n throw new BitOffsetError()\n }\n return value\n}\n\nfunction parseRangeIndex(token: Buffer): number {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) {\n throw new ExpectedIntegerError()\n }\n return value\n}\n\n// Normalize a [start, end] range (Redis semantics, shared by BITCOUNT/BITPOS).\n// `size` is the number of addressable units (bytes for BYTE mode, bits for BIT\n// mode). Returns null when the range is empty.\nfunction resolveRange(\n start: number,\n end: number,\n size: number,\n): [first: number, last: number] | null {\n if (start < 0 && end < 0 && start > end) {\n return null\n }\n if (start < 0) start = size + start\n if (end < 0) end = size + end\n if (start < 0) start = 0\n if (end < 0) end = 0\n if (end >= size) end = size - 1\n if (start > end) {\n return null\n }\n return [start, end]\n}\n\n// Count set bits within the inclusive bit range [firstBit, lastBit].\n// ponytail: naive per-bit scan, O(bits). A byte-wise popcount table would be\n// faster for multi-MB bitmaps, but this mock isn't sized for those.\nfunction countBits(buf: Buffer, firstBit: number, lastBit: number): number {\n let count = 0\n for (let i = firstBit; i <= lastBit; i++) {\n count += getBit(buf, i)\n }\n return count\n}\n\n// --- SETBIT / GETBIT -------------------------------------------------------\n\ntype SetBitArgs = { key: Buffer; offset: number; value: number }\n\nexport const setbitCommand = defineCommand({\n name: 'setbit',\n schema: t.custom(\n (input, index, ctx): { value: SetBitArgs; nextIndex: number } => {\n if (input.length - index !== 3) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const offset = parseBitOffset(input[index + 1])\n const valueRaw = input[index + 2]!.toString()\n if (valueRaw !== '0' && valueRaw !== '1') {\n throw new BitValueError()\n }\n return {\n value: { key: input[index]!, offset, value: Number(valueRaw) },\n nextIndex: index + 3,\n }\n },\n ),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n const byteIndex = args.offset >>> 3\n const bitMask = 1 << (7 - (args.offset & 7))\n\n const current = existing ?? EMPTY\n const requiredSize = byteIndex + 1\n const target =\n requiredSize > current.length ? Buffer.alloc(requiredSize) : current\n if (target !== current) {\n current.copy(target, 0)\n }\n\n const oldBit = (target[byteIndex]! & bitMask) === 0 ? 0 : 1\n if (args.value === 1) {\n target[byteIndex]! |= bitMask\n } else {\n target[byteIndex]! &= ~bitMask\n }\n\n ctx.db.setString(args.key, target, { keepTtl: true })\n return integer(oldBit)\n },\n})\n\ntype GetBitArgs = { key: Buffer; offset: number }\n\nexport const getbitCommand = defineCommand({\n name: 'getbit',\n schema: t.custom(\n (input, index, ctx): { value: GetBitArgs; nextIndex: number } => {\n if (input.length - index !== 2) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return {\n value: { key: input[index]!, offset: parseBitOffset(input[index + 1]) },\n nextIndex: index + 2,\n }\n },\n ),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (!existing) {\n return integer(0)\n }\n return integer(getBit(existing, args.offset))\n },\n})\n\n// --- BITCOUNT --------------------------------------------------------------\n\ntype BitRange = { start: number; end: number; bit: boolean }\ntype BitCountArgs = { key: Buffer; range?: BitRange }\n\nexport const bitcountCommand = defineCommand({\n name: 'bitcount',\n schema: t.custom(\n (input, index, ctx): { value: BitCountArgs; nextIndex: number } => {\n const key = input[index]\n if (!key) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const extra = input.length - index - 1\n if (extra === 0) {\n return { value: { key }, nextIndex: input.length }\n }\n if (extra !== 2 && extra !== 3) {\n throw new RedisSyntaxError()\n }\n const start = parseRangeIndex(input[index + 1]!)\n const end = parseRangeIndex(input[index + 2]!)\n const bit = parseRangeUnit(input[index + 3], extra === 3, ctx)\n return {\n value: { key, range: { start, end, bit } },\n nextIndex: input.length,\n }\n },\n ),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (!existing || existing.length === 0) {\n return integer(0)\n }\n if (!args.range) {\n return integer(countBits(existing, 0, existing.length * 8 - 1))\n }\n\n const { start, end, bit } = args.range\n const size = bit ? existing.length * 8 : existing.length\n const resolved = resolveRange(start, end, size)\n if (!resolved) {\n return integer(0)\n }\n const [first, last] = resolved\n const firstBit = bit ? first : first * 8\n const lastBit = bit ? last : last * 8 + 7\n return integer(countBits(existing, firstBit, lastBit))\n },\n})\n\n// --- BITPOS ----------------------------------------------------------------\n\ntype BitPosArgs = {\n key: Buffer\n bit: number\n start?: number\n end?: number\n endGiven: boolean\n bitMode: boolean\n}\n\nexport const bitposCommand = defineCommand({\n name: 'bitpos',\n schema: t.custom(\n (input, index, ctx): { value: BitPosArgs; nextIndex: number } => {\n const key = input[index]\n const bitToken = input[index + 1]\n if (!key || !bitToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const bitRaw = bitToken.toString()\n if (bitRaw !== '0' && bitRaw !== '1') {\n throw new BitPosBitError()\n }\n const extra = input.length - index - 2\n if (extra > 3) {\n throw new RedisSyntaxError()\n }\n const args: BitPosArgs = {\n key,\n bit: Number(bitRaw),\n endGiven: extra >= 2,\n bitMode: false,\n }\n if (extra >= 1) {\n args.start = parseRangeIndex(input[index + 2]!)\n }\n if (extra >= 2) {\n args.end = parseRangeIndex(input[index + 3]!)\n }\n args.bitMode = parseRangeUnit(input[index + 4], extra === 3, ctx)\n return { value: args, nextIndex: input.length }\n },\n ),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (!existing || existing.length === 0) {\n // Missing/empty key reads as all-zero: a clear bit is at position 0, a\n // set bit is never found.\n return integer(args.bit === 0 ? 0 : -1)\n }\n\n const totalBits = existing.length * 8\n let firstBit: number\n let lastBit: number\n if (args.start === undefined) {\n firstBit = 0\n lastBit = totalBits - 1\n } else {\n const size = args.bitMode ? totalBits : existing.length\n const end = args.end ?? -1\n const resolved = resolveRange(args.start, end, size)\n if (!resolved) {\n return integer(-1)\n }\n const [first, last] = resolved\n firstBit = args.bitMode ? first : first * 8\n lastBit = args.bitMode ? last : last * 8 + 7\n }\n\n for (let i = firstBit; i <= lastBit; i++) {\n if (getBit(existing, i) === args.bit) {\n return integer(i)\n }\n }\n // Not found. When looking for a clear bit without an explicit end, the\n // string is treated as zero-padded on the right, so the answer is the\n // first bit past the searched range.\n if (args.bit === 0 && !args.endGiven) {\n return integer(lastBit + 1)\n }\n return integer(-1)\n },\n})\n\n// Parse the optional BYTE|BIT modifier shared by BITCOUNT/BITPOS. Returns true\n// for BIT mode, false for BYTE mode. The modifier is gated to Redis 7.0+; on\n// older profiles an unrecognized trailing token is a plain syntax error.\nfunction parseRangeUnit(\n token: Buffer | undefined,\n present: boolean,\n ctx: ParseContext,\n): boolean {\n if (!present) {\n return false\n }\n if (!ctx.profile.has('bit.byte-bit-range')) {\n throw new RedisSyntaxError()\n }\n const unit = token!.toString().toUpperCase()\n if (unit === 'BYTE') return false\n if (unit === 'BIT') return true\n throw new RedisSyntaxError()\n}\n\n// --- BITOP -----------------------------------------------------------------\n\ntype BitOp = 'AND' | 'OR' | 'XOR' | 'NOT'\ntype BitOpArgs = { op: BitOp; destKey: Buffer; sourceKeys: Buffer[] }\n\nexport const bitopCommand = defineCommand({\n name: 'bitop',\n schema: t.custom(\n (input, index, ctx): { value: BitOpArgs; nextIndex: number } => {\n const opToken = input[index]\n const destKey = input[index + 1]\n const sourceKeys = input.slice(index + 2)\n if (!opToken || !destKey || sourceKeys.length === 0) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const op = opToken.toString().toUpperCase()\n if (op !== 'AND' && op !== 'OR' && op !== 'XOR' && op !== 'NOT') {\n throw new RedisSyntaxError()\n }\n if (op === 'NOT' && sourceKeys.length !== 1) {\n throw new BitOpNotSingleKeyError()\n }\n return {\n value: { op, destKey, sourceKeys },\n nextIndex: input.length,\n }\n },\n ),\n flags: ['write', 'denyoom'],\n keys: args => [args.destKey, ...args.sourceKeys],\n execute: (args, ctx) => {\n const sources = args.sourceKeys.map(\n key => ensureStringOrMissing(ctx.db, key) ?? EMPTY,\n )\n const maxLen = sources.reduce((max, buf) => Math.max(max, buf.length), 0)\n\n if (maxLen === 0) {\n ctx.db.delete(args.destKey)\n return integer(0)\n }\n\n const result = Buffer.alloc(maxLen)\n if (args.op === 'NOT') {\n const src = sources[0]!\n for (let i = 0; i < maxLen; i++) {\n result[i] = ~byteAt(src, i) & 0xff\n }\n } else {\n for (let i = 0; i < maxLen; i++) {\n let acc = byteAt(sources[0]!, i)\n for (let j = 1; j < sources.length; j++) {\n const value = byteAt(sources[j]!, i)\n if (args.op === 'AND') acc &= value\n else if (args.op === 'OR') acc |= value\n else acc ^= value\n }\n result[i] = acc\n }\n }\n\n ctx.db.setString(args.destKey, result)\n return integer(maxLen)\n },\n})\n\n// --- BITFIELD / BITFIELD_RO ------------------------------------------------\n\ntype FieldType = { signed: boolean; bits: number }\ntype Overflow = 'WRAP' | 'SAT' | 'FAIL'\ntype BitFieldOp =\n | { kind: 'GET'; type: FieldType; offset: number }\n | {\n kind: 'SET'\n type: FieldType\n offset: number\n operand: bigint\n overflow: Overflow\n }\n | {\n kind: 'INCRBY'\n type: FieldType\n offset: number\n operand: bigint\n overflow: Overflow\n }\ntype BitFieldArgs = { key: Buffer; ops: BitFieldOp[] }\n\nfunction parseFieldType(token: Buffer | undefined): FieldType {\n if (!token) {\n throw new RedisSyntaxError()\n }\n const match = /^([iu])(\\d+)$/.exec(token.toString())\n if (!match) {\n throw new BitfieldTypeError()\n }\n const signed = match[1] === 'i'\n const bits = Number(match[2])\n const maxBits = signed ? 64 : 63\n if (bits < 1 || bits > maxBits) {\n throw new BitfieldTypeError()\n }\n return { signed, bits }\n}\n\nfunction parseFieldOffset(token: Buffer | undefined, bits: number): number {\n if (!token) {\n throw new RedisSyntaxError()\n }\n let raw = token.toString()\n const useWidth = raw.startsWith('#')\n if (useWidth) {\n raw = raw.slice(1)\n }\n if (!isIntegerToken(raw)) {\n throw new BitOffsetError()\n }\n const n = Number(raw)\n if (!Number.isSafeInteger(n) || n < 0) {\n throw new BitOffsetError()\n }\n const offset = useWidth ? n * bits : n\n if (offset >= MAX_BIT_OFFSET) {\n throw new BitOffsetError()\n }\n return offset\n}\n\nfunction parseFieldValue(token: Buffer | undefined): bigint {\n if (!token) {\n throw new RedisSyntaxError()\n }\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n const value = BigInt(raw)\n if (value < INT64_MIN || value > INT64_MAX) {\n throw new ExpectedIntegerError()\n }\n return value\n}\n\nfunction parseBitFieldOps(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n readonly: boolean,\n): { value: BitFieldArgs; nextIndex: number } {\n const key = input[index]\n if (!key) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const ops: BitFieldOp[] = []\n let overflow: Overflow = 'WRAP'\n let cursor = index + 1\n\n while (cursor < input.length) {\n const sub = input[cursor]!.toString().toUpperCase()\n\n if (sub === 'OVERFLOW') {\n const modeToken = input[cursor + 1]\n if (!modeToken) {\n throw new RedisSyntaxError()\n }\n const mode = modeToken.toString().toUpperCase()\n if (mode !== 'WRAP' && mode !== 'SAT' && mode !== 'FAIL') {\n throw new BitfieldOverflowTypeError()\n }\n overflow = mode\n cursor += 2\n continue\n }\n\n if (sub === 'GET') {\n const type = parseFieldType(input[cursor + 1])\n const offset = parseFieldOffset(input[cursor + 2], type.bits)\n ops.push({ kind: 'GET', type, offset })\n cursor += 3\n continue\n }\n\n if (sub === 'SET' || sub === 'INCRBY') {\n if (readonly) {\n throw new BitfieldRoGetOnlyError()\n }\n const type = parseFieldType(input[cursor + 1])\n const offset = parseFieldOffset(input[cursor + 2], type.bits)\n const operand = parseFieldValue(input[cursor + 3])\n ops.push({ kind: sub, type, offset, operand, overflow })\n cursor += 4\n continue\n }\n\n if (readonly) {\n throw new BitfieldRoGetOnlyError()\n }\n throw new RedisSyntaxError()\n }\n\n return { value: { key, ops }, nextIndex: input.length }\n}\n\nfunction readField(buf: Buffer, offset: number, type: FieldType): bigint {\n let value = 0n\n for (let i = 0; i < type.bits; i++) {\n value = (value << 1n) | BigInt(getBit(buf, offset + i))\n }\n if (type.signed && value & (1n << BigInt(type.bits - 1))) {\n value -= 1n << BigInt(type.bits)\n }\n return value\n}\n\nfunction writeField(\n buf: Buffer,\n offset: number,\n type: FieldType,\n value: bigint,\n): void {\n const stored = value & ((1n << BigInt(type.bits)) - 1n)\n for (let i = 0; i < type.bits; i++) {\n const bit = Number((stored >> BigInt(type.bits - 1 - i)) & 1n)\n const bitIndex = offset + i\n const byteIndex = bitIndex >>> 3\n const mask = 1 << (7 - (bitIndex & 7))\n if (bit) {\n buf[byteIndex]! |= mask\n } else {\n buf[byteIndex]! &= ~mask\n }\n }\n}\n\n// Apply the overflow policy. Returns the value to store (and reply with), or\n// null when an overflow occurs under FAIL.\nfunction applyOverflow(\n value: bigint,\n type: FieldType,\n mode: Overflow,\n): bigint | null {\n const min = type.signed ? -(1n << BigInt(type.bits - 1)) : 0n\n const max = type.signed\n ? (1n << BigInt(type.bits - 1)) - 1n\n : (1n << BigInt(type.bits)) - 1n\n\n if (value >= min && value <= max) {\n return value\n }\n if (mode === 'FAIL') {\n return null\n }\n if (mode === 'SAT') {\n return value > max ? max : min\n }\n // WRAP: modular reduction into [min, max].\n const range = 1n << BigInt(type.bits)\n return ((((value - min) % range) + range) % range) + min\n}\n\nfunction executeBitField(\n args: BitFieldArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n const hasWrite = args.ops.some(op => op.kind !== 'GET')\n\n let buf = existing ? Buffer.from(existing) : Buffer.alloc(0)\n // Pre-grow once to fit every write op — Redis grows the key even for an op\n // that ultimately FAILs its overflow check.\n let maxBytes = buf.length\n for (const op of args.ops) {\n if (op.kind === 'GET') continue\n const need = Math.ceil((op.offset + op.type.bits) / 8)\n if (need > maxBytes) maxBytes = need\n }\n if (maxBytes > buf.length) {\n const grown = Buffer.alloc(maxBytes)\n buf.copy(grown, 0)\n buf = grown\n }\n\n const results: RedisValue[] = []\n for (const op of args.ops) {\n if (op.kind === 'GET') {\n results.push(RedisValue.integer(readField(buf, op.offset, op.type)))\n continue\n }\n if (op.kind === 'SET') {\n const old = readField(buf, op.offset, op.type)\n const next = applyOverflow(op.operand, op.type, op.overflow)\n if (next === null) {\n results.push(RedisValue.null())\n continue\n }\n writeField(buf, op.offset, op.type, next)\n results.push(RedisValue.integer(old))\n } else {\n const current = readField(buf, op.offset, op.type)\n const next = applyOverflow(current + op.operand, op.type, op.overflow)\n if (next === null) {\n results.push(RedisValue.null())\n continue\n }\n writeField(buf, op.offset, op.type, next)\n results.push(RedisValue.integer(next))\n }\n }\n\n if (hasWrite) {\n ctx.db.setString(args.key, buf, { keepTtl: true })\n }\n return RedisResult.create(RedisValue.array(results))\n}\n\nfunction bitFieldSchema(readonly: boolean): CommandSchema<BitFieldArgs> {\n return t.custom((input, index, ctx) =>\n parseBitFieldOps(input, index, ctx, readonly),\n )\n}\n\nexport const bitfieldCommand = defineCommand({\n name: 'bitfield',\n schema: bitFieldSchema(false),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: executeBitField,\n})\n\nexport const bitfieldRoCommand = defineCommand({\n name: 'bitfield_ro',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: bitFieldSchema(true),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: executeBitField,\n})\n\nexport const bitmapsCommands = [\n setbitCommand,\n getbitCommand,\n bitcountCommand,\n bitposCommand,\n bitopCommand,\n bitfieldCommand,\n bitfieldRoCommand,\n]\n","import type {\n CommandDocumentation,\n CommandDocumentationArgument,\n CommandIntrospection,\n CommandKeySpec,\n} from '../core/command-definition'\n\nexport function commandKeySpec(\n beginSearchIndex: number,\n lastKey: number,\n keyStep: number,\n flags: readonly string[],\n options?: { notes?: string },\n): CommandKeySpec {\n return {\n flags,\n beginSearchIndex,\n lastKey,\n keyStep,\n notes: options?.notes,\n }\n}\n\nexport function commandDocs(\n summary: string,\n group: string,\n args: readonly CommandDocumentationArgument[] = [],\n options?: { since?: string; complexity?: string },\n): CommandDocumentation {\n return {\n summary,\n since: options?.since ?? '1.0.0',\n group,\n complexity: options?.complexity ?? 'O(1)',\n arguments: args,\n }\n}\n\nexport function commandKeyArgument(\n name: string,\n keySpecIndex: number,\n options?: { flags?: readonly string[] },\n): CommandDocumentationArgument {\n return {\n name,\n type: 'key',\n keySpecIndex,\n flags: options?.flags,\n }\n}\n\nexport function commandSubcommandInfo(\n name: string,\n arity: number,\n options?: {\n flags?: readonly string[]\n categories?: readonly string[]\n tips?: readonly string[]\n },\n): CommandIntrospection {\n return {\n name,\n arity,\n flags: options?.flags ?? ['loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: options?.categories ?? ['@slow', '@connection'],\n tips: options?.tips ?? [],\n keySpecs: [],\n docs: {\n summary: name,\n group: commandGroupFromName(name),\n },\n }\n}\n\nfunction commandGroupFromName(name: string): string {\n const separator = name.indexOf('|')\n return separator === -1 ? 'generic' : name.slice(0, separator)\n}\n","import {\n defineCommand,\n type CommandDefinition,\n type CommandDocumentation,\n type CommandDocumentationArgument,\n type CommandIntrospection,\n type CommandKeySpec,\n} from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport {\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport type { FeatureId } from '../core/compatibility'\nimport { commandDocs, commandSubcommandInfo } from './introspection'\n\ntype CommandArgs = {\n subcommand?: string\n args: Buffer[]\n}\n\ntype CommandInfo = {\n name: string\n arity: number\n flags: readonly string[]\n firstKey: number\n lastKey: number\n keyStep: number\n categories: readonly string[]\n tips: readonly string[]\n keySpecs: readonly CommandKeySpec[]\n subcommands: readonly CommandInfo[]\n docs?: CommandDocumentation\n}\n\nconst SUBCOMMAND_FEATURES: Record<string, FeatureId> = {\n 'acl|dryrun': 'acl.dryrun',\n 'command|docs': 'command.docs',\n 'command|getkeysandflags': 'command.getkeysandflags',\n 'client|no-evict': 'client.no-evict',\n 'client|setinfo': 'client.setinfo',\n 'pubsub|shardchannels': 'pubsub.sharded',\n 'pubsub|shardnumsub': 'pubsub.sharded',\n}\n\nconst commandIntrospection: CommandIntrospection = {\n arity: -1,\n flags: ['loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@connection'],\n tips: ['nondeterministic_output_order'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('command|docs', -2, {\n tips: ['nondeterministic_output_order'],\n }),\n commandSubcommandInfo('command|getkeys', -4),\n commandSubcommandInfo('command|getkeysandflags', -4),\n commandSubcommandInfo('command|info', -2, {\n tips: ['nondeterministic_output_order'],\n }),\n commandSubcommandInfo('command|count', 2),\n commandSubcommandInfo('command|list', -2, {\n tips: ['nondeterministic_output_order'],\n }),\n commandSubcommandInfo('command|help', 2),\n ],\n docs: commandDocs('Return details about Redis commands', 'connection', [], {\n since: '2.8.13',\n complexity: 'O(N) where N is the total number of Redis commands',\n }),\n}\n\nexport const commandCommand = defineCommand({\n name: 'command',\n schema: t.object({\n subcommand: t.optional(t.string()),\n args: t.variadic(t.bulk()),\n }),\n flags: ['readonly'],\n introspection: commandIntrospection,\n keys: () => [],\n execute: (args, ctx) => {\n if (args.subcommand === undefined) {\n expectArgCount('command', args.args, 0)\n return commandInfo(allRootCommandInfos(ctx))\n }\n\n switch (args.subcommand.toLowerCase()) {\n case 'count':\n return commandCount(args, ctx)\n case 'list':\n return commandList(args, ctx)\n case 'info':\n return commandInfoSubcommand(args, ctx)\n case 'docs':\n if (!ctx.server.profile.has('command.docs')) {\n throw commandSubcommandError(args.subcommand)\n }\n return commandDocsSubcommand(args, ctx)\n case 'getkeys':\n return commandGetKeys(args, ctx)\n case 'getkeysandflags':\n if (!ctx.server.profile.has('command.getkeysandflags')) {\n throw commandSubcommandError(args.subcommand)\n }\n return commandGetKeysAndFlags(args, ctx)\n case 'help':\n return commandHelp(args, ctx)\n default:\n throw new RedisCommandError(\n `unknown subcommand '${args.subcommand}'. Try COMMAND HELP.`,\n )\n }\n },\n})\n\nfunction commandSubcommandError(subcommand: string): RedisCommandError {\n return new RedisCommandError(\n `Unknown subcommand or wrong number of arguments for '${subcommand}'. Try COMMAND HELP.`,\n )\n}\n\nfunction commandCount(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n expectArgCount('command|count', args.args, 0)\n return RedisResult.create(RedisValue.integer(allCommandInfos(ctx).length))\n}\n\nfunction commandList(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n let names = allCommandInfos(ctx).map(info => info.name)\n\n if (args.args.length > 0) {\n if (\n args.args.length !== 3 ||\n !equalsAscii(args.args[0], 'filterby') ||\n (!equalsAscii(args.args[1], 'pattern') &&\n !equalsAscii(args.args[1], 'module'))\n ) {\n throw new RedisSyntaxError()\n }\n\n if (equalsAscii(args.args[1], 'module')) {\n names = []\n } else {\n const pattern = args.args[2].toString()\n names = names.filter(name => globMatches(pattern, name))\n }\n }\n\n return RedisResult.create(RedisValue.array(names.map(bulkString)))\n}\n\nfunction commandInfoSubcommand(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.args.length === 0) {\n return commandInfo(allRootCommandInfos(ctx))\n }\n\n return commandInfo(\n args.args.map(name => findCommandInfo(ctx, name.toString())),\n true,\n )\n}\n\nfunction commandDocsSubcommand(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const infos =\n args.args.length === 0\n ? allCommandInfos(ctx)\n : args.args\n .map(name => findCommandInfo(ctx, name.toString()))\n .filter((info): info is CommandInfo => info !== null)\n\n const entries: [RedisValue, RedisValue][] = []\n for (const info of infos) {\n if (!info.docs) {\n continue\n }\n\n entries.push([bulkString(info.name), formatDocs(info.docs)])\n }\n\n return RedisResult.create(RedisValue.map(entries))\n}\n\nfunction commandGetKeys(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const { keys } = planCommandKeys(args, ctx, 'command|getkeys')\n return RedisResult.create(RedisValue.array(keys.map(key => bulk(key))))\n}\n\nfunction commandGetKeysAndFlags(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const { definition, keys } = planCommandKeys(\n args,\n ctx,\n 'command|getkeysandflags',\n )\n const flags = keyAccessFlags(definition)\n return RedisResult.create(\n RedisValue.array(\n keys.map(key => RedisValue.array([bulk(key), RedisValue.array(flags)])),\n ),\n )\n}\n\nfunction commandHelp(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n expectArgCount('command|help', args.args, 0)\n const lines = [\n 'COMMAND <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n '(no subcommand)',\n ' Return details about all Redis commands.',\n 'COUNT',\n ' Return the total number of commands in this Redis server.',\n 'LIST',\n ' Return a list of all commands in this Redis server.',\n 'INFO [<command-name> ...]',\n ' Return details about multiple Redis commands.',\n ' If no command names are given, documentation details for all',\n ' commands are returned.',\n ]\n\n if (ctx.server.profile.has('command.docs')) {\n lines.push(\n 'DOCS [<command-name> ...]',\n ' Return documentation details about multiple Redis commands.',\n ' If no command names are given, documentation details for all',\n ' commands are returned.',\n )\n }\n\n lines.push(\n 'GETKEYS <full-command>',\n ' Return the keys from a full Redis command.',\n )\n\n if (ctx.server.profile.has('command.getkeysandflags')) {\n lines.push(\n 'GETKEYSANDFLAGS <full-command>',\n ' Return the keys and the access flags from a full Redis command.',\n )\n }\n\n lines.push('HELP', ' Prints this help.')\n\n return RedisResult.create(RedisValue.array(lines.map(bulkString)))\n}\n\nfunction planCommandKeys(\n args: CommandArgs,\n ctx: RedisExecutionContext,\n commandName: string,\n): {\n definition: CommandDefinition<unknown>\n keys: readonly Buffer[]\n} {\n if (args.args.length < 1) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n const targetName = args.args[0].toString().toLowerCase()\n const definition = ctx.executor.getCommandDefinition(targetName)\n if (!definition) {\n throw new RedisCommandError('Invalid command specified')\n }\n\n let keys: readonly Buffer[]\n try {\n keys = ctx.executor.plan(targetName, args.args.slice(1)).keys\n } catch (err) {\n if (err instanceof RedisCommandError) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n throw err\n }\n\n if (keys.length === 0) {\n throw new RedisCommandError('The command has no key arguments')\n }\n\n return { definition, keys }\n}\n\nfunction allRootCommandInfos(ctx: RedisExecutionContext): CommandInfo[] {\n return ctx.executor\n .getCommandDefinitions()\n .map(definition => createCommandInfo(definition, ctx))\n}\n\nfunction allCommandInfos(ctx: RedisExecutionContext): CommandInfo[] {\n const infos: CommandInfo[] = []\n for (const info of allRootCommandInfos(ctx)) {\n infos.push(info, ...info.subcommands)\n }\n return infos\n}\n\nfunction findCommandInfo(\n ctx: RedisExecutionContext,\n name: string,\n): CommandInfo | null {\n const target = name.toLowerCase()\n for (const info of allCommandInfos(ctx)) {\n if (info.name === target) {\n return info\n }\n }\n\n return null\n}\n\nfunction createCommandInfo(\n definition: CommandDefinition<unknown>,\n ctx: RedisExecutionContext,\n): CommandInfo {\n const name = definition.name.toLowerCase()\n return createCommandInfoFromIntrospection(\n name,\n definition.flags,\n definition.introspection,\n ctx,\n )\n}\n\nfunction createCommandInfoFromIntrospection(\n name: string,\n fallbackFlags: readonly string[],\n introspection?: CommandIntrospection,\n ctx?: RedisExecutionContext,\n): CommandInfo {\n const keySpecs = introspection?.keySpecs ?? []\n const firstKey = introspection?.firstKey ?? firstKeyFromSpecs(keySpecs)\n const lastKey = introspection?.lastKey ?? lastKeyFromSpecs(firstKey, keySpecs)\n const keyStep = introspection?.keyStep ?? keyStepFromSpecs(keySpecs)\n const flags = introspection?.flags ?? fallbackFlags\n\n return {\n name,\n arity: introspection?.arity ?? -1,\n flags,\n firstKey,\n lastKey,\n keyStep,\n categories: introspection?.categories ?? inferCategories(flags),\n tips: introspection?.tips ?? [],\n keySpecs,\n subcommands: (introspection?.subcommands ?? [])\n .filter(subcommand => subcommandAvailable(subcommand, ctx))\n .map(subcommand => {\n if (!subcommand.name) {\n throw new Error('Synthetic command introspection is missing a name')\n }\n return createCommandInfoFromIntrospection(\n subcommand.name,\n subcommand.flags ?? [],\n subcommand,\n ctx,\n )\n }),\n docs:\n introspection?.docs ??\n commandDocs(`${name.toUpperCase()} command`, 'generic'),\n }\n}\n\nfunction subcommandAvailable(\n introspection: CommandIntrospection,\n ctx?: RedisExecutionContext,\n): boolean {\n if (!ctx || !introspection.name) {\n return true\n }\n\n const feature = SUBCOMMAND_FEATURES[introspection.name.toLowerCase()]\n return feature === undefined || ctx.server.profile.has(feature)\n}\n\nfunction commandInfo(\n infos: readonly (CommandInfo | null)[],\n preserveNulls = false,\n): RedisResult {\n return RedisResult.create(\n RedisValue.array(\n infos\n .map(info => {\n if (!info) {\n return preserveNulls ? RedisValue.null() : null\n }\n\n return formatCommandInfo(info)\n })\n .filter((value): value is RedisValue => value !== null),\n ),\n )\n}\n\nfunction formatCommandInfo(info: CommandInfo): RedisValue {\n return RedisValue.array([\n bulkString(info.name),\n RedisValue.integer(info.arity),\n RedisValue.array(info.flags.map(bulkString)),\n RedisValue.integer(info.firstKey),\n RedisValue.integer(info.lastKey),\n RedisValue.integer(info.keyStep),\n RedisValue.array(info.categories.map(bulkString)),\n RedisValue.array(info.tips.map(bulkString)),\n RedisValue.array(info.keySpecs.map(formatKeySpec)),\n RedisValue.array(info.subcommands.map(formatCommandInfo)),\n ])\n}\n\nfunction formatKeySpec(spec: CommandKeySpec): RedisValue {\n const items: RedisValue[] = []\n if (spec.notes) {\n items.push(bulkString('notes'), bulkString(spec.notes))\n }\n\n items.push(\n bulkString('flags'),\n RedisValue.array(spec.flags.map(bulkString)),\n bulkString('begin_search'),\n RedisValue.array([\n bulkString('type'),\n bulkString('index'),\n bulkString('spec'),\n RedisValue.array([\n bulkString('index'),\n RedisValue.integer(spec.beginSearchIndex),\n ]),\n ]),\n bulkString('find_keys'),\n RedisValue.array([\n bulkString('type'),\n bulkString('range'),\n bulkString('spec'),\n RedisValue.array([\n bulkString('lastkey'),\n RedisValue.integer(spec.lastKey),\n bulkString('keystep'),\n RedisValue.integer(spec.keyStep),\n bulkString('limit'),\n RedisValue.integer(spec.limit ?? 0),\n ]),\n ]),\n )\n\n return RedisValue.array(items)\n}\n\nfunction formatDocs(docs: CommandDocumentation): RedisValue {\n const entries: [RedisValue, RedisValue][] = [\n [bulkString('summary'), bulkString(docs.summary)],\n ]\n\n if (docs.since) {\n entries.push([bulkString('since'), bulkString(docs.since)])\n }\n\n entries.push([bulkString('group'), bulkString(docs.group)])\n\n if (docs.complexity) {\n entries.push([bulkString('complexity'), bulkString(docs.complexity)])\n }\n\n if (docs.arguments) {\n entries.push([\n bulkString('arguments'),\n RedisValue.array(docs.arguments.map(formatDocsArgument)),\n ])\n }\n\n return RedisValue.map(entries)\n}\n\nfunction formatDocsArgument(arg: CommandDocumentationArgument): RedisValue {\n const entries: [RedisValue, RedisValue][] = [\n [bulkString('name'), bulkString(arg.name)],\n [bulkString('type'), bulkString(arg.type)],\n ]\n\n if (arg.keySpecIndex !== undefined) {\n entries.push([\n bulkString('key_spec_index'),\n RedisValue.integer(arg.keySpecIndex),\n ])\n }\n\n if (arg.token) {\n entries.push([bulkString('token'), bulkString(arg.token)])\n }\n\n if (arg.flags) {\n entries.push([\n bulkString('flags'),\n RedisValue.array(arg.flags.map(simpleString)),\n ])\n }\n\n return RedisValue.map(entries)\n}\n\nfunction keyAccessFlags(definition: CommandDefinition<unknown>): RedisValue[] {\n const flags =\n definition.introspection?.keySpecs?.[0]?.flags ??\n fallbackKeyAccessFlags(definition.flags)\n return flags.map(bulkString)\n}\n\nfunction fallbackKeyAccessFlags(flags: readonly string[]): readonly string[] {\n if (flags.includes('readonly')) {\n return ['RO', 'access']\n }\n\n if (flags.includes('write')) {\n return ['RW', 'access', 'update']\n }\n\n return ['RO', 'access']\n}\n\nfunction inferCategories(flags: readonly string[]): readonly string[] {\n if (flags.includes('write')) {\n return ['@write', '@slow']\n }\n\n if (flags.includes('readonly')) {\n return ['@read', flags.includes('fast') ? '@fast' : '@slow']\n }\n\n return ['@slow']\n}\n\nfunction firstKeyFromSpecs(specs: readonly CommandKeySpec[]): number {\n return specs[0]?.beginSearchIndex ?? 0\n}\n\nfunction lastKeyFromSpecs(\n firstKey: number,\n specs: readonly CommandKeySpec[],\n): number {\n if (specs.length === 0) {\n return 0\n }\n\n const lastKey = specs[0].lastKey\n return lastKey === 0 ? firstKey : lastKey\n}\n\nfunction keyStepFromSpecs(specs: readonly CommandKeySpec[]): number {\n return specs[0]?.keyStep ?? 0\n}\n\nfunction expectArgCount(\n commandName: string,\n args: readonly Buffer[],\n count: number,\n): void {\n if (args.length !== count) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n}\n\nfunction equalsAscii(value: Buffer, expected: string): boolean {\n return value.toString().toLowerCase() === expected\n}\n\nfunction bulkString(value: string): RedisValue {\n return bulk(Buffer.from(value))\n}\n\nfunction simpleString(value: string): RedisValue {\n return RedisValue.simpleString(value)\n}\n\nfunction bulk(value: Buffer | null): RedisValue {\n return RedisValue.bulkString(value)\n}\n\nfunction globMatches(pattern: string, value: string): boolean {\n let source = '^'\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n if (char === '*') {\n source += '.*'\n } else if (char === '?') {\n source += '.'\n } else {\n source += escapeRegExp(char)\n }\n }\n source += '$'\n return new RegExp(source, 'i').test(value)\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n}\n","export type RedisDataTypeName =\n | 'string'\n | 'hash'\n | 'list'\n | 'set'\n | 'zset'\n | 'stream'\n\nexport type RedisStringData = {\n type: 'string'\n value: Buffer\n}\n\nexport type RedisHashData = {\n type: 'hash'\n fields: Map<string, RedisHashField>\n}\n\nexport type RedisHashField = {\n field: Buffer\n value: Buffer\n expiresAt?: number\n}\n\nexport type RedisListData = {\n type: 'list'\n values: Buffer[]\n}\n\nexport type RedisSetData = {\n type: 'set'\n members: Map<string, Buffer>\n}\n\nexport type RedisSortedSetData = {\n type: 'zset'\n members: Map<string, RedisSortedSetMember>\n}\n\nexport type RedisSortedSetMember = {\n member: Buffer\n score: number\n}\n\nexport type StreamId = {\n ms: bigint\n seq: bigint\n}\n\nexport type RedisStreamEntry = {\n id: StreamId\n // Flat [field1, value1, field2, value2, ...], as Redis stores and replies.\n fields: Buffer[]\n}\n\nexport type RedisStreamConsumer = {\n name: Buffer\n seenAt: number\n activeAt: number | null\n}\n\nexport type RedisStreamPendingEntry = {\n id: StreamId\n consumerId: string\n deliveredAt: number\n deliveryCount: number\n}\n\nexport type RedisStreamConsumerGroup = {\n name: Buffer\n lastDeliveredId: StreamId\n entriesRead: number | null\n consumers: Map<string, RedisStreamConsumer>\n pending: Map<string, RedisStreamPendingEntry>\n}\n\nexport type RedisStreamData = {\n type: 'stream'\n // Entries kept in ascending id order (append-only; ids are monotonic).\n entries: RedisStreamEntry[]\n // Highest id ever added; drives `*` / `ms-*` id generation. 0-0 when empty.\n lastId: StreamId\n entriesAdded: number\n maxDeletedEntryId: StreamId\n groups: Map<string, RedisStreamConsumerGroup>\n}\n\nexport type RedisDataValue =\n | RedisStringData\n | RedisHashData\n | RedisListData\n | RedisSetData\n | RedisSortedSetData\n | RedisStreamData\n\nexport function cloneRedisDataValue(value: RedisDataValue): RedisDataValue {\n switch (value.type) {\n case 'string':\n return { type: 'string', value: Buffer.from(value.value) }\n case 'hash':\n return {\n type: 'hash',\n fields: new Map(\n Array.from(value.fields, ([id, field]) => [\n id,\n {\n field: Buffer.from(field.field),\n value: Buffer.from(field.value),\n expiresAt: field.expiresAt,\n },\n ]),\n ),\n }\n case 'list':\n return {\n type: 'list',\n values: value.values.map(item => Buffer.from(item)),\n }\n case 'set':\n return {\n type: 'set',\n members: new Map(\n Array.from(value.members, ([id, member]) => [\n id,\n Buffer.from(member),\n ]),\n ),\n }\n case 'zset':\n return {\n type: 'zset',\n members: new Map(\n Array.from(value.members, ([id, member]) => [\n id,\n {\n member: Buffer.from(member.member),\n score: member.score,\n },\n ]),\n ),\n }\n case 'stream':\n return {\n type: 'stream',\n entries: value.entries.map(entry => ({\n id: { ms: entry.id.ms, seq: entry.id.seq },\n fields: entry.fields.map(part => Buffer.from(part)),\n })),\n lastId: { ms: value.lastId.ms, seq: value.lastId.seq },\n entriesAdded: value.entriesAdded,\n maxDeletedEntryId: {\n ms: value.maxDeletedEntryId.ms,\n seq: value.maxDeletedEntryId.seq,\n },\n groups: new Map(\n Array.from(value.groups, ([id, group]) => [\n id,\n {\n name: Buffer.from(group.name),\n lastDeliveredId: {\n ms: group.lastDeliveredId.ms,\n seq: group.lastDeliveredId.seq,\n },\n entriesRead: group.entriesRead,\n consumers: new Map(\n Array.from(group.consumers, ([consumerId, consumer]) => [\n consumerId,\n {\n name: Buffer.from(consumer.name),\n seenAt: consumer.seenAt,\n activeAt: consumer.activeAt,\n },\n ]),\n ),\n pending: new Map(\n Array.from(group.pending, ([pendingId, pending]) => [\n pendingId,\n {\n id: { ms: pending.id.ms, seq: pending.id.seq },\n consumerId: pending.consumerId,\n deliveredAt: pending.deliveredAt,\n deliveryCount: pending.deliveryCount,\n },\n ]),\n ),\n },\n ]),\n ),\n }\n }\n}\n\nexport function createStringData(value: Buffer): RedisStringData {\n return { type: 'string', value: Buffer.from(value) }\n}\n\nexport function createHashData(): RedisHashData {\n return { type: 'hash', fields: new Map() }\n}\n\nexport function createListData(): RedisListData {\n return { type: 'list', values: [] }\n}\n\nexport function createSetData(): RedisSetData {\n return { type: 'set', members: new Map() }\n}\n\nexport function createSortedSetData(): RedisSortedSetData {\n return { type: 'zset', members: new Map() }\n}\n\nexport function createStreamData(): RedisStreamData {\n return {\n type: 'stream',\n entries: [],\n lastId: { ms: 0n, seq: 0n },\n entriesAdded: 0,\n maxDeletedEntryId: { ms: 0n, seq: 0n },\n groups: new Map(),\n }\n}\n","import { cloneRedisDataValue, type RedisDataValue } from './data-types'\n\nexport type RedisMutationEvent =\n | {\n type: 'write'\n database: number\n key: Buffer\n value: RedisDataValue\n expiresAt?: number\n }\n | {\n type: 'delete'\n database: number\n key: Buffer\n }\n | {\n type: 'expire'\n database: number\n key: Buffer\n expiresAt: number\n }\n | {\n type: 'persist'\n database: number\n key: Buffer\n }\n | {\n type: 'evict'\n database: number\n key: Buffer\n }\n | {\n type: 'flush'\n database: number\n }\n\nexport type RedisMutationListener = (event: RedisMutationEvent) => void\n\nexport type Unsubscribe = () => void\n\nexport class RedisMutationBus {\n private readonly globalListeners = new Set<RedisMutationListener>()\n private readonly keyListeners = new Map<string, Set<RedisMutationListener>>()\n\n subscribe(listener: RedisMutationListener): Unsubscribe {\n this.globalListeners.add(listener)\n return () => {\n this.globalListeners.delete(listener)\n }\n }\n\n subscribeKey(key: Buffer, listener: RedisMutationListener): Unsubscribe {\n const id = keyId(key)\n let listeners = this.keyListeners.get(id)\n if (!listeners) {\n listeners = new Set()\n this.keyListeners.set(id, listeners)\n }\n\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) {\n this.keyListeners.delete(id)\n }\n }\n }\n\n emit(event: RedisMutationEvent): void {\n for (const listener of Array.from(this.globalListeners)) {\n listener(cloneMutationEvent(event))\n }\n\n if (event.type === 'flush') {\n for (const listeners of Array.from(this.keyListeners.values())) {\n for (const listener of Array.from(listeners)) {\n listener(cloneMutationEvent(event))\n }\n }\n return\n }\n\n const listeners = this.keyListeners.get(keyId(event.key))\n if (!listeners) {\n return\n }\n\n for (const listener of Array.from(listeners)) {\n listener(cloneMutationEvent(event))\n }\n }\n}\n\nfunction keyId(key: Buffer): string {\n return key.toString('hex')\n}\n\nfunction cloneMutationEvent(event: RedisMutationEvent): RedisMutationEvent {\n switch (event.type) {\n case 'write':\n return {\n ...event,\n key: Buffer.from(event.key),\n value: cloneRedisDataValue(event.value),\n }\n case 'delete':\n case 'expire':\n case 'persist':\n case 'evict':\n return {\n ...event,\n key: Buffer.from(event.key),\n }\n case 'flush':\n return event\n }\n}\n","import type { Unsubscribe } from './mutation-events'\n\nexport type RedisMonitorCommandEvent = {\n timestampMs: number\n database: number\n clientId: string\n clientAddress?: string\n command: Buffer\n args: readonly Buffer[]\n}\n\nexport type RedisMonitorCommandListener = (\n event: RedisMonitorCommandEvent,\n) => void\n\nexport class RedisMonitorFeed {\n private readonly listeners = new Set<RedisMonitorCommandListener>()\n\n get subscriberCount(): number {\n return this.listeners.size\n }\n\n subscribe(listener: RedisMonitorCommandListener): Unsubscribe {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n publish(event: RedisMonitorCommandEvent): void {\n for (const listener of Array.from(this.listeners)) {\n listener(cloneMonitorCommandEvent(event))\n }\n }\n}\n\nfunction cloneMonitorCommandEvent(\n event: RedisMonitorCommandEvent,\n): RedisMonitorCommandEvent {\n return {\n ...event,\n command: Buffer.from(event.command),\n args: event.args.map(arg => Buffer.from(arg)),\n }\n}\n","import {\n cloneRedisDataValue,\n type RedisDataValue,\n type RedisDataTypeName,\n} from './data-types'\nimport { RedisMutationBus } from './mutation-events'\n\nexport type ExpirationState =\n | { kind: 'missing' }\n | { kind: 'persistent' }\n | { kind: 'expires'; expiresAt: number }\n\nexport type KeyspaceEntry = {\n key: Buffer\n value: RedisDataValue\n expiresAt?: number\n}\n\nexport type SetOptions = {\n expiresAt?: number\n keepTtl?: boolean\n}\n\nexport type KeyspaceMutationTracker = {\n // A WATCH-dirtying write: persists the value AND dirties a WATCH on the key.\n markChanged(): void\n // Persist the (possibly brand-new) value without, on its own, dirtying a\n // WATCH. Used for stream consumer-group / pending-entry metadata changes,\n // which real Redis does not treat as touching a WATCH on the stream key. A\n // brand-new key still dirties — coming into existence is itself a write — so\n // `keyspace.update` only suppresses the dirty signal for in-place changes to\n // an already-existing key.\n markCommitted(): void\n}\n\nexport class WrongRedisTypeError extends Error {\n constructor(\n public readonly expected: RedisDataTypeName,\n public readonly actual: RedisDataTypeName,\n ) {\n super(`Expected ${expected}, got ${actual}`)\n this.name = 'WrongRedisTypeError'\n }\n}\n\nexport class RedisKeyspace {\n private readonly entries = new Map<string, KeyspaceEntry>()\n\n constructor(\n private readonly database: number,\n private readonly mutations: RedisMutationBus,\n ) {}\n\n get(key: Buffer): RedisDataValue | null {\n const entry = this.getLiveEntry(key)\n if (!entry) {\n return null\n }\n\n return cloneRedisDataValue(entry.value)\n }\n\n getType(key: Buffer): RedisDataTypeName | null {\n return this.getLiveEntry(key)?.value.type ?? null\n }\n\n set(key: Buffer, value: RedisDataValue, options?: SetOptions): void {\n const id = keyId(key)\n const existing = this.getLiveEntry(key)\n const expiresAt = options?.keepTtl\n ? existing?.expiresAt\n : options?.expiresAt\n const entry: KeyspaceEntry = {\n key: Buffer.from(key),\n value: cloneRedisDataValue(value),\n expiresAt,\n }\n\n this.entries.set(id, entry)\n this.emitWrite(entry)\n }\n\n delete(key: Buffer): boolean {\n const id = keyId(key)\n const existing = this.getLiveEntry(key)\n if (!existing) {\n return false\n }\n\n this.entries.delete(id)\n this.mutations.emit({\n type: 'delete',\n database: this.database,\n key: existing.key,\n })\n return true\n }\n\n expire(key: Buffer, expiresAt: number): boolean {\n const entry = this.getLiveEntry(key)\n if (!entry) {\n return false\n }\n\n entry.expiresAt = expiresAt\n this.mutations.emit({\n type: 'expire',\n database: this.database,\n key: entry.key,\n expiresAt,\n })\n return true\n }\n\n persist(key: Buffer): boolean {\n const entry = this.getLiveEntry(key)\n if (!entry || entry.expiresAt === undefined) {\n return false\n }\n\n delete entry.expiresAt\n this.mutations.emit({\n type: 'persist',\n database: this.database,\n key: entry.key,\n })\n return true\n }\n\n getExpiration(key: Buffer): ExpirationState {\n const entry = this.getLiveEntry(key)\n if (!entry) {\n return { kind: 'missing' }\n }\n\n if (entry.expiresAt === undefined) {\n return { kind: 'persistent' }\n }\n\n return { kind: 'expires', expiresAt: entry.expiresAt }\n }\n\n update<TValue extends RedisDataValue, TResult>(\n key: Buffer,\n expectedType: TValue['type'],\n createValue: () => TValue,\n mutator: (value: TValue, tracker: KeyspaceMutationTracker) => TResult,\n ): TResult {\n const existing = this.getLiveEntry(key)\n\n if (existing && existing.value.type !== expectedType) {\n throw new WrongRedisTypeError(expectedType, existing.value.type)\n }\n\n // For a new key, mutate a not-yet-committed entry: if the mutator throws,\n // the keyspace is left untouched (no ghost empty collection persists).\n const entry: KeyspaceEntry = existing ?? {\n key: Buffer.from(key),\n value: createValue(),\n }\n\n let dirty = false\n let committed = false\n const tracker: KeyspaceMutationTracker = {\n markChanged: () => {\n dirty = true\n },\n markCommitted: () => {\n committed = true\n },\n }\n\n const result = mutator(entry.value as TValue, tracker)\n const id = keyId(key)\n\n if (!dirty && !committed) {\n return result\n }\n\n // Centralized \"delete the key when its collection is empty\" rule, so each\n // command no longer has to remember to clean up emptied hashes/lists/etc.\n if (isEmptyCollection(entry.value)) {\n if (existing) {\n this.entries.delete(id)\n this.mutations.emit({\n type: 'delete',\n database: this.database,\n key: entry.key,\n })\n }\n return result\n }\n\n this.entries.set(id, entry)\n // A markChanged write always dirties WATCH. A markCommitted-only change\n // dirties only when it creates the key (`!existing`): real Redis treats\n // bringing a watched key into existence as a write, but leaves a WATCH\n // intact for in-place metadata changes to an already-existing key.\n if (dirty || !existing) {\n this.emitWrite(entry)\n }\n return result\n }\n\n flush(): void {\n this.entries.clear()\n this.mutations.emit({\n type: 'flush',\n database: this.database,\n })\n }\n\n size(): number {\n this.sweepExpired()\n return this.entries.size\n }\n\n entriesSnapshot(): KeyspaceEntry[] {\n this.sweepExpired()\n const entries: KeyspaceEntry[] = []\n\n for (const entry of this.entries.values()) {\n entries.push({\n key: Buffer.from(entry.key),\n value: cloneRedisDataValue(entry.value),\n expiresAt: entry.expiresAt,\n })\n }\n\n return entries\n }\n\n sweepExpired(now = Date.now()): number {\n let count = 0\n\n for (const entry of Array.from(this.entries.values())) {\n if (this.evictIfExpired(entry, now)) {\n count += 1\n }\n }\n\n return count\n }\n\n private getLiveEntry(key: Buffer): KeyspaceEntry | null {\n const entry = this.entries.get(keyId(key))\n if (!entry) {\n return null\n }\n\n if (this.evictIfExpired(entry)) {\n return null\n }\n\n return entry\n }\n\n private evictIfExpired(entry: KeyspaceEntry, now = Date.now()): boolean {\n if (entry.expiresAt === undefined || entry.expiresAt > now) {\n return false\n }\n\n this.entries.delete(keyId(entry.key))\n this.mutations.emit({\n type: 'evict',\n database: this.database,\n key: entry.key,\n })\n return true\n }\n\n private emitWrite(entry: KeyspaceEntry): void {\n this.mutations.emit({\n type: 'write',\n database: this.database,\n key: entry.key,\n value: entry.value,\n expiresAt: entry.expiresAt,\n })\n }\n}\n\nfunction keyId(key: Buffer): string {\n return key.toString('hex')\n}\n\n// A collection-typed value is \"empty\" when it holds no elements; such keys are\n// deleted from the keyspace (matching real Redis). Strings are always a real\n// value (even \"\"), and empty streams persist (e.g. XGROUP CREATE MKSTREAM), so\n// neither is ever auto-deleted here.\nfunction isEmptyCollection(value: RedisDataValue): boolean {\n switch (value.type) {\n case 'hash':\n return value.fields.size === 0\n case 'list':\n return value.values.length === 0\n case 'set':\n case 'zset':\n return value.members.size === 0\n case 'string':\n case 'stream':\n return false\n }\n}\n","export interface RedisTurnHandle {\n release(): void\n suspend(waitFor: Promise<unknown>): Promise<RedisTurnHandle>\n}\n\nexport interface RedisTurnQueue {\n waitTurn(): Promise<RedisTurnHandle>\n}\n\ntype TurnResolver = () => void\n\nexport class SerialTurnQueue implements RedisTurnQueue {\n private readonly queue: TurnResolver[] = []\n private locked = false\n\n waitTurn(): Promise<RedisTurnHandle> {\n return this.waitTurnInternal(false)\n }\n\n private waitTurnInternal(priority: boolean): Promise<RedisTurnHandle> {\n return new Promise(resolve => {\n const grantTurn = () => {\n this.locked = true\n let active = true\n\n const release = () => {\n if (!active) return\n active = false\n this.locked = false\n this.scheduleNext()\n }\n\n const suspend = async (\n waitFor: Promise<unknown>,\n ): Promise<RedisTurnHandle> => {\n if (!active) {\n throw new Error('Turn already released')\n }\n\n active = false\n this.locked = false\n this.scheduleNext()\n await waitFor\n return this.waitTurnInternal(true)\n }\n\n resolve({ release, suspend })\n }\n\n if (priority) {\n this.queue.unshift(grantTurn)\n } else {\n this.queue.push(grantTurn)\n }\n\n this.scheduleNext()\n })\n }\n\n private scheduleNext(): void {\n if (this.locked) return\n\n const next = this.queue.shift()\n next?.()\n }\n}\n","import type { StreamId } from './data-types'\n\n// Pure StreamId arithmetic. Lives in the state layer (next to the StreamId type)\n// so state-layer code such as TrackedStreamData can use it without importing from\n// the command layer. The command-layer ids module re-exports these.\n\nexport const MIN_ID: StreamId = { ms: 0n, seq: 0n }\n\nexport function formatStreamId(id: StreamId): string {\n return `${id.ms}-${id.seq}`\n}\n\nexport function streamIdKey(id: StreamId): string {\n return formatStreamId(id)\n}\n\nexport function compareStreamId(a: StreamId, b: StreamId): number {\n if (a.ms !== b.ms) return a.ms < b.ms ? -1 : 1\n if (a.seq !== b.seq) return a.seq < b.seq ? -1 : 1\n return 0\n}\n\nexport function cloneStreamId(id: StreamId): StreamId {\n return { ms: id.ms, seq: id.seq }\n}\n\nexport function maxStreamId(a: StreamId, b: StreamId): StreamId {\n return compareStreamId(a, b) >= 0 ? a : b\n}\n","import type {\n RedisStreamConsumer,\n RedisStreamConsumerGroup,\n RedisStreamData,\n RedisStreamEntry,\n RedisStreamPendingEntry,\n StreamId,\n} from './data-types'\nimport { compareStreamId } from './stream-ids'\n\n// Pure consumer-group lookups. State-layer so TrackedStreamData can reach them;\n// the command-layer groups module re-exports them.\n\nexport function findEntry(\n stream: RedisStreamData,\n id: StreamId,\n): RedisStreamEntry | null {\n return (\n stream.entries.find(entry => compareStreamId(entry.id, id) === 0) ?? null\n )\n}\n\nexport function pendingEntriesSorted(\n group: RedisStreamConsumerGroup,\n): RedisStreamPendingEntry[] {\n return Array.from(group.pending.values()).sort((a, b) =>\n compareStreamId(a.id, b.id),\n )\n}\n\nexport function ensureConsumer(\n group: RedisStreamConsumerGroup,\n name: Buffer,\n now: number,\n): RedisStreamConsumer {\n const id = name.toString('hex')\n const existing = group.consumers.get(id)\n if (existing) {\n existing.seenAt = now\n return existing\n }\n\n const consumer: RedisStreamConsumer = {\n name: Buffer.from(name),\n seenAt: now,\n activeAt: null,\n }\n group.consumers.set(id, consumer)\n return consumer\n}\n","import type {\n RedisHashData,\n RedisHashField,\n RedisListData,\n RedisSetData,\n RedisSortedSetData,\n RedisSortedSetMember,\n RedisStreamConsumer,\n RedisStreamConsumerGroup,\n RedisStreamData,\n RedisStreamEntry,\n StreamId,\n} from './data-types'\nimport type { KeyspaceMutationTracker } from './keyspace'\nimport {\n ensureConsumer,\n findEntry,\n pendingEntriesSorted,\n} from './stream-groups'\nimport {\n cloneStreamId,\n compareStreamId,\n MIN_ID,\n streamIdKey,\n} from './stream-ids'\n\n// Dirty tracking is operation-based, not a final-value diff. An effective\n// mutating helper marks the key dirty when the operation changes structure, and\n// commands pass forceDirty for Redis writes that must dirty WATCH even when the\n// final value is equal (for example identical STORE rewrites or full-range\n// LTRIM). Stream consumer-group / pending / last-id mutations deliberately do\n// NOT mark the key dirty: real Redis leaves a WATCH on the stream key intact for\n// those, only entry-set changes (XADD/XDEL/…) touch it.\n\nexport class TrackedHashData {\n constructor(\n private readonly hash: RedisHashData,\n private readonly tracker: KeyspaceMutationTracker,\n ) {}\n\n get size(): number {\n this.deleteExpiredFields()\n return this.hash.fields.size\n }\n\n getField(field: Buffer): RedisHashField | undefined {\n const id = field.toString('hex')\n const entry = this.hash.fields.get(id)\n if (!entry) {\n return undefined\n }\n\n if (isHashFieldExpired(entry)) {\n this.hash.fields.delete(id)\n this.tracker.markChanged()\n return undefined\n }\n\n return entry\n }\n\n hasField(field: Buffer): boolean {\n return this.getField(field) !== undefined\n }\n\n setField(\n field: Buffer,\n value: Buffer,\n options: { forceDirty?: boolean; keepTtl?: boolean } = {},\n ): { added: boolean; valueChanged: boolean } {\n const hex = field.toString('hex')\n const existing = this.getField(field)\n const valueChanged = !existing || !existing.value.equals(value)\n const expiresAt = options.keepTtl ? existing?.expiresAt : undefined\n const ttlChanged = existing?.expiresAt !== expiresAt\n\n this.hash.fields.set(hex, { field, value, expiresAt })\n if (options.forceDirty || valueChanged || ttlChanged) {\n this.tracker.markChanged()\n }\n return { added: existing === undefined, valueChanged }\n }\n\n setFieldIfAbsent(field: Buffer, value: Buffer): boolean {\n if (this.hasField(field)) {\n return false\n }\n\n this.setField(field, value)\n return true\n }\n\n deleteField(field: Buffer): boolean {\n const existing = this.getField(field)\n if (!existing) {\n return false\n }\n\n const deleted = this.hash.fields.delete(field.toString('hex'))\n if (deleted) {\n this.tracker.markChanged()\n }\n return deleted\n }\n\n setFieldExpiration(field: Buffer, expiresAt: number): boolean {\n const entry = this.getField(field)\n if (!entry) {\n return false\n }\n\n if (entry.expiresAt !== expiresAt) {\n entry.expiresAt = expiresAt\n this.tracker.markChanged()\n }\n return true\n }\n\n clearFieldExpiration(field: Buffer): boolean {\n const entry = this.getField(field)\n if (!entry || entry.expiresAt === undefined) {\n return false\n }\n\n delete entry.expiresAt\n this.tracker.markChanged()\n return true\n }\n\n entries(): IterableIterator<RedisHashField> {\n this.deleteExpiredFields()\n return this.hash.fields.values()\n }\n\n private deleteExpiredFields(): void {\n const now = Date.now()\n let deleted = false\n\n for (const [id, entry] of this.hash.fields) {\n if (isHashFieldExpired(entry, now)) {\n this.hash.fields.delete(id)\n deleted = true\n }\n }\n\n if (deleted) {\n this.tracker.markChanged()\n }\n }\n}\n\nfunction isHashFieldExpired(field: RedisHashField, now = Date.now()): boolean {\n return field.expiresAt !== undefined && field.expiresAt <= now\n}\n\nexport class TrackedListData {\n constructor(\n private readonly list: RedisListData,\n private readonly tracker: KeyspaceMutationTracker,\n ) {}\n\n get length(): number {\n return this.list.values.length\n }\n\n pushLeft(values: readonly Buffer[]): number {\n for (const value of values) {\n this.list.values.unshift(value)\n }\n this.tracker.markChanged()\n return this.list.values.length\n }\n\n pushRight(values: readonly Buffer[]): number {\n for (const value of values) {\n this.list.values.push(value)\n }\n this.tracker.markChanged()\n return this.list.values.length\n }\n\n pop(side: 'left' | 'right'): Buffer | null {\n const value =\n side === 'left' ? this.list.values.shift() : this.list.values.pop()\n if (value !== undefined) {\n this.tracker.markChanged()\n }\n return value ?? null\n }\n\n popMany(side: 'left' | 'right', count: number): Buffer[] {\n const values =\n side === 'left'\n ? this.list.values.splice(0, count)\n : this.list.values.splice(Math.max(0, this.list.values.length - count))\n if (side === 'right') {\n values.reverse()\n }\n if (values.length > 0) {\n this.tracker.markChanged()\n }\n return values\n }\n\n setAt(index: number, value: Buffer): void {\n this.list.values[index] = value\n this.tracker.markChanged()\n }\n\n insertRelativeTo(\n pivot: Buffer,\n element: Buffer,\n position: 'before' | 'after',\n ): number {\n const pivotIndex = this.list.values.findIndex(value => value.equals(pivot))\n if (pivotIndex === -1) {\n return -1\n }\n\n const insertIndex = position === 'before' ? pivotIndex : pivotIndex + 1\n this.list.values.splice(insertIndex, 0, element)\n this.tracker.markChanged()\n return this.list.values.length\n }\n\n removeMatching(count: number, element: Buffer): number {\n const target = element.toString('binary')\n let removed = 0\n\n if (count === 0) {\n for (let i = this.list.values.length - 1; i >= 0; i--) {\n if (this.list.values[i].toString('binary') === target) {\n this.list.values.splice(i, 1)\n removed++\n }\n }\n } else if (count > 0) {\n for (let i = 0; i < this.list.values.length && removed < count; i++) {\n if (this.list.values[i].toString('binary') === target) {\n this.list.values.splice(i, 1)\n removed++\n i--\n }\n }\n } else {\n const absCount = Math.abs(count)\n for (\n let i = this.list.values.length - 1;\n i >= 0 && removed < absCount;\n i--\n ) {\n if (this.list.values[i].toString('binary') === target) {\n this.list.values.splice(i, 1)\n removed++\n }\n }\n }\n\n if (removed > 0) {\n this.tracker.markChanged()\n }\n return removed\n }\n\n trim(start: number, stop: number, options: { forceDirty?: boolean } = {}) {\n const originalLength = this.list.values.length\n const changed = start > stop || start > 0 || stop < originalLength - 1\n\n if (start > stop) {\n this.list.values.length = 0\n } else {\n this.list.values.splice(0, start)\n this.list.values.splice(stop - start + 1)\n }\n if (options.forceDirty || changed) {\n this.tracker.markChanged()\n }\n return { empty: this.list.values.length === 0 }\n }\n}\n\nexport class TrackedSetData {\n constructor(\n private readonly set: RedisSetData,\n private readonly tracker: KeyspaceMutationTracker,\n ) {}\n\n get size(): number {\n return this.set.members.size\n }\n\n hasMember(member: Buffer): boolean {\n return this.set.members.has(member.toString('hex'))\n }\n\n addMember(member: Buffer): boolean {\n const hex = member.toString('hex')\n if (this.set.members.has(hex)) {\n return false\n }\n\n this.set.members.set(hex, member)\n this.tracker.markChanged()\n return true\n }\n\n deleteMember(member: Buffer): boolean {\n const deleted = this.set.members.delete(member.toString('hex'))\n if (deleted) {\n this.tracker.markChanged()\n }\n return deleted\n }\n\n deleteMemberId(hex: string): boolean {\n const deleted = this.set.members.delete(hex)\n if (deleted) {\n this.tracker.markChanged()\n }\n return deleted\n }\n\n randomMemberEntries(): [string, Buffer][] {\n return Array.from(this.set.members.entries())\n }\n\n replaceMembers(\n hexSet: Set<string>,\n bufferMap: Map<string, Buffer>,\n options: { forceDirty?: boolean } = {},\n ): void {\n const changed =\n options.forceDirty ||\n this.set.members.size !== hexSet.size ||\n Array.from(hexSet).some(hex => !this.set.members.has(hex))\n\n this.set.members.clear()\n for (const hex of hexSet) {\n const buf = bufferMap.get(hex)!\n this.set.members.set(hex, buf)\n }\n\n if (changed) {\n this.tracker.markChanged()\n }\n }\n}\n\nexport class TrackedSortedSetData {\n constructor(\n private readonly zset: RedisSortedSetData,\n private readonly tracker: KeyspaceMutationTracker,\n ) {}\n\n get size(): number {\n return this.zset.members.size\n }\n\n getMember(member: Buffer): RedisSortedSetMember | undefined {\n return this.zset.members.get(member.toString('hex'))\n }\n\n setScore(\n member: Buffer,\n score: number,\n options: { forceDirty?: boolean } = {},\n ): { added: boolean; scoreChanged: boolean } {\n const hex = member.toString('hex')\n const existing = this.zset.members.get(hex)\n const scoreChanged = !existing || existing.score !== score\n this.zset.members.set(hex, { member, score })\n if (options.forceDirty || scoreChanged) {\n this.tracker.markChanged()\n }\n return { added: existing === undefined, scoreChanged }\n }\n\n deleteMember(member: Buffer): boolean {\n return this.deleteMemberId(member.toString('hex'))\n }\n\n deleteMemberId(hex: string): boolean {\n const deleted = this.zset.members.delete(hex)\n if (deleted) {\n this.tracker.markChanged()\n }\n return deleted\n }\n\n entries(): IterableIterator<[string, RedisSortedSetMember]> {\n return this.zset.members.entries()\n }\n\n replaceMembers(\n members: Map<string, RedisSortedSetMember>,\n options: { forceDirty?: boolean } = {},\n ): void {\n const changed =\n options.forceDirty ||\n this.zset.members.size !== members.size ||\n Array.from(members).some(([hex, member]) => {\n const current = this.zset.members.get(hex)\n return !current || current.score !== member.score\n })\n\n this.zset.members.clear()\n for (const [hex, member] of members) {\n this.zset.members.set(hex, member)\n }\n\n if (changed) {\n this.tracker.markChanged()\n }\n }\n}\n\n// XREADGROUP delivery: a present entry carries its fields; a history read of an\n// entry that has since been deleted carries fields === null.\nexport type StreamDelivery = { id: StreamId; fields: Buffer[] | null }\nexport type ClaimedEntry = { id: StreamId; fields: Buffer[] }\nexport type AutoClaimedEntry = { id: StreamId; fields: Buffer[] | null }\nexport type AutoClaimResult = {\n nextStartId: StreamId\n claimed: AutoClaimedEntry[]\n deleted: StreamId[]\n}\n\nexport class TrackedStreamData {\n constructor(\n private readonly stream: RedisStreamData,\n private readonly tracker: KeyspaceMutationTracker,\n ) {}\n\n get value(): RedisStreamData {\n return this.stream\n }\n\n get lastId(): StreamId {\n return this.stream.lastId\n }\n\n appendEntry(id: StreamId, fields: Buffer[]): void {\n this.stream.entries.push({ id, fields })\n this.stream.lastId = id\n this.stream.entriesAdded++\n this.tracker.markChanged()\n }\n\n trim(callback: (stream: RedisStreamData) => number): number {\n const removed = callback(this.stream)\n if (removed > 0) {\n this.tracker.markChanged()\n }\n return removed\n }\n\n deleteEntries(\n targets: readonly StreamId[],\n compare: (left: StreamId, right: StreamId) => number,\n onDelete: (entry: RedisStreamEntry) => void,\n ): number {\n let count = 0\n for (const target of targets) {\n const idx = this.stream.entries.findIndex(\n entry => compare(entry.id, target) === 0,\n )\n if (idx !== -1) {\n onDelete(this.stream.entries[idx])\n this.stream.entries.splice(idx, 1)\n count++\n }\n }\n\n if (count > 0) {\n this.tracker.markChanged()\n }\n return count\n }\n\n // XACK. Clearing pending entries mutates the live group in place (the stream\n // key already exists), so no commit is needed; real Redis does not dirty a\n // WATCH on the stream key for a PEL change, so no markChanged().\n ack(group: RedisStreamConsumerGroup, ids: readonly StreamId[]): number {\n let count = 0\n for (const id of ids) {\n if (group.pending.delete(streamIdKey(id))) count++\n }\n return count\n }\n\n // XSETID. The stream already exists (the command rejects a missing key), so\n // mutating the live value in place is enough to persist; real Redis does not\n // touch a WATCH on the stream key for a last-id change, so no markChanged().\n setId(\n id: StreamId,\n options: { entriesAdded: number | null; maxDeletedId: StreamId | null },\n ): void {\n this.stream.lastId = cloneStreamId(id)\n if (options.entriesAdded !== null) {\n this.stream.entriesAdded = options.entriesAdded\n }\n if (options.maxDeletedId !== null) {\n this.stream.maxDeletedEntryId = cloneStreamId(options.maxDeletedId)\n }\n }\n\n // XGROUP SETID. Consumer-group metadata changes do not dirty a WATCH on the\n // stream key in real Redis, so this never calls markChanged().\n setGroupId(\n group: RedisStreamConsumerGroup,\n lastDeliveredId: StreamId,\n entriesRead: number | null,\n ): void {\n group.lastDeliveredId = cloneStreamId(lastDeliveredId)\n group.entriesRead = entriesRead\n }\n\n // XREADGROUP for a single stream. Returns the delivered entries (fields === null\n // marks a history entry that was deleted from the stream) for the command to\n // shape into a reply. Delivering messages / advancing the PEL does not dirty a\n // WATCH on the stream key in real Redis.\n readGroup(\n group: RedisStreamConsumerGroup,\n consumerName: Buffer,\n id: StreamId | '>',\n options: { count: number | null; noack: boolean },\n now: number,\n ): StreamDelivery[] {\n ensureConsumer(group, consumerName, now).activeAt = now\n const consumerId = consumerName.toString('hex')\n const { count, noack } = options\n const delivered: StreamDelivery[] = []\n const limited = count !== null && count > 0\n\n if (id === '>') {\n for (const entry of this.stream.entries) {\n if (compareStreamId(entry.id, group.lastDeliveredId) <= 0) continue\n\n delivered.push({ id: entry.id, fields: entry.fields })\n group.lastDeliveredId = cloneStreamId(entry.id)\n group.entriesRead = (group.entriesRead ?? 0) + 1\n\n if (!noack) {\n group.pending.set(streamIdKey(entry.id), {\n id: cloneStreamId(entry.id),\n consumerId,\n deliveredAt: now,\n deliveryCount: 1,\n })\n }\n\n if (limited && delivered.length >= count) break\n }\n return delivered\n }\n\n for (const pending of pendingEntriesSorted(group)) {\n if (pending.consumerId !== consumerId) continue\n if (compareStreamId(pending.id, id) <= 0) continue\n\n const entry = findEntry(this.stream, pending.id)\n delivered.push(\n entry\n ? { id: entry.id, fields: entry.fields }\n : { id: pending.id, fields: null },\n )\n\n if (limited && delivered.length >= count) break\n }\n return delivered\n }\n\n // XCLAIM. Returns the claimed entries for the command to shape into a reply\n // (justId vs full). Reassigning pending ownership does not dirty a WATCH on the\n // stream key in real Redis.\n claim(\n group: RedisStreamConsumerGroup,\n consumerName: Buffer,\n ids: readonly StreamId[],\n options: {\n minIdleMs: number\n idleMs: number | null\n timeMs: number | null\n retryCount: number | null\n force: boolean\n justId: boolean\n lastId: StreamId | null\n },\n now: number,\n ): ClaimedEntry[] {\n ensureConsumer(group, consumerName, now).activeAt = now\n const consumerId = consumerName.toString('hex')\n if (options.lastId) group.lastDeliveredId = cloneStreamId(options.lastId)\n\n const claimed: ClaimedEntry[] = []\n for (const id of ids) {\n const pendingId = streamIdKey(id)\n const entry = findEntry(this.stream, id)\n let pending = group.pending.get(pendingId)\n\n if (!pending && options.force && entry) {\n pending = {\n id: cloneStreamId(id),\n consumerId,\n deliveredAt: now,\n deliveryCount: 0,\n }\n group.pending.set(pendingId, pending)\n }\n\n if (!pending) continue\n if (!entry) {\n group.pending.delete(pendingId)\n continue\n }\n\n const idleTime = Math.max(0, now - pending.deliveredAt)\n if (idleTime < options.minIdleMs) continue\n\n pending.consumerId = consumerId\n pending.deliveredAt =\n options.timeMs ?? (options.idleMs !== null ? now - options.idleMs : now)\n if (options.retryCount !== null) {\n pending.deliveryCount = options.retryCount\n } else if (!options.justId) {\n pending.deliveryCount++\n }\n\n claimed.push({ id: entry.id, fields: entry.fields })\n }\n return claimed\n }\n\n // XAUTOCLAIM. Returns the next cursor, the claimed entries, and the ids of\n // pending entries dropped because their stream entry was gone. Does not dirty a\n // WATCH on the stream key in real Redis.\n autoClaim(\n group: RedisStreamConsumerGroup,\n consumerName: Buffer,\n options: {\n minIdleMs: number\n start: StreamId\n count: number\n justId: boolean\n cleanDeletedEntries: boolean\n },\n now: number,\n ): AutoClaimResult {\n ensureConsumer(group, consumerName, now).activeAt = now\n const consumerId = consumerName.toString('hex')\n const claimed: AutoClaimedEntry[] = []\n const deleted: StreamId[] = []\n let nextStartId: StreamId = MIN_ID\n\n for (const pending of pendingEntriesSorted(group)) {\n if (compareStreamId(pending.id, options.start) < 0) continue\n\n const entry = findEntry(this.stream, pending.id)\n if (!entry) {\n if (options.cleanDeletedEntries) {\n group.pending.delete(streamIdKey(pending.id))\n deleted.push(pending.id)\n continue\n }\n\n const idleTime = Math.max(0, now - pending.deliveredAt)\n if (idleTime < options.minIdleMs) continue\n\n pending.consumerId = consumerId\n pending.deliveredAt = now\n if (!options.justId) pending.deliveryCount++\n claimed.push({ id: pending.id, fields: null })\n\n if (claimed.length >= options.count) {\n const next = pendingEntriesSorted(group).find(\n item => compareStreamId(item.id, pending.id) > 0,\n )\n nextStartId = next ? cloneStreamId(next.id) : MIN_ID\n }\n continue\n }\n\n const idleTime = Math.max(0, now - pending.deliveredAt)\n if (idleTime < options.minIdleMs) continue\n\n pending.consumerId = consumerId\n pending.deliveredAt = now\n if (!options.justId) pending.deliveryCount++\n claimed.push({ id: entry.id, fields: entry.fields })\n\n if (claimed.length >= options.count) {\n const next = pendingEntriesSorted(group).find(\n item => compareStreamId(item.id, pending.id) > 0,\n )\n nextStartId = next ? cloneStreamId(next.id) : MIN_ID\n break\n }\n }\n\n return { nextStartId, claimed, deleted }\n }\n\n // XGROUP CREATE. Adding a group does not dirty a WATCH on an existing stream\n // key in real Redis, but XGROUP CREATE ... MKSTREAM can create a brand-new\n // key that still must be persisted (and, as a key creation, does dirty the\n // WATCH). markCommitted() commits the value while letting keyspace.update\n // decide the dirty signal based on whether the key already existed.\n addGroup(groupId: string, group: RedisStreamConsumerGroup): void {\n this.stream.groups.set(groupId, group)\n this.tracker.markCommitted()\n }\n\n // XGROUP DESTROY. In-place change to an existing stream key; real Redis does\n // not dirty a WATCH on the stream key, so no markChanged().\n deleteGroup(groupId: string): boolean {\n return this.stream.groups.delete(groupId)\n }\n\n // XGROUP CREATECONSUMER. In-place change to an existing stream key; real\n // Redis does not dirty a WATCH on the stream key, so no markChanged().\n addConsumer(\n group: RedisStreamConsumerGroup,\n consumerId: string,\n consumer: RedisStreamConsumer,\n ): boolean {\n if (group.consumers.has(consumerId)) {\n return false\n }\n\n group.consumers.set(consumerId, consumer)\n return true\n }\n\n // XGROUP DELCONSUMER. In-place change to an existing stream key; real Redis\n // does not dirty a WATCH on the stream key, so no markChanged().\n deleteConsumer(group: RedisStreamConsumerGroup, consumerId: string): number {\n if (!group.consumers.delete(consumerId)) {\n return 0\n }\n\n let removedPending = 0\n for (const [pendingId, pending] of Array.from(group.pending)) {\n if (pending.consumerId !== consumerId) continue\n group.pending.delete(pendingId)\n removedPending++\n }\n return removedPending\n }\n}\n","import {\n createHashData,\n createListData,\n createSetData,\n createSortedSetData,\n createStreamData,\n createStringData,\n type RedisDataValue,\n type RedisHashData,\n type RedisListData,\n type RedisSetData,\n type RedisSortedSetData,\n type RedisStreamData,\n} from './data-types'\nimport {\n ExpirationState,\n KeyspaceEntry,\n type KeyspaceMutationTracker,\n RedisKeyspace,\n SetOptions,\n WrongRedisTypeError,\n} from './keyspace'\nimport {\n RedisMutationBus,\n RedisMutationListener,\n Unsubscribe,\n} from './mutation-events'\nimport { SerialTurnQueue, type RedisTurnQueue } from '../core/turn-queue'\nimport { WrongTypeRedisError } from '../core/redis-error'\nimport {\n TrackedHashData,\n TrackedListData,\n TrackedSetData,\n TrackedSortedSetData,\n TrackedStreamData,\n} from './tracked-values'\n\nexport class RedisDatabase {\n readonly mutations = new RedisMutationBus()\n /**\n * Per-database serialization turn. All sessions targeting this database\n * acquire turns from here so writes do not interleave. Sessions on other\n * databases run on independent queues, which means the mock allows\n * cross-database parallelism — real Redis is single-threaded across all\n * databases. Acceptable for a mock; do not rely on cross-database\n * serialization in tests.\n */\n readonly turnQueue: RedisTurnQueue = new SerialTurnQueue()\n /**\n * Name of the command currently executing against this database, set by the\n * CommandExecutor around `definition.execute`. Keyspace notifications read it\n * to name write events after the originating command (e.g. LPUSH → `lpush`),\n * which the mutation bus itself does not carry. `null` outside command\n * execution.\n */\n activeNotifyCommand: string | null = null\n private readonly keyspace: RedisKeyspace\n\n constructor(public readonly id: number) {\n this.keyspace = new RedisKeyspace(this.id, this.mutations)\n }\n\n get(key: Buffer): RedisDataValue | null {\n return this.keyspace.get(key)\n }\n\n getString(key: Buffer): Buffer | null {\n const value = this.keyspace.get(key)\n if (!value || value.type !== 'string') {\n return null\n }\n\n return Buffer.from(value.value)\n }\n\n getType(key: Buffer): RedisDataValue['type'] | null {\n return this.keyspace.getType(key)\n }\n\n set(key: Buffer, value: RedisDataValue, options?: SetOptions): void {\n this.keyspace.set(key, value, options)\n }\n\n setString(key: Buffer, value: Buffer, options?: SetOptions): void {\n this.keyspace.set(key, createStringData(value), options)\n }\n\n delete(key: Buffer): boolean {\n return this.keyspace.delete(key)\n }\n\n expire(key: Buffer, expiresAt: number): boolean {\n return this.keyspace.expire(key, expiresAt)\n }\n\n persist(key: Buffer): boolean {\n return this.keyspace.persist(key)\n }\n\n getExpiration(key: Buffer): ExpirationState {\n return this.keyspace.getExpiration(key)\n }\n\n getHash(key: Buffer): RedisHashData | null {\n return this.getTyped<RedisHashData>(key, 'hash')\n }\n\n getList(key: Buffer): RedisListData | null {\n return this.getTyped<RedisListData>(key, 'list')\n }\n\n getSet(key: Buffer): RedisSetData | null {\n return this.getTyped<RedisSetData>(key, 'set')\n }\n\n getSortedSet(key: Buffer): RedisSortedSetData | null {\n return this.getTyped<RedisSortedSetData>(key, 'zset')\n }\n\n getStream(key: Buffer): RedisStreamData | null {\n return this.getTyped<RedisStreamData>(key, 'stream')\n }\n\n updateHash<TResult>(\n key: Buffer,\n mutator: (hash: TrackedHashData) => TResult,\n ): TResult {\n return this.updateTyped(\n key,\n 'hash',\n createHashData,\n mutator,\n (value, tracker) => new TrackedHashData(value, tracker),\n )\n }\n\n updateList<TResult>(\n key: Buffer,\n mutator: (list: TrackedListData) => TResult,\n ): TResult {\n return this.updateTyped(\n key,\n 'list',\n createListData,\n mutator,\n (value, tracker) => new TrackedListData(value, tracker),\n )\n }\n\n updateSet<TResult>(\n key: Buffer,\n mutator: (set: TrackedSetData) => TResult,\n ): TResult {\n return this.updateTyped(\n key,\n 'set',\n createSetData,\n mutator,\n (value, tracker) => new TrackedSetData(value, tracker),\n )\n }\n\n updateSortedSet<TResult>(\n key: Buffer,\n mutator: (zset: TrackedSortedSetData) => TResult,\n ): TResult {\n return this.updateTyped(\n key,\n 'zset',\n createSortedSetData,\n mutator,\n (value, tracker) => new TrackedSortedSetData(value, tracker),\n )\n }\n\n updateStream<TResult>(\n key: Buffer,\n mutator: (stream: TrackedStreamData) => TResult,\n ): TResult {\n return this.updateTyped(\n key,\n 'stream',\n createStreamData,\n mutator,\n (value, tracker) => new TrackedStreamData(value, tracker),\n )\n }\n\n private getTyped<TValue extends RedisDataValue>(\n key: Buffer,\n expectedType: TValue['type'],\n ): TValue | null {\n const value = this.keyspace.get(key)\n if (!value) return null\n if (value.type !== expectedType) throw new WrongTypeRedisError()\n return value as TValue\n }\n\n private updateTyped<TValue extends RedisDataValue, TTracked, TResult>(\n key: Buffer,\n expectedType: TValue['type'],\n createValue: () => TValue,\n mutator: (value: TTracked) => TResult,\n track: (value: TValue, tracker: KeyspaceMutationTracker) => TTracked,\n ): TResult {\n try {\n return this.keyspace.update(\n key,\n expectedType,\n createValue,\n (value, tracker) => mutator(track(value as TValue, tracker)),\n )\n } catch (err) {\n if (err instanceof WrongRedisTypeError) throw new WrongTypeRedisError()\n throw err\n }\n }\n\n flush(): void {\n this.keyspace.flush()\n }\n\n size(): number {\n return this.keyspace.size()\n }\n\n entriesSnapshot(): KeyspaceEntry[] {\n return this.keyspace.entriesSnapshot()\n }\n\n sweepExpired(now?: number): number {\n return this.keyspace.sweepExpired(now)\n }\n\n subscribe(listener: RedisMutationListener): Unsubscribe {\n return this.mutations.subscribe(listener)\n }\n\n subscribeKey(key: Buffer, listener: RedisMutationListener): Unsubscribe {\n return this.mutations.subscribeKey(key, listener)\n }\n}\n","import type { RedisDataValue } from './data-types'\nimport type { RedisMutationEvent } from './mutation-events'\nimport type { RedisPubSubBroker } from './pubsub-broker'\nimport { RedisCommandError } from '../core/redis-error'\n\n/**\n * Parsed `notify-keyspace-events` configuration, mirroring Redis' per-class\n * notification flags. `keyspace`/`keyevent` select the delivery channels\n * (`__keyspace@<db>__:<key>` / `__keyevent@<db>__:<event>`); the remaining\n * booleans gate which event classes are published.\n */\nexport type KeyspaceNotifyFlags = {\n keyspace: boolean // K\n keyevent: boolean // E\n generic: boolean // g\n string: boolean // $\n list: boolean // l\n set: boolean // s\n hash: boolean // h\n zset: boolean // z\n expired: boolean // x\n evicted: boolean // e\n stream: boolean // t\n keyMiss: boolean // m\n newKey: boolean // n\n module: boolean // d\n}\n\n// The classes that 'A' (NOTIFY_ALL) expands to — everything except the\n// key-miss (m) and new-key (n) classes, matching Redis. Note `module` (d) IS\n// part of 'A': `Ad` collapses to `A`, while `g$lshzxet` (no d) stays expanded.\nconst ALL_CLASS_KEYS = [\n 'generic',\n 'string',\n 'list',\n 'set',\n 'hash',\n 'zset',\n 'expired',\n 'evicted',\n 'stream',\n 'module',\n] as const satisfies readonly (keyof KeyspaceNotifyFlags)[]\n\nfunction emptyFlags(): KeyspaceNotifyFlags {\n return {\n keyspace: false,\n keyevent: false,\n generic: false,\n string: false,\n list: false,\n set: false,\n hash: false,\n zset: false,\n expired: false,\n evicted: false,\n stream: false,\n keyMiss: false,\n newKey: false,\n module: false,\n }\n}\n\n/**\n * Parse a raw `notify-keyspace-events` flag string (e.g. `\"KEA\"`, `\"Ex\"`) into\n * structured flags. Throws the exact Redis error on an unrecognized character.\n */\nexport function parseKeyspaceNotifyFlags(value: string): KeyspaceNotifyFlags {\n const flags = emptyFlags()\n for (const char of value) {\n switch (char) {\n case 'A':\n for (const key of ALL_CLASS_KEYS) flags[key] = true\n break\n case 'K':\n flags.keyspace = true\n break\n case 'E':\n flags.keyevent = true\n break\n case 'g':\n flags.generic = true\n break\n case '$':\n flags.string = true\n break\n case 'l':\n flags.list = true\n break\n case 's':\n flags.set = true\n break\n case 'h':\n flags.hash = true\n break\n case 'z':\n flags.zset = true\n break\n case 'x':\n flags.expired = true\n break\n case 'e':\n flags.evicted = true\n break\n case 't':\n flags.stream = true\n break\n case 'm':\n flags.keyMiss = true\n break\n case 'n':\n flags.newKey = true\n break\n case 'd':\n flags.module = true\n break\n default:\n throw new RedisCommandError(\n 'CONFIG SET failed (possibly related to argument ' +\n \"'notify-keyspace-events') - Invalid event class character. \" +\n \"Use 'Ag$lshzxeKEtmdn'.\",\n )\n }\n }\n return flags\n}\n\n/**\n * Render flags back to Redis' canonical string form, matching Redis 7.2's\n * `keyspaceEventsFlagsToString` exactly. When every class 'A' covers\n * (`g$lshzxetd`) is set they collapse to a single 'A'; otherwise the type\n * classes (including `d`) plus `n` are emitted, then `K`/`E`, then `m` last.\n * Note `n` is only emitted when the type classes are NOT collapsed to 'A'\n * (e.g. `KEn` → `nKE`, but `And` → `A`), while `m` is always emitted last\n * (e.g. `Adm` → `Am`). Examples: `KEA` → `AKE`, `KEgnd$` → `g$dnKE`.\n */\nexport function keyspaceNotifyFlagsToString(\n flags: KeyspaceNotifyFlags,\n): string {\n let result = ''\n if (ALL_CLASS_KEYS.every(key => flags[key])) {\n result += 'A'\n } else {\n if (flags.generic) result += 'g'\n if (flags.string) result += '$'\n if (flags.list) result += 'l'\n if (flags.set) result += 's'\n if (flags.hash) result += 'h'\n if (flags.zset) result += 'z'\n if (flags.expired) result += 'x'\n if (flags.evicted) result += 'e'\n if (flags.stream) result += 't'\n if (flags.module) result += 'd'\n if (flags.newKey) result += 'n'\n }\n if (flags.keyspace) result += 'K'\n if (flags.keyevent) result += 'E'\n if (flags.keyMiss) result += 'm'\n return result\n}\n\n/**\n * Validate and normalize a `notify-keyspace-events` value for CONFIG SET.\n * Returns the canonical string; throws {@link RedisCommandError} on bad input.\n */\nexport function normalizeKeyspaceNotifyConfig(value: string): string {\n return keyspaceNotifyFlagsToString(parseKeyspaceNotifyFlags(value))\n}\n\ntype NotifyClass = 'g' | '$' | 'l' | 's' | 'h' | 'z' | 'x' | 'e' | 't'\n\ntype ResolvedNotification = {\n database: number\n key: Buffer\n event: string\n eventClass: NotifyClass\n}\n\n// Commands whose write event name differs from the command name (Redis names\n// notifications after a canonical operation, not the literal command).\nconst WRITE_EVENT_OVERRIDES: Readonly<Record<string, string>> = {\n setnx: 'set',\n setex: 'set',\n psetex: 'set',\n getset: 'set',\n mset: 'set',\n msetnx: 'set',\n incr: 'incrby',\n incrby: 'incrby',\n decr: 'incrby',\n decrby: 'incrby',\n lpushx: 'lpush',\n rpushx: 'rpush',\n hmset: 'hset',\n hsetnx: 'hset',\n zincrby: 'zincr',\n rename: 'rename_to',\n renamenx: 'rename_to',\n copy: 'copy_to',\n}\n\n// Commands that delete a key as part of a rename emit a dedicated event\n// instead of the default `del`.\nconst DELETE_EVENT_OVERRIDES: Readonly<Record<string, string>> = {\n rename: 'rename_from',\n renamenx: 'rename_from',\n}\n\n// Write events whose class is generic (g) rather than the value's data type.\nconst GENERIC_WRITE_COMMANDS = new Set(['rename', 'renamenx', 'copy'])\n\nfunction classForType(type: RedisDataValue['type']): NotifyClass {\n switch (type) {\n case 'string':\n return '$'\n case 'list':\n return 'l'\n case 'set':\n return 's'\n case 'hash':\n return 'h'\n case 'zset':\n return 'z'\n case 'stream':\n return 't'\n }\n}\n\nfunction classEnabled(\n flags: KeyspaceNotifyFlags,\n eventClass: NotifyClass,\n): boolean {\n switch (eventClass) {\n case 'g':\n return flags.generic\n case '$':\n return flags.string\n case 'l':\n return flags.list\n case 's':\n return flags.set\n case 'h':\n return flags.hash\n case 'z':\n return flags.zset\n case 'x':\n return flags.expired\n case 'e':\n return flags.evicted\n case 't':\n return flags.stream\n }\n}\n\n/**\n * Bridges keyspace mutation events to the Pub/Sub broker as Redis keyspace and\n * keyevent notifications.\n *\n * Lifecycle events (`del`, `expire`, `persist`, `expired`) are derived purely\n * from the mutation type, so they are always correct. Write event names\n * (`set`, `lpush`, `hset`, ...) depend on the originating command, which the\n * mutation bus does not carry — so the executor records the active command name\n * on the database and it is passed in here. Commands that map one logical\n * operation onto several mutations with special names (RENAME → rename_from /\n * rename_to) are handled via the override tables above.\n */\nexport class KeyspaceNotifier {\n constructor(private readonly broker: RedisPubSubBroker) {}\n\n handle(\n event: RedisMutationEvent,\n activeCommand: string | null,\n rawFlags: string,\n ): void {\n if (rawFlags.length === 0) {\n return\n }\n\n const flags = parseKeyspaceNotifyFlags(rawFlags)\n if (!flags.keyspace && !flags.keyevent) {\n return\n }\n\n const notification = this.resolve(event, activeCommand)\n if (!notification) {\n return\n }\n\n if (!classEnabled(flags, notification.eventClass)) {\n return\n }\n\n const { database, key, event: name } = notification\n if (flags.keyspace) {\n this.broker.publish(\n Buffer.concat([Buffer.from(`__keyspace@${database}__:`), key]),\n Buffer.from(name),\n )\n }\n if (flags.keyevent) {\n this.broker.publish(\n Buffer.from(`__keyevent@${database}__:${name}`),\n Buffer.from(key),\n )\n }\n }\n\n private resolve(\n event: RedisMutationEvent,\n activeCommand: string | null,\n ): ResolvedNotification | null {\n switch (event.type) {\n case 'write': {\n if (!activeCommand) {\n return null\n }\n const name = WRITE_EVENT_OVERRIDES[activeCommand] ?? activeCommand\n const eventClass = GENERIC_WRITE_COMMANDS.has(activeCommand)\n ? 'g'\n : classForType(event.value.type)\n return {\n database: event.database,\n key: event.key,\n event: name,\n eventClass,\n }\n }\n case 'delete': {\n const name =\n (activeCommand && DELETE_EVENT_OVERRIDES[activeCommand]) ?? 'del'\n return {\n database: event.database,\n key: event.key,\n event: name,\n eventClass: 'g',\n }\n }\n case 'expire':\n return {\n database: event.database,\n key: event.key,\n event: 'expire',\n eventClass: 'g',\n }\n case 'persist':\n return {\n database: event.database,\n key: event.key,\n event: 'persist',\n eventClass: 'g',\n }\n case 'evict':\n return {\n database: event.database,\n key: event.key,\n event: 'expired',\n eventClass: 'x',\n }\n case 'flush':\n return null\n }\n }\n}\n","import crypto from 'node:crypto'\n\nexport class RedisScriptCache {\n private readonly scripts = new Map<string, Buffer>()\n\n load(script: Buffer): string {\n const sha = crypto.createHash('sha1').update(script).digest('hex')\n this.scripts.set(sha, Buffer.from(script))\n return sha\n }\n\n get(sha: string): Buffer | null {\n const script = this.scripts.get(normalizeSha(sha))\n return script ? Buffer.from(script) : null\n }\n\n exists(sha: string): boolean {\n return this.scripts.has(normalizeSha(sha))\n }\n\n existsAll(shas: readonly string[]): boolean[] {\n return shas.map(sha => this.exists(sha))\n }\n\n flush(): void {\n this.scripts.clear()\n }\n\n size(): number {\n return this.scripts.size\n }\n}\n\nfunction normalizeSha(sha: string): string {\n return sha.toLowerCase()\n}\n","export type RedisFunctionDefinition = {\n name: string\n libraryName: string\n script: Buffer\n flags: string[]\n}\n\nexport type RedisFunctionLibrary = {\n name: string\n code: Buffer\n functions: RedisFunctionDefinition[]\n}\n\ntype ParsedFunctionRegistration = {\n name: string\n callback: string\n flags: string[]\n start: number\n end: number\n}\n\nconst REGISTER_FUNCTION = 'redis.register_function'\n\nexport class RedisFunctionRegistry {\n private readonly libraries = new Map<string, RedisFunctionLibrary>()\n\n load(library: RedisFunctionLibrary, replace = false): void {\n if (!replace && this.libraries.has(library.name)) {\n throw new Error(`Library '${library.name}' already exists`)\n }\n\n this.libraries.set(library.name, cloneLibrary(library))\n }\n\n delete(name: string): boolean {\n return this.libraries.delete(name)\n }\n\n clear(): void {\n this.libraries.clear()\n }\n\n list(): RedisFunctionLibrary[] {\n return [...this.libraries.values()].map(cloneLibrary)\n }\n\n findFunction(name: string): RedisFunctionDefinition | null {\n for (const library of this.libraries.values()) {\n const fn = library.functions.find(entry => entry.name === name)\n if (fn) {\n return { ...fn, script: Buffer.from(fn.script), flags: [...fn.flags] }\n }\n }\n\n return null\n }\n\n dump(): Buffer {\n return Buffer.from(\n JSON.stringify(\n this.list().map(library => ({\n code: library.code.toString('base64'),\n })),\n ),\n )\n }\n\n restore(payload: Buffer, mode: 'append' | 'flush' | 'replace'): void {\n const libraries = parseDump(payload)\n const snapshot = this.list()\n\n try {\n if (mode === 'flush') {\n this.clear()\n }\n\n for (const library of libraries) {\n this.load(library, mode === 'replace')\n }\n } catch (err) {\n this.clear()\n for (const library of snapshot) {\n this.libraries.set(library.name, cloneLibrary(library))\n }\n throw err\n }\n }\n}\n\nexport function parseFunctionLibrary(code: Buffer): RedisFunctionLibrary {\n const text = code.toString()\n const libraryMatch = text.match(/^#!lua\\s+name=([^\\s]+)\\s*$/m)\n if (!libraryMatch) {\n throw new Error('Missing library metadata')\n }\n\n const name = libraryMatch[1]\n const body = text.replace(/^#![^\\n]*(?:\\n|$)/, '')\n const registrations = registeredFunctions(body)\n const functions = registrations.map(registration => ({\n name: registration.name,\n libraryName: name,\n flags: registration.flags,\n script: buildFunctionScript(body, registration.name, registrations),\n }))\n\n if (functions.length === 0) {\n throw new Error('No functions registered')\n }\n\n return { name, code: Buffer.from(code), functions }\n}\n\nfunction registeredFunctions(text: string): ParsedFunctionRegistration[] {\n const registrations: ParsedFunctionRegistration[] = []\n let index = 0\n\n while (index < text.length) {\n const start = findNextRegisterFunction(text, index)\n if (start === -1) {\n break\n }\n\n const registration = parseRegisterFunction(text, start)\n if (!registration) {\n index = start + REGISTER_FUNCTION.length\n continue\n }\n\n registrations.push(registration)\n index = registration.end\n }\n\n return registrations\n}\n\nfunction buildFunctionScript(\n text: string,\n name: string,\n registrations: readonly ParsedFunctionRegistration[],\n): Buffer {\n let body = ''\n let cursor = 0\n\n for (const registration of registrations) {\n body += text.slice(cursor, registration.start)\n body += `\\n__redis_functions[${JSON.stringify(registration.name)}] = ${registration.callback}\\n`\n cursor = registration.end\n }\n body += text.slice(cursor)\n\n return Buffer.from(\n `local __redis_functions = {}\\n${body}\\nreturn __redis_functions[${JSON.stringify(name)}](KEYS, ARGV)`,\n )\n}\n\nfunction parseDump(payload: Buffer): RedisFunctionLibrary[] {\n let entries: unknown\n try {\n entries = JSON.parse(payload.toString())\n } catch {\n throw new Error('Invalid function payload')\n }\n\n if (!Array.isArray(entries) || !entries.every(entry => isDumpEntry(entry))) {\n throw new Error('Invalid function payload')\n }\n\n return entries.map(entry =>\n parseFunctionLibrary(Buffer.from(entry.code, 'base64')),\n )\n}\n\nfunction isDumpEntry(entry: unknown): entry is { code: string } {\n return (\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as { code?: unknown }).code === 'string'\n )\n}\n\nfunction cloneLibrary(library: RedisFunctionLibrary): RedisFunctionLibrary {\n return {\n name: library.name,\n code: Buffer.from(library.code),\n functions: library.functions.map(fn => ({\n ...fn,\n script: Buffer.from(fn.script),\n flags: [...fn.flags],\n })),\n }\n}\n\nfunction findNextRegisterFunction(text: string, start: number): number {\n for (let index = start; index < text.length; index++) {\n const skipped = skipStringOrComment(text, index)\n if (skipped !== index) {\n index = skipped - 1\n continue\n }\n\n if (text.startsWith(REGISTER_FUNCTION, index)) {\n return index\n }\n }\n\n return -1\n}\n\nfunction parseRegisterFunction(\n text: string,\n start: number,\n): ParsedFunctionRegistration | null {\n let index = skipWhitespace(text, start + REGISTER_FUNCTION.length)\n\n if (text[index] === '{') {\n const end = findMatchingDelimiter(text, index, '{', '}')\n return parseTableRegistration(text, index, end, start, end + 1)\n }\n\n if (text[index] !== '(') {\n return null\n }\n\n const callEnd = findMatchingDelimiter(text, index, '(', ')')\n const innerStart = skipWhitespace(text, index + 1)\n if (text[innerStart] === '{') {\n const tableEnd = findMatchingDelimiter(text, innerStart, '{', '}')\n return parseTableRegistration(\n text,\n innerStart,\n tableEnd,\n start,\n callEnd + 1,\n )\n }\n\n const name = parseStringLiteral(text, innerStart)\n if (!name) {\n return null\n }\n\n index = skipWhitespace(text, name.end)\n if (text[index] !== ',') {\n return null\n }\n\n const callbackStart = skipWhitespace(text, index + 1)\n const callbackEnd = findLuaFunctionEnd(text, callbackStart)\n return {\n name: name.value,\n callback: text.slice(callbackStart, callbackEnd),\n flags: [],\n start,\n end: callEnd + 1,\n }\n}\n\nfunction parseTableRegistration(\n text: string,\n tableStart: number,\n tableEnd: number,\n start: number,\n end: number,\n): ParsedFunctionRegistration | null {\n const nameStart = findFieldValueStart(\n text,\n tableStart + 1,\n tableEnd,\n 'function_name',\n )\n const callbackStart = findFieldValueStart(\n text,\n tableStart + 1,\n tableEnd,\n 'callback',\n )\n if (nameStart === -1 || callbackStart === -1) {\n return null\n }\n\n const name = parseStringLiteral(text, skipWhitespace(text, nameStart))\n if (!name) {\n return null\n }\n\n const callbackValueStart = skipWhitespace(text, callbackStart)\n const callbackEnd = findLuaFunctionEnd(text, callbackValueStart)\n return {\n name: name.value,\n callback: text.slice(callbackValueStart, callbackEnd),\n flags: parseFlagsField(text, tableStart + 1, tableEnd),\n start,\n end,\n }\n}\n\nfunction parseFlagsField(text: string, start: number, end: number): string[] {\n const flagsStart = findFieldValueStart(text, start, end, 'flags')\n if (flagsStart === -1) {\n return []\n }\n\n const tableStart = skipWhitespace(text, flagsStart)\n if (text[tableStart] !== '{') {\n return []\n }\n\n const tableEnd = findMatchingDelimiter(text, tableStart, '{', '}')\n const flags: string[] = []\n let index = tableStart + 1\n\n while (index < tableEnd) {\n const flag = parseStringLiteral(text, index)\n if (flag) {\n flags.push(flag.value)\n index = flag.end\n continue\n }\n\n const skipped = skipStringOrComment(text, index)\n if (skipped !== index) {\n index = skipped\n continue\n }\n\n index++\n }\n\n return flags\n}\n\nfunction findFieldValueStart(\n text: string,\n start: number,\n end: number,\n field: string,\n): number {\n let depth = 0\n\n for (let index = start; index < end; index++) {\n const skipped = skipStringOrComment(text, index)\n if (skipped !== index) {\n index = skipped - 1\n continue\n }\n\n if (isWordAt(text, index, 'function')) {\n index = findLuaFunctionEnd(text, index) - 1\n continue\n }\n\n const char = text[index]\n if (char === '{' || char === '(' || char === '[') {\n depth++\n continue\n }\n if (char === '}' || char === ')' || char === ']') {\n depth--\n continue\n }\n\n if (depth !== 0 || !isWordAt(text, index, field)) {\n continue\n }\n\n const equals = skipWhitespace(text, index + field.length)\n if (text[equals] === '=') {\n return equals + 1\n }\n }\n\n return -1\n}\n\nfunction findMatchingDelimiter(\n text: string,\n start: number,\n open: string,\n close: string,\n): number {\n let depth = 0\n\n for (let index = start; index < text.length; index++) {\n const skipped = skipStringOrComment(text, index)\n if (skipped !== index) {\n index = skipped - 1\n continue\n }\n\n const char = text[index]\n if (char === open) {\n depth++\n continue\n }\n if (char === close) {\n depth--\n if (depth === 0) {\n return index\n }\n }\n }\n\n throw new Error('Malformed function registration')\n}\n\nfunction findLuaFunctionEnd(text: string, start: number): number {\n if (!isWordAt(text, start, 'function')) {\n throw new Error('Malformed function registration')\n }\n\n let depth = 0\n for (let index = start; index < text.length; index++) {\n const skipped = skipStringOrComment(text, index)\n if (skipped !== index) {\n index = skipped - 1\n continue\n }\n\n if (!isIdentifierStart(text[index])) {\n continue\n }\n\n const tokenStart = index\n while (isIdentifierPart(text[index])) {\n index++\n }\n const token = text.slice(tokenStart, index)\n index--\n\n if (\n token === 'function' ||\n token === 'then' ||\n token === 'do' ||\n token === 'repeat'\n ) {\n depth++\n continue\n }\n\n if (token === 'end' || token === 'until') {\n depth--\n if (depth === 0) {\n return index + 1\n }\n }\n }\n\n throw new Error('Malformed function registration')\n}\n\nfunction parseStringLiteral(\n text: string,\n start: number,\n): { value: string; end: number } | null {\n const quote = text[start]\n if (quote !== '\"' && quote !== \"'\") {\n return null\n }\n\n let value = ''\n for (let index = start + 1; index < text.length; index++) {\n const char = text[index]\n if (char === '\\\\') {\n value += text[index + 1] ?? ''\n index++\n continue\n }\n\n if (char === quote) {\n return { value, end: index + 1 }\n }\n\n value += char\n }\n\n throw new Error('Malformed function registration')\n}\n\nfunction skipWhitespace(text: string, start: number): number {\n let index = start\n while (/\\s/.test(text[index] ?? '')) {\n index++\n }\n return index\n}\n\nfunction skipStringOrComment(text: string, start: number): number {\n if (text[start] === '-' && text[start + 1] === '-') {\n const longEnd = skipLongBracket(text, start + 2)\n if (longEnd !== start + 2) {\n return longEnd\n }\n\n const newline = text.indexOf('\\n', start + 2)\n return newline === -1 ? text.length : newline + 1\n }\n\n if (text[start] === '\"' || text[start] === \"'\") {\n return skipQuotedString(text, start)\n }\n\n return skipLongBracket(text, start)\n}\n\nfunction skipQuotedString(text: string, start: number): number {\n const quote = text[start]\n for (let index = start + 1; index < text.length; index++) {\n if (text[index] === '\\\\') {\n index++\n continue\n }\n\n if (text[index] === quote) {\n return index + 1\n }\n }\n\n throw new Error('Malformed function registration')\n}\n\nfunction skipLongBracket(text: string, start: number): number {\n if (text[start] !== '[') {\n return start\n }\n\n let markerEnd = start + 1\n while (text[markerEnd] === '=') {\n markerEnd++\n }\n if (text[markerEnd] !== '[') {\n return start\n }\n\n const close = `]${'='.repeat(markerEnd - start - 1)}]`\n const closeStart = text.indexOf(close, markerEnd + 1)\n if (closeStart === -1) {\n throw new Error('Malformed function registration')\n }\n\n return closeStart + close.length\n}\n\nfunction isWordAt(text: string, start: number, word: string): boolean {\n return (\n text.startsWith(word, start) &&\n !isIdentifierPart(text[start - 1]) &&\n !isIdentifierPart(text[start + word.length])\n )\n}\n\nfunction isIdentifierStart(char: string | undefined): boolean {\n return char !== undefined && /[A-Za-z_]/.test(char)\n}\n\nfunction isIdentifierPart(char: string | undefined): boolean {\n return char !== undefined && /[A-Za-z0-9_]/.test(char)\n}\n","export function redisGlobMatch(pattern: Buffer, value: Buffer): boolean {\n return matchGlob(pattern, 0, value, 0)\n}\n\nfunction matchGlob(\n pattern: Buffer,\n patternIndex: number,\n value: Buffer,\n valueIndex: number,\n): boolean {\n let patternCursor = patternIndex\n let valueCursor = valueIndex\n\n while (patternCursor < pattern.length && valueCursor < value.length) {\n const token = pattern[patternCursor]\n\n if (token === STAR) {\n while (pattern[patternCursor + 1] === STAR) {\n patternCursor++\n }\n\n if (patternCursor + 1 === pattern.length) {\n return true\n }\n\n for (\n let nextValueCursor = valueCursor;\n nextValueCursor < value.length;\n nextValueCursor++\n ) {\n if (matchGlob(pattern, patternCursor + 1, value, nextValueCursor)) {\n return true\n }\n }\n\n return false\n }\n\n if (token === QUESTION_MARK) {\n patternCursor++\n valueCursor++\n continue\n }\n\n if (token === OPEN_BRACKET) {\n const characterClass = matchCharacterClass(\n pattern,\n patternCursor,\n value[valueCursor],\n )\n\n if (!characterClass.matches) {\n return false\n }\n\n patternCursor = characterClass.nextPatternIndex\n valueCursor++\n continue\n }\n\n if (token === BACKSLASH && patternCursor + 1 < pattern.length) {\n patternCursor++\n }\n\n if (pattern[patternCursor] !== value[valueCursor]) {\n return false\n }\n\n patternCursor++\n valueCursor++\n }\n\n while (pattern[patternCursor] === STAR) {\n patternCursor++\n }\n\n return patternCursor === pattern.length && valueCursor === value.length\n}\n\nfunction matchCharacterClass(\n pattern: Buffer,\n openBracketIndex: number,\n value: number,\n): { matches: boolean; nextPatternIndex: number } {\n let patternCursor = openBracketIndex + 1\n let negated = false\n\n if (pattern[patternCursor] === CARET) {\n negated = true\n patternCursor++\n }\n\n let matches = false\n\n while (true) {\n if (pattern[patternCursor] === CLOSE_BRACKET) {\n break\n }\n\n if (patternCursor >= pattern.length) {\n patternCursor--\n break\n }\n\n if (\n pattern[patternCursor] === BACKSLASH &&\n patternCursor + 1 < pattern.length\n ) {\n patternCursor++\n if (pattern[patternCursor] === value) {\n matches = true\n }\n } else if (\n patternCursor + 2 < pattern.length &&\n pattern[patternCursor + 1] === DASH\n ) {\n let start = pattern[patternCursor]\n let end = pattern[patternCursor + 2]\n\n if (start > end) {\n const previousStart = start\n start = end\n end = previousStart\n }\n\n if (value >= start && value <= end) {\n matches = true\n }\n\n patternCursor += 2\n } else if (pattern[patternCursor] === value) {\n matches = true\n }\n\n patternCursor++\n }\n\n return {\n matches: negated ? !matches : matches,\n nextPatternIndex: patternCursor + 1,\n }\n}\n\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst CARET = '^'.charCodeAt(0)\nconst CLOSE_BRACKET = ']'.charCodeAt(0)\nconst DASH = '-'.charCodeAt(0)\nconst OPEN_BRACKET = '['.charCodeAt(0)\nconst QUESTION_MARK = '?'.charCodeAt(0)\nconst STAR = '*'.charCodeAt(0)\n","import { redisGlobMatch } from '../core/glob'\nimport type { Unsubscribe } from './mutation-events'\n\nexport type RedisPubSubMessage = {\n channel: Buffer\n message: Buffer\n}\n\nexport type RedisPubSubPatternMessage = RedisPubSubMessage & {\n pattern: Buffer\n}\n\nexport type RedisPubSubMessageListener = (message: RedisPubSubMessage) => void\n\nexport type RedisPubSubPatternMessageListener = (\n message: RedisPubSubPatternMessage,\n) => void\n\ntype ChannelSubscriber = {\n channel: Buffer\n listener: RedisPubSubMessageListener\n}\n\ntype PatternSubscriber = {\n pattern: Buffer\n listener: RedisPubSubPatternMessageListener\n}\n\nexport class RedisPubSubBroker {\n private readonly channels = new Map<string, Map<symbol, ChannelSubscriber>>()\n private readonly shardChannels = new Map<\n string,\n Map<symbol, ChannelSubscriber>\n >()\n private readonly patterns = new Map<string, Map<symbol, PatternSubscriber>>()\n\n subscribe(\n channel: Buffer,\n listener: RedisPubSubMessageListener,\n ): Unsubscribe {\n const id = Symbol('channel-subscriber')\n const key = pubsubKey(channel)\n let subscribers = this.channels.get(key)\n if (!subscribers) {\n subscribers = new Map()\n this.channels.set(key, subscribers)\n }\n\n subscribers.set(id, { channel: Buffer.from(channel), listener })\n return () => {\n subscribers?.delete(id)\n if (subscribers?.size === 0) {\n this.channels.delete(key)\n }\n }\n }\n\n psubscribe(\n pattern: Buffer,\n listener: RedisPubSubPatternMessageListener,\n ): Unsubscribe {\n const id = Symbol('pattern-subscriber')\n const key = pubsubKey(pattern)\n let subscribers = this.patterns.get(key)\n if (!subscribers) {\n subscribers = new Map()\n this.patterns.set(key, subscribers)\n }\n\n subscribers.set(id, { pattern: Buffer.from(pattern), listener })\n return () => {\n subscribers?.delete(id)\n if (subscribers?.size === 0) {\n this.patterns.delete(key)\n }\n }\n }\n\n ssubscribe(\n channel: Buffer,\n listener: RedisPubSubMessageListener,\n ): Unsubscribe {\n const id = Symbol('shard-channel-subscriber')\n const key = pubsubKey(channel)\n let subscribers = this.shardChannels.get(key)\n if (!subscribers) {\n subscribers = new Map()\n this.shardChannels.set(key, subscribers)\n }\n\n subscribers.set(id, { channel: Buffer.from(channel), listener })\n return () => {\n subscribers?.delete(id)\n if (subscribers?.size === 0) {\n this.shardChannels.delete(key)\n }\n }\n }\n\n publish(channel: Buffer, message: Buffer): number {\n let delivered = 0\n const channelSubscribers = this.channels.get(pubsubKey(channel))\n\n if (channelSubscribers) {\n for (const subscriber of Array.from(channelSubscribers.values())) {\n subscriber.listener({\n channel: Buffer.from(channel),\n message: Buffer.from(message),\n })\n delivered++\n }\n }\n\n for (const subscribers of Array.from(this.patterns.values())) {\n for (const subscriber of Array.from(subscribers.values())) {\n if (!redisGlobMatch(subscriber.pattern, channel)) {\n continue\n }\n\n subscriber.listener({\n pattern: Buffer.from(subscriber.pattern),\n channel: Buffer.from(channel),\n message: Buffer.from(message),\n })\n delivered++\n }\n }\n\n return delivered\n }\n\n spublish(channel: Buffer, message: Buffer): number {\n let delivered = 0\n const channelSubscribers = this.shardChannels.get(pubsubKey(channel))\n\n if (!channelSubscribers) {\n return delivered\n }\n\n for (const subscriber of Array.from(channelSubscribers.values())) {\n subscriber.listener({\n channel: Buffer.from(channel),\n message: Buffer.from(message),\n })\n delivered++\n }\n\n return delivered\n }\n\n channelsMatching(pattern?: Buffer): Buffer[] {\n const channels: Buffer[] = []\n\n for (const subscribers of this.channels.values()) {\n const first = subscribers.values().next().value\n if (!first) {\n continue\n }\n\n if (pattern && !redisGlobMatch(pattern, first.channel)) {\n continue\n }\n\n channels.push(Buffer.from(first.channel))\n }\n\n return channels\n }\n\n shardChannelsMatching(pattern?: Buffer): Buffer[] {\n const channels: Buffer[] = []\n\n for (const subscribers of this.shardChannels.values()) {\n const first = subscribers.values().next().value\n if (!first) {\n continue\n }\n\n if (pattern && !redisGlobMatch(pattern, first.channel)) {\n continue\n }\n\n channels.push(Buffer.from(first.channel))\n }\n\n return channels\n }\n\n subscriberCount(channel: Buffer): number {\n return this.channels.get(pubsubKey(channel))?.size ?? 0\n }\n\n shardSubscriberCount(channel: Buffer): number {\n return this.shardChannels.get(pubsubKey(channel))?.size ?? 0\n }\n\n patternSubscriptionCount(): number {\n let count = 0\n for (const subscribers of this.patterns.values()) {\n count += subscribers.size\n }\n return count\n }\n}\n\nfunction pubsubKey(value: Buffer): string {\n return value.toString('hex')\n}\n","import clusterKeySlot from 'cluster-key-slot'\n\nexport type RedisClusterNodeRole = 'master' | 'replica'\n\nexport type RedisClusterNode = {\n id: string\n role: RedisClusterNodeRole\n host: string\n port: number\n masterId?: string\n slots: Array<[number, number]>\n}\n\nexport const REDIS_CLUSTER_SLOT_COUNT = 16384\n\nexport class RedisClusterTopology {\n constructor(public readonly nodes: readonly RedisClusterNode[] = []) {\n validateTopology(nodes)\n }\n\n calculateSlot(key: Buffer): number {\n return clusterKeySlot(key)\n }\n\n calculateSlotForKeys(keys: readonly Buffer[]): number | null {\n if (keys.length === 0) {\n return null\n }\n\n return clusterKeySlot.generateMulti([...keys])\n }\n\n getNode(id: string): RedisClusterNode | undefined {\n for (const node of this.nodes) {\n if (node.id === id) {\n return node\n }\n }\n\n return undefined\n }\n\n /**\n * Returns the master node owning the slot. Replicas are never returned —\n * MOVED must always direct the client to a master. Returns undefined if\n * the slot is unassigned.\n */\n getSlotOwner(slot: number): RedisClusterNode | undefined {\n for (const node of this.nodes) {\n if (node.role !== 'master') {\n continue\n }\n\n if (nodeOwnsSlot(node, slot)) {\n return node\n }\n }\n\n return undefined\n }\n\n /**\n * Returns whether the node is the master serving the slot. Replicas never\n * own slots for routing purposes — keyed commands sent directly to a\n * replica must redirect to the master via MOVED.\n */\n nodeOwnsSlot(nodeId: string, slot: number): boolean {\n const node = this.getNode(nodeId)\n return node && node.role === 'master' ? nodeOwnsSlot(node, slot) : false\n }\n\n /**\n * Returns whether a node may serve a readonly command for the slot after the\n * client enabled Redis Cluster READONLY mode. Masters may serve their own\n * slots; replicas may serve slots owned by their configured master.\n */\n nodeCanServeReadonlySlot(nodeId: string, slot: number): boolean {\n const node = this.getNode(nodeId)\n if (!node) {\n return false\n }\n\n if (node.role === 'master') {\n return nodeOwnsSlot(node, slot)\n }\n\n if (!node.masterId) {\n return false\n }\n\n const master = this.getNode(node.masterId)\n return master && master.role === 'master'\n ? nodeOwnsSlot(master, slot)\n : false\n }\n}\n\nfunction validateTopology(nodes: readonly RedisClusterNode[]): void {\n const ids = new Set<string>()\n for (const node of nodes) {\n if (ids.has(node.id)) {\n throw new Error(`Duplicate cluster node id ${node.id}`)\n }\n ids.add(node.id)\n\n for (const [min, max] of node.slots) {\n if (\n !Number.isInteger(min) ||\n !Number.isInteger(max) ||\n min < 0 ||\n max >= REDIS_CLUSTER_SLOT_COUNT ||\n min > max\n ) {\n throw new Error(\n `Invalid slot range [${min}, ${max}] on node ${node.id}`,\n )\n }\n }\n\n if (node.role === 'replica' && !node.masterId) {\n throw new Error(`Replica node ${node.id} is missing masterId`)\n }\n }\n}\n\nfunction nodeOwnsSlot(node: RedisClusterNode, slot: number): boolean {\n for (const [min, max] of node.slots) {\n if (slot >= min && slot <= max) {\n return true\n }\n }\n\n return false\n}\n","import {\n load,\n type CompatProfile,\n type LoadOptions,\n type LuaEngine,\n type LuaWasmModule,\n type ReplyValue,\n} from 'lua-redis-wasm'\nimport type { CompatibilityProfile } from './compatibility/profile'\nimport type { CommandPlan } from './command-definition'\nimport {\n RedisCommandError,\n ScriptCallNoCommandError,\n ScriptNotAllowedCommandError,\n ScriptUnknownCommandError,\n UnknownRedisCommandError,\n} from './redis-error'\nimport type { RedisExecutionContext } from './redis-context'\nimport { RedisValue } from './redis-value'\n\ntype LuaHostState = {\n ctx: RedisExecutionContext | null\n readOnly: boolean\n}\n\nexport type LuaReplyValue = ReplyValue\n\nexport class RedisLuaRuntime {\n private readonly hostState: LuaHostState = {\n ctx: null,\n readOnly: false,\n }\n private readonly engine: LuaEngine\n\n constructor(module: LuaWasmModule) {\n this.engine = module.create({\n redisCall: args => this.runRedisCommand(args),\n redisPcall: args => this.runRedisCommand(args),\n log: () => {},\n })\n }\n\n eval(\n script: Buffer,\n keys: readonly Buffer[],\n args: readonly Buffer[],\n ctx: RedisExecutionContext,\n options?: { readOnly?: boolean },\n ): ReplyValue {\n if (this.hostState.ctx) {\n throw new RedisCommandError('Lua runtime is already executing a script')\n }\n\n this.hostState.ctx = ctx\n this.hostState.readOnly = options?.readOnly ?? false\n\n try {\n return this.engine.evalWithArgs(script, [...keys], [...args])\n } finally {\n this.hostState.ctx = null\n this.hostState.readOnly = false\n }\n }\n\n // Host callback for redis.call()/redis.pcall(). Both modes share the same\n // dispatch: the engine decides whether an error aborts the script (call) or is\n // returned as a value (pcall) and decorates it with the script sha accordingly.\n private runRedisCommand(args: Buffer[]): ReplyValue {\n const ctx = this.hostState.ctx\n if (!ctx) {\n throw new Error('ERR Lua runtime is not initialized')\n }\n\n if (args.length === 0) {\n return redisErrorToLuaReply(new ScriptCallNoCommandError())\n }\n\n let plan: CommandPlan\n try {\n plan = ctx.executor.plan(args[0], args.slice(1))\n } catch (err) {\n if (err instanceof UnknownRedisCommandError) {\n return redisErrorToLuaReply(new ScriptUnknownCommandError())\n }\n\n if (err instanceof RedisCommandError) {\n return redisErrorToLuaReply(err)\n }\n\n throw err\n }\n\n if (plan.flags.includes('noscript')) {\n return redisErrorToLuaReply(new ScriptNotAllowedCommandError())\n }\n\n if (this.hostState.readOnly && plan.flags.includes('write')) {\n return redisErrorToLuaReply(\n new RedisCommandError(\n 'Write commands are not allowed from read-only scripts.',\n ),\n )\n }\n\n const result = ctx.executor.executePlanSync(\n plan,\n createLuaMonitorContext(ctx),\n )\n return redisValueToLuaReply(normalizeScriptCommandValue(result.value))\n }\n}\n\nfunction createLuaMonitorContext(\n ctx: RedisExecutionContext,\n): RedisExecutionContext {\n return {\n get db() {\n return ctx.db\n },\n server: ctx.server,\n session: ctx.session,\n executor: ctx.executor,\n ...(ctx.transactionReplay\n ? { transactionReplay: ctx.transactionReplay }\n : {}),\n ...(ctx.nodeRole ? { nodeRole: ctx.nodeRole } : {}),\n monitor: {\n ...ctx.monitor,\n defer: true,\n clientAddress: 'lua',\n },\n signal: ctx.signal,\n park: ctx.park,\n }\n}\n\n// Each RedisLuaRuntime gets its own freshly-loaded WASM module + LuaEngine +\n// hostState. A LuaWasmModule is single-use (module.create() consumes it), so it\n// cannot be shared between engines. Scoping a runtime per RedisServerState (see\n// RedisServerState.getLuaRuntime) keeps each logical node's script re-entrancy\n// guard isolated, so concurrent EVALs on independent server/cluster nodes never\n// collide (issue #130).\nlet luaWasmLoadOptions: LoadOptions = {}\n\n/**\n * Override where the Lua WASM module + Emscripten glue are loaded from — e.g. a\n * CDN URL (`{ modulePath, wasmPath }`) or preloaded bytes (`{ wasmBytes }`).\n * Affects every runtime created afterwards, so set it once before the first EVAL.\n * Mainly useful in browser bundles that want the `.wasm` served from a CDN\n * instead of emitted as a local asset.\n */\nexport function setLuaWasmLoadOptions(options: LoadOptions): void {\n luaWasmLoadOptions = options\n}\n\nexport async function createRedisLuaRuntime(\n profile?: CompatibilityProfile,\n): Promise<RedisLuaRuntime> {\n const module = await load({\n ...luaWasmLoadOptions,\n ...(profile ? { profile: toLuaCompatProfile(profile) } : {}),\n })\n return new RedisLuaRuntime(module)\n}\n\n/**\n * Map a server compatibility profile to the Lua engine's compat profile. The\n * engine collapses aliases (redis-7.0 == 7.2, redis-7.4 == 8.0, valkey-8.0 ==\n * 9.0), so only the behavioral groups matter — they gate whether the sandbox\n * keeps `print` (6.2 only), exposes `os` (7.4+), and aliases `server` (valkey).\n */\nfunction toLuaCompatProfile(profile: CompatibilityProfile): CompatProfile {\n if (profile.flavor === 'valkey') {\n return 'valkey-8.0'\n }\n const [major, minor] = profile.version.split('.').map(n => parseInt(n, 10))\n if (major < 7) {\n return 'redis-6.2'\n }\n if (major === 7 && minor < 4) {\n return 'redis-7.0'\n }\n return 'redis-8.0'\n}\n\nexport function luaReplyToRedisValue(value: ReplyValue): RedisValue {\n if (value === null || value === undefined) {\n return RedisValue.null()\n }\n\n if (typeof value === 'number' || typeof value === 'bigint') {\n return RedisValue.integer(value)\n }\n\n // RESP3 boolean reply (redis.setresp(3) + a Lua boolean).\n if (typeof value === 'boolean') {\n return RedisValue.boolean(value)\n }\n\n if (Buffer.isBuffer(value)) {\n return RedisValue.bulkString(value)\n }\n\n if (Array.isArray(value)) {\n return RedisValue.array(value.map(luaReplyToRedisValue))\n }\n\n if ('ok' in value) {\n return RedisValue.simpleString(value.ok.toString())\n }\n\n if ('err' in value) {\n // The engine supplies an explicit code (or none, for verbatim returned error\n // tables); the host does not infer one.\n return RedisValue.error(value.err.toString(), value.code?.toString())\n }\n\n // RESP3 reply shapes the engine produces under redis.setresp(3).\n if ('double' in value) {\n return RedisValue.double(value.double)\n }\n\n if ('big_number' in value) {\n return RedisValue.bigNumber(BigInt(value.big_number.toString()))\n }\n\n if ('verbatim_string' in value) {\n return RedisValue.verbatim(\n value.verbatim_string.format.toString(),\n value.verbatim_string.string,\n )\n }\n\n if ('map' in value) {\n return RedisValue.map(\n value.map.map(([k, v]) => [\n luaReplyToRedisValue(k),\n luaReplyToRedisValue(v),\n ]),\n )\n }\n\n if ('set' in value) {\n return RedisValue.set(value.set.map(luaReplyToRedisValue))\n }\n\n return RedisValue.bulkString(Buffer.from(String(value)))\n}\n\n/**\n * Renders a script-aborting error into its final Redis wire message. The engine\n * classifies these errors and attaches metadata — `{ line, sha }` always, plus a\n * machine `kind`/`name` for the errors it originates itself — but composes no\n * user-facing prose, so the host owns the wording and the\n * `... script: <sha>, on @user_script:<line>.` decoration.\n *\n * Errors carrying their own message (Lua runtime errors, propagated command\n * errors, and global writes — which Lua's native readonly table rejects with\n * \"Attempt to modify a readonly table\") have no kind and pass through. Replies\n * without metadata (returned error tables, redis.error_reply, host-side limit\n * errors) are emitted verbatim, matching real Redis.\n */\nexport function renderScriptError(value: ReplyValue): ReplyValue {\n if (\n value === null ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n Buffer.isBuffer(value) ||\n !('err' in value)\n ) {\n return value\n }\n const meta = value.meta\n if (!meta) {\n return value\n }\n\n const { line, sha, kind, name } = meta\n let body: string\n switch (kind) {\n case 'global-read':\n body = `user_script:${line}: Script attempted to access nonexistent global variable '${name}'`\n break\n case 'command-arg-type':\n // Raised by redis.call/pcall without a script-position prefix.\n body = 'Lua redis lib command arguments must be strings or integers'\n break\n default:\n body = value.err.toString('utf8')\n }\n\n const message = `${body} script: ${sha}, on @user_script:${line}.`\n return { err: Buffer.from(message, 'utf8'), code: value.code }\n}\n\nfunction redisValueToLuaReply(value: RedisValue): ReplyValue {\n switch (value.kind) {\n case 'simple-string':\n return { ok: Buffer.from(value.value) }\n case 'bulk-string':\n return value.value\n case 'integer':\n return value.value\n case 'double':\n return Buffer.from(formatNumber(value.value))\n case 'boolean':\n return value.value ? 1 : 0\n case 'big-number':\n return Buffer.from(value.value.toString())\n case 'verbatim':\n return value.value\n case 'array':\n return value.items.map(redisValueToLuaReply)\n case 'set':\n return value.items.map(redisValueToLuaReply)\n case 'map':\n return value.entries.flatMap(([key, entryValue]) => [\n redisValueToLuaReply(key),\n redisValueToLuaReply(entryValue),\n ])\n case 'map-pairs':\n return value.entries.map(([key, entryValue]) => [\n redisValueToLuaReply(key),\n redisValueToLuaReply(entryValue),\n ])\n case 'flat-pairs':\n // EVAL uses RESP2 semantics — WITHSCORES is a flat array to scripts.\n return value.entries.flatMap(([key, entryValue]) => [\n redisValueToLuaReply(key),\n redisValueToLuaReply(entryValue),\n ])\n case 'push':\n return [Buffer.from(value.name), ...value.items.map(redisValueToLuaReply)]\n case 'null':\n case 'null-array':\n return null\n case 'error':\n return {\n err: Buffer.from(value.message),\n code: value.code ? Buffer.from(value.code) : undefined,\n }\n }\n}\n\n// A command run from a script cannot redirect the client, so a MOVED reply is\n// surfaced to the script as a generic error instead of a cluster redirect.\nfunction normalizeScriptCommandValue(value: RedisValue): RedisValue {\n if (value.kind === 'error' && value.code === 'MOVED') {\n return RedisValue.error(\n 'Script attempted to access a non local key in a cluster node',\n 'ERR',\n )\n }\n\n return value\n}\n\nfunction redisErrorToLuaReply(err: RedisCommandError): ReplyValue {\n return {\n err: Buffer.from(err.message),\n code: Buffer.from(err.code),\n }\n}\n\nfunction formatNumber(value: number): string {\n if (Number.isNaN(value)) {\n return 'nan'\n }\n\n if (value === Infinity) {\n return 'inf'\n }\n\n if (value === -Infinity) {\n return '-inf'\n }\n\n if (Object.is(value, -0)) {\n return '-0'\n }\n\n return value.toString()\n}\n","import { RedisClusterTopology } from './cluster-topology'\nimport { RedisDatabase } from './database'\nimport { KeyspaceNotifier } from './keyspace-notifier'\nimport { RedisMonitorFeed } from './monitor-feed'\nimport type { Unsubscribe } from './mutation-events'\nimport { RedisPubSubBroker } from './pubsub-broker'\nimport { RedisScriptCache } from './script-cache'\nimport { RedisFunctionRegistry } from './function-registry'\nimport type { RedisClientSession } from '../core/redis-context'\nimport {\n createRedisLuaRuntime,\n type RedisLuaRuntime,\n} from '../core/lua-runtime'\nimport {\n resolveCompatibilityProfile,\n type CompatibilityProfile,\n type CompatibilitySpec,\n} from '../core/compatibility'\n\nexport type RedisServerStateOptions = {\n databaseCount?: number\n clusterTopology?: RedisClusterTopology\n monitorFeed?: RedisMonitorFeed\n pubsubBroker?: RedisPubSubBroker\n scriptCache?: RedisScriptCache\n functionRegistry?: RedisFunctionRegistry\n /**\n * Interval for the background active-expiry sweep. Set to `false` to disable\n * the timer for tests that need full manual control of expiration.\n */\n activeExpiryIntervalMs?: number | false\n /**\n * Optional server password (Redis `requirepass`). When set, connections start\n * unauthenticated and must `AUTH` before running most commands. When unset,\n * the default user is `nopass` and no authentication is enforced.\n */\n requirepass?: string\n compatibility?: CompatibilitySpec\n}\n\nconst DEFAULT_ACTIVE_EXPIRY_INTERVAL_MS = 100\n\nexport class RedisServerState {\n readonly databases: RedisDatabase[]\n readonly scriptCache: RedisScriptCache\n readonly monitorFeed: RedisMonitorFeed\n readonly pubsubBroker: RedisPubSubBroker\n readonly functionRegistry: RedisFunctionRegistry\n readonly clusterTopology: RedisClusterTopology\n readonly requirepass?: string\n readonly profile: CompatibilityProfile\n /**\n * Normalized `notify-keyspace-events` flag string (Redis canonical form, e.g.\n * `\"AKE\"`). Empty string disables keyspace notifications. Managed via\n * CONFIG GET/SET; read by the wired {@link KeyspaceNotifier} on each mutation.\n */\n notifyKeyspaceEvents = ''\n private readonly clientSessions = new Set<RedisClientSession>()\n private activeExpiryTimer: ReturnType<typeof setTimeout> | null = null\n private closed = false\n private luaRuntimePromise: Promise<RedisLuaRuntime> | null = null\n\n constructor(options?: RedisServerStateOptions) {\n this.requirepass = options?.requirepass\n this.profile = resolveCompatibilityProfile(options?.compatibility)\n const databaseCount = options?.databaseCount ?? 1\n if (!Number.isInteger(databaseCount) || databaseCount < 1) {\n throw new Error(`Invalid database count ${databaseCount}`)\n }\n\n this.databases = Array.from(\n { length: databaseCount },\n (_, index) => new RedisDatabase(index),\n )\n this.scriptCache = options?.scriptCache ?? new RedisScriptCache()\n this.functionRegistry =\n options?.functionRegistry ?? new RedisFunctionRegistry()\n this.monitorFeed = options?.monitorFeed ?? new RedisMonitorFeed()\n this.pubsubBroker = options?.pubsubBroker ?? new RedisPubSubBroker()\n this.clusterTopology =\n options?.clusterTopology ?? new RedisClusterTopology()\n\n // Bridge every database's mutation bus to the Pub/Sub broker so key\n // mutations surface as Redis keyspace/keyevent notifications. The bridge is\n // always wired; it is a cheap no-op while `notifyKeyspaceEvents` is empty.\n const notifier = new KeyspaceNotifier(this.pubsubBroker)\n for (const database of this.databases) {\n database.subscribe(event =>\n notifier.handle(\n event,\n database.activeNotifyCommand,\n this.notifyKeyspaceEvents,\n ),\n )\n }\n\n this.startActiveExpiry(options?.activeExpiryIntervalMs)\n }\n\n /**\n * Returns this server's own Lua runtime, created lazily and memoized per\n * RedisServerState instance. Scoping the runtime here (rather than a\n * process-wide singleton) keeps each logical node's LuaEngine + script\n * re-entrancy guard isolated, so concurrent EVALs on independent\n * server/cluster nodes never collide (issue #130).\n */\n getLuaRuntime(): Promise<RedisLuaRuntime> {\n this.luaRuntimePromise ??= createRedisLuaRuntime(this.profile)\n return this.luaRuntimePromise\n }\n\n getDatabase(id: number): RedisDatabase {\n const database = this.databases[id]\n if (!database) {\n throw new Error(`Database ${id} does not exist`)\n }\n\n return database\n }\n\n registerClientSession(session: RedisClientSession): Unsubscribe {\n this.clientSessions.add(session)\n return () => this.clientSessions.delete(session)\n }\n\n getConnectedClients(): readonly RedisClientSession[] {\n return [...this.clientSessions]\n }\n\n /**\n * Flushes keyspace data only. Redis script cache is server-wide state and\n * remains intact until SCRIPT FLUSH.\n */\n flushAllDatabases(): void {\n for (const database of this.databases) {\n database.flush()\n }\n }\n\n sweepExpired(now = Date.now()): number {\n let count = 0\n for (const database of this.databases) {\n count += database.sweepExpired(now)\n }\n return count\n }\n\n close(): void {\n this.closed = true\n if (this.activeExpiryTimer) {\n clearTimeout(this.activeExpiryTimer)\n this.activeExpiryTimer = null\n }\n }\n\n private startActiveExpiry(intervalMs: number | false | undefined): void {\n if (intervalMs === false) {\n return\n }\n\n const resolvedIntervalMs = intervalMs ?? DEFAULT_ACTIVE_EXPIRY_INTERVAL_MS\n if (!Number.isInteger(resolvedIntervalMs) || resolvedIntervalMs < 1) {\n throw new Error(`Invalid active expiry interval ${resolvedIntervalMs}`)\n }\n\n this.scheduleActiveExpiry(resolvedIntervalMs)\n }\n\n private scheduleActiveExpiry(intervalMs: number): void {\n const timer = setTimeout(() => {\n this.activeExpiryTimer = null\n void this.runActiveExpiryTick(intervalMs)\n }, intervalMs)\n\n ;(timer as ReturnType<typeof setTimeout> & { unref?: () => void }).unref?.()\n this.activeExpiryTimer = timer\n }\n\n private async runActiveExpiryTick(intervalMs: number): Promise<void> {\n try {\n await this.runActiveExpiry()\n } catch {\n // Active expiry is best-effort; command reads still lazily expire keys.\n } finally {\n if (!this.closed) {\n this.scheduleActiveExpiry(intervalMs)\n }\n }\n }\n\n private async runActiveExpiry(): Promise<void> {\n if (this.closed) {\n return\n }\n\n const now = Date.now()\n for (const database of this.databases) {\n if (this.closed) {\n return\n }\n\n const turn = await database.turnQueue.waitTurn()\n try {\n if (!this.closed) {\n database.sweepExpired(now)\n }\n } finally {\n turn.release()\n }\n }\n }\n}\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport {\n RedisCommandError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport { normalizeKeyspaceNotifyConfig } from '../state'\nimport { ok } from './helpers'\nimport { commandSubcommandInfo } from './introspection'\n\n// Behavior-driving parameters whose authoritative value lives on the server\n// state (not the inert defaults map below), so other subsystems can read them.\nconst KEYSPACE_NOTIFY_PARAM = 'notify-keyspace-events'\n\n/**\n * Plausible Redis defaults for the parameters client libraries probe during\n * connection setup. There is no real configuration subsystem behind this — the\n * values exist only so that `CONFIG GET` returns something sane and `CONFIG SET`\n * has a known parameter set to validate against. Extend this map as more\n * parameters are needed; do not treat any value here as authoritative.\n */\nconst CONFIG_DEFAULTS: Readonly<Record<string, string>> = {\n appendonly: 'no',\n 'bind-source-addr': '',\n databases: '16',\n 'hash-max-listpack-entries': '128',\n 'hash-max-listpack-value': '64',\n 'list-max-listpack-size': '128',\n loglevel: 'notice',\n maxclients: '10000',\n maxmemory: '0',\n 'maxmemory-clients': '0',\n 'maxmemory-policy': 'noeviction',\n 'maxmemory-samples': '5',\n 'proto-max-bulk-len': '536870912',\n save: '3600 1 300 100 60 10000',\n 'set-max-intset-entries': '512',\n 'set-max-listpack-entries': '128',\n 'tcp-keepalive': '300',\n timeout: '0',\n 'zset-max-listpack-entries': '128',\n 'zset-max-listpack-value': '64',\n}\n\n// Per-server backing store, lazily seeded from CONFIG_DEFAULTS. Keyed on the\n// server object so concurrent in-process servers (e.g. the mock cluster used in\n// tests) never share mutable config state.\nconst configStores = new WeakMap<object, Map<string, string>>()\n\nfunction getConfigStore(ctx: RedisExecutionContext): Map<string, string> {\n let store = configStores.get(ctx.server)\n if (store === undefined) {\n store = new Map(Object.entries(CONFIG_DEFAULTS))\n configStores.set(ctx.server, store)\n }\n return store\n}\n\nfunction globMatches(pattern: string, value: string): boolean {\n let source = '^'\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]\n if (char === '*') {\n source += '.*'\n } else if (char === '?') {\n source += '.'\n } else {\n source += char.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n }\n }\n source += '$'\n return new RegExp(source, 'i').test(value)\n}\n\nfunction configGet(\n args: readonly Buffer[],\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.length === 0) {\n throw new WrongNumberOfArgumentsError('config|get')\n }\n\n const store = getConfigStore(ctx)\n // Overlay server-backed params so CONFIG GET reflects their live values.\n const effective = new Map(store)\n effective.set(KEYSPACE_NOTIFY_PARAM, ctx.server.notifyKeyspaceEvents)\n\n const patterns = args.map(arg => arg.toString())\n const matched = new Map<string, string>()\n for (const [name, value] of effective) {\n if (patterns.some(pattern => globMatches(pattern, name))) {\n matched.set(name, value)\n }\n }\n\n const bulk = (text: string): RedisValue =>\n RedisValue.bulkString(Buffer.from(text))\n\n const entries: [RedisValue, RedisValue][] = []\n for (const [name, value] of matched) {\n entries.push([bulk(name), bulk(value)])\n }\n return RedisResult.create(RedisValue.map(entries))\n}\n\nfunction configSet(\n args: readonly Buffer[],\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.length === 0 || args.length % 2 !== 0) {\n throw new WrongNumberOfArgumentsError('config|set')\n }\n\n const store = getConfigStore(ctx)\n const updates: [string, string][] = []\n for (let i = 0; i < args.length; i += 2) {\n const name = args[i].toString().toLowerCase()\n const value = args[i + 1].toString()\n if (name === KEYSPACE_NOTIFY_PARAM) {\n // Validate + normalize now so the whole SET aborts before applying any.\n updates.push([name, normalizeKeyspaceNotifyConfig(value)])\n continue\n }\n if (!store.has(name)) {\n throw new RedisCommandError(\n `Unknown option or number of arguments for CONFIG SET - '${args[i].toString()}'`,\n )\n }\n updates.push([name, value])\n }\n\n // Validate every parameter before applying any — CONFIG SET is atomic.\n for (const [name, value] of updates) {\n if (name === KEYSPACE_NOTIFY_PARAM) {\n ctx.server.notifyKeyspaceEvents = value\n continue\n }\n store.set(name, value)\n }\n return ok()\n}\n\nfunction configResetStat(args: readonly Buffer[]): RedisResult {\n if (args.length !== 0) {\n throw new WrongNumberOfArgumentsError('config|resetstat')\n }\n\n return ok()\n}\n\nfunction configRewrite(args: readonly Buffer[]): RedisResult {\n if (args.length !== 0) {\n throw new WrongNumberOfArgumentsError('config|rewrite')\n }\n\n throw new RedisCommandError('The server is running without a config file')\n}\n\nexport const configCommand = defineCommand({\n name: 'config',\n schema: t.object({\n subcommand: t.string(),\n args: t.variadic(t.bulk()),\n }),\n flags: ['admin', 'noscript'],\n monitor: {\n skip: true,\n },\n introspection: {\n arity: -2,\n flags: [],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('config|get', -3),\n commandSubcommandInfo('config|set', -4),\n commandSubcommandInfo('config|help', 2),\n commandSubcommandInfo('config|resetstat', 2),\n commandSubcommandInfo('config|rewrite', 2),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const subcommand = args.subcommand.toLowerCase()\n\n if (subcommand === 'get') {\n return configGet(args.args, ctx)\n }\n\n if (subcommand === 'set') {\n return configSet(args.args, ctx)\n }\n\n if (subcommand === 'resetstat') {\n return configResetStat(args.args)\n }\n\n if (subcommand === 'rewrite') {\n return configRewrite(args.args)\n }\n\n throw new RedisCommandError(\n `Unknown CONFIG subcommand or wrong number of arguments for '${args.subcommand}'. Try CONFIG HELP.`,\n )\n },\n})\n\nexport const configCommands = [configCommand]\n","import { defineCommand } from '../core/command-definition'\nimport { isIntegerToken, t } from '../core/command-schema'\nimport type {\n RedisClientSession,\n RedisExecutionContext,\n} from '../core/redis-context'\nimport {\n HelloProtocolNotIntegerError,\n NoAuthError,\n NoPasswordConfiguredError,\n NoProtoError,\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n WrongPassError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport {\n array,\n bulk,\n integer,\n ok,\n parseIntegerToken,\n simpleString,\n} from './helpers'\nimport { commandSubcommandInfo } from './introspection'\n\nconst VALKEY_REDIS_COMPAT_VERSION = '7.2.4'\nconst MASTER_REPLID = '0000000000000000000000000000000000000000'\n\n// There is no persistence, so LASTSAVE reports the process/server start time.\nconst serverStartTimeSeconds = Math.floor(Date.now() / 1000)\n\nconst clientIds = new WeakMap<RedisClientSession, number>()\nconst clientNames = new WeakMap<RedisClientSession, Buffer>()\nconst clientLibraryNames = new WeakMap<RedisClientSession, Buffer>()\nconst clientLibraryVersions = new WeakMap<RedisClientSession, Buffer>()\nconst noEvictClients = new WeakSet<RedisClientSession>()\nlet nextClientId = 1\nconst INVALID_CLIENT_NAME_MESSAGE =\n 'Client names cannot contain spaces, newlines or special characters.'\n\nfunction getClientId(session: RedisClientSession): number {\n const existing = clientIds.get(session)\n if (existing !== undefined) {\n return existing\n }\n\n const id = nextClientId++\n clientIds.set(session, id)\n return id\n}\n\nfunction assertValidClientName(name: Buffer): void {\n for (const byte of name) {\n if (byte >= 0x21 && byte <= 0x7e) {\n continue\n }\n\n throw new RedisCommandError(INVALID_CLIENT_NAME_MESSAGE)\n }\n}\n\nfunction setClientName(session: RedisClientSession, name: Buffer): void {\n assertValidClientName(name)\n\n if (name.length === 0) {\n clientNames.delete(session)\n return\n }\n\n clientNames.set(session, name)\n}\n\nfunction isClusterMode(ctx: RedisExecutionContext): boolean {\n return ctx.server.clusterTopology.nodes.length > 0\n}\n\nfunction redisMode(ctx: RedisExecutionContext): string {\n return isClusterMode(ctx) ? 'cluster' : 'standalone'\n}\n\nfunction value(value: string): RedisValue {\n return RedisValue.bulkString(Buffer.from(value))\n}\n\nfunction expectArgCount(\n commandName: string,\n args: readonly Buffer[],\n count: number,\n) {\n if (args.length !== count) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n}\n\nfunction buildInfo(\n ctx: RedisExecutionContext,\n sections: readonly string[] = [],\n): string {\n const requestedSections =\n sections.length === 0\n ? ['default']\n : sections.map(section => section.toLowerCase())\n const clustered = isClusterMode(ctx)\n const defaultSections = [\n 'server',\n 'clients',\n 'memory',\n 'persistence',\n 'stats',\n 'replication',\n 'cpu',\n 'cluster',\n 'keyspace',\n ]\n const sectionBuilders: Record<string, () => string[]> = {\n server: () => [\n '# Server',\n ...serverIdentityLines(ctx),\n 'redis_git_sha1:00000000',\n 'redis_git_dirty:0',\n `redis_mode:${redisMode(ctx)}`,\n 'os:mocked redis',\n 'arch_bits:64',\n 'multiplexing_api:mock',\n 'process_id:1',\n 'tcp_port:6379',\n 'uptime_in_seconds:0',\n 'uptime_in_days:0',\n ],\n clients: () => [\n '# Clients',\n 'connected_clients:1',\n 'client_recent_max_input_buffer:0',\n 'client_recent_max_output_buffer:0',\n 'blocked_clients:0',\n ],\n memory: () => [\n '# Memory',\n 'used_memory:0',\n 'used_memory_human:0B',\n 'used_memory_rss:0',\n 'used_memory_peak:0',\n ],\n persistence: () => [\n '# Persistence',\n 'loading:0',\n 'async_loading:0',\n 'rdb_bgsave_in_progress:0',\n 'aof_enabled:0',\n ],\n stats: () => [\n '# Stats',\n 'total_connections_received:1',\n 'total_commands_processed:0',\n 'instantaneous_ops_per_sec:0',\n 'rejected_connections:0',\n 'expired_keys:0',\n 'evicted_keys:0',\n 'keyspace_hits:0',\n 'keyspace_misses:0',\n ],\n replication: () => [\n '# Replication',\n 'role:master',\n 'connected_slaves:0',\n 'master_failover_state:no-failover',\n `master_replid:${MASTER_REPLID}`,\n 'master_repl_offset:0',\n 'second_repl_offset:-1',\n 'repl_backlog_active:0',\n ],\n cpu: () => [\n '# CPU',\n 'used_cpu_sys:0.00',\n 'used_cpu_user:0.00',\n 'used_cpu_sys_children:0.00',\n 'used_cpu_user_children:0.00',\n ],\n cluster: () => {\n if (!clustered) {\n return ['# Cluster', 'cluster_enabled:0']\n }\n\n return [\n '# Cluster',\n 'cluster_enabled:1',\n 'cluster_state:ok',\n 'cluster_slots_assigned:16384',\n ]\n },\n commandstats: () => ['# Commandstats'],\n latencystats: () => ['# Latencystats'],\n errorstats: () => ['# Errorstats'],\n modules: () => ['# Modules'],\n sentinel: () => ['# Sentinel'],\n keyspace: () => {\n const lines = ['# Keyspace']\n for (const [index, database] of ctx.server.databases.entries()) {\n const keyCount = database.size()\n if (keyCount === 0) {\n continue\n }\n\n lines.push(`db${index}:keys=${keyCount},expires=0,avg_ttl=0`)\n }\n return lines\n },\n }\n\n const selectedSections: string[] = []\n for (const requestedSection of requestedSections) {\n if (requestedSection === 'default' || requestedSection === 'all') {\n selectedSections.push(...defaultSections)\n continue\n }\n\n if (requestedSection in sectionBuilders) {\n selectedSections.push(requestedSection)\n }\n }\n\n const lines: string[] = []\n for (const selectedSection of selectedSections) {\n if (lines.length > 0) {\n lines.push('')\n }\n\n lines.push(...sectionBuilders[selectedSection]())\n }\n\n // Real Redis replies with an empty bulk string for an unrecognized section\n // name rather than an error (clients like ioredis probe with arbitrary\n // section names during connection setup).\n if (lines.length === 0) {\n return ''\n }\n\n return `${lines.join('\\r\\n')}\\r\\n`\n}\n\nfunction formatClientLine(session: RedisClientSession): string {\n const name = clientNames.get(session)?.toString() ?? ''\n const libName = clientLibraryNames.get(session)?.toString()\n const libVersion = clientLibraryVersions.get(session)?.toString()\n const fields = [\n `id=${getClientId(session)}`,\n `addr=${session.clientAddress ?? '127.0.0.1:0'}`,\n 'laddr=127.0.0.1:6379',\n 'fd=0',\n `name=${name}`,\n `db=${session.selectedDatabase}`,\n `age=${clientAgeSeconds(session)}`,\n 'idle=0',\n `flags=${clientFlags(session)}`,\n `sub=${session.pubsubChannelCount}`,\n `psub=${session.pubsubPatternCount}`,\n 'multi=-1',\n 'qbuf=0',\n 'qbuf-free=0',\n 'argv-mem=0',\n 'multi-mem=0',\n 'rbs=0',\n 'rbp=0',\n 'obl=0',\n 'oll=0',\n 'omem=0',\n 'tot-mem=0',\n 'events=r',\n 'cmd=client',\n 'user=default',\n 'redir=-1',\n `resp=${session.protocolVersion}`,\n ]\n\n if (libName !== undefined) {\n fields.push(`lib-name=${libName}`)\n }\n if (libVersion !== undefined) {\n fields.push(`lib-ver=${libVersion}`)\n }\n\n return `${fields.join(' ')}\\n`\n}\n\nfunction clientFlags(session: RedisClientSession): string {\n let flags = session.mode === 'subscribed' ? 'P' : 'N'\n if (noEvictClients.has(session)) {\n flags += 'e'\n }\n return flags\n}\n\ntype ClientKillOptions = {\n id?: number\n maxAgeSeconds?: number\n skipMe: boolean\n}\n\nfunction clientAgeSeconds(session: RedisClientSession): number {\n return Math.max(0, Math.floor((Date.now() - session.connectedAtMs) / 1000))\n}\n\nfunction parseClientKillOptions(\n args: readonly Buffer[],\n ctx: RedisExecutionContext,\n): ClientKillOptions {\n if (args.length === 0) {\n throw new WrongNumberOfArgumentsError('client|kill')\n }\n\n const options: ClientKillOptions = { skipMe: true }\n\n for (let i = 0; i < args.length; i++) {\n const option = args[i].toString().toLowerCase()\n\n if (option === 'id') {\n const value = args[++i]\n if (!value) {\n throw new RedisSyntaxError()\n }\n options.id = parseIntegerToken(value)\n continue\n }\n\n if (option === 'maxage') {\n if (!ctx.server.profile.has('client.kill.maxage')) {\n throw new RedisSyntaxError()\n }\n\n const value = args[++i]\n if (!value) {\n throw new RedisSyntaxError()\n }\n\n options.maxAgeSeconds = parseIntegerToken(value)\n if (options.maxAgeSeconds < 0) {\n throw new RedisCommandError('value is out of range')\n }\n continue\n }\n\n if (option === 'skipme') {\n const value = args[++i]?.toString().toLowerCase()\n if (value === 'yes') {\n options.skipMe = true\n continue\n }\n if (value === 'no') {\n options.skipMe = false\n continue\n }\n throw new RedisSyntaxError()\n }\n\n throw new RedisSyntaxError()\n }\n\n return options\n}\n\nfunction matchesClientKillFilter(\n session: RedisClientSession,\n currentSession: RedisClientSession,\n options: ClientKillOptions,\n): boolean {\n if (options.skipMe && session === currentSession) {\n return false\n }\n\n if (options.id !== undefined && getClientId(session) !== options.id) {\n return false\n }\n\n if (\n options.maxAgeSeconds !== undefined &&\n clientAgeSeconds(session) < options.maxAgeSeconds\n ) {\n return false\n }\n\n return true\n}\n\nconst HELLO_NOAUTH_MESSAGE =\n 'HELLO must be called with the client already authenticated, otherwise the HELLO <proto> AUTH <user> <pass> option can be used to authenticate the client and select the RESP protocol version at the same time'\n\n/**\n * The only user this server knows about. Redis' `requirepass` is the password of\n * the built-in `default` user; without an ACL system (no `ACL SETUSER`) it is\n * the sole valid username — any other is rejected with WRONGPASS. Replace this\n * constant with a real user lookup if/when ACL support lands.\n */\nconst DEFAULT_ACL_USER = 'default'\n\n/**\n * Authenticate `username`/`password` against the server's `requirepass` (the\n * two-argument `AUTH <user> <pass>` / `HELLO ... AUTH <user> <pass>` form). On\n * success the session is marked authenticated.\n *\n * - With `requirepass` set: only `default` + the matching password succeeds;\n * anything else is WRONGPASS.\n * - Without `requirepass`: the `default` user is `nopass`, so any password for\n * `default` succeeds (no-op); any other username is WRONGPASS.\n */\nfunction authenticateUser(\n ctx: RedisExecutionContext,\n username: string,\n password: Buffer,\n): void {\n const requirepass = ctx.server.requirepass\n\n if (!requirepass) {\n if (username !== DEFAULT_ACL_USER) {\n throw new WrongPassError()\n }\n ctx.session.setAuthenticated(true)\n return\n }\n\n if (username !== DEFAULT_ACL_USER || password.toString() !== requirepass) {\n throw new WrongPassError()\n }\n\n ctx.session.setAuthenticated(true)\n}\n\n/**\n * Parse HELLO's option list. AUTH is processed inline (it can unlock the\n * connection), but SETNAME is only collected as `pendingName` — it must not be\n * applied until the caller has cleared the NOAUTH gate, so a HELLO that fails on\n * a password-protected server leaves connection state untouched.\n */\nfunction parseHelloOptions(\n ctx: RedisExecutionContext,\n args: readonly Buffer[],\n): { pendingName?: Buffer } {\n let pendingName: Buffer | undefined\n\n for (let i = 0; i < args.length; i++) {\n const option = args[i].toString().toLowerCase()\n\n if (option === 'auth') {\n if (i + 2 >= args.length) {\n throw new RedisSyntaxError()\n }\n\n authenticateUser(ctx, args[i + 1].toString(), args[i + 2])\n i += 2\n continue\n }\n\n if (option === 'setname') {\n if (i + 1 >= args.length) {\n throw new RedisSyntaxError()\n }\n\n pendingName = args[i + 1]\n i++\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return { pendingName }\n}\n\nfunction redactAllMonitorArgs(args: readonly Buffer[]): Buffer[] {\n return args.map(redactedMonitorArg)\n}\n\nfunction redactHelloMonitorArgs(rawArgs: readonly Buffer[]): Buffer[] {\n const args = rawArgs.map(arg => Buffer.from(arg))\n for (let i = 0; i < args.length; i++) {\n if (!equalsAscii(args[i], 'auth')) {\n continue\n }\n\n redactMonitorArgAt(args, i + 1)\n redactMonitorArgAt(args, i + 2)\n i += 2\n }\n return args\n}\n\nfunction redactMonitorArgAt(args: Buffer[], index: number): void {\n if (index < args.length) {\n args[index] = redactedMonitorArg()\n }\n}\n\nfunction redactedMonitorArg(): Buffer {\n return Buffer.from('(redacted)')\n}\n\nfunction equalsAscii(value: Buffer, expected: string): boolean {\n return value.toString().toLowerCase() === expected\n}\n\nexport const pingCommand = defineCommand({\n name: 'ping',\n schema: t.object({\n message: t.optional(t.bulk()),\n }),\n flags: ['readonly', 'fast', 'subscribed'],\n keys: () => [],\n execute: (args, ctx) => {\n if (ctx.session.usesSubscribedReplyMode) {\n return RedisResult.create(\n RedisValue.push('pong', [\n RedisValue.bulkString(Buffer.from(args.message ?? '')),\n ]),\n )\n }\n\n if (args.message) {\n return bulk(args.message)\n }\n\n return simpleString('PONG')\n },\n})\n\nexport const quitCommand = defineCommand({\n name: 'quit',\n schema: t.object({}),\n flags: ['readonly', 'fast', 'subscribed'],\n keys: () => [],\n execute: () =>\n RedisResult.create(RedisValue.simpleString('OK'), { close: true }),\n})\n\nexport const selectCommand = defineCommand({\n name: 'select',\n schema: t.object({\n database: t.integer({ min: 0 }),\n }),\n flags: ['fast'],\n capabilities: { clusterMode: 'singleDb' },\n keys: () => [],\n execute: (args, ctx) => {\n ctx.session.selectDatabase(args.database)\n return ok()\n },\n})\n\nexport const infoCommand = defineCommand({\n name: 'info',\n schema: t.object({\n sections: t.variadic(t.string()),\n }),\n flags: ['readonly', 'admin'],\n keys: () => [],\n execute: (args, ctx) => {\n if (\n args.sections.length > 1 &&\n !ctx.server.profile.has('info.multi-section')\n ) {\n throw new RedisSyntaxError()\n }\n\n return bulk(Buffer.from(buildInfo(ctx, args.sections)))\n },\n})\n\nexport const clientCommand = defineCommand({\n name: 'client',\n schema: t.object({\n subcommand: t.string(),\n args: t.variadic(t.bulk()),\n }),\n flags: ['readonly', 'admin'],\n introspection: {\n arity: -2,\n flags: [],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@connection'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('client|id', 2),\n commandSubcommandInfo('client|info', 2),\n commandSubcommandInfo('client|kill', -3),\n commandSubcommandInfo('client|list', 2),\n commandSubcommandInfo('client|getname', 2),\n commandSubcommandInfo('client|setname', 3),\n commandSubcommandInfo('client|no-evict', 3),\n commandSubcommandInfo('client|setinfo', 4),\n commandSubcommandInfo('client|help', 2),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const subcommand = args.subcommand.toLowerCase()\n\n if (subcommand === 'setname') {\n expectArgCount('client|setname', args.args, 1)\n setClientName(ctx.session, args.args[0])\n return ok()\n }\n\n if (subcommand === 'getname') {\n expectArgCount('client|getname', args.args, 0)\n return bulk(clientNames.get(ctx.session) ?? null)\n }\n\n if (subcommand === 'setinfo') {\n if (!ctx.server.profile.has('client.setinfo')) {\n throw clientSetInfoUnavailableError(ctx, args.subcommand)\n }\n\n expectArgCount('client|setinfo', args.args, 2)\n const attribute = args.args[0].toString().toLowerCase()\n if (attribute === 'lib-name') {\n clientLibraryNames.set(ctx.session, args.args[1])\n } else if (attribute === 'lib-ver') {\n clientLibraryVersions.set(ctx.session, args.args[1])\n }\n return ok()\n }\n\n if (subcommand === 'no-evict') {\n if (!ctx.server.profile.has('client.no-evict')) {\n throw clientUnavailableSubcommandError(args.subcommand)\n }\n\n expectArgCount('client|no-evict', args.args, 1)\n const mode = args.args[0].toString().toLowerCase()\n if (mode === 'on') {\n noEvictClients.add(ctx.session)\n return ok()\n }\n if (mode === 'off') {\n noEvictClients.delete(ctx.session)\n return ok()\n }\n\n throw new RedisSyntaxError()\n }\n\n if (subcommand === 'kill') {\n const options = parseClientKillOptions(args.args, ctx)\n const victims = ctx.server\n .getConnectedClients()\n .filter(session =>\n matchesClientKillFilter(session, ctx.session, options),\n )\n\n for (const victim of victims) {\n if (victim !== ctx.session) {\n victim.disconnect('client kill')\n }\n }\n\n if (!victims.includes(ctx.session)) {\n return integer(victims.length)\n }\n\n return RedisResult.create(RedisValue.integer(victims.length), {\n afterReply: () => ctx.session.disconnect('client kill'),\n })\n }\n\n if (subcommand === 'id') {\n expectArgCount('client|id', args.args, 0)\n return integer(getClientId(ctx.session))\n }\n\n if (subcommand === 'info') {\n expectArgCount('client|info', args.args, 0)\n return bulk(Buffer.from(formatClientLine(ctx.session)))\n }\n\n if (subcommand === 'list') {\n expectArgCount('client|list', args.args, 0)\n const lines = ctx.server.getConnectedClients().map(formatClientLine)\n return bulk(Buffer.from(lines.join('')))\n }\n\n if (subcommand === 'help') {\n expectArgCount('client|help', args.args, 0)\n const lines = [\n value(\n 'CLIENT <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n ),\n value('ID'),\n value('INFO'),\n value('LIST'),\n value(\n ctx.server.profile.has('client.kill.maxage')\n ? 'KILL [ID <client-id>] [MAXAGE <seconds>] [SKIPME <YES|NO>]'\n : 'KILL [ID <client-id>] [SKIPME <YES|NO>]',\n ),\n value('GETNAME'),\n value('SETNAME <connection-name>'),\n ]\n if (ctx.server.profile.has('client.setinfo')) {\n lines.push(value('SETINFO <LIB-NAME|LIB-VER> <value>'))\n }\n if (ctx.server.profile.has('client.no-evict')) {\n lines.push(value('NO-EVICT <ON|OFF>'))\n }\n return array(lines)\n }\n\n throw new RedisCommandError(\n `unknown subcommand '${args.subcommand}'. Try CLIENT HELP.`,\n )\n },\n})\n\nfunction clientSetInfoUnavailableError(\n ctx: RedisExecutionContext,\n subcommand: string,\n): RedisCommandError {\n if (!ctx.server.profile.has('client.setinfo.unknown-subcommand-error')) {\n return clientUnavailableSubcommandError(subcommand)\n }\n\n return new RedisCommandError(\n `unknown subcommand '${subcommand}'. Try CLIENT HELP.`,\n )\n}\n\nfunction clientUnavailableSubcommandError(\n subcommand: string,\n): RedisCommandError {\n return new RedisCommandError(\n `Unknown subcommand or wrong number of arguments for '${subcommand}'. Try CLIENT HELP.`,\n )\n}\n\n/**\n * Parse HELLO's protocol-version token. Unlike a generic `t.integer()` field,\n * an out-of-range-but-valid integer (e.g. `4`, `0`, `-1`) must produce the\n * protocol-specific `NOPROTO` error rather than the generic `ERR ... out of\n * range`, and a genuinely non-integer token gets HELLO's own wording for the\n * `ERR` case — both only discoverable by checking real Redis's wire replies.\n */\nfunction parseHelloVersion(token: Buffer): 2 | 3 {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new HelloProtocolNotIntegerError()\n }\n\n const parsed = Number(raw)\n if (!Number.isSafeInteger(parsed)) {\n throw new HelloProtocolNotIntegerError()\n }\n\n if (parsed !== 2 && parsed !== 3) {\n throw new NoProtoError()\n }\n\n return parsed\n}\n\nexport const helloCommand = defineCommand({\n name: 'hello',\n schema: t.object({\n version: t.optional(t.bulk()),\n args: t.variadic(t.bulk()),\n }),\n flags: ['noscript'],\n monitor: {\n redactArgs: redactHelloMonitorArgs,\n },\n keys: () => [],\n execute: (args, ctx) => {\n const version =\n args.version === undefined\n ? ctx.session.protocolVersion\n : parseHelloVersion(args.version)\n const { pendingName } = parseHelloOptions(ctx, args.args)\n\n // A password-protected server rejects HELLO unless the client is already\n // authenticated or authenticates inline via the AUTH option above. The gate\n // runs before any SETNAME side effect is applied, so a failed HELLO leaves\n // connection state untouched.\n if (ctx.server.requirepass && !ctx.session.isAuthenticated) {\n throw new NoAuthError(HELLO_NOAUTH_MESSAGE)\n }\n\n if (pendingName !== undefined) {\n setClientName(ctx.session, pendingName)\n }\n\n ctx.session.setProtocolVersion(version)\n\n const fields: [RedisValue, RedisValue][] = [\n [value('server'), value(ctx.server.profile.flavor)],\n [value('version'), value(ctx.server.profile.version)],\n [value('proto'), RedisValue.integer(version)],\n [value('id'), RedisValue.integer(getClientId(ctx.session))],\n [value('mode'), value(redisMode(ctx))],\n [value('role'), value(ctx.nodeRole ?? 'master')],\n [value('modules'), RedisValue.array([])],\n ]\n\n if (version === 3) {\n return RedisResult.create(RedisValue.map(fields))\n }\n\n return RedisResult.create(RedisValue.array(fields.flat()))\n },\n})\n\nfunction serverIdentityLines(ctx: RedisExecutionContext): string[] {\n const profile = ctx.server.profile\n if (profile.flavor === 'redis') {\n return [`redis_version:${profile.version}`]\n }\n\n return [\n `redis_version:${VALKEY_REDIS_COMPAT_VERSION}`,\n 'server_name:valkey',\n `valkey_version:${profile.version}`,\n ]\n}\n\nexport const authCommand = defineCommand({\n name: 'auth',\n schema: t.object({\n args: t.variadic(t.bulk()),\n }),\n flags: ['noscript'],\n monitor: {\n redactArgs: redactAllMonitorArgs,\n },\n keys: () => [],\n execute: (args, ctx) => {\n if (args.args.length !== 1 && args.args.length !== 2) {\n throw new WrongNumberOfArgumentsError('auth')\n }\n\n // Single-arg AUTH targets the default user. When no password is configured\n // Redis answers with a dedicated hint instead of authenticating.\n if (args.args.length === 1) {\n if (!ctx.server.requirepass) {\n throw new NoPasswordConfiguredError()\n }\n authenticateUser(ctx, DEFAULT_ACL_USER, args.args[0])\n return ok()\n }\n\n authenticateUser(ctx, args.args[0].toString(), args.args[1])\n return ok()\n },\n})\n\nexport const resetCommand = defineCommand({\n name: 'reset',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({}),\n // 'transaction' makes RESET bypass MULTI queueing and run immediately, like\n // EXEC/DISCARD/WATCH — it aborts the in-flight transaction via\n // discardTransaction() instead of being queued until EXEC (matches real\n // Redis, which excludes RESET from queueMultiCommand).\n flags: ['admin', 'subscribed', 'transaction'],\n keys: () => [],\n execute: (_args, ctx) => {\n clientNames.delete(ctx.session)\n clientLibraryNames.delete(ctx.session)\n clientLibraryVersions.delete(ctx.session)\n noEvictClients.delete(ctx.session)\n ctx.session.resetResponseStreams()\n ctx.session.resetPubSub()\n ctx.session.discardTransaction()\n ctx.session.unwatch()\n ctx.session.selectDatabase(0)\n ctx.session.setProtocolVersion(2)\n ctx.session.setClusterReadOnly(false)\n ctx.session.setAuthenticated(false)\n return simpleString('RESET')\n },\n})\n\nexport const timeCommand = defineCommand({\n name: 'time',\n schema: t.object({}),\n flags: ['readonly', 'random', 'fast'],\n keys: () => [],\n execute: () => {\n const now = Date.now()\n const seconds = Math.floor(now / 1000)\n const microseconds = (now % 1000) * 1000\n return array([\n RedisValue.bulkString(Buffer.from(seconds.toString())),\n RedisValue.bulkString(Buffer.from(microseconds.toString())),\n ])\n },\n})\n\nexport const lastsaveCommand = defineCommand({\n name: 'lastsave',\n schema: t.object({}),\n flags: ['readonly', 'fast'],\n keys: () => [],\n execute: () => integer(serverStartTimeSeconds),\n})\n\nexport const aclCommand = defineCommand({\n name: 'acl',\n schema: t.object({\n subcommand: t.string(),\n args: t.variadic(t.bulk()),\n }),\n flags: ['admin', 'noscript'],\n introspection: {\n arity: -2,\n flags: [],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('acl|whoami', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('acl|dryrun', -4, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('acl|help', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const subcommand = args.subcommand.toLowerCase()\n\n if (subcommand === 'whoami') {\n expectArgCount('acl|whoami', args.args, 0)\n return bulk(Buffer.from(DEFAULT_ACL_USER))\n }\n\n if (subcommand === 'dryrun') {\n if (!ctx.server.profile.has('acl.dryrun')) {\n throw unavailableAclSubcommand(args.subcommand)\n }\n\n if (args.args.length < 2) {\n throw new WrongNumberOfArgumentsError('acl|dryrun')\n }\n\n const username = args.args[0].toString()\n if (username !== DEFAULT_ACL_USER) {\n throw new RedisCommandError(`User '${username}' not found`)\n }\n\n const command = args.args[1]\n if (!ctx.executor.getCommandDefinition(command.toString())) {\n throw new RedisCommandError(`Command '${command.toString()}' not found`)\n }\n ctx.executor.plan(command, args.args.slice(2))\n return ok()\n }\n\n if (subcommand === 'help') {\n expectArgCount('acl|help', args.args, 0)\n const lines = [\n value('ACL <subcommand> [<arg> [value] [opt] ...]. Subcommands are:'),\n value('WHOAMI'),\n value(' Return the current ACL username.'),\n ]\n if (ctx.server.profile.has('acl.dryrun')) {\n lines.push(\n value('DRYRUN <username> <command> [<arg> ...]'),\n value(' Check whether a user can run a command.'),\n )\n }\n lines.push(value('HELP'), value(' Prints this help.'))\n return array(lines)\n }\n\n throw unknownAclSubcommand(args.subcommand)\n },\n})\n\nexport const slowlogCommand = defineCommand({\n name: 'slowlog',\n schema: t.object({\n subcommand: t.string(),\n args: t.variadic(t.bulk()),\n }),\n flags: ['readonly', 'admin'],\n introspection: {\n arity: -2,\n flags: [],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('slowlog|get', -2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('slowlog|len', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('slowlog|reset', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('slowlog|help', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n ],\n },\n keys: () => [],\n execute: args => {\n const subcommand = args.subcommand.toLowerCase()\n\n if (subcommand === 'get') {\n if (args.args.length > 1) {\n throw new WrongNumberOfArgumentsError('slowlog|get')\n }\n if (args.args.length === 1) {\n const count = args.args[0].toString()\n if (!isIntegerToken(count) || Number(count) < -1) {\n throw new RedisCommandError(\n 'count should be greater than or equal to -1',\n )\n }\n }\n return array([])\n }\n\n if (subcommand === 'len') {\n expectArgCount('slowlog|len', args.args, 0)\n return integer(0)\n }\n\n if (subcommand === 'reset') {\n expectArgCount('slowlog|reset', args.args, 0)\n return ok()\n }\n\n if (subcommand === 'help') {\n expectArgCount('slowlog|help', args.args, 0)\n return array([\n value(\n 'SLOWLOG <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n ),\n value('GET [<count>]'),\n value(' Return slow log entries.'),\n value('LEN'),\n value(' Return the slow log length.'),\n value('RESET'),\n value(' Reset the slow log.'),\n value('HELP'),\n value(' Prints this help.'),\n ])\n }\n\n throw new RedisCommandError(\n `unknown subcommand '${args.subcommand}'. Try SLOWLOG HELP.`,\n )\n },\n})\n\nexport const shutdownCommand = defineCommand({\n name: 'shutdown',\n schema: t.object({\n args: t.variadic(t.bulk()),\n }),\n flags: ['admin', 'noscript'],\n introspection: {\n arity: -1,\n flags: ['admin', 'noscript', 'loading', 'stale', 'no_multi', 'allow_busy'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous', '@connection'],\n keySpecs: [],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const options = parseShutdownOptions(args.args, ctx)\n if (options.abort) {\n throw new RedisCommandError('No shutdown in progress.')\n }\n\n return RedisResult.create(RedisValue.null(), {\n close: true,\n omitReply: true,\n })\n },\n})\n\nfunction unknownAclSubcommand(subcommand: string): RedisCommandError {\n return new RedisCommandError(\n `unknown subcommand '${subcommand}'. Try ACL HELP.`,\n )\n}\n\nfunction unavailableAclSubcommand(subcommand: string): RedisCommandError {\n return new RedisCommandError(\n `Unknown subcommand or wrong number of arguments for '${subcommand}'. Try ACL HELP.`,\n )\n}\n\nfunction parseShutdownOptions(\n args: readonly Buffer[],\n ctx: RedisExecutionContext,\n): { abort: boolean } {\n let abort = false\n\n for (const arg of args) {\n const option = arg.toString().toLowerCase()\n if (option === 'save' || option === 'nosave') {\n continue\n }\n\n if (option === 'now' || option === 'force' || option === 'abort') {\n if (!ctx.server.profile.has('shutdown.now-force-abort')) {\n throw new RedisSyntaxError()\n }\n abort ||= option === 'abort'\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n if (abort && args.length > 1) {\n throw new RedisSyntaxError()\n }\n\n return { abort }\n}\n\nexport const connectionCommands = [\n pingCommand,\n quitCommand,\n selectCommand,\n infoCommand,\n clientCommand,\n helloCommand,\n authCommand,\n resetCommand,\n timeCommand,\n lastsaveCommand,\n aclCommand,\n slowlogCommand,\n shutdownCommand,\n]\n","import { InvalidLongitudeLatitudeError } from '../../core/redis-error'\n\nconst STEP = 26n\nconst CELLS = Number(1n << STEP)\n\nexport const GEO_LON_MIN = -180\nexport const GEO_LON_MAX = 180\nexport const GEO_LAT_MIN = -85.05112878\nexport const GEO_LAT_MAX = 85.05112878\n\nconst GEO_ALPHABET = '0123456789bcdefghjkmnpqrstuvwxyz'\n\nconst EARTH_RADIUS_M = 6372797.560856\n\n// Meters-per-unit divisors matching Redis' exact GEODIST constants (not the\n// rounded 3.28084 ft/m reciprocal, which drifts in the 4th decimal place).\nconst UNIT_TO_METERS: Record<string, number> = {\n m: 1,\n km: 1000,\n ft: 0.3048,\n mi: 1609.34,\n}\n\nexport function isSupportedGeoUnit(unit: string): boolean {\n return unit.toLowerCase() in UNIT_TO_METERS\n}\n\nexport function metersToUnit(meters: number, unit: string): number {\n return meters / UNIT_TO_METERS[unit.toLowerCase()]!\n}\n\nexport function unitToMeters(value: number, unit: string): number {\n return value * UNIT_TO_METERS[unit.toLowerCase()]!\n}\n\nexport function assertValidCoordinates(lon: number, lat: number): void {\n if (\n lon < GEO_LON_MIN ||\n lon > GEO_LON_MAX ||\n lat < GEO_LAT_MIN ||\n lat > GEO_LAT_MAX\n ) {\n throw new InvalidLongitudeLatitudeError(lon, lat)\n }\n}\n\n// Bit-spreads a 26-bit value into the even bit positions of a 52-bit result\n// (Redis' geohash.c interleave64, truncated to the 26-bit step this repo uses).\nfunction interleave64(latBits: bigint, lonBits: bigint): bigint {\n const B = [\n 0x5555555555555555n,\n 0x3333333333333333n,\n 0x0f0f0f0f0f0f0f0fn,\n 0x00ff00ff00ff00ffn,\n 0x0000ffff0000ffffn,\n ]\n const S = [1n, 2n, 4n, 8n, 16n]\n let x = latBits\n let y = lonBits\n for (let i = 4; i >= 0; i--) {\n x = (x | (x << S[i]!)) & B[i]!\n y = (y | (y << S[i]!)) & B[i]!\n }\n return x | (y << 1n)\n}\n\nfunction deinterleave64(bits: bigint): bigint {\n const B = [\n 0x5555555555555555n,\n 0x3333333333333333n,\n 0x0f0f0f0f0f0f0f0fn,\n 0x00ff00ff00ff00ffn,\n 0x0000ffff0000ffffn,\n 0x00000000ffffffffn,\n ]\n const S = [0n, 1n, 2n, 4n, 8n, 16n]\n let x = bits & B[0]!\n for (let i = 1; i <= 5; i++) {\n x = (x | (x >> S[i]!)) & B[i]!\n }\n return x\n}\n\nfunction encodeBits(\n lon: number,\n lat: number,\n lonMin: number,\n lonMax: number,\n latMin: number,\n latMax: number,\n): bigint {\n const lonOffset = (lon - lonMin) / (lonMax - lonMin)\n const latOffset = (lat - latMin) / (latMax - latMin)\n const lonBits = BigInt(Math.floor(lonOffset * CELLS))\n const latBits = BigInt(Math.floor(latOffset * CELLS))\n return interleave64(latBits, lonBits)\n}\n\nfunction decodeBits(\n bits: bigint,\n lonMin: number,\n lonMax: number,\n latMin: number,\n latMax: number,\n): { lon: number; lat: number } {\n const latBits = deinterleave64(bits)\n const lonBits = deinterleave64(bits >> 1n)\n\n const latLo = latMin + (Number(latBits) / CELLS) * (latMax - latMin)\n const latHi = latMin + (Number(latBits + 1n) / CELLS) * (latMax - latMin)\n const lonLo = lonMin + (Number(lonBits) / CELLS) * (lonMax - lonMin)\n const lonHi = lonMin + (Number(lonBits + 1n) / CELLS) * (lonMax - lonMin)\n\n return { lon: (lonLo + lonHi) / 2, lat: (latLo + latHi) / 2 }\n}\n\n// The stored zset score: a 52-bit geohash interleaving lon/lat over Redis'\n// internal ranges (lat clamped to ±85.05112878 so the projection stays square).\nexport function encodeGeoScore(lon: number, lat: number): number {\n return Number(\n encodeBits(lon, lat, GEO_LON_MIN, GEO_LON_MAX, GEO_LAT_MIN, GEO_LAT_MAX),\n )\n}\n\nexport function decodeGeoScore(score: number): { lon: number; lat: number } {\n return decodeBits(\n BigInt(score),\n GEO_LON_MIN,\n GEO_LON_MAX,\n GEO_LAT_MIN,\n GEO_LAT_MAX,\n )\n}\n\n// GEOHASH renders the standard geohash.org string, which uses a ±90 latitude\n// range rather than the ±85.05112878 range the zset score is stored with. Real\n// Redis re-derives it by decoding the stored score with the real range, then\n// re-encoding that position with the standard range (see geohashCommand in\n// geo.c) — encoding straight from the original lon/lat produces a different\n// string because decode-then-reencode loses the sub-cell fraction.\nexport function geohashString(score: number): string {\n const pos = decodeGeoScore(score)\n const bits = encodeBits(pos.lon, pos.lat, GEO_LON_MIN, GEO_LON_MAX, -90, 90)\n\n let out = ''\n for (let i = 0; i < 10; i++) {\n const idx = Number((bits >> BigInt(52 - i * 5 - 5)) & 0x1fn)\n out += GEO_ALPHABET[idx]\n }\n // The 52-bit hash only covers 10 full 5-bit groups (50 bits); Redis pads\n // the unused 11th character with a literal '0' rather than the leftover 2 bits.\n return out + '0'\n}\n\nfunction toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180\n}\n\n// Haversine great-circle distance in meters, matching Redis' geohashGetDistance.\nexport function haversineMeters(\n lon1: number,\n lat1: number,\n lon2: number,\n lat2: number,\n): number {\n const lat1r = toRadians(lat1)\n const lat2r = toRadians(lat2)\n const u = Math.sin((toRadians(lat2) - toRadians(lat1)) / 2)\n const v = Math.sin((toRadians(lon2) - toRadians(lon1)) / 2)\n return (\n 2.0 *\n EARTH_RADIUS_M *\n Math.asin(Math.sqrt(u * u + Math.cos(lat1r) * Math.cos(lat2r) * v * v))\n )\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n ExpectedFloatError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { integer } from '../helpers'\nimport { assertValidCoordinates, encodeGeoScore } from './helpers'\n\ntype GeoPoint = { lon: number; lat: number; member: Buffer }\ntype GeoAddOptions = { nx: boolean; xx: boolean; ch: boolean }\ntype GeoAddArgs = { key: Buffer; options: GeoAddOptions; points: GeoPoint[] }\n\nfunction parseFloatToken(token: Buffer): number {\n const n = Number(token.toString())\n if (!Number.isFinite(n)) throw new ExpectedFloatError()\n return n\n}\n\nfunction createGeoAddSchema() {\n return t.custom<GeoAddArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n let cursor = index + 1\n if (input.length - cursor < 3) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const options: GeoAddOptions = { nx: false, xx: false, ch: false }\n while (cursor < input.length) {\n const token = input[cursor]!.toString().toUpperCase()\n if (token === 'NX') {\n options.nx = true\n cursor++\n continue\n }\n if (token === 'XX') {\n options.xx = true\n cursor++\n continue\n }\n if (token === 'CH') {\n options.ch = true\n cursor++\n continue\n }\n break\n }\n\n const remaining = input.length - cursor\n if (options.nx && options.xx) throw new RedisSyntaxError()\n if (remaining === 0 || remaining % 3 !== 0) {\n throw new RedisSyntaxError()\n }\n\n const points: GeoPoint[] = []\n while (cursor < input.length) {\n const lon = parseFloatToken(input[cursor]!)\n const lat = parseFloatToken(input[cursor + 1]!)\n assertValidCoordinates(lon, lat)\n points.push({ lon, lat, member: input[cursor + 2]! })\n cursor += 3\n }\n\n return { value: { key, options, points }, nextIndex: input.length }\n },\n )\n}\n\nexport const geoaddCommand = defineCommand({\n name: 'geoadd',\n schema: createGeoAddSchema(),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const replyCount = ctx.db.updateSortedSet(args.key, zset => {\n let count = 0\n for (const { lon, lat, member } of args.points) {\n const score = encodeGeoScore(lon, lat)\n const existing = zset.getMember(member)\n\n if (!existing && args.options.xx) continue\n if (existing && args.options.nx) continue\n\n const { added, scoreChanged } = zset.setScore(member, score)\n if (added || (args.options.ch && scoreChanged)) count++\n }\n return count\n })\n return integer(replyCount)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { GeoUnsupportedUnitError } from '../../core/redis-error'\nimport { bulk } from '../helpers'\nimport {\n decodeGeoScore,\n haversineMeters,\n isSupportedGeoUnit,\n metersToUnit,\n} from './helpers'\n\nexport const geodistCommand = defineCommand({\n name: 'geodist',\n schema: t.object({\n key: t.key(),\n member1: t.key(),\n member2: t.key(),\n unit: t.optional(t.string()),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const unit = args.unit ?? 'm'\n if (!isSupportedGeoUnit(unit)) throw new GeoUnsupportedUnitError()\n\n const zset = ctx.db.getSortedSet(args.key)\n const entry1 = zset?.members.get(args.member1.toString('hex'))\n const entry2 = zset?.members.get(args.member2.toString('hex'))\n if (!entry1 || !entry2) return bulk(null)\n\n const pos1 = decodeGeoScore(entry1.score)\n const pos2 = decodeGeoScore(entry2.score)\n const meters = haversineMeters(pos1.lon, pos1.lat, pos2.lon, pos2.lat)\n return bulk(Buffer.from(metersToUnit(meters, unit).toFixed(4)))\n },\n})\n","import {\n ExpectedFloatError,\n ResultingScoreNaNError,\n} from '../../core/redis-error'\nimport type { RedisDatabase } from '../../state/database'\nimport type {\n RedisSortedSetData,\n RedisSortedSetMember,\n} from '../../state/data-types'\n\nexport function getSortedMembers(\n zset: RedisSortedSetData,\n): RedisSortedSetMember[] {\n return Array.from(zset.members.values()).sort((a, b) =>\n a.score !== b.score\n ? a.score - b.score\n : // Equal scores tie-break by raw byte order (memcmp), matching Redis —\n // not localeCompare, which would mis-sort non-ASCII members (see #41).\n Buffer.compare(a.member, b.member),\n )\n}\n\nexport function parseFloatArg(s: string): number {\n const normalized = s.toLowerCase()\n if (normalized === 'inf' || normalized === '+inf') return Infinity\n if (normalized === '-inf') return -Infinity\n\n const n = Number(s)\n if (!Number.isFinite(n)) throw new ExpectedFloatError()\n return n\n}\n\nexport function assertValidResultingScore(score: number) {\n if (Number.isNaN(score)) {\n throw new ResultingScoreNaNError()\n }\n}\n\nexport function deleteSortedSetIfEmpty(db: RedisDatabase, key: Buffer) {\n if ((db.getSortedSet(key)?.members.size ?? 0) === 0) {\n db.delete(key)\n }\n}\n","import { RedisValue } from '../../core/redis-value'\nimport { RedisResult } from '../../core/redis-result'\nimport {\n ExpectedFloatError,\n GeoAnyRequiresCountError,\n GeoBoxNegativeError,\n GeoCountNotPositiveError,\n GeoHeightNotNumericError,\n GeoMissingMemberError,\n GeoRadiusNegativeError,\n GeoRadiusNotNumericError,\n GeoRadiusStoreWithOptionsError,\n GeoUnsupportedUnitError,\n GeoWidthNotNumericError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type {\n RedisSortedSetData,\n RedisSortedSetMember,\n} from '../../state/data-types'\nimport { array, parseIntegerToken } from '../helpers'\nimport { getSortedMembers } from '../zsets/helpers'\nimport {\n assertValidCoordinates,\n decodeGeoScore,\n haversineMeters,\n isSupportedGeoUnit,\n metersToUnit,\n unitToMeters,\n} from './helpers'\n\nexport type GeoCenter = { lon: number; lat: number }\n\nexport type GeoBy =\n | { kind: 'radius'; radiusMeters: number; unit: string }\n | { kind: 'box'; widthMeters: number; heightMeters: number; unit: string }\n\nexport type GeoOrderCount = {\n order?: 'ASC' | 'DESC'\n count?: { count: number; any: boolean }\n}\n\nexport type GeoWithFlags = {\n withCoord: boolean\n withDist: boolean\n withHash: boolean\n}\n\nexport type GeoMatch = {\n member: Buffer\n score: number\n distanceMeters: number\n lon: number\n lat: number\n}\n\nexport function parseGeoFloatToken(token: Buffer): number {\n const n = Number(token.toString())\n if (!Number.isFinite(n)) throw new ExpectedFloatError()\n return n\n}\n\nfunction parseGeoUnit(token: Buffer | undefined): string {\n if (!token) throw new RedisSyntaxError()\n const unit = token.toString()\n if (!isSupportedGeoUnit(unit)) throw new GeoUnsupportedUnitError()\n return unit\n}\n\nexport function parseByRadius(\n radiusTok: Buffer | undefined,\n unitTok: Buffer | undefined,\n): GeoBy {\n if (!radiusTok) throw new RedisSyntaxError()\n const radius = Number(radiusTok.toString())\n if (!Number.isFinite(radius)) throw new GeoRadiusNotNumericError()\n if (radius < 0) throw new GeoRadiusNegativeError()\n const unit = parseGeoUnit(unitTok)\n return { kind: 'radius', radiusMeters: unitToMeters(radius, unit), unit }\n}\n\nexport function parseByBox(\n widthTok: Buffer | undefined,\n heightTok: Buffer | undefined,\n unitTok: Buffer | undefined,\n): GeoBy {\n if (!widthTok) throw new RedisSyntaxError()\n const width = Number(widthTok.toString())\n if (!Number.isFinite(width)) throw new GeoWidthNotNumericError()\n if (!heightTok) throw new RedisSyntaxError()\n const height = Number(heightTok.toString())\n if (!Number.isFinite(height)) throw new GeoHeightNotNumericError()\n if (width < 0 || height < 0) throw new GeoBoxNegativeError()\n const unit = parseGeoUnit(unitTok)\n return {\n kind: 'box',\n widthMeters: unitToMeters(width, unit),\n heightMeters: unitToMeters(height, unit),\n unit,\n }\n}\n\nexport type GeoFrom =\n | { type: 'member'; member: Buffer }\n | { type: 'lonlat'; lon: number; lat: number }\n\n// FROMMEMBER member | FROMLONLAT lon lat, shared by GEOSEARCH and\n// GEOSEARCHSTORE. A present-but-incomplete FROM clause is a wrong-number-of-\n// arguments error in real Redis (ground-truthed), not a syntax error.\nexport function parseGeoFrom(\n input: readonly Buffer[],\n cursor: number,\n commandName: string,\n): [GeoFrom, number] {\n const token = input[cursor]?.toString().toUpperCase()\n if (token === 'FROMMEMBER') {\n const member = input[cursor + 1]\n if (!member) throw new WrongNumberOfArgumentsError(commandName)\n return [{ type: 'member', member }, cursor + 2]\n }\n if (token === 'FROMLONLAT') {\n const lonTok = input[cursor + 1]\n const latTok = input[cursor + 2]\n if (!lonTok || !latTok) throw new WrongNumberOfArgumentsError(commandName)\n const lon = parseGeoFloatToken(lonTok)\n const lat = parseGeoFloatToken(latTok)\n assertValidCoordinates(lon, lat)\n return [{ type: 'lonlat', lon, lat }, cursor + 3]\n }\n throw new RedisSyntaxError()\n}\n\n// BYRADIUS radius unit | BYBOX width height unit, shared the same way.\nexport function parseGeoBy(\n input: readonly Buffer[],\n cursor: number,\n): [GeoBy, number] {\n const token = input[cursor]?.toString().toUpperCase()\n if (token === 'BYRADIUS') {\n return [parseByRadius(input[cursor + 1], input[cursor + 2]), cursor + 3]\n }\n if (token === 'BYBOX') {\n return [\n parseByBox(input[cursor + 1], input[cursor + 2], input[cursor + 3]),\n cursor + 4,\n ]\n }\n throw new RedisSyntaxError()\n}\n\n// Parses a single ASC | DESC | COUNT n [ANY] token starting at cursor into\n// `acc`. Returns the advanced cursor, or null if the token at cursor isn't\n// one of these — the caller decides what to do with an unmatched token.\nexport function tryParseOrderOrCount(\n input: readonly Buffer[],\n cursor: number,\n acc: GeoOrderCount,\n): number | null {\n const token = input[cursor]?.toString().toUpperCase()\n if (token === 'ASC') {\n acc.order = 'ASC'\n return cursor + 1\n }\n if (token === 'DESC') {\n acc.order = 'DESC'\n return cursor + 1\n }\n if (token === 'COUNT') {\n const countTok = input[cursor + 1]\n if (!countTok) throw new RedisSyntaxError()\n const count = parseIntegerToken(countTok)\n if (count <= 0) throw new GeoCountNotPositiveError()\n let next = cursor + 2\n let any = false\n if (input[next]?.toString().toUpperCase() === 'ANY') {\n any = true\n next++\n }\n acc.count = { count, any }\n return next\n }\n if (token === 'ANY') throw new GeoAnyRequiresCountError()\n return null\n}\n\nexport type GeoRadiusFlags = GeoOrderCount & {\n withCoord: boolean\n withDist: boolean\n withHash: boolean\n store?: Buffer\n storeDist?: Buffer\n}\n\n// Shared WITH*/ASC|DESC/COUNT[/STORE/STOREDIST] tail for GEORADIUS[BYMEMBER]\n// [_RO]. `allowStore` is false for the _RO variants, where STORE/STOREDIST\n// aren't recognized at all (falls through to a generic syntax error, matching\n// real Redis) rather than being accepted and then rejected.\nexport function parseGeoRadiusFlags(\n input: readonly Buffer[],\n cursor: number,\n allowStore: boolean,\n): [GeoRadiusFlags, number] {\n const options: GeoOrderCount = {}\n let withCoord = false\n let withDist = false\n let withHash = false\n let store: Buffer | undefined\n let storeDist: Buffer | undefined\n\n while (cursor < input.length) {\n const advanced = tryParseOrderOrCount(input, cursor, options)\n if (advanced !== null) {\n cursor = advanced\n continue\n }\n const token = input[cursor]!.toString().toUpperCase()\n if (token === 'WITHCOORD') {\n withCoord = true\n cursor++\n continue\n }\n if (token === 'WITHDIST') {\n withDist = true\n cursor++\n continue\n }\n if (token === 'WITHHASH') {\n withHash = true\n cursor++\n continue\n }\n if (allowStore && token === 'STORE') {\n const dest = input[cursor + 1]\n if (!dest) throw new RedisSyntaxError()\n store = dest\n cursor += 2\n continue\n }\n if (allowStore && token === 'STOREDIST') {\n const dest = input[cursor + 1]\n if (!dest) throw new RedisSyntaxError()\n storeDist = dest\n cursor += 2\n continue\n }\n throw new RedisSyntaxError()\n }\n\n if ((store || storeDist) && (withCoord || withDist || withHash)) {\n throw new GeoRadiusStoreWithOptionsError()\n }\n\n return [\n { ...options, withCoord, withDist, withHash, store, storeDist },\n cursor,\n ]\n}\n\n// The stored zset score is a 52-bit geohash; real Redis' box test compares\n// component-wise great-circle distances (same-lon for latitude, same-lat for\n// longitude) against half the width/height, not a single radial distance —\n// see geohashGetDistanceIfInRectangle in Redis' geohash_helper.c.\nfunction withinBy(\n center: GeoCenter,\n point: GeoCenter,\n by: GeoBy,\n): number | null {\n if (by.kind === 'radius') {\n const dist = haversineMeters(center.lon, center.lat, point.lon, point.lat)\n return dist <= by.radiusMeters ? dist : null\n }\n\n const latDist = haversineMeters(center.lon, center.lat, center.lon, point.lat)\n if (latDist > by.heightMeters / 2) return null\n const lonDist = haversineMeters(center.lon, center.lat, point.lon, center.lat)\n if (lonDist > by.widthMeters / 2) return null\n return haversineMeters(center.lon, center.lat, point.lon, point.lat)\n}\n\nexport function resolveCenterFromMember(\n zset: RedisSortedSetData | null,\n member: Buffer,\n): GeoCenter {\n const entry = zset?.members.get(member.toString('hex'))\n if (!entry) throw new GeoMissingMemberError()\n return decodeGeoScore(entry.score)\n}\n\n// Brute-force scan: decode every member and test it against the search\n// shape. O(n) rather than Redis' neighbor-cell box scan, but the same result\n// set — see issue #326 implementation notes (ponytail: box-scan optimizer\n// only pays off once a test proves brute force is too slow, which it hasn't).\nexport function collectMatches(\n zset: RedisSortedSetData | null,\n center: GeoCenter,\n by: GeoBy,\n): GeoMatch[] {\n if (!zset) return []\n const matches: GeoMatch[] = []\n for (const entry of getSortedMembers(zset)) {\n const point = decodeGeoScore(entry.score)\n const distanceMeters = withinBy(center, point, by)\n if (distanceMeters === null) continue\n matches.push({\n member: entry.member,\n score: entry.score,\n distanceMeters,\n lon: point.lon,\n lat: point.lat,\n })\n }\n return matches\n}\n\nfunction sortByDistance(\n matches: GeoMatch[],\n order: 'ASC' | 'DESC',\n): GeoMatch[] {\n const sorted = matches\n .slice()\n .sort((a, b) => a.distanceMeters - b.distanceMeters)\n return order === 'DESC' ? sorted.reverse() : sorted\n}\n\n// Ordering matches real Redis' observed behavior: plain COUNT (no ASC/DESC)\n// defaults to nearest-first; COUNT ANY skips the distance sort entirely and\n// takes the first N in zset score order (only sorting that subset if\n// ASC/DESC was also given) — real Redis' ANY doesn't guarantee \"closest N\"\n// either, so this is not a fixed neighbor-cell traversal order to match.\nexport function orderAndLimit(\n matches: GeoMatch[],\n options: GeoOrderCount,\n): GeoMatch[] {\n if (options.count?.any) {\n const limited = matches.slice(0, options.count.count)\n return options.order ? sortByDistance(limited, options.order) : limited\n }\n\n let working = matches\n if (options.order) {\n working = sortByDistance(matches, options.order)\n } else if (options.count) {\n working = sortByDistance(matches, 'ASC')\n }\n return options.count ? working.slice(0, options.count.count) : working\n}\n\nexport function buildSearchReply(\n matches: GeoMatch[],\n flags: GeoWithFlags,\n unit: string,\n): RedisResult {\n if (!flags.withCoord && !flags.withDist && !flags.withHash) {\n return array(matches.map(m => RedisValue.bulkString(m.member)))\n }\n\n return array(\n matches.map(m => {\n const parts: RedisValue[] = [RedisValue.bulkString(m.member)]\n if (flags.withDist) {\n parts.push(\n RedisValue.bulkString(\n Buffer.from(metersToUnit(m.distanceMeters, unit).toFixed(4)),\n ),\n )\n }\n if (flags.withHash) parts.push(RedisValue.integer(m.score))\n if (flags.withCoord) {\n parts.push(\n RedisValue.array([\n RedisValue.bulkString(Buffer.from(m.lon.toString())),\n RedisValue.bulkString(Buffer.from(m.lat.toString())),\n ]),\n )\n }\n return RedisValue.array(parts)\n }),\n )\n}\n\n// STOREDIST stores the query-unit distance as the score instead of the\n// geohash; without it the original geohash score is reused as-is (not\n// re-derived from the decoded lon/lat, which would lose precision).\nexport function buildStoreMembers(\n matches: GeoMatch[],\n storeDist: boolean,\n unit: string,\n): Map<string, RedisSortedSetMember> {\n return new Map(\n matches.map(m => [\n m.member.toString('hex'),\n {\n member: Buffer.from(m.member),\n score: storeDist ? metersToUnit(m.distanceMeters, unit) : m.score,\n },\n ]),\n )\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { WrongNumberOfArgumentsError } from '../../core/redis-error'\nimport { integer } from '../helpers'\nimport { assertValidCoordinates } from './helpers'\nimport {\n buildSearchReply,\n buildStoreMembers,\n collectMatches,\n orderAndLimit,\n parseByRadius,\n parseGeoFloatToken,\n parseGeoRadiusFlags,\n type GeoBy,\n type GeoRadiusFlags,\n} from './search-core'\n\ntype GeoRadiusArgs = GeoRadiusFlags & {\n key: Buffer\n lon: number\n lat: number\n by: GeoBy\n}\n\nfunction createGeoRadiusSchema(allowStore: boolean) {\n return t.custom<GeoRadiusArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const lonTok = input[index + 1]\n const latTok = input[index + 2]\n const radiusTok = input[index + 3]\n const unitTok = input[index + 4]\n if (!key || !lonTok || !latTok || !radiusTok || !unitTok) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const lon = parseGeoFloatToken(lonTok)\n const lat = parseGeoFloatToken(latTok)\n assertValidCoordinates(lon, lat)\n const by = parseByRadius(radiusTok, unitTok)\n const [flags, nextIndex] = parseGeoRadiusFlags(\n input,\n index + 5,\n allowStore,\n )\n\n return { value: { key, lon, lat, by, ...flags }, nextIndex }\n },\n )\n}\n\nfunction executeGeoRadius(args: GeoRadiusArgs, ctx: RedisExecutionContext) {\n const zset = ctx.db.getSortedSet(args.key)\n const matches = collectMatches(\n zset,\n { lon: args.lon, lat: args.lat },\n args.by,\n )\n const ordered = orderAndLimit(matches, {\n order: args.order,\n count: args.count,\n })\n\n const dest = args.store ?? args.storeDist\n if (dest) {\n const members = buildStoreMembers(\n ordered,\n args.storeDist !== undefined,\n args.by.unit,\n )\n if (members.size === 0) {\n ctx.db.delete(dest)\n return integer(0)\n }\n ctx.db.delete(dest)\n ctx.db.updateSortedSet(dest, destZset => {\n destZset.replaceMembers(members, { forceDirty: true })\n })\n return integer(members.size)\n }\n\n return buildSearchReply(\n ordered,\n {\n withCoord: args.withCoord,\n withDist: args.withDist,\n withHash: args.withHash,\n },\n args.by.unit,\n )\n}\n\nexport const georadiusCommand = defineCommand({\n name: 'georadius',\n schema: createGeoRadiusSchema(true),\n flags: ['write', 'denyoom'],\n keys: args =>\n (args.store ?? args.storeDist)\n ? [args.key, (args.store ?? args.storeDist)!]\n : [args.key],\n execute: executeGeoRadius,\n})\n\nexport const georadiusRoCommand = defineCommand({\n name: 'georadius_ro',\n schema: createGeoRadiusSchema(false),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: executeGeoRadius,\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { WrongNumberOfArgumentsError } from '../../core/redis-error'\nimport { integer } from '../helpers'\nimport {\n buildSearchReply,\n buildStoreMembers,\n collectMatches,\n orderAndLimit,\n parseByRadius,\n parseGeoRadiusFlags,\n resolveCenterFromMember,\n type GeoBy,\n type GeoRadiusFlags,\n} from './search-core'\n\ntype GeoRadiusByMemberArgs = GeoRadiusFlags & {\n key: Buffer\n member: Buffer\n by: GeoBy\n}\n\nfunction createGeoRadiusByMemberSchema(allowStore: boolean) {\n return t.custom<GeoRadiusByMemberArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const member = input[index + 1]\n const radiusTok = input[index + 2]\n const unitTok = input[index + 3]\n if (!key || !member || !radiusTok || !unitTok) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const by = parseByRadius(radiusTok, unitTok)\n const [flags, nextIndex] = parseGeoRadiusFlags(\n input,\n index + 4,\n allowStore,\n )\n\n return { value: { key, member, by, ...flags }, nextIndex }\n },\n )\n}\n\nfunction executeGeoRadiusByMember(\n args: GeoRadiusByMemberArgs,\n ctx: RedisExecutionContext,\n) {\n const zset = ctx.db.getSortedSet(args.key)\n const center = resolveCenterFromMember(zset, args.member)\n const matches = collectMatches(zset, center, args.by)\n const ordered = orderAndLimit(matches, {\n order: args.order,\n count: args.count,\n })\n\n const dest = args.store ?? args.storeDist\n if (dest) {\n const members = buildStoreMembers(\n ordered,\n args.storeDist !== undefined,\n args.by.unit,\n )\n if (members.size === 0) {\n ctx.db.delete(dest)\n return integer(0)\n }\n ctx.db.delete(dest)\n ctx.db.updateSortedSet(dest, destZset => {\n destZset.replaceMembers(members, { forceDirty: true })\n })\n return integer(members.size)\n }\n\n return buildSearchReply(\n ordered,\n {\n withCoord: args.withCoord,\n withDist: args.withDist,\n withHash: args.withHash,\n },\n args.by.unit,\n )\n}\n\nexport const georadiusbymemberCommand = defineCommand({\n name: 'georadiusbymember',\n schema: createGeoRadiusByMemberSchema(true),\n flags: ['write', 'denyoom'],\n keys: args =>\n (args.store ?? args.storeDist)\n ? [args.key, (args.store ?? args.storeDist)!]\n : [args.key],\n execute: executeGeoRadiusByMember,\n})\n\nexport const georadiusbymemberRoCommand = defineCommand({\n name: 'georadiusbymember_ro',\n schema: createGeoRadiusByMemberSchema(false),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: executeGeoRadiusByMember,\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { RedisValue } from '../../core/redis-value'\nimport { array } from '../helpers'\nimport { geohashString } from './helpers'\n\nexport const geohashCommand = defineCommand({\n name: 'geohash',\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n const items = args.members.map(member => {\n const entry = zset?.members.get(member.toString('hex'))\n if (!entry) return RedisValue.null()\n return RedisValue.bulkString(Buffer.from(geohashString(entry.score)))\n })\n return array(items)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { RedisValue } from '../../core/redis-value'\nimport { array } from '../helpers'\nimport { decodeGeoScore } from './helpers'\n\nexport const geoposCommand = defineCommand({\n name: 'geopos',\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n const items = args.members.map(member => {\n const entry = zset?.members.get(member.toString('hex'))\n if (!entry) return RedisValue.null()\n const { lon, lat } = decodeGeoScore(entry.score)\n return RedisValue.array([\n RedisValue.bulkString(Buffer.from(lon.toString())),\n RedisValue.bulkString(Buffer.from(lat.toString())),\n ])\n })\n return array(items)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport {\n buildSearchReply,\n collectMatches,\n orderAndLimit,\n parseGeoBy,\n parseGeoFrom,\n resolveCenterFromMember,\n tryParseOrderOrCount,\n type GeoBy,\n type GeoFrom,\n type GeoOrderCount,\n} from './search-core'\n\ntype GeoSearchArgs = GeoOrderCount & {\n key: Buffer\n from: GeoFrom\n by: GeoBy\n withCoord: boolean\n withDist: boolean\n withHash: boolean\n}\n\nfunction createGeoSearchSchema() {\n return t.custom<GeoSearchArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n let cursor = index + 1\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const [from, afterFrom] = parseGeoFrom(input, cursor, ctx.commandName)\n cursor = afterFrom\n\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const [by, afterBy] = parseGeoBy(input, cursor)\n cursor = afterBy\n\n const options: GeoOrderCount = {}\n let withCoord = false\n let withDist = false\n let withHash = false\n while (cursor < input.length) {\n const advanced = tryParseOrderOrCount(input, cursor, options)\n if (advanced !== null) {\n cursor = advanced\n continue\n }\n const token = input[cursor]!.toString().toUpperCase()\n if (token === 'WITHCOORD') {\n withCoord = true\n cursor++\n continue\n }\n if (token === 'WITHDIST') {\n withDist = true\n cursor++\n continue\n }\n if (token === 'WITHHASH') {\n withHash = true\n cursor++\n continue\n }\n throw new RedisSyntaxError()\n }\n\n return {\n value: { key, from, by, withCoord, withDist, withHash, ...options },\n nextIndex: input.length,\n }\n },\n )\n}\n\nexport const geosearchCommand = defineCommand({\n name: 'geosearch',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: createGeoSearchSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n const center =\n args.from.type === 'member'\n ? resolveCenterFromMember(zset, args.from.member)\n : { lon: args.from.lon, lat: args.from.lat }\n\n const matches = collectMatches(zset, center, args.by)\n const ordered = orderAndLimit(matches, {\n order: args.order,\n count: args.count,\n })\n return buildSearchReply(\n ordered,\n {\n withCoord: args.withCoord,\n withDist: args.withDist,\n withHash: args.withHash,\n },\n args.by.unit,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n GeoSearchStoreWithOptionsError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { integer } from '../helpers'\nimport {\n buildStoreMembers,\n collectMatches,\n orderAndLimit,\n parseGeoBy,\n parseGeoFrom,\n resolveCenterFromMember,\n tryParseOrderOrCount,\n type GeoBy,\n type GeoFrom,\n type GeoOrderCount,\n} from './search-core'\n\ntype GeoSearchStoreArgs = GeoOrderCount & {\n destination: Buffer\n source: Buffer\n from: GeoFrom\n by: GeoBy\n storeDist: boolean\n}\n\nfunction createGeoSearchStoreSchema() {\n return t.custom<GeoSearchStoreArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const destination = input[index]\n const source = input[index + 1]\n if (!destination || !source) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 2\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const [from, afterFrom] = parseGeoFrom(input, cursor, ctx.commandName)\n cursor = afterFrom\n\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const [by, afterBy] = parseGeoBy(input, cursor)\n cursor = afterBy\n\n const options: GeoOrderCount = {}\n let storeDist = false\n while (cursor < input.length) {\n const advanced = tryParseOrderOrCount(input, cursor, options)\n if (advanced !== null) {\n cursor = advanced\n continue\n }\n const token = input[cursor]!.toString().toUpperCase()\n if (token === 'STOREDIST') {\n storeDist = true\n cursor++\n continue\n }\n if (\n token === 'WITHCOORD' ||\n token === 'WITHDIST' ||\n token === 'WITHHASH'\n ) {\n throw new GeoSearchStoreWithOptionsError()\n }\n throw new RedisSyntaxError()\n }\n\n return {\n value: { destination, source, from, by, storeDist, ...options },\n nextIndex: input.length,\n }\n },\n )\n}\n\nexport const geosearchstoreCommand = defineCommand({\n name: 'geosearchstore',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: createGeoSearchStoreSchema(),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination, args.source],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.source)\n const center =\n args.from.type === 'member'\n ? resolveCenterFromMember(zset, args.from.member)\n : { lon: args.from.lon, lat: args.from.lat }\n\n const matches = collectMatches(zset, center, args.by)\n const ordered = orderAndLimit(matches, {\n order: args.order,\n count: args.count,\n })\n const members = buildStoreMembers(ordered, args.storeDist, args.by.unit)\n\n if (members.size === 0) {\n ctx.db.delete(args.destination)\n return integer(0)\n }\n\n ctx.db.delete(args.destination)\n ctx.db.updateSortedSet(args.destination, destZset => {\n destZset.replaceMembers(members, { forceDirty: true })\n })\n return integer(members.size)\n },\n})\n","import { geoaddCommand } from './geoadd'\nimport { geodistCommand } from './geodist'\nimport { georadiusCommand, georadiusRoCommand } from './georadius'\nimport {\n georadiusbymemberCommand,\n georadiusbymemberRoCommand,\n} from './georadiusbymember'\nimport { geohashCommand } from './geohash'\nimport { geoposCommand } from './geopos'\nimport { geosearchCommand } from './geosearch'\nimport { geosearchstoreCommand } from './geosearchstore'\n\nexport const geoCommands = [\n geoaddCommand,\n geoposCommand,\n geodistCommand,\n geohashCommand,\n geosearchCommand,\n geosearchstoreCommand,\n georadiusCommand,\n georadiusRoCommand,\n georadiusbymemberCommand,\n georadiusbymemberRoCommand,\n]\n\nexport {\n geoaddCommand,\n geoposCommand,\n geodistCommand,\n geohashCommand,\n geosearchCommand,\n geosearchstoreCommand,\n georadiusCommand,\n georadiusRoCommand,\n georadiusbymemberCommand,\n georadiusbymemberRoCommand,\n}\n","import { defineCommand } from '../core/command-definition'\nimport {\n isIntegerToken,\n parseFiniteFloatToken,\n t,\n type ParseContext,\n} from '../core/command-schema'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport {\n ExpectedIntegerError,\n HashValueNotFloatError,\n HashValueNotIntegerError,\n IncrDecrOverflowError,\n InvalidExpireTimeError,\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport type { TrackedHashData } from '../state/tracked-values'\nimport {\n array,\n bulk,\n integer,\n ok,\n parseIntegerToken,\n ttlMilliseconds,\n ttlSeconds,\n} from './helpers'\n\ntype FieldValuePair = { field: Buffer; value: Buffer }\ntype HrandfieldArgs = {\n key: Buffer\n count: number | undefined\n withValues: boolean\n}\ntype HashFieldsArgs = {\n key: Buffer\n fields: Buffer[]\n}\ntype HashExpireOption = 'NX' | 'XX' | 'GT' | 'LT'\ntype HashExpireMode =\n | 'seconds'\n | 'milliseconds'\n | 'unix-seconds'\n | 'unix-milliseconds'\n\nconst HASH_FIELD_EXPIRATION_SINCE = { redis: '7.4.0', valkey: '9.0.0' } as const\nconst HGETEX_SINCE = { redis: '8.0.0', valkey: '9.0.0' } as const\nconst HGETDEL_SINCE = { redis: '8.0.0', valkey: '9.1.0' } as const\nconst HSETEX_SINCE = { redis: '8.0.0', valkey: '9.0.0' } as const\ntype HashExpireArgs = {\n key: Buffer\n rawArgs: Buffer[]\n}\ntype ParsedHashExpireArgs = {\n time: bigint\n option: HashExpireOption | undefined\n fields: Buffer[]\n}\ntype HgetexExpiration =\n | { kind: 'keep' }\n | { kind: 'persist' }\n | { kind: 'set'; mode: HashExpireMode; time: bigint }\ntype HgetexPlan =\n | { kind: 'keep' }\n | { kind: 'persist' }\n | { kind: 'expireAt'; at: number }\ntype HgetexArgs = {\n key: Buffer\n expiration: HgetexExpiration\n fields: Buffer[]\n}\ntype HsetexCondition = 'FNX' | 'FXX'\ntype HsetexExpiration =\n | { kind: 'clear' }\n | { kind: 'keepttl' }\n | { kind: 'set'; mode: HashExpireMode; time: bigint }\ntype HsetexPlan =\n | { kind: 'clear' }\n | { kind: 'keepttl' }\n | { kind: 'expireAt'; at: number }\ntype HsetexArgs = {\n key: Buffer\n condition: HsetexCondition | undefined\n expiration: HsetexExpiration\n pairs: FieldValuePair[]\n}\n\nconst LONG_MAX = 9223372036854775807n\nconst LONG_MIN = -9223372036854775808n\nconst HASH_FIELD_EXPIRE_MAX_ABS_MS = 0x0000ffffffffffffn >> 2n\n\nfunction createFieldValuePairsSchema() {\n return t.custom<FieldValuePair[]>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const pairs: FieldValuePair[] = []\n let cursor = index\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n while (cursor < input.length) {\n const field = input[cursor]\n const value = input[cursor + 1]\n if (!field || !value) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n pairs.push({ field, value })\n cursor += 2\n }\n if (pairs.length === 0) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return { value: pairs, nextIndex: cursor }\n },\n )\n}\n\nfunction createHrandfieldSchema() {\n return t.custom<HrandfieldArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 1\n if (cursor >= input.length) {\n return {\n value: { key, count: undefined, withValues: false },\n nextIndex: cursor,\n }\n }\n\n const count = parseIntegerToken(input[cursor])\n cursor++\n\n let withValues = false\n if (cursor < input.length) {\n if (input[cursor].toString().toUpperCase() !== 'WITHVALUES') {\n throw new RedisSyntaxError()\n }\n\n withValues = true\n cursor++\n }\n\n if (cursor !== input.length) {\n throw new RedisSyntaxError()\n }\n\n return { value: { key, count, withValues }, nextIndex: cursor }\n },\n )\n}\n\nfunction createHashFieldsSchema() {\n return t.custom<HashFieldsArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key || input.length - index < 4) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const fieldsToken = input[index + 1]\n if (fieldsToken.toString().toUpperCase() !== 'FIELDS') {\n throw new RedisCommandError(\n 'Mandatory argument FIELDS is missing or not at the right position',\n )\n }\n\n const fieldCount = parsePositiveFieldCount(input[index + 2])\n const fields = input.slice(index + 3)\n if (fieldCount !== BigInt(fields.length)) {\n throw new RedisCommandError(\n 'The `numfields` parameter must match the number of arguments',\n )\n }\n\n return {\n value: { key, fields },\n nextIndex: input.length,\n }\n },\n )\n}\n\nfunction createHgetexSchema() {\n return t.custom<HgetexArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key || input.length - index < 4) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const { expiration, nextIndex } = parseHgetexExpiration(\n input,\n index + 1,\n ctx.commandName,\n )\n\n const fieldsToken = input[nextIndex]\n if (!fieldsToken || fieldsToken.toString().toUpperCase() !== 'FIELDS') {\n throw new RedisCommandError(\n 'Mandatory argument FIELDS is missing or not at the right position',\n )\n }\n\n const fieldCountToken = input[nextIndex + 1]\n if (!fieldCountToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const fieldCount = parsePositiveFieldCount(fieldCountToken)\n const fields = input.slice(nextIndex + 2)\n if (fieldCount !== BigInt(fields.length)) {\n throw new RedisCommandError(\n 'The `numfields` parameter must match the number of arguments',\n )\n }\n\n return { value: { key, expiration, fields }, nextIndex: input.length }\n },\n )\n}\n\nfunction parseHgetexExpiration(\n input: readonly Buffer[],\n index: number,\n commandName: string,\n): { expiration: HgetexExpiration; nextIndex: number } {\n const token = input[index]?.toString().toUpperCase()\n if (token === 'PERSIST') {\n return { expiration: { kind: 'persist' }, nextIndex: index + 1 }\n }\n\n const mode = hgetexExpireMode(token)\n if (!mode) {\n return { expiration: { kind: 'keep' }, nextIndex: index }\n }\n\n const timeToken = input[index + 1]\n if (!timeToken) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n const time = parseHashExpireTime(timeToken)\n return { expiration: { kind: 'set', mode, time }, nextIndex: index + 2 }\n}\n\nfunction hgetexExpireMode(\n token: string | undefined,\n): HashExpireMode | undefined {\n if (token === 'EX') return 'seconds'\n if (token === 'PX') return 'milliseconds'\n if (token === 'EXAT') return 'unix-seconds'\n if (token === 'PXAT') return 'unix-milliseconds'\n return undefined\n}\n\nfunction createHsetexSchema() {\n return t.custom<HsetexArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key || input.length - index < 5) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 1\n let condition: HsetexCondition | undefined\n let expiration: HsetexExpiration = { kind: 'clear' }\n let expirationSet = false\n\n // FNX/FXX and the expiration clause may appear in either order, same\n // as real Redis — keep consuming recognized tokens until FIELDS.\n while (cursor < input.length) {\n const token = input[cursor].toString().toUpperCase()\n\n if (token === 'FNX' || token === 'FXX') {\n if (condition) {\n throw new RedisCommandError(\n 'Only one of FXX or FNX arguments can be specified',\n )\n }\n condition = token\n cursor += 1\n continue\n }\n\n if (token === 'KEEPTTL') {\n if (expirationSet) {\n throw new RedisCommandError(\n 'Only one of EX, PX, EXAT, PXAT or KEEPTTL arguments can be specified',\n )\n }\n expiration = { kind: 'keepttl' }\n expirationSet = true\n cursor += 1\n continue\n }\n\n const mode = hgetexExpireMode(token)\n if (mode) {\n if (expirationSet) {\n throw new RedisCommandError(\n 'Only one of EX, PX, EXAT, PXAT or KEEPTTL arguments can be specified',\n )\n }\n const timeToken = input[cursor + 1]\n if (!timeToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n expiration = {\n kind: 'set',\n mode,\n time: parseHashExpireTime(timeToken),\n }\n expirationSet = true\n cursor += 2\n continue\n }\n\n break\n }\n\n const fieldsToken = input[cursor]\n if (!fieldsToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n if (fieldsToken.toString().toUpperCase() !== 'FIELDS') {\n throw new RedisCommandError(`unknown argument: ${fieldsToken}`)\n }\n cursor += 1\n\n const fieldCountToken = input[cursor]\n if (!fieldCountToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const fieldCount = parseHsetexFieldCount(fieldCountToken)\n cursor += 1\n\n const rest = input.slice(cursor)\n if (BigInt(rest.length) !== fieldCount * 2n) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const pairs: FieldValuePair[] = []\n for (let i = 0; i < rest.length; i += 2) {\n pairs.push({ field: rest[i], value: rest[i + 1] })\n }\n\n return {\n value: { key, condition, expiration, pairs },\n nextIndex: input.length,\n }\n },\n )\n}\n\nfunction parseHsetexFieldCount(token: Buffer): bigint {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new RedisCommandError('invalid number of fields')\n }\n\n const value = BigInt(raw)\n if (value < 1n || value > LONG_MAX) {\n throw new RedisCommandError('invalid number of fields')\n }\n\n return value\n}\n\nfunction resolveHsetexPlan(expiration: HsetexExpiration): HsetexPlan {\n if (expiration.kind === 'set') {\n return {\n kind: 'expireAt',\n at: hashExpireTimeToTimestamp(expiration.time, expiration.mode, 'hsetex'),\n }\n }\n return expiration\n}\n\nfunction setexHashFields(\n args: HsetexArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n // Resolve the target timestamp up front so an invalid expire time is\n // reported even when the condition would otherwise skip the write,\n // matching the HGETEX ordering.\n const plan = resolveHsetexPlan(args.expiration)\n const now = Date.now()\n\n let remaining = 0\n // The condition check and the write share one updateHash call: TrackedHashData\n // (unlike the raw getHash() result) already knows how to check field\n // existence with expiry, and skipping any mutating call when the condition\n // fails means the framework never persists a hash for a previously-missing\n // key (see keyspace.ts's dirty/committed tracking).\n const conditionMet = ctx.db.updateHash(args.key, hash => {\n if (args.condition) {\n const met = args.pairs.every(({ field }) => {\n const exists = hash.hasField(field)\n return args.condition === 'FNX' ? !exists : exists\n })\n if (!met) return false\n }\n\n for (const { field, value } of args.pairs) {\n if (plan.kind === 'keepttl') {\n hash.setField(field, value, { forceDirty: true, keepTtl: true })\n continue\n }\n\n hash.setField(field, value, { forceDirty: true })\n if (plan.kind === 'expireAt') {\n if (plan.at <= now) {\n hash.deleteField(field)\n } else {\n hash.setFieldExpiration(field, plan.at)\n }\n }\n }\n remaining = hash.size\n return true\n })\n\n if (!conditionMet) {\n return integer(0)\n }\n\n if (remaining === 0) {\n ctx.db.delete(args.key)\n }\n\n return integer(1)\n}\n\nfunction persistHashFields(\n args: HashFieldsArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const existingHash = ctx.db.getHash(args.key)\n if (!existingHash) {\n return array(args.fields.map(() => RedisValue.integer(-2)))\n }\n\n return ctx.db.updateHash(args.key, hash => {\n return array(\n args.fields.map(field => {\n const entry = hash.getField(field)\n if (!entry) {\n return RedisValue.integer(-2)\n }\n\n if (entry.expiresAt === undefined) {\n return RedisValue.integer(-1)\n }\n\n hash.clearFieldExpiration(field)\n return RedisValue.integer(1)\n }),\n )\n })\n}\n\nfunction hashFieldTtls(\n args: HashFieldsArgs,\n ctx: RedisExecutionContext,\n mode: 'seconds' | 'milliseconds',\n): RedisResult {\n const existingHash = ctx.db.getHash(args.key)\n if (!existingHash) {\n return array(args.fields.map(() => RedisValue.integer(-2)))\n }\n\n return ctx.db.updateHash(args.key, hash => {\n return array(\n args.fields.map(field => {\n const entry = hash.getField(field)\n if (!entry) {\n return RedisValue.integer(-2)\n }\n\n if (entry.expiresAt === undefined) {\n return RedisValue.integer(-1)\n }\n\n const ttl =\n mode === 'seconds'\n ? ttlSeconds(entry.expiresAt)\n : ttlMilliseconds(entry.expiresAt)\n return RedisValue.integer(ttl)\n }),\n )\n })\n}\n\nfunction createHashExpireSchema() {\n return t.custom<HashExpireArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key || input.length - index < 5) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return {\n value: { key, rawArgs: input.slice(index + 1) },\n nextIndex: input.length,\n }\n },\n )\n}\n\nfunction parseHashExpireArgs(\n rawArgs: readonly Buffer[],\n commandName: string,\n): ParsedHashExpireArgs {\n const time = parseHashExpireTime(rawArgs[0])\n let cursor = 1\n\n let option: HashExpireOption | undefined\n const maybeOption = rawArgs[cursor].toString().toUpperCase()\n if (isHashExpireOption(maybeOption)) {\n option = maybeOption\n cursor += 1\n }\n\n const fieldsToken = rawArgs[cursor]\n if (!fieldsToken) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n if (fieldsToken.toString().toUpperCase() !== 'FIELDS') {\n throw new RedisCommandError(\n 'Mandatory argument FIELDS is missing or not at the right position',\n )\n }\n\n const fieldCountToken = rawArgs[cursor + 1]\n if (!fieldCountToken) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n const fieldCount = parseHashExpireFieldCount(fieldCountToken)\n const fields = rawArgs.slice(cursor + 2)\n if (fieldCount !== BigInt(fields.length)) {\n throw new RedisCommandError(\n 'The `numfields` parameter must match the number of arguments',\n )\n }\n\n return { time, option, fields }\n}\n\nfunction parsePositiveFieldCount(token: Buffer): bigint {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new RedisCommandError('Number of fields must be a positive integer')\n }\n\n const value = BigInt(raw)\n if (value < 1n || value > LONG_MAX) {\n throw new RedisCommandError('Number of fields must be a positive integer')\n }\n\n return value\n}\n\nfunction parseHashExpireTime(token: Buffer): bigint {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = BigInt(raw)\n if (value < LONG_MIN || value > LONG_MAX) {\n throw new ExpectedIntegerError()\n }\n\n return value\n}\n\nfunction parseHashExpireFieldCount(token: Buffer): bigint {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw new RedisCommandError(\n 'Parameter `numFields` should be greater than 0',\n )\n }\n\n const value = BigInt(raw)\n if (value < 1n || value > LONG_MAX) {\n throw new RedisCommandError(\n 'Parameter `numFields` should be greater than 0',\n )\n }\n\n return value\n}\n\nfunction isHashExpireOption(value: string): value is HashExpireOption {\n return value === 'NX' || value === 'XX' || value === 'GT' || value === 'LT'\n}\n\nfunction withExistingHash<TResult>(\n ctx: RedisExecutionContext,\n key: Buffer,\n missing: () => TResult,\n callback: (hash: TrackedHashData) => TResult,\n): TResult {\n const hash = ctx.db.getHash(key)\n if (!hash) return missing()\n\n return ctx.db.updateHash(key, callback)\n}\n\nfunction expireHashFields(\n args: HashExpireArgs,\n ctx: RedisExecutionContext,\n mode: HashExpireMode,\n): RedisResult {\n const commandName = hashExpireCommandName(mode)\n const existingHash = ctx.db.getHash(args.key)\n const parsedArgs = parseHashExpireArgs(args.rawArgs, commandName)\n const expiresAt = hashExpireTimeToTimestamp(\n parsedArgs.time,\n mode,\n commandName,\n )\n const now = Date.now()\n\n if (!existingHash) {\n return array(parsedArgs.fields.map(() => RedisValue.integer(-2)))\n }\n\n return ctx.db.updateHash(args.key, hash => {\n return array(\n parsedArgs.fields.map(field => {\n const entry = hash.getField(field)\n if (!entry) {\n return RedisValue.integer(-2)\n }\n\n if (\n !shouldApplyHashExpire(entry.expiresAt, expiresAt, parsedArgs.option)\n ) {\n return RedisValue.integer(0)\n }\n\n if (expiresAt <= now) {\n hash.deleteField(field)\n return RedisValue.integer(2)\n }\n\n hash.setFieldExpiration(field, expiresAt)\n return RedisValue.integer(1)\n }),\n )\n })\n}\n\nfunction resolveHgetexPlan(expiration: HgetexExpiration): HgetexPlan {\n if (expiration.kind === 'set') {\n return {\n kind: 'expireAt',\n at: hashExpireTimeToTimestamp(expiration.time, expiration.mode, 'hgetex'),\n }\n }\n return expiration\n}\n\nfunction getexHashFields(\n args: HgetexArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n // Resolve the target timestamp up front so an invalid expire time is\n // reported even when the key is missing, matching the HEXPIRE ordering.\n const plan = resolveHgetexPlan(args.expiration)\n\n const existingHash = ctx.db.getHash(args.key)\n if (!existingHash) {\n return array(args.fields.map(() => RedisValue.bulkString(null)))\n }\n\n const now = Date.now()\n let remaining = 0\n const values = ctx.db.updateHash(args.key, hash => {\n const replies: RedisValue[] = []\n for (const field of args.fields) {\n const entry = hash.getField(field)\n replies.push(RedisValue.bulkString(entry?.value ?? null))\n if (!entry) continue\n\n if (plan.kind === 'persist') {\n hash.clearFieldExpiration(field)\n continue\n }\n\n if (plan.kind === 'expireAt') {\n if (plan.at <= now) {\n hash.deleteField(field)\n } else {\n hash.setFieldExpiration(field, plan.at)\n }\n }\n }\n remaining = hash.size\n return replies\n })\n\n if (remaining === 0) {\n ctx.db.delete(args.key)\n }\n return array(values)\n}\n\nfunction hashExpireTimeToTimestamp(\n value: bigint,\n mode: HashExpireMode,\n commandName: string,\n): number {\n if (value < 0n) {\n throw new RedisCommandError('invalid expire time, must be >= 0')\n }\n\n const isSecondsMode = mode === 'seconds' || mode === 'unix-seconds'\n if (isSecondsMode && value > HASH_FIELD_EXPIRE_MAX_ABS_MS / 1000n) {\n throw new InvalidExpireTimeError(commandName)\n }\n\n const milliseconds = isSecondsMode ? value * 1000n : value\n const baseTime =\n mode === 'seconds' || mode === 'milliseconds' ? BigInt(Date.now()) : 0n\n\n if (milliseconds > HASH_FIELD_EXPIRE_MAX_ABS_MS - baseTime) {\n throw new InvalidExpireTimeError(commandName)\n }\n\n return Number(milliseconds + baseTime)\n}\n\nfunction hashExpireCommandName(mode: HashExpireMode): string {\n if (mode === 'seconds') {\n return 'hexpire'\n }\n\n if (mode === 'milliseconds') {\n return 'hpexpire'\n }\n\n if (mode === 'unix-seconds') {\n return 'hexpireat'\n }\n\n return 'hpexpireat'\n}\n\nfunction shouldApplyHashExpire(\n currentExpiresAt: number | undefined,\n nextExpiresAt: number,\n option: HashExpireOption | undefined,\n): boolean {\n if (option === 'NX') {\n return currentExpiresAt === undefined\n }\n\n if (option === 'XX') {\n return currentExpiresAt !== undefined\n }\n\n if (option === 'GT') {\n return currentExpiresAt !== undefined && nextExpiresAt > currentExpiresAt\n }\n\n if (option === 'LT') {\n return currentExpiresAt === undefined || nextExpiresAt < currentExpiresAt\n }\n\n return true\n}\n\nfunction randomHashEntries<TValue>(entries: TValue[], count: number): TValue[] {\n if (count === 0) return []\n\n if (count > 0) {\n const limit = Math.min(count, entries.length)\n const pool = entries.slice()\n const result: TValue[] = []\n\n for (let i = 0; i < limit; i++) {\n const j = i + Math.floor(Math.random() * (pool.length - i))\n ;[pool[i], pool[j]] = [pool[j], pool[i]]\n result.push(pool[i])\n }\n\n return result\n }\n\n const result: TValue[] = []\n for (let i = 0; i < Math.abs(count); i++) {\n result.push(entries[Math.floor(Math.random() * entries.length)])\n }\n\n return result\n}\n\nfunction hashEntriesResult(\n entries: FieldValuePair[],\n withValues: boolean,\n): RedisResult {\n if (!withValues) {\n return array(entries.map(({ field }) => RedisValue.bulkString(field)))\n }\n\n // WITHVALUES is a flat [field, value, ...] array on RESP2 and an array of\n // [field, value] pairs on RESP3 — same shape as sorted-set WITHSCORES.\n return RedisResult.create(\n RedisValue.flatPairs(\n entries.map(({ field, value }) => [\n RedisValue.bulkString(field),\n RedisValue.bulkString(value),\n ]),\n ),\n )\n}\n\nexport const hsetCommand = defineCommand({\n name: 'hset',\n schema: t.object({ key: t.key(), pairs: createFieldValuePairsSchema() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const added = ctx.db.updateHash(args.key, hash => {\n let count = 0\n for (const { field, value } of args.pairs) {\n if (hash.setField(field, value, { forceDirty: true }).added) count++\n }\n return count\n })\n return integer(added)\n },\n})\n\nexport const hsetnxCommand = defineCommand({\n name: 'hsetnx',\n schema: t.object({ key: t.key(), field: t.key(), value: t.key() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.updateHash(args.key, hash => {\n return hash.setFieldIfAbsent(args.field, args.value)\n })\n return integer(set ? 1 : 0)\n },\n})\n\nexport const hgetCommand = defineCommand({\n name: 'hget',\n schema: t.object({ key: t.key(), field: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => bulk(null),\n hash => bulk(hash.getField(args.field)?.value ?? null),\n )\n },\n})\n\nexport const hdelCommand = defineCommand({\n name: 'hdel',\n schema: t.object({ key: t.key(), fields: t.variadic(t.key(), { min: 1 }) }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existingHash = ctx.db.getHash(args.key)\n if (!existingHash) return integer(0)\n\n let deleted = 0\n const remaining = ctx.db.updateHash(args.key, hash => {\n for (const field of args.fields) {\n if (hash.deleteField(field)) deleted++\n }\n return hash.size\n })\n if (remaining === 0) {\n ctx.db.delete(args.key)\n }\n return integer(deleted)\n },\n})\n\nexport const hgetdelCommand = defineCommand({\n name: 'hgetdel',\n since: HGETDEL_SINCE,\n schema: createHashFieldsSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (!ctx.db.getHash(args.key)) {\n return array(args.fields.map(() => RedisValue.bulkString(null)))\n }\n\n let remaining = 0\n const values = ctx.db.updateHash(args.key, hash => {\n const replies: RedisValue[] = []\n for (const field of args.fields) {\n const entry = hash.getField(field)\n replies.push(RedisValue.bulkString(entry?.value ?? null))\n if (entry) hash.deleteField(field)\n }\n remaining = hash.size\n return replies\n })\n\n if (remaining === 0) {\n ctx.db.delete(args.key)\n }\n return array(values)\n },\n})\n\nexport const hgetexCommand = defineCommand({\n name: 'hgetex',\n since: HGETEX_SINCE,\n schema: createHgetexSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: getexHashFields,\n})\n\nexport const hsetexCommand = defineCommand({\n name: 'hsetex',\n since: HSETEX_SINCE,\n schema: createHsetexSchema(),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: setexHashFields,\n})\n\nexport const hpersistCommand = defineCommand({\n name: 'hpersist',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashFieldsSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: persistHashFields,\n})\n\nexport const hexpireCommand = defineCommand({\n name: 'hexpire',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashExpireSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => expireHashFields(args, ctx, 'seconds'),\n})\n\nexport const hpexpireCommand = defineCommand({\n name: 'hpexpire',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashExpireSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => expireHashFields(args, ctx, 'milliseconds'),\n})\n\nexport const hexpireatCommand = defineCommand({\n name: 'hexpireat',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashExpireSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => expireHashFields(args, ctx, 'unix-seconds'),\n})\n\nexport const hpexpireatCommand = defineCommand({\n name: 'hpexpireat',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashExpireSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => expireHashFields(args, ctx, 'unix-milliseconds'),\n})\n\nexport const httlCommand = defineCommand({\n name: 'httl',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashFieldsSchema(),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => hashFieldTtls(args, ctx, 'seconds'),\n})\n\nexport const hpttlCommand = defineCommand({\n name: 'hpttl',\n since: HASH_FIELD_EXPIRATION_SINCE,\n schema: createHashFieldsSchema(),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => hashFieldTtls(args, ctx, 'milliseconds'),\n})\n\nexport const hmsetCommand = defineCommand({\n name: 'hmset',\n schema: t.object({ key: t.key(), pairs: createFieldValuePairsSchema() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n ctx.db.updateHash(args.key, hash => {\n for (const { field, value } of args.pairs) {\n hash.setField(field, value, { forceDirty: true })\n }\n })\n return ok()\n },\n})\n\nexport const hmgetCommand = defineCommand({\n name: 'hmget',\n schema: t.object({ key: t.key(), fields: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => array(args.fields.map(() => RedisValue.bulkString(null))),\n hash =>\n array(\n args.fields.map(field => {\n const entry = hash.getField(field)\n return RedisValue.bulkString(entry?.value ?? null)\n }),\n ),\n )\n },\n})\n\nexport const hgetallCommand = defineCommand({\n name: 'hgetall',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => RedisResult.create(RedisValue.map([])),\n hash => {\n const entries: [RedisValue, RedisValue][] = []\n for (const { field, value } of hash.entries()) {\n entries.push([\n RedisValue.bulkString(field),\n RedisValue.bulkString(value),\n ])\n }\n return RedisResult.create(RedisValue.map(entries))\n },\n )\n },\n})\n\nexport const hkeysCommand = defineCommand({\n name: 'hkeys',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => array([]),\n hash =>\n array(\n Array.from(hash.entries()).map(({ field }) =>\n RedisValue.bulkString(field),\n ),\n ),\n )\n },\n})\n\nexport const hvalsCommand = defineCommand({\n name: 'hvals',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => array([]),\n hash =>\n array(\n Array.from(hash.entries()).map(({ value }) =>\n RedisValue.bulkString(value),\n ),\n ),\n )\n },\n})\n\nexport const hrandfieldCommand = defineCommand({\n name: 'hrandfield',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: createHrandfieldSchema(),\n flags: ['readonly', 'random', 'noscript'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => (args.count === undefined ? bulk(null) : array([])),\n hash => {\n const entries = Array.from(hash.entries())\n if (entries.length === 0) {\n return args.count === undefined ? bulk(null) : array([])\n }\n\n if (args.count === undefined) {\n const entry = entries[Math.floor(Math.random() * entries.length)]\n return bulk(entry.field)\n }\n\n return hashEntriesResult(\n randomHashEntries(entries, args.count),\n args.withValues,\n )\n },\n )\n },\n})\n\nexport const hlenCommand = defineCommand({\n name: 'hlen',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => integer(0),\n hash => integer(hash.size),\n )\n },\n})\n\nexport const hexistsCommand = defineCommand({\n name: 'hexists',\n schema: t.object({ key: t.key(), field: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => integer(0),\n hash => integer(hash.hasField(args.field) ? 1 : 0),\n )\n },\n})\n\nexport const hincrbyCommand = defineCommand({\n name: 'hincrby',\n schema: t.object({\n key: t.key(),\n field: t.key(),\n increment: t.bigInteger({ min: LONG_MIN, max: LONG_MAX }),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const result = ctx.db.updateHash(args.key, hash => {\n const entry = hash.getField(args.field)\n let current = 0n\n if (entry) {\n const raw = entry.value.toString()\n // Redis parses the stored value as a 64-bit signed integer; a value\n // outside that range is \"hash value is not an integer\", not overflow.\n if (!isIntegerToken(raw)) {\n throw new HashValueNotIntegerError()\n }\n current = BigInt(raw)\n if (current < LONG_MIN || current > LONG_MAX) {\n throw new HashValueNotIntegerError()\n }\n }\n const next = current + args.increment\n if (next < LONG_MIN || next > LONG_MAX) {\n throw new IncrDecrOverflowError()\n }\n const valueBuf = Buffer.from(next.toString())\n hash.setField(args.field, valueBuf, { forceDirty: true, keepTtl: true })\n return next\n })\n return integer(result)\n },\n})\n\nexport const hincrbyfloatCommand = defineCommand({\n name: 'hincrbyfloat',\n schema: t.object({ key: t.key(), field: t.key(), increment: t.float() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const result = ctx.db.updateHash(args.key, hash => {\n const entry = hash.getField(args.field)\n let current = 0\n if (entry) {\n const raw = entry.value.toString()\n const parsed = parseFiniteFloatToken(raw)\n if (parsed === undefined) {\n throw new HashValueNotFloatError()\n }\n current = parsed\n }\n const next = current + args.increment\n if (isNaN(next) || !isFinite(next)) {\n throw new HashValueNotFloatError()\n }\n // Format like Redis: strip trailing zeros, use fixed notation for small values\n let formatted = String(next)\n if (formatted.includes('e') || formatted.includes('E')) {\n formatted = next.toFixed(17).replace(/\\.?0+$/, '')\n }\n const valueBuf = Buffer.from(formatted)\n hash.setField(args.field, valueBuf, { forceDirty: true, keepTtl: true })\n return valueBuf\n })\n return bulk(result)\n },\n})\n\nexport const hstrlenCommand = defineCommand({\n name: 'hstrlen',\n schema: t.object({ key: t.key(), field: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return withExistingHash(\n ctx,\n args.key,\n () => integer(0),\n hash => integer(hash.getField(args.field)?.value.byteLength ?? 0),\n )\n },\n})\n\nexport const hashesCommands = [\n hsetCommand,\n hsetnxCommand,\n hgetCommand,\n hdelCommand,\n hgetdelCommand,\n hgetexCommand,\n hsetexCommand,\n hpersistCommand,\n hexpireCommand,\n hpexpireCommand,\n hexpireatCommand,\n hpexpireatCommand,\n httlCommand,\n hpttlCommand,\n hmsetCommand,\n hmgetCommand,\n hgetallCommand,\n hkeysCommand,\n hvalsCommand,\n hrandfieldCommand,\n hlenCommand,\n hexistsCommand,\n hincrbyCommand,\n hincrbyfloatCommand,\n hstrlenCommand,\n]\n","import { createHash } from 'node:crypto'\nimport { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport { InvalidHllError } from '../core/redis-error'\nimport { ensureStringOrMissing, integer, simpleString } from './helpers'\nimport type { RedisDatabase } from '../state'\n\n// Dense HyperLogLog registers: 14-bit index -> 16384 registers, one byte\n// each. Not byte-compatible with real Redis's sparse/dense HLL encoding —\n// PFCOUNT is approximate cardinality in both implementations, so exact wire\n// format parity isn't required (no DUMP/RESTORE support for this type yet).\nconst HLL_BITS = 14\nconst HLL_REGISTERS = 1 << HLL_BITS\nconst HLL_INDEX_SHIFT = BigInt(64 - HLL_BITS)\nconst HLL_REST_BITS = 64 - HLL_BITS\n\nfunction hash64(value: Buffer): bigint {\n return createHash('sha1').update(value).digest().readBigUInt64BE(0)\n}\n\n// Returns true when adding `value` increased a register (i.e. the HLL was\n// altered).\nfunction hllAdd(registers: Buffer, value: Buffer): boolean {\n const h = hash64(value)\n const index = Number(h >> HLL_INDEX_SHIFT)\n const rest = h & ((1n << HLL_INDEX_SHIFT) - 1n)\n\n let rank = 1\n for (let i = HLL_REST_BITS - 1; i >= 0; i--) {\n if ((rest >> BigInt(i)) & 1n) break\n rank++\n }\n\n if (registers[index]! < rank) {\n registers[index] = rank\n return true\n }\n return false\n}\n\n// Standard HyperLogLog cardinality estimator with small/large range\n// corrections (linear counting below 2.5m, large-range correction near 2^32).\nfunction hllCount(registers: Buffer): number {\n const m = HLL_REGISTERS\n let sum = 0\n let zeros = 0\n for (let i = 0; i < m; i++) {\n sum += Math.pow(2, -registers[i]!)\n if (registers[i] === 0) zeros++\n }\n\n const alpha = 0.7213 / (1 + 1.079 / m)\n let estimate = (alpha * m * m) / sum\n\n if (estimate <= 2.5 * m && zeros > 0) {\n estimate = m * Math.log(m / zeros)\n } else if (estimate > (1 / 30) * Math.pow(2, 32)) {\n estimate = -Math.pow(2, 32) * Math.log(1 - estimate / Math.pow(2, 32))\n }\n\n return Math.round(estimate)\n}\n\nfunction mergeInto(dest: Buffer, source: Buffer): void {\n for (let i = 0; i < HLL_REGISTERS; i++) {\n if (source[i]! > dest[i]!) {\n dest[i] = source[i]!\n }\n }\n}\n\n// Fetches a key as HLL registers. Returns null for a missing key (treated as\n// an empty/all-zero HLL by callers). Throws WRONGTYPE for a non-string key,\n// or the HLL-specific WRONGTYPE for a string that isn't a valid HLL buffer.\nfunction getHllOrThrow(db: RedisDatabase, key: Buffer): Buffer | null {\n const existing = ensureStringOrMissing(db, key)\n if (!existing) {\n return null\n }\n if (existing.length !== HLL_REGISTERS) {\n throw new InvalidHllError()\n }\n return existing\n}\n\n// --- PFADD -------------------------------------------------------------\n\nexport const pfaddCommand = defineCommand({\n name: 'pfadd',\n schema: t.object({ key: t.key(), elements: t.variadic(t.bulk()) }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = getHllOrThrow(ctx.db, args.key)\n const created = existing === null\n const registers = existing\n ? Buffer.from(existing)\n : Buffer.alloc(HLL_REGISTERS)\n\n let altered = created\n for (const element of args.elements) {\n if (hllAdd(registers, element)) {\n altered = true\n }\n }\n\n if (altered) {\n ctx.db.setString(args.key, registers, { keepTtl: true })\n }\n return integer(altered ? 1 : 0)\n },\n})\n\n// --- PFCOUNT -------------------------------------------------------------\n\nexport const pfcountCommand = defineCommand({\n name: 'pfcount',\n schema: t.object({ keys: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n if (args.keys.length === 1) {\n const registers = getHllOrThrow(ctx.db, args.keys[0]!)\n return integer(registers ? hllCount(registers) : 0)\n }\n\n const merged = Buffer.alloc(HLL_REGISTERS)\n for (const key of args.keys) {\n const registers = getHllOrThrow(ctx.db, key)\n if (registers) {\n mergeInto(merged, registers)\n }\n }\n return integer(hllCount(merged))\n },\n})\n\n// --- PFMERGE -------------------------------------------------------------\n\nexport const pfmergeCommand = defineCommand({\n name: 'pfmerge',\n schema: t.object({\n destKey: t.key(),\n sourceKeys: t.variadic(t.key()),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destKey, ...args.sourceKeys],\n execute: (args, ctx) => {\n const destExisting = getHllOrThrow(ctx.db, args.destKey)\n const merged = destExisting\n ? Buffer.from(destExisting)\n : Buffer.alloc(HLL_REGISTERS)\n\n for (const key of args.sourceKeys) {\n const registers = getHllOrThrow(ctx.db, key)\n if (registers) {\n mergeInto(merged, registers)\n }\n }\n\n ctx.db.setString(args.destKey, merged, { keepTtl: true })\n return simpleString('OK')\n },\n})\n\nexport const hyperloglogCommands = [\n pfaddCommand,\n pfcountCommand,\n pfmergeCommand,\n]\n","import { defineCommand } from '../core/command-definition'\nimport { t, type ParseContext } from '../core/command-schema'\nimport {\n DbIndexOutOfRangeError,\n ExpireGtLtConflictError,\n ExpireNxXxGtLtConflictError,\n ExpectedIntegerError,\n NoSuchKeyError,\n RedisSyntaxError,\n SameObjectError,\n SortScoreNotDoubleError,\n UnsupportedOptionError,\n WrongNumberOfArgumentsError,\n WrongTypeRedisError,\n} from '../core/redis-error'\nimport { RedisValue } from '../core/redis-value'\nimport type { ExpirationState, RedisDatabase } from '../state'\nimport {\n array,\n bulk,\n integer,\n ok,\n parseIntegerToken,\n simpleString,\n ttlMilliseconds,\n ttlSeconds,\n typeName,\n} from './helpers'\n\nexport const delCommand = defineCommand({\n name: 'del',\n schema: t.object({\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n let count = 0\n for (const key of args.keys) {\n if (ctx.db.delete(key)) {\n count += 1\n }\n }\n\n return integer(count)\n },\n})\n\nexport const unlinkCommand = defineCommand({\n ...delCommand,\n name: 'unlink',\n})\n\nexport const existsCommand = defineCommand({\n name: 'exists',\n schema: t.object({\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['readonly', 'fast'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n let count = 0\n for (const key of args.keys) {\n if (ctx.db.getType(key) !== null) {\n count += 1\n }\n }\n\n return integer(count)\n },\n})\n\nexport const touchCommand = defineCommand({\n name: 'touch',\n schema: t.object({\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['readonly', 'fast'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n let count = 0\n for (const key of args.keys) {\n if (ctx.db.getType(key) !== null) {\n count += 1\n }\n }\n\n return integer(count)\n },\n})\n\nexport const typeCommand = defineCommand({\n name: 'type',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => simpleString(typeName(ctx.db.getType(args.key))),\n})\n\nexport const dbsizeCommand = defineCommand({\n name: 'dbsize',\n schema: t.object({}),\n flags: ['readonly', 'fast'],\n keys: () => [],\n execute: (_args, ctx) => integer(ctx.db.size()),\n})\n\nexport const randomkeyCommand = defineCommand({\n name: 'randomkey',\n schema: t.object({}),\n flags: ['readonly', 'random', 'fast'],\n keys: () => [],\n execute: (_args, ctx) => {\n const entries = ctx.db.entriesSnapshot()\n if (entries.length === 0) {\n return bulk(null)\n }\n\n const index = Math.floor(Math.random() * entries.length)\n return bulk(entries[index].key)\n },\n})\n\nexport const ttlCommand = defineCommand({\n name: 'ttl',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const expiration = ctx.db.getExpiration(args.key)\n if (expiration.kind === 'missing') {\n return integer(-2)\n }\n\n if (expiration.kind === 'persistent') {\n return integer(-1)\n }\n\n return integer(ttlSeconds(expiration.expiresAt))\n },\n})\n\nexport const pttlCommand = defineCommand({\n name: 'pttl',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const expiration = ctx.db.getExpiration(args.key)\n if (expiration.kind === 'missing') {\n return integer(-2)\n }\n\n if (expiration.kind === 'persistent') {\n return integer(-1)\n }\n\n return integer(ttlMilliseconds(expiration.expiresAt))\n },\n})\n\nexport const expiretimeCommand = defineCommand({\n name: 'expiretime',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const expiration = ctx.db.getExpiration(args.key)\n if (expiration.kind === 'missing') {\n return integer(-2)\n }\n\n if (expiration.kind === 'persistent') {\n return integer(-1)\n }\n\n // Redis rounds to the nearest second ((ms+500)/1000), not floor.\n return integer(Math.round(expiration.expiresAt / 1000))\n },\n})\n\nexport const pexpiretimeCommand = defineCommand({\n name: 'pexpiretime',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const expiration = ctx.db.getExpiration(args.key)\n if (expiration.kind === 'missing') {\n return integer(-2)\n }\n\n if (expiration.kind === 'persistent') {\n return integer(-1)\n }\n\n return integer(expiration.expiresAt)\n },\n})\n\ntype ExpireCondition = 'NX' | 'XX'\ntype ExpireComparison = 'GT' | 'LT'\ntype ExpireOptions = {\n condition?: ExpireCondition\n comparison?: ExpireComparison\n}\n\nconst expireOptionsSchema = t.custom<ExpireOptions>((input, index, ctx) => {\n const options: ExpireOptions = {}\n let cursor = index\n\n while (cursor < input.length) {\n const token = input[cursor]!.toString()\n const option = token.toUpperCase()\n\n if (\n (option === 'NX' ||\n option === 'XX' ||\n option === 'GT' ||\n option === 'LT') &&\n !ctx.profile.has('expire.conditions')\n ) {\n return { value: options, nextIndex: cursor }\n }\n\n if (option === 'NX') {\n if (options.condition === 'XX' || options.comparison !== undefined) {\n throw new ExpireNxXxGtLtConflictError()\n }\n options.condition = 'NX'\n cursor += 1\n continue\n }\n\n if (option === 'XX') {\n if (options.condition === 'NX') {\n throw new ExpireNxXxGtLtConflictError()\n }\n options.condition = 'XX'\n cursor += 1\n continue\n }\n\n if (option === 'GT') {\n if (options.condition === 'NX') {\n throw new ExpireNxXxGtLtConflictError()\n }\n if (options.comparison === 'LT') {\n throw new ExpireGtLtConflictError()\n }\n options.comparison = 'GT'\n cursor += 1\n continue\n }\n\n if (option === 'LT') {\n if (options.condition === 'NX') {\n throw new ExpireNxXxGtLtConflictError()\n }\n if (options.comparison === 'GT') {\n throw new ExpireGtLtConflictError()\n }\n options.comparison = 'LT'\n cursor += 1\n continue\n }\n\n throw new UnsupportedOptionError(token)\n }\n\n return { value: options, nextIndex: cursor }\n})\n\nexport const expireCommand = defineCommand({\n name: 'expire',\n schema: t.object({\n key: t.key(),\n seconds: t.integer(),\n options: expireOptionsSchema,\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) =>\n expireKey(ctx.db, args.key, args.seconds, 1000, args.options),\n})\n\nexport const pexpireCommand = defineCommand({\n name: 'pexpire',\n schema: t.object({\n key: t.key(),\n milliseconds: t.integer(),\n options: expireOptionsSchema,\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) =>\n expireKey(ctx.db, args.key, args.milliseconds, 1, args.options),\n})\n\nexport const persistCommand = defineCommand({\n name: 'persist',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => integer(ctx.db.persist(args.key) ? 1 : 0),\n})\n\n// FLUSHDB/FLUSHALL accept an optional ASYNC|SYNC modifier (Redis 4.0+). The\n// keyspace is in-memory, so the flush is synchronous regardless — the keyword is\n// parsed for compatibility and otherwise ignored. Anything other than a single\n// ASYNC|SYNC token is a syntax error (matching real Redis), so the whole tail is\n// validated here rather than relying on the generic leftover-arg check, which\n// would surface a wrong-number-of-arguments error instead.\nconst flushModeSchema = t.custom<'async' | 'sync' | undefined>(\n (input, index) => {\n const remaining = input.length - index\n if (remaining === 0) {\n return { value: undefined, nextIndex: index }\n }\n\n if (remaining === 1) {\n const token = input[index].toString().toLowerCase()\n if (token === 'async' || token === 'sync') {\n return { value: token, nextIndex: index + 1 }\n }\n }\n\n throw new RedisSyntaxError()\n },\n)\n\nexport const flushdbCommand = defineCommand({\n name: 'flushdb',\n schema: t.object({ mode: flushModeSchema }),\n flags: ['write'],\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.db.flush()\n return ok()\n },\n})\n\nexport const flushallCommand = defineCommand({\n name: 'flushall',\n schema: t.object({ mode: flushModeSchema }),\n flags: ['write'],\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.server.flushAllDatabases()\n return ok()\n },\n})\n\nexport const expireatCommand = defineCommand({\n name: 'expireat',\n schema: t.object({\n key: t.key(),\n timestamp: t.integer(),\n options: expireOptionsSchema,\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return expireAtKey(ctx.db, args.key, args.timestamp * 1000, args.options)\n },\n})\n\nexport const pexpireatCommand = defineCommand({\n name: 'pexpireat',\n schema: t.object({\n key: t.key(),\n timestamp: t.integer(),\n options: expireOptionsSchema,\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return expireAtKey(ctx.db, args.key, args.timestamp, args.options)\n },\n})\n\nexport const renameCommand = defineCommand({\n name: 'rename',\n schema: t.object({ key: t.key(), newKey: t.key() }),\n flags: ['write'],\n keys: args => [args.key, args.newKey],\n execute: (args, ctx) => {\n const value = ctx.db.get(args.key)\n if (!value) throw new NoSuchKeyError()\n\n // Renaming a key to itself is a true no-op in Redis: it replies +OK\n // without touching the keyspace, so it must not emit a mutation event\n // that would invalidate a WATCH on the key.\n if (args.key.equals(args.newKey)) return ok()\n\n const expiration = ctx.db.getExpiration(args.key)\n const expiresAt =\n expiration.kind === 'expires' ? expiration.expiresAt : undefined\n\n ctx.db.delete(args.key)\n ctx.db.set(\n args.newKey,\n value,\n expiresAt !== undefined ? { expiresAt } : undefined,\n )\n\n return ok()\n },\n})\n\nexport const renamenxCommand = defineCommand({\n name: 'renamenx',\n schema: t.object({ key: t.key(), newKey: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key, args.newKey],\n execute: (args, ctx) => {\n const value = ctx.db.get(args.key)\n if (!value) throw new NoSuchKeyError()\n\n if (ctx.db.getType(args.newKey) !== null) return integer(0)\n\n const expiration = ctx.db.getExpiration(args.key)\n const expiresAt =\n expiration.kind === 'expires' ? expiration.expiresAt : undefined\n\n ctx.db.delete(args.key)\n ctx.db.set(\n args.newKey,\n value,\n expiresAt !== undefined ? { expiresAt } : undefined,\n )\n\n return integer(1)\n },\n})\n\nexport const moveCommand = defineCommand({\n name: 'move',\n schema: t.object({ key: t.key(), database: t.integer() }),\n flags: ['write'],\n capabilities: { clusterMode: 'forbidden' },\n keys: args => [args.key],\n execute: (args, ctx) => {\n const targetDb = ctx.server.databases[args.database]\n if (!targetDb) {\n throw new DbIndexOutOfRangeError()\n }\n\n if (targetDb.id === ctx.db.id) {\n throw new SameObjectError()\n }\n\n const value = ctx.db.get(args.key)\n if (!value) return integer(0)\n\n if (targetDb.getType(args.key) !== null) {\n return integer(0)\n }\n\n const expiration = ctx.db.getExpiration(args.key)\n const expiresAt =\n expiration.kind === 'expires' ? expiration.expiresAt : undefined\n\n ctx.db.delete(args.key)\n targetDb.set(\n args.key,\n value,\n expiresAt !== undefined ? { expiresAt } : undefined,\n )\n\n return integer(1)\n },\n})\n\ntype CopyOptions = { db?: number; replace: boolean }\n\n/**\n * Parses the trailing `[DB destination-db] [REPLACE]` options of COPY. Like\n * real Redis the options may appear in any order and repeat (last DB wins).\n */\nconst copyOptionsSchema = t.custom<CopyOptions>((input, index) => {\n let cursor = index\n let db: number | undefined\n let replace = false\n\n while (cursor < input.length) {\n const token = input[cursor].toString().toUpperCase()\n\n if (token === 'REPLACE') {\n replace = true\n cursor += 1\n continue\n }\n\n if (token === 'DB') {\n const raw = input[cursor + 1]\n if (!raw) throw new RedisSyntaxError()\n\n const text = raw.toString()\n if (!/^-?\\d+$/.test(text)) throw new ExpectedIntegerError()\n\n const value = Number(text)\n if (!Number.isSafeInteger(value)) throw new ExpectedIntegerError()\n\n db = value\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return { value: { db, replace }, nextIndex: cursor }\n})\n\nexport const copyCommand = defineCommand({\n name: 'copy',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({\n source: t.key(),\n destination: t.key(),\n options: copyOptionsSchema,\n }),\n flags: ['write'],\n keys: args => [args.source, args.destination],\n execute: (args, ctx) => {\n const { source, destination, options } = args\n\n let targetDb = ctx.db\n if (options.db !== undefined) {\n if (options.db < 0 || options.db >= ctx.server.databases.length) {\n throw new DbIndexOutOfRangeError()\n }\n targetDb = ctx.server.getDatabase(options.db)\n }\n\n if (targetDb.id === ctx.db.id && source.equals(destination)) {\n throw new SameObjectError()\n }\n\n const value = ctx.db.get(source)\n if (!value) return integer(0)\n\n if (!options.replace && targetDb.getType(destination) !== null) {\n return integer(0)\n }\n\n const expiration = ctx.db.getExpiration(source)\n const expiresAt =\n expiration.kind === 'expires' ? expiration.expiresAt : undefined\n\n targetDb.set(\n destination,\n value,\n expiresAt !== undefined ? { expiresAt } : undefined,\n )\n\n return integer(1)\n },\n})\n\n// SORT key [BY pattern] [LIMIT offset count] [GET pattern ...] [ASC | DESC]\n// [ALPHA] [STORE destination]\n// Sorts the elements of a list, set, or zset (zset is sorted by member value,\n// not score). Numeric by default — every element must parse as a double, or\n// the command errors; ALPHA switches to a byte-wise lexicographic sort. STORE\n// writes the sorted result to a destination list and replies with its length.\ntype SortArgs = {\n key: Buffer\n desc: boolean\n alpha: boolean\n limit?: { offset: number; count: number }\n by?: Buffer\n get: Buffer[]\n store?: Buffer\n}\n\nfunction parseSort(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n allowStore: boolean,\n): SortArgs {\n const key = input[index]\n if (!key) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n let cursor = index + 1\n let desc = false\n let alpha = false\n let limit: { offset: number; count: number } | undefined\n let by: Buffer | undefined\n const get: Buffer[] = []\n let store: Buffer | undefined\n\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'BY') {\n const pattern = input[cursor + 1]\n if (!pattern) throw new RedisSyntaxError()\n by = pattern\n cursor += 2\n continue\n }\n\n if (option === 'GET') {\n const pattern = input[cursor + 1]\n if (!pattern) throw new RedisSyntaxError()\n get.push(pattern)\n cursor += 2\n continue\n }\n\n if (option === 'ASC') {\n desc = false\n cursor++\n continue\n }\n\n if (option === 'DESC') {\n desc = true\n cursor++\n continue\n }\n\n if (option === 'ALPHA') {\n alpha = true\n cursor++\n continue\n }\n\n if (option === 'LIMIT') {\n const offsetToken = input[cursor + 1]\n const countToken = input[cursor + 2]\n if (!offsetToken || !countToken) throw new RedisSyntaxError()\n limit = {\n offset: parseIntegerToken(offsetToken),\n count: parseIntegerToken(countToken),\n }\n cursor += 3\n continue\n }\n\n if (allowStore && option === 'STORE') {\n const destination = input[cursor + 1]\n if (!destination) throw new RedisSyntaxError()\n store = destination\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return { key, desc, alpha, limit, by, get, store }\n}\n\nfunction sortSchema(allowStore: boolean) {\n return t.custom<SortArgs>((input, index, ctx) => ({\n value: parseSort(input, index, ctx, allowStore),\n nextIndex: input.length,\n }))\n}\n\nfunction readSortSource(db: RedisDatabase, key: Buffer): Buffer[] {\n const type = db.getType(key)\n if (type === null) return []\n if (type === 'list') return db.getList(key)!.values\n if (type === 'set') return Array.from(db.getSet(key)!.members.values())\n if (type === 'zset') {\n return Array.from(db.getSortedSet(key)!.members.values(), m => m.member)\n }\n throw new WrongTypeRedisError()\n}\n\nfunction sortNumericScore(element: Buffer): number {\n // Redis converts every element with strtod; an empty string becomes 0, and\n // anything that does not parse as a double aborts the whole command.\n const value = Number(element.toString())\n if (Number.isNaN(value)) throw new SortScoreNotDoubleError()\n return value\n}\n\nfunction sortElements(\n elements: readonly Buffer[],\n args: SortArgs,\n db: RedisDatabase,\n): Buffer[] {\n if (args.by && isNoSortPattern(args.by)) {\n return [...elements]\n }\n\n if (args.alpha) {\n const sorted = [...elements].sort((a, b) =>\n Buffer.compare(sortByValue(a, args, db), sortByValue(b, args, db)),\n )\n if (args.desc) sorted.reverse()\n return sorted\n }\n\n const scored = elements.map(element => ({\n element,\n score: sortNumericScore(sortByValue(element, args, db)),\n }))\n scored.sort((a, b) => a.score - b.score)\n if (args.desc) scored.reverse()\n return scored.map(entry => entry.element)\n}\n\nfunction applySortLimit(\n elements: Buffer[],\n limit: SortArgs['limit'],\n): Buffer[] {\n if (!limit) return elements\n // Redis clamps a negative offset to 0; a negative count means \"all remaining\".\n const start = Math.max(0, limit.offset)\n if (start >= elements.length) return []\n if (limit.count < 0) return elements.slice(start)\n return elements.slice(start, start + limit.count)\n}\n\nfunction runSort(args: SortArgs, db: RedisDatabase) {\n const source = readSortSource(db, args.key)\n const sorted = applySortLimit(sortElements(source, args, db), args.limit)\n const output = projectSortOutput(sorted, args, db)\n\n if (args.store) {\n db.delete(args.store)\n if (output.length > 0) {\n db.updateList(args.store, list =>\n list.pushRight(output.map(value => value ?? Buffer.alloc(0))),\n )\n }\n return integer(output.length)\n }\n\n return array(output.map(element => RedisValue.bulkString(element)))\n}\n\nfunction sortByValue(\n element: Buffer,\n args: SortArgs,\n db: RedisDatabase,\n): Buffer {\n if (!args.by) {\n return element\n }\n\n return readSortPattern(db, args.by, element) ?? Buffer.alloc(0)\n}\n\nfunction projectSortOutput(\n elements: readonly Buffer[],\n args: SortArgs,\n db: RedisDatabase,\n): Array<Buffer | null> {\n if (args.get.length === 0) {\n return elements.map(element => Buffer.from(element))\n }\n\n const output: Array<Buffer | null> = []\n for (const element of elements) {\n for (const pattern of args.get) {\n output.push(\n isSelfSortPattern(pattern)\n ? Buffer.from(element)\n : readSortPattern(db, pattern, element),\n )\n }\n }\n return output\n}\n\nfunction readSortPattern(\n db: RedisDatabase,\n pattern: Buffer,\n element: Buffer,\n): Buffer | null {\n const key = expandSortPattern(pattern, element)\n const type = db.getType(key)\n if (type === null) {\n return null\n }\n if (type !== 'string') {\n throw new WrongTypeRedisError()\n }\n return db.getString(key)\n}\n\nfunction expandSortPattern(pattern: Buffer, element: Buffer): Buffer {\n const index = pattern.indexOf(0x2a)\n if (index === -1) {\n return Buffer.from(pattern)\n }\n\n return Buffer.concat([\n pattern.subarray(0, index),\n element,\n pattern.subarray(index + 1),\n ])\n}\n\nfunction isSelfSortPattern(pattern: Buffer): boolean {\n return pattern.length === 1 && pattern[0] === 0x23\n}\n\nfunction isNoSortPattern(pattern: Buffer): boolean {\n return pattern.toString().toLowerCase() === 'nosort'\n}\n\nfunction sortRoutingKeys(args: SortArgs): Buffer[] {\n const keys = [args.key]\n if (args.by && !isNoSortPattern(args.by)) {\n keys.push(args.by)\n }\n for (const pattern of args.get) {\n if (!isSelfSortPattern(pattern)) {\n keys.push(pattern)\n }\n }\n if (args.store) {\n keys.push(args.store)\n }\n return keys\n}\n\nexport const sortCommand = defineCommand({\n name: 'sort',\n schema: sortSchema(true),\n flags: ['write', 'denyoom'],\n keys: sortRoutingKeys,\n execute: (args, ctx) => runSort(args, ctx.db),\n})\n\nexport const sortRoCommand = defineCommand({\n name: 'sort_ro',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: sortSchema(false),\n flags: ['readonly'],\n keys: sortRoutingKeys,\n execute: (args, ctx) => runSort(args, ctx.db),\n})\n\nexport const keysCommands = [\n delCommand,\n unlinkCommand,\n existsCommand,\n touchCommand,\n typeCommand,\n dbsizeCommand,\n randomkeyCommand,\n ttlCommand,\n pttlCommand,\n expiretimeCommand,\n pexpiretimeCommand,\n expireCommand,\n pexpireCommand,\n persistCommand,\n flushdbCommand,\n flushallCommand,\n expireatCommand,\n pexpireatCommand,\n renameCommand,\n renamenxCommand,\n moveCommand,\n copyCommand,\n sortCommand,\n sortRoCommand,\n]\n\nfunction expireKey(\n db: RedisDatabase,\n key: Buffer,\n duration: number,\n multiplier: number,\n options: ExpireOptions,\n) {\n const now = Date.now()\n return expireAtKey(db, key, now + duration * multiplier, options, now)\n}\n\nfunction expireAtKey(\n db: RedisDatabase,\n key: Buffer,\n expiresAt: number,\n options: ExpireOptions,\n now = Date.now(),\n) {\n const expiration = db.getExpiration(key)\n if (expiration.kind === 'missing') {\n return integer(0)\n }\n\n if (!shouldApplyExpireOptions(expiration, expiresAt, options)) {\n return integer(0)\n }\n\n if (expiresAt <= now) {\n return integer(db.delete(key) ? 1 : 0)\n }\n\n return integer(db.expire(key, expiresAt) ? 1 : 0)\n}\n\nfunction shouldApplyExpireOptions(\n expiration: Exclude<ExpirationState, { kind: 'missing' }>,\n expiresAt: number,\n options: ExpireOptions,\n): boolean {\n if (options.condition === 'NX') {\n return expiration.kind === 'persistent'\n }\n\n if (options.condition === 'XX' && expiration.kind !== 'expires') {\n return false\n }\n\n if (options.comparison === 'GT') {\n return expiration.kind === 'expires' && expiresAt > expiration.expiresAt\n }\n\n if (options.comparison !== 'LT') {\n return true\n }\n\n if (expiration.kind === 'persistent') {\n return true\n }\n\n return expiresAt < expiration.expiresAt\n}\n","import {\n PositiveCountError,\n RedisSyntaxError,\n TimeoutNegativeError,\n TimeoutNotFloatError,\n} from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, bulk } from '../helpers'\n\nexport function resolveIndex(index: number, len: number): number {\n return index < 0 ? len + index : index\n}\n\nexport function listRemove(\n values: Buffer[],\n count: number,\n element: Buffer,\n): number {\n const target = element.toString('binary')\n let removed = 0\n\n if (count === 0) {\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i].toString('binary') === target) {\n values.splice(i, 1)\n removed++\n }\n }\n } else if (count > 0) {\n for (let i = 0; i < values.length && removed < count; i++) {\n if (values[i].toString('binary') === target) {\n values.splice(i, 1)\n removed++\n i--\n }\n }\n } else {\n const absCount = Math.abs(count)\n for (let i = values.length - 1; i >= 0 && removed < absCount; i--) {\n if (values[i].toString('binary') === target) {\n values.splice(i, 1)\n removed++\n }\n }\n }\n return removed\n}\n\nexport function popList(\n args: { key: Buffer; count?: number },\n ctx: RedisExecutionContext,\n side: 'left' | 'right',\n): RedisResult {\n const count = args.count\n if (count !== undefined && count < 0) {\n throw new PositiveCountError()\n }\n\n const list = ctx.db.getList(args.key)\n if (!list || list.values.length === 0) {\n return count === undefined\n ? bulk(null)\n : RedisResult.create(RedisValue.nullArray())\n }\n\n if (count === undefined) {\n const result = ctx.db.updateList(args.key, list => {\n const value = list.pop(side)\n return { value, empty: list.length === 0 }\n })\n if (result.empty) ctx.db.delete(args.key)\n return bulk(result.value)\n }\n\n if (count === 0) {\n return array([])\n }\n\n const result = ctx.db.updateList(args.key, list => {\n const values = list.popMany(side, count)\n return { values, empty: list.length === 0 }\n })\n if (result.empty) ctx.db.delete(args.key)\n\n return array(\n result.values.map((value: Buffer) => RedisValue.bulkString(value)),\n )\n}\n\nexport function parseMoveDirection(\n token: Buffer | undefined,\n): 'left' | 'right' {\n if (!token) throw new RedisSyntaxError()\n const direction = token.toString().toUpperCase()\n if (direction === 'LEFT') return 'left'\n if (direction === 'RIGHT') return 'right'\n throw new RedisSyntaxError()\n}\n\nexport function parseTimeout(token: Buffer): number {\n const value = Number(token.toString())\n if (isNaN(value)) throw new TimeoutNotFloatError()\n if (value < 0) throw new TimeoutNegativeError()\n return value\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport type { RedisDatabase } from '../../state'\nimport { bulk } from '../helpers'\n\nfunction moveDirection(): ReturnType<typeof t.custom<'left' | 'right'>> {\n return t.custom<'left' | 'right'>((input, index, ctx) => {\n const token = input[index]\n if (!token) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const direction = token.toString().toUpperCase()\n if (direction !== 'LEFT' && direction !== 'RIGHT') {\n throw new RedisSyntaxError()\n }\n\n return {\n value: direction === 'LEFT' ? 'left' : 'right',\n nextIndex: index + 1,\n }\n })\n}\n\n// Non-blocking LMOVE core. Returns a bulk-string result on success, or `null`\n// when the source is empty/missing (the caller decides whether to block).\nexport function tryListMove(\n source: Buffer,\n destination: Buffer,\n fromDirection: 'left' | 'right',\n toDirection: 'left' | 'right',\n db: RedisDatabase,\n): RedisResult | null {\n const sourceList = db.getList(source)\n if (!sourceList || sourceList.values.length === 0) return null\n\n // Validate destination type before mutating the source\n db.getList(destination)\n\n const popped = db.updateList(source, list => {\n const value = list.pop(fromDirection)\n return { value, empty: list.length === 0 }\n })\n if (popped.empty) db.delete(source)\n if (popped.value === null) return null\n\n db.updateList(destination, list => {\n if (toDirection === 'left') list.pushLeft([popped.value!])\n else list.pushRight([popped.value!])\n })\n\n return bulk(popped.value)\n}\n\nexport const rpoplpushCommand = defineCommand({\n name: 'rpoplpush',\n schema: t.object({\n source: t.key(),\n destination: t.key(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.source, args.destination],\n execute: (args, ctx) => {\n const sourceList = ctx.db.getList(args.source)\n if (!sourceList || sourceList.values.length === 0) return bulk(null)\n\n // Validate destination type before mutating\n ctx.db.getList(args.destination)\n\n const value = ctx.db.updateList(args.source, list => {\n const val = list.pop('right')\n return { val, empty: list.length === 0 }\n })\n if (value.empty) ctx.db.delete(args.source)\n if (value.val === null) return bulk(null)\n\n ctx.db.updateList(args.destination, list => {\n list.pushLeft([value.val!])\n })\n\n return bulk(value.val)\n },\n})\n\nexport const lmoveCommand = defineCommand({\n name: 'lmove',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({\n source: t.key(),\n destination: t.key(),\n fromDirection: moveDirection(),\n toDirection: moveDirection(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.source, args.destination],\n execute: (args, ctx) =>\n tryListMove(\n args.source,\n args.destination,\n args.fromDirection,\n args.toDirection,\n ctx.db,\n ) ?? bulk(null),\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { WrongNumberOfArgumentsError } from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { bulk } from '../helpers'\nimport { parseMoveDirection, parseTimeout } from './helpers'\nimport { tryListMove } from './move'\n\ntype BlmoveArgs = {\n source: Buffer\n destination: Buffer\n fromDirection: 'left' | 'right'\n toDirection: 'left' | 'right'\n timeout: number\n}\n\nasync function blockingListMove(\n source: Buffer,\n destination: Buffer,\n fromDirection: 'left' | 'right',\n toDirection: 'left' | 'right',\n timeoutSecs: number,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs =\n timeoutSecs === 0 ? undefined : Math.ceil(timeoutSecs * 1000)\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return bulk(null)\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsub = ctx.db.subscribeKey(source, event => {\n if (event.type === 'write') wake(true)\n })\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n try {\n unsub()\n } catch {\n // ignore\n }\n }\n\n if (woken === null) return bulk(null)\n\n const result = tryListMove(\n source,\n destination,\n fromDirection,\n toDirection,\n ctx.db,\n )\n if (result) return result\n }\n}\n\nexport const blmoveCommand = defineCommand({\n name: 'blmove',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.custom<BlmoveArgs>((input, index, ctx) => {\n const source = input[index]\n const destination = input[index + 1]\n if (!source || !destination)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n const fromDirection = parseMoveDirection(input[index + 2])\n const toDirection = parseMoveDirection(input[index + 3])\n const timeoutToken = input[index + 4]\n if (!timeoutToken) throw new WrongNumberOfArgumentsError(ctx.commandName)\n const timeout = parseTimeout(timeoutToken)\n return {\n value: { source, destination, fromDirection, toDirection, timeout },\n nextIndex: index + 5,\n }\n }),\n flags: ['write', 'noscript'],\n keys: args => [args.source, args.destination],\n execute: (args, ctx) => {\n const immediate = tryListMove(\n args.source,\n args.destination,\n args.fromDirection,\n args.toDirection,\n ctx.db,\n )\n if (immediate) return immediate\n return blockingListMove(\n args.source,\n args.destination,\n args.fromDirection,\n args.toDirection,\n args.timeout,\n ctx,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { isIntegerToken, t, type ParseContext } from '../../core/command-schema'\nimport {\n CountGreaterThanZeroError,\n NumKeysGreaterThanZeroError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisDatabase } from '../../state'\nimport { parseMoveDirection, parseTimeout } from './helpers'\n\ntype ListMultiPopArgs = {\n keys: Buffer[]\n side: 'left' | 'right'\n count: number\n}\n\ntype BlockingListMultiPopArgs = ListMultiPopArgs & {\n timeout: number\n}\n\nfunction parsePositiveListPopInteger(\n token: Buffer,\n createError: () => Error,\n): number {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw createError()\n }\n\n const value = Number(raw)\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw createError()\n }\n\n return value\n}\n\nfunction parseListPopNumKeys(token: Buffer): number {\n return parsePositiveListPopInteger(\n token,\n () => new NumKeysGreaterThanZeroError(),\n )\n}\n\nfunction parseListPopCount(token: Buffer): number {\n return parsePositiveListPopInteger(\n token,\n () => new CountGreaterThanZeroError(),\n )\n}\n\nfunction parseListMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: false },\n): ListMultiPopArgs\nfunction parseListMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: true },\n): BlockingListMultiPopArgs\nfunction parseListMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: boolean },\n): ListMultiPopArgs | BlockingListMultiPopArgs {\n if (index >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index\n let timeout: number | undefined\n\n if (options.blocking) {\n timeout = parseTimeout(input[cursor])\n cursor++\n }\n\n const numKeysToken = input[cursor]\n if (!numKeysToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const numKeys = parseListPopNumKeys(numKeysToken)\n cursor++\n\n const keysEnd = cursor + numKeys\n if (keysEnd >= input.length) {\n throw new RedisSyntaxError()\n }\n\n const keys = Array.from(input.slice(cursor, keysEnd))\n cursor = keysEnd\n\n const side = parseMoveDirection(input[cursor])\n cursor++\n\n let count = 1\n if (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (option !== 'COUNT' || cursor + 2 !== input.length) {\n throw new RedisSyntaxError()\n }\n\n count = parseListPopCount(input[cursor + 1])\n }\n\n if (options.blocking) {\n return { timeout: timeout!, keys, side, count }\n }\n\n return { keys, side, count }\n}\n\nexport function tryListMultiPop(\n keys: readonly Buffer[],\n side: 'left' | 'right',\n count: number,\n db: RedisDatabase,\n): RedisResult | null {\n for (const key of keys) {\n const list = db.getList(key)\n if (!list || list.values.length === 0) continue\n\n const result = db.updateList(key, list => {\n const values = list.popMany(side, count)\n return { values, empty: list.length === 0 }\n })\n if (result.empty) db.delete(key)\n\n return RedisResult.create(\n RedisValue.array([\n RedisValue.bulkString(key),\n RedisValue.array(\n result.values.map((value: Buffer) => RedisValue.bulkString(value)),\n ),\n ]),\n )\n }\n\n return null\n}\n\nasync function blockingListMultiPop(\n keys: readonly Buffer[],\n timeoutSecs: number,\n side: 'left' | 'right',\n count: number,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs =\n timeoutSecs === 0 ? undefined : Math.ceil(timeoutSecs * 1000)\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return RedisResult.create(RedisValue.nullArray())\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return RedisResult.create(RedisValue.nullArray())\n\n const result = tryListMultiPop(keys, side, count, ctx.db)\n if (result) return result\n }\n}\n\nexport const lmpopCommand = defineCommand({\n name: 'lmpop',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.custom<ListMultiPopArgs>((input, index, ctx) => ({\n value: parseListMultiPopArgs(input, index, ctx, { blocking: false }),\n nextIndex: input.length,\n })),\n flags: ['write'],\n keys: args => args.keys,\n execute: (args, ctx) =>\n tryListMultiPop(args.keys, args.side, args.count, ctx.db) ??\n RedisResult.create(RedisValue.nullArray()),\n})\n\nexport const blmpopCommand = defineCommand({\n name: 'blmpop',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.custom<BlockingListMultiPopArgs>((input, index, ctx) => ({\n value: parseListMultiPopArgs(input, index, ctx, { blocking: true }),\n nextIndex: input.length,\n })),\n flags: ['write', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const immediate = tryListMultiPop(args.keys, args.side, args.count, ctx.db)\n if (immediate) return immediate\n return blockingListMultiPop(\n args.keys,\n args.timeout,\n args.side,\n args.count,\n ctx,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisDatabase } from '../../state'\n\nexport function tryListPop(\n keys: readonly Buffer[],\n side: 'left' | 'right',\n db: RedisDatabase,\n): RedisResult | null {\n for (const key of keys) {\n const list = db.getList(key)\n if (!list || list.values.length === 0) continue\n\n const result = db.updateList(key, list => {\n const value = list.pop(side)\n return { value, empty: list.length === 0 }\n })\n if (result.empty) db.delete(key)\n return RedisResult.create(\n RedisValue.array([\n RedisValue.bulkString(key),\n RedisValue.bulkString(result.value),\n ]),\n )\n }\n return null\n}\n\nasync function blockingListPop(\n keys: readonly Buffer[],\n timeoutSecs: number,\n side: 'left' | 'right',\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs =\n timeoutSecs === 0 ? undefined : Math.ceil(timeoutSecs * 1000)\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return RedisResult.create(RedisValue.nullArray())\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return RedisResult.create(RedisValue.nullArray())\n\n const result = tryListPop(keys, side, ctx.db)\n if (result) return result\n }\n}\n\nexport const blpopCommand = defineCommand({\n name: 'blpop',\n schema: t.custom<{ keys: Buffer[]; timeout: number }>((input, index, ctx) => {\n if (input.length - index < 2)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n const timeout = Number(input[input.length - 1].toString())\n if (isNaN(timeout) || timeout < 0) throw new RedisSyntaxError()\n const keys = Array.from(input.slice(index, input.length - 1))\n return { value: { keys, timeout }, nextIndex: input.length }\n }),\n flags: ['write', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const immediate = tryListPop(args.keys, 'left', ctx.db)\n if (immediate) return immediate\n return blockingListPop(args.keys, args.timeout, 'left', ctx)\n },\n})\n\nexport const brpopCommand = defineCommand({\n name: 'brpop',\n schema: t.custom<{ keys: Buffer[]; timeout: number }>((input, index, ctx) => {\n if (input.length - index < 2)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n const timeout = Number(input[input.length - 1].toString())\n if (isNaN(timeout) || timeout < 0) throw new RedisSyntaxError()\n const keys = Array.from(input.slice(index, input.length - 1))\n return { value: { keys, timeout }, nextIndex: input.length }\n }),\n flags: ['write', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const immediate = tryListPop(args.keys, 'right', ctx.db)\n if (immediate) return immediate\n return blockingListPop(args.keys, args.timeout, 'right', ctx)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { IndexOutOfRangeError, NoSuchKeyError } from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, bulk, integer, ok } from '../helpers'\nimport { resolveIndex } from './helpers'\n\nexport const llenCommand = defineCommand({\n name: 'llen',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n return integer(list ? list.values.length : 0)\n },\n})\n\nexport const lrangeCommand = defineCommand({\n name: 'lrange',\n schema: t.object({\n key: t.key(),\n start: t.integer(),\n stop: t.integer(),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list || list.values.length === 0) return array([])\n\n let start = resolveIndex(args.start, list.values.length)\n let stop = resolveIndex(args.stop, list.values.length)\n start = Math.max(0, start)\n stop = Math.min(list.values.length - 1, stop)\n if (start > stop) return array([])\n\n const slice = list.values.slice(start, stop + 1)\n return array(slice.map(v => RedisValue.bulkString(v)))\n },\n})\n\nexport const lindexCommand = defineCommand({\n name: 'lindex',\n schema: t.object({\n key: t.key(),\n index: t.integer(),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return bulk(null)\n\n const idx = resolveIndex(args.index, list.values.length)\n if (idx < 0 || idx >= list.values.length) return bulk(null)\n return bulk(list.values[idx])\n },\n})\n\nexport const lsetCommand = defineCommand({\n name: 'lset',\n schema: t.object({\n key: t.key(),\n index: t.integer(),\n value: t.key(),\n }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) throw new NoSuchKeyError()\n\n const idx = resolveIndex(args.index, list.values.length)\n if (idx < 0 || idx >= list.values.length) throw new IndexOutOfRangeError()\n\n ctx.db.updateList(args.key, list => {\n list.setAt(idx, args.value)\n })\n return ok()\n },\n})\n\nexport const lremCommand = defineCommand({\n name: 'lrem',\n schema: t.object({\n key: t.key(),\n count: t.integer(),\n element: t.key(),\n }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return integer(0)\n\n const result = ctx.db.updateList(args.key, list => {\n const removed = list.removeMatching(args.count, args.element)\n return { removed, empty: list.length === 0 }\n })\n if (result.empty) ctx.db.delete(args.key)\n return integer(result.removed)\n },\n})\n\nexport const ltrimCommand = defineCommand({\n name: 'ltrim',\n schema: t.object({\n key: t.key(),\n start: t.integer(),\n stop: t.integer(),\n }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return ok()\n\n const result = ctx.db.updateList(args.key, list => {\n let start = resolveIndex(args.start, list.length)\n let stop = resolveIndex(args.stop, list.length)\n start = Math.max(0, start)\n stop = Math.min(list.length - 1, stop)\n return list.trim(start, stop, { forceDirty: true })\n })\n if (result.empty) ctx.db.delete(args.key)\n return ok()\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { integer } from '../helpers'\n\nfunction insertPosition(): ReturnType<typeof t.custom<'before' | 'after'>> {\n return t.custom<'before' | 'after'>((input, index, ctx) => {\n const token = input[index]\n if (!token) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const position = token.toString().toUpperCase()\n if (position !== 'BEFORE' && position !== 'AFTER') {\n throw new RedisSyntaxError()\n }\n\n return {\n value: position === 'BEFORE' ? 'before' : 'after',\n nextIndex: index + 1,\n }\n })\n}\n\nexport const linsertCommand = defineCommand({\n name: 'linsert',\n schema: t.object({\n key: t.key(),\n position: insertPosition(),\n pivot: t.key(),\n element: t.key(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return integer(0)\n\n const length = ctx.db.updateList(args.key, list =>\n list.insertRelativeTo(args.pivot, args.element, args.position),\n )\n return integer(length)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n LposCountNegativeError,\n LposMaxlenNegativeError,\n LposRankZeroError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, bulk, integer, parseIntegerToken } from '../helpers'\n\ntype LposArgs = {\n key: Buffer\n element: Buffer\n rank: number\n count?: number\n maxlen: number\n}\n\nexport const lposCommand = defineCommand({\n name: 'lpos',\n schema: t.custom<LposArgs>((input, index, ctx) => {\n const key = input[index]\n const element = input[index + 1]\n if (!key || !element) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let rank = 1\n let count: number | undefined\n let maxlen = 0\n let cursor = index + 2\n\n while (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n const valueToken = input[cursor + 1]\n if (!valueToken) {\n throw new RedisSyntaxError()\n }\n\n if (option === 'RANK') {\n rank = parseIntegerToken(valueToken)\n if (rank === 0) throw new LposRankZeroError()\n } else if (option === 'COUNT') {\n count = parseIntegerToken(valueToken)\n if (count < 0) throw new LposCountNegativeError()\n } else if (option === 'MAXLEN') {\n maxlen = parseIntegerToken(valueToken)\n if (maxlen < 0) throw new LposMaxlenNegativeError()\n } else {\n throw new RedisSyntaxError()\n }\n\n cursor += 2\n }\n\n return { value: { key, element, rank, count, maxlen }, nextIndex: cursor }\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const hasCount = args.count !== undefined\n const list = ctx.db.getList(args.key)\n if (!list || list.values.length === 0) {\n return hasCount ? array([]) : bulk(null)\n }\n\n const target = args.element.toString('binary')\n const forward = args.rank > 0\n const step = forward ? 1 : -1\n const len = list.values.length\n // count===0 means \"return all matches\"; absent means \"return first only\"\n const limit = hasCount ? (args.count === 0 ? Infinity : args.count!) : 1\n\n const results: number[] = []\n let toSkip = Math.abs(args.rank) - 1\n let comparisons = 0\n\n for (let i = forward ? 0 : len - 1; i >= 0 && i < len; i += step) {\n if (args.maxlen !== 0 && comparisons >= args.maxlen) break\n comparisons++\n if (list.values[i].toString('binary') !== target) continue\n\n if (toSkip > 0) {\n toSkip--\n continue\n }\n results.push(i)\n if (results.length >= limit) break\n }\n\n if (!hasCount) {\n return results.length === 0 ? bulk(null) : integer(results[0])\n }\n return array(results.map(idx => RedisValue.integer(idx)))\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { popList } from './helpers'\n\nexport const lpopCommand = defineCommand({\n name: 'lpop',\n schema: t.object({\n key: t.key(),\n count: t.optional(t.integer()),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => popList(args, ctx, 'left'),\n})\n\nexport const rpopCommand = defineCommand({\n name: 'rpop',\n schema: t.object({\n key: t.key(),\n count: t.optional(t.integer()),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => popList(args, ctx, 'right'),\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\n\nexport const lpushCommand = defineCommand({\n name: 'lpush',\n schema: t.object({\n key: t.key(),\n values: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const len = ctx.db.updateList(args.key, list => list.pushLeft(args.values))\n return integer(len)\n },\n})\n\nexport const rpushCommand = defineCommand({\n name: 'rpush',\n schema: t.object({\n key: t.key(),\n values: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const len = ctx.db.updateList(args.key, list => list.pushRight(args.values))\n return integer(len)\n },\n})\n\nexport const lpushxCommand = defineCommand({\n name: 'lpushx',\n schema: t.object({\n key: t.key(),\n values: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return integer(0)\n\n const len = ctx.db.updateList(args.key, list => list.pushLeft(args.values))\n return integer(len)\n },\n})\n\nexport const rpushxCommand = defineCommand({\n name: 'rpushx',\n schema: t.object({\n key: t.key(),\n values: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const list = ctx.db.getList(args.key)\n if (!list) return integer(0)\n\n const len = ctx.db.updateList(args.key, list => list.pushRight(args.values))\n return integer(len)\n },\n})\n","import { blmoveCommand } from './blmove'\nimport { blmpopCommand, lmpopCommand } from './lmpop'\nimport { blpopCommand, brpopCommand } from './blpop'\nimport {\n lindexCommand,\n llenCommand,\n lrangeCommand,\n lremCommand,\n lsetCommand,\n ltrimCommand,\n} from './access'\nimport { linsertCommand } from './insert'\nimport { lposCommand } from './lpos'\nimport { lpopCommand, rpopCommand } from './pop'\nimport {\n lpushCommand,\n lpushxCommand,\n rpushCommand,\n rpushxCommand,\n} from './push'\nimport { lmoveCommand, rpoplpushCommand } from './move'\n\nexport const listsCommands = [\n lpushCommand,\n rpushCommand,\n lpopCommand,\n rpopCommand,\n llenCommand,\n lrangeCommand,\n lindexCommand,\n linsertCommand,\n lsetCommand,\n lremCommand,\n ltrimCommand,\n lpushxCommand,\n rpushxCommand,\n rpoplpushCommand,\n lposCommand,\n lmoveCommand,\n lmpopCommand,\n blmoveCommand,\n blmpopCommand,\n blpopCommand,\n brpopCommand,\n]\n\nexport {\n blmoveCommand,\n blmpopCommand,\n blpopCommand,\n brpopCommand,\n lindexCommand,\n linsertCommand,\n llenCommand,\n lmoveCommand,\n lmpopCommand,\n lpopCommand,\n lposCommand,\n lpushCommand,\n lpushxCommand,\n lrangeCommand,\n lremCommand,\n lsetCommand,\n ltrimCommand,\n rpopCommand,\n rpoplpushCommand,\n rpushCommand,\n rpushxCommand,\n}\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport type { ResponseStream } from '../core/response-stream'\nimport type { RedisMonitorCommandEvent, Unsubscribe } from '../state'\nimport { commandDocs } from './introspection'\n\nexport const monitorCommand = defineCommand({\n name: 'monitor',\n schema: t.object({}),\n flags: ['admin', 'noscript'],\n monitor: {\n skip: true,\n },\n introspection: {\n arity: 1,\n flags: ['admin', 'noscript', 'loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous'],\n keySpecs: [],\n docs: commandDocs(\n 'Listen for all requests received by the server in real time',\n 'server',\n [],\n { since: '1.0.0', complexity: 'O(N)' },\n ),\n },\n keys: () => [],\n execute: (_args, ctx) => createMonitorStream(ctx),\n})\n\nexport const monitorCommands = [monitorCommand]\n\nfunction createMonitorStream(ctx: RedisExecutionContext): ResponseStream {\n const frames: RedisResult[] = [RedisResult.ok()]\n const waiters = new Set<() => void>()\n let closed = false\n let unsubscribe: Unsubscribe | undefined\n let unregisterResponseStreamCleanup: Unsubscribe | undefined\n let resolveClosed!: () => void\n const closedPromise = new Promise<void>(resolve => {\n resolveClosed = resolve\n })\n\n const wakeWaiters = () => {\n for (const waiter of Array.from(waiters)) {\n waiter()\n }\n }\n\n const close = () => {\n if (closed) {\n return\n }\n\n closed = true\n unregisterResponseStreamCleanup?.()\n unregisterResponseStreamCleanup = undefined\n unsubscribe?.()\n unsubscribe = undefined\n wakeWaiters()\n resolveClosed()\n }\n\n unsubscribe = ctx.server.monitorFeed.subscribe(event => {\n if (event.clientId === ctx.session.id) {\n return\n }\n\n frames.push(\n RedisResult.create(\n RedisValue.simpleString(formatMonitorCommandEvent(event)),\n ),\n )\n wakeWaiters()\n })\n unregisterResponseStreamCleanup =\n ctx.session.registerResponseStreamCleanup(close)\n\n return {\n kind: 'response-stream',\n closed: closedPromise,\n frames: async function* (signal: AbortSignal) {\n const onAbort = () => close()\n signal.addEventListener('abort', onAbort, { once: true })\n ctx.signal.addEventListener('abort', onAbort, { once: true })\n\n try {\n while (!closed && !signal.aborted && !ctx.signal.aborted) {\n const frame = frames.shift()\n if (frame) {\n yield frame\n continue\n }\n\n await waitForFrame(signal, ctx.signal, waiters)\n }\n } finally {\n signal.removeEventListener('abort', onAbort)\n ctx.signal.removeEventListener('abort', onAbort)\n close()\n }\n },\n close,\n }\n}\n\nfunction formatMonitorCommandEvent(event: RedisMonitorCommandEvent): string {\n const timestamp = (event.timestampMs / 1000).toFixed(6)\n const source = event.clientAddress ?? event.clientId\n const argv = [event.command, ...event.args]\n .map(formatMonitorArgument)\n .join(' ')\n\n return `${timestamp} [${event.database} ${source}] ${argv}`\n}\n\nfunction formatMonitorArgument(value: Buffer): string {\n let result = '\"'\n\n for (const byte of value) {\n if (byte === DOUBLE_QUOTE || byte === BACKSLASH) {\n result += `\\\\${String.fromCharCode(byte)}`\n continue\n }\n\n if (byte === CARRIAGE_RETURN) {\n result += '\\\\r'\n continue\n }\n\n if (byte === LINE_FEED) {\n result += '\\\\n'\n continue\n }\n\n if (byte === TAB) {\n result += '\\\\t'\n continue\n }\n\n if (byte === BELL) {\n result += '\\\\a'\n continue\n }\n\n if (byte === BACKSPACE) {\n result += '\\\\b'\n continue\n }\n\n if (byte >= 0x20 && byte <= 0x7e) {\n result += String.fromCharCode(byte)\n continue\n }\n\n result += `\\\\x${byte.toString(16).padStart(2, '0')}`\n }\n\n return `${result}\"`\n}\n\nfunction waitForFrame(\n signal: AbortSignal,\n sessionSignal: AbortSignal,\n waiters: Set<() => void>,\n): Promise<void> {\n if (signal.aborted || sessionSignal.aborted) {\n return Promise.resolve()\n }\n\n return new Promise(resolve => {\n const cleanup = () => {\n waiters.delete(waiter)\n signal.removeEventListener('abort', waiter)\n sessionSignal.removeEventListener('abort', waiter)\n }\n const waiter = () => {\n cleanup()\n resolve()\n }\n\n waiters.add(waiter)\n signal.addEventListener('abort', waiter, { once: true })\n sessionSignal.addEventListener('abort', waiter, { once: true })\n })\n}\n\nconst BACKSPACE = '\\b'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst BELL = '\\u0007'.charCodeAt(0)\nconst CARRIAGE_RETURN = '\\r'.charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst LINE_FEED = '\\n'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport {\n RedisCommandError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport type { ResponseStream } from '../core/response-stream'\nimport { array, integer } from './helpers'\nimport { commandSubcommandInfo } from './introspection'\n\ntype PubSubArgs = {\n subcommand: string\n args: Buffer[]\n}\n\nexport const subscribeCommand = defineCommand({\n name: 'subscribe',\n schema: t.object({\n channels: t.variadic(t.bulk(), { min: 1 }),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -2,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@slow'],\n },\n keys: () => [],\n execute: (args, ctx) =>\n framesResult(ctx.session.subscribePubSubChannels(args.channels)),\n})\n\nexport const unsubscribeCommand = defineCommand({\n name: 'unsubscribe',\n schema: t.object({\n channels: t.variadic(t.bulk()),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -1,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@slow'],\n },\n keys: () => [],\n execute: (args, ctx) =>\n framesResult(ctx.session.unsubscribePubSubChannels(args.channels)),\n})\n\nexport const ssubscribeCommand = defineCommand({\n name: 'ssubscribe',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n channels: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -2,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 1,\n lastKey: -1,\n keyStep: 1,\n categories: ['@pubsub', '@slow'],\n },\n keys: args => args.channels,\n execute: (args, ctx) =>\n framesResult(ctx.session.subscribePubSubShardChannels(args.channels)),\n})\n\nexport const sunsubscribeCommand = defineCommand({\n name: 'sunsubscribe',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n channels: t.variadic(t.key()),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -1,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 1,\n lastKey: -1,\n keyStep: 1,\n categories: ['@pubsub', '@slow'],\n },\n keys: args => args.channels,\n execute: (args, ctx) =>\n framesResult(ctx.session.unsubscribePubSubShardChannels(args.channels)),\n})\n\nexport const psubscribeCommand = defineCommand({\n name: 'psubscribe',\n schema: t.object({\n patterns: t.variadic(t.bulk(), { min: 1 }),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -2,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@slow'],\n },\n keys: () => [],\n execute: (args, ctx) =>\n framesResult(ctx.session.subscribePubSubPatterns(args.patterns)),\n})\n\nexport const punsubscribeCommand = defineCommand({\n name: 'punsubscribe',\n schema: t.object({\n patterns: t.variadic(t.bulk()),\n }),\n flags: ['pubsub', 'noscript', 'subscribed'],\n introspection: {\n arity: -1,\n flags: ['pubsub', 'noscript', 'loading', 'stale'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@slow'],\n },\n keys: () => [],\n execute: (args, ctx) =>\n framesResult(ctx.session.unsubscribePubSubPatterns(args.patterns)),\n})\n\nexport const publishCommand = defineCommand({\n name: 'publish',\n schema: t.object({\n channel: t.bulk(),\n message: t.bulk(),\n }),\n flags: ['pubsub', 'fast'],\n introspection: {\n arity: 3,\n flags: ['pubsub', 'loading', 'stale', 'fast'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@fast'],\n },\n keys: () => [],\n execute: (args, ctx) => {\n if (\n ctx.session.mode !== 'subscribed' ||\n ctx.session.protocolVersion !== 3 ||\n !ctx.server.profile.has('pubsub.resp3-publish-reply-first')\n ) {\n return integer(\n ctx.server.pubsubBroker.publish(args.channel, args.message),\n )\n }\n\n const flushPushes = ctx.session.deferPushesUntilAfterReply()\n const delivered = ctx.server.pubsubBroker.publish(\n args.channel,\n args.message,\n )\n return RedisResult.create(RedisValue.integer(delivered), {\n afterReply: flushPushes,\n })\n },\n})\n\nexport const spublishCommand = defineCommand({\n name: 'spublish',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n channel: t.key(),\n message: t.bulk(),\n }),\n flags: ['pubsub', 'fast'],\n introspection: {\n arity: 3,\n flags: ['pubsub', 'loading', 'stale', 'fast'],\n firstKey: 1,\n lastKey: 1,\n keyStep: 1,\n categories: ['@pubsub', '@fast'],\n },\n keys: args => [args.channel],\n execute: (args, ctx) =>\n integer(ctx.server.pubsubBroker.spublish(args.channel, args.message)),\n})\n\nexport const pubsubCommand = defineCommand({\n name: 'pubsub',\n schema: t.object({\n subcommand: t.string(),\n args: t.variadic(t.bulk()),\n }),\n flags: ['readonly', 'pubsub', 'fast'],\n introspection: {\n arity: -2,\n flags: ['pubsub', 'loading', 'stale', 'fast'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@pubsub', '@slow'],\n subcommands: [\n commandSubcommandInfo('pubsub|channels', -2, {\n categories: ['@pubsub', '@slow'],\n }),\n commandSubcommandInfo('pubsub|numsub', -2, {\n categories: ['@pubsub', '@slow'],\n }),\n commandSubcommandInfo('pubsub|numpat', 2, {\n categories: ['@pubsub', '@slow'],\n }),\n commandSubcommandInfo('pubsub|shardchannels', -2, {\n categories: ['@pubsub', '@slow'],\n }),\n commandSubcommandInfo('pubsub|shardnumsub', -2, {\n categories: ['@pubsub', '@slow'],\n }),\n commandSubcommandInfo('pubsub|help', 2, {\n categories: ['@pubsub', '@slow'],\n }),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const subcommand = args.subcommand.toLowerCase()\n\n if (subcommand === 'channels') {\n return pubsubChannels(args, ctx)\n }\n\n if (subcommand === 'numsub') {\n return pubsubNumsub(args, ctx)\n }\n\n if (subcommand === 'numpat') {\n expectArgCount('pubsub|numpat', args.args, 0)\n return integer(ctx.server.pubsubBroker.patternSubscriptionCount())\n }\n\n if (subcommand === 'shardchannels') {\n if (!ctx.server.profile.has('pubsub.sharded')) {\n throw pubsubUnavailableSubcommandError(args.subcommand)\n }\n expectPubSubSubcommandMaxArgCount(args.subcommand, args.args, 1)\n const channels = ctx.server.pubsubBroker.shardChannelsMatching(\n args.args[0],\n )\n return array(channels.map(channel => RedisValue.bulkString(channel)))\n }\n\n if (subcommand === 'shardnumsub') {\n if (!ctx.server.profile.has('pubsub.sharded')) {\n throw pubsubUnavailableSubcommandError(args.subcommand)\n }\n return RedisResult.create(\n RedisValue.array(\n args.args.flatMap(channel => [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(\n ctx.server.pubsubBroker.shardSubscriberCount(channel),\n ),\n ]),\n ),\n )\n }\n\n if (subcommand === 'help') {\n expectArgCount('pubsub|help', args.args, 0)\n return pubsubHelp(ctx)\n }\n\n throw new RedisCommandError(\n `unknown subcommand '${args.subcommand}'. Try PUBSUB HELP.`,\n )\n },\n})\n\nexport const pubsubCommands = [\n subscribeCommand,\n unsubscribeCommand,\n ssubscribeCommand,\n sunsubscribeCommand,\n psubscribeCommand,\n punsubscribeCommand,\n publishCommand,\n spublishCommand,\n pubsubCommand,\n]\n\nfunction pubsubChannels(args: PubSubArgs, ctx: RedisExecutionContext) {\n expectPubSubSubcommandMaxArgCount(args.subcommand, args.args, 1)\n const channels = ctx.server.pubsubBroker.channelsMatching(args.args[0])\n return RedisResult.create(\n RedisValue.array(channels.map(channel => RedisValue.bulkString(channel))),\n )\n}\n\nfunction pubsubNumsub(args: PubSubArgs, ctx: RedisExecutionContext) {\n return RedisResult.create(\n RedisValue.array(\n args.args.flatMap(channel => [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(ctx.server.pubsubBroker.subscriberCount(channel)),\n ]),\n ),\n )\n}\n\nfunction pubsubHelp(ctx: RedisExecutionContext): RedisResult {\n const lines = [\n 'PUBSUB <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n 'CHANNELS [<pattern>]',\n ' Return the currently active channels matching a pattern.',\n 'NUMSUB [<channel> ...]',\n ' Return the number of subscribers for the specified channels.',\n 'NUMPAT',\n ' Return the number of pattern subscriptions.',\n ]\n\n if (ctx.server.profile.has('pubsub.sharded')) {\n lines.push(\n 'SHARDCHANNELS [<pattern>]',\n ' Return active shard channels matching a pattern.',\n 'SHARDNUMSUB [<channel> ...]',\n ' Return the number of shard subscribers for the specified channels.',\n )\n }\n\n lines.push('HELP', ' Prints this help.')\n\n return RedisResult.create(\n RedisValue.array(\n lines.map(line => RedisValue.bulkString(Buffer.from(line))),\n ),\n )\n}\n\nfunction framesResult(frames: RedisResult[]): RedisResult | ResponseStream {\n if (frames.length === 1) {\n return frames[0]\n }\n\n return {\n kind: 'response-stream',\n closed: Promise.resolve(),\n frames: async function* () {\n for (const frame of frames) {\n yield frame\n }\n },\n close: () => {},\n }\n}\n\nfunction expectArgCount(\n commandName: string,\n args: readonly Buffer[],\n count: number,\n): void {\n if (args.length !== count) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n}\n\nfunction expectPubSubSubcommandMaxArgCount(\n subcommand: string,\n args: readonly Buffer[],\n count: number,\n): void {\n if (args.length > count) {\n throw pubsubSubcommandError(subcommand)\n }\n}\n\nfunction pubsubSubcommandError(subcommand: string): RedisCommandError {\n return new RedisCommandError(\n `unknown subcommand or wrong number of arguments for '${subcommand}'. Try PUBSUB HELP.`,\n )\n}\n\nfunction pubsubUnavailableSubcommandError(\n subcommand: string,\n): RedisCommandError {\n return new RedisCommandError(\n `Unknown subcommand or wrong number of arguments for '${subcommand}'. Try PUBSUB HELP.`,\n )\n}\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport {\n ExpectedIntegerError,\n RedisCommandError,\n RedisSyntaxError,\n} from '../core/redis-error'\nimport { redisGlobMatch } from '../core/glob'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport type { RedisDataTypeName } from '../state'\nimport { array, scoreBuffer } from './helpers'\n\ntype ScanOptions = {\n cursor: bigint\n match?: Buffer\n count?: number\n type?: string\n noValues?: boolean\n}\n\ntype KeyedScanOptions = {\n key: Buffer\n cursor: bigint\n match?: Buffer\n count?: number\n noValues?: boolean\n}\n\ntype ScanResultOptions = {\n cursor: bigint\n match?: Buffer\n count?: number\n type?: string\n}\n\ntype ScanItem = {\n matchValue: Buffer\n values: RedisValue[]\n type?: RedisDataTypeName\n}\n\nexport const keysCommand = defineCommand({\n name: 'keys',\n schema: t.object({\n pattern: t.bulk(),\n }),\n flags: ['readonly'],\n keys: () => [],\n execute: (args, ctx) =>\n array(\n ctx.db\n .entriesSnapshot()\n .filter(entry => matchesPattern(entry.key, args.pattern))\n .map(entry => RedisValue.bulkString(entry.key)),\n ),\n})\n\nexport const scanCommand = defineCommand({\n name: 'scan',\n schema: createScanOptionsSchema(true),\n flags: ['readonly', 'random'],\n keys: () => [],\n execute: (args, ctx) => {\n const items = ctx.db.entriesSnapshot().map(entry => ({\n matchValue: entry.key,\n values: [RedisValue.bulkString(entry.key)],\n type: entry.value.type,\n }))\n\n return scanResult(items, args)\n },\n})\n\nexport const hscanCommand = defineCommand({\n name: 'hscan',\n schema: createKeyedScanOptionsSchema(),\n flags: ['readonly', 'random'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.noValues && !ctx.server.profile.has('hscan.novalues')) {\n throw new RedisSyntaxError()\n }\n\n const hash = ctx.db.getHash(args.key)\n if (!hash) {\n return scanResult([], args)\n }\n\n const entries = ctx.db.updateHash(args.key, hash =>\n Array.from(hash.entries()),\n )\n const items: ScanItem[] = entries.map(({ field, value }) => ({\n matchValue: field,\n values: args.noValues\n ? [RedisValue.bulkString(field)]\n : [RedisValue.bulkString(field), RedisValue.bulkString(value)],\n }))\n\n return scanResult(items, args)\n },\n})\n\nexport const sscanCommand = defineCommand({\n name: 'sscan',\n schema: createKeyedScanOptionsSchema(),\n flags: ['readonly', 'random'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n if (!set) {\n return scanResult([], args)\n }\n\n const items: ScanItem[] = []\n for (const member of set.members.values()) {\n items.push({\n matchValue: member,\n values: [RedisValue.bulkString(member)],\n })\n }\n\n return scanResult(items, args)\n },\n})\n\nexport const zscanCommand = defineCommand({\n name: 'zscan',\n schema: createKeyedScanOptionsSchema(),\n flags: ['readonly', 'random'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) {\n return scanResult([], args)\n }\n\n const items: ScanItem[] = []\n for (const entry of zset.members.values()) {\n items.push({\n matchValue: entry.member,\n values: [\n RedisValue.bulkString(entry.member),\n RedisValue.bulkString(scoreBuffer(entry.score)),\n ],\n })\n }\n\n return scanResult(items, args)\n },\n})\n\nexport const scanCommands = [\n keysCommand,\n scanCommand,\n hscanCommand,\n sscanCommand,\n zscanCommand,\n]\n\nfunction createScanOptionsSchema(allowType: boolean) {\n return t.custom<ScanOptions>((input, index, ctx) => {\n const cursor = parseCursor(readRequired(input, index, ctx.commandName))\n const options = parseScanOptions(\n input,\n index + 1,\n ctx.commandName,\n allowType,\n )\n\n return {\n value: { cursor, ...options },\n nextIndex: input.length,\n }\n })\n}\n\nfunction createKeyedScanOptionsSchema() {\n return t.custom<KeyedScanOptions>((input, index, ctx) => {\n const key = readRequired(input, index, ctx.commandName)\n const cursor = parseCursor(readRequired(input, index + 1, ctx.commandName))\n const options = parseScanOptions(\n input,\n index + 2,\n ctx.commandName,\n false,\n ctx.commandName === 'hscan',\n )\n\n return {\n value: { key, cursor, ...options },\n nextIndex: input.length,\n }\n })\n}\n\nfunction parseScanOptions(\n input: readonly Buffer[],\n index: number,\n commandName: string,\n allowType: boolean,\n allowNoValues = false,\n): Omit<ScanOptions, 'cursor'> {\n const options: Omit<ScanOptions, 'cursor'> = {}\n let cursor = index\n\n while (cursor < input.length) {\n const option = input[cursor].toString().toLowerCase()\n\n if (option === 'match') {\n options.match = readOptionValue(input, cursor, commandName)\n cursor += 2\n continue\n }\n\n if (option === 'count') {\n options.count = parseCount(readOptionValue(input, cursor, commandName))\n cursor += 2\n continue\n }\n\n if (option === 'type' && allowType) {\n options.type = readOptionValue(input, cursor, commandName)\n .toString()\n .toLowerCase()\n cursor += 2\n continue\n }\n\n if (option === 'novalues') {\n if (!allowNoValues) {\n throw new RedisCommandError('NOVALUES option can only be used in HSCAN')\n }\n options.noValues = true\n cursor++\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return options\n}\n\nfunction readRequired(\n input: readonly Buffer[],\n index: number,\n commandName: string,\n): Buffer {\n const value = input[index]\n if (!value) {\n throw new RedisCommandError(\n `wrong number of arguments for '${commandName}' command`,\n )\n }\n\n return value\n}\n\nfunction readOptionValue(\n input: readonly Buffer[],\n optionIndex: number,\n commandName: string,\n): Buffer {\n return readRequired(input, optionIndex + 1, commandName)\n}\n\nfunction parseCursor(raw: Buffer): bigint {\n const value = raw.toString()\n // Redis parses the cursor as an unsigned 64-bit integer (strict_strtoull):\n // a leading sign or a value past UINT64_MAX is rejected as `invalid cursor`.\n if (!/^\\d+$/.test(value)) {\n throw new RedisCommandError('invalid cursor')\n }\n\n const parsed = BigInt(value)\n if (parsed > 0xffffffffffffffffn) {\n throw new RedisCommandError('invalid cursor')\n }\n\n return parsed\n}\n\nfunction parseCount(raw: Buffer): number {\n const value = raw.toString()\n if (!/^-?\\d+$/.test(value)) {\n throw new ExpectedIntegerError()\n }\n\n const parsed = Number(value)\n if (!Number.isSafeInteger(parsed)) {\n throw new ExpectedIntegerError()\n }\n\n if (parsed <= 0) {\n throw new RedisSyntaxError()\n }\n\n return parsed\n}\n\nfunction matchesPattern(value: Buffer, pattern?: Buffer): boolean {\n if (pattern === undefined) {\n return true\n }\n\n return redisGlobMatch(pattern, value)\n}\n\nfunction scanResult(\n items: ScanItem[],\n options: ScanResultOptions,\n): RedisResult {\n const itemCount = items.length\n const startItem = normalizeScanCursor(options.cursor, itemCount)\n const pageSize = options.count ?? DEFAULT_SCAN_COUNT\n const endItem = Math.min(itemCount, startItem + pageSize)\n const nextCursor = endItem >= itemCount ? 0 : endItem\n const page = items\n .slice(startItem, endItem)\n .filter(item => matchesScanItem(item, options))\n .flatMap(item => item.values)\n\n return RedisResult.create(\n RedisValue.array([\n RedisValue.bulkString(Buffer.from(nextCursor.toString())),\n RedisValue.array(page),\n ]),\n )\n}\n\nfunction matchesScanItem(item: ScanItem, options: ScanResultOptions): boolean {\n if (!matchesPattern(item.matchValue, options.match)) {\n return false\n }\n\n if (options.type !== undefined && item.type !== options.type) {\n return false\n }\n\n return true\n}\n\nfunction normalizeScanCursor(cursor: bigint, itemCount: number): number {\n if (cursor <= 0n) {\n return 0\n }\n\n if (cursor > BigInt(Number.MAX_SAFE_INTEGER)) {\n return itemCount\n }\n\n return Math.min(Number(cursor), itemCount)\n}\n\nconst DEFAULT_SCAN_COUNT = 10\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport {\n NoScriptError,\n RedisCommandError,\n ScriptDebugModeError,\n ScriptFlushOptionError,\n UnknownScriptSubcommandError,\n WrongNumberOfKeysError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { luaReplyToRedisValue, renderScriptError } from '../core/lua-runtime'\nimport type { RedisExecutionContext } from '../core/redis-context'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport {\n parseFunctionLibrary,\n type RedisFunctionDefinition,\n type RedisFunctionLibrary,\n} from '../state'\nimport { array, bulk, ok } from './helpers'\nimport { commandSubcommandInfo } from './introspection'\n\ntype ScriptArgs = {\n subcommand: string\n rest: Buffer[]\n}\n\ntype EvalArgs = {\n script: Buffer\n numKeys: number\n rest: Buffer[]\n}\n\ntype EvalShaArgs = {\n sha: string\n numKeys: number\n rest: Buffer[]\n}\n\ntype FunctionArgs = {\n subcommand: string\n rest: Buffer[]\n}\n\ntype FcallArgs = {\n functionName: string\n numKeys: number\n rest: Buffer[]\n}\n\nconst DYNAMIC_SCRIPT_FLAGS = [\n 'noscript',\n 'stale',\n 'skip_monitor',\n 'no_mandatory_keys',\n 'movablekeys',\n]\nconst READONLY_DYNAMIC_SCRIPT_FLAGS = ['readonly', ...DYNAMIC_SCRIPT_FLAGS]\n\nexport const scriptCommand = defineCommand({\n name: 'script',\n schema: t.object({\n subcommand: t.string(),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['admin', 'noscript'],\n introspection: {\n arity: -2,\n flags: ['admin', 'noscript'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('script|debug', 3, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('script|exists', -3, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('script|flush', -2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('script|help', 2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('script|kill', 2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('script|load', 3, {\n categories: ['@slow', '@scripting'],\n }),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n switch (args.subcommand.toLowerCase()) {\n case 'load':\n return scriptLoad(args, ctx)\n case 'exists':\n return scriptExists(args, ctx)\n case 'flush':\n return scriptFlush(args, ctx)\n case 'kill':\n return scriptKill(args)\n case 'debug':\n return scriptDebug(args, ctx)\n case 'help':\n return scriptHelp(args)\n default:\n throw new UnknownScriptSubcommandError(args.subcommand)\n }\n },\n})\n\nexport const evalCommand = defineCommand<EvalArgs>({\n name: 'eval',\n schema: t.object({\n script: t.bulk(),\n numKeys: t.integer({ min: 0 }),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['write', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: evalKeys,\n execute: async (args, ctx) => {\n const { keys, argv } = splitEvalArgs(args)\n // Cache the script so a later EVALSHA can find it by digest.\n ctx.server.scriptCache.load(args.script)\n return runLuaScript(args.script, keys, argv, ctx)\n },\n})\n\nexport const evalshaCommand = defineCommand<EvalShaArgs>({\n name: 'evalsha',\n schema: t.object({\n sha: t.string(),\n numKeys: t.integer({ min: 0 }),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['write', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: evalKeys,\n execute: async (args, ctx) => {\n const script = ctx.server.scriptCache.get(args.sha)\n if (!script) {\n throw new NoScriptError()\n }\n\n const { keys, argv } = splitEvalArgs(args)\n return runLuaScript(script, keys, argv, ctx)\n },\n})\n\nexport const evalRoCommand = defineCommand<EvalArgs>({\n name: 'eval_ro',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: evalCommand.schema,\n flags: ['readonly', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: READONLY_DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: evalKeys,\n execute: async (args, ctx) => {\n const { keys, argv } = splitEvalArgs(args)\n ctx.server.scriptCache.load(args.script)\n return runLuaScript(args.script, keys, argv, ctx, true)\n },\n})\n\nexport const evalshaRoCommand = defineCommand<EvalShaArgs>({\n name: 'evalsha_ro',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: evalshaCommand.schema,\n flags: ['readonly', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: READONLY_DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: evalKeys,\n execute: async (args, ctx) => {\n const script = ctx.server.scriptCache.get(args.sha)\n if (!script) {\n throw new NoScriptError()\n }\n\n const { keys, argv } = splitEvalArgs(args)\n return runLuaScript(script, keys, argv, ctx, true)\n },\n})\n\nexport const functionCommand = defineCommand<FunctionArgs>({\n name: 'function',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n subcommand: t.string(),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['admin', 'noscript'],\n introspection: {\n arity: -2,\n flags: [],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n subcommands: [\n commandSubcommandInfo('function|load', -3, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|delete', 3, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|list', -2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|stats', 2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|dump', 2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|restore', -3, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|flush', -2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|kill', 2, {\n categories: ['@slow', '@scripting'],\n }),\n commandSubcommandInfo('function|help', 2, {\n categories: ['@slow', '@scripting'],\n }),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n switch (args.subcommand.toLowerCase()) {\n case 'load':\n return functionLoad(args, ctx)\n case 'delete':\n return functionDelete(args, ctx)\n case 'list':\n return functionList(args, ctx)\n case 'stats':\n return functionStats(args, ctx)\n case 'dump':\n return bulk(ctx.server.functionRegistry.dump())\n case 'restore':\n return functionRestore(args, ctx)\n case 'flush':\n return functionFlush(args, ctx)\n case 'kill':\n return functionKill(args)\n case 'help':\n return functionHelp(args)\n default:\n throw new RedisCommandError(\n `unknown subcommand '${args.subcommand}'. Try FUNCTION HELP.`,\n )\n }\n },\n})\n\nexport const fcallCommand = defineCommand<FcallArgs>({\n name: 'fcall',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.object({\n functionName: t.string(),\n numKeys: t.integer({ min: 0 }),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['write', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: fcallKeys,\n execute: (args, ctx) => runFunction(args, ctx, false),\n})\n\nexport const fcallRoCommand = defineCommand<FcallArgs>({\n name: 'fcall_ro',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: fcallCommand.schema,\n flags: ['readonly', 'movablekeys', 'noscript'],\n introspection: {\n arity: -3,\n flags: READONLY_DYNAMIC_SCRIPT_FLAGS,\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@slow', '@scripting'],\n keySpecs: [],\n },\n capabilities: { scriptKeys: true, movableKeys: true },\n keys: fcallKeys,\n execute: (args, ctx) => runFunction(args, ctx, true),\n})\n\nexport const scriptsCommands = [\n scriptCommand,\n evalCommand,\n evalshaCommand,\n evalRoCommand,\n evalshaRoCommand,\n functionCommand,\n fcallCommand,\n fcallRoCommand,\n]\n\nfunction scriptLoad(args: ScriptArgs, ctx: RedisExecutionContext): RedisResult {\n expectRestLength(args, 'script|load', 1)\n const sha = ctx.server.scriptCache.load(args.rest[0])\n return RedisResult.create(RedisValue.bulkString(Buffer.from(sha)))\n}\n\nfunction scriptExists(\n args: ScriptArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.rest.length === 0) {\n throw new WrongNumberOfArgumentsError('script|exists')\n }\n\n return array(\n args.rest.map(sha =>\n RedisValue.integer(ctx.server.scriptCache.exists(sha.toString()) ? 1 : 0),\n ),\n )\n}\n\nfunction scriptFlush(\n args: ScriptArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.rest.length > 1) {\n throw new ScriptFlushOptionError()\n }\n\n const mode = args.rest[0]?.toString().toUpperCase()\n if (mode !== undefined && mode !== 'ASYNC' && mode !== 'SYNC') {\n throw new ScriptFlushOptionError()\n }\n\n ctx.server.scriptCache.flush()\n return ok()\n}\n\nfunction scriptKill(args: ScriptArgs): RedisResult {\n expectRestLength(args, 'script|kill', 0)\n return RedisResult.error('No scripts in execution right now.', 'NOTBUSY')\n}\n\nfunction scriptDebug(\n args: ScriptArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n expectRestLength(args, 'script|debug', 1)\n const mode = args.rest[0].toString().toUpperCase()\n if (mode !== 'YES' && mode !== 'SYNC' && mode !== 'NO') {\n throw new ScriptDebugModeError()\n }\n\n if (ctx.transactionReplay) {\n throw new RedisCommandError(\n 'SCRIPT DEBUG must be called outside a pipeline',\n )\n }\n\n return ok()\n}\n\nfunction scriptHelp(args: ScriptArgs): RedisResult {\n expectRestLength(args, 'script|help', 0)\n return array(\n [\n 'SCRIPT <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n 'DEBUG <YES|SYNC|NO>',\n ' Set the debug mode for subsequent scripts executed.',\n 'EXISTS <sha1> [<sha1> ...]',\n ' Check if scripts exist in the script cache by SHA1 digest.',\n 'FLUSH [ASYNC|SYNC]',\n ' Flush the Lua scripts cache. Very dangerous on replicas.',\n 'HELP',\n ' Prints this help.',\n 'KILL',\n ' Kill the currently executing Lua script.',\n 'LOAD <script>',\n ' Load a script into the scripts cache without executing it.',\n ].map(line => RedisValue.bulkString(Buffer.from(line))),\n )\n}\n\nfunction expectRestLength(\n args: ScriptArgs,\n commandName: string,\n expected: number,\n): void {\n if (args.rest.length !== expected) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n}\n\nfunction evalKeys(args: Pick<EvalArgs, 'numKeys' | 'rest'>): readonly Buffer[] {\n validateNumberOfKeys(args)\n return args.rest.slice(0, args.numKeys)\n}\n\nfunction splitEvalArgs(args: EvalArgs | EvalShaArgs): {\n keys: Buffer[]\n argv: Buffer[]\n} {\n validateNumberOfKeys(args)\n return {\n keys: args.rest.slice(0, args.numKeys),\n argv: args.rest.slice(args.numKeys),\n }\n}\n\nfunction validateNumberOfKeys(args: Pick<EvalArgs, 'numKeys' | 'rest'>): void {\n if (args.numKeys > args.rest.length) {\n throw new WrongNumberOfKeysError()\n }\n}\n\nasync function runLuaScript(\n script: Buffer,\n keys: readonly Buffer[],\n argv: readonly Buffer[],\n ctx: RedisExecutionContext,\n readOnly = false,\n): Promise<RedisResult> {\n const runtime = await ctx.server.getLuaRuntime()\n\n try {\n const reply = renderScriptError(\n runtime.eval(script, keys, argv, ctx, { readOnly }),\n )\n return RedisResult.create(luaReplyToRedisValue(reply))\n } catch (err) {\n if (err instanceof RedisCommandError) {\n return RedisResult.error(err.message, err.code)\n }\n\n const message = err instanceof Error ? err.message : String(err)\n return RedisResult.error(message, 'ERR')\n }\n}\n\nfunction functionLoad(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n let replace = false\n let code: Buffer\n\n if (args.rest.length === 1) {\n code = args.rest[0]\n } else if (\n args.rest.length === 2 &&\n args.rest[0].toString().toLowerCase() === 'replace'\n ) {\n replace = true\n code = args.rest[1]\n } else {\n throw new WrongNumberOfArgumentsError('function|load')\n }\n\n try {\n const library = parseFunctionLibrary(code)\n ctx.server.functionRegistry.load(library, replace)\n return bulk(Buffer.from(library.name))\n } catch (err) {\n throw new RedisCommandError(errorMessage(err))\n }\n}\n\nfunction functionDelete(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n expectRestLength(args, 'function|delete', 1)\n if (!ctx.server.functionRegistry.delete(args.rest[0].toString())) {\n throw new RedisCommandError(`Library not found`)\n }\n\n return ok()\n}\n\nfunction functionList(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n const { libraryName, withCode } = parseFunctionListOptions(args.rest)\n const libraries = ctx.server.functionRegistry\n .list()\n .filter(\n library => libraryName === undefined || library.name === libraryName,\n )\n return array(\n libraries.map(library => functionLibraryReply(library, withCode)),\n )\n}\n\nfunction functionStats(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n expectRestLength(args, 'function|stats', 0)\n const libraries = ctx.server.functionRegistry.list()\n const functionCount = libraries.reduce(\n (count, library) => count + library.functions.length,\n 0,\n )\n\n return RedisResult.create(\n RedisValue.map([\n [RedisValue.bulkString(Buffer.from('running_script')), RedisValue.null()],\n [\n RedisValue.bulkString(Buffer.from('engines')),\n RedisValue.map([\n [\n RedisValue.bulkString(Buffer.from('LUA')),\n RedisValue.map([\n [\n RedisValue.bulkString(Buffer.from('libraries_count')),\n RedisValue.integer(libraries.length),\n ],\n [\n RedisValue.bulkString(Buffer.from('functions_count')),\n RedisValue.integer(functionCount),\n ],\n ]),\n ],\n ]),\n ],\n ]),\n )\n}\n\nfunction functionRestore(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.rest.length < 1 || args.rest.length > 2) {\n throw new WrongNumberOfArgumentsError('function|restore')\n }\n\n const mode = args.rest[1]?.toString().toLowerCase() ?? 'append'\n if (mode !== 'append' && mode !== 'flush' && mode !== 'replace') {\n throw new RedisCommandError(\n 'Wrong restore policy given, value should be either FLUSH, APPEND or REPLACE.',\n )\n }\n\n try {\n ctx.server.functionRegistry.restore(args.rest[0], mode)\n return ok()\n } catch (err) {\n throw new RedisCommandError(errorMessage(err))\n }\n}\n\nfunction functionFlush(\n args: FunctionArgs,\n ctx: RedisExecutionContext,\n): RedisResult {\n if (args.rest.length > 1) {\n throw functionFlushOptionError()\n }\n\n const mode = args.rest[0]?.toString().toUpperCase()\n if (mode !== undefined && mode !== 'ASYNC' && mode !== 'SYNC') {\n throw functionFlushOptionError()\n }\n\n ctx.server.functionRegistry.clear()\n return ok()\n}\n\nfunction functionKill(args: FunctionArgs): RedisResult {\n expectRestLength(args, 'function|kill', 0)\n return RedisResult.error('No scripts in execution right now.', 'NOTBUSY')\n}\n\nfunction functionHelp(args: FunctionArgs): RedisResult {\n expectRestLength(args, 'function|help', 0)\n return array(\n [\n 'FUNCTION <subcommand> [<arg> [value] [opt] ...]. Subcommands are:',\n 'LOAD [REPLACE] <FUNCTION CODE>',\n ' Create a library with the functions in the given code.',\n 'DELETE <LIBRARY NAME>',\n ' Delete the given library and all its functions.',\n 'LIST [LIBRARYNAME <LIBRARY NAME>] [WITHCODE]',\n ' Return information about the functions and libraries.',\n 'STATS',\n ' Return information about the current function execution.',\n 'DUMP',\n ' Return a serialized payload representing the loaded libraries.',\n 'RESTORE <PAYLOAD> [FLUSH|APPEND|REPLACE]',\n ' Restore libraries from a serialized payload.',\n 'FLUSH [ASYNC|SYNC]',\n ' Delete all the libraries.',\n 'KILL',\n ' Kill the currently executing function.',\n 'HELP',\n ' Prints this help.',\n ].map(line => RedisValue.bulkString(Buffer.from(line))),\n )\n}\n\nasync function runFunction(\n args: FcallArgs,\n ctx: RedisExecutionContext,\n readOnly: boolean,\n): Promise<RedisResult> {\n const fn = ctx.server.functionRegistry.findFunction(args.functionName)\n if (!fn) {\n throw new RedisCommandError('Function not found')\n }\n\n if (readOnly && !fn.flags.includes('no-writes')) {\n throw new RedisCommandError(\n 'Can not execute a script with write flag using *_ro command.',\n )\n }\n\n const { keys, argv } = splitFcallArgs(args)\n return runLuaScript(fn.script, keys, argv, ctx, readOnly)\n}\n\nfunction fcallKeys(args: FcallArgs): readonly Buffer[] {\n validateNumberOfKeys(args)\n return args.rest.slice(0, args.numKeys)\n}\n\nfunction splitFcallArgs(args: FcallArgs): {\n keys: Buffer[]\n argv: Buffer[]\n} {\n validateNumberOfKeys(args)\n return {\n keys: args.rest.slice(0, args.numKeys),\n argv: args.rest.slice(args.numKeys),\n }\n}\n\nfunction parseFunctionListOptions(args: readonly Buffer[]): {\n libraryName?: string\n withCode: boolean\n} {\n let libraryName: string | undefined\n let withCode = false\n\n for (let index = 0; index < args.length; index++) {\n const option = args[index].toString().toLowerCase()\n if (option === 'withcode') {\n withCode = true\n continue\n }\n\n if (option === 'libraryname' && index + 1 < args.length) {\n libraryName = args[++index].toString()\n continue\n }\n\n throw new RedisCommandError('syntax error')\n }\n\n return { libraryName, withCode }\n}\n\nfunction functionLibraryReply(\n library: RedisFunctionLibrary,\n withCode: boolean,\n): RedisValue {\n const items = [\n RedisValue.bulkString(Buffer.from('library_name')),\n RedisValue.bulkString(Buffer.from(library.name)),\n RedisValue.bulkString(Buffer.from('engine')),\n RedisValue.bulkString(Buffer.from('LUA')),\n RedisValue.bulkString(Buffer.from('functions')),\n RedisValue.array(library.functions.map(functionReply)),\n ]\n\n if (withCode) {\n items.push(\n RedisValue.bulkString(Buffer.from('library_code')),\n RedisValue.bulkString(library.code),\n )\n }\n\n return RedisValue.array(items)\n}\n\nfunction functionReply(fn: RedisFunctionDefinition): RedisValue {\n return RedisValue.array([\n RedisValue.bulkString(Buffer.from('name')),\n RedisValue.bulkString(Buffer.from(fn.name)),\n RedisValue.bulkString(Buffer.from('description')),\n RedisValue.bulkString(null),\n RedisValue.bulkString(Buffer.from('flags')),\n RedisValue.array(\n fn.flags.map(flag => RedisValue.bulkString(Buffer.from(flag))),\n ),\n ])\n}\n\nfunction functionFlushOptionError(): RedisCommandError {\n return new RedisCommandError('FUNCTION FLUSH only support SYNC|ASYNC option')\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport { integer, bulk, array } from './helpers'\nimport { RedisValue } from '../core/redis-value'\nimport {\n LimitCantBeNegativeError,\n NumKeysGreaterThanZeroError,\n PositiveCountError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n WrongNumberOfKeysError,\n WrongTypeRedisError,\n} from '../core/redis-error'\nimport type { RedisDatabase } from '../state'\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction getSetMembers(db: RedisDatabase, key: Buffer): Set<string> {\n const setData = db.getSet(key) // throws WrongTypeRedisError if wrong type\n if (!setData) return new Set()\n return new Set(setData.members.keys())\n}\n\nfunction getSetBufferMap(db: RedisDatabase, key: Buffer): Map<string, Buffer> {\n const setData = db.getSet(key)\n if (!setData) return new Map()\n return new Map(setData.members)\n}\n\nfunction computeDiff(sets: Set<string>[]): Set<string> {\n if (sets.length === 0) return new Set()\n const [first, ...rest] = sets\n const result = new Set(first)\n for (const s of rest) {\n for (const m of s) result.delete(m)\n }\n return result\n}\n\nfunction computeInter(sets: Set<string>[]): Set<string> {\n if (sets.length === 0) return new Set()\n const result = new Set(sets[0])\n for (let i = 1; i < sets.length; i++) {\n for (const m of result) {\n if (!sets[i].has(m)) result.delete(m)\n }\n }\n return result\n}\n\nfunction computeUnion(sets: Set<string>[]): Set<string> {\n const result = new Set<string>()\n for (const s of sets) for (const m of s) result.add(m)\n return result\n}\n\nfunction storeSetResult(\n db: RedisDatabase,\n destKey: Buffer,\n hexSet: Set<string>,\n bufferMap: Map<string, Buffer>,\n): number {\n if (hexSet.size === 0) {\n db.delete(destKey)\n return 0\n }\n db.updateSet(destKey, set => {\n set.replaceMembers(hexSet, bufferMap, { forceDirty: true })\n })\n return hexSet.size\n}\n\nfunction parseSintercardCount(token: Buffer): number {\n const count = Number(token.toString())\n if (!Number.isSafeInteger(count) || count <= 0) {\n throw new NumKeysGreaterThanZeroError()\n }\n\n return count\n}\n\nfunction parseSintercardLimit(token: Buffer): number {\n const limit = Number(token.toString())\n if (!Number.isSafeInteger(limit) || limit < 0) {\n throw new LimitCantBeNegativeError()\n }\n\n return limit\n}\n\nconst sintercardSchema = t.custom<{\n keys: Buffer[]\n limit: number\n}>((input, _index, ctx) => {\n if (input.length < 2) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const keyCount = parseSintercardCount(input[0])\n if (keyCount > input.length - 1) {\n throw new WrongNumberOfKeysError()\n }\n\n const keys = input.slice(1, 1 + keyCount)\n let cursor = 1 + keyCount\n let limit = 0\n\n if (cursor >= input.length) {\n return { value: { keys, limit }, nextIndex: cursor }\n }\n\n const option = input[cursor].toString().toUpperCase()\n if (option !== 'LIMIT') {\n throw new RedisSyntaxError()\n }\n\n cursor++\n if (cursor >= input.length) {\n throw new RedisSyntaxError()\n }\n\n limit = parseSintercardLimit(input[cursor])\n cursor++\n\n if (cursor !== input.length) {\n throw new RedisSyntaxError()\n }\n\n return { value: { keys, limit }, nextIndex: cursor }\n})\n\n// ---------------------------------------------------------------------------\n// SADD key member [member ...]\n// ---------------------------------------------------------------------------\n\nexport const saddCommand = defineCommand({\n name: 'sadd',\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const added = ctx.db.updateSet(args.key, set => {\n let count = 0\n for (const member of args.members) {\n if (set.addMember(member)) count++\n }\n return count\n })\n return integer(added)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SREM key member [member ...]\n// ---------------------------------------------------------------------------\n\nexport const sremCommand = defineCommand({\n name: 'srem',\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (ctx.db.getType(args.key) === null) return integer(0)\n let removed = 0\n ctx.db.updateSet(args.key, set => {\n for (const member of args.members) {\n if (set.deleteMember(member)) removed++\n }\n })\n if (removed > 0 && (ctx.db.getSet(args.key)?.members.size ?? 0) === 0) {\n ctx.db.delete(args.key)\n }\n return integer(removed)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SCARD key\n// ---------------------------------------------------------------------------\n\nexport const scardCommand = defineCommand({\n name: 'scard',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n return integer(set?.members.size ?? 0)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SMEMBERS key\n// ---------------------------------------------------------------------------\n\nexport const smembersCommand = defineCommand({\n name: 'smembers',\n schema: t.object({ key: t.key() }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n if (!set) return array([])\n return array(\n Array.from(set.members.values()).map(m => RedisValue.bulkString(m)),\n )\n },\n})\n\n// ---------------------------------------------------------------------------\n// SISMEMBER key member\n// ---------------------------------------------------------------------------\n\nexport const sismemberCommand = defineCommand({\n name: 'sismember',\n schema: t.object({ key: t.key(), member: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n if (!set) return integer(0)\n return integer(set.members.has(args.member.toString('hex')) ? 1 : 0)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SMISMEMBER key member [member ...]\n// ---------------------------------------------------------------------------\n\nexport const smismemberCommand = defineCommand({\n name: 'smismember',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n\n return array(\n args.members.map(member =>\n RedisValue.integer(set?.members.has(member.toString('hex')) ? 1 : 0),\n ),\n )\n },\n})\n\n// ---------------------------------------------------------------------------\n// SPOP key [count]\n// ---------------------------------------------------------------------------\n\nexport const spopCommand = defineCommand({\n name: 'spop',\n schema: t.object({ key: t.key(), count: t.optional(t.integer()) }),\n flags: ['write', 'random', 'fast', 'noscript'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.count !== undefined && args.count < 0) {\n throw new PositiveCountError()\n }\n\n const type = ctx.db.getType(args.key)\n if (type === null) return args.count === undefined ? bulk(null) : array([])\n if (type !== 'set') throw new WrongTypeRedisError()\n\n if (args.count === undefined) {\n const result = ctx.db.updateSet(args.key, set => {\n if (set.size === 0)\n return { member: null as Buffer | null, empty: false }\n const entries = set.randomMemberEntries()\n const [hex, member] =\n entries[Math.floor(Math.random() * entries.length)]\n set.deleteMemberId(hex)\n return { member, empty: set.size === 0 }\n })\n if (result.empty) ctx.db.delete(args.key)\n return bulk(result.member)\n }\n\n if (args.count === 0) return array([])\n\n const result = ctx.db.updateSet(args.key, set => {\n if (set.size === 0) return { members: [] as Buffer[], empty: true }\n const entries = set.randomMemberEntries()\n const size = Math.min(args.count!, entries.length)\n const members: Buffer[] = []\n\n for (let i = 0; i < size; i++) {\n const j = i + Math.floor(Math.random() * (entries.length - i))\n ;[entries[i], entries[j]] = [entries[j], entries[i]]\n const [hex, member] = entries[i]\n set.deleteMemberId(hex)\n members.push(member)\n }\n\n return { members, empty: set.size === 0 }\n })\n if (result.empty) ctx.db.delete(args.key)\n return array(result.members.map(member => RedisValue.bulkString(member)))\n },\n})\n\n// ---------------------------------------------------------------------------\n// SRANDMEMBER key [count]\n// ---------------------------------------------------------------------------\n\nexport const srandmemberCommand = defineCommand({\n name: 'srandmember',\n schema: t.object({ key: t.key(), count: t.optional(t.integer()) }),\n flags: ['readonly', 'random', 'noscript'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const set = ctx.db.getSet(args.key)\n\n if (args.count === undefined) {\n if (!set || set.members.size === 0) return bulk(null)\n const values = Array.from(set.members.values())\n return bulk(values[Math.floor(Math.random() * values.length)])\n }\n\n if (!set || set.members.size === 0) return array([])\n\n const values = Array.from(set.members.values())\n const count = args.count\n\n if (count >= 0) {\n // unique members, up to count\n const size = Math.min(count, values.length)\n // Fisher-Yates partial shuffle\n const pool = values.slice()\n const result: Buffer[] = []\n for (let i = 0; i < size; i++) {\n const j = i + Math.floor(Math.random() * (pool.length - i))\n ;[pool[i], pool[j]] = [pool[j], pool[i]]\n result.push(pool[i])\n }\n return array(result.map(m => RedisValue.bulkString(m)))\n } else {\n // with repetition, |count| members\n const n = -count\n const result: Buffer[] = []\n for (let i = 0; i < n; i++) {\n result.push(values[Math.floor(Math.random() * values.length)])\n }\n return array(result.map(m => RedisValue.bulkString(m)))\n }\n },\n})\n\n// ---------------------------------------------------------------------------\n// SDIFF key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sdiffCommand = defineCommand({\n name: 'sdiff',\n schema: t.object({ keys: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sets = args.keys.map(k => getSetMembers(ctx.db, k))\n const diff = computeDiff(sets)\n if (diff.size === 0) return array([])\n // collect buffers from first set (all diff members come from it)\n const firstMap = getSetBufferMap(ctx.db, args.keys[0])\n return array(\n Array.from(diff).map(hex => RedisValue.bulkString(firstMap.get(hex)!)),\n )\n },\n})\n\n// ---------------------------------------------------------------------------\n// SINTER key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sinterCommand = defineCommand({\n name: 'sinter',\n schema: t.object({ keys: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sets = args.keys.map(k => getSetMembers(ctx.db, k))\n const inter = computeInter(sets)\n if (inter.size === 0) return array([])\n const firstMap = getSetBufferMap(ctx.db, args.keys[0])\n return array(\n Array.from(inter).map(hex => RedisValue.bulkString(firstMap.get(hex)!)),\n )\n },\n})\n\n// ---------------------------------------------------------------------------\n// SINTERCARD numkeys key [key ...] [LIMIT limit]\n// ---------------------------------------------------------------------------\n\nexport const sintercardCommand = defineCommand({\n name: 'sintercard',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: sintercardSchema,\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sets = args.keys.map(k => getSetMembers(ctx.db, k))\n const count = computeInter(sets).size\n if (args.limit > 0) return integer(Math.min(count, args.limit))\n return integer(count)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SUNION key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sunionCommand = defineCommand({\n name: 'sunion',\n schema: t.object({ keys: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const bufferMaps = args.keys.map(k => getSetBufferMap(ctx.db, k))\n const union = computeUnion(bufferMaps.map(m => new Set(m.keys())))\n if (union.size === 0) return array([])\n // build combined buffer map\n const combined = new Map<string, Buffer>()\n for (const m of bufferMaps) {\n for (const [hex, buf] of m) combined.set(hex, buf)\n }\n return array(\n Array.from(union).map(hex => RedisValue.bulkString(combined.get(hex)!)),\n )\n },\n})\n\n// ---------------------------------------------------------------------------\n// SMOVE source destination member\n// ---------------------------------------------------------------------------\n\nexport const smoveCommand = defineCommand({\n name: 'smove',\n schema: t.object({ source: t.key(), destination: t.key(), member: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.source, args.destination],\n execute: (args, ctx) => {\n const sourceType = ctx.db.getType(args.source)\n if (sourceType === null) return integer(0)\n if (sourceType !== 'set') throw new WrongTypeRedisError()\n\n // validate destination type before mutating source\n const destType = ctx.db.getType(args.destination)\n if (destType !== null && destType !== 'set') throw new WrongTypeRedisError()\n\n let moved = false\n ctx.db.updateSet(args.source, set => {\n moved = set.deleteMember(args.member)\n })\n\n if (!moved) return integer(0)\n\n if ((ctx.db.getSet(args.source)?.members.size ?? 0) === 0) {\n ctx.db.delete(args.source)\n }\n\n ctx.db.updateSet(args.destination, set => {\n set.addMember(args.member)\n })\n\n return integer(1)\n },\n})\n\n// ---------------------------------------------------------------------------\n// SDIFFSTORE destination key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sdiffstoreCommand = defineCommand({\n name: 'sdiffstore',\n schema: t.object({\n destination: t.key(),\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination, ...args.keys],\n execute: (args, ctx) => {\n const bufferMaps = args.keys.map(k => getSetBufferMap(ctx.db, k))\n const sets = bufferMaps.map(m => new Set(m.keys()))\n const diff = computeDiff(sets)\n const combined = new Map<string, Buffer>()\n for (const m of bufferMaps) {\n for (const [hex, buf] of m) combined.set(hex, buf)\n }\n return integer(storeSetResult(ctx.db, args.destination, diff, combined))\n },\n})\n\n// ---------------------------------------------------------------------------\n// SINTERSTORE destination key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sinterstoreCommand = defineCommand({\n name: 'sinterstore',\n schema: t.object({\n destination: t.key(),\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination, ...args.keys],\n execute: (args, ctx) => {\n const bufferMaps = args.keys.map(k => getSetBufferMap(ctx.db, k))\n const sets = bufferMaps.map(m => new Set(m.keys()))\n const inter = computeInter(sets)\n const combined = new Map<string, Buffer>()\n for (const m of bufferMaps) {\n for (const [hex, buf] of m) combined.set(hex, buf)\n }\n return integer(storeSetResult(ctx.db, args.destination, inter, combined))\n },\n})\n\n// ---------------------------------------------------------------------------\n// SUNIONSTORE destination key [key ...]\n// ---------------------------------------------------------------------------\n\nexport const sunionstoreCommand = defineCommand({\n name: 'sunionstore',\n schema: t.object({\n destination: t.key(),\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination, ...args.keys],\n execute: (args, ctx) => {\n const bufferMaps = args.keys.map(k => getSetBufferMap(ctx.db, k))\n const sets = bufferMaps.map(m => new Set(m.keys()))\n const union = computeUnion(sets)\n const combined = new Map<string, Buffer>()\n for (const m of bufferMaps) {\n for (const [hex, buf] of m) combined.set(hex, buf)\n }\n return integer(storeSetResult(ctx.db, args.destination, union, combined))\n },\n})\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const setsCommands = [\n saddCommand,\n sremCommand,\n scardCommand,\n smembersCommand,\n sismemberCommand,\n smismemberCommand,\n spopCommand,\n srandmemberCommand,\n sdiffCommand,\n sinterCommand,\n sintercardCommand,\n sunionCommand,\n smoveCommand,\n sdiffstoreCommand,\n sinterstoreCommand,\n sunionstoreCommand,\n]\n","import {\n ExpectedIntegerError,\n InvalidStreamIdError,\n} from '../../core/redis-error'\nimport type { StreamId } from '../../state/data-types'\nimport { MIN_ID } from '../../state/stream-ids'\n\n// StreamId arithmetic now lives in the state layer; re-export it here so the\n// streams command modules keep importing it from a single place.\nexport {\n MIN_ID,\n formatStreamId,\n streamIdKey,\n compareStreamId,\n cloneStreamId,\n maxStreamId,\n} from '../../state/stream-ids'\n\nexport const MAX_UINT64 = (1n << 64n) - 1n\nexport const MAX_ID: StreamId = { ms: MAX_UINT64, seq: MAX_UINT64 }\n\nexport function bufferId(value: Buffer): string {\n return value.toString('hex')\n}\n\nexport function parseUint64(token: string): bigint | null {\n if (!/^\\d+$/.test(token)) return null\n const value = BigInt(token)\n return value > MAX_UINT64 ? null : value\n}\n\n// XDEL ids are exact: \"<ms>-<seq>\", or \"<ms>\" meaning \"<ms>-0\".\nexport function parseExactId(token: string): StreamId {\n const dash = token.indexOf('-')\n if (dash === -1) {\n const ms = parseUint64(token)\n if (ms === null) throw new InvalidStreamIdError()\n return { ms, seq: 0n }\n }\n\n const ms = parseUint64(token.slice(0, dash))\n const seq = parseUint64(token.slice(dash + 1))\n if (ms === null || seq === null) throw new InvalidStreamIdError()\n return { ms, seq }\n}\n\n// XRANGE/XREVRANGE bound. `-`/`+` are the open ends; a leading `(` is exclusive;\n// a bare ms defaults its seq to 0 (start) or the max (end).\nexport type RangeBound = { id: StreamId; exclusive: boolean }\n\nexport function parseRangeId(token: string, isStart: boolean): RangeBound {\n let exclusive = false\n let body = token\n if (body.startsWith('(')) {\n exclusive = true\n body = body.slice(1)\n }\n\n if (body === '-') return { id: MIN_ID, exclusive }\n if (body === '+') return { id: MAX_ID, exclusive }\n\n const dash = body.indexOf('-')\n if (dash === -1) {\n const ms = parseUint64(body)\n if (ms === null) throw new InvalidStreamIdError()\n return { id: { ms, seq: isStart ? 0n : MAX_UINT64 }, exclusive }\n }\n\n const ms = parseUint64(body.slice(0, dash))\n const seq = parseUint64(body.slice(dash + 1))\n if (ms === null || seq === null) throw new InvalidStreamIdError()\n return { id: { ms, seq }, exclusive }\n}\n\n// cmp = compareStreamId(entry, bound). For the lower bound we need entry >= bound\n// (or > when exclusive); for the upper bound entry <= bound (or < when exclusive).\nexport function exclusiveAware(\n cmp: number,\n exclusive: boolean,\n isLowerBound: boolean,\n): boolean {\n if (isLowerBound) {\n return exclusive ? cmp > 0 : cmp >= 0\n }\n return exclusive ? cmp < 0 : cmp <= 0\n}\n\nexport function parseNonNegativeInteger(token: Buffer): number {\n const raw = token.toString()\n if (!/^\\d+$/.test(raw)) {\n throw new ExpectedIntegerError()\n }\n\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) {\n throw new ExpectedIntegerError()\n }\n\n return value\n}\n","import { RedisCommandError } from '../../core/redis-error'\nimport type {\n RedisStreamConsumerGroup,\n RedisStreamData,\n StreamId,\n} from '../../state/data-types'\nimport { bufferId, cloneStreamId, compareStreamId, maxStreamId } from './ids'\n\n// Pure consumer-group lookups moved to the state layer (so TrackedStreamData can\n// use them); re-exported here for the streams command modules.\nexport {\n findEntry,\n pendingEntriesSorted,\n ensureConsumer,\n} from '../../state/stream-groups'\n\nexport class BusyStreamGroupError extends RedisCommandError {\n constructor() {\n super('Consumer Group name already exists', 'BUSYGROUP')\n }\n}\n\nexport class NoSuchStreamGroupError extends RedisCommandError {\n constructor(key: Buffer, group: Buffer, commandName?: string) {\n const suffix =\n commandName === 'XREADGROUP' ? ' in XREADGROUP with GROUP option' : ''\n super(\n `No such key '${key.toString()}' or consumer group '${group.toString()}'${suffix}`,\n 'NOGROUP',\n )\n }\n}\n\nexport function updateMaxDeletedId(\n stream: RedisStreamData,\n id: StreamId,\n): void {\n stream.maxDeletedEntryId = cloneStreamId(\n maxStreamId(stream.maxDeletedEntryId, id),\n )\n}\n\nexport function streamGroup(\n stream: RedisStreamData,\n groupName: Buffer,\n): RedisStreamConsumerGroup | null {\n return stream.groups.get(bufferId(groupName)) ?? null\n}\n\nexport function requireStreamGroup(\n stream: RedisStreamData | null,\n key: Buffer,\n groupName: Buffer,\n commandName?: string,\n): RedisStreamConsumerGroup {\n const group = stream ? streamGroup(stream, groupName) : null\n if (!group) {\n throw new NoSuchStreamGroupError(key, groupName, commandName)\n }\n return group\n}\n\nexport function streamLag(\n stream: RedisStreamData,\n group: RedisStreamConsumerGroup,\n): number {\n let lag = 0\n for (const entry of stream.entries) {\n if (compareStreamId(entry.id, group.lastDeliveredId) > 0) {\n lag++\n }\n }\n return lag\n}\n\nexport function consumerPendingCount(\n group: RedisStreamConsumerGroup,\n consumerId: string,\n): number {\n let count = 0\n for (const pending of group.pending.values()) {\n if (pending.consumerId === consumerId) count++\n }\n return count\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\nimport { requireStreamGroup } from './groups'\nimport { parseExactId } from './ids'\n\nexport const xackCommand = defineCommand({\n name: 'xack',\n schema: t.object({\n key: t.key(),\n group: t.bulk(),\n ids: t.variadic(t.string(), { min: 1 }),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const ids = args.ids.map(parseExactId)\n requireStreamGroup(ctx.db.getStream(args.key), args.key, args.group)\n const acknowledged = ctx.db.updateStream(args.key, stream => {\n const group = requireStreamGroup(stream.value, args.key, args.group)\n return stream.ack(group, ids)\n })\n return integer(acknowledged)\n },\n})\n","import {\n SchemaMismatchError,\n t,\n type ParseContext,\n} from '../../core/command-schema'\nimport {\n ExpectedIntegerError,\n RedisSyntaxError,\n StreamLimitNegativeError,\n StreamLimitRequiresApproxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { RedisStreamData, StreamId } from '../../state/data-types'\nimport { compareStreamId, parseExactId, parseUint64 } from './ids'\nimport { updateMaxDeletedId } from './groups'\n\n// Trim specification shared by XADD and XTRIM.\nexport type TrimSpec =\n | {\n strategy: 'maxlen'\n count: bigint\n approximate: boolean\n limit: bigint | null\n }\n | {\n strategy: 'minid'\n minId: StreamId\n approximate: boolean\n limit: bigint | null\n }\n\nfunction parseTrimLimit(raw: string): bigint {\n if (/^-\\d+$/.test(raw)) {\n throw new StreamLimitNegativeError()\n }\n\n const value = parseUint64(raw)\n if (value === null) {\n throw new ExpectedIntegerError()\n }\n\n return value\n}\n\nexport function createTrimSpecSchema() {\n return t.custom<TrimSpec>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n if (index >= input.length) throw new SchemaMismatchError()\n\n const keyword = input[index].toString().toUpperCase()\n if (keyword !== 'MAXLEN' && keyword !== 'MINID')\n throw new SchemaMismatchError()\n\n let cursor = index + 1\n let approximate = false\n if (cursor < input.length && input[cursor].toString() === '~') {\n approximate = true\n cursor++\n }\n\n const rawValue = input[cursor]?.toString()\n if (rawValue === undefined)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n cursor++\n\n let trim: TrimSpec\n if (keyword === 'MAXLEN') {\n const count = parseUint64(rawValue)\n if (count === null) throw new RedisSyntaxError()\n trim = { strategy: 'maxlen', count, approximate, limit: null }\n } else {\n const minId = parseExactId(rawValue)\n trim = { strategy: 'minid', minId, approximate, limit: null }\n }\n\n while (cursor < input.length) {\n if (input[cursor]!.toString().toUpperCase() !== 'LIMIT') {\n break\n }\n\n if (!approximate) {\n throw new StreamLimitRequiresApproxError()\n }\n\n const rawLimit = input[cursor + 1]?.toString()\n if (rawLimit === undefined) {\n throw new RedisSyntaxError()\n }\n\n trim.limit = parseTrimLimit(rawLimit)\n cursor += 2\n }\n\n return { value: trim, nextIndex: cursor }\n },\n )\n}\n\nexport function applyTrim(stream: RedisStreamData, spec: TrimSpec): number {\n if (spec.strategy === 'maxlen') {\n const targetLength = spec.approximate ? spec.count + 1n : spec.count\n const removeCountBigint = BigInt(stream.entries.length) - targetLength\n const removeCount = removeCountBigint > 0n ? Number(removeCountBigint) : 0\n if (removeCount <= 0) return 0\n for (const entry of stream.entries.slice(0, removeCount)) {\n updateMaxDeletedId(stream, entry.id)\n }\n stream.entries.splice(0, removeCount)\n return removeCount\n } else {\n let i = 0\n while (\n i < stream.entries.length &&\n compareStreamId(stream.entries[i].id, spec.minId) < 0\n ) {\n i++\n }\n if (i === 0) return 0\n if (spec.approximate) {\n i--\n if (i === 0) return 0\n }\n for (const entry of stream.entries.slice(0, i)) {\n updateMaxDeletedId(stream, entry.id)\n }\n stream.entries.splice(0, i)\n return i\n }\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n InvalidStreamIdError,\n StreamIdEqualOrSmallerError,\n StreamIdExhaustedError,\n StreamIdNotGreaterThanZeroError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { StreamId } from '../../state/data-types'\nimport { bulk } from '../helpers'\nimport {\n compareStreamId,\n formatStreamId,\n MAX_UINT64,\n MIN_ID,\n parseUint64,\n} from './ids'\nimport { applyTrim, createTrimSpecSchema } from './trim'\n\n// XADD id: \"*\", \"<ms>-*\", \"<ms>-<seq>\", or \"<ms>\" (seq defaults to 0).\nfunction resolveXaddId(spec: string, lastId: StreamId): StreamId {\n if (spec === '*') {\n return nextAutoId(lastId)\n }\n\n const dash = spec.indexOf('-')\n if (dash === -1) {\n const ms = parseUint64(spec)\n if (ms === null) throw new InvalidStreamIdError()\n return { ms, seq: 0n }\n }\n\n const ms = parseUint64(spec.slice(0, dash))\n if (ms === null) throw new InvalidStreamIdError()\n\n const seqPart = spec.slice(dash + 1)\n if (seqPart === '*') {\n return nextSeqForMs(ms, lastId)\n }\n\n const seq = parseUint64(seqPart)\n if (seq === null) throw new InvalidStreamIdError()\n return { ms, seq }\n}\n\nfunction nextAutoId(lastId: StreamId): StreamId {\n const now = BigInt(Date.now())\n if (now > lastId.ms) return { ms: now, seq: 0n }\n if (lastId.seq < MAX_UINT64) return { ms: lastId.ms, seq: lastId.seq + 1n }\n if (lastId.ms < MAX_UINT64) return { ms: lastId.ms + 1n, seq: 0n }\n\n throw new StreamIdExhaustedError()\n}\n\nfunction nextSeqForMs(ms: bigint, lastId: StreamId): StreamId {\n if (ms > lastId.ms) return { ms, seq: 0n }\n if (ms < lastId.ms) {\n return { ms, seq: lastId.seq === MAX_UINT64 ? MAX_UINT64 : lastId.seq + 1n }\n }\n if (lastId.seq === MAX_UINT64) return { ms, seq: MAX_UINT64 }\n\n return { ms, seq: lastId.seq + 1n }\n}\n\ntype FieldList = Buffer[]\n\n// Parses the trailing `field value [field value ...]` of XADD into a flat\n// [field1, value1, ...] array, requiring at least one complete pair.\nfunction createStreamFieldsSchema() {\n return t.custom<FieldList>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const fields: FieldList = []\n let cursor = index\n while (cursor < input.length) {\n const field = input[cursor]\n const value = input[cursor + 1]\n if (value === undefined) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n fields.push(field, value)\n cursor += 2\n }\n if (fields.length === 0) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return { value: fields, nextIndex: cursor }\n },\n )\n}\n\nexport const xaddCommand = defineCommand({\n name: 'xadd',\n schema: t.object({\n key: t.key(),\n nomkstream: t.optional(t.keyword('NOMKSTREAM')),\n trim: t.optional(createTrimSpecSchema()),\n id: t.string(),\n fields: createStreamFieldsSchema(),\n }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.nomkstream !== undefined && ctx.db.getType(args.key) === null) {\n return bulk(null)\n }\n\n const id = ctx.db.updateStream(args.key, stream => {\n const next = resolveXaddId(args.id, stream.lastId)\n\n // An id must be > 0-0 and strictly greater than the stream's last id.\n // lastId is 0-0 for a brand-new stream and is retained even after XDEL\n // empties the stream, so this single comparison covers every case.\n if (compareStreamId(next, MIN_ID) <= 0) {\n throw new StreamIdNotGreaterThanZeroError()\n }\n if (compareStreamId(next, stream.lastId) <= 0) {\n throw new StreamIdEqualOrSmallerError()\n }\n\n stream.appendEntry(next, args.fields)\n\n if (args.trim !== undefined) {\n const trim = args.trim\n stream.trim(value => applyTrim(value, trim))\n }\n\n return next\n })\n\n return bulk(Buffer.from(formatStreamId(id)))\n },\n})\n","import { RedisValue } from '../../core/redis-value'\nimport type { StreamId } from '../../state/data-types'\nimport { formatStreamId } from './ids'\n\nexport function bulkString(value: string | Buffer): RedisValue {\n return RedisValue.bulkString(\n typeof value === 'string' ? Buffer.from(value) : value,\n )\n}\n\nexport function nullBulk(): RedisValue {\n return RedisValue.bulkString(null)\n}\n\nexport function integerValue(value: number | bigint): RedisValue {\n return RedisValue.integer(value)\n}\n\nexport function streamIdValue(id: StreamId): RedisValue {\n return bulkString(formatStreamId(id))\n}\n\nexport function entryToReply(id: StreamId, fields: Buffer[]): RedisValue {\n return RedisValue.array([\n RedisValue.bulkString(Buffer.from(formatStreamId(id))),\n RedisValue.array(fields.map(part => RedisValue.bulkString(part))),\n ])\n}\n\nexport function deletedEntryToReply(id: StreamId): RedisValue {\n return RedisValue.array([\n RedisValue.bulkString(Buffer.from(formatStreamId(id))),\n RedisValue.bulkString(null),\n ])\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport type { StreamId } from '../../state/data-types'\nimport { array } from '../helpers'\nimport { requireStreamGroup } from './groups'\nimport { parseExactId, parseNonNegativeInteger } from './ids'\nimport { entryToReply, streamIdValue } from './replies'\n\ntype XautoclaimArgs = {\n key: Buffer\n group: Buffer\n consumer: Buffer\n minIdleMs: number\n start: StreamId\n count: number\n justId: boolean\n}\n\nfunction createXautoclaimSchema() {\n return t.custom<XautoclaimArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const group = input[index + 1]\n const consumer = input[index + 2]\n const rawMinIdle = input[index + 3]\n const rawStart = input[index + 4]\n if (!key || !group || !consumer || !rawMinIdle || !rawStart) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 5\n let count = 100\n let justId = false\n while (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (option === 'COUNT') {\n const rawCount = input[cursor + 1]\n if (!rawCount) throw new WrongNumberOfArgumentsError(ctx.commandName)\n count = parseNonNegativeInteger(rawCount)\n cursor += 2\n continue\n }\n\n if (option === 'JUSTID') {\n justId = true\n cursor++\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return {\n value: {\n key,\n group,\n consumer,\n minIdleMs: parseNonNegativeInteger(rawMinIdle),\n start: parseExactId(rawStart.toString()),\n count,\n justId,\n },\n nextIndex: input.length,\n }\n },\n )\n}\n\nexport const xautoclaimCommand = defineCommand({\n name: 'xautoclaim',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({ args: createXautoclaimSchema() }),\n flags: ['write'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n const now = Date.now()\n const includeDeletedIds = ctx.server.profile.has(\n 'stream.xautoclaim-deleted-ids',\n )\n requireStreamGroup(\n ctx.db.getStream(command.key),\n command.key,\n command.group,\n )\n const result = ctx.db.updateStream(command.key, stream => {\n const group = requireStreamGroup(stream.value, command.key, command.group)\n return stream.autoClaim(\n group,\n command.consumer,\n {\n minIdleMs: command.minIdleMs,\n start: command.start,\n count: command.count,\n justId: command.justId,\n cleanDeletedEntries: includeDeletedIds,\n },\n now,\n )\n })\n\n const claimed = result.claimed.map(entry =>\n command.justId\n ? streamIdValue(entry.id)\n : entry.fields === null\n ? RedisValue.bulkString(null)\n : entryToReply(entry.id, entry.fields),\n )\n const deleted = result.deleted.map(id => streamIdValue(id))\n\n const reply = [streamIdValue(result.nextStartId), RedisValue.array(claimed)]\n if (includeDeletedIds) {\n reply.push(RedisValue.array(deleted))\n }\n return array(reply)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { StreamId } from '../../state/data-types'\nimport { array } from '../helpers'\nimport { requireStreamGroup } from './groups'\nimport { parseExactId, parseNonNegativeInteger } from './ids'\nimport { entryToReply, streamIdValue } from './replies'\n\ntype XclaimArgs = {\n key: Buffer\n group: Buffer\n consumer: Buffer\n minIdleMs: number\n ids: StreamId[]\n idleMs: number | null\n timeMs: number | null\n retryCount: number | null\n force: boolean\n justId: boolean\n lastId: StreamId | null\n}\n\nfunction createXclaimSchema() {\n return t.custom<XclaimArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const group = input[index + 1]\n const consumer = input[index + 2]\n const rawMinIdle = input[index + 3]\n if (!key || !group || !consumer || !rawMinIdle) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 4\n const ids: StreamId[] = []\n while (cursor < input.length && !isXclaimOption(input[cursor])) {\n ids.push(parseExactId(input[cursor].toString()))\n cursor++\n }\n if (ids.length === 0)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n let idleMs: number | null = null\n let timeMs: number | null = null\n let retryCount: number | null = null\n let force = false\n let justId = false\n let lastId: StreamId | null = null\n\n while (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (option === 'IDLE' || option === 'TIME' || option === 'RETRYCOUNT') {\n const rawValue = input[cursor + 1]\n if (!rawValue) throw new WrongNumberOfArgumentsError(ctx.commandName)\n const value = parseNonNegativeInteger(rawValue)\n if (option === 'IDLE') idleMs = value\n if (option === 'TIME') timeMs = value\n if (option === 'RETRYCOUNT') retryCount = value\n cursor += 2\n continue\n }\n\n if (option === 'FORCE') {\n force = true\n cursor++\n continue\n }\n\n if (option === 'JUSTID') {\n justId = true\n cursor++\n continue\n }\n\n if (option === 'LASTID') {\n const rawValue = input[cursor + 1]\n if (!rawValue) throw new WrongNumberOfArgumentsError(ctx.commandName)\n lastId = parseExactId(rawValue.toString())\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return {\n value: {\n key,\n group,\n consumer,\n minIdleMs: parseNonNegativeInteger(rawMinIdle),\n ids,\n idleMs,\n timeMs,\n retryCount,\n force,\n justId,\n lastId,\n },\n nextIndex: input.length,\n }\n },\n )\n}\n\nfunction isXclaimOption(token: Buffer): boolean {\n const option = token.toString().toUpperCase()\n return (\n option === 'IDLE' ||\n option === 'TIME' ||\n option === 'RETRYCOUNT' ||\n option === 'FORCE' ||\n option === 'JUSTID' ||\n option === 'LASTID'\n )\n}\n\nexport const xclaimCommand = defineCommand({\n name: 'xclaim',\n schema: t.object({ args: createXclaimSchema() }),\n flags: ['write'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n const now = Date.now()\n requireStreamGroup(\n ctx.db.getStream(command.key),\n command.key,\n command.group,\n )\n const claimed = ctx.db.updateStream(command.key, stream => {\n const group = requireStreamGroup(stream.value, command.key, command.group)\n return stream.claim(\n group,\n command.consumer,\n command.ids,\n {\n minIdleMs: command.minIdleMs,\n idleMs: command.idleMs,\n timeMs: command.timeMs,\n retryCount: command.retryCount,\n force: command.force,\n justId: command.justId,\n lastId: command.lastId,\n },\n now,\n )\n })\n\n const replies = claimed.map(entry =>\n command.justId\n ? streamIdValue(entry.id)\n : entryToReply(entry.id, entry.fields),\n )\n return array(replies)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\nimport { updateMaxDeletedId } from './groups'\nimport { compareStreamId, parseExactId } from './ids'\n\nexport const xdelCommand = defineCommand({\n name: 'xdel',\n schema: t.object({\n key: t.key(),\n ids: t.variadic(t.string(), { min: 1 }),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const targets = args.ids.map(parseExactId)\n // XDEL on a missing key returns 0 without creating the stream.\n if (ctx.db.getType(args.key) === null) {\n return integer(0)\n }\n\n const deleted = ctx.db.updateStream(args.key, stream =>\n stream.deleteEntries(targets, compareStreamId, entry =>\n updateMaxDeletedId(stream.value, entry.id),\n ),\n )\n // Streams are not removed when they become empty, matching Redis.\n return integer(deleted)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { StreamId } from '../../state/data-types'\nimport { integer, ok } from '../helpers'\nimport { BusyStreamGroupError, requireStreamGroup } from './groups'\nimport {\n bufferId,\n cloneStreamId,\n MIN_ID,\n parseExactId,\n parseNonNegativeInteger,\n} from './ids'\n\nclass XgroupCreateMissingKeyError extends RedisCommandError {\n constructor() {\n super(\n '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}\n\ntype XgroupArgs =\n | {\n subcommand: 'create'\n key: Buffer\n group: Buffer\n id: StreamId | '$'\n mkstream: boolean\n entriesRead: number | null\n }\n | {\n subcommand: 'setid'\n key: Buffer\n group: Buffer\n id: StreamId | '$'\n entriesRead: number | null\n }\n | { subcommand: 'destroy'; key: Buffer; group: Buffer }\n | {\n subcommand: 'createconsumer'\n key: Buffer\n group: Buffer\n consumer: Buffer\n }\n | { subcommand: 'delconsumer'; key: Buffer; group: Buffer; consumer: Buffer }\n\nfunction createXgroupSchema() {\n return t.custom<XgroupArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const subcommand = input[index]?.toString().toUpperCase()\n if (!subcommand) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n if (subcommand === 'CREATE' || subcommand === 'SETID') {\n const key = input[index + 1]\n const group = input[index + 2]\n const rawId = input[index + 3]?.toString()\n if (!key || !group || rawId === undefined) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 4\n let mkstream = false\n let entriesRead: number | null = null\n while (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (subcommand === 'CREATE' && option === 'MKSTREAM') {\n mkstream = true\n cursor++\n continue\n }\n\n if (option === 'ENTRIESREAD') {\n const rawEntriesRead = input[cursor + 1]\n if (!rawEntriesRead) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n entriesRead = parseNonNegativeInteger(rawEntriesRead)\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return {\n value: {\n subcommand: subcommand === 'CREATE' ? 'create' : 'setid',\n key,\n group,\n id: rawId === '$' ? '$' : parseExactId(rawId),\n mkstream,\n entriesRead,\n },\n nextIndex: input.length,\n }\n }\n\n if (subcommand === 'DESTROY') {\n const key = input[index + 1]\n const group = input[index + 2]\n if (!key || !group || input.length !== index + 3) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return {\n value: { subcommand: 'destroy', key, group },\n nextIndex: input.length,\n }\n }\n\n if (subcommand === 'CREATECONSUMER' || subcommand === 'DELCONSUMER') {\n const key = input[index + 1]\n const group = input[index + 2]\n const consumer = input[index + 3]\n if (!key || !group || !consumer || input.length !== index + 4) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return {\n value: {\n subcommand:\n subcommand === 'CREATECONSUMER'\n ? 'createconsumer'\n : 'delconsumer',\n key,\n group,\n consumer,\n },\n nextIndex: input.length,\n }\n }\n\n throw new RedisCommandError(\n `Unknown subcommand or wrong number of arguments for '${subcommand}'. Try XGROUP HELP.`,\n )\n },\n )\n}\n\nexport const xgroupCommand = defineCommand({\n name: 'xgroup',\n schema: t.object({ args: createXgroupSchema() }),\n flags: ['write'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n\n if (command.subcommand === 'create') {\n const type = ctx.db.getType(command.key)\n if (type === null && !command.mkstream) {\n throw new XgroupCreateMissingKeyError()\n }\n\n const lastDeliveredId =\n command.id === '$'\n ? (ctx.db.getStream(command.key)?.lastId ?? MIN_ID)\n : command.id\n\n ctx.db.updateStream(command.key, stream => {\n const groupId = bufferId(command.group)\n if (stream.value.groups.has(groupId)) {\n throw new BusyStreamGroupError()\n }\n\n stream.addGroup(groupId, {\n name: Buffer.from(command.group),\n lastDeliveredId: cloneStreamId(lastDeliveredId),\n entriesRead: command.entriesRead,\n consumers: new Map(),\n pending: new Map(),\n })\n })\n return ok()\n }\n\n if (command.subcommand === 'setid') {\n requireStreamGroup(\n ctx.db.getStream(command.key),\n command.key,\n command.group,\n )\n ctx.db.updateStream(command.key, stream => {\n const group = requireStreamGroup(\n stream.value,\n command.key,\n command.group,\n )\n const lastDeliveredId = command.id === '$' ? stream.lastId : command.id\n stream.setGroupId(group, lastDeliveredId, command.entriesRead)\n })\n return ok()\n }\n\n if (command.subcommand === 'destroy') {\n const stream = ctx.db.getStream(command.key)\n if (!stream) return integer(0)\n\n const removed = ctx.db.updateStream(command.key, writable => {\n return writable.deleteGroup(bufferId(command.group))\n })\n return integer(removed ? 1 : 0)\n }\n\n if (command.subcommand === 'createconsumer') {\n requireStreamGroup(\n ctx.db.getStream(command.key),\n command.key,\n command.group,\n )\n const created = ctx.db.updateStream(command.key, stream => {\n const group = requireStreamGroup(\n stream.value,\n command.key,\n command.group,\n )\n const consumerId = bufferId(command.consumer)\n return stream.addConsumer(group, consumerId, {\n name: Buffer.from(command.consumer),\n seenAt: Date.now(),\n activeAt: null,\n })\n })\n return integer(created ? 1 : 0)\n }\n\n requireStreamGroup(\n ctx.db.getStream(command.key),\n command.key,\n command.group,\n )\n const deleted = ctx.db.updateStream(command.key, stream => {\n const group = requireStreamGroup(stream.value, command.key, command.group)\n const consumerId = bufferId(command.consumer)\n return stream.deleteConsumer(group, consumerId)\n })\n return integer(deleted)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n NoSuchKeyError,\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type {\n RedisStreamConsumer,\n RedisStreamConsumerGroup,\n RedisStreamData,\n} from '../../state/data-types'\nimport { array } from '../helpers'\nimport {\n consumerPendingCount,\n pendingEntriesSorted,\n requireStreamGroup,\n streamLag,\n} from './groups'\nimport { parseNonNegativeInteger } from './ids'\nimport {\n bulkString,\n entryToReply,\n integerValue,\n nullBulk,\n streamIdValue,\n} from './replies'\n\ntype XinfoArgs =\n | { subcommand: 'stream'; key: Buffer; full: boolean; count: number | null }\n | { subcommand: 'groups'; key: Buffer }\n | { subcommand: 'consumers'; key: Buffer; group: Buffer }\n\nfunction createXinfoSchema() {\n return t.custom<XinfoArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const subcommand = input[index]?.toString().toUpperCase()\n if (!subcommand) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n if (subcommand === 'STREAM') {\n const key = input[index + 1]\n if (!key) throw new WrongNumberOfArgumentsError(ctx.commandName)\n let cursor = index + 2\n let full = false\n let count: number | null = null\n\n if (cursor < input.length) {\n if (input[cursor].toString().toUpperCase() !== 'FULL') {\n throw new RedisSyntaxError()\n }\n full = true\n cursor++\n }\n\n if (cursor < input.length) {\n if (input[cursor].toString().toUpperCase() !== 'COUNT') {\n throw new RedisSyntaxError()\n }\n const rawCount = input[cursor + 1]\n if (!rawCount) throw new WrongNumberOfArgumentsError(ctx.commandName)\n count = parseNonNegativeInteger(rawCount)\n cursor += 2\n }\n\n if (cursor !== input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return {\n value: { subcommand: 'stream', key, full, count },\n nextIndex: input.length,\n }\n }\n\n if (subcommand === 'GROUPS') {\n const key = input[index + 1]\n if (!key || input.length !== index + 2) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return {\n value: { subcommand: 'groups', key },\n nextIndex: input.length,\n }\n }\n\n if (subcommand === 'CONSUMERS') {\n const key = input[index + 1]\n const group = input[index + 2]\n if (!key || !group || input.length !== index + 3) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n return {\n value: { subcommand: 'consumers', key, group },\n nextIndex: input.length,\n }\n }\n\n throw new RedisCommandError(\n `unknown subcommand '${subcommand}'. Try XINFO HELP.`,\n )\n },\n )\n}\n\nexport const xinfoCommand = defineCommand({\n name: 'xinfo',\n schema: t.object({ args: createXinfoSchema() }),\n flags: ['readonly'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n const stream = ctx.db.getStream(command.key)\n if (!stream) throw new NoSuchKeyError()\n\n if (command.subcommand === 'stream') {\n // XINFO replies are field/value maps: a flat array on RESP2, a `%` map on\n // RESP3 (matching real Redis). first/last-entry and PEL rows stay arrays.\n return RedisResult.create(\n kvMap(streamInfoReply(stream, command.full, command.count)),\n )\n }\n\n if (command.subcommand === 'groups') {\n return array(Array.from(stream.groups.values(), groupInfoReply(stream)))\n }\n\n const group = requireStreamGroup(stream, command.key, command.group)\n const now = Date.now()\n return array(\n Array.from(group.consumers.entries()).map(([consumerId, consumer]) =>\n consumerInfoReply(group, consumerId, consumer, now),\n ),\n )\n },\n})\n\n// Pair a flat [key, value, ...] list into a `map` reply: encoded flat on RESP2\n// (unchanged from the previous array form) and as a `%` map on RESP3.\nfunction kvMap(flat: RedisValue[]): RedisValue {\n const entries: [RedisValue, RedisValue][] = []\n for (let i = 0; i < flat.length; i += 2) {\n entries.push([flat[i], flat[i + 1]])\n }\n return RedisValue.map(entries)\n}\n\nfunction streamInfoReply(\n stream: RedisStreamData,\n full: boolean,\n count: number | null,\n): RedisValue[] {\n const firstEntry = stream.entries[0] ?? null\n const lastEntry = stream.entries[stream.entries.length - 1] ?? null\n\n const fields: RedisValue[] = [\n bulkString('length'),\n integerValue(stream.entries.length),\n bulkString('radix-tree-keys'),\n integerValue(stream.entries.length > 0 ? 1 : 0),\n bulkString('radix-tree-nodes'),\n integerValue(stream.entries.length > 0 ? 2 : 1),\n bulkString('last-generated-id'),\n streamIdValue(stream.lastId),\n bulkString('max-deleted-entry-id'),\n streamIdValue(stream.maxDeletedEntryId),\n bulkString('entries-added'),\n integerValue(stream.entriesAdded),\n bulkString('recorded-first-entry-id'),\n firstEntry ? streamIdValue(firstEntry.id) : bulkString('0-0'),\n bulkString('groups'),\n ]\n\n if (!full) {\n fields.push(\n integerValue(stream.groups.size),\n bulkString('first-entry'),\n firstEntry ? entryToReply(firstEntry.id, firstEntry.fields) : nullBulk(),\n bulkString('last-entry'),\n lastEntry ? entryToReply(lastEntry.id, lastEntry.fields) : nullBulk(),\n )\n return fields\n }\n\n const fullCount = count ?? 10\n fields.push(\n RedisValue.array(\n Array.from(stream.groups.values(), group =>\n fullGroupInfoReply(stream, group, fullCount),\n ),\n ),\n bulkString('entries'),\n RedisValue.array(\n stream.entries\n .slice(0, fullCount)\n .map(entry => entryToReply(entry.id, entry.fields)),\n ),\n )\n return fields\n}\n\nfunction groupInfoReply(stream: RedisStreamData) {\n return (group: RedisStreamConsumerGroup): RedisValue =>\n kvMap([\n bulkString('name'),\n bulkString(group.name),\n bulkString('consumers'),\n integerValue(group.consumers.size),\n bulkString('pending'),\n integerValue(group.pending.size),\n bulkString('last-delivered-id'),\n streamIdValue(group.lastDeliveredId),\n bulkString('entries-read'),\n group.entriesRead === null ? nullBulk() : integerValue(group.entriesRead),\n bulkString('lag'),\n integerValue(streamLag(stream, group)),\n ])\n}\n\nfunction fullGroupInfoReply(\n stream: RedisStreamData,\n group: RedisStreamConsumerGroup,\n count: number,\n): RedisValue {\n return kvMap([\n bulkString('name'),\n bulkString(group.name),\n bulkString('last-delivered-id'),\n streamIdValue(group.lastDeliveredId),\n bulkString('entries-read'),\n group.entriesRead === null ? nullBulk() : integerValue(group.entriesRead),\n bulkString('lag'),\n integerValue(streamLag(stream, group)),\n bulkString('pel-count'),\n integerValue(group.pending.size),\n bulkString('pending'),\n RedisValue.array(\n pendingEntriesSorted(group)\n .slice(0, count)\n .map(pending =>\n RedisValue.array([\n streamIdValue(pending.id),\n bulkString(\n group.consumers.get(pending.consumerId)?.name ??\n Buffer.from(pending.consumerId, 'hex'),\n ),\n integerValue(Math.max(0, Date.now() - pending.deliveredAt)),\n integerValue(pending.deliveryCount),\n ]),\n ),\n ),\n bulkString('consumers'),\n RedisValue.array(\n Array.from(group.consumers.entries()).map(([consumerId, consumer]) =>\n consumerInfoReply(group, consumerId, consumer, Date.now()),\n ),\n ),\n ])\n}\n\nfunction consumerInfoReply(\n group: RedisStreamConsumerGroup,\n consumerId: string,\n consumer: RedisStreamConsumer,\n now: number,\n): RedisValue {\n const idle = Math.max(0, now - consumer.seenAt)\n const inactive =\n consumer.activeAt === null ? idle : Math.max(0, now - consumer.activeAt)\n return kvMap([\n bulkString('name'),\n bulkString(consumer.name),\n bulkString('pending'),\n integerValue(consumerPendingCount(group, consumerId)),\n bulkString('idle'),\n integerValue(idle),\n bulkString('inactive'),\n integerValue(inactive),\n ])\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\n\nexport const xlenCommand = defineCommand({\n name: 'xlen',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const stream = ctx.db.getStream(args.key)\n return integer(stream?.entries.length ?? 0)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport { WrongNumberOfArgumentsError } from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport { array } from '../helpers'\nimport { pendingEntriesSorted, requireStreamGroup } from './groups'\nimport {\n bufferId,\n compareStreamId,\n exclusiveAware,\n parseNonNegativeInteger,\n parseRangeId,\n type RangeBound,\n} from './ids'\nimport { bulkString, integerValue, nullBulk, streamIdValue } from './replies'\n\ntype XpendingArgs =\n | { mode: 'summary'; key: Buffer; group: Buffer }\n | {\n mode: 'range'\n key: Buffer\n group: Buffer\n minIdleMs: number | null\n start: RangeBound\n end: RangeBound\n count: number\n consumer: Buffer | null\n }\n\nfunction createXpendingSchema() {\n return t.custom<XpendingArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const group = input[index + 1]\n if (!key || !group) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n if (input.length === index + 2) {\n return {\n value: { mode: 'summary', key, group },\n nextIndex: input.length,\n }\n }\n\n let cursor = index + 2\n let minIdleMs: number | null = null\n if (input[cursor]?.toString().toUpperCase() === 'IDLE') {\n const raw = input[cursor + 1]\n if (!raw) throw new WrongNumberOfArgumentsError(ctx.commandName)\n minIdleMs = parseNonNegativeInteger(raw)\n cursor += 2\n }\n\n const startToken = input[cursor]?.toString()\n const endToken = input[cursor + 1]?.toString()\n const rawCount = input[cursor + 2]\n if (startToken === undefined || endToken === undefined || !rawCount) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n cursor += 3\n\n const consumer = input[cursor] ?? null\n if (cursor + (consumer ? 1 : 0) !== input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return {\n value: {\n mode: 'range',\n key,\n group,\n minIdleMs,\n start: parseRangeId(startToken, true),\n end: parseRangeId(endToken, false),\n count: parseNonNegativeInteger(rawCount),\n consumer,\n },\n nextIndex: input.length,\n }\n },\n )\n}\n\nexport const xpendingCommand = defineCommand({\n name: 'xpending',\n schema: t.object({ args: createXpendingSchema() }),\n flags: ['readonly'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n const stream = ctx.db.getStream(command.key)\n const group = requireStreamGroup(stream, command.key, command.group)\n\n if (command.mode === 'summary') {\n const pending = pendingEntriesSorted(group)\n if (pending.length === 0) {\n return array([\n integerValue(0),\n nullBulk(),\n nullBulk(),\n RedisValue.array([]),\n ])\n }\n\n const counts = new Map<string, number>()\n for (const entry of pending) {\n counts.set(entry.consumerId, (counts.get(entry.consumerId) ?? 0) + 1)\n }\n\n return array([\n integerValue(pending.length),\n streamIdValue(pending[0].id),\n streamIdValue(pending[pending.length - 1].id),\n RedisValue.array(\n Array.from(counts, ([consumerId, count]) => {\n const consumer = group.consumers.get(consumerId)\n return RedisValue.array([\n bulkString(consumer?.name ?? Buffer.from(consumerId, 'hex')),\n integerValue(count),\n ])\n }),\n ),\n ])\n }\n\n const now = Date.now()\n const consumerId = command.consumer ? bufferId(command.consumer) : null\n const replies: RedisValue[] = []\n for (const pending of pendingEntriesSorted(group)) {\n if (\n !exclusiveAware(\n compareStreamId(pending.id, command.start.id),\n command.start.exclusive,\n true,\n )\n ) {\n continue\n }\n if (\n !exclusiveAware(\n compareStreamId(pending.id, command.end.id),\n command.end.exclusive,\n false,\n )\n ) {\n continue\n }\n if (consumerId !== null && pending.consumerId !== consumerId) continue\n\n const idleMs = Math.max(0, now - pending.deliveredAt)\n if (command.minIdleMs !== null && idleMs < command.minIdleMs) continue\n\n const consumer = group.consumers.get(pending.consumerId)\n replies.push(\n RedisValue.array([\n streamIdValue(pending.id),\n bulkString(consumer?.name ?? Buffer.from(pending.consumerId, 'hex')),\n integerValue(idleMs),\n integerValue(pending.deliveryCount),\n ]),\n )\n if (replies.length >= command.count) break\n }\n\n return array(replies)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n ExpectedIntegerError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisStreamData } from '../../state/data-types'\nimport { array } from '../helpers'\nimport { compareStreamId, exclusiveAware, parseRangeId } from './ids'\nimport { entryToReply } from './replies'\n\nfunction rangeReply(\n stream: RedisStreamData | null,\n startTok: string,\n endTok: string,\n count: number | null,\n reverse: boolean,\n): RedisValue[] {\n if (!stream) return []\n\n const start = parseRangeId(startTok, true)\n const end = parseRangeId(endTok, false)\n\n const items: RedisValue[] = []\n for (const entry of stream.entries) {\n const afterStart = exclusiveAware(\n compareStreamId(entry.id, start.id),\n start.exclusive,\n true,\n )\n const beforeEnd = exclusiveAware(\n compareStreamId(entry.id, end.id),\n end.exclusive,\n false,\n )\n if (afterStart && beforeEnd) {\n items.push(entryToReply(entry.id, entry.fields))\n }\n }\n\n if (reverse) items.reverse()\n if (count !== null && count >= 0 && items.length > count) {\n items.length = count\n }\n return items\n}\n\n// Optional `COUNT <n>` tail for XRANGE/XREVRANGE. Returns null when absent.\nfunction createCountSchema() {\n return t.custom<number | null>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n if (index >= input.length) {\n return { value: null, nextIndex: index }\n }\n if (input[index].toString().toUpperCase() !== 'COUNT') {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const raw = input[index + 1]\n if (raw === undefined) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n const value = Number(raw.toString())\n if (!Number.isInteger(value)) {\n throw new ExpectedIntegerError()\n }\n return { value, nextIndex: index + 2 }\n },\n )\n}\n\nexport const xrangeCommand = defineCommand({\n name: 'xrange',\n schema: t.object({\n key: t.key(),\n start: t.string(),\n end: t.string(),\n count: createCountSchema(),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const stream = ctx.db.getStream(args.key)\n return array(rangeReply(stream, args.start, args.end, args.count, false))\n },\n})\n\nexport const xrevrangeCommand = defineCommand({\n name: 'xrevrange',\n schema: t.object({\n key: t.key(),\n end: t.string(),\n start: t.string(),\n count: createCountSchema(),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const stream = ctx.db.getStream(args.key)\n return array(rangeReply(stream, args.start, args.end, args.count, true))\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { StreamId } from '../../state/data-types'\nimport { bulk } from '../helpers'\nimport { compareStreamId, MIN_ID, parseExactId } from './ids'\nimport { entryToReply } from './replies'\n\n// XREAD [COUNT count] STREAMS key [key ...] id [id ...]\n// `$` means \"start after the stream's current last id\"; `+` means \"return the stream's latest entry\".\ntype XreadStream = { key: Buffer; afterId: StreamId | '$' | '+' }\n\nfunction createXreadSchema() {\n return t.custom<{\n count: number | null\n blockMs: number | null\n streams: XreadStream[]\n }>((input: readonly Buffer[], index: number, ctx: ParseContext) => {\n let cursor = index\n let count: number | null = null\n let blockMs: number | null = null\n\n // Optional COUNT <n> and BLOCK <ms> in any order\n while (cursor < input.length) {\n const token = input[cursor].toString().toUpperCase()\n if (token === 'COUNT') {\n cursor++\n const raw = input[cursor]?.toString()\n if (raw === undefined)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 0) throw new RedisSyntaxError()\n count = n\n cursor++\n } else if (token === 'BLOCK') {\n cursor++\n const raw = input[cursor]?.toString()\n if (raw === undefined)\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n const ms = Number(raw)\n if (!Number.isInteger(ms) || ms < 0) throw new RedisSyntaxError()\n blockMs = ms\n cursor++\n } else {\n break\n }\n }\n\n // Required STREAMS keyword\n if (\n cursor >= input.length ||\n input[cursor].toString().toUpperCase() !== 'STREAMS'\n ) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n cursor++\n\n // Remaining tokens: first half = keys, second half = ids\n const remaining = input.length - cursor\n if (remaining === 0 || remaining % 2 !== 0) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const half = remaining / 2\n const streams: XreadStream[] = []\n for (let i = 0; i < half; i++) {\n const key = input[cursor + i]\n const idTok = input[cursor + half + i].toString()\n let afterId: XreadStream['afterId']\n if (idTok === '$') {\n afterId = '$'\n } else if (idTok === '+' && ctx.profile.has('xread.plus-id')) {\n afterId = '+'\n } else {\n afterId = parseExactId(idTok)\n }\n streams.push({ key, afterId })\n }\n\n return { value: { count, blockMs, streams }, nextIndex: input.length }\n })\n}\n\ntype ResolvedXreadStream =\n | { key: Buffer; kind: 'after'; afterId: StreamId }\n | { key: Buffer; kind: 'latest' }\n\nfunction readStreamEntries(\n streams: ResolvedXreadStream[],\n count: number | null,\n ctx: RedisExecutionContext,\n): RedisResult | null {\n const results: [RedisValue, RedisValue][] = []\n\n for (const request of streams) {\n const { key } = request\n const stream = ctx.db.getStream(key)\n if (!stream) continue\n\n const entries: RedisValue[] = []\n\n if (request.kind === 'latest') {\n const entry = stream.entries.at(-1)\n if (entry) {\n entries.push(entryToReply(entry.id, entry.fields))\n }\n } else {\n for (const entry of stream.entries) {\n if (compareStreamId(entry.id, request.afterId) > 0) {\n entries.push(entryToReply(entry.id, entry.fields))\n if (count !== null && count > 0 && entries.length >= count) break\n }\n }\n }\n\n if (entries.length > 0) {\n results.push([RedisValue.bulkString(key), RedisValue.array(entries)])\n }\n }\n\n return results.length > 0\n ? RedisResult.create(RedisValue.mapPairs(results))\n : null\n}\n\nasync function blockingXread(\n streams: ResolvedXreadStream[],\n count: number | null,\n blockMs: number,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs = blockMs === 0 ? undefined : blockMs\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n const keys = streams.map(s => s.key)\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return bulk(null)\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return bulk(null)\n\n const result = readStreamEntries(streams, count, ctx)\n if (result) return result\n }\n}\n\nexport const xreadCommand = defineCommand({\n name: 'xread',\n schema: t.object({ args: createXreadSchema() }),\n flags: ['readonly'],\n keys: args => args.args.streams.map(s => s.key),\n execute: (args, ctx) => {\n const { count, blockMs, streams } = args.args\n\n // Resolve '$' to the stream's current last ID before any blocking,\n // so entries added after this call (not before) are returned.\n const resolved: ResolvedXreadStream[] = streams.map(s => {\n if (s.afterId === '+') {\n return { key: s.key, kind: 'latest' }\n }\n\n return {\n key: s.key,\n kind: 'after',\n afterId:\n s.afterId === '$'\n ? (ctx.db.getStream(s.key)?.lastId ?? MIN_ID)\n : s.afterId,\n }\n })\n\n const immediate = readStreamEntries(resolved, count, ctx)\n if (immediate || blockMs === null) return immediate ?? bulk(null)\n\n return blockingXread(resolved, count, blockMs, ctx)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport { WrongNumberOfArgumentsError } from '../../core/redis-error'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { StreamId } from '../../state/data-types'\nimport { bulk } from '../helpers'\nimport { requireStreamGroup } from './groups'\nimport { parseExactId, parseNonNegativeInteger } from './ids'\nimport { bulkString, deletedEntryToReply, entryToReply } from './replies'\n\ntype XreadGroupStream = { key: Buffer; id: StreamId | '>' }\n\nfunction createXreadGroupSchema() {\n return t.custom<{\n group: Buffer\n consumer: Buffer\n count: number | null\n blockMs: number | null\n noack: boolean\n streams: XreadGroupStream[]\n }>((input: readonly Buffer[], index: number, ctx: ParseContext) => {\n if (input[index]?.toString().toUpperCase() !== 'GROUP') {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const group = input[index + 1]\n const consumer = input[index + 2]\n if (!group || !consumer) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 3\n let count: number | null = null\n let blockMs: number | null = null\n let noack = false\n\n while (cursor < input.length) {\n const token = input[cursor].toString().toUpperCase()\n if (token === 'COUNT') {\n const raw = input[cursor + 1]\n if (!raw) throw new WrongNumberOfArgumentsError(ctx.commandName)\n count = parseNonNegativeInteger(raw)\n cursor += 2\n continue\n }\n\n if (token === 'BLOCK') {\n const raw = input[cursor + 1]\n if (!raw) throw new WrongNumberOfArgumentsError(ctx.commandName)\n blockMs = parseNonNegativeInteger(raw)\n cursor += 2\n continue\n }\n\n if (token === 'NOACK') {\n noack = true\n cursor++\n continue\n }\n\n break\n }\n\n if (\n cursor >= input.length ||\n input[cursor].toString().toUpperCase() !== 'STREAMS'\n ) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n cursor++\n\n const remaining = input.length - cursor\n if (remaining === 0 || remaining % 2 !== 0) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const half = remaining / 2\n const streams: XreadGroupStream[] = []\n for (let i = 0; i < half; i++) {\n const key = input[cursor + i]\n const rawId = input[cursor + half + i].toString()\n streams.push({\n key,\n id: rawId === '>' ? '>' : parseExactId(rawId),\n })\n }\n\n return {\n value: { group, consumer, count, blockMs, noack, streams },\n nextIndex: input.length,\n }\n })\n}\n\nfunction readGroupEntries(\n groupName: Buffer,\n consumerName: Buffer,\n streams: XreadGroupStream[],\n count: number | null,\n noack: boolean,\n ctx: RedisExecutionContext,\n): RedisResult | null {\n const now = Date.now()\n const results: [RedisValue, RedisValue][] = []\n\n for (const { key } of streams) {\n requireStreamGroup(ctx.db.getStream(key), key, groupName, 'XREADGROUP')\n }\n\n for (const { key, id } of streams) {\n const delivered = ctx.db.updateStream(key, stream => {\n const group = requireStreamGroup(\n stream.value,\n key,\n groupName,\n 'XREADGROUP',\n )\n return stream.readGroup(group, consumerName, id, { count, noack }, now)\n })\n\n const entries = delivered.map(item =>\n item.fields === null\n ? deletedEntryToReply(item.id)\n : entryToReply(item.id, item.fields),\n )\n\n if (entries.length > 0 || id !== '>') {\n results.push([bulkString(key), RedisValue.array(entries)])\n }\n }\n\n return results.length > 0\n ? RedisResult.create(RedisValue.mapPairs(results))\n : null\n}\n\nasync function blockingXreadGroup(\n groupName: Buffer,\n consumerName: Buffer,\n streams: XreadGroupStream[],\n count: number | null,\n noack: boolean,\n blockMs: number,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs = blockMs === 0 ? undefined : blockMs\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n const keys = streams.map(s => s.key)\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return bulk(null)\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return bulk(null)\n\n const result = readGroupEntries(\n groupName,\n consumerName,\n streams,\n count,\n noack,\n ctx,\n )\n if (result) return result\n }\n}\n\nexport const xreadgroupCommand = defineCommand({\n name: 'xreadgroup',\n schema: t.object({ args: createXreadGroupSchema() }),\n flags: ['write', 'blocking'],\n capabilities: { blocking: true },\n keys: args => args.args.streams.map(s => s.key),\n execute: (args, ctx) => {\n const { group, consumer, streams, count, blockMs, noack } = args.args\n const immediate = readGroupEntries(\n group,\n consumer,\n streams,\n count,\n noack,\n ctx,\n )\n if (\n immediate ||\n blockMs === null ||\n streams.some(stream => stream.id !== '>')\n ) {\n return immediate ?? bulk(null)\n }\n\n return blockingXreadGroup(\n group,\n consumer,\n streams,\n count,\n noack,\n blockMs,\n ctx,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n NoSuchKeyError,\n RedisCommandError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type { StreamId } from '../../state/data-types'\nimport { ok } from '../helpers'\nimport { compareStreamId, parseExactId, parseNonNegativeInteger } from './ids'\n\nclass XsetidSmallerThanTopError extends RedisCommandError {\n constructor() {\n super(\n 'The ID specified in XSETID is smaller than the target stream top item',\n )\n }\n}\n\ntype XsetidArgs = {\n key: Buffer\n id: StreamId\n entriesAdded: number | null\n maxDeletedId: StreamId | null\n}\n\nfunction createXsetidSchema() {\n return t.custom<XsetidArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const rawId = input[index + 1]\n if (!key || !rawId) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 2\n let entriesAdded: number | null = null\n let maxDeletedId: StreamId | null = null\n while (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (option === 'ENTRIESADDED') {\n const rawEntriesAdded = input[cursor + 1]\n if (!rawEntriesAdded) throw new RedisSyntaxError()\n entriesAdded = parseNonNegativeInteger(rawEntriesAdded)\n cursor += 2\n continue\n }\n\n if (option === 'MAXDELETEDID') {\n const rawMaxDeletedId = input[cursor + 1]\n if (!rawMaxDeletedId) throw new RedisSyntaxError()\n maxDeletedId = parseExactId(rawMaxDeletedId.toString())\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return {\n value: {\n key,\n id: parseExactId(rawId.toString()),\n entriesAdded,\n maxDeletedId,\n },\n nextIndex: input.length,\n }\n },\n )\n}\n\nexport const xsetidCommand = defineCommand({\n name: 'xsetid',\n schema: t.object({ args: createXsetidSchema() }),\n flags: ['write', 'fast'],\n keys: args => [args.args.key],\n execute: (args, ctx) => {\n const command = args.args\n const stream = ctx.db.getStream(command.key)\n if (!stream) throw new NoSuchKeyError()\n if (compareStreamId(command.id, stream.lastId) < 0) {\n throw new XsetidSmallerThanTopError()\n }\n\n ctx.db.updateStream(command.key, writable => {\n writable.setId(command.id, {\n entriesAdded: command.entriesAdded,\n maxDeletedId: command.maxDeletedId,\n })\n })\n\n return ok()\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\nimport { applyTrim, createTrimSpecSchema } from './trim'\n\nexport const xtrimCommand = defineCommand({\n name: 'xtrim',\n schema: t.object({\n key: t.key(),\n trim: createTrimSpecSchema(),\n }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (ctx.db.getType(args.key) === null) {\n return integer(0)\n }\n const removed = ctx.db.updateStream(args.key, stream =>\n stream.trim(value => applyTrim(value, args.trim)),\n )\n return integer(removed)\n },\n})\n","import { xackCommand } from './xack'\nimport { xaddCommand } from './xadd'\nimport { xautoclaimCommand } from './xautoclaim'\nimport { xclaimCommand } from './xclaim'\nimport { xdelCommand } from './xdel'\nimport { xgroupCommand } from './xgroup'\nimport { xinfoCommand } from './xinfo'\nimport { xlenCommand } from './xlen'\nimport { xpendingCommand } from './xpending'\nimport { xrangeCommand, xrevrangeCommand } from './xrange'\nimport { xreadCommand } from './xread'\nimport { xreadgroupCommand } from './xreadgroup'\nimport { xsetidCommand } from './xsetid'\nimport { xtrimCommand } from './xtrim'\n\nexport const streamsCommands = [\n xaddCommand,\n xlenCommand,\n xrangeCommand,\n xrevrangeCommand,\n xdelCommand,\n xtrimCommand,\n xreadCommand,\n xgroupCommand,\n xreadgroupCommand,\n xackCommand,\n xpendingCommand,\n xclaimCommand,\n xautoclaimCommand,\n xinfoCommand,\n xsetidCommand,\n]\n\nexport {\n xackCommand,\n xaddCommand,\n xautoclaimCommand,\n xclaimCommand,\n xdelCommand,\n xgroupCommand,\n xinfoCommand,\n xlenCommand,\n xpendingCommand,\n xrangeCommand,\n xreadCommand,\n xreadgroupCommand,\n xrevrangeCommand,\n xsetidCommand,\n xtrimCommand,\n}\n","import { defineCommand } from '../core/command-definition'\nimport {\n parseFiniteFloatToken,\n t,\n type CommandSchema,\n type ParseContext,\n} from '../core/command-schema'\nimport type { RedisDatabase } from '../state'\nimport {\n ExpectedFloatError,\n IncrByFloatNanOrInfinityError,\n IncrDecrOverflowError,\n InvalidExpireTimeError,\n OffsetOutOfRangeError,\n RedisSyntaxError,\n WrongTypeRedisError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport {\n bulk,\n ensureStringOrMissing,\n INT64_MAX,\n INT64_MIN,\n integer,\n ok,\n parseInt64Token,\n parseIntegerToken,\n parsePositiveExpireToken,\n requireNextOptionValue,\n} from './helpers'\nimport {\n commandDocs,\n commandKeyArgument,\n commandKeySpec,\n} from './introspection'\n\ntype SetCondition = 'NX' | 'XX'\n\ntype SetArgs = {\n key: Buffer\n value: Buffer\n condition?: SetCondition\n expiresAt?: number\n keepTtl?: boolean\n get?: boolean\n}\n\nexport const getCommand = defineCommand({\n name: 'get',\n schema: t.object({\n key: t.key(),\n }),\n flags: ['readonly', 'fast'],\n introspection: {\n arity: 2,\n flags: ['readonly', 'fast'],\n firstKey: 1,\n lastKey: 1,\n keyStep: 1,\n categories: ['@read', '@string', '@fast'],\n keySpecs: [commandKeySpec(1, 0, 1, ['RO', 'access'])],\n docs: commandDocs('Returns the string value of a key.', 'string', [\n commandKeyArgument('key', 0),\n ]),\n },\n keys: args => [args.key],\n execute: (args, ctx) => bulk(ensureStringOrMissing(ctx.db, args.key)),\n})\n\nexport const setCommand = defineCommand({\n name: 'set',\n schema: createSetSchema(),\n flags: ['write', 'denyoom'],\n introspection: {\n arity: -3,\n flags: ['write', 'denyoom'],\n firstKey: 1,\n lastKey: 1,\n keyStep: 1,\n categories: ['@write', '@string', '@slow'],\n keySpecs: [\n commandKeySpec(1, 0, 1, ['RW', 'access', 'update', 'variable_flags'], {\n notes: 'RW and ACCESS due to the optional `GET` argument',\n }),\n ],\n docs: commandDocs('Set the string value of a key', 'string', [\n commandKeyArgument('key', 0),\n { name: 'value', type: 'string' },\n ]),\n },\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existingType = ctx.db.getType(args.key)\n let oldValue: Buffer | null = null\n\n if (args.get) {\n if (existingType === 'string') {\n oldValue = ctx.db.getString(args.key)\n } else if (existingType !== null) {\n throw new WrongTypeRedisError()\n }\n }\n\n if (args.condition === 'NX' && existingType !== null) {\n return args.get ? bulk(oldValue) : RedisResult.nil()\n }\n\n if (args.condition === 'XX' && existingType === null) {\n return args.get ? bulk(null) : RedisResult.nil()\n }\n\n ctx.db.setString(args.key, args.value, {\n expiresAt: args.expiresAt,\n keepTtl: args.keepTtl,\n })\n\n if (args.get) {\n return bulk(oldValue)\n }\n\n return ok()\n },\n})\n\nexport const mgetCommand = defineCommand({\n name: 'mget',\n schema: t.object({\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['readonly'],\n introspection: {\n arity: -2,\n flags: ['readonly', 'fast'],\n firstKey: 1,\n lastKey: -1,\n keyStep: 1,\n categories: ['@read', '@string', '@fast'],\n tips: ['request_policy:multi_shard'],\n keySpecs: [commandKeySpec(1, -1, 1, ['RO', 'access'])],\n docs: commandDocs('Get the values of all the given keys', 'string', [\n commandKeyArgument('key', 0, { flags: ['multiple'] }),\n ]),\n },\n keys: args => args.keys,\n execute: (args, ctx) =>\n RedisResult.create(\n RedisValue.array(\n args.keys.map(key => {\n const value =\n ctx.db.getType(key) === 'string' ? ctx.db.getString(key) : null\n return RedisValue.bulkString(value)\n }),\n ),\n ),\n})\n\nexport const appendCommand = defineCommand({\n name: 'append',\n schema: t.object({ key: t.key(), value: t.key() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n const next = existing ? Buffer.concat([existing, args.value]) : args.value\n ctx.db.setString(args.key, next, { keepTtl: true })\n return integer(next.length)\n },\n})\n\nexport const strlenCommand = defineCommand({\n name: 'strlen',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n return integer(existing?.byteLength ?? 0)\n },\n})\n\nexport const incrCommand = defineCommand({\n name: 'incr',\n schema: t.object({ key: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => incrementBy(ctx.db, args.key, 1n),\n})\n\nexport const decrCommand = defineCommand({\n name: 'decr',\n schema: t.object({ key: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => incrementBy(ctx.db, args.key, -1n),\n})\n\nexport const incrbyCommand = defineCommand({\n name: 'incrby',\n schema: t.object({\n key: t.key(),\n amount: t.bigInteger({ min: INT64_MIN, max: INT64_MAX }),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => incrementBy(ctx.db, args.key, args.amount),\n})\n\nexport const decrbyCommand = defineCommand({\n name: 'decrby',\n schema: t.object({\n key: t.key(),\n amount: t.bigInteger({ min: INT64_MIN, max: INT64_MAX }),\n }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n // Negating INT64_MIN overflows int64, so Redis rejects it before the op.\n if (args.amount === INT64_MIN) {\n throw new IncrDecrOverflowError('decrement would overflow')\n }\n return incrementBy(ctx.db, args.key, -args.amount)\n },\n})\n\nexport const incrbyfloatCommand = defineCommand({\n name: 'incrbyfloat',\n schema: t.object({ key: t.key(), amount: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n // Like real Redis, an infinity literal (\"inf\"/\"+inf\"/\"-inf\"/\"infinity\",\n // any case) is a *valid* operand — it only fails the post-arithmetic\n // NaN/Infinity check. A non-numeric or overflow-magnitude value (e.g.\n // \"nan\", \"abc\", \"1e5000\") is a parse error (\"value is not a valid float\").\n const increment = parseIncrByFloatValue(args.amount.toString())\n\n const existing = ensureStringOrMissing(ctx.db, args.key)\n let current = 0\n if (existing) {\n current = parseIncrByFloatValue(existing.toString())\n }\n\n const next = current + increment\n if (!Number.isFinite(next)) {\n throw new IncrByFloatNanOrInfinityError()\n }\n\n const valueBuf = Buffer.from(next.toString())\n ctx.db.setString(args.key, valueBuf, { keepTtl: true })\n return bulk(valueBuf)\n },\n})\n\n// Parses an INCRBYFLOAT operand the way real Redis does (strtold): an infinity\n// literal is accepted (and returned as +/-Infinity) so the result check can\n// flag it, while NaN and finite-overflow magnitudes are rejected as invalid\n// floats. No surrounding whitespace is allowed and the *whole* token must be a\n// valid decimal float — \"3abc\", \" 3.5\", and \"1,5\" are parse errors, not silent\n// prefix parses (unlike JS parseFloat).\nfunction parseIncrByFloatValue(raw: string): number {\n if (/^[+-]?inf(inity)?$/i.test(raw)) {\n return raw.startsWith('-') ? -Infinity : Infinity\n }\n\n const value = parseFiniteFloatToken(raw)\n if (value === undefined) {\n throw new ExpectedFloatError()\n }\n return value\n}\n\nexport const getsetCommand = defineCommand({\n name: 'getset',\n schema: t.object({ key: t.key(), value: t.key() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n ctx.db.setString(args.key, args.value)\n return bulk(existing)\n },\n})\n\nexport const getdelCommand = defineCommand({\n name: 'getdel',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({ key: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (existing === null) {\n return bulk(null)\n }\n ctx.db.delete(args.key)\n return bulk(existing)\n },\n})\n\nexport const setnxCommand = defineCommand({\n name: 'setnx',\n schema: t.object({ key: t.key(), value: t.key() }),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (ctx.db.getType(args.key) !== null) {\n return integer(0)\n }\n ctx.db.setString(args.key, args.value)\n return integer(1)\n },\n})\n\nexport const setexCommand = defineCommand({\n name: 'setex',\n schema: t.object({\n key: t.key(),\n seconds: t.integer(),\n value: t.key(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.seconds <= 0) {\n throw new InvalidExpireTimeError('setex')\n }\n ctx.db.setString(args.key, args.value, {\n expiresAt: Date.now() + args.seconds * 1000,\n })\n return ok()\n },\n})\n\nexport const psetexCommand = defineCommand({\n name: 'psetex',\n schema: t.object({\n key: t.key(),\n milliseconds: t.integer(),\n value: t.key(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.milliseconds <= 0) {\n throw new InvalidExpireTimeError('psetex')\n }\n ctx.db.setString(args.key, args.value, {\n expiresAt: Date.now() + args.milliseconds,\n })\n return ok()\n },\n})\n\nexport const msetCommand = defineCommand({\n name: 'mset',\n schema: createKeyValuePairsSchema(),\n flags: ['write', 'denyoom'],\n keys: args => args.map(pair => pair.key),\n execute: (args, ctx) => {\n for (const { key, value } of args) {\n ctx.db.setString(key, value)\n }\n return ok()\n },\n})\n\nexport const msetnxCommand = defineCommand({\n name: 'msetnx',\n schema: createKeyValuePairsSchema(),\n flags: ['write', 'denyoom'],\n keys: args => args.map(pair => pair.key),\n execute: (args, ctx) => {\n for (const { key } of args) {\n if (ctx.db.getType(key) !== null) {\n return integer(0)\n }\n }\n for (const { key, value } of args) {\n ctx.db.setString(key, value)\n }\n return integer(1)\n },\n})\n\nexport const getrangeCommand = defineCommand({\n name: 'getrange',\n schema: t.object({\n key: t.key(),\n start: t.integer(),\n end: t.integer(),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (!existing) {\n return bulk(Buffer.alloc(0))\n }\n\n const length = existing.length\n let startIdx = args.start < 0 ? length + args.start : args.start\n let endIdx = args.end < 0 ? length + args.end : args.end\n\n if (startIdx < 0) startIdx = 0\n if (endIdx >= length) endIdx = length - 1\n\n if (startIdx > endIdx || startIdx >= length) {\n return bulk(Buffer.alloc(0))\n }\n\n return bulk(existing.slice(startIdx, endIdx + 1))\n },\n})\n\nexport const substrCommand = defineCommand({\n ...getrangeCommand,\n name: 'substr',\n})\n\nexport const setrangeCommand = defineCommand({\n name: 'setrange',\n schema: t.object({\n key: t.key(),\n offset: createSetrangeOffsetSchema(),\n value: t.key(),\n }),\n flags: ['write', 'denyoom'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n\n if (args.value.length === 0) {\n return integer(existing?.length ?? 0)\n }\n\n const current = existing ?? Buffer.alloc(0)\n const requiredSize = args.offset + args.value.length\n const target =\n requiredSize > current.length ? Buffer.alloc(requiredSize) : current\n\n if (target !== current) {\n current.copy(target, 0)\n }\n\n args.value.copy(target, args.offset)\n ctx.db.setString(args.key, target, { keepTtl: true })\n return integer(target.length)\n },\n})\n\nexport const getexCommand = defineCommand({\n name: 'getex',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: createGetexSchema(),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const existing = ensureStringOrMissing(ctx.db, args.key)\n if (existing === null) {\n return bulk(null)\n }\n\n if (args.persist) {\n ctx.db.persist(args.key)\n } else if (args.expiresAt !== undefined) {\n ctx.db.setString(args.key, existing, { expiresAt: args.expiresAt })\n }\n\n return bulk(existing)\n },\n})\n\nexport const stringsCommands = [\n getCommand,\n setCommand,\n mgetCommand,\n appendCommand,\n strlenCommand,\n incrCommand,\n decrCommand,\n incrbyCommand,\n decrbyCommand,\n incrbyfloatCommand,\n getsetCommand,\n getdelCommand,\n setnxCommand,\n setexCommand,\n psetexCommand,\n msetCommand,\n msetnxCommand,\n getrangeCommand,\n substrCommand,\n setrangeCommand,\n getexCommand,\n]\n\nfunction createSetSchema(): CommandSchema<SetArgs> {\n return t.custom(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n const value = input[index + 1]\n if (!key || !value) {\n throwWrongArity(ctx.commandName)\n }\n\n const args: SetArgs = {\n key,\n value,\n }\n\n let cursor = index + 2\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'NX' || option === 'XX') {\n if (args.condition) {\n throw new RedisSyntaxError()\n }\n\n args.condition = option\n cursor += 1\n continue\n }\n\n if (option === 'GET') {\n if (!ctx.profile.has('set.get')) {\n throw new RedisSyntaxError()\n }\n\n if (args.get) {\n throw new RedisSyntaxError()\n }\n\n args.get = true\n cursor += 1\n continue\n }\n\n if (option === 'KEEPTTL') {\n if (args.keepTtl || args.expiresAt !== undefined) {\n throw new RedisSyntaxError()\n }\n\n args.keepTtl = true\n cursor += 1\n continue\n }\n\n if (\n option === 'EX' ||\n option === 'PX' ||\n option === 'EXAT' ||\n option === 'PXAT'\n ) {\n if (\n (option === 'EXAT' || option === 'PXAT') &&\n !ctx.profile.has('set.exat-pxat')\n ) {\n throw new RedisSyntaxError()\n }\n\n if (args.expiresAt !== undefined || args.keepTtl) {\n throw new RedisSyntaxError()\n }\n\n const ttl = requireNextOptionValue(input, cursor + 1)\n args.expiresAt = parseSetExpiration(option, ttl)\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n if (\n args.condition === 'NX' &&\n args.get &&\n !ctx.profile.has('set.nx-get')\n ) {\n throw new RedisSyntaxError()\n }\n\n return { value: args, nextIndex: input.length }\n },\n )\n}\n\nfunction parseSetExpiration(option: string, token: Buffer): number {\n const value = parsePositiveExpireToken(token, 'set')\n\n switch (option) {\n case 'EX':\n return Date.now() + value * 1000\n case 'PX':\n return Date.now() + value\n case 'EXAT':\n return value * 1000\n case 'PXAT':\n return value\n default:\n throw new RedisSyntaxError()\n }\n}\n\nfunction throwWrongArity(commandName: string): never {\n throw new WrongNumberOfArgumentsError(commandName)\n}\n\ntype KeyValuePair = { key: Buffer; value: Buffer }\n\ntype GetexArgs = {\n key: Buffer\n expiresAt?: number\n persist?: boolean\n}\n\nfunction incrementBy(\n db: RedisDatabase,\n key: Buffer,\n delta: bigint,\n): RedisResult {\n const existing = ensureStringOrMissing(db, key)\n const current = existing ? parseInt64Token(existing) : 0n\n const next = current + delta\n if (next > INT64_MAX || next < INT64_MIN) {\n throw new IncrDecrOverflowError()\n }\n db.setString(key, Buffer.from(next.toString()), { keepTtl: true })\n return integer(next)\n}\n\nfunction createKeyValuePairsSchema(): CommandSchema<KeyValuePair[]> {\n return t.custom(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const pairs: KeyValuePair[] = []\n let cursor = index\n\n if (cursor >= input.length) {\n throwWrongArity(ctx.commandName)\n }\n\n while (cursor < input.length) {\n const key = input[cursor]\n const value = input[cursor + 1]\n if (!key || !value) {\n throwWrongArity(ctx.commandName)\n }\n pairs.push({ key, value })\n cursor += 2\n }\n\n if (pairs.length === 0) {\n throwWrongArity(ctx.commandName)\n }\n\n return { value: pairs, nextIndex: cursor }\n },\n )\n}\n\nfunction createSetrangeOffsetSchema(): CommandSchema<number> {\n return t.custom((input, index, ctx) => {\n const token = input[index]\n if (!token) {\n throwWrongArity(ctx.commandName)\n }\n\n const offset = parseIntegerToken(token)\n if (offset < 0) {\n throw new OffsetOutOfRangeError()\n }\n\n return { value: offset, nextIndex: index + 1 }\n })\n}\n\nfunction createGetexSchema(): CommandSchema<GetexArgs> {\n return t.custom(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key) {\n throwWrongArity(ctx.commandName)\n }\n\n const args: GetexArgs = { key }\n let cursor = index + 1\n\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'PERSIST') {\n if (args.persist || args.expiresAt !== undefined) {\n throw new RedisSyntaxError()\n }\n args.persist = true\n cursor += 1\n continue\n }\n\n if (\n option === 'EX' ||\n option === 'PX' ||\n option === 'EXAT' ||\n option === 'PXAT'\n ) {\n if (args.expiresAt !== undefined || args.persist) {\n throw new RedisSyntaxError()\n }\n\n const ttl = requireNextOptionValue(input, cursor + 1)\n args.expiresAt = parseGetexExpiration(option, ttl)\n cursor += 2\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return { value: args, nextIndex: input.length }\n },\n )\n}\n\nfunction parseGetexExpiration(option: string, token: Buffer): number {\n const value = parsePositiveExpireToken(token, 'getex')\n\n switch (option) {\n case 'EX':\n return Date.now() + value * 1000\n case 'PX':\n return Date.now() + value\n case 'EXAT':\n return value * 1000\n case 'PXAT':\n return value\n default:\n throw new RedisSyntaxError()\n }\n}\n","import { defineCommand } from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport {\n DiscardWithoutMultiError,\n ExecWithoutMultiError,\n TransactionDiscardedError,\n WatchInsideMultiError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport { ok } from './helpers'\n\nexport const multiCommand = defineCommand({\n name: 'multi',\n schema: t.object({}),\n flags: ['readonly', 'fast', 'transaction', 'noscript'],\n capabilities: { transactionBoundary: 'begin' },\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.session.beginTransaction()\n return ok()\n },\n})\n\nexport const execCommand = defineCommand({\n name: 'exec',\n schema: t.object({}),\n // EXEC inherits flags from queued commands at runtime. The flag list here\n // only marks it as transaction-control so policies do not treat it as a\n // normal write/read command.\n flags: ['transaction', 'noscript'],\n capabilities: { transactionBoundary: 'end' },\n keys: () => [],\n execute: async (_args, ctx) => {\n if (ctx.session.mode !== 'transaction') {\n throw new ExecWithoutMultiError()\n }\n\n // Real Redis prioritises CLIENT_DIRTY_EXEC over CLIENT_DIRTY_CAS: a bad\n // command in the queue aborts with -EXECABORT regardless of WATCH state.\n // The (nil) CAS-abort reply is only returned when the queue itself is clean.\n if (ctx.session.isTransactionDirty()) {\n ctx.session.discardTransaction()\n throw new TransactionDiscardedError()\n }\n\n if (ctx.session.isWatchDirty()) {\n ctx.session.discardTransaction()\n return RedisResult.create(RedisValue.nullArray())\n }\n\n const plans = ctx.session.drainTransaction()\n return ctx.session.executeTransaction(plans)\n },\n})\n\nexport const discardCommand = defineCommand({\n name: 'discard',\n schema: t.object({}),\n flags: ['readonly', 'fast', 'transaction', 'noscript'],\n capabilities: { transactionBoundary: 'end' },\n keys: () => [],\n execute: (_args, ctx) => {\n if (ctx.session.mode !== 'transaction') {\n throw new DiscardWithoutMultiError()\n }\n\n ctx.session.discardTransaction()\n return ok()\n },\n})\n\nexport const watchCommand = defineCommand({\n name: 'watch',\n schema: t.object({\n keys: t.variadic(t.key(), { min: 1 }),\n }),\n flags: ['readonly', 'fast', 'transaction', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n if (ctx.session.mode === 'transaction') {\n throw new WatchInsideMultiError()\n }\n\n ctx.session.watch(args.keys)\n return ok()\n },\n})\n\nexport const unwatchCommand = defineCommand({\n name: 'unwatch',\n schema: t.object({}),\n flags: ['readonly', 'fast', 'noscript'],\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.session.unwatch()\n return ok()\n },\n})\n\nexport const transactionCommands = [\n multiCommand,\n execCommand,\n discardCommand,\n watchCommand,\n unwatchCommand,\n]\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n WrongNumberOfArgumentsError,\n ZaddGtLtNxConflictError,\n ZaddIncrPairError,\n ZaddNxXxConflictError,\n} from '../../core/redis-error'\nimport type { RedisSortedSetMember } from '../../state/data-types'\nimport { RedisResult } from '../../core/redis-result'\nimport { bulk, integer, scoreValue } from '../helpers'\nimport {\n assertValidResultingScore,\n deleteSortedSetIfEmpty,\n parseFloatArg,\n} from './helpers'\n\ntype ZaddPair = { score: number; member: Buffer }\ntype ZaddCondition = 'NX' | 'XX'\ntype ZaddComparison = 'GT' | 'LT'\n\ntype ZaddOptions = {\n condition?: ZaddCondition\n comparison?: ZaddComparison\n ch: boolean\n incr: boolean\n}\n\ntype ZaddArgs = {\n key: Buffer\n options: ZaddOptions\n pairs: ZaddPair[]\n}\n\nfunction createZaddSchema() {\n return t.custom<ZaddArgs>(\n (input: readonly Buffer[], index: number, ctx: ParseContext) => {\n const key = input[index]\n if (!key) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const options: ZaddOptions = { ch: false, incr: false }\n let cursor = index + 1\n\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'NX') {\n if (options.condition === 'XX') throw new ZaddNxXxConflictError()\n options.condition = 'NX'\n cursor++\n continue\n }\n\n if (option === 'XX') {\n if (options.condition === 'NX') throw new ZaddNxXxConflictError()\n options.condition = 'XX'\n cursor++\n continue\n }\n\n if (option === 'GT') {\n if (options.comparison === 'LT') {\n throw new ZaddGtLtNxConflictError()\n }\n options.comparison = 'GT'\n cursor++\n continue\n }\n\n if (option === 'LT') {\n if (options.comparison === 'GT') {\n throw new ZaddGtLtNxConflictError()\n }\n options.comparison = 'LT'\n cursor++\n continue\n }\n\n if (option === 'CH') {\n options.ch = true\n cursor++\n continue\n }\n\n if (option === 'INCR') {\n options.incr = true\n cursor++\n continue\n }\n\n break\n }\n\n if (options.condition === 'NX' && options.comparison) {\n throw new ZaddGtLtNxConflictError()\n }\n\n const pairs = parseZaddPairs(input, cursor, ctx)\n if (options.incr && pairs.length !== 1) {\n throw new ZaddIncrPairError()\n }\n\n return { value: { key, options, pairs }, nextIndex: input.length }\n },\n )\n}\n\nfunction parseZaddPairs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n): ZaddPair[] {\n const pairs: ZaddPair[] = []\n let cursor = index\n\n if (cursor >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n while (cursor < input.length) {\n const scoreToken = input[cursor]\n const memberToken = input[cursor + 1]\n if (!scoreToken || !memberToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const score = parseFloatArg(scoreToken.toString())\n\n pairs.push({ score, member: memberToken })\n cursor += 2\n }\n\n return pairs\n}\n\nfunction shouldApplyZaddUpdate(\n existing: RedisSortedSetMember | undefined,\n score: number,\n options: ZaddOptions,\n): boolean {\n if (!existing) return options.condition !== 'XX'\n if (options.condition === 'NX') return false\n if (options.comparison === 'GT') return score > existing.score\n if (options.comparison === 'LT') return score < existing.score\n return true\n}\n\nexport const zaddCommand = defineCommand({\n name: 'zadd',\n schema: createZaddSchema(),\n flags: ['write', 'denyoom', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n if (args.options.incr) {\n const [{ score, member }] = args.pairs\n const newScore = ctx.db.updateSortedSet(args.key, zset => {\n const existing = zset.getMember(member)\n const nextScore = (existing?.score ?? 0) + score\n assertValidResultingScore(nextScore)\n\n if (!shouldApplyZaddUpdate(existing, nextScore, args.options)) {\n return null\n }\n\n zset.setScore(member, nextScore)\n return nextScore\n })\n deleteSortedSetIfEmpty(ctx.db, args.key)\n return newScore === null\n ? bulk(null)\n : RedisResult.create(scoreValue(newScore))\n }\n\n const replyCount = ctx.db.updateSortedSet(args.key, zset => {\n let count = 0\n for (const { score, member } of args.pairs) {\n const existing = zset.getMember(member)\n\n if (!shouldApplyZaddUpdate(existing, score, args.options)) {\n continue\n }\n\n if (!existing || args.options.ch) {\n if (!existing || existing.score !== score) count++\n }\n\n zset.setScore(member, score)\n }\n return count\n })\n deleteSortedSetIfEmpty(ctx.db, args.key)\n return integer(replyCount)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { integer } from '../helpers'\n\nexport const zremCommand = defineCommand({\n name: 'zrem',\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n let removed = 0\n ctx.db.updateSortedSet(args.key, zset => {\n for (const member of args.members) {\n if (zset.deleteMember(member)) removed++\n }\n })\n if (\n removed > 0 &&\n (ctx.db.getSortedSet(args.key)?.members.size ?? 0) === 0\n ) {\n ctx.db.delete(args.key)\n }\n return integer(removed)\n },\n})\n\nexport const zcardCommand = defineCommand({\n name: 'zcard',\n schema: t.object({ key: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n return integer(zset?.members.size ?? 0)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, integer, scoreValue } from '../helpers'\nimport { getSortedMembers } from './helpers'\n\ntype ZRankArgs = {\n key: Buffer\n member: Buffer\n withScore: boolean\n}\n\nconst zrankSchema = t.custom<ZRankArgs>((input, index, ctx) => {\n const remaining = input.length - index\n if (remaining < 2 || remaining > 3) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const key = input[index]\n const member = input[index + 1]\n if (!key || !member) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const option = input[index + 2]\n if (option && option.toString().toUpperCase() !== 'WITHSCORE') {\n throw new RedisSyntaxError()\n }\n\n return {\n value: { key, member, withScore: option !== undefined },\n nextIndex: input.length,\n }\n})\n\nfunction rankResponse(rank: number, score: number, withScore: boolean) {\n if (!withScore) {\n return integer(rank)\n }\n\n return array([RedisValue.integer(rank), scoreValue(score)])\n}\n\nexport const zrankCommand = defineCommand({\n name: 'zrank',\n schema: zrankSchema,\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return RedisResult.nil()\n const hex = args.member.toString('hex')\n const entry = zset.members.get(hex)\n if (!entry) return RedisResult.nil()\n const sorted = getSortedMembers(zset)\n const rank = sorted.findIndex(m => m.member.toString('hex') === hex)\n return rankResponse(rank, entry.score, args.withScore)\n },\n})\n\nexport const zrevrankCommand = defineCommand({\n name: 'zrevrank',\n schema: zrankSchema,\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return RedisResult.nil()\n const hex = args.member.toString('hex')\n const entry = zset.members.get(hex)\n if (!entry) return RedisResult.nil()\n const sorted = getSortedMembers(zset)\n const rank = sorted\n .slice()\n .reverse()\n .findIndex(m => m.member.toString('hex') === hex)\n return rankResponse(rank, entry.score, args.withScore)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, bulk, scoreValue } from '../helpers'\n\nexport const zscoreCommand = defineCommand({\n name: 'zscore',\n schema: t.object({ key: t.key(), member: t.key() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return bulk(null)\n const entry = zset.members.get(args.member.toString('hex'))\n if (!entry) return bulk(null)\n return RedisResult.create(scoreValue(entry.score))\n },\n})\n\nexport const zmscoreCommand = defineCommand({\n name: 'zmscore',\n since: { redis: '6.2.0', valkey: '7.2.0' },\n schema: t.object({ key: t.key(), members: t.variadic(t.key(), { min: 1 }) }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n const items: RedisValue[] = []\n for (const member of args.members) {\n const entry = zset?.members.get(member.toString('hex'))\n items.push(entry ? scoreValue(entry.score) : RedisValue.bulkString(null))\n }\n return array(items)\n },\n})\n","import { t } from '../../core/command-schema'\nimport {\n ExpectedIntegerError,\n InvalidLexRangeError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport type {\n RedisSortedSetData,\n RedisSortedSetMember,\n} from '../../state/data-types'\n\n// Lexicographic range bounds — used by ZRANGEBYLEX/ZREVRANGEBYLEX/ZLEXCOUNT/\n// ZREMRANGEBYLEX. All members are assumed to share the same score, so ordering\n// is by raw byte comparison (not localeCompare — see #41).\nexport type LexBound =\n | { kind: 'min' } // `-` negative infinity\n | { kind: 'max' } // `+` positive infinity\n | { kind: 'value'; value: Buffer; exclusive: boolean }\n\nexport function parseLexBoundArg(token: Buffer): LexBound {\n if (token.length === 1) {\n if (token[0] === 0x2d /* - */) return { kind: 'min' }\n if (token[0] === 0x2b /* + */) return { kind: 'max' }\n }\n\n const prefix = token[0]\n if (prefix === 0x5b /* [ */) {\n return { kind: 'value', value: token.subarray(1), exclusive: false }\n }\n if (prefix === 0x28 /* ( */) {\n return { kind: 'value', value: token.subarray(1), exclusive: true }\n }\n\n throw new InvalidLexRangeError()\n}\n\nexport function lexMemberWithinBounds(\n member: Buffer,\n min: LexBound,\n max: LexBound,\n): boolean {\n if (min.kind === 'max') return false\n if (min.kind === 'value') {\n const cmp = Buffer.compare(member, min.value)\n if (min.exclusive ? cmp <= 0 : cmp < 0) return false\n }\n\n if (max.kind === 'min') return false\n if (max.kind === 'value') {\n const cmp = Buffer.compare(member, max.value)\n if (max.exclusive ? cmp >= 0 : cmp > 0) return false\n }\n\n return true\n}\n\nexport function getLexSortedMembers(\n zset: RedisSortedSetData,\n): RedisSortedSetMember[] {\n return Array.from(zset.members.values()).sort((a, b) =>\n a.score !== b.score\n ? a.score - b.score\n : Buffer.compare(a.member, b.member),\n )\n}\n\nexport type LexLimit = { offset: number; count: number }\n\nexport type LexRangeArgs = {\n key: Buffer\n first: Buffer\n second: Buffer\n limit?: LexLimit\n}\n\nexport function parseLexLimitInt(token: Buffer): number {\n const raw = token.toString()\n if (!/^-?\\d+$/.test(raw)) throw new ExpectedIntegerError()\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) throw new ExpectedIntegerError()\n return value\n}\n\n// ZRANGEBYLEX key min max [LIMIT offset count]\n// ZREVRANGEBYLEX key max min [LIMIT offset count] — caller maps first/second.\nexport function createLexRangeSchema() {\n return t.custom<LexRangeArgs>((input, index, ctx) => {\n const key = input[index]\n const first = input[index + 1]\n const second = input[index + 2]\n if (!key || !first || !second) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index + 3\n let limit: LexLimit | undefined\n if (cursor < input.length) {\n if (input[cursor]!.toString().toUpperCase() !== 'LIMIT') {\n throw new RedisSyntaxError()\n }\n const offsetTok = input[cursor + 1]\n const countTok = input[cursor + 2]\n if (!offsetTok || !countTok) throw new RedisSyntaxError()\n limit = {\n offset: parseLexLimitInt(offsetTok),\n count: parseLexLimitInt(countTok),\n }\n cursor += 3\n if (cursor < input.length) throw new RedisSyntaxError()\n }\n\n return { value: { key, first, second, limit }, nextIndex: cursor }\n })\n}\n\nexport function applyLexLimit(\n members: RedisSortedSetMember[],\n limit: LexLimit | undefined,\n): RedisSortedSetMember[] {\n if (!limit) return members\n if (limit.offset < 0) return []\n const end = limit.count < 0 ? members.length : limit.offset + limit.count\n return members.slice(limit.offset, end)\n}\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisSortedSetMember } from '../../state/data-types'\nimport { array, bulk, scorePairs } from '../helpers'\nimport { parseLexLimitInt } from './lex'\n\ntype ZrandmemberArgs = {\n key: Buffer\n count?: number\n withScores: boolean\n}\n\nfunction createZrandmemberSchema() {\n return t.custom<ZrandmemberArgs>((input, index, ctx) => {\n const key = input[index]\n if (!key) throw new WrongNumberOfArgumentsError(ctx.commandName)\n\n let cursor = index + 1\n let count: number | undefined\n let withScores = false\n\n if (cursor < input.length) {\n count = parseLexLimitInt(input[cursor]!)\n cursor++\n if (cursor < input.length) {\n if (input[cursor]!.toString().toUpperCase() !== 'WITHSCORES') {\n throw new RedisSyntaxError()\n }\n withScores = true\n cursor++\n }\n }\n\n if (cursor < input.length) throw new RedisSyntaxError()\n return { value: { key, count, withScores }, nextIndex: input.length }\n })\n}\n\nexport const zrandmemberCommand = defineCommand({\n name: 'zrandmember',\n schema: createZrandmemberSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n\n if (args.count === undefined) {\n if (!zset || zset.members.size === 0) return bulk(null)\n const all = Array.from(zset.members.values())\n const pick = all[Math.floor(Math.random() * all.length)]\n return bulk(pick.member)\n }\n\n if (!zset || zset.members.size === 0) return array([])\n const all = Array.from(zset.members.values())\n const chosen: RedisSortedSetMember[] = []\n\n if (args.count < 0) {\n const n = -args.count\n for (let i = 0; i < n; i++) {\n chosen.push(all[Math.floor(Math.random() * all.length)])\n }\n } else {\n const shuffled = all.slice()\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]\n }\n chosen.push(...shuffled.slice(0, Math.min(args.count, shuffled.length)))\n }\n\n if (args.withScores) {\n return RedisResult.create(scorePairs(chosen))\n }\n return array(chosen.map(entry => RedisValue.bulkString(entry.member)))\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { RedisResult } from '../../core/redis-result'\nimport { scoreValue } from '../helpers'\nimport { assertValidResultingScore, parseFloatArg } from './helpers'\n\nexport const zincrbyCommand = defineCommand({\n name: 'zincrby',\n schema: t.object({ key: t.key(), increment: t.string(), member: t.key() }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const inc = parseFloatArg(args.increment)\n const newScore = ctx.db.updateSortedSet(args.key, zset => {\n const existing = zset.getMember(args.member)\n const score = (existing?.score ?? 0) + inc\n assertValidResultingScore(score)\n zset.setScore(args.member, score)\n return score\n })\n return RedisResult.create(scoreValue(newScore))\n },\n})\n","import { MinMaxNotFloatError } from '../../core/redis-error'\n\nexport type ScoreBound = { value: number; exclusive: boolean }\n\nexport function parseScoreBoundArg(s: string): ScoreBound {\n const exclusive = s.startsWith('(')\n const raw = exclusive ? s.slice(1) : s\n\n if (raw.length === 0) throw new MinMaxNotFloatError()\n\n const normalized = raw.toLowerCase()\n if (normalized === '+inf') return { value: Infinity, exclusive }\n if (normalized === '-inf') return { value: -Infinity, exclusive }\n\n const n = Number(raw)\n if (!Number.isFinite(n)) throw new MinMaxNotFloatError()\n return { value: n, exclusive }\n}\n\nexport function scoreWithinBounds(\n score: number,\n min: ScoreBound,\n max: ScoreBound,\n) {\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","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport {\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n ZrangeLimitWithoutByError,\n ZrangeWithScoresByLexError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisSortedSetMember } from '../../state/data-types'\nimport { RedisResult } from '../../core/redis-result'\nimport { array, integer, scorePairs } from '../helpers'\nimport {\n applyLexLimit,\n getLexSortedMembers,\n lexMemberWithinBounds,\n type LexLimit,\n parseLexBoundArg,\n parseLexLimitInt,\n} from './lex'\nimport { getSortedMembers } from './helpers'\nimport { parseScoreBoundArg, scoreWithinBounds } from './score'\n\n// Modern ZRANGE (Redis 6.2+):\n// ZRANGE key min max [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]\n// The legacy index-based form is the default (no BYSCORE/BYLEX). BYSCORE/BYLEX\n// share the score-range and lex-range parsing/filtering helpers used by\n// ZRANGEBYSCORE/ZRANGEBYLEX. With REV, the min/max arguments are given in\n// reverse order (max then min), matching ZREVRANGEBYSCORE/ZREVRANGEBYLEX.\ntype ZrangeBy = 'index' | 'score' | 'lex'\n\ntype ZrangeSelectionArgs = {\n key: Buffer\n min: Buffer\n max: Buffer\n by: ZrangeBy\n rev: boolean\n limit?: LexLimit\n}\n\ntype ZrangeArgs = ZrangeSelectionArgs & {\n withScores: boolean\n}\n\ntype ZrangestoreArgs = ZrangeSelectionArgs & {\n destination: Buffer\n}\n\ntype ParsedZrangeOptions = {\n by: ZrangeBy\n rev: boolean\n limit?: LexLimit\n withScores: boolean\n}\n\nfunction parseZrangeOptions(\n input: readonly Buffer[],\n cursor: number,\n options: { allowWithScores: boolean },\n): ParsedZrangeOptions {\n let by: ZrangeBy = 'index'\n let rev = false\n let withScores = false\n let limit: LexLimit | undefined\n\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'BYSCORE') {\n if (by === 'lex') throw new RedisSyntaxError()\n by = 'score'\n cursor++\n continue\n }\n\n if (option === 'BYLEX') {\n if (by === 'score') throw new RedisSyntaxError()\n by = 'lex'\n cursor++\n continue\n }\n\n if (option === 'REV') {\n rev = true\n cursor++\n continue\n }\n\n if (option === 'WITHSCORES') {\n if (!options.allowWithScores) throw new RedisSyntaxError()\n withScores = true\n cursor++\n continue\n }\n\n if (option === 'LIMIT') {\n const offsetTok = input[cursor + 1]\n const countTok = input[cursor + 2]\n if (!offsetTok || !countTok) throw new RedisSyntaxError()\n limit = {\n offset: parseLexLimitInt(offsetTok),\n count: parseLexLimitInt(countTok),\n }\n cursor += 3\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n if (limit && by === 'index') throw new ZrangeLimitWithoutByError()\n if (withScores && by === 'lex') throw new ZrangeWithScoresByLexError()\n\n return { by, rev, limit, withScores }\n}\n\nfunction createZrangeSchema() {\n return t.custom<ZrangeArgs>((input, index, ctx) => {\n const key = input[index]\n const min = input[index + 1]\n const max = input[index + 2]\n if (!key || !min || !max) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return {\n value: {\n key,\n min,\n max,\n ...parseZrangeOptions(input, index + 3, { allowWithScores: true }),\n },\n nextIndex: input.length,\n }\n })\n}\n\nfunction createZrangestoreSchema() {\n return t.custom<ZrangestoreArgs>((input, index, ctx) => {\n const destination = input[index]\n const key = input[index + 1]\n const min = input[index + 2]\n const max = input[index + 3]\n if (!destination || !key || !min || !max) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const { by, rev, limit } = parseZrangeOptions(input, index + 4, {\n allowWithScores: false,\n })\n\n return {\n value: { destination, key, min, max, by, rev, limit },\n nextIndex: input.length,\n }\n })\n}\n\nfunction selectZrangeMembers(\n args: ZrangeSelectionArgs,\n ctx: RedisExecutionContext,\n): RedisSortedSetMember[] {\n // With REV the bounds are supplied as `max min`, so swap before parsing.\n const minTok = args.rev ? args.max : args.min\n const maxTok = args.rev ? args.min : args.max\n\n if (args.by === 'index') {\n // parse index bounds up front so a bad index errors even on a missing key\n const startIdx = parseLexLimitInt(args.min)\n const stopIdx = parseLexLimitInt(args.max)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return []\n return sliceByIndex(getSortedMembers(zset), startIdx, stopIdx, args.rev)\n }\n\n if (args.by === 'score') {\n const min = parseScoreBoundArg(minTok.toString())\n const max = parseScoreBoundArg(maxTok.toString())\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return []\n let matched = getSortedMembers(zset).filter(m =>\n scoreWithinBounds(m.score, min, max),\n )\n if (args.rev) matched = matched.reverse()\n return applyLexLimit(matched, args.limit)\n }\n\n // BYLEX\n const min = parseLexBoundArg(minTok)\n const max = parseLexBoundArg(maxTok)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return []\n let matched = getLexSortedMembers(zset).filter(m =>\n lexMemberWithinBounds(m.member, min, max),\n )\n if (args.rev) matched = matched.reverse()\n return applyLexLimit(matched, args.limit)\n}\n\nfunction buildStoredMembers(\n members: RedisSortedSetMember[],\n): Map<string, RedisSortedSetMember> {\n return new Map(\n members.map(entry => [\n entry.member.toString('hex'),\n { member: Buffer.from(entry.member), score: entry.score },\n ]),\n )\n}\n\nfunction buildRangeResult(\n members: RedisSortedSetMember[],\n withScores: boolean,\n): RedisResult {\n if (withScores) {\n return RedisResult.create(scorePairs(members))\n }\n return array(members.map(entry => RedisValue.bulkString(entry.member)))\n}\n\nfunction sliceByIndex(\n sorted: RedisSortedSetMember[],\n startIdx: number,\n stopIdx: number,\n rev: boolean,\n): RedisSortedSetMember[] {\n const ordered = rev ? sorted.slice().reverse() : sorted\n const len = ordered.length\n const start = startIdx < 0 ? Math.max(0, len + startIdx) : startIdx\n const stop = stopIdx < 0 ? len + stopIdx : Math.min(stopIdx, len - 1)\n if (start > stop) return []\n return ordered.slice(start, stop + 1)\n}\n\nexport const zrangeCommand = defineCommand({\n name: 'zrange',\n schema: createZrangeSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n return buildRangeResult(selectZrangeMembers(args, ctx), args.withScores)\n },\n})\n\nexport const zrangestoreCommand = defineCommand({\n name: 'zrangestore',\n schema: createZrangestoreSchema(),\n flags: ['write'],\n keys: args => [args.destination, args.key],\n execute: (args, ctx) => {\n const members = buildStoredMembers(selectZrangeMembers(args, ctx))\n if (members.size === 0) {\n ctx.db.delete(args.destination)\n return integer(0)\n }\n\n ctx.db.delete(args.destination)\n ctx.db.updateSortedSet(args.destination, zset => {\n zset.replaceMembers(members, { forceDirty: true })\n })\n return integer(members.size)\n },\n})\n\nexport const zrevrangeCommand = defineCommand({\n name: 'zrevrange',\n schema: t.object({\n key: t.key(),\n start: t.integer(),\n stop: t.integer(),\n withScores: t.optional(t.keyword('WITHSCORES')),\n }),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const sorted = getSortedMembers(zset).slice().reverse()\n const len = sorted.length\n const start = args.start < 0 ? Math.max(0, len + args.start) : args.start\n const stop = args.stop < 0 ? len + args.stop : Math.min(args.stop, len - 1)\n if (start > stop) return array([])\n return buildRangeResult(\n sorted.slice(start, stop + 1),\n args.withScores !== undefined,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport {\n ExpectedIntegerError,\n RedisSyntaxError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport { RedisResult } from '../../core/redis-result'\nimport type { RedisSortedSetMember } from '../../state/data-types'\nimport { array, integer, scorePairs } from '../helpers'\nimport { getSortedMembers, deleteSortedSetIfEmpty } from './helpers'\nimport { parseScoreBoundArg, scoreWithinBounds } from './score'\n\n// ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]\n// ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]\n// WITHSCORES and LIMIT may appear in either order, matching real Redis.\ntype ScoreLimit = { offset: number; count: number }\n\ntype ScoreRangeArgs = {\n key: Buffer\n first: Buffer\n second: Buffer\n withScores: boolean\n limit?: ScoreLimit\n}\n\nfunction parseScoreLimitInt(token: Buffer): number {\n const raw = token.toString()\n if (!/^-?\\d+$/.test(raw)) throw new ExpectedIntegerError()\n const value = Number(raw)\n if (!Number.isSafeInteger(value)) throw new ExpectedIntegerError()\n return value\n}\n\nfunction createScoreRangeSchema() {\n return t.custom<ScoreRangeArgs>((input, index, ctx) => {\n const key = input[index]\n const first = input[index + 1]\n const second = input[index + 2]\n if (!key || !first || !second) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let withScores = false\n let limit: ScoreLimit | undefined\n\n let cursor = index + 3\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (option === 'WITHSCORES') {\n withScores = true\n cursor++\n continue\n }\n\n if (option === 'LIMIT') {\n const offsetTok = input[cursor + 1]\n const countTok = input[cursor + 2]\n if (!offsetTok || !countTok) throw new RedisSyntaxError()\n limit = {\n offset: parseScoreLimitInt(offsetTok),\n count: parseScoreLimitInt(countTok),\n }\n cursor += 3\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return {\n value: { key, first, second, withScores, limit },\n nextIndex: input.length,\n }\n })\n}\n\nfunction applyScoreLimit(\n members: RedisSortedSetMember[],\n limit: ScoreLimit | undefined,\n): RedisSortedSetMember[] {\n if (!limit) return members\n if (limit.offset < 0) return []\n const end = limit.count < 0 ? members.length : limit.offset + limit.count\n return members.slice(limit.offset, end)\n}\n\nfunction buildScoreRangeResult(\n members: RedisSortedSetMember[],\n withScores: boolean,\n): RedisResult {\n if (withScores) {\n return RedisResult.create(scorePairs(members))\n }\n return array(members.map(entry => RedisValue.bulkString(entry.member)))\n}\n\nexport const zrangebyscoreCommand = defineCommand({\n name: 'zrangebyscore',\n schema: createScoreRangeSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseScoreBoundArg(args.first.toString())\n const max = parseScoreBoundArg(args.second.toString())\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const matched = getSortedMembers(zset).filter(m =>\n scoreWithinBounds(m.score, min, max),\n )\n return buildScoreRangeResult(\n applyScoreLimit(matched, args.limit),\n args.withScores,\n )\n },\n})\n\nexport const zrevrangebyscoreCommand = defineCommand({\n name: 'zrevrangebyscore',\n schema: createScoreRangeSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n // ZREVRANGEBYSCORE takes bounds as `max min`.\n const max = parseScoreBoundArg(args.first.toString())\n const min = parseScoreBoundArg(args.second.toString())\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const matched = getSortedMembers(zset)\n .filter(m => scoreWithinBounds(m.score, min, max))\n .reverse()\n return buildScoreRangeResult(\n applyScoreLimit(matched, args.limit),\n args.withScores,\n )\n },\n})\n\nexport const zremrangebyscoreCommand = defineCommand({\n name: 'zremrangebyscore',\n schema: t.object({ key: t.key(), min: t.string(), max: t.string() }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseScoreBoundArg(args.min)\n const max = parseScoreBoundArg(args.max)\n let removed = 0\n ctx.db.updateSortedSet(args.key, zset => {\n for (const [hex, entry] of zset.entries()) {\n if (scoreWithinBounds(entry.score, min, max)) {\n zset.deleteMemberId(hex)\n removed++\n }\n }\n })\n if (removed > 0) deleteSortedSetIfEmpty(ctx.db, args.key)\n return integer(removed)\n },\n})\n\nexport const zremrangebyrankCommand = defineCommand({\n name: 'zremrangebyrank',\n schema: t.object({ key: t.key(), start: t.integer(), stop: t.integer() }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return integer(0)\n const sorted = getSortedMembers(zset)\n const len = sorted.length\n const start = args.start < 0 ? Math.max(0, len + args.start) : args.start\n const stop = args.stop < 0 ? len + args.stop : Math.min(args.stop, len - 1)\n if (start > stop) return integer(0)\n\n const toRemove = new Set(\n sorted.slice(start, stop + 1).map(m => m.member.toString('hex')),\n )\n let removed = 0\n ctx.db.updateSortedSet(args.key, set => {\n for (const hex of toRemove) {\n if (set.deleteMemberId(hex)) removed++\n }\n })\n if (removed > 0) deleteSortedSetIfEmpty(ctx.db, args.key)\n return integer(removed)\n },\n})\n\nexport const zcountCommand = defineCommand({\n name: 'zcount',\n schema: t.object({ key: t.key(), min: t.string(), max: t.string() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseScoreBoundArg(args.min)\n const max = parseScoreBoundArg(args.max)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return integer(0)\n let count = 0\n for (const entry of zset.members.values()) {\n if (scoreWithinBounds(entry.score, min, max)) count++\n }\n return integer(count)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport { RedisValue } from '../../core/redis-value'\nimport { array, integer } from '../helpers'\nimport { deleteSortedSetIfEmpty } from './helpers'\nimport {\n applyLexLimit,\n createLexRangeSchema,\n getLexSortedMembers,\n lexMemberWithinBounds,\n parseLexBoundArg,\n} from './lex'\n\nexport const zrangebylexCommand = defineCommand({\n name: 'zrangebylex',\n schema: createLexRangeSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseLexBoundArg(args.first)\n const max = parseLexBoundArg(args.second)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const matched = getLexSortedMembers(zset).filter(m =>\n lexMemberWithinBounds(m.member, min, max),\n )\n const limited = applyLexLimit(matched, args.limit)\n return array(limited.map(m => RedisValue.bulkString(m.member)))\n },\n})\n\nexport const zrevrangebylexCommand = defineCommand({\n name: 'zrevrangebylex',\n schema: createLexRangeSchema(),\n flags: ['readonly'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n // ZREVRANGEBYLEX takes bounds as `max min`.\n const max = parseLexBoundArg(args.first)\n const min = parseLexBoundArg(args.second)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const matched = getLexSortedMembers(zset)\n .filter(m => lexMemberWithinBounds(m.member, min, max))\n .reverse()\n const limited = applyLexLimit(matched, args.limit)\n return array(limited.map(m => RedisValue.bulkString(m.member)))\n },\n})\n\nexport const zlexcountCommand = defineCommand({\n name: 'zlexcount',\n schema: t.object({ key: t.key(), min: t.bulk(), max: t.bulk() }),\n flags: ['readonly', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseLexBoundArg(args.min)\n const max = parseLexBoundArg(args.max)\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return integer(0)\n let count = 0\n for (const entry of zset.members.values()) {\n if (lexMemberWithinBounds(entry.member, min, max)) count++\n }\n return integer(count)\n },\n})\n\nexport const zremrangebylexCommand = defineCommand({\n name: 'zremrangebylex',\n schema: t.object({ key: t.key(), min: t.bulk(), max: t.bulk() }),\n flags: ['write'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const min = parseLexBoundArg(args.min)\n const max = parseLexBoundArg(args.max)\n let removed = 0\n ctx.db.updateSortedSet(args.key, zset => {\n for (const [hex, entry] of zset.entries()) {\n if (lexMemberWithinBounds(entry.member, min, max)) {\n zset.deleteMemberId(hex)\n removed++\n }\n }\n })\n if (removed > 0) deleteSortedSetIfEmpty(ctx.db, args.key)\n return integer(removed)\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t } from '../../core/command-schema'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport {\n PositiveCountError,\n TimeoutNegativeError,\n TimeoutNotFloatError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisDatabase } from '../../state'\nimport { array, scorePairs, scoreValue } from '../helpers'\nimport { deleteSortedSetIfEmpty, getSortedMembers } from './helpers'\n\ntype ZsetPopSide = 'min' | 'max'\n\nfunction parsePopCountArg(s: string): number {\n if (!/^-?\\d+$/.test(s)) {\n throw new PositiveCountError()\n }\n\n const count = Number(s)\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new PositiveCountError()\n }\n\n return count\n}\n\nfunction zpopCountSchema() {\n return t.custom<number>((input, index, ctx) => {\n const token = input[index]\n if (!token) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n return {\n value: parsePopCountArg(token.toString()),\n nextIndex: index + 1,\n }\n })\n}\n\nexport const zpopminCommand = defineCommand({\n name: 'zpopmin',\n schema: t.object({ key: t.key(), count: t.optional(zpopCountSchema()) }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const count = args.count ?? 1\n const sorted = getSortedMembers(zset)\n const toRemove = sorted.slice(0, count)\n if (toRemove.length === 0) return array([])\n ctx.db.updateSortedSet(args.key, z => {\n for (const entry of toRemove) {\n z.deleteMember(entry.member)\n }\n })\n deleteSortedSetIfEmpty(ctx.db, args.key)\n return zpopReply(toRemove, args.count !== undefined)\n },\n})\n\nexport const zpopmaxCommand = defineCommand({\n name: 'zpopmax',\n schema: t.object({ key: t.key(), count: t.optional(zpopCountSchema()) }),\n flags: ['write', 'fast'],\n keys: args => [args.key],\n execute: (args, ctx) => {\n const zset = ctx.db.getSortedSet(args.key)\n if (!zset) return array([])\n const count = args.count ?? 1\n const sorted = getSortedMembers(zset).slice().reverse()\n const toRemove = sorted.slice(0, count)\n if (toRemove.length === 0) return array([])\n ctx.db.updateSortedSet(args.key, z => {\n for (const entry of toRemove) {\n z.deleteMember(entry.member)\n }\n })\n deleteSortedSetIfEmpty(ctx.db, args.key)\n return zpopReply(toRemove, args.count !== undefined)\n },\n})\n\n// ZPOPMIN/ZPOPMAX: without a count the reply is a flat `[member, score]`; with\n// an explicit count it is an array of `[member, score]` pairs (nested on RESP3).\nfunction zpopReply(\n members: readonly { member: Buffer; score: number }[],\n hasCount: boolean,\n): RedisResult {\n if (hasCount) {\n return RedisResult.create(scorePairs(members))\n }\n const [entry] = members\n return array([RedisValue.bulkString(entry.member), scoreValue(entry.score)])\n}\n\ntype BlockingZsetPopArgs = {\n keys: Buffer[]\n timeout: number\n}\n\nfunction parseBlockingZsetPopArgs(\n input: readonly Buffer[],\n index: number,\n commandName: string,\n): BlockingZsetPopArgs {\n // BZPOPMIN/BZPOPMAX take `key [key ...] timeout` — at least one key plus the\n // trailing timeout, so fewer than two remaining tokens is an arity error.\n if (input.length - index < 2) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n\n const timeout = Number(input[input.length - 1].toString())\n if (isNaN(timeout)) throw new TimeoutNotFloatError()\n if (timeout < 0) throw new TimeoutNegativeError()\n\n const keys = Array.from(input.slice(index, input.length - 1))\n return { keys, timeout }\n}\n\n// Pops a single min/max member from the first non-empty sorted set among the\n// keys, returning the flat `[key, member, score]` reply BZPOPMIN/BZPOPMAX use\n// (distinct from ZMPOP's nested shape). Throws WRONGTYPE via getSortedSet if a\n// scanned key holds a non-zset value, matching real Redis.\nfunction tryBlockingZsetPop(\n keys: readonly Buffer[],\n side: ZsetPopSide,\n db: RedisDatabase,\n): RedisResult | null {\n for (const key of keys) {\n const zset = db.getSortedSet(key)\n if (!zset || zset.members.size === 0) continue\n\n const sorted = getSortedMembers(zset)\n const entry = side === 'min' ? sorted[0] : sorted[sorted.length - 1]\n\n db.updateSortedSet(key, z => {\n z.deleteMember(entry.member)\n })\n deleteSortedSetIfEmpty(db, key)\n\n return RedisResult.create(\n RedisValue.array([\n RedisValue.bulkString(key),\n RedisValue.bulkString(entry.member),\n scoreValue(entry.score),\n ]),\n )\n }\n\n return null\n}\n\nasync function blockingZsetPop(\n keys: readonly Buffer[],\n timeoutSecs: number,\n side: ZsetPopSide,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs =\n timeoutSecs === 0 ? undefined : Math.ceil(timeoutSecs * 1000)\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return RedisResult.create(RedisValue.nullArray())\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return RedisResult.create(RedisValue.nullArray())\n\n const result = tryBlockingZsetPop(keys, side, ctx.db)\n if (result) return result\n }\n}\n\nfunction defineBlockingZsetPop(name: string, side: ZsetPopSide) {\n return defineCommand({\n name,\n schema: t.custom<BlockingZsetPopArgs>((input, index, ctx) => ({\n value: parseBlockingZsetPopArgs(input, index, ctx.commandName),\n nextIndex: input.length,\n })),\n flags: ['write', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const immediate = tryBlockingZsetPop(args.keys, side, ctx.db)\n if (immediate) return immediate\n return blockingZsetPop(args.keys, args.timeout, side, ctx)\n },\n })\n}\n\nexport const bzpopminCommand = defineBlockingZsetPop('bzpopmin', 'min')\nexport const bzpopmaxCommand = defineBlockingZsetPop('bzpopmax', 'max')\n","import { defineCommand } from '../../core/command-definition'\nimport { isIntegerToken, t, type ParseContext } from '../../core/command-schema'\nimport type { RedisExecutionContext } from '../../core/redis-context'\nimport { RedisResult } from '../../core/redis-result'\nimport {\n CountGreaterThanZeroError,\n NumKeysGreaterThanZeroError,\n RedisSyntaxError,\n TimeoutNegativeError,\n TimeoutNotFloatError,\n WrongNumberOfArgumentsError,\n} from '../../core/redis-error'\nimport { RedisValue } from '../../core/redis-value'\nimport type { RedisDatabase } from '../../state'\nimport { scoreValue } from '../helpers'\nimport { deleteSortedSetIfEmpty, getSortedMembers } from './helpers'\n\ntype ZsetMultiPopSide = 'min' | 'max'\n\ntype ZsetMultiPopArgs = {\n keys: Buffer[]\n side: ZsetMultiPopSide\n count: number\n}\n\ntype BlockingZsetMultiPopArgs = ZsetMultiPopArgs & {\n timeout: number\n}\n\nfunction parsePositiveZsetPopInteger(\n token: Buffer,\n createError: () => Error,\n): number {\n const raw = token.toString()\n if (!isIntegerToken(raw)) {\n throw createError()\n }\n\n const value = Number(raw)\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw createError()\n }\n\n return value\n}\n\nfunction parseZsetPopNumKeys(token: Buffer): number {\n return parsePositiveZsetPopInteger(\n token,\n () => new NumKeysGreaterThanZeroError(),\n )\n}\n\nfunction parseZsetPopCount(token: Buffer): number {\n return parsePositiveZsetPopInteger(\n token,\n () => new CountGreaterThanZeroError(),\n )\n}\n\nfunction parseZsetPopSide(token: Buffer | undefined): ZsetMultiPopSide {\n if (!token) throw new RedisSyntaxError()\n const side = token.toString().toUpperCase()\n if (side === 'MIN') return 'min'\n if (side === 'MAX') return 'max'\n throw new RedisSyntaxError()\n}\n\nfunction parseZsetPopTimeout(token: Buffer): number {\n const value = Number(token.toString())\n if (isNaN(value)) throw new TimeoutNotFloatError()\n if (value < 0) throw new TimeoutNegativeError()\n return value\n}\n\nfunction parseZsetMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: false },\n): ZsetMultiPopArgs\nfunction parseZsetMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: true },\n): BlockingZsetMultiPopArgs\nfunction parseZsetMultiPopArgs(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: { blocking: boolean },\n): ZsetMultiPopArgs | BlockingZsetMultiPopArgs {\n if (index >= input.length) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n let cursor = index\n let timeout: number | undefined\n\n if (options.blocking) {\n timeout = parseZsetPopTimeout(input[cursor])\n cursor++\n }\n\n const numKeysToken = input[cursor]\n if (!numKeysToken) {\n throw new WrongNumberOfArgumentsError(ctx.commandName)\n }\n\n const numKeys = parseZsetPopNumKeys(numKeysToken)\n cursor++\n\n const keysEnd = cursor + numKeys\n if (keysEnd >= input.length) {\n throw new RedisSyntaxError()\n }\n\n const keys = Array.from(input.slice(cursor, keysEnd))\n cursor = keysEnd\n\n const side = parseZsetPopSide(input[cursor])\n cursor++\n\n let count = 1\n if (cursor < input.length) {\n const option = input[cursor].toString().toUpperCase()\n if (option !== 'COUNT' || cursor + 2 !== input.length) {\n throw new RedisSyntaxError()\n }\n\n count = parseZsetPopCount(input[cursor + 1])\n }\n\n if (options.blocking) {\n return { timeout: timeout!, keys, side, count }\n }\n\n return { keys, side, count }\n}\n\nexport function tryZsetMultiPop(\n keys: readonly Buffer[],\n side: ZsetMultiPopSide,\n count: number,\n db: RedisDatabase,\n): RedisResult | null {\n for (const key of keys) {\n const zset = db.getSortedSet(key)\n if (!zset || zset.members.size === 0) continue\n\n const sorted = getSortedMembers(zset)\n const candidates = side === 'min' ? sorted : sorted.slice().reverse()\n const toRemove = candidates.slice(0, count)\n if (toRemove.length === 0) continue\n\n db.updateSortedSet(key, zset => {\n for (const entry of toRemove) {\n zset.deleteMember(entry.member)\n }\n })\n deleteSortedSetIfEmpty(db, key)\n\n return RedisResult.create(\n RedisValue.array([\n RedisValue.bulkString(key),\n RedisValue.array(\n toRemove.map(entry =>\n RedisValue.array([\n RedisValue.bulkString(entry.member),\n scoreValue(entry.score),\n ]),\n ),\n ),\n ]),\n )\n }\n\n return null\n}\n\nasync function blockingZsetMultiPop(\n keys: readonly Buffer[],\n timeoutSecs: number,\n side: ZsetMultiPopSide,\n count: number,\n ctx: RedisExecutionContext,\n): Promise<RedisResult> {\n const timeoutMs =\n timeoutSecs === 0 ? undefined : Math.ceil(timeoutSecs * 1000)\n const deadline = timeoutMs !== undefined ? Date.now() + timeoutMs : undefined\n\n while (true) {\n const remaining =\n deadline !== undefined ? Math.max(0, deadline - Date.now()) : undefined\n if (remaining === 0) return RedisResult.create(RedisValue.nullArray())\n\n let wake!: (v: true) => void\n const waitFor = new Promise<true>(resolve => {\n wake = () => resolve(true)\n })\n\n const unsubs = keys.map(key =>\n ctx.db.subscribeKey(key, event => {\n if (event.type === 'write') wake(true)\n }),\n )\n\n let woken: boolean | null\n try {\n woken = await ctx.park({\n waitFor,\n timeoutMs: remaining,\n signal: ctx.signal,\n })\n } finally {\n for (const unsub of unsubs) {\n try {\n unsub()\n } catch {\n // ignore errors from individual unsubscribers so all are attempted\n }\n }\n }\n\n if (woken === null) return RedisResult.create(RedisValue.nullArray())\n\n const result = tryZsetMultiPop(keys, side, count, ctx.db)\n if (result) return result\n }\n}\n\nexport const zmpopCommand = defineCommand({\n name: 'zmpop',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.custom<ZsetMultiPopArgs>((input, index, ctx) => ({\n value: parseZsetMultiPopArgs(input, index, ctx, { blocking: false }),\n nextIndex: input.length,\n })),\n flags: ['write'],\n keys: args => args.keys,\n execute: (args, ctx) =>\n tryZsetMultiPop(args.keys, args.side, args.count, ctx.db) ??\n RedisResult.create(RedisValue.nullArray()),\n})\n\nexport const bzmpopCommand = defineCommand({\n name: 'bzmpop',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: t.custom<BlockingZsetMultiPopArgs>((input, index, ctx) => ({\n value: parseZsetMultiPopArgs(input, index, ctx, { blocking: true }),\n nextIndex: input.length,\n })),\n flags: ['write', 'noscript'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const immediate = tryZsetMultiPop(args.keys, args.side, args.count, ctx.db)\n if (immediate) return immediate\n return blockingZsetMultiPop(\n args.keys,\n args.timeout,\n args.side,\n args.count,\n ctx,\n )\n },\n})\n","import { defineCommand } from '../../core/command-definition'\nimport { t, type ParseContext } from '../../core/command-schema'\nimport {\n AtLeastOneInputKeyError,\n LimitCantBeNegativeError,\n RedisSyntaxError,\n WeightNotFloatError,\n WrongNumberOfArgumentsError,\n WrongTypeRedisError,\n} from '../../core/redis-error'\nimport { RedisResult } from '../../core/redis-result'\nimport { RedisValue } from '../../core/redis-value'\nimport type {\n RedisDatabase,\n RedisSortedSetData,\n RedisSortedSetMember,\n} from '../../state'\nimport { array, integer, parseIntegerToken, scorePairs } from '../helpers'\nimport { getSortedMembers } from './helpers'\n\n// ZUNIONSTORE/ZINTERSTORE/ZUNION/ZINTER/ZDIFF/ZDIFFSTORE/ZINTERCARD.\n// Source keys may be sorted sets OR plain sets (a set is treated as a zset with\n// every member scored 1). WEIGHTS multiply each source's scores before they are\n// combined; AGGREGATE (SUM default, MIN, MAX) controls how scores merge. ZDIFF\n// has neither WEIGHTS nor AGGREGATE — it just subtracts members, keeping the\n// scores from the first key. STORE variants write the result to a destination\n// key (deleting it when the result is empty) and reply with the cardinality.\n\ntype Aggregate = 'sum' | 'min' | 'max'\n\ntype SetOpArgs = {\n destination?: Buffer\n keys: Buffer[]\n weights?: number[]\n aggregate: Aggregate\n withScores: boolean\n}\n\ntype ParserOptions = {\n hasDest: boolean\n weightsAggregate: boolean\n}\n\n// ---------------------------------------------------------------- shared logic\n\nfunction getScoredMembers(\n db: RedisDatabase,\n key: Buffer,\n): Map<string, RedisSortedSetMember> {\n const type = db.getType(key)\n if (type === null) return new Map()\n\n if (type === 'zset') {\n const zset = db.getSortedSet(key)!\n return new Map(\n Array.from(zset.members, ([hex, m]) => [\n hex,\n { member: m.member, score: m.score },\n ]),\n )\n }\n\n if (type === 'set') {\n const set = db.getSet(key)!\n return new Map(\n Array.from(set.members, ([hex, member]) => [hex, { member, score: 1 }]),\n )\n }\n\n throw new WrongTypeRedisError()\n}\n\nfunction weightedScore(score: number, weight: number): number {\n const result = weight * score\n // Redis resets a NaN weighted score (e.g. 0 * inf) to 0 before aggregating.\n return Number.isNaN(result) ? 0 : result\n}\n\nfunction aggregateScores(a: number, b: number, aggregate: Aggregate): number {\n if (aggregate === 'min') return Math.min(a, b)\n if (aggregate === 'max') return Math.max(a, b)\n const sum = a + b\n // SUM of +inf and -inf is NaN; Redis stores 0 in that case.\n return Number.isNaN(sum) ? 0 : sum\n}\n\nfunction weightAt(weights: number[] | undefined, index: number): number {\n return weights ? weights[index] : 1\n}\n\nfunction computeUnion(\n sources: Map<string, RedisSortedSetMember>[],\n weights: number[] | undefined,\n aggregate: Aggregate,\n): Map<string, RedisSortedSetMember> {\n const result = new Map<string, RedisSortedSetMember>()\n for (let i = 0; i < sources.length; i++) {\n const weight = weightAt(weights, i)\n for (const [hex, { member, score }] of sources[i]) {\n const weighted = weightedScore(score, weight)\n const existing = result.get(hex)\n if (!existing) {\n result.set(hex, { member, score: weighted })\n continue\n }\n existing.score = aggregateScores(existing.score, weighted, aggregate)\n }\n }\n return result\n}\n\nfunction computeIntersection(\n sources: Map<string, RedisSortedSetMember>[],\n weights: number[] | undefined,\n aggregate: Aggregate,\n): Map<string, RedisSortedSetMember> {\n const result = new Map<string, RedisSortedSetMember>()\n const [first, ...rest] = sources\n for (const [hex, { member, score }] of first) {\n let acc = weightedScore(score, weightAt(weights, 0))\n let present = true\n for (let i = 0; i < rest.length; i++) {\n const entry = rest[i].get(hex)\n if (!entry) {\n present = false\n break\n }\n acc = aggregateScores(\n acc,\n weightedScore(entry.score, weightAt(weights, i + 1)),\n aggregate,\n )\n }\n if (present) result.set(hex, { member, score: acc })\n }\n return result\n}\n\nfunction computeDifference(\n sources: Map<string, RedisSortedSetMember>[],\n): Map<string, RedisSortedSetMember> {\n const [first, ...rest] = sources\n const result = new Map(first)\n for (const source of rest) {\n for (const hex of source.keys()) result.delete(hex)\n }\n return result\n}\n\nfunction buildScoredResult(\n members: Map<string, RedisSortedSetMember>,\n withScores: boolean,\n): RedisResult {\n const sorted = getSortedMembers({\n type: 'zset',\n members,\n } as RedisSortedSetData)\n if (withScores) {\n return RedisResult.create(scorePairs(sorted))\n }\n return array(sorted.map(entry => RedisValue.bulkString(entry.member)))\n}\n\nfunction storeResult(\n db: RedisDatabase,\n destination: Buffer,\n members: Map<string, RedisSortedSetMember>,\n): number {\n if (members.size === 0) {\n db.delete(destination)\n return 0\n }\n db.updateSortedSet(destination, zset => {\n zset.replaceMembers(members, { forceDirty: true })\n })\n return members.size\n}\n\n// ------------------------------------------------------------------- parsing\n\nfunction parseWeight(token: Buffer): number {\n const raw = token.toString()\n const normalized = raw.toLowerCase()\n if (normalized === 'inf' || normalized === '+inf') return Infinity\n if (normalized === '-inf') return -Infinity\n\n const value = Number(raw)\n if (raw.trim() === '' || !Number.isFinite(value)) {\n throw new WeightNotFloatError()\n }\n return value\n}\n\nfunction parseSetOp(\n input: readonly Buffer[],\n index: number,\n ctx: ParseContext,\n options: ParserOptions,\n): SetOpArgs {\n let cursor = index\n\n let destination: Buffer | undefined\n if (options.hasDest) {\n destination = input[cursor]\n if (!destination) throw new WrongNumberOfArgumentsError(ctx.commandName)\n cursor++\n }\n\n const numkeysToken = input[cursor]\n if (!numkeysToken) throw new WrongNumberOfArgumentsError(ctx.commandName)\n cursor++\n\n const numkeys = parseIntegerToken(numkeysToken)\n if (numkeys <= 0) throw new AtLeastOneInputKeyError(ctx.commandName)\n if (cursor + numkeys > input.length) throw new RedisSyntaxError()\n\n const keys = input.slice(cursor, cursor + numkeys)\n cursor += numkeys\n\n let weights: number[] | undefined\n let aggregate: Aggregate = 'sum'\n let withScores = false\n\n while (cursor < input.length) {\n const option = input[cursor]!.toString().toUpperCase()\n\n if (options.weightsAggregate && option === 'WEIGHTS') {\n cursor++\n weights = []\n for (let i = 0; i < numkeys; i++) {\n const token = input[cursor]\n if (!token) throw new RedisSyntaxError()\n weights.push(parseWeight(token))\n cursor++\n }\n continue\n }\n\n if (options.weightsAggregate && option === 'AGGREGATE') {\n cursor++\n const token = input[cursor]\n if (!token) throw new RedisSyntaxError()\n const value = token.toString().toUpperCase()\n if (value === 'SUM') aggregate = 'sum'\n else if (value === 'MIN') aggregate = 'min'\n else if (value === 'MAX') aggregate = 'max'\n else throw new RedisSyntaxError()\n cursor++\n continue\n }\n\n // WITHSCORES is only valid for the non-store ZUNION/ZINTER/ZDIFF variants.\n if (!options.hasDest && option === 'WITHSCORES') {\n withScores = true\n cursor++\n continue\n }\n\n throw new RedisSyntaxError()\n }\n\n return { destination, keys, weights, aggregate, withScores }\n}\n\nfunction setOpSchema(options: ParserOptions) {\n return t.custom<SetOpArgs>((input, index, ctx) => ({\n value: parseSetOp(input, index, ctx, options),\n nextIndex: input.length,\n }))\n}\n\n// ------------------------------------------------------------------- commands\n\nexport const zunionstoreCommand = defineCommand({\n name: 'zunionstore',\n schema: setOpSchema({ hasDest: true, weightsAggregate: true }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination!, ...args.keys],\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeUnion(sources, args.weights, args.aggregate)\n return integer(storeResult(ctx.db, args.destination!, result))\n },\n})\n\nexport const zinterstoreCommand = defineCommand({\n name: 'zinterstore',\n schema: setOpSchema({ hasDest: true, weightsAggregate: true }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination!, ...args.keys],\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeIntersection(sources, args.weights, args.aggregate)\n return integer(storeResult(ctx.db, args.destination!, result))\n },\n})\n\nexport const zdiffstoreCommand = defineCommand({\n name: 'zdiffstore',\n schema: setOpSchema({ hasDest: true, weightsAggregate: false }),\n flags: ['write', 'denyoom'],\n keys: args => [args.destination!, ...args.keys],\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeDifference(sources)\n return integer(storeResult(ctx.db, args.destination!, result))\n },\n})\n\nexport const zunionCommand = defineCommand({\n name: 'zunion',\n schema: setOpSchema({ hasDest: false, weightsAggregate: true }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeUnion(sources, args.weights, args.aggregate)\n return buildScoredResult(result, args.withScores)\n },\n})\n\nexport const zinterCommand = defineCommand({\n name: 'zinter',\n schema: setOpSchema({ hasDest: false, weightsAggregate: true }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeIntersection(sources, args.weights, args.aggregate)\n return buildScoredResult(result, args.withScores)\n },\n})\n\nexport const zdiffCommand = defineCommand({\n name: 'zdiff',\n schema: setOpSchema({ hasDest: false, weightsAggregate: false }),\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const result = computeDifference(sources)\n return buildScoredResult(result, args.withScores)\n },\n})\n\n// ZINTERCARD numkeys key [key ...] [LIMIT limit]\ntype ZintercardArgs = { keys: Buffer[]; limit: number }\n\nconst zintercardSchema = t.custom<ZintercardArgs>((input, index, ctx) => {\n let cursor = index\n\n const numkeysToken = input[cursor]\n if (!numkeysToken) throw new WrongNumberOfArgumentsError(ctx.commandName)\n cursor++\n\n const numkeys = parseIntegerToken(numkeysToken)\n if (numkeys <= 0) throw new AtLeastOneInputKeyError(ctx.commandName)\n if (cursor + numkeys > input.length) throw new RedisSyntaxError()\n\n const keys = input.slice(cursor, cursor + numkeys)\n cursor += numkeys\n\n let limit = 0\n if (cursor < input.length) {\n if (input[cursor]!.toString().toUpperCase() !== 'LIMIT') {\n throw new RedisSyntaxError()\n }\n cursor++\n const limitToken = input[cursor]\n if (!limitToken) throw new RedisSyntaxError()\n const value = Number(limitToken.toString())\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new LimitCantBeNegativeError()\n }\n limit = value\n cursor++\n if (cursor !== input.length) throw new RedisSyntaxError()\n }\n\n return { value: { keys, limit }, nextIndex: input.length }\n})\n\nexport const zintercardCommand = defineCommand({\n name: 'zintercard',\n since: { redis: '7.0.0', valkey: '7.2.0' },\n schema: zintercardSchema,\n flags: ['readonly'],\n keys: args => args.keys,\n execute: (args, ctx) => {\n const sources = args.keys.map(k => getScoredMembers(ctx.db, k))\n const count = computeIntersection(sources, undefined, 'sum').size\n if (args.limit > 0) return integer(Math.min(count, args.limit))\n return integer(count)\n },\n})\n","import { zaddCommand } from './zadd'\nimport { zcardCommand, zremCommand } from './zrem'\nimport { zrankCommand, zrevrankCommand } from './zrank'\nimport { zmscoreCommand, zscoreCommand } from './zscore'\nimport { zrandmemberCommand } from './zrandmember'\nimport { zincrbyCommand } from './zincrby'\nimport { zrangeCommand, zrangestoreCommand, zrevrangeCommand } from './zrange'\nimport {\n zcountCommand,\n zrangebyscoreCommand,\n zrevrangebyscoreCommand,\n zremrangebyscoreCommand,\n zremrangebyrankCommand,\n} from './zrangebyscore'\nimport {\n zlexcountCommand,\n zrangebylexCommand,\n zremrangebylexCommand,\n zrevrangebylexCommand,\n} from './zrangebylex'\nimport {\n bzpopmaxCommand,\n bzpopminCommand,\n zpopmaxCommand,\n zpopminCommand,\n} from './zpop'\nimport { bzmpopCommand, zmpopCommand } from './zmpop'\nimport {\n zdiffCommand,\n zdiffstoreCommand,\n zintercardCommand,\n zinterCommand,\n zinterstoreCommand,\n zunionCommand,\n zunionstoreCommand,\n} from './zsetops'\n\nexport const zsetsCommands = [\n zaddCommand,\n zremCommand,\n zcardCommand,\n zrankCommand,\n zrevrankCommand,\n zscoreCommand,\n zmscoreCommand,\n zrandmemberCommand,\n zincrbyCommand,\n zrangeCommand,\n zrangestoreCommand,\n zrevrangeCommand,\n zrangebyscoreCommand,\n zrevrangebyscoreCommand,\n zremrangebyscoreCommand,\n zremrangebyrankCommand,\n zcountCommand,\n zrangebylexCommand,\n zrevrangebylexCommand,\n zlexcountCommand,\n zremrangebylexCommand,\n zpopminCommand,\n zpopmaxCommand,\n bzpopminCommand,\n bzpopmaxCommand,\n zmpopCommand,\n bzmpopCommand,\n zunionstoreCommand,\n zinterstoreCommand,\n zdiffstoreCommand,\n zunionCommand,\n zinterCommand,\n zdiffCommand,\n zintercardCommand,\n]\n\nexport {\n zaddCommand,\n zremCommand,\n zcardCommand,\n zrankCommand,\n zrevrankCommand,\n zscoreCommand,\n zmscoreCommand,\n zrandmemberCommand,\n zincrbyCommand,\n zrangeCommand,\n zrangestoreCommand,\n zrevrangeCommand,\n zrangebyscoreCommand,\n zrevrangebyscoreCommand,\n zremrangebyscoreCommand,\n zremrangebyrankCommand,\n zcountCommand,\n zrangebylexCommand,\n zrevrangebylexCommand,\n zlexcountCommand,\n zremrangebylexCommand,\n zpopminCommand,\n zpopmaxCommand,\n bzpopminCommand,\n bzpopmaxCommand,\n zmpopCommand,\n bzmpopCommand,\n zunionstoreCommand,\n zinterstoreCommand,\n zdiffstoreCommand,\n zunionCommand,\n zinterCommand,\n zdiffCommand,\n zintercardCommand,\n}\n","export function formatHostPort(host: string, port: number): string {\n return `${formatHost(host)}:${port}`\n}\n\nexport function formatSocketAddressParts(\n address: string | undefined,\n port: number | undefined,\n): string | undefined {\n const host = normalizeSocketAddress(address)\n if (!host || port === undefined) {\n return host\n }\n\n return formatHostPort(host, port)\n}\n\nfunction normalizeSocketAddress(\n address: string | undefined,\n): string | undefined {\n if (address?.startsWith('::ffff:')) {\n return address.slice('::ffff:'.length)\n }\n\n return address\n}\n\nfunction formatHost(host: string): string {\n if (host.includes(':') && !host.startsWith('[')) {\n return `[${host}]`\n }\n\n return host\n}\n","import {\n defineCommand,\n type CommandDefinition,\n} from '../core/command-definition'\nimport { t } from '../core/command-schema'\nimport { formatHostPort } from '../core/network-address'\nimport {\n UnknownClusterSubcommandError,\n WrongNumberOfArgumentsError,\n} from '../core/redis-error'\nimport { RedisResult } from '../core/redis-result'\nimport { RedisValue } from '../core/redis-value'\nimport {\n REDIS_CLUSTER_SLOT_COUNT,\n type RedisClusterNode,\n type RedisClusterTopology,\n} from '../state'\nimport { commandSubcommandInfo } from './introspection'\n\n/**\n * Builds the CLUSTER command bound to a specific node id. Each cluster node\n * gets its own definition so that subcommands like NODES/MYID can report the\n * \"myself\" marker correctly. Topology is read from ctx.server at execute time.\n */\nexport function createClusterCommand(localNodeId: string): CommandDefinition {\n return defineCommand({\n name: 'cluster',\n schema: t.object({\n subcommand: t.string(),\n rest: t.variadic(t.bulk()),\n }),\n flags: ['admin'],\n monitor: {\n skip: true,\n },\n introspection: {\n arity: -2,\n flags: ['admin'],\n firstKey: 0,\n lastKey: 0,\n keyStep: 0,\n categories: ['@admin', '@slow', '@dangerous'],\n keySpecs: [],\n subcommands: [\n commandSubcommandInfo('cluster|info', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('cluster|nodes', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('cluster|slots', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('cluster|shards', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n commandSubcommandInfo('cluster|myid', 2, {\n categories: ['@admin', '@slow', '@dangerous'],\n }),\n ],\n },\n keys: () => [],\n execute: (args, ctx) => {\n const topology = ctx.server.clusterTopology\n const subcommand = args.subcommand.toLowerCase()\n\n switch (subcommand) {\n case 'slots':\n expectClusterRestLength(args.rest, 'cluster|slots')\n return clusterSlots(topology)\n case 'shards':\n expectClusterRestLength(args.rest, 'cluster|shards')\n return clusterShards(topology)\n case 'nodes':\n expectClusterRestLength(args.rest, 'cluster|nodes')\n return clusterNodes(topology, localNodeId)\n case 'info':\n expectClusterRestLength(args.rest, 'cluster|info')\n return clusterInfo(topology, localNodeId)\n case 'myid':\n expectClusterRestLength(args.rest, 'cluster|myid')\n return RedisResult.create(\n RedisValue.bulkString(Buffer.from(localNodeId)),\n )\n default:\n throw new UnknownClusterSubcommandError(args.subcommand)\n }\n },\n })\n}\n\nexport function createClusterCommands(\n localNodeId: string,\n): readonly CommandDefinition[] {\n return [createClusterCommand(localNodeId), readonlyCommand, readwriteCommand]\n}\n\nexport const readonlyCommand = defineCommand({\n name: 'readonly',\n schema: t.object({}),\n flags: ['readonly', 'fast'],\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.session.setClusterReadOnly(true)\n return RedisResult.ok()\n },\n})\n\nexport const readwriteCommand = defineCommand({\n name: 'readwrite',\n schema: t.object({}),\n flags: ['readonly', 'fast'],\n keys: () => [],\n execute: (_args, ctx) => {\n ctx.session.setClusterReadOnly(false)\n return RedisResult.ok()\n },\n})\n\nfunction expectClusterRestLength(\n rest: readonly Buffer[],\n commandName: string,\n): void {\n if (rest.length !== 0) {\n throw new WrongNumberOfArgumentsError(commandName)\n }\n}\n\nfunction masters(topology: RedisClusterTopology): RedisClusterNode[] {\n return topology.nodes.filter(node => node.role === 'master')\n}\n\nfunction replicasOf(\n topology: RedisClusterTopology,\n masterId: string,\n): RedisClusterNode[] {\n return topology.nodes.filter(\n node => node.role === 'replica' && node.masterId === masterId,\n )\n}\n\nfunction nodeEntry(node: RedisClusterNode): RedisValue {\n return RedisValue.array([\n RedisValue.bulkString(Buffer.from(node.host)),\n RedisValue.integer(node.port),\n RedisValue.bulkString(Buffer.from(node.id)),\n RedisValue.array([]),\n ])\n}\n\nfunction clusterSlots(topology: RedisClusterTopology): RedisResult {\n const slots: RedisValue[] = []\n for (const master of masters(topology)) {\n const master_ = nodeEntry(master)\n const replicas = replicasOf(topology, master.id).map(nodeEntry)\n for (const [min, max] of master.slots) {\n slots.push(\n RedisValue.array([\n RedisValue.integer(min),\n RedisValue.integer(max),\n master_,\n ...replicas,\n ]),\n )\n }\n }\n return RedisResult.create(RedisValue.array(slots))\n}\n\nfunction clusterShards(topology: RedisClusterTopology): RedisResult {\n const shards: RedisValue[] = []\n for (const master of masters(topology)) {\n const slotRanges: RedisValue[] = []\n for (const [min, max] of master.slots) {\n slotRanges.push(RedisValue.integer(min), RedisValue.integer(max))\n }\n\n const shardNodes = [master, ...replicasOf(topology, master.id)].map(node =>\n RedisValue.map([\n [\n RedisValue.bulkString(Buffer.from('id')),\n RedisValue.bulkString(Buffer.from(node.id)),\n ],\n [\n RedisValue.bulkString(Buffer.from('port')),\n RedisValue.integer(node.port),\n ],\n [\n RedisValue.bulkString(Buffer.from('ip')),\n RedisValue.bulkString(Buffer.from(node.host)),\n ],\n [\n RedisValue.bulkString(Buffer.from('endpoint')),\n RedisValue.bulkString(Buffer.from(node.host)),\n ],\n [\n RedisValue.bulkString(Buffer.from('role')),\n RedisValue.bulkString(Buffer.from(node.role)),\n ],\n [\n RedisValue.bulkString(Buffer.from('replication-offset')),\n RedisValue.integer(0),\n ],\n [\n RedisValue.bulkString(Buffer.from('health')),\n RedisValue.bulkString(Buffer.from('online')),\n ],\n ]),\n )\n\n shards.push(\n RedisValue.map([\n [\n RedisValue.bulkString(Buffer.from('slots')),\n RedisValue.array(slotRanges),\n ],\n [\n RedisValue.bulkString(Buffer.from('nodes')),\n RedisValue.array(shardNodes),\n ],\n ]),\n )\n }\n return RedisResult.create(RedisValue.array(shards))\n}\n\nfunction clusterNodes(\n topology: RedisClusterTopology,\n localNodeId: string,\n): RedisResult {\n const masterList = masters(topology)\n const epochs = new Map<string, number>()\n masterList.forEach((master, index) => epochs.set(master.id, index + 1))\n\n const lines: string[] = []\n for (const node of topology.nodes) {\n const epoch =\n node.role === 'master'\n ? (epochs.get(node.id) ?? 0)\n : (epochs.get(node.masterId ?? '') ?? 0)\n lines.push(formatNodeLine(node, localNodeId, epoch))\n }\n\n return RedisResult.create(RedisValue.bulkString(Buffer.from(lines.join(''))))\n}\n\nfunction formatNodeLine(\n node: RedisClusterNode,\n localNodeId: string,\n configEpoch: number,\n): string {\n const connection = `${formatHostPort(node.host, node.port)}@${node.port + 10000}`\n const myself = node.id === localNodeId ? 'myself,' : ''\n const roleField =\n node.role === 'master' ? 'master -' : `slave ${node.masterId}`\n const ping = `0 ${Date.now()}`\n const slots =\n node.role === 'master'\n ? node.slots\n .map(([min, max]) => (min === max ? ` ${min}` : ` ${min}-${max}`))\n .join('')\n : ''\n return `${node.id} ${connection} ${myself}${roleField} ${ping} ${configEpoch} connected${slots}\\n`\n}\n\nfunction clusterInfo(\n topology: RedisClusterTopology,\n localNodeId: string,\n): RedisResult {\n const masterList = masters(topology)\n const knownNodes = topology.nodes.length\n const size = masterList.length\n\n const local = topology.getNode(localNodeId)\n const myMasterId =\n local?.role === 'replica' ? (local.masterId ?? localNodeId) : localNodeId\n const myEpoch = masterList.findIndex(master => master.id === myMasterId) + 1\n\n const lines = [\n 'cluster_enabled:1',\n 'cluster_state:ok',\n `cluster_slots_assigned:${REDIS_CLUSTER_SLOT_COUNT}`,\n `cluster_slots_ok:${REDIS_CLUSTER_SLOT_COUNT}`,\n 'cluster_slots_pfail:0',\n 'cluster_slots_fail:0',\n `cluster_known_nodes:${knownNodes}`,\n `cluster_size:${size}`,\n `cluster_current_epoch:${size}`,\n `cluster_my_epoch:${myEpoch}`,\n 'cluster_stats_messages_sent:0',\n 'cluster_stats_messages_received:0',\n 'total_cluster_links_buffer_limit_exceeded:0',\n ]\n\n return RedisResult.create(\n RedisValue.bulkString(Buffer.from(`${lines.join('\\r\\n')}\\r\\n`)),\n )\n}\n","import type { CommandDefinition } from '../core/command-definition'\nimport { CommandExecutor } from '../core/command-executor'\nimport { CommandRegistry } from '../core/command-registry'\nimport {\n gateSatisfied,\n resolveCompatibilityProfile,\n type CompatibilityProfile,\n type CompatibilitySpec,\n} from '../core/compatibility'\nimport type { ExecutionPolicy } from '../core/execution-policies'\nimport {\n createAuthPolicy,\n createSubscribedModePolicy,\n createTransactionPolicy,\n} from '../core/execution-policies'\nimport { bitmapsCommands } from './bitmaps'\nimport { commandCommand } from './command'\nimport { configCommands } from './config'\nimport { connectionCommands } from './connection'\nimport { geoCommands } from './geo'\nimport { hashesCommands } from './hashes'\nimport { hyperloglogCommands } from './hyperloglog'\nimport { keysCommands } from './keys'\nimport { listsCommands } from './lists'\nimport { monitorCommands } from './monitor'\nimport { pubsubCommands } from './pubsub'\nimport { scanCommands } from './scan'\nimport { scriptsCommands } from './scripts'\nimport { setsCommands } from './sets'\nimport { streamsCommands } from './streams'\nimport { stringsCommands } from './strings'\nimport { transactionCommands } from './transactions'\nimport { zsetsCommands } from './zsets'\n\nexport const redisCommandDefinitions: readonly CommandDefinition[] = [\n ...connectionCommands,\n commandCommand,\n ...configCommands,\n ...transactionCommands,\n ...monitorCommands,\n ...stringsCommands,\n ...bitmapsCommands,\n ...hyperloglogCommands,\n ...keysCommands,\n ...scanCommands,\n ...hashesCommands,\n ...listsCommands,\n ...setsCommands,\n ...zsetsCommands,\n ...geoCommands,\n ...pubsubCommands,\n ...streamsCommands,\n ...scriptsCommands,\n]\n\nexport function createRedisCommandRegistry(\n extraCommands: readonly CommandDefinition[] = [],\n profile: CompatibilityProfile = resolveCompatibilityProfile(),\n): CommandRegistry {\n const registry = new CommandRegistry()\n registry.registerAll(\n filterCompatibleCommands(redisCommandDefinitions, profile),\n )\n registry.registerAll(filterCompatibleCommands(extraCommands, profile))\n return registry\n}\n\nexport function createRedisCommandExecutor(options?: {\n extraCommands?: readonly CommandDefinition[]\n policies?: readonly ExecutionPolicy[]\n compatibility?: CompatibilitySpec\n}): CommandExecutor {\n const profile = resolveCompatibilityProfile(options?.compatibility)\n return new CommandExecutor({\n registry: createRedisCommandRegistry(options?.extraCommands, profile),\n profile,\n policies: [\n createAuthPolicy(),\n createSubscribedModePolicy(),\n ...(options?.policies ?? []),\n createTransactionPolicy(),\n ],\n })\n}\n\nfunction filterCompatibleCommands(\n definitions: readonly CommandDefinition[],\n profile: CompatibilityProfile,\n): CommandDefinition[] {\n return definitions.filter(\n definition =>\n definition.since === undefined ||\n gateSatisfied(definition.since, profile),\n )\n}\n\nexport {\n aclCommand,\n clientCommand,\n pingCommand,\n quitCommand,\n selectCommand,\n shutdownCommand,\n slowlogCommand,\n connectionCommands,\n} from './connection'\nexport { monitorCommand, monitorCommands } from './monitor'\nexport {\n createClusterCommands,\n readonlyCommand,\n readwriteCommand,\n} from './cluster'\nexport { commandCommand } from './command'\nexport { configCommand, configCommands } from './config'\nexport {\n getCommand,\n setCommand,\n mgetCommand,\n appendCommand,\n strlenCommand,\n incrCommand,\n decrCommand,\n incrbyCommand,\n decrbyCommand,\n incrbyfloatCommand,\n getsetCommand,\n getdelCommand,\n setnxCommand,\n setexCommand,\n psetexCommand,\n msetCommand,\n msetnxCommand,\n getrangeCommand,\n substrCommand,\n setrangeCommand,\n getexCommand,\n stringsCommands,\n} from './strings'\nexport {\n bitmapsCommands,\n setbitCommand,\n getbitCommand,\n bitcountCommand,\n bitposCommand,\n bitopCommand,\n bitfieldCommand,\n bitfieldRoCommand,\n} from './bitmaps'\nexport {\n hyperloglogCommands,\n pfaddCommand,\n pfcountCommand,\n pfmergeCommand,\n} from './hyperloglog'\nexport {\n discardCommand,\n execCommand,\n multiCommand,\n transactionCommands,\n unwatchCommand,\n watchCommand,\n} from './transactions'\nexport {\n copyCommand,\n dbsizeCommand,\n delCommand,\n existsCommand,\n expireCommand,\n expireatCommand,\n expiretimeCommand,\n pexpiretimeCommand,\n flushallCommand,\n flushdbCommand,\n keysCommands,\n moveCommand,\n persistCommand,\n pexpireCommand,\n pexpireatCommand,\n pttlCommand,\n randomkeyCommand,\n renameCommand,\n renamenxCommand,\n sortCommand,\n sortRoCommand,\n touchCommand,\n ttlCommand,\n typeCommand,\n unlinkCommand,\n} from './keys'\nexport {\n hscanCommand,\n keysCommand,\n scanCommand,\n scanCommands,\n sscanCommand,\n zscanCommand,\n} from './scan'\nexport {\n listsCommands,\n blmpopCommand,\n blmoveCommand,\n blpopCommand,\n brpopCommand,\n lindexCommand,\n linsertCommand,\n llenCommand,\n lmoveCommand,\n lmpopCommand,\n lpopCommand,\n lposCommand,\n lpushCommand,\n lpushxCommand,\n lrangeCommand,\n lremCommand,\n lsetCommand,\n ltrimCommand,\n rpopCommand,\n rpoplpushCommand,\n rpushCommand,\n rpushxCommand,\n} from './lists'\nexport {\n publishCommand,\n psubscribeCommand,\n pubsubCommand,\n pubsubCommands,\n punsubscribeCommand,\n spublishCommand,\n ssubscribeCommand,\n subscribeCommand,\n sunsubscribeCommand,\n unsubscribeCommand,\n} from './pubsub'\nexport {\n hashesCommands,\n hexistsCommand,\n hgetallCommand,\n hgetdelCommand,\n hgetexCommand,\n hsetexCommand,\n hgetCommand,\n hdelCommand,\n hincrbyfloatCommand,\n hincrbyCommand,\n hpersistCommand,\n hpttlCommand,\n httlCommand,\n hkeysCommand,\n hlenCommand,\n hmgetCommand,\n hmsetCommand,\n hrandfieldCommand,\n hsetnxCommand,\n hsetCommand,\n hstrlenCommand,\n hvalsCommand,\n} from './hashes'\nexport {\n setsCommands,\n saddCommand,\n scardCommand,\n sdiffCommand,\n sdiffstoreCommand,\n sinterCommand,\n sintercardCommand,\n sinterstoreCommand,\n sismemberCommand,\n smismemberCommand,\n smembersCommand,\n smoveCommand,\n spopCommand,\n srandmemberCommand,\n sremCommand,\n sunionCommand,\n sunionstoreCommand,\n} from './sets'\nexport {\n evalCommand,\n evalRoCommand,\n evalshaCommand,\n evalshaRoCommand,\n fcallCommand,\n fcallRoCommand,\n functionCommand,\n scriptCommand,\n scriptsCommands,\n} from './scripts'\nexport {\n xackCommand,\n xaddCommand,\n xautoclaimCommand,\n xclaimCommand,\n xdelCommand,\n xgroupCommand,\n xinfoCommand,\n xlenCommand,\n xpendingCommand,\n xreadCommand,\n xreadgroupCommand,\n xrevrangeCommand,\n xrangeCommand,\n streamsCommands,\n xtrimCommand,\n} from './streams'\nexport {\n geoCommands,\n geoaddCommand,\n geoposCommand,\n geodistCommand,\n geohashCommand,\n geosearchCommand,\n geosearchstoreCommand,\n georadiusCommand,\n georadiusRoCommand,\n georadiusbymemberCommand,\n georadiusbymemberRoCommand,\n} from './geo'\nexport {\n zsetsCommands,\n zaddCommand,\n zremCommand,\n zcardCommand,\n zrankCommand,\n zrevrankCommand,\n zscoreCommand,\n zincrbyCommand,\n zrangeCommand,\n zrevrangeCommand,\n zrangebyscoreCommand,\n zremrangebyscoreCommand,\n zcountCommand,\n zpopminCommand,\n zpopmaxCommand,\n bzpopminCommand,\n bzpopmaxCommand,\n zmpopCommand,\n bzmpopCommand,\n} from './zsets'\n","import { AddressInfo, Server, Socket, createServer } from 'net'\nimport type { CommandExecutor } from '../../command-executor'\nimport type { Logger } from '../../../logger'\nimport type { RedisClusterNodeRole, RedisServerState } from '../../../state'\nimport type { RespEncodeOptions } from '../../resp-encoder'\nimport { formatHostPort, formatSocketAddressParts } from '../../network-address'\nimport { attachSession } from '../attach-session'\nimport { SocketConnectionTransport } from '../socket-connection-transport'\nimport { Resp2SessionAdapter } from './session-adapter'\n\nexport type Resp2ServerOptions = {\n server: RedisServerState\n executor: CommandExecutor\n logger?: Pick<Logger, 'error'>\n encoder?: RespEncodeOptions\n nodeRole?: RedisClusterNodeRole\n}\n\nexport class Resp2Server {\n readonly server: Server\n\n private readonly state: RedisServerState\n private readonly executor: CommandExecutor\n private readonly logger?: Pick<Logger, 'error'>\n private readonly encoder?: RespEncodeOptions\n private readonly nodeRole?: RedisClusterNodeRole\n private readonly adapters = new Set<Resp2SessionAdapter>()\n\n constructor(options: Resp2ServerOptions) {\n this.state = options.server\n this.executor = options.executor\n this.logger = options.logger\n this.encoder = options.encoder\n this.nodeRole = options.nodeRole\n\n this.server = createServer({ keepAlive: true })\n .on('error', err => this.logger?.error(err))\n .on('connection', socket => this.handleConnection(socket))\n }\n\n listen(port?: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const onError = (err: Error) => {\n this.server.removeListener('listening', onListening)\n reject(err)\n }\n const onListening = () => {\n this.server.removeListener('error', onError)\n resolve()\n }\n\n this.server.once('error', onError)\n this.server.once('listening', onListening)\n this.server.listen(port)\n })\n }\n\n close(): Promise<void> {\n return new Promise((resolve, reject) =>\n this.server.close(err => {\n this.state.close()\n if (err) {\n reject(err)\n return\n }\n resolve()\n }),\n )\n }\n\n getAddress(): string {\n const address = this.server.address()\n if (!address || typeof address === 'string') {\n throw new Error('Server not listening')\n }\n const info = address as AddressInfo\n return formatHostPort('127.0.0.1', info.port)\n }\n\n getPort(): number {\n const address = this.server.address()\n if (!address || typeof address === 'string') {\n throw new Error('Server not listening')\n }\n return (address as AddressInfo).port\n }\n\n private handleConnection(socket: Socket) {\n const transport = new SocketConnectionTransport(socket)\n const { adapter, done } = attachSession(transport, {\n state: this.state,\n executor: this.executor,\n nodeRole: this.nodeRole,\n logger: this.logger,\n encoder: this.encoder,\n clientAddress: formatSocketAddressParts(\n socket.remoteAddress,\n socket.remotePort,\n ),\n })\n\n this.adapters.add(adapter)\n void done.finally(() => this.adapters.delete(adapter))\n }\n}\n","import type { RedisClusterNodeRole } from '../state/cluster-topology'\nimport type { RedisDatabase } from '../state/database'\nimport type { RedisMonitorCommandEvent } from '../state/monitor-feed'\nimport type { RedisServerState } from '../state/server-state'\nimport type { CommandExecutor } from './command-executor'\nimport type { CommandPlan } from './command-definition'\nimport type { RedisResult } from './redis-result'\nimport type { RespVersion } from './resp-encoder'\n\nexport type ParkRequest<TValue> = {\n waitFor: Promise<TValue | null>\n timeoutMs?: number\n signal: AbortSignal\n}\n\nexport type ParkHandler = <TValue>(\n request: ParkRequest<TValue>,\n) => Promise<TValue | null>\n\nexport type ClientSessionMode = 'normal' | 'transaction' | 'subscribed'\n\nexport type RedisMonitorContext = {\n readonly disabled?: boolean\n readonly defer?: boolean\n readonly clientAddress?: string\n readonly deferredEvents?: RedisMonitorCommandEvent[]\n}\n\nexport interface RedisClientSession {\n readonly id: string\n readonly clientAddress?: string\n readonly connectedAtMs: number\n readonly selectedDatabase: number\n readonly mode: ClientSessionMode\n readonly protocolVersion: RespVersion\n readonly usesSubscribedReplyMode: boolean\n readonly clusterReadOnly: boolean\n readonly isAuthenticated: boolean\n setAuthenticated(value: boolean): void\n setProtocolVersion(version: RespVersion): void\n setClusterReadOnly(value: boolean): void\n selectDatabase(database: number): void\n beginTransaction(): void\n queueTransaction(plan: CommandPlan): void\n drainTransaction(): CommandPlan[]\n discardTransaction(): void\n markTransactionDirty(): void\n isTransactionDirty(): boolean\n executeTransaction(plans: readonly CommandPlan[]): Promise<RedisResult>\n watch(keys: readonly Buffer[]): void\n unwatch(): void\n isWatchDirty(): boolean\n readonly pubsubChannelCount: number\n readonly pubsubShardChannelCount: number\n readonly pubsubPatternCount: number\n readonly pubsubSubscriptionCount: number\n subscribePubSubChannels(channels: readonly Buffer[]): RedisResult[]\n unsubscribePubSubChannels(channels: readonly Buffer[]): RedisResult[]\n subscribePubSubShardChannels(channels: readonly Buffer[]): RedisResult[]\n unsubscribePubSubShardChannels(channels: readonly Buffer[]): RedisResult[]\n subscribePubSubPatterns(patterns: readonly Buffer[]): RedisResult[]\n unsubscribePubSubPatterns(patterns: readonly Buffer[]): RedisResult[]\n resetPubSub(): void\n deferPushesUntilAfterReply(): () => void\n registerResponseStreamCleanup(cleanup: () => void): () => void\n resetResponseStreams(): void\n disconnect(reason?: string): void\n}\n\nexport interface RedisExecutionContext {\n readonly db: RedisDatabase\n readonly server: RedisServerState\n readonly session: RedisClientSession\n readonly executor: CommandExecutor\n readonly transactionReplay?: boolean\n readonly nodeRole?: RedisClusterNodeRole\n readonly monitor?: RedisMonitorContext\n readonly signal: AbortSignal\n park: ParkHandler\n}\n\nexport function createDefaultParkHandler(): ParkHandler {\n return request =>\n new Promise((resolve, reject) => {\n if (request.signal.aborted) {\n reject(createAbortError())\n return\n }\n\n let settled = false\n let timer: NodeJS.Timeout | undefined\n\n const cleanup = () => {\n if (timer) {\n clearTimeout(timer)\n }\n request.signal.removeEventListener('abort', onAbort)\n }\n\n const settle = (callback: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n callback()\n }\n\n const onAbort = () => {\n settle(() => reject(createAbortError()))\n }\n\n request.signal.addEventListener('abort', onAbort, { once: true })\n\n if (request.timeoutMs !== undefined) {\n timer = setTimeout(() => {\n settle(() => resolve(null))\n }, request.timeoutMs)\n }\n\n request.waitFor.then(\n value => settle(() => resolve(value)),\n err => settle(() => reject(err)),\n )\n })\n}\n\nexport function createNoopParkHandler(): ParkHandler {\n return createDefaultParkHandler()\n}\n\n/**\n * Park handler for commands replayed inside MULTI/EXEC.\n *\n * Blocking commands (BLPOP, BLMOVE, BLMPOP, BZMPOP, XREAD BLOCK, ...) must not\n * actually block here: real Redis runs them non-blocking inside a transaction\n * and returns the immediate \"nothing happened\" result (e.g. BLPOP -> nil). This\n * resolves `null` straight away — the same timeout sentinel a real park returns\n * on expiry — so the command takes its non-blocking branch and its `finally`\n * cleanup (wakeup-subscription teardown) runs.\n *\n * Unlike a bare `async () => null`, it still *honors* the park request:\n * - it attaches a no-op handler to `request.waitFor`, so a command whose wait\n * rejects never surfaces an unhandled promise rejection (mirrors\n * {@link createDefaultParkHandler}, which consumes `waitFor`);\n * - it rejects with an AbortError if the session signal is already aborted, so\n * a transaction aborted mid-EXEC propagates immediately instead of swallowing\n * the abort.\n *\n * Commands MUST release any wakeup subscription in a `finally` around\n * `ctx.park(...)`, never by chaining off `waitFor` — a non-blocking park may\n * resolve without `waitFor` ever settling.\n */\nexport function createNonBlockingParkHandler(): ParkHandler {\n return request => {\n // Consume waitFor; we never await its value but a rejection must not leak.\n request.waitFor.catch(() => {})\n\n if (request.signal.aborted) {\n return Promise.reject(createAbortError())\n }\n\n return Promise.resolve(null)\n }\n}\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted')\n err.name = 'AbortError'\n return err\n}\n","import { RedisResult } from './redis-result'\nimport { RedisValue } from './redis-value'\n\nexport type RespVersion = 2 | 3\n\nexport type RespEncodeOptions = {\n version?: RespVersion\n}\n\nexport function encodeRedisResult(\n result: RedisResult,\n options?: RespEncodeOptions,\n): Buffer {\n if (result.encoded) {\n return Buffer.from(result.encoded)\n }\n\n return encodeRedisValue(result.value, options)\n}\n\nexport function encodeRedisValue(\n value: RedisValue,\n options?: RespEncodeOptions,\n): Buffer {\n const version = options?.version ?? 2\n if (version === 3) {\n return encodeResp3(value)\n }\n\n return encodeResp2(value)\n}\n\nfunction encodeResp2(value: RedisValue): Buffer {\n switch (value.kind) {\n case 'simple-string':\n return Buffer.from(`+${value.value}\\r\\n`)\n case 'bulk-string':\n return encodeBulkString(value.value)\n case 'integer':\n return Buffer.from(`:${value.value.toString()}\\r\\n`)\n case 'double':\n return encodeBulkString(Buffer.from(formatNumber(value.value)))\n case 'boolean':\n return Buffer.from(`:${value.value ? 1 : 0}\\r\\n`)\n case 'big-number':\n return encodeBulkString(Buffer.from(value.value.toString()))\n case 'verbatim':\n return encodeBulkString(value.value)\n case 'array':\n return encodeArray(value.items)\n case 'set':\n return encodeArray(value.items)\n case 'map':\n return encodeArray(\n value.entries.flatMap(([key, entryValue]) => [key, entryValue]),\n )\n case 'map-pairs':\n return encodeArray(\n value.entries.map(([key, entryValue]) =>\n RedisValue.array([key, entryValue]),\n ),\n )\n case 'flat-pairs':\n return encodeArray(\n value.entries.flatMap(([key, entryValue]) => [key, entryValue]),\n )\n case 'push':\n return encodeArray([\n { kind: 'bulk-string', value: Buffer.from(value.name) },\n ...value.items,\n ])\n case 'null':\n return encodeBulkString(null)\n case 'null-array':\n return Buffer.from('*-1\\r\\n')\n case 'error':\n return Buffer.from(`-${formatError(value)}\\r\\n`)\n }\n}\n\nfunction encodeResp3(value: RedisValue): Buffer {\n switch (value.kind) {\n case 'simple-string':\n return Buffer.from(`+${value.value}\\r\\n`)\n case 'bulk-string':\n return encodeResp3BlobString(value.value)\n case 'integer':\n return Buffer.from(`:${value.value.toString()}\\r\\n`)\n case 'double':\n return Buffer.from(`,${formatNumber(value.value)}\\r\\n`)\n case 'boolean':\n return Buffer.from(value.value ? '#t\\r\\n' : '#f\\r\\n')\n case 'big-number':\n return Buffer.from(`(${value.value.toString()}\\r\\n`)\n case 'verbatim':\n return encodeResp3VerbatimString(value.format, value.value)\n case 'array':\n return encodeResp3Array(value.items)\n case 'set':\n return encodeResp3Set(value.items)\n case 'map':\n return encodeResp3Map(value.entries)\n case 'map-pairs':\n return encodeResp3Map(value.entries)\n case 'flat-pairs':\n return encodeResp3Array(\n value.entries.map(([key, entryValue]) =>\n RedisValue.array([key, entryValue]),\n ),\n )\n case 'push':\n return encodeResp3Push(value.name, value.items)\n case 'null':\n case 'null-array':\n return Buffer.from('_\\r\\n')\n case 'error':\n return Buffer.from(`-${formatError(value)}\\r\\n`)\n }\n}\n\nfunction encodeArray(items: readonly RedisValue[]): Buffer {\n return Buffer.concat([\n Buffer.from(`*${items.length}\\r\\n`),\n ...items.map(item => encodeResp2(item)),\n ])\n}\n\nfunction encodeResp3Array(items: readonly RedisValue[]): Buffer {\n return Buffer.concat([\n Buffer.from(`*${items.length}\\r\\n`),\n ...items.map(item => encodeResp3(item)),\n ])\n}\n\nfunction encodeResp3Set(items: readonly RedisValue[]): Buffer {\n return Buffer.concat([\n Buffer.from(`~${items.length}\\r\\n`),\n ...items.map(item => encodeResp3(item)),\n ])\n}\n\nfunction encodeResp3Map(entries: readonly [RedisValue, RedisValue][]): Buffer {\n const frames: Buffer[] = [Buffer.from(`%${entries.length}\\r\\n`)]\n for (const [key, value] of entries) {\n frames.push(encodeResp3(key), encodeResp3(value))\n }\n return Buffer.concat(frames)\n}\n\nfunction encodeResp3Push(name: string, items: readonly RedisValue[]): Buffer {\n return Buffer.concat([\n Buffer.from(`>${items.length + 1}\\r\\n`),\n encodeResp3BlobString(Buffer.from(name)),\n ...items.map(item => encodeResp3(item)),\n ])\n}\n\nfunction encodeBulkString(value: Buffer | null): Buffer {\n if (value === null) {\n return Buffer.from('$-1\\r\\n')\n }\n\n return Buffer.concat([\n Buffer.from(`$${value.length}\\r\\n`),\n value,\n Buffer.from('\\r\\n'),\n ])\n}\n\nfunction encodeResp3BlobString(value: Buffer | null): Buffer {\n if (value === null) {\n return Buffer.from('_\\r\\n')\n }\n\n return encodeBulkString(value)\n}\n\nfunction encodeResp3VerbatimString(format: string, value: Buffer): Buffer {\n if (Buffer.byteLength(format) !== 3) {\n throw new Error(\n `RESP3 verbatim string format must be exactly 3 bytes, got ${JSON.stringify(format)}`,\n )\n }\n\n const payload = Buffer.concat([Buffer.from(`${format}:`), value])\n return Buffer.concat([\n Buffer.from(`=${payload.length}\\r\\n`),\n payload,\n Buffer.from('\\r\\n'),\n ])\n}\n\nfunction formatError(value: Extract<RedisValue, { kind: 'error' }>): string {\n const message = sanitizeErrorText(value.message)\n return value.code ? `${sanitizeErrorText(value.code)} ${message}` : message\n}\n\nfunction formatNumber(value: number): string {\n if (Number.isNaN(value)) {\n return 'nan'\n }\n\n if (value === Infinity) {\n return 'inf'\n }\n\n if (value === -Infinity) {\n return '-inf'\n }\n\n if (Object.is(value, -0)) {\n return '-0'\n }\n\n return value.toString()\n}\n\nfunction sanitizeErrorText(value: string): string {\n return value.replace(/[\\r\\n]+/g, ' ')\n}\n","import type { CommandPlan } from './command-definition'\nimport { CommandExecutor, type ExecutorResult } from './command-executor'\nimport {\n createDefaultParkHandler,\n createNonBlockingParkHandler,\n type ClientSessionMode,\n type ParkHandler,\n type ParkRequest,\n type RedisClientSession,\n type RedisExecutionContext,\n type RedisMonitorContext,\n} from './redis-context'\nimport { RedisCommandError } from './redis-error'\nimport { RedisResult } from './redis-result'\nimport { RedisValue } from './redis-value'\nimport { encodeRedisValue, type RespVersion } from './resp-encoder'\nimport { type RedisTurnHandle, type RedisTurnQueue } from './turn-queue'\nimport type { RedisClusterNodeRole } from '../state/cluster-topology'\nimport type { RedisDatabase } from '../state/database'\nimport type { RedisServerState } from '../state/server-state'\nimport type { Unsubscribe } from '../state/mutation-events'\n\nexport type ClientSessionOptions = {\n id?: string\n clientAddress?: string\n server: RedisServerState\n executor: CommandExecutor\n database?: number\n nodeRole?: RedisClusterNodeRole\n signal?: AbortSignal\n park?: ParkHandler\n turnQueue?: RedisTurnQueue\n closeConnection?: (reason?: string) => void\n}\n\n/**\n * Mutable view of the turn currently held by an in-flight command. A blocking\n * command suspends its turn while parked and is later resumed on a *new* handle,\n * so the holder must be able to both read the current turn and swap it.\n */\ntype TurnAccess = {\n get(): RedisTurnHandle | undefined\n set(turn: RedisTurnHandle | undefined): void\n}\n\ntype WatchRegistration = {\n database: number\n key: Buffer\n unsubscribe: Unsubscribe\n}\n\ntype PubSubRegistration = {\n value: Buffer\n unsubscribe: Unsubscribe\n}\n\n/**\n * Per-connection server state and the concrete {@link RedisClientSession}.\n *\n * One instance exists per connected client and owns everything that is scoped\n * to that connection rather than to the shared server:\n * - the selected database index and the resolved {@link RedisDatabase};\n * - the session {@link ClientSessionMode} (normal / transaction / subscribed);\n * - the negotiated RESP protocol version (HELLO);\n * - the cluster READONLY flag (replica reads via READONLY/READWRITE);\n * - the MULTI command queue and its dirty bit;\n * - WATCH key registrations for optimistic locking.\n *\n * Commands are serialized through a per-database turn queue so that, even though\n * execution is async, only one command mutates a given database at a time. This\n * is also what makes blocking commands (BLPOP, ...) cooperate instead of\n * deadlock — see {@link createTurnAwareParkHandler}.\n */\nexport class ClientSession implements RedisClientSession {\n private static nextId = 0\n\n readonly id: string\n readonly clientAddress?: string\n readonly connectedAtMs: number\n readonly server: RedisServerState\n /** Aborted when the connection closes; threaded into every command's ctx. */\n readonly signal: AbortSignal\n\n private readonly executor: CommandExecutor\n private readonly signalSource?: AbortController\n private readonly nodeRole?: RedisClusterNodeRole\n private readonly parkHandler: ParkHandler\n private readonly turnQueueOverride?: RedisTurnQueue\n private readonly closeConnection?: (reason?: string) => void\n /**\n * The turn handle of the command currently executing on this session,\n * exposed so {@link executeTransaction} can hand the turn off to another\n * database's queue when a queued SELECT switches databases mid-EXEC.\n */\n private activeTurnAccess?: TurnAccess\n private selectedDatabaseId: number\n private sessionMode: ClientSessionMode = 'normal'\n private respVersion: RespVersion = 2\n private authenticated = false\n /** Set by READONLY, cleared by READWRITE/RESET; lets a replica serve reads. */\n private clusterReadOnlyMode = false\n /** Commands buffered between MULTI and EXEC, in submission order. */\n private transactionPlans: CommandPlan[] = []\n /** True once a queued command errored — forces EXEC to abort with EXECABORT. */\n private transactionDirty = false\n /** Active WATCH registrations, keyed by `db:keyHex`. */\n private readonly watches = new Map<string, WatchRegistration>()\n /** Subset of watched keys mutated since WATCH — non-empty fails the next EXEC. */\n private readonly dirtyWatches = new Set<string>()\n private readonly pubsubChannels = new Map<string, PubSubRegistration>()\n private readonly pubsubShardChannels = new Map<string, PubSubRegistration>()\n private readonly pubsubPatterns = new Map<string, PubSubRegistration>()\n private readonly pushQueue: RedisResult[] = []\n private readonly pushWaiters = new Set<() => void>()\n private deferredPushes: RedisResult[] | null = null\n private pushQueueClosed = false\n private readonly responseStreamCleanups = new Set<() => void>()\n private unregisterClientSession?: Unsubscribe\n\n constructor(options: ClientSessionOptions) {\n this.id = options.id ?? `client-${++ClientSession.nextId}`\n this.clientAddress = options.clientAddress\n this.connectedAtMs = Date.now()\n this.server = options.server\n this.executor = options.executor\n this.selectedDatabaseId = options.database ?? 0\n this.nodeRole = options.nodeRole\n this.parkHandler = options.park ?? createDefaultParkHandler()\n this.turnQueueOverride = options.turnQueue\n this.closeConnection = options.closeConnection\n\n if (options.signal) {\n this.signal = options.signal\n } else {\n this.signalSource = new AbortController()\n this.signal = this.signalSource.signal\n }\n\n this.server.getDatabase(this.selectedDatabaseId)\n this.unregisterClientSession = this.server.registerClientSession(this)\n }\n\n get selectedDatabase(): number {\n return this.selectedDatabaseId\n }\n\n get mode(): ClientSessionMode {\n return this.sessionMode\n }\n\n get protocolVersion(): RespVersion {\n return this.respVersion\n }\n\n get usesSubscribedReplyMode(): boolean {\n return this.sessionMode === 'subscribed' && this.respVersion === 2\n }\n\n get clusterReadOnly(): boolean {\n return this.clusterReadOnlyMode\n }\n\n get isAuthenticated(): boolean {\n return this.authenticated\n }\n\n get pubsubChannelCount(): number {\n return this.pubsubChannels.size\n }\n\n get pubsubShardChannelCount(): number {\n return this.pubsubShardChannels.size\n }\n\n get pubsubPatternCount(): number {\n return this.pubsubPatterns.size\n }\n\n get pubsubRegularSubscriptionCount(): number {\n return this.pubsubChannelCount + this.pubsubPatternCount\n }\n\n get pubsubSubscriptionCount(): number {\n return this.pubsubRegularSubscriptionCount + this.pubsubShardChannelCount\n }\n\n setAuthenticated(value: boolean): void {\n this.authenticated = value\n }\n\n /** The live database object for the currently selected index. */\n get db(): RedisDatabase {\n return this.server.getDatabase(this.selectedDatabaseId)\n }\n\n setProtocolVersion(version: RespVersion): void {\n this.respVersion = version\n }\n\n /** Toggle replica read mode for this connection (READONLY / READWRITE). */\n setClusterReadOnly(value: boolean): void {\n this.clusterReadOnlyMode = value\n }\n\n selectDatabase(database: number): void {\n if (\n !Number.isInteger(database) ||\n database < 0 ||\n database >= this.server.databases.length\n ) {\n throw new RedisCommandError('DB index is out of range')\n }\n\n this.selectedDatabaseId = database\n }\n\n /** MULTI: enter transaction mode. Redis forbids nesting. */\n beginTransaction(): void {\n if (this.sessionMode === 'transaction') {\n throw new RedisCommandError('MULTI calls can not be nested')\n }\n\n this.sessionMode = 'transaction'\n this.transactionPlans = []\n this.transactionDirty = false\n }\n\n /** Buffer one command while in MULTI; replies \"+QUEUED\" to the client. */\n queueTransaction(plan: CommandPlan): void {\n if (this.sessionMode !== 'transaction') {\n throw new RedisCommandError('MULTI has not been called')\n }\n\n this.transactionPlans.push(plan)\n }\n\n /**\n * EXEC step 1: hand back the queued plans and atomically reset the session to\n * normal mode (clearing the queue, dirty bit, and WATCHes). The caller is\n * responsible for actually running the returned plans via\n * {@link executeTransaction}. Returns an empty list if not in MULTI.\n */\n drainTransaction(): CommandPlan[] {\n if (this.sessionMode !== 'transaction') {\n return []\n }\n\n const plans = [...this.transactionPlans]\n this.transactionPlans = []\n this.sessionMode = 'normal'\n this.transactionDirty = false\n this.unwatch()\n return plans\n }\n\n /** DISCARD: drop the queued commands and leave transaction mode. */\n discardTransaction(): void {\n this.transactionPlans = []\n this.sessionMode = 'normal'\n this.transactionDirty = false\n this.unwatch()\n }\n\n /** Flag the transaction as poisoned (a queued command failed). No-op outside MULTI. */\n markTransactionDirty(): void {\n if (this.sessionMode === 'transaction') {\n this.transactionDirty = true\n }\n }\n\n isTransactionDirty(): boolean {\n return this.transactionDirty\n }\n\n /**\n * EXEC step 2: run the drained plans in order and collect their replies into a\n * single array reply. Each command runs in its own fresh execution context.\n * Streaming commands (SUBSCRIBE/MONITOR) are not permitted inside a\n * transaction: the stream is closed immediately and replaced with an error\n * entry so the array stays positionally aligned with the queued commands.\n */\n async executeTransaction(\n plans: readonly CommandPlan[],\n ): Promise<RedisResult> {\n const values: RedisValue[] = []\n const encodedValues: Buffer[] = []\n let sawProtocolSwitch = false\n\n // Blocking commands must not park while the EXEC turn is held — that would\n // deadlock because no other session could produce the wakeup write. Override\n // park so any blocking command queued in MULTI behaves non-blocking (returns\n // null immediately), matching real Redis BLPOP-inside-MULTI semantics. The\n // handler still consumes the park request (waitFor + abort signal) instead of\n // discarding it — see createNonBlockingParkHandler.\n const noBlockCtx = this.createExecutionContext(\n undefined,\n createNonBlockingParkHandler(),\n undefined,\n true,\n )\n let currentDbId = this.selectedDatabaseId\n\n for (const plan of plans) {\n if (this.signal.aborted) {\n throw createAbortError()\n }\n\n // A queued SELECT on a previous iteration may have switched databases.\n // Move the held turn onto the now-selected database's queue so its\n // keyspace stays serialized against other sessions (#94 follow-up). Only\n // one turn is ever held at a time (release-then-acquire), so this cannot\n // deadlock even if two transactions select databases in opposite orders.\n if (this.selectedDatabaseId !== currentDbId) {\n await this.handoffTurnToSelectedDb()\n currentDbId = this.selectedDatabaseId\n }\n\n // executePlan converts RedisCommandErrors into error results, but a\n // command whose execute() throws an unexpected runtime error (TypeError,\n // etc.) would otherwise propagate out and abandon the partial results\n // array. Real Redis always replies with an N-element EXEC array, so trap\n // the failure into this command's slot and keep running the rest (#83).\n let result: Awaited<ReturnType<typeof this.executor.executePlan>>\n const versionBefore = this.protocolVersion\n try {\n result = await this.executor.executePlan(plan, noBlockCtx)\n } catch (err) {\n if (this.signal.aborted) {\n throw err\n }\n this.appendTransactionValue(\n RedisValue.error((err as Error).message),\n values,\n encodedValues,\n )\n sawProtocolSwitch ||= this.protocolVersion !== versionBefore\n continue\n }\n\n if (result instanceof RedisResult) {\n this.appendTransactionValue(\n result.value,\n values,\n encodedValues,\n result.encoded,\n )\n sawProtocolSwitch ||= this.protocolVersion !== versionBefore\n continue\n }\n\n result.close('streaming command is not allowed in transaction')\n this.appendTransactionValue(\n RedisValue.error('Streaming command is not allowed in transaction'),\n values,\n encodedValues,\n )\n sawProtocolSwitch ||= this.protocolVersion !== versionBefore\n }\n\n const value = RedisValue.array(values)\n if (!sawProtocolSwitch) {\n return RedisResult.create(value)\n }\n\n return RedisResult.preEncoded(value, encodeTransactionArray(encodedValues))\n }\n\n private appendTransactionValue(\n value: RedisValue,\n values: RedisValue[],\n encodedValues: Buffer[],\n encoded?: Buffer,\n ): void {\n values.push(value)\n encodedValues.push(\n encoded\n ? Buffer.from(encoded)\n : encodeRedisValue(value, { version: this.protocolVersion }),\n )\n }\n\n /**\n * Release the currently held serialization turn and acquire a fresh one on\n * the selected database's queue. Called when a queued SELECT switches\n * databases mid-EXEC so subsequent commands run under the correct\n * per-database turn (see {@link executeTransaction}).\n *\n * No-op when a fixed turn-queue override is in force (a single queue already\n * serializes every database) or when no managed turn is active.\n */\n private async handoffTurnToSelectedDb(): Promise<void> {\n if (this.turnQueueOverride) {\n return\n }\n const turnAccess = this.activeTurnAccess\n if (!turnAccess) {\n return\n }\n\n turnAccess.get()?.release()\n const nextTurn = await this.db.turnQueue.waitTurn()\n turnAccess.set(nextTurn)\n }\n\n /**\n * WATCH the given keys for optimistic locking. Each key is subscribed in the\n * keyspace; any mutation flips its entry into {@link dirtyWatches}, which a\n * subsequent EXEC checks via {@link isWatchDirty}. Already-watched keys are\n * skipped so re-WATCHing is idempotent.\n */\n watch(keys: readonly Buffer[]): void {\n const database = this.selectedDatabaseId\n const db = this.db\n\n for (const key of keys) {\n const id = watchId(database, key)\n if (this.watches.has(id)) {\n continue\n }\n\n const unsubscribe = db.subscribeKey(key, () => {\n this.dirtyWatches.add(id)\n })\n\n this.watches.set(id, {\n database,\n key: Buffer.from(key),\n unsubscribe,\n })\n }\n }\n\n /** UNWATCH / cleanup: drop every keyspace subscription and clear dirty state. */\n unwatch(): void {\n for (const watch of this.watches.values()) {\n watch.unsubscribe()\n }\n\n this.watches.clear()\n this.dirtyWatches.clear()\n }\n\n /** True if any watched key was mutated since WATCH — EXEC must return nil. */\n isWatchDirty(): boolean {\n return this.dirtyWatches.size > 0\n }\n\n subscribePubSubChannels(channels: readonly Buffer[]): RedisResult[] {\n const frames: RedisResult[] = []\n\n for (const channel of channels) {\n const key = pubsubId(channel)\n if (!this.pubsubChannels.has(key)) {\n const subscribedChannel = Buffer.from(channel)\n const unsubscribe = this.server.pubsubBroker.subscribe(\n subscribedChannel,\n message => {\n this.enqueuePush(\n pubsubFrame('message', [\n RedisValue.bulkString(Buffer.from(message.channel)),\n RedisValue.bulkString(Buffer.from(message.message)),\n ]),\n )\n },\n )\n\n this.pubsubChannels.set(key, {\n value: subscribedChannel,\n unsubscribe,\n })\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('subscribe', [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n )\n }\n\n return frames\n }\n\n unsubscribePubSubChannels(channels: readonly Buffer[]): RedisResult[] {\n const targets =\n channels.length > 0\n ? channels\n : Array.from(\n this.pubsubChannels.values(),\n entry => entry.value,\n ).reverse()\n\n if (targets.length === 0) {\n this.refreshPubSubMode()\n return [\n pubsubFrame('unsubscribe', [\n RedisValue.bulkString(null),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n ]\n }\n\n const frames: RedisResult[] = []\n for (const channel of targets) {\n const key = pubsubId(channel)\n const existing = this.pubsubChannels.get(key)\n if (existing) {\n existing.unsubscribe()\n this.pubsubChannels.delete(key)\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('unsubscribe', [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n )\n }\n\n return frames\n }\n\n subscribePubSubShardChannels(channels: readonly Buffer[]): RedisResult[] {\n const frames: RedisResult[] = []\n\n for (const channel of channels) {\n const key = pubsubId(channel)\n if (!this.pubsubShardChannels.has(key)) {\n const subscribedChannel = Buffer.from(channel)\n const unsubscribe = this.server.pubsubBroker.ssubscribe(\n subscribedChannel,\n message => {\n this.enqueuePush(\n pubsubFrame('smessage', [\n RedisValue.bulkString(Buffer.from(message.channel)),\n RedisValue.bulkString(Buffer.from(message.message)),\n ]),\n )\n },\n )\n\n this.pubsubShardChannels.set(key, {\n value: subscribedChannel,\n unsubscribe,\n })\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('ssubscribe', [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(this.pubsubShardChannelCount),\n ]),\n )\n }\n\n return frames\n }\n\n unsubscribePubSubShardChannels(channels: readonly Buffer[]): RedisResult[] {\n const targets =\n channels.length > 0\n ? channels\n : Array.from(\n this.pubsubShardChannels.values(),\n entry => entry.value,\n ).reverse()\n\n if (targets.length === 0) {\n this.refreshPubSubMode()\n return [\n pubsubFrame('sunsubscribe', [\n RedisValue.bulkString(null),\n RedisValue.integer(this.pubsubShardChannelCount),\n ]),\n ]\n }\n\n const frames: RedisResult[] = []\n for (const channel of targets) {\n const key = pubsubId(channel)\n const existing = this.pubsubShardChannels.get(key)\n if (existing) {\n existing.unsubscribe()\n this.pubsubShardChannels.delete(key)\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('sunsubscribe', [\n RedisValue.bulkString(Buffer.from(channel)),\n RedisValue.integer(this.pubsubShardChannelCount),\n ]),\n )\n }\n\n return frames\n }\n\n subscribePubSubPatterns(patterns: readonly Buffer[]): RedisResult[] {\n const frames: RedisResult[] = []\n\n for (const pattern of patterns) {\n const key = pubsubId(pattern)\n if (!this.pubsubPatterns.has(key)) {\n const subscribedPattern = Buffer.from(pattern)\n const unsubscribe = this.server.pubsubBroker.psubscribe(\n subscribedPattern,\n message => {\n this.enqueuePush(\n pubsubFrame('pmessage', [\n RedisValue.bulkString(Buffer.from(message.pattern)),\n RedisValue.bulkString(Buffer.from(message.channel)),\n RedisValue.bulkString(Buffer.from(message.message)),\n ]),\n )\n },\n )\n\n this.pubsubPatterns.set(key, {\n value: subscribedPattern,\n unsubscribe,\n })\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('psubscribe', [\n RedisValue.bulkString(Buffer.from(pattern)),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n )\n }\n\n return frames\n }\n\n unsubscribePubSubPatterns(patterns: readonly Buffer[]): RedisResult[] {\n const targets =\n patterns.length > 0\n ? patterns\n : Array.from(\n this.pubsubPatterns.values(),\n entry => entry.value,\n ).reverse()\n\n if (targets.length === 0) {\n this.refreshPubSubMode()\n return [\n pubsubFrame('punsubscribe', [\n RedisValue.bulkString(null),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n ]\n }\n\n const frames: RedisResult[] = []\n for (const pattern of targets) {\n const key = pubsubId(pattern)\n const existing = this.pubsubPatterns.get(key)\n if (existing) {\n existing.unsubscribe()\n this.pubsubPatterns.delete(key)\n }\n\n this.refreshPubSubMode()\n frames.push(\n pubsubFrame('punsubscribe', [\n RedisValue.bulkString(Buffer.from(pattern)),\n RedisValue.integer(this.pubsubRegularSubscriptionCount),\n ]),\n )\n }\n\n return frames\n }\n\n resetPubSub(): void {\n for (const subscription of this.pubsubChannels.values()) {\n subscription.unsubscribe()\n }\n for (const subscription of this.pubsubShardChannels.values()) {\n subscription.unsubscribe()\n }\n for (const subscription of this.pubsubPatterns.values()) {\n subscription.unsubscribe()\n }\n\n this.pubsubChannels.clear()\n this.pubsubShardChannels.clear()\n this.pubsubPatterns.clear()\n this.refreshPubSubMode()\n }\n\n deferPushesUntilAfterReply(): () => void {\n const deferred: RedisResult[] = []\n this.deferredPushes = deferred\n return () => {\n this.deferredPushes = null\n for (const result of deferred) {\n this.enqueuePush(result)\n }\n }\n }\n\n registerResponseStreamCleanup(cleanup: () => void): Unsubscribe {\n this.responseStreamCleanups.add(cleanup)\n return () => {\n this.responseStreamCleanups.delete(cleanup)\n }\n }\n\n resetResponseStreams(): void {\n const cleanups = Array.from(this.responseStreamCleanups)\n this.responseStreamCleanups.clear()\n\n for (const cleanup of cleanups) {\n cleanup()\n }\n }\n\n enqueuePush(result: RedisResult): void {\n if (this.pushQueueClosed || this.signal.aborted) {\n return\n }\n\n if (this.deferredPushes) {\n this.deferredPushes.push(result)\n return\n }\n\n this.pushQueue.push(result)\n this.wakePushWaiters()\n }\n\n async *readPushes(signal: AbortSignal): AsyncIterable<RedisResult> {\n while (!signal.aborted && !this.signal.aborted) {\n const frame = this.pushQueue.shift()\n if (frame) {\n yield frame\n continue\n }\n\n if (this.pushQueueClosed) {\n return\n }\n\n await this.waitForPush(signal)\n }\n }\n\n /**\n * Public entry point for executing one client command.\n *\n * Acquires a turn on the database's turn queue before running, guaranteeing\n * serialized access to the keyspace, and always releases it afterward. The\n * acquired turn is exposed to the command via a turn-aware park handler so a\n * blocking command can yield the turn while parked (see\n * {@link createTurnAwareParkHandler}); `turn` is reassigned through the\n * {@link TurnAccess} closure because suspending returns a *new* handle.\n */\n async execute(\n rawCommand: Buffer | string,\n rawArgs: readonly Buffer[],\n ): Promise<ExecutorResult> {\n if (this.signal.aborted) {\n throw createAbortError()\n }\n\n const turnQueue = this.turnQueueOverride ?? this.db.turnQueue\n let turn: RedisTurnHandle | undefined = await turnQueue.waitTurn()\n const turnAccess: TurnAccess = {\n get: () => turn,\n set: nextTurn => {\n turn = nextTurn\n },\n }\n this.activeTurnAccess = turnAccess\n try {\n const ctx = this.createExecutionContext(turnAccess)\n return await this.executor.executeRaw(rawCommand, rawArgs, ctx)\n } finally {\n this.activeTurnAccess = undefined\n turn?.release()\n }\n }\n\n /**\n * Build the {@link RedisExecutionContext} passed to a command's `execute`.\n * When a turn is supplied (the normal client path) the context gets a\n * turn-aware park handler so blocking commands release their turn while\n * waiting; without one (e.g. nested transaction execution) the plain park\n * handler is used.\n */\n createExecutionContext(\n turnAccess?: TurnAccess,\n parkOverride?: ParkHandler,\n monitor?: RedisMonitorContext,\n transactionReplay = false,\n ): RedisExecutionContext {\n // `db` is a live getter, not a snapshot: a queued `SELECT N` runs mid-EXEC\n // and updates `selectedDatabaseId`, so every command must resolve the\n // currently selected database at access time, not at context-build time\n // (issue #94). Arrow keeps `this` bound to the session without aliasing.\n const resolveDb = () => this.db\n return {\n get db() {\n return resolveDb()\n },\n server: this.server,\n session: this,\n executor: this.executor,\n ...(transactionReplay ? { transactionReplay } : {}),\n ...(this.nodeRole ? { nodeRole: this.nodeRole } : {}),\n ...(monitor ? { monitor } : {}),\n signal: this.signal,\n park:\n parkOverride ??\n (turnAccess\n ? this.createTurnAwareParkHandler(turnAccess)\n : this.parkHandler),\n }\n }\n\n /** Tear down the session: abort in-flight work and reset all per-connection state. */\n close(): void {\n this.unregisterClientSession?.()\n this.unregisterClientSession = undefined\n this.resetResponseStreams()\n this.signalSource?.abort()\n this.unwatch()\n this.resetPubSub()\n this.closePushQueue()\n this.transactionPlans = []\n this.transactionDirty = false\n this.sessionMode = 'normal'\n this.clusterReadOnlyMode = false\n }\n\n disconnect(reason = 'client disconnected'): void {\n if (this.closeConnection) {\n this.closeConnection(reason)\n return\n }\n\n this.close()\n }\n\n /**\n * Wrap the base park handler so that parking also yields the command's turn.\n *\n * Blocking commands (BLPOP, BRPOP, ...) must not hold the database turn while\n * they wait, or no other client could ever produce the value that unblocks\n * them — a deadlock. The flow:\n * 1. Start the underlying park, capturing its eventual value.\n * 2. Clear the local turn and call `turn.suspend(parked)`, which releases the\n * turn back to the queue and resolves with a fresh turn once the park\n * settles and this session is scheduled again.\n * 3. Store the new turn (so `finally`/subsequent parks see it) and return the\n * parked value.\n *\n * If there is no current turn, fall back to plain parking.\n */\n private createTurnAwareParkHandler(turnAccess: TurnAccess): ParkHandler {\n return async <TValue>(request: ParkRequest<TValue>) => {\n const turn = turnAccess.get()\n if (!turn) {\n return this.parkHandler(request)\n }\n\n let parkedValue: TValue | null = null\n const parked = this.parkHandler(request).then(value => {\n parkedValue = value\n })\n\n turnAccess.set(undefined)\n const nextTurn = await turn.suspend(parked)\n turnAccess.set(nextTurn)\n return parkedValue\n }\n }\n\n private refreshPubSubMode(): void {\n if (this.pubsubSubscriptionCount > 0) {\n this.sessionMode = 'subscribed'\n return\n }\n\n if (this.sessionMode === 'subscribed') {\n this.sessionMode = 'normal'\n }\n }\n\n private waitForPush(signal: AbortSignal): Promise<void> {\n if (signal.aborted || this.signal.aborted || this.pushQueueClosed) {\n return Promise.resolve()\n }\n\n return new Promise(resolve => {\n const cleanup = () => {\n this.pushWaiters.delete(waiter)\n signal.removeEventListener('abort', waiter)\n this.signal.removeEventListener('abort', waiter)\n }\n const waiter = () => {\n cleanup()\n resolve()\n }\n\n this.pushWaiters.add(waiter)\n signal.addEventListener('abort', waiter, { once: true })\n this.signal.addEventListener('abort', waiter, { once: true })\n })\n }\n\n private closePushQueue(): void {\n this.pushQueueClosed = true\n this.pushQueue.length = 0\n this.wakePushWaiters()\n }\n\n private wakePushWaiters(): void {\n for (const waiter of Array.from(this.pushWaiters)) {\n waiter()\n }\n }\n}\n\nfunction watchId(database: number, key: Buffer): string {\n return `${database}:${key.toString('hex')}`\n}\n\nfunction pubsubId(value: Buffer): string {\n return value.toString('hex')\n}\n\nfunction pubsubFrame(name: string, items: RedisValue[]): RedisResult {\n return RedisResult.create(RedisValue.push(name, items))\n}\n\nfunction encodeTransactionArray(encodedValues: readonly Buffer[]): Buffer {\n return Buffer.concat([\n Buffer.from(`*${encodedValues.length}\\r\\n`),\n ...encodedValues,\n ])\n}\n\nfunction createAbortError(): Error {\n const err = new Error('The operation was aborted')\n err.name = 'AbortError'\n return err\n}\n","export type Resp2CommandFrame = {\n command: Buffer\n args: Buffer[]\n}\n\nexport type Resp2DecodeResult = {\n frames: Resp2CommandFrame[]\n error?: Resp2ParseError\n}\n\nexport class Resp2ParseError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'Resp2ParseError'\n }\n}\n\ntype ParseOutcome =\n | { kind: 'frame'; frame: Resp2CommandFrame; nextIndex: number }\n | { kind: 'skip'; nextIndex: number }\n | { kind: 'incomplete' }\n\nexport class Resp2CommandDecoder {\n private buffered = Buffer.alloc(0)\n\n push(chunk: Buffer): Resp2DecodeResult {\n this.buffered = Buffer.concat([this.buffered, chunk])\n const frames: Resp2CommandFrame[] = []\n let cursor = 0\n let error: Resp2ParseError | undefined\n\n try {\n while (cursor < this.buffered.length) {\n const outcome = this.parseFrame(cursor)\n if (outcome.kind === 'incomplete') {\n break\n }\n\n if (outcome.kind === 'frame') {\n frames.push(outcome.frame)\n }\n cursor = outcome.nextIndex\n }\n } catch (err) {\n if (!(err instanceof Resp2ParseError)) {\n throw err\n }\n // Surface the protocol error alongside the frames already parsed from\n // earlier in this pipeline so the caller can respond to the valid\n // commands before reporting the error and closing the connection.\n error = err\n }\n\n this.buffered = this.buffered.subarray(cursor)\n return { frames, error }\n }\n\n private parseFrame(index: number): ParseOutcome {\n const prefix = this.buffered[index]\n if (prefix === undefined) {\n return { kind: 'incomplete' }\n }\n\n if (prefix === 0x2a) {\n return this.parseArrayFrame(index)\n }\n\n return this.parseInlineFrame(index)\n }\n\n private parseArrayFrame(index: number): ParseOutcome {\n const header = readLine(this.buffered, index + 1)\n if (!header) {\n return { kind: 'incomplete' }\n }\n\n const count = parseLength(header.line, 'multibulk')\n if (count < -1) {\n throw new Resp2ParseError('Protocol error: invalid multibulk length')\n }\n\n if (count <= 0) {\n return { kind: 'skip', nextIndex: header.nextIndex }\n }\n\n const items: Buffer[] = []\n let cursor = header.nextIndex\n\n for (let i = 0; i < count; i++) {\n const prefix = this.buffered[cursor]\n if (prefix === undefined) {\n return { kind: 'incomplete' }\n }\n\n if (prefix !== 0x24) {\n throw new Resp2ParseError('Protocol error: expected bulk string')\n }\n\n const bulkHeader = readLine(this.buffered, cursor + 1)\n if (!bulkHeader) {\n return { kind: 'incomplete' }\n }\n\n const length = parseLength(bulkHeader.line, 'bulk')\n if (length < 0) {\n throw new Resp2ParseError('Protocol error: invalid bulk length')\n }\n\n const valueStart = bulkHeader.nextIndex\n const valueEnd = valueStart + length\n const lineEnd = valueEnd + 2\n if (this.buffered.length < lineEnd) {\n return { kind: 'incomplete' }\n }\n\n if (\n this.buffered[valueEnd] !== 0x0d ||\n this.buffered[valueEnd + 1] !== 0x0a\n ) {\n throw new Resp2ParseError('Protocol error: bulk string not terminated')\n }\n\n items.push(Buffer.from(this.buffered.subarray(valueStart, valueEnd)))\n cursor = lineEnd\n }\n\n const [command, ...args] = items\n return {\n kind: 'frame',\n frame: { command, args },\n nextIndex: cursor,\n }\n }\n\n private parseInlineFrame(index: number): ParseOutcome {\n const line = readLine(this.buffered, index)\n if (!line) {\n return { kind: 'incomplete' }\n }\n\n const parts = parseInlineArguments(line.line)\n\n if (parts.length === 0) {\n return { kind: 'skip', nextIndex: line.nextIndex }\n }\n\n const [command, ...args] = parts\n return {\n kind: 'frame',\n frame: { command, args },\n nextIndex: line.nextIndex,\n }\n }\n}\n\nfunction parseInlineArguments(line: Buffer): Buffer[] {\n const source = line.toString()\n const result: Buffer[] = []\n let cursor = 0\n\n while (cursor < source.length) {\n while (cursor < source.length && isInlineWhitespace(source[cursor]!)) {\n cursor += 1\n }\n\n if (cursor >= source.length) {\n break\n }\n\n const quote = source[cursor]\n if (quote === '\"' || quote === \"'\") {\n const parsed = parseQuotedInlineArgument(source, cursor, quote)\n result.push(parsed.value)\n cursor = parsed.nextIndex\n continue\n }\n\n const start = cursor\n while (cursor < source.length && !isInlineWhitespace(source[cursor]!)) {\n cursor += 1\n }\n result.push(Buffer.from(source.slice(start, cursor)))\n }\n\n return result\n}\n\nfunction parseQuotedInlineArgument(\n source: string,\n index: number,\n quote: string,\n): { value: Buffer; nextIndex: number } {\n const bytes: number[] = []\n let cursor = index + 1\n\n while (cursor < source.length) {\n const char = source[cursor]!\n if (char === quote) {\n cursor += 1\n if (cursor < source.length && !isInlineWhitespace(source[cursor]!)) {\n throw new Resp2ParseError(\n 'Protocol error: unbalanced quotes in request',\n )\n }\n return { value: Buffer.from(bytes), nextIndex: cursor }\n }\n\n if (char === '\\\\') {\n const parsed = parseInlineEscape(source, cursor)\n bytes.push(...parsed.bytes)\n cursor = parsed.nextIndex\n continue\n }\n\n bytes.push(char.charCodeAt(0))\n cursor += 1\n }\n\n throw new Resp2ParseError('Protocol error: unbalanced quotes in request')\n}\n\nfunction parseInlineEscape(\n source: string,\n index: number,\n): { bytes: number[]; nextIndex: number } {\n const escaped = source[index + 1]\n if (escaped === undefined) {\n return { bytes: ['\\\\'.charCodeAt(0)], nextIndex: index + 1 }\n }\n\n if (\n escaped === 'x' &&\n isHexDigit(source[index + 2]) &&\n isHexDigit(source[index + 3])\n ) {\n return {\n bytes: [Number.parseInt(source.slice(index + 2, index + 4), 16)],\n nextIndex: index + 4,\n }\n }\n\n const replacements: Record<string, number> = {\n n: 0x0a,\n r: 0x0d,\n t: 0x09,\n b: 0x08,\n a: 0x07,\n }\n return {\n bytes: [replacements[escaped] ?? escaped.charCodeAt(0)],\n nextIndex: index + 2,\n }\n}\n\nfunction isInlineWhitespace(char: string): boolean {\n return char === ' ' || char === '\\t'\n}\n\nfunction isHexDigit(char: string | undefined): boolean {\n return char !== undefined && /^[0-9a-fA-F]$/.test(char)\n}\n\nfunction readLine(\n buffer: Buffer,\n index: number,\n): { line: Buffer; nextIndex: number } | null {\n const lineEnd = buffer.indexOf('\\r\\n', index)\n if (lineEnd === -1) {\n return null\n }\n\n return {\n line: buffer.subarray(index, lineEnd),\n nextIndex: lineEnd + 2,\n }\n}\n\nfunction parseLength(value: Buffer, kind: string): number {\n const raw = value.toString()\n if (!/^-?\\d+$/.test(raw)) {\n throw new Resp2ParseError(`Protocol error: invalid ${kind} length`)\n }\n\n const parsed = Number(raw)\n if (!Number.isSafeInteger(parsed)) {\n throw new Resp2ParseError(`Protocol error: invalid ${kind} length`)\n }\n\n return parsed\n}\n","import { ClientSession } from '../../client-session'\nimport { RedisCommandError } from '../../redis-error'\nimport { RedisResult } from '../../redis-result'\nimport { encodeRedisResult } from '../../resp-encoder'\nimport { isResponseStream } from '../../response-stream'\nimport type { ResponseStream } from '../../response-stream'\nimport type { ExecutorResult } from '../../command-executor'\nimport type { RespEncodeOptions } from '../../resp-encoder'\nimport type { Logger } from '../../../logger'\nimport type { ConnectionTransport } from '../connection-transport'\nimport {\n Resp2CommandDecoder,\n Resp2ParseError,\n type Resp2CommandFrame,\n} from './decoder'\n\nexport type Resp2SessionAdapterOptions = {\n transport: ConnectionTransport\n session: ClientSession\n logger?: Pick<Logger, 'error'>\n encoder?: RespEncodeOptions\n}\n\nexport class Resp2SessionAdapter {\n private readonly decoder = new Resp2CommandDecoder()\n private readonly transport: ConnectionTransport\n private readonly session: ClientSession\n private readonly logger?: Pick<Logger, 'error'>\n private readonly encoder?: RespEncodeOptions\n private writeChain: Promise<void> = Promise.resolve()\n private readonly activeStreams = new Set<Promise<void>>()\n\n constructor(options: Resp2SessionAdapterOptions) {\n this.transport = options.transport\n this.session = options.session\n this.logger = options.logger\n this.encoder = options.encoder\n }\n\n async run(): Promise<void> {\n const pushWriter = this.writeSessionPushes()\n\n try {\n for await (const chunk of this.transport.read()) {\n const { frames, error } = this.decoder.push(chunk)\n for (const frame of frames) {\n await this.handleFrame(frame)\n if (this.transport.signal.aborted) {\n return\n }\n }\n\n if (error) {\n // Valid frames before the bad one have already been answered above;\n // now report the protocol error and close, matching real Redis.\n await this.writeError(error)\n this.transport.close('resp2 protocol error')\n return\n }\n }\n } catch (err) {\n if (!this.transport.signal.aborted) {\n await this.writeError(err)\n this.transport.close('resp2 adapter error')\n }\n } finally {\n this.session.close()\n await pushWriter\n // Streams are torn down by session.close() (resetResponseStreams aborts\n // them); wait for their drain tasks to settle so nothing writes after we\n // return.\n await Promise.allSettled(this.activeStreams)\n }\n }\n\n private async handleFrame(frame: Resp2CommandFrame): Promise<void> {\n const result = await this.session.execute(frame.command, frame.args)\n await this.writeExecutorResult(result)\n }\n\n private async writeExecutorResult(result: ExecutorResult): Promise<void> {\n if (isResponseStream(result)) {\n // A ResponseStream can be long-lived (MONITOR, future SUBSCRIBE). Draining\n // it inline would pin the frame loop until the stream closed, so the\n // connection could never send another command. Drain it as a background\n // task instead, multiplexed onto the shared writeChain, while run() keeps\n // reading and dispatching subsequent frames.\n this.spawnStreamDrain(result)\n return\n }\n\n await this.writeRedisResult(result)\n }\n\n private spawnStreamDrain(stream: ResponseStream): void {\n const drain = this.drainStream(stream)\n this.activeStreams.add(drain)\n void drain.finally(() => {\n this.activeStreams.delete(drain)\n })\n }\n\n private async drainStream(stream: ResponseStream): Promise<void> {\n try {\n for await (const frame of stream.frames(this.transport.signal)) {\n await this.writeRedisResult(frame)\n if (this.transport.signal.aborted) {\n stream.close('transport closed')\n return\n }\n }\n } catch (err) {\n stream.close('resp2 stream error')\n if (!this.transport.signal.aborted) {\n this.logger?.error(err)\n this.transport.close('resp2 stream error')\n }\n }\n }\n\n private async writeRedisResult(result: RedisResult): Promise<void> {\n const write = async () => {\n if (!result.options?.omitReply) {\n await this.transport.write(\n encodeRedisResult(result, {\n ...this.encoder,\n version: this.session.protocolVersion,\n }),\n )\n }\n\n result.options?.afterReply?.()\n\n if (result.options?.close || result.options?.disconnect) {\n this.transport.close('command requested close')\n }\n }\n\n this.writeChain = this.writeChain.catch(() => {}).then(write)\n await this.writeChain\n }\n\n private async writeSessionPushes(): Promise<void> {\n try {\n for await (const frame of this.session.readPushes(\n this.transport.signal,\n )) {\n await this.writeRedisResult(frame)\n }\n } catch (err) {\n if (!this.transport.signal.aborted) {\n this.logger?.error(err)\n this.transport.close('resp2 push writer error')\n }\n }\n }\n\n private async writeError(err: unknown): Promise<void> {\n if (this.transport.signal.aborted) {\n return\n }\n\n if (err instanceof RedisCommandError) {\n await this.writeRedisResult(RedisResult.error(err.message, err.code))\n return\n }\n\n if (err instanceof Resp2ParseError) {\n await this.writeRedisResult(RedisResult.error(err.message, 'ERR'))\n return\n }\n\n this.logger?.error(err)\n await this.writeRedisResult(\n RedisResult.error('internal server error', 'ERR'),\n )\n }\n}\n","import { ClientSession } from '../client-session'\nimport type { CommandExecutor } from '../command-executor'\nimport type { RespEncodeOptions } from '../resp-encoder'\nimport type { Logger } from '../../logger'\nimport type { RedisClusterNodeRole, RedisServerState } from '../../state'\nimport type { ConnectionTransport } from './connection-transport'\nimport { Resp2SessionAdapter } from './resp2/session-adapter'\n\nexport type AttachSessionOptions = {\n state: RedisServerState\n executor: CommandExecutor\n nodeRole?: RedisClusterNodeRole\n logger?: Pick<Logger, 'error'>\n encoder?: RespEncodeOptions\n clientAddress?: string\n}\n\nexport type AttachedSession = {\n session: ClientSession\n adapter: Resp2SessionAdapter\n /** Resolves once the adapter's read/write loop finishes (transport closed). */\n done: Promise<void>\n /** Tear down the transport (which aborts the adapter and closes the session). */\n close(): void\n}\n\n/**\n * Wire a {@link ConnectionTransport} to a fresh {@link ClientSession} driven by\n * a {@link Resp2SessionAdapter}, kicking off the adapter's run loop.\n *\n * This is the transport-agnostic core extracted from `Resp2Server.handleConnection`:\n * the socket-backed server and the in-memory virtual connection share it, so the\n * RESP framing / session lifecycle never diverges between them. The returned\n * `done` promise settles when the adapter loop ends; `close()` closes the\n * transport, which aborts the adapter and (via the adapter's `finally`) the\n * session.\n */\nexport function attachSession(\n transport: ConnectionTransport,\n opts: AttachSessionOptions,\n): AttachedSession {\n const session = new ClientSession({\n server: opts.state,\n executor: opts.executor,\n nodeRole: opts.nodeRole,\n clientAddress: opts.clientAddress,\n closeConnection: reason => transport.close(reason ?? 'client disconnected'),\n })\n\n const adapter = new Resp2SessionAdapter({\n transport,\n session,\n logger: opts.logger,\n encoder: opts.encoder,\n })\n\n const done = adapter.run().catch(err => opts.logger?.error(err))\n\n return {\n session,\n adapter,\n done,\n close: () => transport.close('attach-session closed'),\n }\n}\n","import { Socket } from 'net'\nimport {\n type ConnectionTransport,\n type ConnectionTransportEvent,\n type ConnectionTransportListener,\n type ConnectionTransportUnsubscribe,\n} from './connection-transport'\n\nexport type SocketConnectionTransportOptions = {\n id?: string\n}\n\nexport class SocketConnectionTransport implements ConnectionTransport {\n private static nextId = 0\n\n readonly id: string\n readonly signal: AbortSignal\n\n private readonly controller = new AbortController()\n private closed = false\n\n constructor(\n private readonly socket: Socket,\n options?: SocketConnectionTransportOptions,\n ) {\n this.id = options?.id ?? `socket-${++SocketConnectionTransport.nextId}`\n this.signal = this.controller.signal\n\n socket\n .on('close', () => this.abort())\n .on('error', () => this.abort())\n .on('timeout', () => this.abort())\n }\n\n async *read(): AsyncIterable<Buffer> {\n for await (const chunk of this.socket) {\n if (this.signal.aborted) {\n return\n }\n\n yield Buffer.isBuffer(chunk) ? Buffer.from(chunk) : Buffer.from(chunk)\n }\n }\n\n write(chunk: Buffer): Promise<void> {\n if (this.closed || this.socket.destroyed) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n this.socket.write(chunk, err => {\n if (err) {\n reject(err)\n return\n }\n\n resolve()\n })\n })\n }\n\n close(_reason?: string): void {\n if (this.closed) {\n return\n }\n\n this.closed = true\n this.abort()\n this.socket.destroySoon()\n }\n\n on(\n event: ConnectionTransportEvent,\n listener: ConnectionTransportListener,\n ): ConnectionTransportUnsubscribe {\n const wrapped = (error?: Error) => listener(error)\n this.socket.on(event, wrapped)\n return () => {\n this.socket.off(event, wrapped)\n }\n }\n\n private abort(): void {\n if (!this.controller.signal.aborted) {\n this.controller.abort()\n }\n }\n}\n","import { createRedisCommandExecutor } from './commands'\nimport { createClusterCommands } from './commands/cluster'\nimport { createClusterPolicy } from './core/execution-policies'\nimport {\n REDIS_CLUSTER_SLOT_COUNT,\n RedisDatabase,\n RedisClusterTopology,\n RedisServerState,\n type RedisClusterNode,\n type RedisClusterNodeRole,\n type RedisMutationEvent,\n type Unsubscribe,\n} from './state'\nimport type { CommandExecutor } from './core/command-executor'\nimport type { Logger } from './logger'\nimport {\n resolveCompatibilityProfile,\n type CompatibilityProfile,\n type CompatibilitySpec,\n} from './core/compatibility'\n\nexport type RedisClusterOptions = {\n masters: number\n replicasPerMaster?: number\n basePort: number\n host?: string\n databasesPerNode?: number\n replicaUpdateDelayMs?: number\n compatibility?: CompatibilitySpec\n logger?: Pick<Logger, 'error'>\n}\n\n/**\n * A single cluster node assembled without any TCP socket: its synthetic\n * `host:port`, replicated state, and the cluster-aware executor bound to it.\n */\nexport type ClusterNodePipeline = {\n id: string\n role: RedisClusterNodeRole\n host: string\n port: number\n state: RedisServerState\n executor: CommandExecutor\n}\n\n/**\n * The TCP-free product of {@link buildClusterNodes}: the shared topology, every\n * node pipeline, and the replication links wiring replicas to their masters\n * (the caller owns their teardown via `close()`).\n */\nexport type ClusterNodes = {\n topology: RedisClusterTopology\n nodes: readonly ClusterNodePipeline[]\n replicationLinks: readonly ReplicationLink[]\n}\n\n/**\n * Assembles cluster node pipelines — topology, per-node state + executor, and\n * the replica→master replication links — **without** binding any TCP socket.\n * Shared by the socket-backed {@link createRedisCluster} and the in-memory\n * client-mock cluster, so cluster routing/replication semantics never diverge.\n */\nexport function buildClusterNodes(options: RedisClusterOptions): ClusterNodes {\n validateOptions(options)\n\n const host = options.host ?? '127.0.0.1'\n const replicas = options.replicasPerMaster ?? 0\n const totalNodes = options.masters * (replicas + 1)\n const profile = resolveCompatibilityProfile(options.compatibility)\n\n if (options.basePort + totalNodes - 1 > 65535) {\n throw new Error('Cluster base-port range exceeds 65535')\n }\n\n const topologyNodes: RedisClusterNode[] = []\n let portOffset = 0\n // When basePort is 0 the OS assigns each server a random free port. Holding\n // all topology entries at 0 keeps listen() consistent across all nodes;\n // listen() backfills the real bound ports afterwards.\n const allocatePort = () =>\n options.basePort === 0 ? 0 : options.basePort + portOffset++\n\n for (let i = 0; i < options.masters; i++) {\n const masterId = `master-${i}`\n topologyNodes.push({\n id: masterId,\n role: 'master',\n host,\n port: allocatePort(),\n slots: [computeSlotRange(i, options.masters)],\n })\n }\n\n for (let i = 0; i < options.masters; i++) {\n const masterId = `master-${i}`\n for (let r = 0; r < replicas; r++) {\n topologyNodes.push({\n id: `replica-${r}-${masterId}`,\n role: 'replica',\n host,\n port: allocatePort(),\n masterId,\n slots: topologyNodes[i].slots,\n })\n }\n }\n\n const topology = new RedisClusterTopology(topologyNodes)\n\n const replicationLinks: ReplicationLink[] = []\n const nodeStates = createClusterNodeStates(\n topologyNodes,\n topology,\n options.databasesPerNode ?? 1,\n options.replicaUpdateDelayMs ?? 0,\n profile,\n replicationLinks,\n )\n\n const nodes = topologyNodes.map<ClusterNodePipeline>(node => {\n const state = nodeStates.get(node.id)\n if (!state) {\n throw new Error(`Missing state for cluster node ${node.id}`)\n }\n\n const executor = createRedisCommandExecutor({\n extraCommands: createClusterCommands(node.id),\n compatibility: profile,\n policies: [createClusterPolicy({ localNodeId: node.id, topology })],\n })\n\n return {\n id: node.id,\n role: node.role,\n host: node.host,\n port: node.port,\n state,\n executor,\n }\n })\n\n return { topology, nodes, replicationLinks }\n}\n\nexport function computeSlotRange(\n masterIndex: number,\n masters: number,\n): [number, number] {\n if (!Number.isInteger(masters) || masters < 1) {\n throw new Error(`Invalid masters count ${masters}`)\n }\n if (\n !Number.isInteger(masterIndex) ||\n masterIndex < 0 ||\n masterIndex >= masters\n ) {\n throw new Error(`Invalid master index ${masterIndex}`)\n }\n\n const start = Math.floor((REDIS_CLUSTER_SLOT_COUNT * masterIndex) / masters)\n const end =\n Math.floor((REDIS_CLUSTER_SLOT_COUNT * (masterIndex + 1)) / masters) - 1\n return [start, end]\n}\n\nfunction validateOptions(options: RedisClusterOptions): void {\n if (!Number.isInteger(options.masters) || options.masters < 1) {\n throw new Error(`Invalid masters count ${options.masters}`)\n }\n if (\n options.replicasPerMaster !== undefined &&\n (!Number.isInteger(options.replicasPerMaster) ||\n options.replicasPerMaster < 0)\n ) {\n throw new Error(`Invalid replicasPerMaster ${options.replicasPerMaster}`)\n }\n if (\n !Number.isInteger(options.basePort) ||\n options.basePort < 0 ||\n options.basePort > 65535\n ) {\n throw new Error(`Invalid basePort ${options.basePort}`)\n }\n if (\n options.replicaUpdateDelayMs !== undefined &&\n (!Number.isInteger(options.replicaUpdateDelayMs) ||\n options.replicaUpdateDelayMs < 0)\n ) {\n throw new Error(\n `Invalid replicaUpdateDelayMs ${options.replicaUpdateDelayMs}`,\n )\n }\n}\n\nexport type ReplicationLink = {\n close(): void\n}\n\nfunction createClusterNodeStates(\n nodes: readonly RedisClusterNode[],\n topology: RedisClusterTopology,\n databaseCount: number,\n replicaUpdateDelayMs: number,\n profile: CompatibilityProfile,\n replicationLinks: ReplicationLink[],\n): Map<string, RedisServerState> {\n const states = new Map<string, RedisServerState>()\n\n for (const node of nodes) {\n states.set(\n node.id,\n new RedisServerState({\n databaseCount,\n clusterTopology: topology,\n compatibility: profile,\n activeExpiryIntervalMs: node.role === 'replica' ? false : undefined,\n }),\n )\n }\n\n for (const node of nodes) {\n if (node.role !== 'replica') {\n continue\n }\n\n const master = node.masterId ? states.get(node.masterId) : undefined\n const replica = states.get(node.id)\n if (!master || !replica) {\n throw new Error(`Replica ${node.id} references missing master state`)\n }\n\n replicationLinks.push(\n ...createReplicationLinks(master, replica, replicaUpdateDelayMs),\n )\n }\n\n return states\n}\n\nfunction createReplicationLinks(\n master: RedisServerState,\n replica: RedisServerState,\n delayMs: number,\n): ReplicationLink[] {\n return master.databases.map((masterDb, index) => {\n const replicaDb = replica.getDatabase(index)\n syncDatabase(masterDb, replicaDb)\n return new DatabaseReplicationLink(masterDb, replicaDb, delayMs)\n })\n}\n\nfunction syncDatabase(master: RedisDatabase, replica: RedisDatabase): void {\n replica.flush()\n for (const entry of master.entriesSnapshot()) {\n replica.set(entry.key, entry.value, { expiresAt: entry.expiresAt })\n }\n}\n\nclass DatabaseReplicationLink implements ReplicationLink {\n private readonly unsubscribe: Unsubscribe\n private readonly timers = new Set<ReturnType<typeof setTimeout>>()\n\n constructor(\n master: RedisDatabase,\n private readonly replica: RedisDatabase,\n private readonly delayMs: number,\n ) {\n this.unsubscribe = master.subscribe(event => this.replicate(event))\n }\n\n close(): void {\n this.unsubscribe()\n for (const timer of this.timers) {\n clearTimeout(timer)\n }\n this.timers.clear()\n }\n\n private replicate(event: RedisMutationEvent): void {\n if (this.delayMs === 0) {\n applyReplicationEvent(this.replica, event)\n return\n }\n\n const timer = setTimeout(() => {\n this.timers.delete(timer)\n applyReplicationEvent(this.replica, event)\n }, this.delayMs)\n this.timers.add(timer)\n }\n}\n\nfunction applyReplicationEvent(\n replica: RedisDatabase,\n event: RedisMutationEvent,\n): void {\n switch (event.type) {\n case 'write':\n replica.set(event.key, event.value, { expiresAt: event.expiresAt })\n return\n case 'delete':\n case 'evict':\n replica.delete(event.key)\n return\n case 'expire':\n replica.expire(event.key, event.expiresAt)\n return\n case 'persist':\n replica.persist(event.key)\n return\n case 'flush':\n replica.flush()\n return\n }\n}\n","import { Resp2Server } from './core/transports/resp2/server'\nimport { RedisClusterTopology, RedisServerState } from './state'\nimport {\n buildClusterNodes,\n type RedisClusterOptions,\n type ReplicationLink,\n} from './cluster'\n\nexport type RedisClusterNodeHandle = {\n id: string\n role: 'master' | 'replica'\n host: string\n port: number\n server: RedisServerState\n}\n\n/**\n * A cluster of socket-backed nodes: {@link buildClusterNodes} assembles the\n * TCP-free pipelines, this wraps each in a {@link Resp2Server} and owns their\n * listen/close lifecycle. The socket layer of {@link buildClusterNodes} — kept\n * out of `cluster.ts` so the node-assembly there stays free of `net`.\n */\nexport class RedisCluster {\n readonly topology: RedisClusterTopology\n readonly nodes: readonly RedisClusterNodeHandle[]\n\n private readonly servers: Resp2Server[]\n private readonly replicationLinks: ReplicationLink[]\n\n constructor(\n topology: RedisClusterTopology,\n nodes: readonly RedisClusterNodeHandle[],\n servers: readonly Resp2Server[],\n replicationLinks: readonly ReplicationLink[],\n ) {\n this.topology = topology\n this.nodes = nodes\n this.servers = [...servers]\n this.replicationLinks = [...replicationLinks]\n }\n\n async listen(): Promise<void> {\n try {\n for (let index = 0; index < this.servers.length; index++) {\n await this.servers[index].listen(this.nodes[index].port)\n }\n } catch (err) {\n await this.close()\n throw err\n }\n\n // Backfill actual ports — when basePort is 0 the OS assigns random ports\n // and the handles/topology need to reflect what was actually bound.\n this.servers.forEach((server, index) => {\n const actualPort = server.getPort()\n ;(this.nodes[index] as { port: number }).port = actualPort\n ;(this.topology.nodes[index] as { port: number }).port = actualPort\n })\n }\n\n async close(): Promise<void> {\n for (const link of this.replicationLinks) {\n link.close()\n }\n const results = await Promise.allSettled(\n this.servers.map(server => server.close()),\n )\n for (const result of results) {\n if (result.status === 'fulfilled') {\n continue\n }\n if (isServerNotRunningError(result.reason)) {\n continue\n }\n throw result.reason\n }\n }\n\n getAddresses(): string[] {\n return this.nodes.map(node => `${node.host}:${node.port}`)\n }\n}\n\nfunction isServerNotRunningError(err: unknown): boolean {\n return (err as { code?: string }).code === 'ERR_SERVER_NOT_RUNNING'\n}\n\n/**\n * Builds an **un-started** cluster — call {@link RedisCluster.listen} yourself.\n *\n * @deprecated Prefer {@link createRedisServer} with the `cluster` option, which\n * builds *and* starts the cluster in one call (and is symmetric with\n * `createRedisMock({ cluster })`). This low-level builder remains for callers\n * that need to control when `listen()` runs.\n */\nexport function createRedisCluster(options: RedisClusterOptions): RedisCluster {\n const { topology, nodes, replicationLinks } = buildClusterNodes(options)\n\n const handles: RedisClusterNodeHandle[] = []\n const servers: Resp2Server[] = []\n\n for (const node of nodes) {\n const server = new Resp2Server({\n server: node.state,\n executor: node.executor,\n logger: options.logger,\n nodeRole: node.role,\n })\n\n handles.push({\n id: node.id,\n role: node.role,\n host: node.host,\n port: node.port,\n server: node.state,\n })\n servers.push(server)\n }\n\n return new RedisCluster(topology, handles, servers, replicationLinks)\n}\n\n/**\n * @deprecated Renamed to {@link createRedisCluster} for naming consistency with\n * `createRedisServer` / `createRedisMock`. This alias will be removed in a\n * future release.\n */\nexport const buildRedisCluster = createRedisCluster\n","import { createRedisCommandExecutor } from './commands'\nimport {\n createRedisCluster,\n type RedisCluster,\n type RedisClusterNodeHandle,\n} from './cluster-server'\nimport type { CommandExecutor } from './core/command-executor'\nimport { Resp2Server } from './core/transports/resp2/server'\nimport { RedisServerState } from './state'\nimport { seedCluster, seedStandalone, type SeedEntry } from './seed'\nimport type { Logger } from './logger'\nimport {\n resolveCompatibilityProfile,\n type CompatibilitySpec,\n} from './core/compatibility'\n\nconst DEFAULT_HOST = '127.0.0.1'\nconst DEFAULT_DATABASE_COUNT = 16\n\nexport type RedisAddress = { host: string; port: number }\n\nexport type CreateRedisServerOptions = {\n /** Port to bind. Defaults to `0` (OS-assigned free port). */\n port?: number\n /** Logical database count. Defaults to 16, matching real Redis. */\n databaseCount?: number\n compatibility?: CompatibilitySpec\n logger?: Pick<Logger, 'error'>\n}\n\nexport type CreateRedisServerClusterOptions = {\n /** Build a (listening) cluster instead of a standalone server. */\n cluster: RedisMockClusterOptions\n /** Cluster base port. Defaults to `0` (each node OS-assigned). */\n basePort?: number\n /** Databases per cluster node. Defaults to 1. */\n databasesPerNode?: number\n compatibility?: CompatibilitySpec\n logger?: Pick<Logger, 'error'>\n}\n\nexport type RedisServerHandle = {\n host: string\n port: number\n state: RedisServerState\n server: Resp2Server\n close(): Promise<void>\n}\n\n/** Build a standalone keyspace + command pipeline (no transport). */\nfunction createStandalonePipeline(\n databaseCount?: number,\n compatibility?: CompatibilitySpec,\n): {\n state: RedisServerState\n executor: CommandExecutor\n} {\n const profile = resolveCompatibilityProfile(compatibility)\n const state = new RedisServerState({\n databaseCount: databaseCount ?? DEFAULT_DATABASE_COUNT,\n compatibility: profile,\n })\n return {\n state,\n executor: createRedisCommandExecutor({ compatibility: profile }),\n }\n}\n\n/**\n * Runs a real, **listening** Redis server you connect a normal client library\n * to. Standalone by default (one {@link RedisServerState} + executor +\n * {@link Resp2Server}, 16 databases); pass `cluster` to build and start a whole\n * cluster instead — the returned {@link RedisCluster} is already listening.\n *\n * For tests prefer {@link createRedisMock}, which wraps this and adds seeding,\n * reset-between-tests, and an in-process socketless client. Drop to\n * `js-redis-server/core` only when you need to assemble the pipeline by hand.\n *\n * @see {@link createRedisMock} — the test-mock facade (use this for test suites)\n */\nexport function createRedisServer(\n options?: CreateRedisServerOptions,\n): Promise<RedisServerHandle>\nexport function createRedisServer(\n options: CreateRedisServerClusterOptions,\n): Promise<RedisCluster>\nexport async function createRedisServer(\n options: CreateRedisServerOptions | CreateRedisServerClusterOptions = {},\n): Promise<RedisServerHandle | RedisCluster> {\n if ('cluster' in options) {\n const cluster = createRedisCluster({\n masters: options.cluster.masters,\n replicasPerMaster: options.cluster.replicas ?? 0,\n basePort: options.basePort ?? 0,\n databasesPerNode: options.databasesPerNode,\n compatibility: options.compatibility,\n logger: options.logger,\n })\n await cluster.listen()\n return cluster\n }\n\n const { state, executor } = createStandalonePipeline(\n options.databaseCount,\n options.compatibility,\n )\n const server = new Resp2Server({\n server: state,\n executor,\n logger: options.logger,\n })\n\n await server.listen(options.port ?? 0)\n\n return {\n host: DEFAULT_HOST,\n port: server.getPort(),\n state,\n server,\n close: () => server.close(),\n }\n}\n\nexport type RedisMockClusterOptions = {\n masters: number\n replicas?: number\n}\n\nexport type CreateRedisMockOptions = {\n /** When set, builds a cluster mock instead of a standalone one. */\n cluster?: RedisMockClusterOptions\n /** Standalone-only: logical database count (defaults to 16). */\n databaseCount?: number\n /** Standalone bind port. Defaults to `0` (OS-assigned). */\n port?: number\n /** Cluster base port. Defaults to `0` (each node OS-assigned). */\n basePort?: number\n compatibility?: CompatibilitySpec\n logger?: Pick<Logger, 'error'>\n}\n\n/**\n * Friendly test-mock facade over a standalone server or a cluster. Exposes\n * connection helpers, seeding, reset-between-tests, and escape hatches to the\n * underlying state/nodes for power users.\n *\n * Need a socketless in-process client (no TCP, no RESP)? Use the standalone\n * {@link createInMemoryClient} builder instead.\n */\nexport interface RedisMock {\n readonly host: string\n readonly port: number\n readonly url: string\n /**\n * Node addresses as `{ host, port }[]` — a single entry for standalone mocks,\n * every node for cluster mocks. Client-agnostic: index `[0]` for a single\n * client, or pass the whole array to a cluster client.\n *\n * @example new Redis(mock.addresses()[0]) // ioredis, standalone\n * @example new Redis.Cluster(mock.addresses()) // ioredis, cluster\n */\n addresses(): RedisAddress[]\n seed(entries: readonly SeedEntry[]): Promise<void>\n flush(): Promise<void>\n /** Alias for {@link RedisMock.flush}. */\n reset(): Promise<void>\n close(): Promise<void>\n /** Escape hatch: the underlying state (standalone mocks only). */\n readonly state?: RedisServerState\n /** Escape hatch: the underlying node handles (cluster mocks only). */\n readonly nodes?: readonly RedisClusterNodeHandle[]\n}\n\n/**\n * Creates a {@link RedisMock} — the entry point for test suites. Standalone by\n * default; pass `{ cluster: { masters } }` for a cluster mock. Adds seeding and\n * reset-between-tests on top of a real server/cluster.\n *\n * To run a long-running server a separate process connects to (a CLI, a dev\n * tool) rather than drive it from test code, use {@link createRedisServer}\n * instead (it takes the same `cluster` option).\n *\n * @see {@link createRedisServer} — run a real server/cluster without test helpers\n */\nexport async function createRedisMock(\n options: CreateRedisMockOptions = {},\n): Promise<RedisMock> {\n if (options.cluster) {\n return createClusterMock(options.cluster, options)\n }\n return createTcpStandaloneMock(options)\n}\n\n/** Alternative name for the same factory; compatibility defaults are unchanged. */\nexport const createValkeyMock = createRedisMock\n\nasync function createTcpStandaloneMock(\n options: CreateRedisMockOptions,\n): Promise<RedisMock> {\n const { state, executor } = createStandalonePipeline(\n options.databaseCount,\n options.compatibility,\n )\n const server = new Resp2Server({\n server: state,\n executor,\n logger: options.logger,\n })\n await server.listen(options.port ?? 0)\n\n const address: RedisAddress = { host: DEFAULT_HOST, port: server.getPort() }\n\n return {\n host: address.host,\n port: address.port,\n url: `redis://${address.host}:${address.port}`,\n addresses: () => [{ ...address }],\n seed: entries => seedStandalone(state, entries),\n flush: async () => state.flushAllDatabases(),\n reset: async () => state.flushAllDatabases(),\n close: async () => {\n await server.close()\n },\n state,\n }\n}\n\nasync function createClusterMock(\n cluster: RedisMockClusterOptions,\n options: CreateRedisMockOptions,\n): Promise<RedisMock> {\n const built = createRedisCluster({\n masters: cluster.masters,\n replicasPerMaster: cluster.replicas ?? 0,\n basePort: options.basePort ?? 0,\n compatibility: options.compatibility,\n logger: options.logger,\n })\n\n await built.listen()\n\n const first = built.nodes[0]\n\n return {\n host: first.host,\n port: first.port,\n url: `redis://${first.host}:${first.port}`,\n addresses: () =>\n built.nodes.map(node => ({ host: node.host, port: node.port })),\n seed: entries => seedCluster(built, entries),\n flush: () => flushCluster(built),\n reset: () => flushCluster(built),\n close: () => built.close(),\n nodes: built.nodes,\n }\n}\n\nasync function flushCluster(cluster: RedisCluster): Promise<void> {\n for (const node of cluster.nodes) {\n node.server.flushAllDatabases()\n }\n}\n"],"mappings":"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","names":["value","value","value","value","value","value","value","value","bulk","value","simpleString","value","listeners","value","keyId","value","idleTime","value","value","crypto","value","value","value","clusterKeySlot","module","module","value","globMatches","value","bulk","value","expectArgCount","lines","equalsAscii","value","value","result","import_node_crypto","value","value","isSelfSortPattern","result","list","value","value","value","list","list","value","list","list","list","value","BACKSLASH","expectArgCount","hash","value","result","values","value","ms","value","ms","value","bulkString","value","value","bulkString","consumerId","bulkString","value","bulkString","value","value","value","all","zset","min","max","matched","value","value","zset","computeUnion","value","value","value","formatNumber","value","createAbortError","value","masters","value"]}
|