@upstash/redis 0.0.0-ci.fbd851d5174af0f471e681ec296b0b4802b3b460 → 0.0.0-ci.fbead4fb2ed281bdc04ec90c263e6380eed1465b-20251021062126

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.
@@ -23,7 +23,10 @@ type RedisOptions = {
23
23
  * @default true
24
24
  */
25
25
  automaticDeserialization?: boolean;
26
+ latencyLogging?: boolean;
26
27
  enableTelemetry?: boolean;
28
+ enableAutoPipelining?: boolean;
29
+ readYourWrites?: boolean;
27
30
  };
28
31
 
29
32
  type CacheSetting = "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload";
@@ -33,12 +36,37 @@ type UpstashRequest = {
33
36
  * Request body will be serialized to json
34
37
  */
35
38
  body?: unknown;
39
+ /**
40
+ * Additional headers for the request
41
+ */
42
+ headers?: Record<string, string>;
43
+ upstashSyncToken?: string;
44
+ /**
45
+ * Callback for handling streaming messages
46
+ */
47
+ onMessage?: (data: string) => void;
48
+ /**
49
+ * Whether this request expects a streaming response
50
+ */
51
+ isStreaming?: boolean;
52
+ /**
53
+ * Abort signal for the request
54
+ */
55
+ signal?: AbortSignal;
36
56
  };
37
57
  type UpstashResponse<TResult> = {
38
58
  result?: TResult;
39
59
  error?: string;
40
60
  };
41
61
  interface Requester {
62
+ /**
63
+ * When this flag is enabled, any subsequent commands issued by this client are guaranteed to observe the effects of all earlier writes submitted by the same client.
64
+ */
65
+ readYourWrites?: boolean;
66
+ /**
67
+ * This token is used to ensure that the client is in sync with the server. On each request, we send this token in the header, and the server will return a new token.
68
+ */
69
+ upstashSyncToken?: string;
42
70
  request: <TResult = unknown>(req: UpstashRequest) => Promise<UpstashResponse<TResult>>;
43
71
  }
44
72
  type RetryConfig = false | {
@@ -49,7 +77,7 @@ type RetryConfig = false | {
49
77
  */
50
78
  retries?: number;
51
79
  /**
52
- * A backoff function receives the current retry cound and returns a number in milliseconds to wait before retrying.
80
+ * A backoff function receives the current retry count and returns a number in milliseconds to wait before retrying.
53
81
  *
54
82
  * @default
55
83
  * ```ts
@@ -58,6 +86,9 @@ type RetryConfig = false | {
58
86
  */
59
87
  backoff?: (retryCount: number) => number;
60
88
  };
89
+ type Options$1 = {
90
+ backend?: string;
91
+ };
61
92
  type RequesterConfig = {
62
93
  /**
63
94
  * Configure the retry behaviour in case of network errors
@@ -92,6 +123,19 @@ type RequesterConfig = {
92
123
  */
93
124
  cache?: CacheSetting;
94
125
  };
126
+ type HttpClientConfig = {
127
+ headers?: Record<string, string>;
128
+ baseUrl: string;
129
+ options?: Options$1;
130
+ retry?: RetryConfig;
131
+ agent?: any;
132
+ signal?: AbortSignal | (() => AbortSignal);
133
+ keepAlive?: boolean;
134
+ /**
135
+ * When this flag is enabled, any subsequent commands issued by this client are guaranteed to observe the effects of all earlier writes submitted by the same client.
136
+ */
137
+ readYourWrites?: boolean;
138
+ } & RequesterConfig;
95
139
 
96
140
  type Serialize = (data: unknown) => string | number | boolean;
97
141
  type Deserialize<TResult, TData> = (result: TResult) => TData;
@@ -106,6 +150,32 @@ type CommandOptions<TResult, TData> = {
106
150
  * @default true
107
151
  */
108
152
  automaticDeserialization?: boolean;
153
+ latencyLogging?: boolean;
154
+ /**
155
+ * Additional headers to be sent with the request
156
+ */
157
+ headers?: Record<string, string>;
158
+ /**
159
+ * Path to append to the URL
160
+ */
161
+ path?: string[];
162
+ /**
163
+ * Options for streaming requests, mainly used for subscribe, monitor commands
164
+ **/
165
+ streamOptions?: {
166
+ /**
167
+ * Callback to be called when a message is received
168
+ */
169
+ onMessage?: (data: string) => void;
170
+ /**
171
+ * Whether the request is streaming
172
+ */
173
+ isStreaming?: boolean;
174
+ /**
175
+ * Signal to abort the request
176
+ */
177
+ signal?: AbortSignal;
178
+ };
109
179
  };
110
180
  /**
111
181
  * Command offers default (de)serialization and the exec method to all commands.
@@ -117,6 +187,11 @@ declare class Command<TResult, TData> {
117
187
  readonly command: (string | number | boolean)[];
118
188
  readonly serialize: Serialize;
119
189
  readonly deserialize: Deserialize<TResult, TData>;
190
+ protected readonly headers?: Record<string, string>;
191
+ protected readonly path?: string[];
192
+ protected readonly onMessage?: (data: string) => void;
193
+ protected readonly isStreaming: boolean;
194
+ protected readonly signal?: AbortSignal;
120
195
  /**
121
196
  * Create a new command instance.
122
197
  *
@@ -212,18 +287,6 @@ declare class ScriptFlushCommand extends Command<"OK", "OK"> {
212
287
  constructor([opts]: [opts?: ScriptFlushCommandOptions], cmdOpts?: CommandOptions<"OK", "OK">);
213
288
  }
214
289
 
215
- type ScanCommandOptions = {
216
- match?: string;
217
- count?: number;
218
- type?: string;
219
- };
220
- /**
221
- * @see https://redis.io/commands/scan
222
- */
223
- declare class ScanCommand extends Command<[number, string[]], [number, string[]]> {
224
- constructor([cursor, opts]: [cursor: number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[number, string[]], [number, string[]]>);
225
- }
226
-
227
290
  type GeoAddCommandOptions = {
228
291
  nx?: boolean;
229
292
  xx?: never;
@@ -233,11 +296,11 @@ type GeoAddCommandOptions = {
233
296
  } & {
234
297
  ch?: boolean;
235
298
  });
236
- interface GeoMember<TMemberType> {
299
+ type GeoMember<TMemberType> = {
237
300
  latitude: number;
238
301
  longitude: number;
239
302
  member: TMemberType;
240
- }
303
+ };
241
304
  /**
242
305
  * @see https://redis.io/commands/geoadd
243
306
  */
@@ -249,6 +312,11 @@ declare class GeoAddCommand<TMemberType = string> extends Command<number | null,
249
312
  ], opts?: CommandOptions<number | null, number | null>);
250
313
  }
251
314
 
315
+ type ExpireOption = "NX" | "nx" | "XX" | "xx" | "GT" | "gt" | "LT" | "lt";
316
+ declare class ExpireCommand extends Command<"0" | "1", 0 | 1> {
317
+ constructor(cmd: [key: string, seconds: number, option?: ExpireOption], opts?: CommandOptions<"0" | "1", 0 | 1>);
318
+ }
319
+
252
320
  /**
253
321
  * @see https://redis.io/commands/append
254
322
  */
@@ -264,6 +332,28 @@ declare class BitCountCommand extends Command<number, number> {
264
332
  constructor(cmd: [key: string, start: number, end: number], opts?: CommandOptions<number, number>);
265
333
  }
266
334
 
335
+ type SubCommandArgs<TRest extends unknown[] = []> = [
336
+ encoding: string,
337
+ offset: number | string,
338
+ ...rest: TRest
339
+ ];
340
+ /**
341
+ * @see https://redis.io/commands/bitfield
342
+ */
343
+ declare class BitFieldCommand<T = Promise<number[]>> {
344
+ private client;
345
+ private opts?;
346
+ private execOperation;
347
+ private command;
348
+ constructor(args: [key: string], client: Requester, opts?: CommandOptions<number[], number[]> | undefined, execOperation?: (command: Command<number[], number[]>) => T);
349
+ private chain;
350
+ get(...args: SubCommandArgs): this;
351
+ set(...args: SubCommandArgs<[value: number]>): this;
352
+ incrby(...args: SubCommandArgs<[increment: number]>): this;
353
+ overflow(overflow: "WRAP" | "SAT" | "FAIL"): this;
354
+ exec(): T;
355
+ }
356
+
267
357
  /**
268
358
  * @see https://redis.io/commands/bitop
269
359
  */
@@ -323,6 +413,13 @@ declare class EchoCommand extends Command<string, string> {
323
413
  constructor(cmd: [message: string], opts?: CommandOptions<string, string>);
324
414
  }
325
415
 
416
+ /**
417
+ * @see https://redis.io/commands/eval_ro
418
+ */
419
+ declare class EvalROCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
420
+ constructor([script, keys, args]: [script: string, keys: string[], args: TArgs], opts?: CommandOptions<unknown, TData>);
421
+ }
422
+
326
423
  /**
327
424
  * @see https://redis.io/commands/eval
328
425
  */
@@ -330,6 +427,13 @@ declare class EvalCommand<TArgs extends unknown[], TData> extends Command<unknow
330
427
  constructor([script, keys, args]: [script: string, keys: string[], args: TArgs], opts?: CommandOptions<unknown, TData>);
331
428
  }
332
429
 
430
+ /**
431
+ * @see https://redis.io/commands/evalsha_ro
432
+ */
433
+ declare class EvalshaROCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
434
+ constructor([sha, keys, args]: [sha: string, keys: string[], args?: TArgs], opts?: CommandOptions<unknown, TData>);
435
+ }
436
+
333
437
  /**
334
438
  * @see https://redis.io/commands/evalsha
335
439
  */
@@ -344,18 +448,11 @@ declare class ExistsCommand extends Command<number, number> {
344
448
  constructor(cmd: [...keys: string[]], opts?: CommandOptions<number, number>);
345
449
  }
346
450
 
347
- /**
348
- * @see https://redis.io/commands/expire
349
- */
350
- declare class ExpireCommand extends Command<"0" | "1", 0 | 1> {
351
- constructor(cmd: [key: string, seconds: number], opts?: CommandOptions<"0" | "1", 0 | 1>);
352
- }
353
-
354
451
  /**
355
452
  * @see https://redis.io/commands/expireat
356
453
  */
357
454
  declare class ExpireAtCommand extends Command<"0" | "1", 0 | 1> {
358
- constructor(cmd: [key: string, unix: number], opts?: CommandOptions<"0" | "1", 0 | 1>);
455
+ constructor(cmd: [key: string, unix: number, option?: ExpireOption], opts?: CommandOptions<"0" | "1", 0 | 1>);
359
456
  }
360
457
 
361
458
  /**
@@ -388,6 +485,13 @@ declare class GeoDistCommand<TMemberType = string> extends Command<number | null
388
485
  ], opts?: CommandOptions<number | null, number | null>);
389
486
  }
390
487
 
488
+ /**
489
+ * @see https://redis.io/commands/geohash
490
+ */
491
+ declare class GeoHashCommand<TMember = string> extends Command<(string | null)[], (string | null)[]> {
492
+ constructor(cmd: [string, ...TMember[]], opts?: CommandOptions<(string | null)[], (string | null)[]>);
493
+ }
494
+
391
495
  type Coordinates = {
392
496
  lng: number;
393
497
  lat: number;
@@ -399,13 +503,6 @@ declare class GeoPosCommand<TMember = string> extends Command<(string | null)[][
399
503
  constructor(cmd: [string, ...(TMember[] | TMember[])], opts?: CommandOptions<(string | null)[][], Coordinates[]>);
400
504
  }
401
505
 
402
- /**
403
- * @see https://redis.io/commands/geohash
404
- */
405
- declare class GeoHashCommand<TMember = string> extends Command<(string | null)[], (string | null)[]> {
406
- constructor(cmd: [string, ...(TMember[] | TMember[])], opts?: CommandOptions<(string | null)[], (string | null)[]>);
407
- }
408
-
409
506
  type RadiusOptions$1 = "M" | "KM" | "FT" | "MI";
410
507
  type CenterPoint$1<TMemberType> = {
411
508
  type: "FROMMEMBER" | "frommember";
@@ -530,6 +627,50 @@ declare class GetDelCommand<TData = string> extends Command<unknown | null, TDat
530
627
  constructor(cmd: [key: string], opts?: CommandOptions<unknown | null, TData | null>);
531
628
  }
532
629
 
630
+ type GetExCommandOptions = {
631
+ ex: number;
632
+ px?: never;
633
+ exat?: never;
634
+ pxat?: never;
635
+ persist?: never;
636
+ } | {
637
+ ex?: never;
638
+ px: number;
639
+ exat?: never;
640
+ pxat?: never;
641
+ persist?: never;
642
+ } | {
643
+ ex?: never;
644
+ px?: never;
645
+ exat: number;
646
+ pxat?: never;
647
+ persist?: never;
648
+ } | {
649
+ ex?: never;
650
+ px?: never;
651
+ exat?: never;
652
+ pxat: number;
653
+ persist?: never;
654
+ } | {
655
+ ex?: never;
656
+ px?: never;
657
+ exat?: never;
658
+ pxat?: never;
659
+ persist: true;
660
+ } | {
661
+ ex?: never;
662
+ px?: never;
663
+ exat?: never;
664
+ pxat?: never;
665
+ persist?: never;
666
+ };
667
+ /**
668
+ * @see https://redis.io/commands/getex
669
+ */
670
+ declare class GetExCommand<TData = string> extends Command<unknown | null, TData | null> {
671
+ constructor([key, opts]: [key: string, opts?: GetExCommandOptions], cmdOpts?: CommandOptions<unknown | null, TData | null>);
672
+ }
673
+
533
674
  /**
534
675
  * @see https://redis.io/commands/getrange
535
676
  */
@@ -558,6 +699,58 @@ declare class HExistsCommand extends Command<number, number> {
558
699
  constructor(cmd: [key: string, field: string], opts?: CommandOptions<number, number>);
559
700
  }
560
701
 
702
+ declare class HExpireCommand extends Command<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]> {
703
+ constructor(cmd: [
704
+ key: string,
705
+ fields: (string | number) | (string | number)[],
706
+ seconds: number,
707
+ option?: ExpireOption
708
+ ], opts?: CommandOptions<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]>);
709
+ }
710
+
711
+ declare class HExpireAtCommand extends Command<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]> {
712
+ constructor(cmd: [
713
+ key: string,
714
+ fields: (string | number) | (string | number)[],
715
+ timestamp: number,
716
+ option?: ExpireOption
717
+ ], opts?: CommandOptions<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]>);
718
+ }
719
+
720
+ declare class HExpireTimeCommand extends Command<number[], number[]> {
721
+ constructor(cmd: [key: string, fields: (string | number) | (string | number)[]], opts?: CommandOptions<number[], number[]>);
722
+ }
723
+
724
+ declare class HPersistCommand extends Command<(-2 | -1 | 1)[], (-2 | -1 | 1)[]> {
725
+ constructor(cmd: [key: string, fields: (string | number) | (string | number)[]], opts?: CommandOptions<(-2 | -1 | 1)[], (-2 | -1 | 1)[]>);
726
+ }
727
+
728
+ declare class HPExpireCommand extends Command<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]> {
729
+ constructor(cmd: [
730
+ key: string,
731
+ fields: (string | number) | (string | number)[],
732
+ milliseconds: number,
733
+ option?: ExpireOption
734
+ ], opts?: CommandOptions<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]>);
735
+ }
736
+
737
+ declare class HPExpireAtCommand extends Command<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]> {
738
+ constructor(cmd: [
739
+ key: string,
740
+ fields: (string | number) | (string | number)[],
741
+ timestamp: number,
742
+ option?: ExpireOption
743
+ ], opts?: CommandOptions<(-2 | 0 | 1 | 2)[], (-2 | 0 | 1 | 2)[]>);
744
+ }
745
+
746
+ declare class HPExpireTimeCommand extends Command<number[], number[]> {
747
+ constructor(cmd: [key: string, fields: (string | number) | (string | number)[]], opts?: CommandOptions<number[], number[]>);
748
+ }
749
+
750
+ declare class HPTtlCommand extends Command<number[], number[]> {
751
+ constructor(cmd: [key: string, fields: (string | number) | (string | number)[]], opts?: CommandOptions<number[], number[]>);
752
+ }
753
+
561
754
  /**
562
755
  * @see https://redis.io/commands/hget
563
756
  */
@@ -619,9 +812,7 @@ declare class HMGetCommand<TData extends Record<string, unknown>> extends Comman
619
812
  * @see https://redis.io/commands/hmset
620
813
  */
621
814
  declare class HMSetCommand<TData> extends Command<"OK", "OK"> {
622
- constructor([key, kv]: [key: string, kv: {
623
- [field: string]: TData;
624
- }], opts?: CommandOptions<"OK", "OK">);
815
+ constructor([key, kv]: [key: string, kv: Record<string, TData>], opts?: CommandOptions<"OK", "OK">);
625
816
  }
626
817
 
627
818
  /**
@@ -633,26 +824,57 @@ declare class HRandFieldCommand<TData extends string | string[] | Record<string,
633
824
  constructor(cmd: [key: string, count: number, withValues: boolean], opts?: CommandOptions<string[], Partial<TData>>);
634
825
  }
635
826
 
827
+ type ScanCommandOptionsStandard = {
828
+ match?: string;
829
+ count?: number;
830
+ type?: string;
831
+ withType?: false;
832
+ };
833
+ type ScanCommandOptionsWithType = {
834
+ match?: string;
835
+ count?: number;
836
+ /**
837
+ * Includes types of each key in the result
838
+ *
839
+ * @example
840
+ * ```typescript
841
+ * await redis.scan("0", { withType: true })
842
+ * // ["0", [{ key: "key1", type: "string" }, { key: "key2", type: "list" }]]
843
+ * ```
844
+ */
845
+ withType: true;
846
+ };
847
+ type ScanCommandOptions = ScanCommandOptionsStandard | ScanCommandOptionsWithType;
848
+ type ScanResultStandard = [string, string[]];
849
+ type ScanResultWithType = [string, {
850
+ key: string;
851
+ type: string;
852
+ }[]];
853
+ /**
854
+ * @see https://redis.io/commands/scan
855
+ */
856
+ declare class ScanCommand<TData = ScanResultStandard> extends Command<[string, string[]], TData> {
857
+ constructor([cursor, opts]: [cursor: string | number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[string, string[]], TData>);
858
+ }
859
+
636
860
  /**
637
861
  * @see https://redis.io/commands/hscan
638
862
  */
639
863
  declare class HScanCommand extends Command<[
640
- number,
864
+ string,
641
865
  (string | number)[]
642
866
  ], [
643
- number,
867
+ string,
644
868
  (string | number)[]
645
869
  ]> {
646
- constructor([key, cursor, cmdOpts]: [key: string, cursor: number, cmdOpts?: ScanCommandOptions], opts?: CommandOptions<[number, (string | number)[]], [number, (string | number)[]]>);
870
+ constructor([key, cursor, cmdOpts]: [key: string, cursor: string | number, cmdOpts?: ScanCommandOptions], opts?: CommandOptions<[string, (string | number)[]], [string, (string | number)[]]>);
647
871
  }
648
872
 
649
873
  /**
650
874
  * @see https://redis.io/commands/hset
651
875
  */
652
876
  declare class HSetCommand<TData> extends Command<number, number> {
653
- constructor([key, kv]: [key: string, kv: {
654
- [field: string]: TData;
655
- }], opts?: CommandOptions<number, number>);
877
+ constructor([key, kv]: [key: string, kv: Record<string, TData>], opts?: CommandOptions<number, number>);
656
878
  }
657
879
 
658
880
  /**
@@ -669,6 +891,10 @@ declare class HStrLenCommand extends Command<number, number> {
669
891
  constructor(cmd: [key: string, field: string], opts?: CommandOptions<number, number>);
670
892
  }
671
893
 
894
+ declare class HTtlCommand extends Command<number[], number[]> {
895
+ constructor(cmd: [key: string, fields: (string | number) | (string | number)[]], opts?: CommandOptions<number[], number[]>);
896
+ }
897
+
672
898
  /**
673
899
  * @see https://redis.io/commands/hvals
674
900
  */
@@ -775,13 +1001,31 @@ declare class JsonGetCommand<TData extends (unknown | Record<string, unknown>) |
775
1001
  ] | [key: string, ...path: string[]], opts?: CommandOptions<TData | null, TData | null>);
776
1002
  }
777
1003
 
1004
+ /**
1005
+ * @see https://redis.io/commands/json.merge
1006
+ */
1007
+ declare class JsonMergeCommand<TData extends string | number | Record<string, unknown> | Array<unknown>> extends Command<"OK" | null, "OK" | null> {
1008
+ constructor(cmd: [key: string, path: string, value: TData], opts?: CommandOptions<"OK" | null, "OK" | null>);
1009
+ }
1010
+
778
1011
  /**
779
1012
  * @see https://redis.io/commands/json.mget
780
1013
  */
781
- declare class JsonMGetCommand<TData extends (unknown | Record<string, unknown>)[]> extends Command<TData, TData> {
1014
+ declare class JsonMGetCommand<TData = unknown[]> extends Command<TData, TData> {
782
1015
  constructor(cmd: [keys: string[], path: string], opts?: CommandOptions<TData, TData>);
783
1016
  }
784
1017
 
1018
+ /**
1019
+ * @see https://redis.io/commands/json.mset
1020
+ */
1021
+ declare class JsonMSetCommand<TData extends number | string | boolean | Record<string, unknown> | (number | string | boolean | Record<string, unknown>)[]> extends Command<"OK" | null, "OK" | null> {
1022
+ constructor(cmd: {
1023
+ key: string;
1024
+ path: string;
1025
+ value: TData;
1026
+ }[], opts?: CommandOptions<"OK" | null, "OK" | null>);
1027
+ }
1028
+
785
1029
  /**
786
1030
  * @see https://redis.io/commands/json.numincrby
787
1031
  */
@@ -938,25 +1182,21 @@ declare class LTrimCommand extends Command<"OK", "OK"> {
938
1182
  * @see https://redis.io/commands/mget
939
1183
  */
940
1184
  declare class MGetCommand<TData extends unknown[]> extends Command<(string | null)[], TData> {
941
- constructor(cmd: [string[]] | [...(string[] | string[])], opts?: CommandOptions<(string | null)[], TData>);
1185
+ constructor(cmd: [string[]] | [...string[]], opts?: CommandOptions<(string | null)[], TData>);
942
1186
  }
943
1187
 
944
1188
  /**
945
1189
  * @see https://redis.io/commands/mset
946
1190
  */
947
1191
  declare class MSetCommand<TData> extends Command<"OK", "OK"> {
948
- constructor([kv]: [kv: {
949
- [key: string]: TData;
950
- }], opts?: CommandOptions<"OK", "OK">);
1192
+ constructor([kv]: [kv: Record<string, TData>], opts?: CommandOptions<"OK", "OK">);
951
1193
  }
952
1194
 
953
1195
  /**
954
1196
  * @see https://redis.io/commands/msetnx
955
1197
  */
956
1198
  declare class MSetNXCommand<TData = string> extends Command<number, number> {
957
- constructor([kv]: [kv: {
958
- [key: string]: TData;
959
- }], opts?: CommandOptions<number, number>);
1199
+ constructor([kv]: [kv: Record<string, TData>], opts?: CommandOptions<number, number>);
960
1200
  }
961
1201
 
962
1202
  /**
@@ -970,14 +1210,14 @@ declare class PersistCommand extends Command<"0" | "1", 0 | 1> {
970
1210
  * @see https://redis.io/commands/pexpire
971
1211
  */
972
1212
  declare class PExpireCommand extends Command<"0" | "1", 0 | 1> {
973
- constructor(cmd: [key: string, milliseconds: number], opts?: CommandOptions<"0" | "1", 0 | 1>);
1213
+ constructor(cmd: [key: string, milliseconds: number, option?: ExpireOption], opts?: CommandOptions<"0" | "1", 0 | 1>);
974
1214
  }
975
1215
 
976
1216
  /**
977
1217
  * @see https://redis.io/commands/pexpireat
978
1218
  */
979
1219
  declare class PExpireAtCommand extends Command<"0" | "1", 0 | 1> {
980
- constructor(cmd: [key: string, unix: number], opts?: CommandOptions<"0" | "1", 0 | 1>);
1220
+ constructor(cmd: [key: string, unix: number, option?: ExpireOption], opts?: CommandOptions<"0" | "1", 0 | 1>);
981
1221
  }
982
1222
 
983
1223
  /**
@@ -1054,7 +1294,7 @@ declare class RPushXCommand<TData = string> extends Command<number, number> {
1054
1294
  * @see https://redis.io/commands/sadd
1055
1295
  */
1056
1296
  declare class SAddCommand<TData = string> extends Command<number, number> {
1057
- constructor(cmd: [key: string, ...members: TData[]], opts?: CommandOptions<number, number>);
1297
+ constructor(cmd: [key: string, member: TData, ...members: TData[]], opts?: CommandOptions<number, number>);
1058
1298
  }
1059
1299
 
1060
1300
  /**
@@ -1242,13 +1482,13 @@ declare class SRemCommand<TData = string> extends Command<number, number> {
1242
1482
  * @see https://redis.io/commands/sscan
1243
1483
  */
1244
1484
  declare class SScanCommand extends Command<[
1245
- number,
1485
+ string,
1246
1486
  (string | number)[]
1247
1487
  ], [
1248
- number,
1488
+ string,
1249
1489
  (string | number)[]
1250
1490
  ]> {
1251
- constructor([key, cursor, opts]: [key: string, cursor: number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[number, (string | number)[]], [number, (string | number)[]]>);
1491
+ constructor([key, cursor, opts]: [key: string, cursor: string | number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[string, (string | number)[]], [string, (string | number)[]]>);
1252
1492
  }
1253
1493
 
1254
1494
  /**
@@ -1323,9 +1563,7 @@ declare class XAddCommand extends Command<string, string> {
1323
1563
  constructor([key, id, entries, opts]: [
1324
1564
  key: string,
1325
1565
  id: "*" | string,
1326
- entries: {
1327
- [field: string]: unknown;
1328
- },
1566
+ entries: Record<string, unknown>,
1329
1567
  opts?: XAddCommandOptions
1330
1568
  ], commandOptions?: CommandOptions<string, string>);
1331
1569
  }
@@ -1334,7 +1572,75 @@ declare class XRangeCommand<TData extends Record<string, Record<string, unknown>
1334
1572
  constructor([key, start, end, count]: [key: string, start: string, end: string, count?: number], opts?: CommandOptions<unknown[], TData[]>);
1335
1573
  }
1336
1574
 
1337
- type ZAddCommandOptions = ({
1575
+ type XReadCommandOptions = [
1576
+ key: string | string[],
1577
+ id: string | string[],
1578
+ options?: {
1579
+ count?: number;
1580
+ /**
1581
+ * @deprecated block is not yet supported in Upstash Redis
1582
+ */
1583
+ blockMS?: number;
1584
+ }
1585
+ ];
1586
+ type XReadOptions = XReadCommandOptions extends [infer K, infer I, ...any[]] ? K extends string ? I extends string ? [
1587
+ key: string,
1588
+ id: string,
1589
+ options?: {
1590
+ count?: number;
1591
+ /**
1592
+ * @deprecated block is not yet supported in Upstash Redis
1593
+ */
1594
+ blockMS?: number;
1595
+ }
1596
+ ] : never : K extends string[] ? I extends string[] ? [
1597
+ key: string[],
1598
+ id: string[],
1599
+ options?: {
1600
+ count?: number;
1601
+ /**
1602
+ * @deprecated block is not yet supported in Upstash Redis
1603
+ */
1604
+ blockMS?: number;
1605
+ }
1606
+ ] : never : never : never;
1607
+ /**
1608
+ * @see https://redis.io/commands/xread
1609
+ */
1610
+ declare class XReadCommand extends Command<number, unknown[]> {
1611
+ constructor([key, id, options]: XReadOptions, opts?: CommandOptions<number, unknown[]>);
1612
+ }
1613
+
1614
+ type Options = {
1615
+ count?: number;
1616
+ /**
1617
+ * @deprecated block is not yet supported in Upstash Redis
1618
+ */
1619
+ blockMS?: number;
1620
+ NOACK?: boolean;
1621
+ };
1622
+ type XReadGroupCommandOptions = [
1623
+ group: string,
1624
+ consumer: string,
1625
+ key: string | string[],
1626
+ id: string | string[],
1627
+ options?: Options
1628
+ ];
1629
+ type XReadGroupOptions = XReadGroupCommandOptions extends [
1630
+ string,
1631
+ string,
1632
+ infer TKey,
1633
+ infer TId,
1634
+ ...any[]
1635
+ ] ? TKey extends string ? TId extends string ? [group: string, consumer: string, key: string, id: string, options?: Options] : never : TKey extends string[] ? TId extends string[] ? [group: string, consumer: string, key: string[], id: string[], options?: Options] : never : never : never;
1636
+ /**
1637
+ * @see https://redis.io/commands/xreadgroup
1638
+ */
1639
+ declare class XReadGroupCommand extends Command<number, unknown[]> {
1640
+ constructor([group, consumer, key, id, options]: XReadGroupOptions, opts?: CommandOptions<number, unknown[]>);
1641
+ }
1642
+
1643
+ type NXAndXXOptions = {
1338
1644
  nx: true;
1339
1645
  xx?: never;
1340
1646
  } | {
@@ -1343,12 +1649,23 @@ type ZAddCommandOptions = ({
1343
1649
  } | {
1344
1650
  nx?: never;
1345
1651
  xx?: never;
1346
- }) & {
1347
- ch?: true;
1348
1652
  };
1349
- type ZAddCommandOptionsWithIncr = ZAddCommandOptions & {
1350
- incr: true;
1653
+ type LTAndGTOptions = {
1654
+ lt: true;
1655
+ gt?: never;
1656
+ } | {
1657
+ lt?: never;
1658
+ gt: true;
1659
+ } | {
1660
+ lt?: never;
1661
+ gt?: never;
1662
+ };
1663
+ type ZAddCommandOptions = NXAndXXOptions & LTAndGTOptions & {
1664
+ ch?: true;
1665
+ } & {
1666
+ incr?: true;
1351
1667
  };
1668
+ type Arg2<TData> = ScoreMember<TData> | ZAddCommandOptions;
1352
1669
  type ScoreMember<TData> = {
1353
1670
  score: number;
1354
1671
  member: TData;
@@ -1357,12 +1674,7 @@ type ScoreMember<TData> = {
1357
1674
  * @see https://redis.io/commands/zadd
1358
1675
  */
1359
1676
  declare class ZAddCommand<TData = string> extends Command<number | null, number | null> {
1360
- constructor(cmd: [key: string, scoreMember: ScoreMember<TData>, ...scoreMemberPairs: ScoreMember<TData>[]], opts?: CommandOptions<number | null, number | null>);
1361
- constructor(cmd: [
1362
- key: string,
1363
- opts: ZAddCommandOptions | ZAddCommandOptionsWithIncr,
1364
- ...scoreMemberPairs: ScoreMember<TData>[]
1365
- ], opts?: CommandOptions<number | null, number | null>);
1677
+ constructor([key, arg1, ...arg2]: [string, Arg2<TData>, ...ScoreMember<TData>[]], opts?: CommandOptions<number | null, number | null>);
1366
1678
  }
1367
1679
 
1368
1680
  /**
@@ -1495,13 +1807,13 @@ declare class ZRevRankCommand<TData> extends Command<number | null, number | nul
1495
1807
  * @see https://redis.io/commands/zscan
1496
1808
  */
1497
1809
  declare class ZScanCommand extends Command<[
1498
- number,
1810
+ string,
1499
1811
  (string | number)[]
1500
1812
  ], [
1501
- number,
1813
+ string,
1502
1814
  (string | number)[]
1503
1815
  ]> {
1504
- constructor([key, cursor, opts]: [key: string, cursor: number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[number, (string | number)[]], [number, (string | number)[]]>);
1816
+ constructor([key, cursor, opts]: [key: string, cursor: string | number, opts?: ScanCommandOptions], cmdOpts?: CommandOptions<[string, (string | number)[]], [string, (string | number)[]]>);
1505
1817
  }
1506
1818
 
1507
1819
  /**
@@ -1511,9 +1823,79 @@ declare class ZScoreCommand<TData> extends Command<string | null, number | null>
1511
1823
  constructor(cmd: [key: string, member: TData], opts?: CommandOptions<string | null, number | null>);
1512
1824
  }
1513
1825
 
1826
+ type BaseMessageData<TMessage> = {
1827
+ channel: string;
1828
+ message: TMessage;
1829
+ };
1830
+ type PatternMessageData<TMessage> = BaseMessageData<TMessage> & {
1831
+ pattern: string;
1832
+ };
1833
+ type SubscriptionCountEvent = number;
1834
+ type MessageEventMap<TMessage> = {
1835
+ message: BaseMessageData<TMessage>;
1836
+ subscribe: SubscriptionCountEvent;
1837
+ unsubscribe: SubscriptionCountEvent;
1838
+ pmessage: PatternMessageData<TMessage>;
1839
+ psubscribe: SubscriptionCountEvent;
1840
+ punsubscribe: SubscriptionCountEvent;
1841
+ error: Error;
1842
+ [key: `message:${string}`]: BaseMessageData<TMessage>;
1843
+ [key: `pmessage:${string}`]: PatternMessageData<TMessage>;
1844
+ };
1845
+ type EventType = keyof MessageEventMap<any>;
1846
+ type Listener<TMessage, T extends EventType> = (event: MessageEventMap<TMessage>[T]) => void;
1847
+ declare class Subscriber<TMessage = any> extends EventTarget {
1848
+ private subscriptions;
1849
+ private client;
1850
+ private listeners;
1851
+ private opts?;
1852
+ constructor(client: Requester, channels: string[], isPattern?: boolean, opts?: Pick<RedisOptions, "automaticDeserialization">);
1853
+ private subscribeToChannel;
1854
+ private subscribeToPattern;
1855
+ private handleMessage;
1856
+ private dispatchToListeners;
1857
+ on<T extends keyof MessageEventMap<TMessage>>(type: T, listener: Listener<TMessage, T>): void;
1858
+ removeAllListeners(): void;
1859
+ unsubscribe(channels?: string[]): Promise<void>;
1860
+ getSubscribedChannels(): string[];
1861
+ }
1862
+
1514
1863
  type InferResponseData<T extends unknown[]> = {
1515
1864
  [K in keyof T]: T[K] extends Command<any, infer TData> ? TData : unknown;
1516
1865
  };
1866
+ interface ExecMethod<TCommands extends Command<any, any>[]> {
1867
+ /**
1868
+ * Send the pipeline request to upstash.
1869
+ *
1870
+ * Returns an array with the results of all pipelined commands.
1871
+ *
1872
+ * If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
1873
+ * ```ts
1874
+ * const p = redis.pipeline()
1875
+ * p.get("key")
1876
+ * const result = p.exec<[{ greeting: string }]>()
1877
+ * ```
1878
+ *
1879
+ * If one of the commands get an error, the whole pipeline fails. Alternatively, you can set the keepErrors option to true in order to get the errors individually.
1880
+ *
1881
+ * If keepErrors is set to true, a list of objects is returned where each object corresponds to a command and is of type: `{ result: unknown, error?: string }`.
1882
+ *
1883
+ * ```ts
1884
+ * const p = redis.pipeline()
1885
+ * p.get("key")
1886
+ *
1887
+ * const result = await p.exec({ keepErrors: true });
1888
+ * const getResult = result[0].result
1889
+ * const getError = result[0].error
1890
+ * ```
1891
+ */
1892
+ <TCommandResults extends unknown[] = [] extends TCommands ? unknown[] : InferResponseData<TCommands>>(): Promise<TCommandResults>;
1893
+ <TCommandResults extends unknown[] = [] extends TCommands ? unknown[] : InferResponseData<TCommands>>(options: {
1894
+ keepErrors: true;
1895
+ }): Promise<{
1896
+ [K in keyof TCommandResults]: UpstashResponse<TCommandResults[K]>;
1897
+ }>;
1898
+ }
1517
1899
  /**
1518
1900
  * Upstash REST API supports command pipelining to send multiple commands in
1519
1901
  * batch, instead of sending each command one by one and waiting for a response.
@@ -1562,19 +1944,7 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1562
1944
  commandOptions?: CommandOptions<any, any>;
1563
1945
  multiExec?: boolean;
1564
1946
  });
1565
- /**
1566
- * Send the pipeline request to upstash.
1567
- *
1568
- * Returns an array with the results of all pipelined commands.
1569
- *
1570
- * If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
1571
- * ```ts
1572
- * const p = redis.pipeline()
1573
- * p.get("key")
1574
- * const result = p.exec<[{ greeting: string }]>()
1575
- * ```
1576
- */
1577
- exec: <TCommandResults extends unknown[] = [] extends TCommands ? unknown[] : InferResponseData<TCommands>>() => Promise<TCommandResults>;
1947
+ exec: ExecMethod<TCommands>;
1578
1948
  /**
1579
1949
  * Returns the length of pipeline before the execution
1580
1950
  */
@@ -1592,6 +1962,23 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1592
1962
  * @see https://redis.io/commands/bitcount
1593
1963
  */
1594
1964
  bitcount: (key: string, start: number, end: number) => Pipeline<[...TCommands, Command<any, number>]>;
1965
+ /**
1966
+ * Returns an instance that can be used to execute `BITFIELD` commands on one key.
1967
+ *
1968
+ * @example
1969
+ * ```typescript
1970
+ * redis.set("mykey", 0);
1971
+ * const result = await redis.pipeline()
1972
+ * .bitfield("mykey")
1973
+ * .set("u4", 0, 16)
1974
+ * .incr("u4", "#1", 1)
1975
+ * .exec();
1976
+ * console.log(result); // [[0, 1]]
1977
+ * ```
1978
+ *
1979
+ * @see https://redis.io/commands/bitfield
1980
+ */
1981
+ bitfield: (key: string) => BitFieldCommand<Pipeline<[...TCommands, Command<any, number[]>]>>;
1595
1982
  /**
1596
1983
  * @see https://redis.io/commands/bitop
1597
1984
  */
@@ -1633,10 +2020,18 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1633
2020
  * @see https://redis.io/commands/echo
1634
2021
  */
1635
2022
  echo: (message: string) => Pipeline<[...TCommands, Command<any, string>]>;
2023
+ /**
2024
+ * @see https://redis.io/commands/eval_ro
2025
+ */
2026
+ evalRo: <TArgs extends unknown[], TData = unknown>(script: string, keys: string[], args: TArgs) => Pipeline<[...TCommands, Command<any, TData>]>;
1636
2027
  /**
1637
2028
  * @see https://redis.io/commands/eval
1638
2029
  */
1639
2030
  eval: <TArgs extends unknown[], TData = unknown>(script: string, keys: string[], args: TArgs) => Pipeline<[...TCommands, Command<any, TData>]>;
2031
+ /**
2032
+ * @see https://redis.io/commands/evalsha_ro
2033
+ */
2034
+ evalshaRo: <TArgs extends unknown[], TData = unknown>(sha1: string, keys: string[], args: TArgs) => Pipeline<[...TCommands, Command<any, TData>]>;
1640
2035
  /**
1641
2036
  * @see https://redis.io/commands/evalsha
1642
2037
  */
@@ -1648,11 +2043,11 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1648
2043
  /**
1649
2044
  * @see https://redis.io/commands/expire
1650
2045
  */
1651
- expire: (key: string, seconds: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2046
+ expire: (key: string, seconds: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
1652
2047
  /**
1653
2048
  * @see https://redis.io/commands/expireat
1654
2049
  */
1655
- expireat: (key: string, unix: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2050
+ expireat: (key: string, unix: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
1656
2051
  /**
1657
2052
  * @see https://redis.io/commands/flushall
1658
2053
  */
@@ -1661,36 +2056,202 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1661
2056
  * @see https://redis.io/commands/flushdb
1662
2057
  */
1663
2058
  flushdb: (opts?: {
1664
- async?: boolean | undefined;
2059
+ async?: boolean;
1665
2060
  } | undefined) => Pipeline<[...TCommands, Command<any, "OK">]>;
1666
2061
  /**
1667
- * @see https://redis.io/commands/get
2062
+ * @see https://redis.io/commands/geoadd
1668
2063
  */
1669
- get: <TData>(key: string) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2064
+ geoadd: <TData>(args_0: string, args_1: GeoAddCommandOptions | GeoMember<TData>, ...args_2: GeoMember<TData>[]) => Pipeline<[...TCommands, Command<any, number | null>]>;
1670
2065
  /**
1671
- * @see https://redis.io/commands/getbit
2066
+ * @see https://redis.io/commands/geodist
1672
2067
  */
1673
- getbit: (key: string, offset: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2068
+ geodist: <TData>(key: string, member1: TData, member2: TData, unit?: "M" | "KM" | "FT" | "MI" | undefined) => Pipeline<[...TCommands, Command<any, number | null>]>;
1674
2069
  /**
1675
- * @see https://redis.io/commands/getdel
2070
+ * @see https://redis.io/commands/geopos
1676
2071
  */
1677
- getdel: <TData>(key: string) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2072
+ geopos: <TData>(args_0: string, ...args_1: TData[]) => Pipeline<[...TCommands, Command<any, {
2073
+ lng: number;
2074
+ lat: number;
2075
+ }[]>]>;
1678
2076
  /**
1679
- * @see https://redis.io/commands/getrange
2077
+ * @see https://redis.io/commands/geohash
1680
2078
  */
1681
- getrange: (key: string, start: number, end: number) => Pipeline<[...TCommands, Command<any, string>]>;
2079
+ geohash: <TData>(args_0: string, ...args_1: TData[]) => Pipeline<[...TCommands, Command<any, (string | null)[]>]>;
1682
2080
  /**
1683
- * @see https://redis.io/commands/getset
2081
+ * @see https://redis.io/commands/geosearch
1684
2082
  */
1685
- getset: <TData>(key: string, value: TData) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2083
+ geosearch: <TData>(key: string, centerPoint: {
2084
+ type: "FROMLONLAT" | "fromlonlat";
2085
+ coordinate: {
2086
+ lon: number;
2087
+ lat: number;
2088
+ };
2089
+ } | {
2090
+ type: "FROMMEMBER" | "frommember";
2091
+ member: TData;
2092
+ }, shape: {
2093
+ type: "BYRADIUS" | "byradius";
2094
+ radius: number;
2095
+ radiusType: "M" | "KM" | "FT" | "MI";
2096
+ } | {
2097
+ type: "BYBOX" | "bybox";
2098
+ rect: {
2099
+ width: number;
2100
+ height: number;
2101
+ };
2102
+ rectType: "M" | "KM" | "FT" | "MI";
2103
+ }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2104
+ count?: {
2105
+ limit: number;
2106
+ any?: boolean;
2107
+ };
2108
+ withCoord?: boolean;
2109
+ withDist?: boolean;
2110
+ withHash?: boolean;
2111
+ } | undefined) => Pipeline<[...TCommands, Command<any, ({
2112
+ member: TData;
2113
+ } & {
2114
+ coord?: {
2115
+ long: number;
2116
+ lat: number;
2117
+ } | undefined;
2118
+ dist?: number | undefined;
2119
+ hash?: string | undefined;
2120
+ })[]>]>;
1686
2121
  /**
1687
- * @see https://redis.io/commands/hdel
2122
+ * @see https://redis.io/commands/geosearchstore
2123
+ */
2124
+ geosearchstore: <TData>(destination: string, key: string, centerPoint: {
2125
+ type: "FROMLONLAT" | "fromlonlat";
2126
+ coordinate: {
2127
+ lon: number;
2128
+ lat: number;
2129
+ };
2130
+ } | {
2131
+ type: "FROMMEMBER" | "frommember";
2132
+ member: TData;
2133
+ }, shape: {
2134
+ type: "BYRADIUS" | "byradius";
2135
+ radius: number;
2136
+ radiusType: "M" | "KM" | "FT" | "MI";
2137
+ } | {
2138
+ type: "BYBOX" | "bybox";
2139
+ rect: {
2140
+ width: number;
2141
+ height: number;
2142
+ };
2143
+ rectType: "M" | "KM" | "FT" | "MI";
2144
+ }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2145
+ count?: {
2146
+ limit: number;
2147
+ any?: boolean;
2148
+ };
2149
+ storeDist?: boolean;
2150
+ } | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
2151
+ /**
2152
+ * @see https://redis.io/commands/get
2153
+ */
2154
+ get: <TData>(key: string) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2155
+ /**
2156
+ * @see https://redis.io/commands/getbit
2157
+ */
2158
+ getbit: (key: string, offset: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2159
+ /**
2160
+ * @see https://redis.io/commands/getdel
2161
+ */
2162
+ getdel: <TData>(key: string) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2163
+ /**
2164
+ * @see https://redis.io/commands/getex
2165
+ */
2166
+ getex: <TData>(key: string, opts?: ({
2167
+ ex: number;
2168
+ px?: never;
2169
+ exat?: never;
2170
+ pxat?: never;
2171
+ persist?: never;
2172
+ } | {
2173
+ ex?: never;
2174
+ px: number;
2175
+ exat?: never;
2176
+ pxat?: never;
2177
+ persist?: never;
2178
+ } | {
2179
+ ex?: never;
2180
+ px?: never;
2181
+ exat: number;
2182
+ pxat?: never;
2183
+ persist?: never;
2184
+ } | {
2185
+ ex?: never;
2186
+ px?: never;
2187
+ exat?: never;
2188
+ pxat: number;
2189
+ persist?: never;
2190
+ } | {
2191
+ ex?: never;
2192
+ px?: never;
2193
+ exat?: never;
2194
+ pxat?: never;
2195
+ persist: true;
2196
+ } | {
2197
+ ex?: never;
2198
+ px?: never;
2199
+ exat?: never;
2200
+ pxat?: never;
2201
+ persist?: never;
2202
+ }) | undefined) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2203
+ /**
2204
+ * @see https://redis.io/commands/getrange
2205
+ */
2206
+ getrange: (key: string, start: number, end: number) => Pipeline<[...TCommands, Command<any, string>]>;
2207
+ /**
2208
+ * @see https://redis.io/commands/getset
2209
+ */
2210
+ getset: <TData>(key: string, value: TData) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2211
+ /**
2212
+ * @see https://redis.io/commands/hdel
1688
2213
  */
1689
2214
  hdel: (key: string, ...fields: string[]) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
1690
2215
  /**
1691
2216
  * @see https://redis.io/commands/hexists
1692
2217
  */
1693
2218
  hexists: (key: string, field: string) => Pipeline<[...TCommands, Command<any, number>]>;
2219
+ /**
2220
+ * @see https://redis.io/commands/hexpire
2221
+ */
2222
+ hexpire: (key: string, fields: string | number | (string | number)[], seconds: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, (0 | 1 | 2 | -2)[]>]>;
2223
+ /**
2224
+ * @see https://redis.io/commands/hexpireat
2225
+ */
2226
+ hexpireat: (key: string, fields: string | number | (string | number)[], timestamp: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, (0 | 1 | 2 | -2)[]>]>;
2227
+ /**
2228
+ * @see https://redis.io/commands/hexpiretime
2229
+ */
2230
+ hexpiretime: (key: string, fields: string | number | (string | number)[]) => Pipeline<[...TCommands, Command<any, number[]>]>;
2231
+ /**
2232
+ * @see https://redis.io/commands/httl
2233
+ */
2234
+ httl: (key: string, fields: string | number | (string | number)[]) => Pipeline<[...TCommands, Command<any, number[]>]>;
2235
+ /**
2236
+ * @see https://redis.io/commands/hpexpire
2237
+ */
2238
+ hpexpire: (key: string, fields: string | number | (string | number)[], milliseconds: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, (0 | 1 | 2 | -2)[]>]>;
2239
+ /**
2240
+ * @see https://redis.io/commands/hpexpireat
2241
+ */
2242
+ hpexpireat: (key: string, fields: string | number | (string | number)[], timestamp: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, (0 | 1 | 2 | -2)[]>]>;
2243
+ /**
2244
+ * @see https://redis.io/commands/hpexpiretime
2245
+ */
2246
+ hpexpiretime: (key: string, fields: string | number | (string | number)[]) => Pipeline<[...TCommands, Command<any, number[]>]>;
2247
+ /**
2248
+ * @see https://redis.io/commands/hpttl
2249
+ */
2250
+ hpttl: (key: string, fields: string | number | (string | number)[]) => Pipeline<[...TCommands, Command<any, number[]>]>;
2251
+ /**
2252
+ * @see https://redis.io/commands/hpersist
2253
+ */
2254
+ hpersist: (key: string, fields: string | number | (string | number)[]) => Pipeline<[...TCommands, Command<any, (1 | -2 | -1)[]>]>;
1694
2255
  /**
1695
2256
  * @see https://redis.io/commands/hget
1696
2257
  */
@@ -1722,9 +2283,7 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1722
2283
  /**
1723
2284
  * @see https://redis.io/commands/hmset
1724
2285
  */
1725
- hmset: <TData>(key: string, kv: {
1726
- [field: string]: TData;
1727
- }) => Pipeline<[...TCommands, Command<any, "OK">]>;
2286
+ hmset: <TData>(key: string, kv: Record<string, TData>) => Pipeline<[...TCommands, Command<any, "OK">]>;
1728
2287
  /**
1729
2288
  * @see https://redis.io/commands/hrandfield
1730
2289
  */
@@ -1732,13 +2291,11 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1732
2291
  /**
1733
2292
  * @see https://redis.io/commands/hscan
1734
2293
  */
1735
- hscan: (key: string, cursor: number, cmdOpts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [number, (string | number)[]]>]>;
2294
+ hscan: (key: string, cursor: string | number, cmdOpts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [string, (string | number)[]]>]>;
1736
2295
  /**
1737
2296
  * @see https://redis.io/commands/hset
1738
2297
  */
1739
- hset: <TData>(key: string, kv: {
1740
- [field: string]: TData;
1741
- }) => Pipeline<[...TCommands, Command<any, number>]>;
2298
+ hset: <TData>(key: string, kv: Record<string, TData>) => Pipeline<[...TCommands, Command<any, number>]>;
1742
2299
  /**
1743
2300
  * @see https://redis.io/commands/hsetnx
1744
2301
  */
@@ -1787,13 +2344,17 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1787
2344
  * @see https://redis.io/commands/lpop
1788
2345
  */
1789
2346
  lpop: <TData>(key: string, count?: number | undefined) => Pipeline<[...TCommands, Command<any, TData | null>]>;
2347
+ /**
2348
+ * @see https://redis.io/commands/lmpop
2349
+ */
2350
+ lmpop: <TData>(numkeys: number, keys: string[], args_2: "LEFT" | "RIGHT", count?: number | undefined) => Pipeline<[...TCommands, Command<any, [string, TData[]] | null>]>;
1790
2351
  /**
1791
2352
  * @see https://redis.io/commands/lpos
1792
2353
  */
1793
2354
  lpos: <TData>(key: string, element: unknown, opts?: {
1794
- rank?: number | undefined;
1795
- count?: number | undefined;
1796
- maxLen?: number | undefined;
2355
+ rank?: number;
2356
+ count?: number;
2357
+ maxLen?: number;
1797
2358
  } | undefined) => Pipeline<[...TCommands, Command<any, TData>]>;
1798
2359
  /**
1799
2360
  * @see https://redis.io/commands/lpush
@@ -1826,15 +2387,11 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1826
2387
  /**
1827
2388
  * @see https://redis.io/commands/mset
1828
2389
  */
1829
- mset: <TData>(kv: {
1830
- [key: string]: TData;
1831
- }) => Pipeline<[...TCommands, Command<any, "OK">]>;
2390
+ mset: <TData>(kv: Record<string, TData>) => Pipeline<[...TCommands, Command<any, "OK">]>;
1832
2391
  /**
1833
2392
  * @see https://redis.io/commands/msetnx
1834
2393
  */
1835
- msetnx: <TData>(kv: {
1836
- [key: string]: TData;
1837
- }) => Pipeline<[...TCommands, Command<any, number>]>;
2394
+ msetnx: <TData>(kv: Record<string, TData>) => Pipeline<[...TCommands, Command<any, number>]>;
1838
2395
  /**
1839
2396
  * @see https://redis.io/commands/persist
1840
2397
  */
@@ -1842,11 +2399,23 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1842
2399
  /**
1843
2400
  * @see https://redis.io/commands/pexpire
1844
2401
  */
1845
- pexpire: (key: string, milliseconds: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2402
+ pexpire: (key: string, milliseconds: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
1846
2403
  /**
1847
2404
  * @see https://redis.io/commands/pexpireat
1848
2405
  */
1849
- pexpireat: (key: string, unix: number) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2406
+ pexpireat: (key: string, unix: number, option?: ExpireOption | undefined) => Pipeline<[...TCommands, Command<any, 0 | 1>]>;
2407
+ /**
2408
+ * @see https://redis.io/commands/pfadd
2409
+ */
2410
+ pfadd: (args_0: string, ...args_1: unknown[]) => Pipeline<[...TCommands, Command<any, number>]>;
2411
+ /**
2412
+ * @see https://redis.io/commands/pfcount
2413
+ */
2414
+ pfcount: (args_0: string, ...args_1: string[]) => Pipeline<[...TCommands, Command<any, number>]>;
2415
+ /**
2416
+ * @see https://redis.io/commands/pfmerge
2417
+ */
2418
+ pfmerge: (destination_key: string, ...args_1: string[]) => Pipeline<[...TCommands, Command<any, "OK">]>;
1850
2419
  /**
1851
2420
  * @see https://redis.io/commands/ping
1852
2421
  */
@@ -1890,11 +2459,11 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1890
2459
  /**
1891
2460
  * @see https://redis.io/commands/sadd
1892
2461
  */
1893
- sadd: <TData>(key: string, ...members: TData[]) => Pipeline<[...TCommands, Command<any, number>]>;
2462
+ sadd: <TData>(key: string, member: TData, ...members: TData[]) => Pipeline<[...TCommands, Command<any, number>]>;
1894
2463
  /**
1895
2464
  * @see https://redis.io/commands/scan
1896
2465
  */
1897
- scan: (cursor: number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [number, string[]]>]>;
2466
+ scan: (cursor: string | number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, any>]>;
1898
2467
  /**
1899
2468
  * @see https://redis.io/commands/scard
1900
2469
  */
@@ -1975,7 +2544,7 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
1975
2544
  /**
1976
2545
  * @see https://redis.io/commands/sscan
1977
2546
  */
1978
- sscan: (key: string, cursor: number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [number, (string | number)[]]>]>;
2547
+ sscan: (key: string, cursor: string | number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [string, (string | number)[]]>]>;
1979
2548
  /**
1980
2549
  * @see https://redis.io/commands/strlen
1981
2550
  */
@@ -2011,7 +2580,127 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2011
2580
  /**
2012
2581
  * @see https://redis.io/commands/zadd
2013
2582
  */
2014
- zadd: <TData>(...args: [key: string, scoreMember: ScoreMember<TData>, ...scoreMemberPairs: ScoreMember<TData>[]] | [key: string, opts: ZAddCommandOptions | ZAddCommandOptionsWithIncr, ScoreMember<TData>, ...ScoreMember<TData>[]]) => Pipeline<[...TCommands, Command<any, number | null>]>;
2583
+ zadd: <TData>(...args: [key: string, scoreMember: ScoreMember<TData>, ...scoreMemberPairs: ScoreMember<TData>[]] | [key: string, opts: ZAddCommandOptions, ...scoreMemberPairs: [ScoreMember<TData>, ...ScoreMember<TData>[]]]) => Pipeline<[...TCommands, Command<any, number | null>]>;
2584
+ /**
2585
+ * @see https://redis.io/commands/xadd
2586
+ */
2587
+ xadd: (key: string, id: string, entries: Record<string, unknown>, opts?: {
2588
+ nomkStream?: boolean;
2589
+ trim?: ({
2590
+ type: "MAXLEN" | "maxlen";
2591
+ threshold: number;
2592
+ } | {
2593
+ type: "MINID" | "minid";
2594
+ threshold: string;
2595
+ }) & ({
2596
+ comparison: "~";
2597
+ limit?: number;
2598
+ } | {
2599
+ comparison: "=";
2600
+ limit?: never;
2601
+ });
2602
+ } | undefined) => Pipeline<[...TCommands, Command<any, string>]>;
2603
+ /**
2604
+ * @see https://redis.io/commands/xack
2605
+ */
2606
+ xack: (key: string, group: string, id: string | string[]) => Pipeline<[...TCommands, Command<any, number>]>;
2607
+ /**
2608
+ * @see https://redis.io/commands/xdel
2609
+ */
2610
+ xdel: (key: string, ids: string | string[]) => Pipeline<[...TCommands, Command<any, number>]>;
2611
+ /**
2612
+ * @see https://redis.io/commands/xgroup
2613
+ */
2614
+ xgroup: (key: string, opts: {
2615
+ type: "CREATE";
2616
+ group: string;
2617
+ id: `$` | string;
2618
+ options?: {
2619
+ MKSTREAM?: boolean;
2620
+ ENTRIESREAD?: number;
2621
+ };
2622
+ } | {
2623
+ type: "CREATECONSUMER";
2624
+ group: string;
2625
+ consumer: string;
2626
+ } | {
2627
+ type: "DELCONSUMER";
2628
+ group: string;
2629
+ consumer: string;
2630
+ } | {
2631
+ type: "DESTROY";
2632
+ group: string;
2633
+ } | {
2634
+ type: "SETID";
2635
+ group: string;
2636
+ id: `$` | string;
2637
+ options?: {
2638
+ ENTRIESREAD?: number;
2639
+ };
2640
+ }) => Pipeline<[...TCommands, Command<any, never>]>;
2641
+ /**
2642
+ * @see https://redis.io/commands/xread
2643
+ */
2644
+ xread: (...args: CommandArgs<typeof XReadCommand>) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2645
+ /**
2646
+ * @see https://redis.io/commands/xreadgroup
2647
+ */
2648
+ xreadgroup: (...args: CommandArgs<typeof XReadGroupCommand>) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2649
+ /**
2650
+ * @see https://redis.io/commands/xinfo
2651
+ */
2652
+ xinfo: (key: string, options: {
2653
+ type: "CONSUMERS";
2654
+ group: string;
2655
+ } | {
2656
+ type: "GROUPS";
2657
+ }) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2658
+ /**
2659
+ * @see https://redis.io/commands/xlen
2660
+ */
2661
+ xlen: (key: string) => Pipeline<[...TCommands, Command<any, number>]>;
2662
+ /**
2663
+ * @see https://redis.io/commands/xpending
2664
+ */
2665
+ xpending: (key: string, group: string, start: string, end: string, count: number, options?: {
2666
+ idleTime?: number;
2667
+ consumer?: string | string[];
2668
+ } | undefined) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2669
+ /**
2670
+ * @see https://redis.io/commands/xclaim
2671
+ */
2672
+ xclaim: (key: string, group: string, consumer: string, minIdleTime: number, id: string | string[], options?: {
2673
+ idleMS?: number;
2674
+ timeMS?: number;
2675
+ retryCount?: number;
2676
+ force?: boolean;
2677
+ justId?: boolean;
2678
+ lastId?: number;
2679
+ } | undefined) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2680
+ /**
2681
+ * @see https://redis.io/commands/xautoclaim
2682
+ */
2683
+ xautoclaim: (key: string, group: string, consumer: string, minIdleTime: number, start: string, options?: {
2684
+ count?: number;
2685
+ justId?: boolean;
2686
+ } | undefined) => Pipeline<[...TCommands, Command<any, unknown[]>]>;
2687
+ /**
2688
+ * @see https://redis.io/commands/xtrim
2689
+ */
2690
+ xtrim: (key: string, options: {
2691
+ strategy: "MAXLEN" | "MINID";
2692
+ exactness?: "~" | "=";
2693
+ threshold: number | string;
2694
+ limit?: number;
2695
+ }) => Pipeline<[...TCommands, Command<any, number>]>;
2696
+ /**
2697
+ * @see https://redis.io/commands/xrange
2698
+ */
2699
+ xrange: (key: string, start: string, end: string, count?: number | undefined) => Pipeline<[...TCommands, Command<any, Record<string, Record<string, unknown>>>]>;
2700
+ /**
2701
+ * @see https://redis.io/commands/xrevrange
2702
+ */
2703
+ xrevrange: (key: string, end: string, start: string, count?: number | undefined) => Pipeline<[...TCommands, Command<any, Record<string, Record<string, unknown>>>]>;
2015
2704
  /**
2016
2705
  * @see https://redis.io/commands/zcard
2017
2706
  */
@@ -2047,21 +2736,11 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2047
2736
  /**
2048
2737
  * @see https://redis.io/commands/zrange
2049
2738
  */
2050
- zrange: <TData extends unknown[]>(...args: [key: string, min: number, max: number, opts?: ZRangeCommandOptions] | [
2051
- key: string,
2052
- min: `(${string}` | `[${string}` | "-" | "+",
2053
- max: `(${string}` | `[${string}` | "-" | "+",
2054
- opts: {
2055
- byLex: true;
2056
- } & ZRangeCommandOptions
2057
- ] | [
2058
- key: string,
2059
- min: number | `(${number}` | "-inf" | "+inf",
2060
- max: number | `(${number}` | "-inf" | "+inf",
2061
- opts: {
2062
- byScore: true;
2063
- } & ZRangeCommandOptions
2064
- ]) => Pipeline<[...TCommands, Command<any, TData>]>;
2739
+ zrange: <TData extends unknown[]>(...args: [key: string, min: number, max: number, opts?: ZRangeCommandOptions] | [key: string, min: `(${string}` | `[${string}` | "-" | "+", max: `(${string}` | `[${string}` | "-" | "+", opts: {
2740
+ byLex: true;
2741
+ } & ZRangeCommandOptions] | [key: string, min: number | `(${number}` | "-inf" | "+inf", max: number | `(${number}` | "-inf" | "+inf", opts: {
2742
+ byScore: true;
2743
+ } & ZRangeCommandOptions]) => Pipeline<[...TCommands, Command<any, TData>]>;
2065
2744
  /**
2066
2745
  * @see https://redis.io/commands/zrank
2067
2746
  */
@@ -2089,7 +2768,7 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2089
2768
  /**
2090
2769
  * @see https://redis.io/commands/zscan
2091
2770
  */
2092
- zscan: (key: string, cursor: number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [number, (string | number)[]]>]>;
2771
+ zscan: (key: string, cursor: string | number, opts?: ScanCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, [string, (string | number)[]]>]>;
2093
2772
  /**
2094
2773
  * @see https://redis.io/commands/zscore
2095
2774
  */
@@ -2142,104 +2821,22 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2142
2821
  * @see https://redis.io/commands/json.forget
2143
2822
  */
2144
2823
  forget: (key: string, path?: string | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
2145
- /**
2146
- * @see https://redis.io/commands/geoadd
2147
- */
2148
- geoadd: (args_0: string, args_1: GeoAddCommandOptions | GeoMember<unknown>, ...args_2: GeoMember<unknown>[]) => Pipeline<[...TCommands, Command<any, number | null>]>;
2149
- /**
2150
- * @see https://redis.io/commands/geodist
2151
- */
2152
- geodist: (key: string, member1: unknown, member2: unknown, unit?: "M" | "KM" | "FT" | "MI" | undefined) => Pipeline<[...TCommands, Command<any, number | null>]>;
2153
- /**
2154
- * @see https://redis.io/commands/geopos
2155
- */
2156
- geopos: (args_0: string, ...args_1: unknown[]) => Pipeline<[...TCommands, Command<any, {
2157
- lng: number;
2158
- lat: number;
2159
- }[]>]>;
2160
- /**
2161
- * @see https://redis.io/commands/geohash
2162
- */
2163
- geohash: (args_0: string, ...args_1: unknown[]) => Pipeline<[...TCommands, Command<any, (string | null)[]>]>;
2164
- /**
2165
- * @see https://redis.io/commands/geosearch
2166
- */
2167
- geosearch: (key: string, centerPoint: {
2168
- type: "FROMLONLAT" | "fromlonlat";
2169
- coordinate: {
2170
- lon: number;
2171
- lat: number;
2172
- };
2173
- } | {
2174
- type: "FROMMEMBER" | "frommember";
2175
- member: unknown;
2176
- }, shape: {
2177
- type: "BYRADIUS" | "byradius";
2178
- radius: number;
2179
- radiusType: "M" | "KM" | "FT" | "MI";
2180
- } | {
2181
- type: "BYBOX" | "bybox";
2182
- rect: {
2183
- width: number;
2184
- height: number;
2185
- };
2186
- rectType: "M" | "KM" | "FT" | "MI";
2187
- }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2188
- count?: {
2189
- limit: number;
2190
- any?: boolean | undefined;
2191
- } | undefined;
2192
- withCoord?: boolean | undefined;
2193
- withDist?: boolean | undefined;
2194
- withHash?: boolean | undefined;
2195
- } | undefined) => Pipeline<[...TCommands, Command<any, ({
2196
- member: unknown;
2197
- } & {
2198
- coord?: {
2199
- long: number;
2200
- lat: number;
2201
- } | undefined;
2202
- dist?: number | undefined;
2203
- hash?: string | undefined;
2204
- })[]>]>;
2205
- /**
2206
- * @see https://redis.io/commands/geosearchstore
2207
- */
2208
- geosearchstore: (destination: string, key: string, centerPoint: {
2209
- type: "FROMLONLAT" | "fromlonlat";
2210
- coordinate: {
2211
- lon: number;
2212
- lat: number;
2213
- };
2214
- } | {
2215
- type: "FROMMEMBER" | "frommember";
2216
- member: unknown;
2217
- }, shape: {
2218
- type: "BYRADIUS" | "byradius";
2219
- radius: number;
2220
- radiusType: "M" | "KM" | "FT" | "MI";
2221
- } | {
2222
- type: "BYBOX" | "bybox";
2223
- rect: {
2224
- width: number;
2225
- height: number;
2226
- };
2227
- rectType: "M" | "KM" | "FT" | "MI";
2228
- }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2229
- count?: {
2230
- limit: number;
2231
- any?: boolean | undefined;
2232
- } | undefined;
2233
- storeDist?: boolean | undefined;
2234
- } | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
2235
2824
  /**
2236
2825
  * @see https://redis.io/commands/json.get
2237
2826
  */
2238
2827
  get: (...args: CommandArgs<typeof JsonGetCommand>) => Pipeline<[...TCommands, Command<any, any>]>;
2828
+ /**
2829
+ * @see https://redis.io/commands/json.merge
2830
+ */
2831
+ merge: (key: string, path: string, value: string | number | unknown[] | Record<string, unknown>) => Pipeline<[...TCommands, Command<any, "OK" | null>]>;
2239
2832
  /**
2240
2833
  * @see https://redis.io/commands/json.mget
2241
2834
  */
2242
2835
  mget: (keys: string[], path: string) => Pipeline<[...TCommands, Command<any, any>]>;
2836
+ /**
2837
+ * @see https://redis.io/commands/json.mset
2838
+ */
2839
+ mset: (...args: CommandArgs<typeof JsonMSetCommand>) => Pipeline<[...TCommands, Command<any, "OK" | null>]>;
2243
2840
  /**
2244
2841
  * @see https://redis.io/commands/json.numincrby
2245
2842
  */
@@ -2265,9 +2862,9 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2265
2862
  */
2266
2863
  set: (key: string, path: string, value: string | number | boolean | Record<string, unknown> | (string | number | boolean | Record<string, unknown>)[], opts?: {
2267
2864
  nx: true;
2268
- xx?: undefined;
2865
+ xx?: never;
2269
2866
  } | {
2270
- nx?: undefined;
2867
+ nx?: never;
2271
2868
  xx: true;
2272
2869
  } | undefined) => Pipeline<[...TCommands, Command<any, "OK" | null>]>;
2273
2870
  /**
@@ -2307,9 +2904,20 @@ declare class Pipeline<TCommands extends Command<any, any>[] = []> {
2307
2904
  */
2308
2905
  declare class Script<TResult = unknown> {
2309
2906
  readonly script: string;
2310
- readonly sha1: string;
2907
+ /**
2908
+ * @deprecated This property is initialized to an empty string and will be set in the init method
2909
+ * asynchronously. Do not use this property immidiately after the constructor.
2910
+ *
2911
+ * This property is only exposed for backwards compatibility and will be removed in the
2912
+ * future major release.
2913
+ */
2914
+ sha1: string;
2311
2915
  private readonly redis;
2312
2916
  constructor(redis: Redis, script: string);
2917
+ /**
2918
+ * Initialize the script by computing its SHA-1 hash.
2919
+ */
2920
+ private init;
2313
2921
  /**
2314
2922
  * Send an `EVAL` command to redis.
2315
2923
  */
@@ -2331,6 +2939,56 @@ declare class Script<TResult = unknown> {
2331
2939
  private digest;
2332
2940
  }
2333
2941
 
2942
+ /**
2943
+ * Creates a new script.
2944
+ *
2945
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
2946
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
2947
+ * the entire script. Afterwards, the script is cached on the server.
2948
+ *
2949
+ * @example
2950
+ * ```ts
2951
+ * const redis = new Redis({...})
2952
+ *
2953
+ * const script = redis.createScript<string>("return ARGV[1];", { readOnly: true })
2954
+ * const arg1 = await script.evalRo([], ["Hello World"])
2955
+ * expect(arg1, "Hello World")
2956
+ * ```
2957
+ */
2958
+ declare class ScriptRO<TResult = unknown> {
2959
+ readonly script: string;
2960
+ /**
2961
+ * @deprecated This property is initialized to an empty string and will be set in the init method
2962
+ * asynchronously. Do not use this property immidiately after the constructor.
2963
+ *
2964
+ * This property is only exposed for backwards compatibility and will be removed in the
2965
+ * future major release.
2966
+ */
2967
+ sha1: string;
2968
+ private readonly redis;
2969
+ constructor(redis: Redis, script: string);
2970
+ private init;
2971
+ /**
2972
+ * Send an `EVAL_RO` command to redis.
2973
+ */
2974
+ evalRo(keys: string[], args: string[]): Promise<TResult>;
2975
+ /**
2976
+ * Calculates the sha1 hash of the script and then calls `EVALSHA_RO`.
2977
+ */
2978
+ evalshaRo(keys: string[], args: string[]): Promise<TResult>;
2979
+ /**
2980
+ * Optimistically try to run `EVALSHA_RO` first.
2981
+ * If the script is not loaded in redis, it will fall back and try again with `EVAL_RO`.
2982
+ *
2983
+ * Following calls will be able to use the cached script
2984
+ */
2985
+ exec(keys: string[], args: string[]): Promise<TResult>;
2986
+ /**
2987
+ * Compute the sha1 hash of the script and return its hex representation.
2988
+ */
2989
+ private digest;
2990
+ }
2991
+
2334
2992
  /**
2335
2993
  * Serverless redis client for upstash.
2336
2994
  */
@@ -2338,6 +2996,7 @@ declare class Redis {
2338
2996
  protected client: Requester;
2339
2997
  protected opts?: CommandOptions<any, any>;
2340
2998
  protected enableTelemetry: boolean;
2999
+ protected enableAutoPipelining: boolean;
2341
3000
  /**
2342
3001
  * Create a new redis client
2343
3002
  *
@@ -2350,6 +3009,8 @@ declare class Redis {
2350
3009
  * ```
2351
3010
  */
2352
3011
  constructor(client: Requester, opts?: RedisOptions);
3012
+ get readYourWritesSyncToken(): string | undefined;
3013
+ set readYourWritesSyncToken(session: string | undefined);
2353
3014
  get json(): {
2354
3015
  /**
2355
3016
  * @see https://redis.io/commands/json.arrappend
@@ -2388,103 +3049,21 @@ declare class Redis {
2388
3049
  */
2389
3050
  forget: (key: string, path?: string | undefined) => Promise<number>;
2390
3051
  /**
2391
- * @see https://redis.io/commands/geoadd
2392
- */
2393
- geoadd: (args_0: string, args_1: GeoAddCommandOptions | GeoMember<unknown>, ...args_2: GeoMember<unknown>[]) => Promise<number | null>;
2394
- /**
2395
- * @see https://redis.io/commands/geopos
2396
- */
2397
- geopos: (args_0: string, ...args_1: unknown[]) => Promise<{
2398
- lng: number;
2399
- lat: number;
2400
- }[]>;
2401
- /**
2402
- * @see https://redis.io/commands/geodist
2403
- */
2404
- geodist: (key: string, member1: unknown, member2: unknown, unit?: "M" | "KM" | "FT" | "MI" | undefined) => Promise<number | null>;
2405
- /**
2406
- * @see https://redis.io/commands/geohash
2407
- */
2408
- geohash: (args_0: string, ...args_1: unknown[]) => Promise<(string | null)[]>;
2409
- /**
2410
- * @see https://redis.io/commands/geosearch
3052
+ * @see https://redis.io/commands/json.get
2411
3053
  */
2412
- geosearch: (key: string, centerPoint: {
2413
- type: "FROMLONLAT" | "fromlonlat";
2414
- coordinate: {
2415
- lon: number;
2416
- lat: number;
2417
- };
2418
- } | {
2419
- type: "FROMMEMBER" | "frommember";
2420
- member: unknown;
2421
- }, shape: {
2422
- type: "BYRADIUS" | "byradius";
2423
- radius: number;
2424
- radiusType: "M" | "KM" | "FT" | "MI";
2425
- } | {
2426
- type: "BYBOX" | "bybox";
2427
- rect: {
2428
- width: number;
2429
- height: number;
2430
- };
2431
- rectType: "M" | "KM" | "FT" | "MI";
2432
- }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2433
- count?: {
2434
- limit: number;
2435
- any?: boolean | undefined;
2436
- } | undefined;
2437
- withCoord?: boolean | undefined;
2438
- withDist?: boolean | undefined;
2439
- withHash?: boolean | undefined;
2440
- } | undefined) => Promise<({
2441
- member: unknown;
2442
- } & {
2443
- coord?: {
2444
- long: number;
2445
- lat: number;
2446
- } | undefined;
2447
- dist?: number | undefined;
2448
- hash?: string | undefined;
2449
- })[]>;
3054
+ get: <TData>(...args: CommandArgs<typeof JsonGetCommand>) => Promise<TData | null>;
2450
3055
  /**
2451
- * @see https://redis.io/commands/geosearchstore
3056
+ * @see https://redis.io/commands/json.merge
2452
3057
  */
2453
- geosearchstore: (destination: string, key: string, centerPoint: {
2454
- type: "FROMLONLAT" | "fromlonlat";
2455
- coordinate: {
2456
- lon: number;
2457
- lat: number;
2458
- };
2459
- } | {
2460
- type: "FROMMEMBER" | "frommember";
2461
- member: unknown;
2462
- }, shape: {
2463
- type: "BYRADIUS" | "byradius";
2464
- radius: number;
2465
- radiusType: "M" | "KM" | "FT" | "MI";
2466
- } | {
2467
- type: "BYBOX" | "bybox";
2468
- rect: {
2469
- width: number;
2470
- height: number;
2471
- };
2472
- rectType: "M" | "KM" | "FT" | "MI";
2473
- }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
2474
- count?: {
2475
- limit: number;
2476
- any?: boolean | undefined;
2477
- } | undefined;
2478
- storeDist?: boolean | undefined;
2479
- } | undefined) => Promise<number>;
3058
+ merge: (key: string, path: string, value: string | number | unknown[] | Record<string, unknown>) => Promise<"OK" | null>;
2480
3059
  /**
2481
- * @see https://redis.io/commands/json.get
3060
+ * @see https://redis.io/commands/json.mget
2482
3061
  */
2483
- get: (...args: CommandArgs<typeof JsonGetCommand>) => Promise<any>;
3062
+ mget: <TData>(keys: string[], path: string) => Promise<TData>;
2484
3063
  /**
2485
- * @see https://redis.io/commands/json.mget
3064
+ * @see https://redis.io/commands/json.mset
2486
3065
  */
2487
- mget: (keys: string[], path: string) => Promise<any>;
3066
+ mset: (...args: CommandArgs<typeof JsonMSetCommand>) => Promise<"OK" | null>;
2488
3067
  /**
2489
3068
  * @see https://redis.io/commands/json.numincrby
2490
3069
  */
@@ -2510,9 +3089,9 @@ declare class Redis {
2510
3089
  */
2511
3090
  set: (key: string, path: string, value: string | number | boolean | Record<string, unknown> | (string | number | boolean | Record<string, unknown>)[], opts?: {
2512
3091
  nx: true;
2513
- xx?: undefined;
3092
+ xx?: never;
2514
3093
  } | {
2515
- nx?: undefined;
3094
+ nx?: never;
2516
3095
  xx: true;
2517
3096
  } | undefined) => Promise<"OK" | null>;
2518
3097
  /**
@@ -2540,13 +3119,44 @@ declare class Redis {
2540
3119
  * Technically this is not private, we can hide it from intellisense by doing this
2541
3120
  */
2542
3121
  protected addTelemetry: (telemetry: Telemetry) => void;
2543
- createScript(script: string): Script;
3122
+ /**
3123
+ * Creates a new script.
3124
+ *
3125
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
3126
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
3127
+ * the entire script. Afterwards, the script is cached on the server.
3128
+ *
3129
+ * @param script - The script to create
3130
+ * @param opts - Optional options to pass to the script `{ readonly?: boolean }`
3131
+ * @returns A new script
3132
+ *
3133
+ * @example
3134
+ * ```ts
3135
+ * const redis = new Redis({...})
3136
+ *
3137
+ * const script = redis.createScript<string>("return ARGV[1];")
3138
+ * const arg1 = await script.eval([], ["Hello World"])
3139
+ * expect(arg1, "Hello World")
3140
+ * ```
3141
+ * @example
3142
+ * ```ts
3143
+ * const redis = new Redis({...})
3144
+ *
3145
+ * const script = redis.createScript<string>("return ARGV[1];", { readonly: true })
3146
+ * const arg1 = await script.evalRo([], ["Hello World"])
3147
+ * expect(arg1, "Hello World")
3148
+ * ```
3149
+ */
3150
+ createScript<TResult = unknown, TReadonly extends boolean = false>(script: string, opts?: {
3151
+ readonly?: TReadonly;
3152
+ }): TReadonly extends true ? ScriptRO<TResult> : Script<TResult>;
2544
3153
  /**
2545
3154
  * Create a new pipeline that allows you to send requests in bulk.
2546
3155
  *
2547
3156
  * @see {@link Pipeline}
2548
3157
  */
2549
3158
  pipeline: () => Pipeline<[]>;
3159
+ protected autoPipeline: () => Redis;
2550
3160
  /**
2551
3161
  * Create a new transaction to allow executing multiple steps atomically.
2552
3162
  *
@@ -2557,6 +3167,22 @@ declare class Redis {
2557
3167
  * @see {@link Pipeline}
2558
3168
  */
2559
3169
  multi: () => Pipeline<[]>;
3170
+ /**
3171
+ * Returns an instance that can be used to execute `BITFIELD` commands on one key.
3172
+ *
3173
+ * @example
3174
+ * ```typescript
3175
+ * redis.set("mykey", 0);
3176
+ * const result = await redis.bitfield("mykey")
3177
+ * .set("u4", 0, 16)
3178
+ * .incr("u4", "#1", 1)
3179
+ * .exec();
3180
+ * console.log(result); // [0, 1]
3181
+ * ```
3182
+ *
3183
+ * @see https://redis.io/commands/bitfield
3184
+ */
3185
+ bitfield: (key: string) => BitFieldCommand<Promise<number[]>>;
2560
3186
  /**
2561
3187
  * @see https://redis.io/commands/append
2562
3188
  */
@@ -2602,14 +3228,26 @@ declare class Redis {
2602
3228
  * @see https://redis.io/commands/echo
2603
3229
  */
2604
3230
  echo: (message: string) => Promise<string>;
3231
+ /**
3232
+ * @see https://redis.io/commands/eval_ro
3233
+ */
3234
+ evalRo: <TArgs extends unknown[], TData = unknown>(script: string, keys: string[], args: TArgs) => Promise<TData>;
2605
3235
  /**
2606
3236
  * @see https://redis.io/commands/eval
2607
3237
  */
2608
3238
  eval: <TArgs extends unknown[], TData = unknown>(script: string, keys: string[], args: TArgs) => Promise<TData>;
3239
+ /**
3240
+ * @see https://redis.io/commands/evalsha_ro
3241
+ */
3242
+ evalshaRo: <TArgs extends unknown[], TData = unknown>(sha1: string, keys: string[], args: TArgs) => Promise<TData>;
2609
3243
  /**
2610
3244
  * @see https://redis.io/commands/evalsha
2611
3245
  */
2612
3246
  evalsha: <TArgs extends unknown[], TData = unknown>(sha1: string, keys: string[], args: TArgs) => Promise<TData>;
3247
+ /**
3248
+ * Generic method to execute any Redis command.
3249
+ */
3250
+ exec: <TResult>(args: [command: string, ...args: (string | number | boolean)[]]) => Promise<TResult>;
2613
3251
  /**
2614
3252
  * @see https://redis.io/commands/exists
2615
3253
  */
@@ -2617,11 +3255,11 @@ declare class Redis {
2617
3255
  /**
2618
3256
  * @see https://redis.io/commands/expire
2619
3257
  */
2620
- expire: (key: string, seconds: number) => Promise<0 | 1>;
3258
+ expire: (key: string, seconds: number, option?: ExpireOption | undefined) => Promise<0 | 1>;
2621
3259
  /**
2622
3260
  * @see https://redis.io/commands/expireat
2623
3261
  */
2624
- expireat: (key: string, unix: number) => Promise<0 | 1>;
3262
+ expireat: (key: string, unix: number, option?: ExpireOption | undefined) => Promise<0 | 1>;
2625
3263
  /**
2626
3264
  * @see https://redis.io/commands/flushall
2627
3265
  */
@@ -2630,8 +3268,98 @@ declare class Redis {
2630
3268
  * @see https://redis.io/commands/flushdb
2631
3269
  */
2632
3270
  flushdb: (opts?: {
2633
- async?: boolean | undefined;
3271
+ async?: boolean;
2634
3272
  } | undefined) => Promise<"OK">;
3273
+ /**
3274
+ * @see https://redis.io/commands/geoadd
3275
+ */
3276
+ geoadd: <TData>(args_0: string, args_1: GeoAddCommandOptions | GeoMember<TData>, ...args_2: GeoMember<TData>[]) => Promise<number | null>;
3277
+ /**
3278
+ * @see https://redis.io/commands/geopos
3279
+ */
3280
+ geopos: <TData>(args_0: string, ...args_1: TData[]) => Promise<{
3281
+ lng: number;
3282
+ lat: number;
3283
+ }[]>;
3284
+ /**
3285
+ * @see https://redis.io/commands/geodist
3286
+ */
3287
+ geodist: <TData>(key: string, member1: TData, member2: TData, unit?: "M" | "KM" | "FT" | "MI" | undefined) => Promise<number | null>;
3288
+ /**
3289
+ * @see https://redis.io/commands/geohash
3290
+ */
3291
+ geohash: <TData>(args_0: string, ...args_1: TData[]) => Promise<(string | null)[]>;
3292
+ /**
3293
+ * @see https://redis.io/commands/geosearch
3294
+ */
3295
+ geosearch: <TData>(key: string, centerPoint: {
3296
+ type: "FROMLONLAT" | "fromlonlat";
3297
+ coordinate: {
3298
+ lon: number;
3299
+ lat: number;
3300
+ };
3301
+ } | {
3302
+ type: "FROMMEMBER" | "frommember";
3303
+ member: TData;
3304
+ }, shape: {
3305
+ type: "BYRADIUS" | "byradius";
3306
+ radius: number;
3307
+ radiusType: "M" | "KM" | "FT" | "MI";
3308
+ } | {
3309
+ type: "BYBOX" | "bybox";
3310
+ rect: {
3311
+ width: number;
3312
+ height: number;
3313
+ };
3314
+ rectType: "M" | "KM" | "FT" | "MI";
3315
+ }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
3316
+ count?: {
3317
+ limit: number;
3318
+ any?: boolean;
3319
+ };
3320
+ withCoord?: boolean;
3321
+ withDist?: boolean;
3322
+ withHash?: boolean;
3323
+ } | undefined) => Promise<({
3324
+ member: TData;
3325
+ } & {
3326
+ coord?: {
3327
+ long: number;
3328
+ lat: number;
3329
+ } | undefined;
3330
+ dist?: number | undefined;
3331
+ hash?: string | undefined;
3332
+ })[]>;
3333
+ /**
3334
+ * @see https://redis.io/commands/geosearchstore
3335
+ */
3336
+ geosearchstore: <TData>(destination: string, key: string, centerPoint: {
3337
+ type: "FROMLONLAT" | "fromlonlat";
3338
+ coordinate: {
3339
+ lon: number;
3340
+ lat: number;
3341
+ };
3342
+ } | {
3343
+ type: "FROMMEMBER" | "frommember";
3344
+ member: TData;
3345
+ }, shape: {
3346
+ type: "BYRADIUS" | "byradius";
3347
+ radius: number;
3348
+ radiusType: "M" | "KM" | "FT" | "MI";
3349
+ } | {
3350
+ type: "BYBOX" | "bybox";
3351
+ rect: {
3352
+ width: number;
3353
+ height: number;
3354
+ };
3355
+ rectType: "M" | "KM" | "FT" | "MI";
3356
+ }, order: "ASC" | "DESC" | "asc" | "desc", opts?: {
3357
+ count?: {
3358
+ limit: number;
3359
+ any?: boolean;
3360
+ };
3361
+ storeDist?: boolean;
3362
+ } | undefined) => Promise<number>;
2635
3363
  /**
2636
3364
  * @see https://redis.io/commands/get
2637
3365
  */
@@ -2644,6 +3372,46 @@ declare class Redis {
2644
3372
  * @see https://redis.io/commands/getdel
2645
3373
  */
2646
3374
  getdel: <TData>(key: string) => Promise<TData | null>;
3375
+ /**
3376
+ * @see https://redis.io/commands/getex
3377
+ */
3378
+ getex: <TData>(key: string, opts?: ({
3379
+ ex: number;
3380
+ px?: never;
3381
+ exat?: never;
3382
+ pxat?: never;
3383
+ persist?: never;
3384
+ } | {
3385
+ ex?: never;
3386
+ px: number;
3387
+ exat?: never;
3388
+ pxat?: never;
3389
+ persist?: never;
3390
+ } | {
3391
+ ex?: never;
3392
+ px?: never;
3393
+ exat: number;
3394
+ pxat?: never;
3395
+ persist?: never;
3396
+ } | {
3397
+ ex?: never;
3398
+ px?: never;
3399
+ exat?: never;
3400
+ pxat: number;
3401
+ persist?: never;
3402
+ } | {
3403
+ ex?: never;
3404
+ px?: never;
3405
+ exat?: never;
3406
+ pxat?: never;
3407
+ persist: true;
3408
+ } | {
3409
+ ex?: never;
3410
+ px?: never;
3411
+ exat?: never;
3412
+ pxat?: never;
3413
+ persist?: never;
3414
+ }) | undefined) => Promise<TData | null>;
2647
3415
  /**
2648
3416
  * @see https://redis.io/commands/getrange
2649
3417
  */
@@ -2660,6 +3428,42 @@ declare class Redis {
2660
3428
  * @see https://redis.io/commands/hexists
2661
3429
  */
2662
3430
  hexists: (key: string, field: string) => Promise<number>;
3431
+ /**
3432
+ * @see https://redis.io/commands/hexpire
3433
+ */
3434
+ hexpire: (key: string, fields: string | number | (string | number)[], seconds: number, option?: ExpireOption | undefined) => Promise<(0 | 1 | 2 | -2)[]>;
3435
+ /**
3436
+ * @see https://redis.io/commands/hexpireat
3437
+ */
3438
+ hexpireat: (key: string, fields: string | number | (string | number)[], timestamp: number, option?: ExpireOption | undefined) => Promise<(0 | 1 | 2 | -2)[]>;
3439
+ /**
3440
+ * @see https://redis.io/commands/hexpiretime
3441
+ */
3442
+ hexpiretime: (key: string, fields: string | number | (string | number)[]) => Promise<number[]>;
3443
+ /**
3444
+ * @see https://redis.io/commands/httl
3445
+ */
3446
+ httl: (key: string, fields: string | number | (string | number)[]) => Promise<number[]>;
3447
+ /**
3448
+ * @see https://redis.io/commands/hpexpire
3449
+ */
3450
+ hpexpire: (key: string, fields: string | number | (string | number)[], milliseconds: number, option?: ExpireOption | undefined) => Promise<(0 | 1 | 2 | -2)[]>;
3451
+ /**
3452
+ * @see https://redis.io/commands/hpexpireat
3453
+ */
3454
+ hpexpireat: (key: string, fields: string | number | (string | number)[], timestamp: number, option?: ExpireOption | undefined) => Promise<(0 | 1 | 2 | -2)[]>;
3455
+ /**
3456
+ * @see https://redis.io/commands/hpexpiretime
3457
+ */
3458
+ hpexpiretime: (key: string, fields: string | number | (string | number)[]) => Promise<number[]>;
3459
+ /**
3460
+ * @see https://redis.io/commands/hpttl
3461
+ */
3462
+ hpttl: (key: string, fields: string | number | (string | number)[]) => Promise<number[]>;
3463
+ /**
3464
+ * @see https://redis.io/commands/hpersist
3465
+ */
3466
+ hpersist: (key: string, fields: string | number | (string | number)[]) => Promise<(1 | -2 | -1)[]>;
2663
3467
  /**
2664
3468
  * @see https://redis.io/commands/hget
2665
3469
  */
@@ -2691,27 +3495,23 @@ declare class Redis {
2691
3495
  /**
2692
3496
  * @see https://redis.io/commands/hmset
2693
3497
  */
2694
- hmset: <TData>(key: string, kv: {
2695
- [field: string]: TData;
2696
- }) => Promise<"OK">;
3498
+ hmset: <TData>(key: string, kv: Record<string, TData>) => Promise<"OK">;
2697
3499
  /**
2698
3500
  * @see https://redis.io/commands/hrandfield
2699
3501
  */
2700
3502
  hrandfield: {
2701
- (key: string): Promise<string>;
3503
+ (key: string): Promise<string | null>;
2702
3504
  (key: string, count: number): Promise<string[]>;
2703
3505
  <TData extends Record<string, unknown>>(key: string, count: number, withValues: boolean): Promise<Partial<TData>>;
2704
3506
  };
2705
3507
  /**
2706
3508
  * @see https://redis.io/commands/hscan
2707
3509
  */
2708
- hscan: (key: string, cursor: number, cmdOpts?: ScanCommandOptions | undefined) => Promise<[number, (string | number)[]]>;
3510
+ hscan: (key: string, cursor: string | number, cmdOpts?: ScanCommandOptions | undefined) => Promise<[string, (string | number)[]]>;
2709
3511
  /**
2710
3512
  * @see https://redis.io/commands/hset
2711
3513
  */
2712
- hset: <TData>(key: string, kv: {
2713
- [field: string]: TData;
2714
- }) => Promise<number>;
3514
+ hset: <TData>(key: string, kv: Record<string, TData>) => Promise<number>;
2715
3515
  /**
2716
3516
  * @see https://redis.io/commands/hsetnx
2717
3517
  */
@@ -2760,13 +3560,17 @@ declare class Redis {
2760
3560
  * @see https://redis.io/commands/lpop
2761
3561
  */
2762
3562
  lpop: <TData>(key: string, count?: number | undefined) => Promise<TData | null>;
3563
+ /**
3564
+ * @see https://redis.io/commands/lmpop
3565
+ */
3566
+ lmpop: <TData>(numkeys: number, keys: string[], args_2: "LEFT" | "RIGHT", count?: number | undefined) => Promise<[string, TData[]] | null>;
2763
3567
  /**
2764
3568
  * @see https://redis.io/commands/lpos
2765
3569
  */
2766
3570
  lpos: <TData = number>(key: string, element: unknown, opts?: {
2767
- rank?: number | undefined;
2768
- count?: number | undefined;
2769
- maxLen?: number | undefined;
3571
+ rank?: number;
3572
+ count?: number;
3573
+ maxLen?: number;
2770
3574
  } | undefined) => Promise<TData>;
2771
3575
  /**
2772
3576
  * @see https://redis.io/commands/lpush
@@ -2799,15 +3603,11 @@ declare class Redis {
2799
3603
  /**
2800
3604
  * @see https://redis.io/commands/mset
2801
3605
  */
2802
- mset: <TData>(kv: {
2803
- [key: string]: TData;
2804
- }) => Promise<"OK">;
3606
+ mset: <TData>(kv: Record<string, TData>) => Promise<"OK">;
2805
3607
  /**
2806
3608
  * @see https://redis.io/commands/msetnx
2807
3609
  */
2808
- msetnx: <TData>(kv: {
2809
- [key: string]: TData;
2810
- }) => Promise<number>;
3610
+ msetnx: <TData>(kv: Record<string, TData>) => Promise<number>;
2811
3611
  /**
2812
3612
  * @see https://redis.io/commands/persist
2813
3613
  */
@@ -2815,11 +3615,23 @@ declare class Redis {
2815
3615
  /**
2816
3616
  * @see https://redis.io/commands/pexpire
2817
3617
  */
2818
- pexpire: (key: string, milliseconds: number) => Promise<0 | 1>;
3618
+ pexpire: (key: string, milliseconds: number, option?: ExpireOption | undefined) => Promise<0 | 1>;
2819
3619
  /**
2820
3620
  * @see https://redis.io/commands/pexpireat
2821
3621
  */
2822
- pexpireat: (key: string, unix: number) => Promise<0 | 1>;
3622
+ pexpireat: (key: string, unix: number, option?: ExpireOption | undefined) => Promise<0 | 1>;
3623
+ /**
3624
+ * @see https://redis.io/commands/pfadd
3625
+ */
3626
+ pfadd: (args_0: string, ...args_1: unknown[]) => Promise<number>;
3627
+ /**
3628
+ * @see https://redis.io/commands/pfcount
3629
+ */
3630
+ pfcount: (args_0: string, ...args_1: string[]) => Promise<number>;
3631
+ /**
3632
+ * @see https://redis.io/commands/pfmerge
3633
+ */
3634
+ pfmerge: (destination_key: string, ...args_1: string[]) => Promise<"OK">;
2823
3635
  /**
2824
3636
  * @see https://redis.io/commands/ping
2825
3637
  */
@@ -2828,6 +3640,10 @@ declare class Redis {
2828
3640
  * @see https://redis.io/commands/psetex
2829
3641
  */
2830
3642
  psetex: <TData>(key: string, ttl: number, value: TData) => Promise<string>;
3643
+ /**
3644
+ * @see https://redis.io/commands/psubscribe
3645
+ */
3646
+ psubscribe: <TMessage>(patterns: string | string[]) => Subscriber<TMessage>;
2831
3647
  /**
2832
3648
  * @see https://redis.io/commands/pttl
2833
3649
  */
@@ -2863,11 +3679,14 @@ declare class Redis {
2863
3679
  /**
2864
3680
  * @see https://redis.io/commands/sadd
2865
3681
  */
2866
- sadd: <TData>(key: string, ...members: TData[]) => Promise<number>;
3682
+ sadd: <TData>(key: string, member: TData, ...members: TData[]) => Promise<number>;
2867
3683
  /**
2868
3684
  * @see https://redis.io/commands/scan
2869
3685
  */
2870
- scan: (cursor: number, opts?: ScanCommandOptions | undefined) => Promise<[number, string[]]>;
3686
+ scan(cursor: string | number): Promise<ScanResultStandard>;
3687
+ scan<TOptions extends ScanCommandOptions>(cursor: string | number, opts: TOptions): Promise<TOptions extends {
3688
+ withType: true;
3689
+ } ? ScanResultWithType : ScanResultStandard>;
2871
3690
  /**
2872
3691
  * @see https://redis.io/commands/scard
2873
3692
  */
@@ -2951,11 +3770,15 @@ declare class Redis {
2951
3770
  /**
2952
3771
  * @see https://redis.io/commands/sscan
2953
3772
  */
2954
- sscan: (key: string, cursor: number, opts?: ScanCommandOptions | undefined) => Promise<[number, (string | number)[]]>;
3773
+ sscan: (key: string, cursor: string | number, opts?: ScanCommandOptions | undefined) => Promise<[string, (string | number)[]]>;
2955
3774
  /**
2956
3775
  * @see https://redis.io/commands/strlen
2957
3776
  */
2958
3777
  strlen: (key: string) => Promise<number>;
3778
+ /**
3779
+ * @see https://redis.io/commands/subscribe
3780
+ */
3781
+ subscribe: <TMessage>(channels: string | string[]) => Subscriber<TMessage>;
2959
3782
  /**
2960
3783
  * @see https://redis.io/commands/sunion
2961
3784
  */
@@ -2987,11 +3810,9 @@ declare class Redis {
2987
3810
  /**
2988
3811
  * @see https://redis.io/commands/xadd
2989
3812
  */
2990
- xadd: (key: string, id: string, entries: {
2991
- [field: string]: unknown;
2992
- }, opts?: {
2993
- nomkStream?: boolean | undefined;
2994
- trim?: (({
3813
+ xadd: (key: string, id: string, entries: Record<string, unknown>, opts?: {
3814
+ nomkStream?: boolean;
3815
+ trim?: ({
2995
3816
  type: "MAXLEN" | "maxlen";
2996
3817
  threshold: number;
2997
3818
  } | {
@@ -2999,20 +3820,117 @@ declare class Redis {
2999
3820
  threshold: string;
3000
3821
  }) & ({
3001
3822
  comparison: "~";
3002
- limit?: number | undefined;
3823
+ limit?: number;
3003
3824
  } | {
3004
3825
  comparison: "=";
3005
- limit?: undefined;
3006
- })) | undefined;
3826
+ limit?: never;
3827
+ });
3007
3828
  } | undefined) => Promise<string>;
3829
+ /**
3830
+ * @see https://redis.io/commands/xack
3831
+ */
3832
+ xack: (key: string, group: string, id: string | string[]) => Promise<number>;
3833
+ /**
3834
+ * @see https://redis.io/commands/xdel
3835
+ */
3836
+ xdel: (key: string, ids: string | string[]) => Promise<number>;
3837
+ /**
3838
+ * @see https://redis.io/commands/xgroup
3839
+ */
3840
+ xgroup: (key: string, opts: {
3841
+ type: "CREATE";
3842
+ group: string;
3843
+ id: `$` | string;
3844
+ options?: {
3845
+ MKSTREAM?: boolean;
3846
+ ENTRIESREAD?: number;
3847
+ };
3848
+ } | {
3849
+ type: "CREATECONSUMER";
3850
+ group: string;
3851
+ consumer: string;
3852
+ } | {
3853
+ type: "DELCONSUMER";
3854
+ group: string;
3855
+ consumer: string;
3856
+ } | {
3857
+ type: "DESTROY";
3858
+ group: string;
3859
+ } | {
3860
+ type: "SETID";
3861
+ group: string;
3862
+ id: `$` | string;
3863
+ options?: {
3864
+ ENTRIESREAD?: number;
3865
+ };
3866
+ }) => Promise<never>;
3867
+ /**
3868
+ * @see https://redis.io/commands/xread
3869
+ */
3870
+ xread: (...args: CommandArgs<typeof XReadCommand>) => Promise<unknown[]>;
3871
+ /**
3872
+ * @see https://redis.io/commands/xreadgroup
3873
+ */
3874
+ xreadgroup: (...args: CommandArgs<typeof XReadGroupCommand>) => Promise<unknown[]>;
3875
+ /**
3876
+ * @see https://redis.io/commands/xinfo
3877
+ */
3878
+ xinfo: (key: string, options: {
3879
+ type: "CONSUMERS";
3880
+ group: string;
3881
+ } | {
3882
+ type: "GROUPS";
3883
+ }) => Promise<unknown[]>;
3884
+ /**
3885
+ * @see https://redis.io/commands/xlen
3886
+ */
3887
+ xlen: (key: string) => Promise<number>;
3888
+ /**
3889
+ * @see https://redis.io/commands/xpending
3890
+ */
3891
+ xpending: (key: string, group: string, start: string, end: string, count: number, options?: {
3892
+ idleTime?: number;
3893
+ consumer?: string | string[];
3894
+ } | undefined) => Promise<unknown[]>;
3895
+ /**
3896
+ * @see https://redis.io/commands/xclaim
3897
+ */
3898
+ xclaim: (key: string, group: string, consumer: string, minIdleTime: number, id: string | string[], options?: {
3899
+ idleMS?: number;
3900
+ timeMS?: number;
3901
+ retryCount?: number;
3902
+ force?: boolean;
3903
+ justId?: boolean;
3904
+ lastId?: number;
3905
+ } | undefined) => Promise<unknown[]>;
3906
+ /**
3907
+ * @see https://redis.io/commands/xautoclaim
3908
+ */
3909
+ xautoclaim: (key: string, group: string, consumer: string, minIdleTime: number, start: string, options?: {
3910
+ count?: number;
3911
+ justId?: boolean;
3912
+ } | undefined) => Promise<unknown[]>;
3913
+ /**
3914
+ * @see https://redis.io/commands/xtrim
3915
+ */
3916
+ xtrim: (key: string, options: {
3917
+ strategy: "MAXLEN" | "MINID";
3918
+ exactness?: "~" | "=";
3919
+ threshold: number | string;
3920
+ limit?: number;
3921
+ }) => Promise<number>;
3008
3922
  /**
3009
3923
  * @see https://redis.io/commands/xrange
3010
3924
  */
3011
3925
  xrange: (key: string, start: string, end: string, count?: number | undefined) => Promise<Record<string, Record<string, unknown>>>;
3926
+ /**
3927
+ * @see https://redis.io/commands/xrevrange
3928
+ */
3929
+ xrevrange: (key: string, end: string, start: string, count?: number | undefined) => Promise<Record<string, Record<string, unknown>>>;
3012
3930
  /**
3013
3931
  * @see https://redis.io/commands/zadd
3014
3932
  */
3015
- zadd: <TData>(...args: [key: string, scoreMember: ScoreMember<TData>, ...scoreMemberPairs: ScoreMember<TData>[]] | [key: string, opts: ZAddCommandOptions | ZAddCommandOptionsWithIncr, ScoreMember<TData>, ...ScoreMember<TData>[]]) => Promise<number | null>;
3933
+ zadd: <TData>(...args: [key: string, scoreMember: ScoreMember<TData>, ...scoreMemberPairs: ScoreMember<TData>[]] | [key: string, opts: ZAddCommandOptions, ...scoreMemberPairs: [ScoreMember<TData>, ...ScoreMember<TData>[]]]) => Promise<number | null>;
3016
3934
  /**
3017
3935
  * @see https://redis.io/commands/zcard
3018
3936
  */
@@ -3052,21 +3970,11 @@ declare class Redis {
3052
3970
  /**
3053
3971
  * @see https://redis.io/commands/zrange
3054
3972
  */
3055
- zrange: <TData extends unknown[]>(...args: [key: string, min: number, max: number, opts?: ZRangeCommandOptions] | [
3056
- key: string,
3057
- min: `(${string}` | `[${string}` | "-" | "+",
3058
- max: `(${string}` | `[${string}` | "-" | "+",
3059
- opts: {
3060
- byLex: true;
3061
- } & ZRangeCommandOptions
3062
- ] | [
3063
- key: string,
3064
- min: number | `(${number}` | "-inf" | "+inf",
3065
- max: number | `(${number}` | "-inf" | "+inf",
3066
- opts: {
3067
- byScore: true;
3068
- } & ZRangeCommandOptions
3069
- ]) => Promise<TData>;
3973
+ zrange: <TData extends unknown[]>(...args: [key: string, min: number, max: number, opts?: ZRangeCommandOptions] | [key: string, min: `(${string}` | `[${string}` | "-" | "+", max: `(${string}` | `[${string}` | "-" | "+", opts: {
3974
+ byLex: true;
3975
+ } & ZRangeCommandOptions] | [key: string, min: number | `(${number}` | "-inf" | "+inf", max: number | `(${number}` | "-inf" | "+inf", opts: {
3976
+ byScore: true;
3977
+ } & ZRangeCommandOptions]) => Promise<TData>;
3070
3978
  /**
3071
3979
  * @see https://redis.io/commands/zrank
3072
3980
  */
@@ -3094,7 +4002,7 @@ declare class Redis {
3094
4002
  /**
3095
4003
  * @see https://redis.io/commands/zscan
3096
4004
  */
3097
- zscan: (key: string, cursor: number, opts?: ScanCommandOptions | undefined) => Promise<[number, (string | number)[]]>;
4005
+ zscan: (key: string, cursor: string | number, opts?: ScanCommandOptions | undefined) => Promise<[string, (string | number)[]]>;
3098
4006
  /**
3099
4007
  * @see https://redis.io/commands/zscore
3100
4008
  */
@@ -3109,6 +4017,30 @@ declare class Redis {
3109
4017
  zunionstore: (destination: string, numKeys: number, keys: string[], opts?: ZUnionStoreCommandOptions | undefined) => Promise<number>;
3110
4018
  }
3111
4019
 
4020
+ type UpstashErrorOptions = Pick<NonNullable<ConstructorParameters<typeof Error>[1]>, "cause">;
4021
+ /**
4022
+ * Result of a bad request to upstash
4023
+ */
4024
+ declare class UpstashError extends Error {
4025
+ constructor(message: string, options?: ErrorOptions);
4026
+ }
4027
+ declare class UrlError extends Error {
4028
+ constructor(url: string);
4029
+ }
4030
+ declare class UpstashJSONParseError extends UpstashError {
4031
+ constructor(body: string, options?: UpstashErrorOptions);
4032
+ }
4033
+
4034
+ type error_UpstashError = UpstashError;
4035
+ declare const error_UpstashError: typeof UpstashError;
4036
+ type error_UpstashJSONParseError = UpstashJSONParseError;
4037
+ declare const error_UpstashJSONParseError: typeof UpstashJSONParseError;
4038
+ type error_UrlError = UrlError;
4039
+ declare const error_UrlError: typeof UrlError;
4040
+ declare namespace error {
4041
+ export { error_UpstashError as UpstashError, error_UpstashJSONParseError as UpstashJSONParseError, error_UrlError as UrlError };
4042
+ }
4043
+
3112
4044
  /**
3113
4045
  * @see https://redis.io/commands/zdiffstore
3114
4046
  */
@@ -3123,4 +4055,4 @@ declare class ZMScoreCommand<TData> extends Command<string[] | null, number[] |
3123
4055
  constructor(cmd: [key: string, members: TData[]], opts?: CommandOptions<string[] | null, number[] | null>);
3124
4056
  }
3125
4057
 
3126
- export { IncrByCommand as $, AppendCommand as A, BitCountCommand as B, CopyCommand as C, DBSizeCommand as D, EchoCommand as E, FlushAllCommand as F, GeoAddCommand as G, GetSetCommand as H, HDelCommand as I, HExistsCommand as J, HGetCommand as K, HGetAllCommand as L, HIncrByCommand as M, HIncrByFloatCommand as N, HKeysCommand as O, HLenCommand as P, HMGetCommand as Q, RedisOptions as R, HMSetCommand as S, HRandFieldCommand as T, UpstashRequest as U, HScanCommand as V, HSetCommand as W, HSetNXCommand as X, HStrLenCommand as Y, HValsCommand as Z, IncrCommand as _, RequesterConfig as a, SetNxCommand as a$, IncrByFloatCommand as a0, JsonArrAppendCommand as a1, JsonArrIndexCommand as a2, JsonArrInsertCommand as a3, JsonArrLenCommand as a4, JsonArrPopCommand as a5, JsonArrTrimCommand as a6, JsonClearCommand as a7, JsonDelCommand as a8, JsonForgetCommand as a9, MSetNXCommand as aA, PersistCommand as aB, PExpireCommand as aC, PExpireAtCommand as aD, PingCommand as aE, PSetEXCommand as aF, PTtlCommand as aG, PublishCommand as aH, RandomKeyCommand as aI, RenameCommand as aJ, RenameNXCommand as aK, RPopCommand as aL, RPushCommand as aM, RPushXCommand as aN, SAddCommand as aO, ScanCommand as aP, ScanCommandOptions as aQ, SCardCommand as aR, ScriptExistsCommand as aS, ScriptFlushCommand as aT, ScriptLoadCommand as aU, SDiffCommand as aV, SDiffStoreCommand as aW, SetCommand as aX, SetCommandOptions as aY, SetBitCommand as aZ, SetExCommand as a_, JsonGetCommand as aa, JsonMGetCommand as ab, JsonNumIncrByCommand as ac, JsonNumMultByCommand as ad, JsonObjKeysCommand as ae, JsonObjLenCommand as af, JsonRespCommand as ag, JsonSetCommand as ah, JsonStrAppendCommand as ai, JsonStrLenCommand as aj, JsonToggleCommand as ak, JsonTypeCommand as al, KeysCommand as am, LIndexCommand as an, LInsertCommand as ao, LLenCommand as ap, LMoveCommand as aq, LPopCommand as ar, LPushCommand as as, LPushXCommand as at, LRangeCommand as au, LRemCommand as av, LSetCommand as aw, LTrimCommand as ax, MGetCommand as ay, MSetCommand as az, Redis as b, SetRangeCommand as b0, SInterCommand as b1, SInterStoreCommand as b2, SIsMemberCommand as b3, SMembersCommand as b4, SMIsMemberCommand as b5, SMoveCommand as b6, SPopCommand as b7, SRandMemberCommand as b8, SRemCommand as b9, ZRangeCommand as bA, ZRangeCommandOptions as bB, ZRankCommand as bC, ZRemCommand as bD, ZRemRangeByLexCommand as bE, ZRemRangeByRankCommand as bF, ZRemRangeByScoreCommand as bG, ZRevRankCommand as bH, ZScanCommand as bI, ZScoreCommand as bJ, ZUnionCommand as bK, ZUnionCommandOptions as bL, ZUnionStoreCommand as bM, ZUnionStoreCommandOptions as bN, SScanCommand as ba, StrLenCommand as bb, SUnionCommand as bc, SUnionStoreCommand as bd, TimeCommand as be, TouchCommand as bf, TtlCommand as bg, Type as bh, TypeCommand as bi, UnlinkCommand as bj, XAddCommand as bk, XRangeCommand as bl, ScoreMember as bm, ZAddCommandOptions as bn, ZAddCommandOptionsWithIncr as bo, ZAddCommand as bp, ZCardCommand as bq, ZCountCommand as br, ZDiffStoreCommand as bs, ZIncrByCommand as bt, ZInterStoreCommand as bu, ZInterStoreCommandOptions as bv, ZLexCountCommand as bw, ZMScoreCommand as bx, ZPopMaxCommand as by, ZPopMinCommand as bz, Requester as c, UpstashResponse as d, BitOpCommand as e, BitPosCommand as f, DecrCommand as g, DecrByCommand as h, DelCommand as i, EvalCommand as j, EvalshaCommand as k, ExistsCommand as l, ExpireCommand as m, ExpireAtCommand as n, FlushDBCommand as o, GeoAddCommandOptions as p, GeoMember as q, GeoDistCommand as r, GeoHashCommand as s, GeoPosCommand as t, GeoSearchCommand as u, GeoSearchStoreCommand as v, GetCommand as w, GetBitCommand as x, GetDelCommand as y, GetRangeCommand as z };
4058
+ export { HPersistCommand as $, AppendCommand as A, BitCountCommand as B, CopyCommand as C, DBSizeCommand as D, EchoCommand as E, FlushAllCommand as F, GeoAddCommand as G, type HttpClientConfig as H, GetCommand as I, GetBitCommand as J, GetDelCommand as K, GetExCommand as L, GetRangeCommand as M, GetSetCommand as N, HDelCommand as O, Pipeline as P, HExistsCommand as Q, type RedisOptions as R, HExpireCommand as S, HExpireAtCommand as T, type UpstashRequest as U, HExpireTimeCommand as V, HTtlCommand as W, HPExpireCommand as X, HPExpireAtCommand as Y, HPExpireTimeCommand as Z, HPTtlCommand as _, type RequesterConfig as a, RenameNXCommand as a$, HGetCommand as a0, HGetAllCommand as a1, HIncrByCommand as a2, HIncrByFloatCommand as a3, HKeysCommand as a4, HLenCommand as a5, HMGetCommand as a6, HMSetCommand as a7, HRandFieldCommand as a8, HScanCommand as a9, JsonStrLenCommand as aA, JsonToggleCommand as aB, JsonTypeCommand as aC, KeysCommand as aD, LIndexCommand as aE, LInsertCommand as aF, LLenCommand as aG, LMoveCommand as aH, LPopCommand as aI, LPushCommand as aJ, LPushXCommand as aK, LRangeCommand as aL, LRemCommand as aM, LSetCommand as aN, LTrimCommand as aO, MGetCommand as aP, MSetCommand as aQ, MSetNXCommand as aR, PersistCommand as aS, PExpireCommand as aT, PExpireAtCommand as aU, PingCommand as aV, PSetEXCommand as aW, PTtlCommand as aX, PublishCommand as aY, RandomKeyCommand as aZ, RenameCommand as a_, HSetCommand as aa, HSetNXCommand as ab, HStrLenCommand as ac, HValsCommand as ad, IncrCommand as ae, IncrByCommand as af, IncrByFloatCommand as ag, JsonArrAppendCommand as ah, JsonArrIndexCommand as ai, JsonArrInsertCommand as aj, JsonArrLenCommand as ak, JsonArrPopCommand as al, JsonArrTrimCommand as am, JsonClearCommand as an, JsonDelCommand as ao, JsonForgetCommand as ap, JsonGetCommand as aq, JsonMergeCommand as ar, JsonMGetCommand as as, JsonNumIncrByCommand as at, JsonNumMultByCommand as au, JsonObjKeysCommand as av, JsonObjLenCommand as aw, JsonRespCommand as ax, JsonSetCommand as ay, JsonStrAppendCommand as az, Redis as b, type ZUnionCommandOptions as b$, RPopCommand as b0, RPushCommand as b1, RPushXCommand as b2, SAddCommand as b3, ScanCommand as b4, type ScanCommandOptions as b5, SCardCommand as b6, ScriptExistsCommand as b7, ScriptFlushCommand as b8, ScriptLoadCommand as b9, UnlinkCommand as bA, XAddCommand as bB, XRangeCommand as bC, type ScoreMember as bD, type ZAddCommandOptions as bE, ZAddCommand as bF, ZCardCommand as bG, ZCountCommand as bH, ZDiffStoreCommand as bI, ZIncrByCommand as bJ, ZInterStoreCommand as bK, type ZInterStoreCommandOptions as bL, ZLexCountCommand as bM, ZMScoreCommand as bN, ZPopMaxCommand as bO, ZPopMinCommand as bP, ZRangeCommand as bQ, type ZRangeCommandOptions as bR, ZRankCommand as bS, ZRemCommand as bT, ZRemRangeByLexCommand as bU, ZRemRangeByRankCommand as bV, ZRemRangeByScoreCommand as bW, ZRevRankCommand as bX, ZScanCommand as bY, ZScoreCommand as bZ, ZUnionCommand as b_, SDiffCommand as ba, SDiffStoreCommand as bb, SetCommand as bc, type SetCommandOptions as bd, SetBitCommand as be, SetExCommand as bf, SetNxCommand as bg, SetRangeCommand as bh, SInterCommand as bi, SInterStoreCommand as bj, SIsMemberCommand as bk, SMembersCommand as bl, SMIsMemberCommand as bm, SMoveCommand as bn, SPopCommand as bo, SRandMemberCommand as bp, SRemCommand as bq, SScanCommand as br, StrLenCommand as bs, SUnionCommand as bt, SUnionStoreCommand as bu, TimeCommand as bv, TouchCommand as bw, TtlCommand as bx, type Type as by, TypeCommand as bz, type UpstashResponse as c, ZUnionStoreCommand as c0, type ZUnionStoreCommandOptions as c1, type Requester as d, error as e, BitOpCommand as f, BitPosCommand as g, DecrCommand as h, DecrByCommand as i, DelCommand as j, EvalROCommand as k, EvalCommand as l, EvalshaROCommand as m, EvalshaCommand as n, ExistsCommand as o, ExpireCommand as p, type ExpireOption as q, ExpireAtCommand as r, FlushDBCommand as s, type GeoAddCommandOptions as t, type GeoMember as u, GeoDistCommand as v, GeoHashCommand as w, GeoPosCommand as x, GeoSearchCommand as y, GeoSearchStoreCommand as z };