@upstash/redis 0.0.0-ci.b1e842dc-20220903 → 0.0.0-ci.b763ab8b-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 (131) hide show
  1. package/README.md +20 -18
  2. package/esm/pkg/commands/command.js +12 -3
  3. package/esm/pkg/commands/getdel.js +9 -0
  4. package/esm/pkg/commands/hgetall.js +0 -4
  5. package/esm/pkg/commands/hrandfield.js +39 -0
  6. package/esm/pkg/commands/json_arrappend.js +9 -0
  7. package/esm/pkg/commands/json_arrindex.js +9 -0
  8. package/esm/pkg/commands/json_arrinsert.js +9 -0
  9. package/esm/pkg/commands/json_arrlen.js +9 -0
  10. package/esm/pkg/commands/json_arrpop.js +9 -0
  11. package/esm/pkg/commands/json_arrtrim.js +12 -0
  12. package/esm/pkg/commands/json_clear.js +9 -0
  13. package/esm/pkg/commands/json_del.js +9 -0
  14. package/esm/pkg/commands/json_forget.js +9 -0
  15. package/esm/pkg/commands/json_get.js +30 -0
  16. package/esm/pkg/commands/json_mget.js +9 -0
  17. package/esm/pkg/commands/json_numincrby.js +9 -0
  18. package/esm/pkg/commands/json_nummultby.js +9 -0
  19. package/esm/pkg/commands/json_objkeys.js +9 -0
  20. package/esm/pkg/commands/json_objlen.js +9 -0
  21. package/esm/pkg/commands/json_resp.js +9 -0
  22. package/esm/pkg/commands/json_set.js +18 -0
  23. package/esm/pkg/commands/json_strappend.js +9 -0
  24. package/esm/pkg/commands/json_strlen.js +9 -0
  25. package/esm/pkg/commands/json_toggle.js +9 -0
  26. package/esm/pkg/commands/json_type.js +9 -0
  27. package/esm/pkg/commands/lmove.js +9 -0
  28. package/esm/pkg/commands/mod.js +26 -0
  29. package/esm/pkg/commands/set.js +1 -1
  30. package/esm/pkg/commands/smismember.js +9 -0
  31. package/esm/pkg/commands/xadd.js +26 -0
  32. package/esm/pkg/commands/zdiffstore.js +9 -0
  33. package/esm/pkg/commands/zmscore.js +1 -1
  34. package/esm/pkg/http.js +100 -3
  35. package/esm/pkg/pipeline.js +161 -12
  36. package/esm/pkg/redis.js +192 -2
  37. package/esm/platforms/cloudflare.js +10 -2
  38. package/esm/platforms/fastly.js +6 -0
  39. package/esm/platforms/node_with_fetch.js +26 -1
  40. package/esm/platforms/nodejs.js +24 -1
  41. package/esm/version.js +1 -0
  42. package/package.json +53 -20
  43. package/script/pkg/commands/command.js +12 -3
  44. package/script/pkg/commands/getdel.js +13 -0
  45. package/script/pkg/commands/hgetall.js +0 -4
  46. package/script/pkg/commands/hrandfield.js +43 -0
  47. package/script/pkg/commands/json_arrappend.js +13 -0
  48. package/script/pkg/commands/json_arrindex.js +13 -0
  49. package/script/pkg/commands/json_arrinsert.js +13 -0
  50. package/script/pkg/commands/json_arrlen.js +13 -0
  51. package/script/pkg/commands/json_arrpop.js +13 -0
  52. package/script/pkg/commands/json_arrtrim.js +16 -0
  53. package/script/pkg/commands/json_clear.js +13 -0
  54. package/script/pkg/commands/json_del.js +13 -0
  55. package/script/pkg/commands/json_forget.js +13 -0
  56. package/script/pkg/commands/json_get.js +34 -0
  57. package/script/pkg/commands/json_mget.js +13 -0
  58. package/script/pkg/commands/json_numincrby.js +13 -0
  59. package/script/pkg/commands/json_nummultby.js +13 -0
  60. package/script/pkg/commands/json_objkeys.js +13 -0
  61. package/script/pkg/commands/json_objlen.js +13 -0
  62. package/script/pkg/commands/json_resp.js +13 -0
  63. package/script/pkg/commands/json_set.js +22 -0
  64. package/script/pkg/commands/json_strappend.js +13 -0
  65. package/script/pkg/commands/json_strlen.js +13 -0
  66. package/script/pkg/commands/json_toggle.js +13 -0
  67. package/script/pkg/commands/json_type.js +13 -0
  68. package/script/pkg/commands/lmove.js +13 -0
  69. package/script/pkg/commands/mod.js +26 -0
  70. package/script/pkg/commands/set.js +1 -1
  71. package/script/pkg/commands/smismember.js +13 -0
  72. package/script/pkg/commands/xadd.js +30 -0
  73. package/script/pkg/commands/zdiffstore.js +13 -0
  74. package/script/pkg/commands/zmscore.js +1 -1
  75. package/script/pkg/http.js +100 -3
  76. package/script/pkg/pipeline.js +160 -11
  77. package/script/pkg/redis.js +191 -1
  78. package/script/platforms/cloudflare.js +10 -2
  79. package/script/platforms/fastly.js +6 -0
  80. package/script/platforms/node_with_fetch.js +26 -1
  81. package/script/platforms/nodejs.js +24 -1
  82. package/script/version.js +4 -0
  83. package/types/pkg/commands/command.d.ts +5 -5
  84. package/types/pkg/commands/getdel.d.ts +7 -0
  85. package/types/pkg/commands/hdel.d.ts +1 -1
  86. package/types/pkg/commands/hrandfield.d.ts +9 -0
  87. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  88. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  89. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  90. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  91. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  92. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  93. package/types/pkg/commands/json_clear.d.ts +7 -0
  94. package/types/pkg/commands/json_del.d.ts +7 -0
  95. package/types/pkg/commands/json_forget.d.ts +7 -0
  96. package/types/pkg/commands/json_get.d.ts +15 -0
  97. package/types/pkg/commands/json_mget.d.ts +7 -0
  98. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  99. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  100. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  101. package/types/pkg/commands/json_objlen.d.ts +7 -0
  102. package/types/pkg/commands/json_resp.d.ts +7 -0
  103. package/types/pkg/commands/json_set.d.ts +18 -0
  104. package/types/pkg/commands/json_strappend.d.ts +7 -0
  105. package/types/pkg/commands/json_strlen.d.ts +7 -0
  106. package/types/pkg/commands/json_toggle.d.ts +7 -0
  107. package/types/pkg/commands/json_type.d.ts +7 -0
  108. package/types/pkg/commands/lmove.d.ts +12 -0
  109. package/types/pkg/commands/mod.d.ts +26 -0
  110. package/types/pkg/commands/scan.d.ts +1 -1
  111. package/types/pkg/commands/script_flush.d.ts +1 -1
  112. package/types/pkg/commands/set.d.ts +3 -3
  113. package/types/pkg/commands/smembers.d.ts +2 -2
  114. package/types/pkg/commands/smismember.d.ts +7 -0
  115. package/types/pkg/commands/type.d.ts +1 -1
  116. package/types/pkg/commands/xadd.d.ts +31 -0
  117. package/types/pkg/commands/zadd.d.ts +3 -3
  118. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  119. package/types/pkg/commands/zinterstore.d.ts +1 -1
  120. package/types/pkg/commands/zmscore.d.ts +1 -1
  121. package/types/pkg/commands/zrange.d.ts +1 -1
  122. package/types/pkg/commands/zunionstore.d.ts +1 -1
  123. package/types/pkg/http.d.ts +48 -7
  124. package/types/pkg/pipeline.d.ts +252 -126
  125. package/types/pkg/redis.d.ts +137 -12
  126. package/types/pkg/types.d.ts +27 -1
  127. package/types/platforms/cloudflare.d.ts +9 -8
  128. package/types/platforms/fastly.d.ts +3 -7
  129. package/types/platforms/node_with_fetch.d.ts +3 -22
  130. package/types/platforms/nodejs.d.ts +4 -7
  131. package/types/version.d.ts +1 -0
package/esm/pkg/http.js CHANGED
@@ -25,9 +25,20 @@ export class HttpClient {
25
25
  writable: true,
26
26
  value: void 0
27
27
  });
28
+ this.options = {
29
+ backend: config.options?.backend,
30
+ agent: config.agent,
31
+ responseEncoding: config.responseEncoding ?? "base64",
32
+ cache: config.cache,
33
+ };
28
34
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
29
- this.headers = { "Content-Type": "application/json", ...config.headers };
30
- this.options = { backend: config.options?.backend };
35
+ this.headers = {
36
+ "Content-Type": "application/json",
37
+ ...config.headers,
38
+ };
39
+ if (this.options.responseEncoding === "base64") {
40
+ this.headers["Upstash-Encoding"] = "base64";
41
+ }
31
42
  if (typeof config?.retry === "boolean" && config?.retry === false) {
32
43
  this.retry = {
33
44
  attempts: 1,
@@ -42,12 +53,31 @@ export class HttpClient {
42
53
  };
43
54
  }
44
55
  }
56
+ mergeTelemetry(telemetry) {
57
+ function merge(obj, key, value) {
58
+ if (!value) {
59
+ return obj;
60
+ }
61
+ if (obj[key]) {
62
+ obj[key] = [obj[key], value].join(",");
63
+ }
64
+ else {
65
+ obj[key] = value;
66
+ }
67
+ return obj;
68
+ }
69
+ this.headers = merge(this.headers, "Upstash-Telemetry-Runtime", telemetry.runtime);
70
+ this.headers = merge(this.headers, "Upstash-Telemetry-Platform", telemetry.platform);
71
+ this.headers = merge(this.headers, "Upstash-Telemetry-Sdk", telemetry.sdk);
72
+ }
45
73
  async request(req) {
46
74
  const requestOptions = {
75
+ cache: this.options.cache,
47
76
  method: "POST",
48
77
  headers: this.headers,
49
78
  body: JSON.stringify(req.body),
50
79
  keepalive: true,
80
+ agent: this.options?.agent,
51
81
  /**
52
82
  * Fastly specific
53
83
  */
@@ -70,8 +100,75 @@ export class HttpClient {
70
100
  }
71
101
  const body = (await res.json());
72
102
  if (!res.ok) {
73
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
104
+ }
105
+ if (this.options?.responseEncoding === "base64") {
106
+ if (Array.isArray(body)) {
107
+ return body.map(({ result, error }) => ({
108
+ result: decode(result),
109
+ error,
110
+ }));
111
+ }
112
+ const result = decode(body.result);
113
+ return { result, error: body.error };
74
114
  }
75
115
  return body;
76
116
  }
77
117
  }
118
+ function base64decode(b64) {
119
+ let dec = "";
120
+ try {
121
+ /**
122
+ * Using only atob() is not enough because it doesn't work with unicode characters
123
+ */
124
+ const binString = atob(b64);
125
+ const size = binString.length;
126
+ const bytes = new Uint8Array(size);
127
+ for (let i = 0; i < size; i++) {
128
+ bytes[i] = binString.charCodeAt(i);
129
+ }
130
+ dec = new TextDecoder().decode(bytes);
131
+ }
132
+ catch {
133
+ dec = b64;
134
+ }
135
+ return dec;
136
+ // try {
137
+ // return decodeURIComponent(dec);
138
+ // } catch {
139
+ // return dec;
140
+ // }
141
+ }
142
+ function decode(raw) {
143
+ let result = undefined;
144
+ switch (typeof raw) {
145
+ case "undefined":
146
+ return raw;
147
+ case "number": {
148
+ result = raw;
149
+ break;
150
+ }
151
+ case "object": {
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
154
+ ? base64decode(v)
155
+ : Array.isArray(v)
156
+ ? v.map(decode)
157
+ : v);
158
+ }
159
+ else {
160
+ // If it's not an array it must be null
161
+ // Apparently null is an object in javascript
162
+ result = null;
163
+ }
164
+ break;
165
+ }
166
+ case "string": {
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
168
+ break;
169
+ }
170
+ default:
171
+ break;
172
+ }
173
+ return result;
174
+ }
@@ -1,6 +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
3
  import { ZMScoreCommand } from "./commands/zmscore.js";
4
+ import { HRandFieldCommand } from "./commands/hrandfield.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
4
6
  /**
5
7
  * Upstash REST API supports command pipelining to send multiple commands in
6
8
  * batch, instead of sending each command one by one and waiting for a response.
@@ -17,7 +19,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
17
19
  * **Examples:**
18
20
  *
19
21
  * ```ts
20
- * const p = redis.pipeline()
22
+ * const p = redis.pipeline() // or redis.multi()
21
23
  * p.set("key","value")
22
24
  * p.get("key")
23
25
  * const res = await p.exec()
@@ -29,7 +31,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
29
31
  * const res = await p.set("key","value").get("key").exec()
30
32
  * ```
31
33
  *
32
- * 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
33
35
  * override the response type manually:
34
36
  * ```ts
35
37
  * redis.pipeline()
@@ -40,7 +42,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
40
42
  * ```
41
43
  */
42
44
  export class Pipeline {
43
- constructor(client, commandOptions) {
45
+ constructor(opts) {
44
46
  Object.defineProperty(this, "client", {
45
47
  enumerable: true,
46
48
  configurable: true,
@@ -59,14 +61,22 @@ export class Pipeline {
59
61
  writable: true,
60
62
  value: void 0
61
63
  });
64
+ Object.defineProperty(this, "multiExec", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
62
70
  /**
63
71
  * Send the pipeline request to upstash.
64
72
  *
65
73
  * Returns an array with the results of all pipelined commands.
66
74
  *
67
- * 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:
68
76
  * ```ts
69
- * redis.pipeline().get("key").exec<[{ greeting: string }]>()
77
+ * const p = redis.pipeline()
78
+ * p.get("key")
79
+ * const result = p.exec<[{ greeting: string }]>()
70
80
  * ```
71
81
  */
72
82
  Object.defineProperty(this, "exec", {
@@ -77,10 +87,12 @@ export class Pipeline {
77
87
  if (this.commands.length === 0) {
78
88
  throw new Error("Pipeline is empty");
79
89
  }
90
+ const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
80
91
  const res = (await this.client.request({
81
- path: ["pipeline"],
92
+ path,
82
93
  body: Object.values(this.commands).map((c) => c.command),
83
94
  }));
95
+ console.log("after req", { res });
84
96
  return res.map(({ error, result }, i) => {
85
97
  if (error) {
86
98
  throw new UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
@@ -125,6 +137,15 @@ export class Pipeline {
125
137
  writable: true,
126
138
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
127
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
+ });
128
149
  /**
129
150
  * @see https://redis.io/commands/dbsize
130
151
  */
@@ -251,6 +272,15 @@ export class Pipeline {
251
272
  writable: true,
252
273
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
253
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
+ });
254
284
  /**
255
285
  * @see https://redis.io/commands/getrange
256
286
  */
@@ -359,6 +389,15 @@ export class Pipeline {
359
389
  writable: true,
360
390
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
361
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
+ });
362
401
  /**
363
402
  * @see https://redis.io/commands/hscan
364
403
  */
@@ -467,6 +506,15 @@ export class Pipeline {
467
506
  writable: true,
468
507
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
469
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
+ });
470
518
  /**
471
519
  * @see https://redis.io/commands/lpop
472
520
  */
@@ -836,6 +884,15 @@ export class Pipeline {
836
884
  writable: true,
837
885
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
838
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
+ });
839
896
  /**
840
897
  * @see https://redis.io/commands/smove
841
898
  */
@@ -1129,16 +1186,108 @@ export class Pipeline {
1129
1186
  writable: true,
1130
1187
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1131
1188
  });
1132
- this.client = client;
1133
- this.commands = [];
1134
- 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;
1135
1193
  }
1136
1194
  /**
1137
- * 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
1138
1196
  * pipeline
1139
1197
  */
1140
1198
  chain(command) {
1141
1199
  this.commands.push(command);
1142
- 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
+ };
1143
1292
  }
1144
1293
  }
package/esm/pkg/redis.js CHANGED
@@ -1,7 +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, 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
3
  import { Script } from "./script.js";
4
4
  import { ZMScoreCommand } from "./commands/zmscore.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
5
6
  /**
6
7
  * Serverless redis client for upstash.
7
8
  */
@@ -30,6 +31,12 @@ export class Redis {
30
31
  writable: true,
31
32
  value: void 0
32
33
  });
34
+ Object.defineProperty(this, "enableTelemetry", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
33
40
  /**
34
41
  * Wrap a new middleware around the HTTP client.
35
42
  */
@@ -42,6 +49,27 @@ export class Redis {
42
49
  this.client.request = (req) => middleware(req, makeRequest);
43
50
  }
44
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
+ });
45
73
  /**
46
74
  * Create a new pipeline that allows you to send requests in bulk.
47
75
  *
@@ -51,7 +79,30 @@ export class Redis {
51
79
  enumerable: true,
52
80
  configurable: true,
53
81
  writable: true,
54
- 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
+ })
55
106
  });
56
107
  /**
57
108
  * @see https://redis.io/commands/append
@@ -215,6 +266,15 @@ export class Redis {
215
266
  writable: true,
216
267
  value: (...args) => new GetBitCommand(args, this.opts).exec(this.client)
217
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
+ });
218
278
  /**
219
279
  * @see https://redis.io/commands/getrange
220
280
  */
@@ -323,6 +383,16 @@ export class Redis {
323
383
  writable: true,
324
384
  value: (key, kv) => new HMSetCommand([key, kv], this.opts).exec(this.client)
325
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)
394
+ .exec(this.client)
395
+ });
326
396
  /**
327
397
  * @see https://redis.io/commands/hscan
328
398
  */
@@ -431,6 +501,15 @@ export class Redis {
431
501
  writable: true,
432
502
  value: (...args) => new LLenCommand(args, this.opts).exec(this.client)
433
503
  });
504
+ /**
505
+ * @see https://redis.io/commands/lmove
506
+ */
507
+ Object.defineProperty(this, "lmove", {
508
+ enumerable: true,
509
+ configurable: true,
510
+ writable: true,
511
+ value: (...args) => new LMoveCommand(args, this.opts).exec(this.client)
512
+ });
434
513
  /**
435
514
  * @see https://redis.io/commands/lpop
436
515
  */
@@ -791,6 +870,15 @@ export class Redis {
791
870
  writable: true,
792
871
  value: (key, member) => new SIsMemberCommand([key, member], this.opts).exec(this.client)
793
872
  });
873
+ /**
874
+ * @see https://redis.io/commands/smismember
875
+ */
876
+ Object.defineProperty(this, "smismember", {
877
+ enumerable: true,
878
+ configurable: true,
879
+ writable: true,
880
+ value: (key, members) => new SMIsMemberCommand([key, members], this.opts).exec(this.client)
881
+ });
794
882
  /**
795
883
  * @see https://redis.io/commands/smembers
796
884
  */
@@ -917,6 +1005,10 @@ export class Redis {
917
1005
  writable: true,
918
1006
  value: (...args) => new UnlinkCommand(args, this.opts).exec(this.client)
919
1007
  });
1008
+ // /**
1009
+ // * @see https://redis.io/commands/xadd
1010
+ // */
1011
+ // xadd =
920
1012
  /**
921
1013
  * @see https://redis.io/commands/zadd
922
1014
  */
@@ -949,6 +1041,15 @@ export class Redis {
949
1041
  writable: true,
950
1042
  value: (...args) => new ZCountCommand(args, this.opts).exec(this.client)
951
1043
  });
1044
+ /**
1045
+ * @see https://redis.io/commands/zdiffstore
1046
+ */
1047
+ Object.defineProperty(this, "zdiffstore", {
1048
+ enumerable: true,
1049
+ configurable: true,
1050
+ writable: true,
1051
+ value: (...args) => new ZDiffStoreCommand(args, this.opts).exec(this.client)
1052
+ });
952
1053
  /**
953
1054
  * @see https://redis.io/commands/zincrby
954
1055
  */
@@ -1095,6 +1196,95 @@ export class Redis {
1095
1196
  });
1096
1197
  this.client = client;
1097
1198
  this.opts = opts;
1199
+ this.enableTelemetry = opts?.enableTelemetry ?? true;
1200
+ }
1201
+ get json() {
1202
+ return {
1203
+ /**
1204
+ * @see https://redis.io/commands/json.arrappend
1205
+ */
1206
+ arrappend: (...args) => new JsonArrAppendCommand(args, this.opts).exec(this.client),
1207
+ /**
1208
+ * @see https://redis.io/commands/json.arrindex
1209
+ */
1210
+ arrindex: (...args) => new JsonArrIndexCommand(args, this.opts).exec(this.client),
1211
+ /**
1212
+ * @see https://redis.io/commands/json.arrinsert
1213
+ */
1214
+ arrinsert: (...args) => new JsonArrInsertCommand(args, this.opts).exec(this.client),
1215
+ /**
1216
+ * @see https://redis.io/commands/json.arrlen
1217
+ */
1218
+ arrlen: (...args) => new JsonArrLenCommand(args, this.opts).exec(this.client),
1219
+ /**
1220
+ * @see https://redis.io/commands/json.arrpop
1221
+ */
1222
+ arrpop: (...args) => new JsonArrPopCommand(args, this.opts).exec(this.client),
1223
+ /**
1224
+ * @see https://redis.io/commands/json.arrtrim
1225
+ */
1226
+ arrtrim: (...args) => new JsonArrTrimCommand(args, this.opts).exec(this.client),
1227
+ /**
1228
+ * @see https://redis.io/commands/json.clear
1229
+ */
1230
+ clear: (...args) => new JsonClearCommand(args, this.opts).exec(this.client),
1231
+ /**
1232
+ * @see https://redis.io/commands/json.del
1233
+ */
1234
+ del: (...args) => new JsonDelCommand(args, this.opts).exec(this.client),
1235
+ /**
1236
+ * @see https://redis.io/commands/json.forget
1237
+ */
1238
+ forget: (...args) => new JsonForgetCommand(args, this.opts).exec(this.client),
1239
+ /**
1240
+ * @see https://redis.io/commands/json.get
1241
+ */
1242
+ get: (...args) => new JsonGetCommand(args, this.opts).exec(this.client),
1243
+ /**
1244
+ * @see https://redis.io/commands/json.mget
1245
+ */
1246
+ mget: (...args) => new JsonMGetCommand(args, this.opts).exec(this.client),
1247
+ /**
1248
+ * @see https://redis.io/commands/json.numincrby
1249
+ */
1250
+ numincrby: (...args) => new JsonNumIncrByCommand(args, this.opts).exec(this.client),
1251
+ /**
1252
+ * @see https://redis.io/commands/json.nummultby
1253
+ */
1254
+ nummultby: (...args) => new JsonNumMultByCommand(args, this.opts).exec(this.client),
1255
+ /**
1256
+ * @see https://redis.io/commands/json.objkeys
1257
+ */
1258
+ objkeys: (...args) => new JsonObjKeysCommand(args, this.opts).exec(this.client),
1259
+ /**
1260
+ * @see https://redis.io/commands/json.objlen
1261
+ */
1262
+ objlen: (...args) => new JsonObjLenCommand(args, this.opts).exec(this.client),
1263
+ /**
1264
+ * @see https://redis.io/commands/json.resp
1265
+ */
1266
+ resp: (...args) => new JsonRespCommand(args, this.opts).exec(this.client),
1267
+ /**
1268
+ * @see https://redis.io/commands/json.set
1269
+ */
1270
+ set: (...args) => new JsonSetCommand(args, this.opts).exec(this.client),
1271
+ /**
1272
+ * @see https://redis.io/commands/json.strappend
1273
+ */
1274
+ strappend: (...args) => new JsonStrAppendCommand(args, this.opts).exec(this.client),
1275
+ /**
1276
+ * @see https://redis.io/commands/json.strlen
1277
+ */
1278
+ strlen: (...args) => new JsonStrLenCommand(args, this.opts).exec(this.client),
1279
+ /**
1280
+ * @see https://redis.io/commands/json.toggle
1281
+ */
1282
+ toggle: (...args) => new JsonToggleCommand(args, this.opts).exec(this.client),
1283
+ /**
1284
+ * @see https://redis.io/commands/json.type
1285
+ */
1286
+ type: (...args) => new JsonTypeCommand(args, this.opts).exec(this.client),
1287
+ };
1098
1288
  }
1099
1289
  createScript(script) {
1100
1290
  return new Script(this, script);