Review funkt

This commit is contained in:
2026-08-09 21:56:00 +00:00
parent f522ae9953
commit fe9dfa4519
11366 changed files with 2335077 additions and 97 deletions

View File

@@ -0,0 +1,181 @@
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<string, any>;
connect(): Promise<void>;
disconnect(reconnect?: boolean): void;
quit(): Promise<string>;
/** 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<any>` 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<any>;
multi(): IRedisTransaction;
pipeline(): IRedisTransaction;
hgetall(key: string): Promise<Record<string, string>>;
hget(key: string, field: string): Promise<string | null>;
hmget(key: string, ...fields: string[]): Promise<(string | null)[]>;
/** SET one or more hash fields from a field→value map. */
hset(key: string, data: Record<string, string | number>): Promise<number>;
hdel(key: string, ...fields: string[]): Promise<number>;
hexists(key: string, field: string): Promise<number>;
get(key: string): Promise<string | null>;
set(key: string, value: string | number, options?: {
PX?: number;
EX?: number;
}): Promise<string | null>;
del(...keys: string[]): Promise<number>;
zrange(key: string, start: number, end: number, options?: {
WITHSCORES?: boolean;
}): Promise<string[]>;
zrevrange(key: string, start: number, end: number, options?: {
WITHSCORES?: boolean;
}): Promise<string[]>;
zcard(key: string): Promise<number>;
zscore(key: string, member: string): Promise<string | null>;
lrange(key: string, start: number, end: number): Promise<string[]>;
llen(key: string): Promise<number>;
ltrim(key: string, start: number, end: number): Promise<string>;
lpos(key: string, value: string): Promise<number | null>;
smembers(key: string): Promise<string[]>;
/**
* 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<string, string | number>, options?: {
MAXLEN?: number;
approximate?: boolean;
}): Promise<string>;
/**
* 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<any>;
/**
* 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<number>;
/**
* 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<string>;
clientSetName(name: string): Promise<any>;
clientList(): Promise<string>;
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<string, string | number>): 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>;
}