import { Readable } from 'stream'; /** * Redis client interface for BullMQ. * * Abstracts the underlying Redis client library (ioredis, node-redis, Bun * built-in Redis, etc.) while keeping Redis semantics. Only the Redis * commands that BullMQ actually uses are declared here. * * Method signatures use **structured options objects** instead of ioredis-style * varargs so that every adapter (ioredis, node-redis, Bun, …) can map the * call to its native API without parsing positional string tokens. * * The reference implementation for ioredis lives in * `src/classes/ioredis-client.ts`. */ export interface IRedisClient { /** * Current connection status. * Adapters must expose at least the values `'ready'`, `'wait'`, and * `'end'` so that {@link RedisConnection.waitUntilReady} works correctly. */ status: string; /** Whether this client is connected to a Redis Cluster. */ readonly isCluster: boolean; /** Client configuration options (shape is adapter-specific). */ options: Record; connect(): Promise; disconnect(reconnect?: boolean): void; quit(): Promise; /** Create a duplicate connection with optional overrides. */ duplicate(...args: any[]): IRedisClient; on(event: string, listener: (...args: any[]) => void): this; once(event: string, listener: (...args: any[]) => void): this; removeListener(event: string, listener: (...args: any[]) => void): this; off(event: string, listener: (...args: any[]) => void): this; emit(event: string | symbol, ...args: any[]): boolean; setMaxListeners(n: number): this; getMaxListeners(): number; removeAllListeners(event?: string | symbol): this; /** * Register a Lua script as a named command so it can later be invoked via * {@link runCommand}. * * @param name - Command name that will be callable via runCommand. * @param definition - Script definition. * - `numberOfKeys` – number of KEYS[] arguments the script expects. * - `lua` – Lua source code. * - `readOnly` – (optional) hint that the script only reads data; * some adapters (e.g. ioredis) use this to route the * call to a replica in read-only mode. */ defineCommand(name: string, definition: { numberOfKeys: number; lua: string; readOnly?: boolean; }): void; /** * Execute a previously registered Lua script command by name. * * @param name - The command name passed to {@link defineCommand}. * @param args - Arguments forwarded to the script (KEYS first, then ARGV). * @returns A `Promise` whose resolved value matches the return value of * the Lua script. BullMQ scripts return integers, strings, or arrays of * strings/integers. Callers in {@link Scripts.execCommand} cast the result * to the expected concrete type after the call. */ runCommand(name: string, args: any[]): Promise; multi(): IRedisTransaction; pipeline(): IRedisTransaction; hgetall(key: string): Promise>; hget(key: string, field: string): Promise; hmget(key: string, ...fields: string[]): Promise<(string | null)[]>; /** SET one or more hash fields from a field→value map. */ hset(key: string, data: Record): Promise; hdel(key: string, ...fields: string[]): Promise; hexists(key: string, field: string): Promise; get(key: string): Promise; set(key: string, value: string | number, options?: { PX?: number; EX?: number; }): Promise; del(...keys: string[]): Promise; zrange(key: string, start: number, end: number, options?: { WITHSCORES?: boolean; }): Promise; zrevrange(key: string, start: number, end: number, options?: { WITHSCORES?: boolean; }): Promise; zcard(key: string): Promise; zscore(key: string, member: string): Promise; lrange(key: string, start: number, end: number): Promise; llen(key: string): Promise; ltrim(key: string, start: number, end: number): Promise; lpos(key: string, value: string): Promise; smembers(key: string): Promise; /** * Append an entry to a stream. * * @param key - Stream key * @param id - Entry ID (typically `'*'` for auto-generated) * @param fields - Field-value pairs for the stream entry * @param options - Optional MAXLEN trimming parameters */ xadd(key: string, id: string, fields: Record, options?: { MAXLEN?: number; approximate?: boolean; }): Promise; /** * Read from one or more streams. * * @param streams - Array of stream/id pairs to read from * @param options - Optional BLOCK timeout and COUNT */ xread(streams: { key: string; id: string; }[], options?: { BLOCK?: number; COUNT?: number; }): Promise; /** * Trim a stream. * * @param key - Stream key * @param strategy - Trim strategy (e.g. `'MAXLEN'`) * @param threshold - Maximum stream length * @param options - Optional approximate trimming */ xtrim(key: string, strategy: 'MAXLEN', threshold: number, options?: { approximate?: boolean; }): Promise; /** * Block until an element is available in the given sorted set, or the * timeout expires. * * The return shape mirrors ioredis' native `bzpopmin`: * `[key, member, score]` on success, or `null` on timeout. Adapters for * other clients (node-redis, bun) MUST convert their native return value * to this tuple form. This avoids mutating the shape of `bzpopmin` on * shared ioredis instances, which would be a breaking change for code * that uses the same client outside of BullMQ. */ bzpopmin(key: string, timeout: number): Promise<[key: string, member: string, score: string] | null>; info(): Promise; clientSetName(name: string): Promise; clientList(): Promise; scan(cursor: string | number, options: { MATCH?: string; COUNT?: number; }): Promise<[string, string[]]>; scanStream(options: { match: string; count?: number; }): Readable; /** Return connections for each cluster node (only when isCluster). */ nodes?(): IRedisClient[]; } /** * Redis pipeline or transaction (MULTI). * * Commands are queued and executed together via {@link exec}. * Only the subset of commands BullMQ uses inside pipelines is declared. */ export interface IRedisTransaction { hgetall(key: string): this; hset(key: string, data: Record): this; hscan(key: string, cursor: string | number, options?: { COUNT?: number; }): this; smembers(key: string): this; sscan(key: string, cursor: string | number, options?: { COUNT?: number; }): this; zrange(key: string, start: number, end: number): this; lrange(key: string, start: number, end: number): this; llen(key: string): this; del(...keys: string[]): this; runCommand(name: string, args: any[]): this; /** Execute all queued commands. */ exec(): Promise<[Error | null, any][] | null>; }