@upstash/redis 0.0.0-ci.d9ac9623 → 0.0.0-ci.dc584c15-20231010

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.
Files changed (154) hide show
  1. package/README.md +20 -18
  2. package/esm/deps/deno.land/x/base64@v0.2.1/base.js +100 -0
  3. package/esm/deps/deno.land/x/base64@v0.2.1/base64url.js +9 -0
  4. package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
  5. package/esm/deps/deno.land/x/sha1@v1.0.3/mod.js +191 -0
  6. package/esm/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +50 -0
  7. package/esm/pkg/commands/command.js +12 -3
  8. package/esm/pkg/commands/getdel.js +9 -0
  9. package/esm/pkg/commands/hgetall.js +0 -4
  10. package/esm/pkg/commands/hrandfield.js +39 -0
  11. package/esm/pkg/commands/json_arrappend.js +9 -0
  12. package/esm/pkg/commands/json_arrindex.js +9 -0
  13. package/esm/pkg/commands/json_arrinsert.js +9 -0
  14. package/esm/pkg/commands/json_arrlen.js +9 -0
  15. package/esm/pkg/commands/json_arrpop.js +9 -0
  16. package/esm/pkg/commands/json_arrtrim.js +12 -0
  17. package/esm/pkg/commands/json_clear.js +9 -0
  18. package/esm/pkg/commands/json_del.js +9 -0
  19. package/esm/pkg/commands/json_forget.js +9 -0
  20. package/esm/pkg/commands/json_get.js +30 -0
  21. package/esm/pkg/commands/json_mget.js +9 -0
  22. package/esm/pkg/commands/json_numincrby.js +9 -0
  23. package/esm/pkg/commands/json_nummultby.js +9 -0
  24. package/esm/pkg/commands/json_objkeys.js +9 -0
  25. package/esm/pkg/commands/json_objlen.js +9 -0
  26. package/esm/pkg/commands/json_resp.js +9 -0
  27. package/esm/pkg/commands/json_set.js +18 -0
  28. package/esm/pkg/commands/json_strappend.js +9 -0
  29. package/esm/pkg/commands/json_strlen.js +9 -0
  30. package/esm/pkg/commands/json_toggle.js +9 -0
  31. package/esm/pkg/commands/json_type.js +9 -0
  32. package/esm/pkg/commands/lmove.js +9 -0
  33. package/esm/pkg/commands/mod.js +27 -0
  34. package/esm/pkg/commands/scan.js +3 -0
  35. package/esm/pkg/commands/set.js +16 -4
  36. package/esm/pkg/commands/smismember.js +9 -0
  37. package/esm/pkg/commands/xadd.js +26 -0
  38. package/esm/pkg/commands/xrange.js +37 -0
  39. package/esm/pkg/commands/zdiffstore.js +9 -0
  40. package/esm/pkg/commands/zmscore.js +10 -0
  41. package/esm/pkg/http.js +100 -3
  42. package/esm/pkg/pipeline.js +171 -12
  43. package/esm/pkg/redis.js +219 -2
  44. package/esm/pkg/script.js +77 -0
  45. package/esm/platforms/cloudflare.js +10 -2
  46. package/esm/platforms/fastly.js +6 -0
  47. package/esm/platforms/node_with_fetch.js +26 -1
  48. package/esm/platforms/nodejs.js +24 -1
  49. package/esm/version.js +1 -0
  50. package/package.json +53 -58
  51. package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
  52. package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
  53. package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
  54. package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
  55. package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
  56. package/script/pkg/commands/command.js +12 -3
  57. package/script/pkg/commands/getdel.js +13 -0
  58. package/script/pkg/commands/hgetall.js +0 -4
  59. package/script/pkg/commands/hrandfield.js +43 -0
  60. package/script/pkg/commands/json_arrappend.js +13 -0
  61. package/script/pkg/commands/json_arrindex.js +13 -0
  62. package/script/pkg/commands/json_arrinsert.js +13 -0
  63. package/script/pkg/commands/json_arrlen.js +13 -0
  64. package/script/pkg/commands/json_arrpop.js +13 -0
  65. package/script/pkg/commands/json_arrtrim.js +16 -0
  66. package/script/pkg/commands/json_clear.js +13 -0
  67. package/script/pkg/commands/json_del.js +13 -0
  68. package/script/pkg/commands/json_forget.js +13 -0
  69. package/script/pkg/commands/json_get.js +34 -0
  70. package/script/pkg/commands/json_mget.js +13 -0
  71. package/script/pkg/commands/json_numincrby.js +13 -0
  72. package/script/pkg/commands/json_nummultby.js +13 -0
  73. package/script/pkg/commands/json_objkeys.js +13 -0
  74. package/script/pkg/commands/json_objlen.js +13 -0
  75. package/script/pkg/commands/json_resp.js +13 -0
  76. package/script/pkg/commands/json_set.js +22 -0
  77. package/script/pkg/commands/json_strappend.js +13 -0
  78. package/script/pkg/commands/json_strlen.js +13 -0
  79. package/script/pkg/commands/json_toggle.js +13 -0
  80. package/script/pkg/commands/json_type.js +13 -0
  81. package/script/pkg/commands/lmove.js +13 -0
  82. package/script/pkg/commands/mod.js +27 -0
  83. package/script/pkg/commands/scan.js +3 -0
  84. package/script/pkg/commands/set.js +16 -4
  85. package/script/pkg/commands/smismember.js +13 -0
  86. package/script/pkg/commands/xadd.js +30 -0
  87. package/script/pkg/commands/xrange.js +41 -0
  88. package/script/pkg/commands/zdiffstore.js +13 -0
  89. package/script/pkg/commands/zmscore.js +14 -0
  90. package/script/pkg/http.js +100 -3
  91. package/script/pkg/pipeline.js +170 -11
  92. package/script/pkg/redis.js +218 -1
  93. package/script/pkg/script.js +81 -0
  94. package/script/platforms/cloudflare.js +10 -2
  95. package/script/platforms/fastly.js +6 -0
  96. package/script/platforms/node_with_fetch.js +26 -1
  97. package/script/platforms/nodejs.js +24 -1
  98. package/script/version.js +4 -0
  99. package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
  100. package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
  101. package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
  102. package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
  103. package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
  104. package/types/pkg/commands/command.d.ts +5 -5
  105. package/types/pkg/commands/getdel.d.ts +7 -0
  106. package/types/pkg/commands/hdel.d.ts +1 -1
  107. package/types/pkg/commands/hrandfield.d.ts +9 -0
  108. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  109. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  110. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  111. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  112. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  113. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  114. package/types/pkg/commands/json_clear.d.ts +7 -0
  115. package/types/pkg/commands/json_del.d.ts +7 -0
  116. package/types/pkg/commands/json_forget.d.ts +7 -0
  117. package/types/pkg/commands/json_get.d.ts +15 -0
  118. package/types/pkg/commands/json_mget.d.ts +7 -0
  119. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  120. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  121. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  122. package/types/pkg/commands/json_objlen.d.ts +7 -0
  123. package/types/pkg/commands/json_resp.d.ts +7 -0
  124. package/types/pkg/commands/json_set.d.ts +18 -0
  125. package/types/pkg/commands/json_strappend.d.ts +7 -0
  126. package/types/pkg/commands/json_strlen.d.ts +7 -0
  127. package/types/pkg/commands/json_toggle.d.ts +7 -0
  128. package/types/pkg/commands/json_type.d.ts +7 -0
  129. package/types/pkg/commands/lmove.d.ts +12 -0
  130. package/types/pkg/commands/mod.d.ts +27 -0
  131. package/types/pkg/commands/scan.d.ts +2 -1
  132. package/types/pkg/commands/script_flush.d.ts +1 -1
  133. package/types/pkg/commands/set.d.ts +31 -2
  134. package/types/pkg/commands/smembers.d.ts +2 -2
  135. package/types/pkg/commands/smismember.d.ts +7 -0
  136. package/types/pkg/commands/type.d.ts +1 -1
  137. package/types/pkg/commands/xadd.d.ts +31 -0
  138. package/types/pkg/commands/xrange.d.ts +9 -0
  139. package/types/pkg/commands/zadd.d.ts +3 -3
  140. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  141. package/types/pkg/commands/zinterstore.d.ts +1 -1
  142. package/types/pkg/commands/zmscore.d.ts +7 -0
  143. package/types/pkg/commands/zrange.d.ts +1 -1
  144. package/types/pkg/commands/zunionstore.d.ts +1 -1
  145. package/types/pkg/http.d.ts +48 -7
  146. package/types/pkg/pipeline.d.ts +255 -125
  147. package/types/pkg/redis.d.ts +169 -13
  148. package/types/pkg/script.d.ts +42 -0
  149. package/types/pkg/types.d.ts +27 -1
  150. package/types/platforms/cloudflare.d.ts +9 -8
  151. package/types/platforms/fastly.d.ts +3 -7
  152. package/types/platforms/node_with_fetch.d.ts +3 -22
  153. package/types/platforms/nodejs.d.ts +4 -7
  154. package/types/version.d.ts +1 -0
@@ -1,5 +1,8 @@
1
- import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, JsonArrAppendCommand, JsonArrIndexCommand, JsonArrInsertCommand, JsonArrLenCommand, JsonArrPopCommand, JsonArrTrimCommand, JsonClearCommand, JsonDelCommand, JsonForgetCommand, JsonGetCommand, JsonMGetCommand, JsonNumIncrByCommand, JsonNumMultByCommand, JsonObjKeysCommand, JsonObjLenCommand, JsonRespCommand, JsonSetCommand, JsonStrAppendCommand, JsonStrLenCommand, JsonToggleCommand, JsonTypeCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LMoveCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { UpstashError } from "./error.js";
3
+ import { ZMScoreCommand } from "./commands/zmscore.js";
4
+ import { HRandFieldCommand } from "./commands/hrandfield.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
3
6
  /**
4
7
  * Upstash REST API supports command pipelining to send multiple commands in
5
8
  * batch, instead of sending each command one by one and waiting for a response.
@@ -16,7 +19,7 @@ import { UpstashError } from "./error.js";
16
19
  * **Examples:**
17
20
  *
18
21
  * ```ts
19
- * const p = redis.pipeline()
22
+ * const p = redis.pipeline() // or redis.multi()
20
23
  * p.set("key","value")
21
24
  * p.get("key")
22
25
  * const res = await p.exec()
@@ -28,7 +31,7 @@ import { UpstashError } from "./error.js";
28
31
  * const res = await p.set("key","value").get("key").exec()
29
32
  * ```
30
33
  *
31
- * It's not possible to infer correct types with a dynamic pipeline, so you can
34
+ * Return types are inferred if all commands are chained, but you can still
32
35
  * override the response type manually:
33
36
  * ```ts
34
37
  * redis.pipeline()
@@ -39,7 +42,7 @@ import { UpstashError } from "./error.js";
39
42
  * ```
40
43
  */
41
44
  export class Pipeline {
42
- constructor(client, commandOptions) {
45
+ constructor(opts) {
43
46
  Object.defineProperty(this, "client", {
44
47
  enumerable: true,
45
48
  configurable: true,
@@ -58,14 +61,22 @@ export class Pipeline {
58
61
  writable: true,
59
62
  value: void 0
60
63
  });
64
+ Object.defineProperty(this, "multiExec", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
61
70
  /**
62
71
  * Send the pipeline request to upstash.
63
72
  *
64
73
  * Returns an array with the results of all pipelined commands.
65
74
  *
66
- * You can define a return type manually to make working in typescript easier
75
+ * If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
67
76
  * ```ts
68
- * redis.pipeline().get("key").exec<[{ greeting: string }]>()
77
+ * const p = redis.pipeline()
78
+ * p.get("key")
79
+ * const result = p.exec<[{ greeting: string }]>()
69
80
  * ```
70
81
  */
71
82
  Object.defineProperty(this, "exec", {
@@ -76,10 +87,12 @@ export class Pipeline {
76
87
  if (this.commands.length === 0) {
77
88
  throw new Error("Pipeline is empty");
78
89
  }
90
+ const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
79
91
  const res = (await this.client.request({
80
- path: ["pipeline"],
92
+ path,
81
93
  body: Object.values(this.commands).map((c) => c.command),
82
94
  }));
95
+ console.log("after req", { res });
83
96
  return res.map(({ error, result }, i) => {
84
97
  if (error) {
85
98
  throw new UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
@@ -124,6 +137,15 @@ export class Pipeline {
124
137
  writable: true,
125
138
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
126
139
  });
140
+ /**
141
+ * @see https://redis.io/commands/zdiffstore
142
+ */
143
+ Object.defineProperty(this, "zdiffstore", {
144
+ enumerable: true,
145
+ configurable: true,
146
+ writable: true,
147
+ value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
148
+ });
127
149
  /**
128
150
  * @see https://redis.io/commands/dbsize
129
151
  */
@@ -250,6 +272,15 @@ export class Pipeline {
250
272
  writable: true,
251
273
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
252
274
  });
275
+ /**
276
+ * @see https://redis.io/commands/getdel
277
+ */
278
+ Object.defineProperty(this, "getdel", {
279
+ enumerable: true,
280
+ configurable: true,
281
+ writable: true,
282
+ value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
283
+ });
253
284
  /**
254
285
  * @see https://redis.io/commands/getrange
255
286
  */
@@ -358,6 +389,15 @@ export class Pipeline {
358
389
  writable: true,
359
390
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
360
391
  });
392
+ /**
393
+ * @see https://redis.io/commands/hrandfield
394
+ */
395
+ Object.defineProperty(this, "hrandfield", {
396
+ enumerable: true,
397
+ configurable: true,
398
+ writable: true,
399
+ value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
400
+ });
361
401
  /**
362
402
  * @see https://redis.io/commands/hscan
363
403
  */
@@ -466,6 +506,15 @@ export class Pipeline {
466
506
  writable: true,
467
507
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
468
508
  });
509
+ /**
510
+ * @see https://redis.io/commands/lmove
511
+ */
512
+ Object.defineProperty(this, "lmove", {
513
+ enumerable: true,
514
+ configurable: true,
515
+ writable: true,
516
+ value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
517
+ });
469
518
  /**
470
519
  * @see https://redis.io/commands/lpop
471
520
  */
@@ -835,6 +884,15 @@ export class Pipeline {
835
884
  writable: true,
836
885
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
837
886
  });
887
+ /**
888
+ * @see https://redis.io/commands/smismember
889
+ */
890
+ Object.defineProperty(this, "smismember", {
891
+ enumerable: true,
892
+ configurable: true,
893
+ writable: true,
894
+ value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
895
+ });
838
896
  /**
839
897
  * @see https://redis.io/commands/smove
840
898
  */
@@ -1011,6 +1069,15 @@ export class Pipeline {
1011
1069
  writable: true,
1012
1070
  value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
1013
1071
  });
1072
+ /**
1073
+ * @see https://redis.io/commands/zmscore
1074
+ */
1075
+ Object.defineProperty(this, "zmscore", {
1076
+ enumerable: true,
1077
+ configurable: true,
1078
+ writable: true,
1079
+ value: (...args) => this.chain(new ZMScoreCommand(args, this.commandOptions))
1080
+ });
1014
1081
  /**
1015
1082
  * @see https://redis.io/commands/zpopmax
1016
1083
  */
@@ -1119,16 +1186,108 @@ export class Pipeline {
1119
1186
  writable: true,
1120
1187
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1121
1188
  });
1122
- this.client = client;
1123
- this.commands = [];
1124
- this.commandOptions = commandOptions;
1189
+ this.client = opts.client;
1190
+ this.commands = []; // the TCommands generic in the class definition is only used for carrying through chained command types and should never be explicitly set when instantiating the class
1191
+ this.commandOptions = opts.commandOptions;
1192
+ this.multiExec = opts.multiExec ?? false;
1125
1193
  }
1126
1194
  /**
1127
- * Pushes a command into the pipelien and returns a chainable instance of the
1195
+ * Pushes a command into the pipeline and returns a chainable instance of the
1128
1196
  * pipeline
1129
1197
  */
1130
1198
  chain(command) {
1131
1199
  this.commands.push(command);
1132
- return this;
1200
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1201
+ }
1202
+ /**
1203
+ * @see https://redis.io/commands/?group=json
1204
+ */
1205
+ get json() {
1206
+ return {
1207
+ /**
1208
+ * @see https://redis.io/commands/json.arrappend
1209
+ */
1210
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1211
+ /**
1212
+ * @see https://redis.io/commands/json.arrindex
1213
+ */
1214
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1215
+ /**
1216
+ * @see https://redis.io/commands/json.arrinsert
1217
+ */
1218
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1219
+ /**
1220
+ * @see https://redis.io/commands/json.arrlen
1221
+ */
1222
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1223
+ /**
1224
+ * @see https://redis.io/commands/json.arrpop
1225
+ */
1226
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1227
+ /**
1228
+ * @see https://redis.io/commands/json.arrtrim
1229
+ */
1230
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1231
+ /**
1232
+ * @see https://redis.io/commands/json.clear
1233
+ */
1234
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1235
+ /**
1236
+ * @see https://redis.io/commands/json.del
1237
+ */
1238
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1239
+ /**
1240
+ * @see https://redis.io/commands/json.forget
1241
+ */
1242
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1243
+ /**
1244
+ * @see https://redis.io/commands/json.get
1245
+ */
1246
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1247
+ /**
1248
+ * @see https://redis.io/commands/json.mget
1249
+ */
1250
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1251
+ /**
1252
+ * @see https://redis.io/commands/json.numincrby
1253
+ */
1254
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1255
+ /**
1256
+ * @see https://redis.io/commands/json.nummultby
1257
+ */
1258
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1259
+ /**
1260
+ * @see https://redis.io/commands/json.objkeys
1261
+ */
1262
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1263
+ /**
1264
+ * @see https://redis.io/commands/json.objlen
1265
+ */
1266
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1267
+ /**
1268
+ * @see https://redis.io/commands/json.resp
1269
+ */
1270
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1271
+ /**
1272
+ * @see https://redis.io/commands/json.set
1273
+ */
1274
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1275
+ /**
1276
+ * @see https://redis.io/commands/json.strappend
1277
+ */
1278
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1279
+ /**
1280
+ * @see https://redis.io/commands/json.strlen
1281
+ */
1282
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1283
+ /**
1284
+ * @see https://redis.io/commands/json.toggle
1285
+ */
1286
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1287
+ /**
1288
+ * @see https://redis.io/commands/json.type
1289
+ */
1290
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1291
+ };
1133
1292
  }
1134
1293
  }
package/esm/pkg/redis.js CHANGED
@@ -1,5 +1,8 @@
1
- import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HRandFieldCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, JsonArrAppendCommand, JsonArrIndexCommand, JsonArrInsertCommand, JsonArrLenCommand, JsonArrPopCommand, JsonArrTrimCommand, JsonClearCommand, JsonDelCommand, JsonForgetCommand, JsonGetCommand, JsonMGetCommand, JsonNumIncrByCommand, JsonNumMultByCommand, JsonObjKeysCommand, JsonObjLenCommand, JsonRespCommand, JsonSetCommand, JsonStrAppendCommand, JsonStrLenCommand, JsonToggleCommand, JsonTypeCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LMoveCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, XAddCommand, XRangeCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { Pipeline } from "./pipeline.js";
3
+ import { Script } from "./script.js";
4
+ import { ZMScoreCommand } from "./commands/zmscore.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
3
6
  /**
4
7
  * Serverless redis client for upstash.
5
8
  */
@@ -28,6 +31,12 @@ export class Redis {
28
31
  writable: true,
29
32
  value: void 0
30
33
  });
34
+ Object.defineProperty(this, "enableTelemetry", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
31
40
  /**
32
41
  * Wrap a new middleware around the HTTP client.
33
42
  */
@@ -40,6 +49,27 @@ export class Redis {
40
49
  this.client.request = (req) => middleware(req, makeRequest);
41
50
  }
42
51
  });
52
+ /**
53
+ * Technically this is not private, we can hide it from intellisense by doing this
54
+ */
55
+ Object.defineProperty(this, "addTelemetry", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: (telemetry) => {
60
+ if (!this.enableTelemetry) {
61
+ return;
62
+ }
63
+ try {
64
+ // @ts-ignore - The `Requester` interface does not know about this method but it will be there
65
+ // as long as the user uses the standard HttpClient
66
+ this.client.mergeTelemetry(telemetry);
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ }
72
+ });
43
73
  /**
44
74
  * Create a new pipeline that allows you to send requests in bulk.
45
75
  *
@@ -49,7 +79,30 @@ export class Redis {
49
79
  enumerable: true,
50
80
  configurable: true,
51
81
  writable: true,
52
- value: () => new Pipeline(this.client, this.opts)
82
+ value: () => new Pipeline({
83
+ client: this.client,
84
+ commandOptions: this.opts,
85
+ multiExec: false,
86
+ })
87
+ });
88
+ /**
89
+ * Create a new transaction to allow executing multiple steps atomically.
90
+ *
91
+ * All the commands in a transaction are serialized and executed sequentially. A request sent by
92
+ * another client will never be served in the middle of the execution of a Redis Transaction. This
93
+ * guarantees that the commands are executed as a single isolated operation.
94
+ *
95
+ * @see {@link Pipeline}
96
+ */
97
+ Object.defineProperty(this, "multi", {
98
+ enumerable: true,
99
+ configurable: true,
100
+ writable: true,
101
+ value: () => new Pipeline({
102
+ client: this.client,
103
+ commandOptions: this.opts,
104
+ multiExec: true,
105
+ })
53
106
  });
54
107
  /**
55
108
  * @see https://redis.io/commands/append
@@ -213,6 +266,15 @@ export class Redis {
213
266
  writable: true,
214
267
  value: (...args) => new GetBitCommand(args, this.opts).exec(this.client)
215
268
  });
269
+ /**
270
+ * @see https://redis.io/commands/getdel
271
+ */
272
+ Object.defineProperty(this, "getdel", {
273
+ enumerable: true,
274
+ configurable: true,
275
+ writable: true,
276
+ value: (...args) => new GetDelCommand(args, this.opts).exec(this.client)
277
+ });
216
278
  /**
217
279
  * @see https://redis.io/commands/getrange
218
280
  */
@@ -321,6 +383,15 @@ export class Redis {
321
383
  writable: true,
322
384
  value: (key, kv) => new HMSetCommand([key, kv], this.opts).exec(this.client)
323
385
  });
386
+ /**
387
+ * @see https://redis.io/commands/hrandfield
388
+ */
389
+ Object.defineProperty(this, "hrandfield", {
390
+ enumerable: true,
391
+ configurable: true,
392
+ writable: true,
393
+ value: (key, count, withValues) => new HRandFieldCommand([key, count, withValues], this.opts).exec(this.client)
394
+ });
324
395
  /**
325
396
  * @see https://redis.io/commands/hscan
326
397
  */
@@ -429,6 +500,15 @@ export class Redis {
429
500
  writable: true,
430
501
  value: (...args) => new LLenCommand(args, this.opts).exec(this.client)
431
502
  });
503
+ /**
504
+ * @see https://redis.io/commands/lmove
505
+ */
506
+ Object.defineProperty(this, "lmove", {
507
+ enumerable: true,
508
+ configurable: true,
509
+ writable: true,
510
+ value: (...args) => new LMoveCommand(args, this.opts).exec(this.client)
511
+ });
432
512
  /**
433
513
  * @see https://redis.io/commands/lpop
434
514
  */
@@ -789,6 +869,15 @@ export class Redis {
789
869
  writable: true,
790
870
  value: (key, member) => new SIsMemberCommand([key, member], this.opts).exec(this.client)
791
871
  });
872
+ /**
873
+ * @see https://redis.io/commands/smismember
874
+ */
875
+ Object.defineProperty(this, "smismember", {
876
+ enumerable: true,
877
+ configurable: true,
878
+ writable: true,
879
+ value: (key, members) => new SMIsMemberCommand([key, members], this.opts).exec(this.client)
880
+ });
792
881
  /**
793
882
  * @see https://redis.io/commands/smembers
794
883
  */
@@ -915,6 +1004,24 @@ export class Redis {
915
1004
  writable: true,
916
1005
  value: (...args) => new UnlinkCommand(args, this.opts).exec(this.client)
917
1006
  });
1007
+ /**
1008
+ * @see https://redis.io/commands/xadd
1009
+ */
1010
+ Object.defineProperty(this, "xadd", {
1011
+ enumerable: true,
1012
+ configurable: true,
1013
+ writable: true,
1014
+ value: (...args) => new XAddCommand(args, this.opts).exec(this.client)
1015
+ });
1016
+ /**
1017
+ * @see https://redis.io/commands/xrange
1018
+ */
1019
+ Object.defineProperty(this, "xrange", {
1020
+ enumerable: true,
1021
+ configurable: true,
1022
+ writable: true,
1023
+ value: (...args) => new XRangeCommand(args, this.opts).exec(this.client)
1024
+ });
918
1025
  /**
919
1026
  * @see https://redis.io/commands/zadd
920
1027
  */
@@ -947,6 +1054,15 @@ export class Redis {
947
1054
  writable: true,
948
1055
  value: (...args) => new ZCountCommand(args, this.opts).exec(this.client)
949
1056
  });
1057
+ /**
1058
+ * @see https://redis.io/commands/zdiffstore
1059
+ */
1060
+ Object.defineProperty(this, "zdiffstore", {
1061
+ enumerable: true,
1062
+ configurable: true,
1063
+ writable: true,
1064
+ value: (...args) => new ZDiffStoreCommand(args, this.opts).exec(this.client)
1065
+ });
950
1066
  /**
951
1067
  * @see https://redis.io/commands/zincrby
952
1068
  */
@@ -974,6 +1090,15 @@ export class Redis {
974
1090
  writable: true,
975
1091
  value: (...args) => new ZLexCountCommand(args, this.opts).exec(this.client)
976
1092
  });
1093
+ /**
1094
+ * @see https://redis.io/commands/zmscore
1095
+ */
1096
+ Object.defineProperty(this, "zmscore", {
1097
+ enumerable: true,
1098
+ configurable: true,
1099
+ writable: true,
1100
+ value: (...args) => new ZMScoreCommand(args, this.opts).exec(this.client)
1101
+ });
977
1102
  /**
978
1103
  * @see https://redis.io/commands/zpopmax
979
1104
  */
@@ -1084,5 +1209,97 @@ export class Redis {
1084
1209
  });
1085
1210
  this.client = client;
1086
1211
  this.opts = opts;
1212
+ this.enableTelemetry = opts?.enableTelemetry ?? true;
1213
+ }
1214
+ get json() {
1215
+ return {
1216
+ /**
1217
+ * @see https://redis.io/commands/json.arrappend
1218
+ */
1219
+ arrappend: (...args) => new JsonArrAppendCommand(args, this.opts).exec(this.client),
1220
+ /**
1221
+ * @see https://redis.io/commands/json.arrindex
1222
+ */
1223
+ arrindex: (...args) => new JsonArrIndexCommand(args, this.opts).exec(this.client),
1224
+ /**
1225
+ * @see https://redis.io/commands/json.arrinsert
1226
+ */
1227
+ arrinsert: (...args) => new JsonArrInsertCommand(args, this.opts).exec(this.client),
1228
+ /**
1229
+ * @see https://redis.io/commands/json.arrlen
1230
+ */
1231
+ arrlen: (...args) => new JsonArrLenCommand(args, this.opts).exec(this.client),
1232
+ /**
1233
+ * @see https://redis.io/commands/json.arrpop
1234
+ */
1235
+ arrpop: (...args) => new JsonArrPopCommand(args, this.opts).exec(this.client),
1236
+ /**
1237
+ * @see https://redis.io/commands/json.arrtrim
1238
+ */
1239
+ arrtrim: (...args) => new JsonArrTrimCommand(args, this.opts).exec(this.client),
1240
+ /**
1241
+ * @see https://redis.io/commands/json.clear
1242
+ */
1243
+ clear: (...args) => new JsonClearCommand(args, this.opts).exec(this.client),
1244
+ /**
1245
+ * @see https://redis.io/commands/json.del
1246
+ */
1247
+ del: (...args) => new JsonDelCommand(args, this.opts).exec(this.client),
1248
+ /**
1249
+ * @see https://redis.io/commands/json.forget
1250
+ */
1251
+ forget: (...args) => new JsonForgetCommand(args, this.opts).exec(this.client),
1252
+ /**
1253
+ * @see https://redis.io/commands/json.get
1254
+ */
1255
+ get: (...args) => new JsonGetCommand(args, this.opts).exec(this.client),
1256
+ /**
1257
+ * @see https://redis.io/commands/json.mget
1258
+ */
1259
+ mget: (...args) => new JsonMGetCommand(args, this.opts).exec(this.client),
1260
+ /**
1261
+ * @see https://redis.io/commands/json.numincrby
1262
+ */
1263
+ numincrby: (...args) => new JsonNumIncrByCommand(args, this.opts).exec(this.client),
1264
+ /**
1265
+ * @see https://redis.io/commands/json.nummultby
1266
+ */
1267
+ nummultby: (...args) => new JsonNumMultByCommand(args, this.opts).exec(this.client),
1268
+ /**
1269
+ * @see https://redis.io/commands/json.objkeys
1270
+ */
1271
+ objkeys: (...args) => new JsonObjKeysCommand(args, this.opts).exec(this.client),
1272
+ /**
1273
+ * @see https://redis.io/commands/json.objlen
1274
+ */
1275
+ objlen: (...args) => new JsonObjLenCommand(args, this.opts).exec(this.client),
1276
+ /**
1277
+ * @see https://redis.io/commands/json.resp
1278
+ */
1279
+ resp: (...args) => new JsonRespCommand(args, this.opts).exec(this.client),
1280
+ /**
1281
+ * @see https://redis.io/commands/json.set
1282
+ */
1283
+ set: (...args) => new JsonSetCommand(args, this.opts).exec(this.client),
1284
+ /**
1285
+ * @see https://redis.io/commands/json.strappend
1286
+ */
1287
+ strappend: (...args) => new JsonStrAppendCommand(args, this.opts).exec(this.client),
1288
+ /**
1289
+ * @see https://redis.io/commands/json.strlen
1290
+ */
1291
+ strlen: (...args) => new JsonStrLenCommand(args, this.opts).exec(this.client),
1292
+ /**
1293
+ * @see https://redis.io/commands/json.toggle
1294
+ */
1295
+ toggle: (...args) => new JsonToggleCommand(args, this.opts).exec(this.client),
1296
+ /**
1297
+ * @see https://redis.io/commands/json.type
1298
+ */
1299
+ type: (...args) => new JsonTypeCommand(args, this.opts).exec(this.client),
1300
+ };
1301
+ }
1302
+ createScript(script) {
1303
+ return new Script(this, script);
1087
1304
  }
1088
1305
  }
@@ -0,0 +1,77 @@
1
+ import { sha1 as digest } from "../deps/deno.land/x/sha1@v1.0.3/mod.js";
2
+ /**
3
+ * Creates a new script.
4
+ *
5
+ * Scripts offer the ability to optimistically try to execute a script without having to send the
6
+ * entire script to the server. If the script is loaded on the server, it tries again by sending
7
+ * the entire script. Afterwards, the script is cached on the server.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const redis = new Redis({...})
12
+ *
13
+ * const script = redis.createScript<string>("return ARGV[1];")
14
+ * const arg1 = await script.eval([], ["Hello World"])
15
+ * assertEquals(arg1, "Hello World")
16
+ * ```
17
+ */
18
+ export class Script {
19
+ constructor(redis, script) {
20
+ Object.defineProperty(this, "script", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "sha1", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: void 0
31
+ });
32
+ Object.defineProperty(this, "redis", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ this.redis = redis;
39
+ this.sha1 = this.digest(script);
40
+ this.script = script;
41
+ }
42
+ /**
43
+ * Send an `EVAL` command to redis.
44
+ */
45
+ async eval(keys, args) {
46
+ return await this.redis.eval(this.script, keys, args);
47
+ }
48
+ /**
49
+ * Calculates the sha1 hash of the script and then calls `EVALSHA`.
50
+ */
51
+ async evalsha(keys, args) {
52
+ return await this.redis.evalsha(this.sha1, keys, args);
53
+ }
54
+ /**
55
+ * Optimistically try to run `EVALSHA` first.
56
+ * If the script is not loaded in redis, it will fall back and try again with `EVAL`.
57
+ *
58
+ * Following calls will be able to use the cached script
59
+ */
60
+ async exec(keys, args) {
61
+ const res = await this.redis.evalsha(this.sha1, keys, args).catch(async (err) => {
62
+ if (err instanceof Error &&
63
+ err.message.toLowerCase().includes("noscript")) {
64
+ return await this.redis.eval(this.script, keys, args);
65
+ }
66
+ throw err;
67
+ });
68
+ return res;
69
+ }
70
+ /**
71
+ * Compute the sha1 hash of the script and return its hex representation.
72
+ */
73
+ digest(s) {
74
+ const hash = digest(s, "utf8", "hex");
75
+ return typeof hash === "string" ? hash : new TextDecoder().decode(hash);
76
+ }
77
+ }