@upstash/redis 0.0.0-ci.76cb8558-20220809 → 0.0.0-ci.77dded50-20231019

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 (161) hide show
  1. package/README.md +20 -18
  2. package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
  3. package/esm/deps/denopkg.com/chiefbiiko/{std-encoding@v1.1.1 → std-encoding@v1.0.0}/mod.js +4 -8
  4. package/esm/pkg/commands/command.js +12 -3
  5. package/esm/pkg/commands/geo_add.js +27 -0
  6. package/esm/pkg/commands/geo_dist.js +11 -0
  7. package/esm/pkg/commands/getdel.js +9 -0
  8. package/esm/pkg/commands/hgetall.js +9 -5
  9. package/esm/pkg/commands/hrandfield.js +39 -0
  10. package/esm/pkg/commands/json_arrappend.js +9 -0
  11. package/esm/pkg/commands/json_arrindex.js +9 -0
  12. package/esm/pkg/commands/json_arrinsert.js +9 -0
  13. package/esm/pkg/commands/json_arrlen.js +9 -0
  14. package/esm/pkg/commands/json_arrpop.js +9 -0
  15. package/esm/pkg/commands/json_arrtrim.js +12 -0
  16. package/esm/pkg/commands/json_clear.js +9 -0
  17. package/esm/pkg/commands/json_del.js +9 -0
  18. package/esm/pkg/commands/json_forget.js +9 -0
  19. package/esm/pkg/commands/json_get.js +30 -0
  20. package/esm/pkg/commands/json_mget.js +9 -0
  21. package/esm/pkg/commands/json_numincrby.js +9 -0
  22. package/esm/pkg/commands/json_nummultby.js +9 -0
  23. package/esm/pkg/commands/json_objkeys.js +9 -0
  24. package/esm/pkg/commands/json_objlen.js +9 -0
  25. package/esm/pkg/commands/json_resp.js +9 -0
  26. package/esm/pkg/commands/json_set.js +18 -0
  27. package/esm/pkg/commands/json_strappend.js +9 -0
  28. package/esm/pkg/commands/json_strlen.js +9 -0
  29. package/esm/pkg/commands/json_toggle.js +9 -0
  30. package/esm/pkg/commands/json_type.js +9 -0
  31. package/esm/pkg/commands/lmove.js +9 -0
  32. package/esm/pkg/commands/mod.js +30 -0
  33. package/esm/pkg/commands/scan.js +3 -0
  34. package/esm/pkg/commands/set.js +1 -1
  35. package/esm/pkg/commands/smismember.js +9 -0
  36. package/esm/pkg/commands/xadd.js +26 -0
  37. package/esm/pkg/commands/xrange.js +36 -0
  38. package/esm/pkg/commands/zdiffstore.js +9 -0
  39. package/esm/pkg/commands/zmscore.js +10 -0
  40. package/esm/pkg/commands/zunion.js +30 -0
  41. package/esm/pkg/http.js +100 -3
  42. package/esm/pkg/pipeline.js +193 -12
  43. package/esm/pkg/redis.js +233 -2
  44. package/esm/pkg/script.js +1 -1
  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 -20
  51. package/script/deps/{denopkg.com/chiefbiiko/sha1@master → deno.land/x/sha1@v1.0.3}/deps.js +1 -1
  52. package/script/deps/denopkg.com/chiefbiiko/{std-encoding@v1.1.1 → std-encoding@v1.0.0}/mod.js +4 -31
  53. package/script/pkg/commands/command.js +12 -3
  54. package/script/pkg/commands/geo_add.js +31 -0
  55. package/script/pkg/commands/geo_dist.js +15 -0
  56. package/script/pkg/commands/getdel.js +13 -0
  57. package/script/pkg/commands/hgetall.js +9 -5
  58. package/script/pkg/commands/hrandfield.js +43 -0
  59. package/script/pkg/commands/json_arrappend.js +13 -0
  60. package/script/pkg/commands/json_arrindex.js +13 -0
  61. package/script/pkg/commands/json_arrinsert.js +13 -0
  62. package/script/pkg/commands/json_arrlen.js +13 -0
  63. package/script/pkg/commands/json_arrpop.js +13 -0
  64. package/script/pkg/commands/json_arrtrim.js +16 -0
  65. package/script/pkg/commands/json_clear.js +13 -0
  66. package/script/pkg/commands/json_del.js +13 -0
  67. package/script/pkg/commands/json_forget.js +13 -0
  68. package/script/pkg/commands/json_get.js +34 -0
  69. package/script/pkg/commands/json_mget.js +13 -0
  70. package/script/pkg/commands/json_numincrby.js +13 -0
  71. package/script/pkg/commands/json_nummultby.js +13 -0
  72. package/script/pkg/commands/json_objkeys.js +13 -0
  73. package/script/pkg/commands/json_objlen.js +13 -0
  74. package/script/pkg/commands/json_resp.js +13 -0
  75. package/script/pkg/commands/json_set.js +22 -0
  76. package/script/pkg/commands/json_strappend.js +13 -0
  77. package/script/pkg/commands/json_strlen.js +13 -0
  78. package/script/pkg/commands/json_toggle.js +13 -0
  79. package/script/pkg/commands/json_type.js +13 -0
  80. package/script/pkg/commands/lmove.js +13 -0
  81. package/script/pkg/commands/mod.js +30 -0
  82. package/script/pkg/commands/scan.js +3 -0
  83. package/script/pkg/commands/set.js +1 -1
  84. package/script/pkg/commands/smismember.js +13 -0
  85. package/script/pkg/commands/xadd.js +30 -0
  86. package/script/pkg/commands/xrange.js +40 -0
  87. package/script/pkg/commands/zdiffstore.js +13 -0
  88. package/script/pkg/commands/zmscore.js +14 -0
  89. package/script/pkg/commands/zunion.js +34 -0
  90. package/script/pkg/http.js +100 -3
  91. package/script/pkg/pipeline.js +192 -11
  92. package/script/pkg/redis.js +232 -1
  93. package/script/pkg/script.js +1 -1
  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/sha1@v1.0.3/deps.d.ts +1 -0
  100. package/types/pkg/commands/command.d.ts +5 -5
  101. package/types/pkg/commands/geo_add.d.ts +25 -0
  102. package/types/pkg/commands/geo_dist.d.ts +12 -0
  103. package/types/pkg/commands/getdel.d.ts +7 -0
  104. package/types/pkg/commands/hdel.d.ts +1 -1
  105. package/types/pkg/commands/hrandfield.d.ts +9 -0
  106. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  107. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  108. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  109. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  110. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  111. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  112. package/types/pkg/commands/json_clear.d.ts +7 -0
  113. package/types/pkg/commands/json_del.d.ts +7 -0
  114. package/types/pkg/commands/json_forget.d.ts +7 -0
  115. package/types/pkg/commands/json_get.d.ts +15 -0
  116. package/types/pkg/commands/json_mget.d.ts +7 -0
  117. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  118. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  119. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  120. package/types/pkg/commands/json_objlen.d.ts +7 -0
  121. package/types/pkg/commands/json_resp.d.ts +7 -0
  122. package/types/pkg/commands/json_set.d.ts +18 -0
  123. package/types/pkg/commands/json_strappend.d.ts +7 -0
  124. package/types/pkg/commands/json_strlen.d.ts +7 -0
  125. package/types/pkg/commands/json_toggle.d.ts +7 -0
  126. package/types/pkg/commands/json_type.d.ts +7 -0
  127. package/types/pkg/commands/lmove.d.ts +12 -0
  128. package/types/pkg/commands/mod.d.ts +30 -0
  129. package/types/pkg/commands/scan.d.ts +2 -1
  130. package/types/pkg/commands/script_flush.d.ts +1 -1
  131. package/types/pkg/commands/set.d.ts +3 -3
  132. package/types/pkg/commands/smembers.d.ts +2 -2
  133. package/types/pkg/commands/smismember.d.ts +7 -0
  134. package/types/pkg/commands/type.d.ts +1 -1
  135. package/types/pkg/commands/xadd.d.ts +31 -0
  136. package/types/pkg/commands/xrange.d.ts +9 -0
  137. package/types/pkg/commands/zadd.d.ts +3 -3
  138. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  139. package/types/pkg/commands/zinterstore.d.ts +1 -1
  140. package/types/pkg/commands/zmscore.d.ts +7 -0
  141. package/types/pkg/commands/zrange.d.ts +1 -1
  142. package/types/pkg/commands/zunion.d.ts +29 -0
  143. package/types/pkg/commands/zunionstore.d.ts +1 -1
  144. package/types/pkg/http.d.ts +48 -7
  145. package/types/pkg/pipeline.d.ts +271 -125
  146. package/types/pkg/redis.d.ts +179 -13
  147. package/types/pkg/types.d.ts +27 -1
  148. package/types/platforms/cloudflare.d.ts +9 -8
  149. package/types/platforms/fastly.d.ts +3 -7
  150. package/types/platforms/node_with_fetch.d.ts +3 -22
  151. package/types/platforms/nodejs.d.ts +4 -7
  152. package/types/version.d.ts +1 -0
  153. package/esm/deps/deno.land/x/base64@v0.2.1/mod.js +0 -13
  154. package/esm/deps/denopkg.com/chiefbiiko/sha1@master/deps.js +0 -1
  155. package/script/deps/deno.land/x/base64@v0.2.1/mod.js +0 -17
  156. package/types/deps/deno.land/x/base64@v0.2.1/mod.d.ts +0 -1
  157. package/types/deps/denopkg.com/chiefbiiko/sha1@master/deps.d.ts +0 -1
  158. /package/esm/deps/{denopkg.com/chiefbiiko/sha1@master → deno.land/x/sha1@v1.0.3}/mod.js +0 -0
  159. /package/script/deps/{denopkg.com/chiefbiiko/sha1@master → deno.land/x/sha1@v1.0.3}/mod.js +0 -0
  160. /package/types/deps/{denopkg.com/chiefbiiko/sha1@master → deno.land/x/sha1@v1.0.3}/mod.d.ts +0 -0
  161. /package/types/deps/denopkg.com/chiefbiiko/{std-encoding@v1.1.1 → std-encoding@v1.0.0}/mod.d.ts +0 -0
@@ -0,0 +1,36 @@
1
+ import { Command } from "./command.js";
2
+ function deserialize(result) {
3
+ const obj = {};
4
+ for (const e of result) {
5
+ while (e.length >= 2) {
6
+ const streamId = e.shift();
7
+ const entries = e.shift();
8
+ if (!(streamId in obj)) {
9
+ obj[streamId] = {};
10
+ }
11
+ while (entries.length >= 2) {
12
+ const field = entries.shift();
13
+ const value = entries.shift();
14
+ try {
15
+ obj[streamId][field] = JSON.parse(value);
16
+ }
17
+ catch {
18
+ obj[streamId][field] = value;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ return obj;
24
+ }
25
+ export class XRangeCommand extends Command {
26
+ constructor([key, start, end, count], opts) {
27
+ const command = ["XRANGE", key, start, end];
28
+ if (typeof count === "number") {
29
+ command.push("COUNT", count);
30
+ }
31
+ super(command, {
32
+ deserialize: (result) => deserialize(result),
33
+ ...opts,
34
+ });
35
+ }
36
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/zdiffstore
4
+ */
5
+ export class ZDiffStoreCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["zdiffstore", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,10 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/zmscore
4
+ */
5
+ export class ZMScoreCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const [key, members] = cmd;
8
+ super(["zmscore", key, ...members], opts);
9
+ }
10
+ }
@@ -0,0 +1,30 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/zunion
4
+ */
5
+ export class ZUnionCommand extends Command {
6
+ constructor([numKeys, keyOrKeys, opts], cmdOpts) {
7
+ const command = ["zunion", numKeys];
8
+ if (Array.isArray(keyOrKeys)) {
9
+ command.push(...keyOrKeys);
10
+ }
11
+ else {
12
+ command.push(keyOrKeys);
13
+ }
14
+ if (opts) {
15
+ if ("weights" in opts && opts.weights) {
16
+ command.push("weights", ...opts.weights);
17
+ }
18
+ else if ("weight" in opts && typeof opts.weight === "number") {
19
+ command.push("weights", opts.weight);
20
+ }
21
+ if ("aggregate" in opts) {
22
+ command.push("aggregate", opts.aggregate);
23
+ }
24
+ if (opts?.withScores) {
25
+ command.push("withscores");
26
+ }
27
+ }
28
+ super(command, cmdOpts);
29
+ }
30
+ }
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,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, GeoAddCommand, GeoDistCommand, 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, ZUnionCommand, 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,8 +87,9 @@ 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
  }));
83
95
  return res.map(({ error, result }, i) => {
@@ -124,6 +136,15 @@ export class Pipeline {
124
136
  writable: true,
125
137
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
126
138
  });
139
+ /**
140
+ * @see https://redis.io/commands/zdiffstore
141
+ */
142
+ Object.defineProperty(this, "zdiffstore", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
147
+ });
127
148
  /**
128
149
  * @see https://redis.io/commands/dbsize
129
150
  */
@@ -250,6 +271,15 @@ export class Pipeline {
250
271
  writable: true,
251
272
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
252
273
  });
274
+ /**
275
+ * @see https://redis.io/commands/getdel
276
+ */
277
+ Object.defineProperty(this, "getdel", {
278
+ enumerable: true,
279
+ configurable: true,
280
+ writable: true,
281
+ value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
282
+ });
253
283
  /**
254
284
  * @see https://redis.io/commands/getrange
255
285
  */
@@ -358,6 +388,15 @@ export class Pipeline {
358
388
  writable: true,
359
389
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
360
390
  });
391
+ /**
392
+ * @see https://redis.io/commands/hrandfield
393
+ */
394
+ Object.defineProperty(this, "hrandfield", {
395
+ enumerable: true,
396
+ configurable: true,
397
+ writable: true,
398
+ value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
399
+ });
361
400
  /**
362
401
  * @see https://redis.io/commands/hscan
363
402
  */
@@ -466,6 +505,15 @@ export class Pipeline {
466
505
  writable: true,
467
506
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
468
507
  });
508
+ /**
509
+ * @see https://redis.io/commands/lmove
510
+ */
511
+ Object.defineProperty(this, "lmove", {
512
+ enumerable: true,
513
+ configurable: true,
514
+ writable: true,
515
+ value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
516
+ });
469
517
  /**
470
518
  * @see https://redis.io/commands/lpop
471
519
  */
@@ -835,6 +883,15 @@ export class Pipeline {
835
883
  writable: true,
836
884
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
837
885
  });
886
+ /**
887
+ * @see https://redis.io/commands/smismember
888
+ */
889
+ Object.defineProperty(this, "smismember", {
890
+ enumerable: true,
891
+ configurable: true,
892
+ writable: true,
893
+ value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
894
+ });
838
895
  /**
839
896
  * @see https://redis.io/commands/smove
840
897
  */
@@ -1011,6 +1068,15 @@ export class Pipeline {
1011
1068
  writable: true,
1012
1069
  value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
1013
1070
  });
1071
+ /**
1072
+ * @see https://redis.io/commands/zmscore
1073
+ */
1074
+ Object.defineProperty(this, "zmscore", {
1075
+ enumerable: true,
1076
+ configurable: true,
1077
+ writable: true,
1078
+ value: (...args) => this.chain(new ZMScoreCommand(args, this.commandOptions))
1079
+ });
1014
1080
  /**
1015
1081
  * @see https://redis.io/commands/zpopmax
1016
1082
  */
@@ -1119,16 +1185,131 @@ export class Pipeline {
1119
1185
  writable: true,
1120
1186
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1121
1187
  });
1122
- this.client = client;
1123
- this.commands = [];
1124
- this.commandOptions = commandOptions;
1188
+ /**
1189
+ * @see https://redis.io/commands/zunion
1190
+ */
1191
+ Object.defineProperty(this, "zunion", {
1192
+ enumerable: true,
1193
+ configurable: true,
1194
+ writable: true,
1195
+ value: (...args) => this.chain(new ZUnionCommand(args, this.commandOptions))
1196
+ });
1197
+ this.client = opts.client;
1198
+ 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
1199
+ this.commandOptions = opts.commandOptions;
1200
+ this.multiExec = opts.multiExec ?? false;
1125
1201
  }
1126
1202
  /**
1127
- * Pushes a command into the pipelien and returns a chainable instance of the
1203
+ * Returns the length of pipeline before the execution
1204
+ */
1205
+ length() {
1206
+ return this.commands.length;
1207
+ }
1208
+ /**
1209
+ * Pushes a command into the pipeline and returns a chainable instance of the
1128
1210
  * pipeline
1129
1211
  */
1130
1212
  chain(command) {
1131
1213
  this.commands.push(command);
1132
- return this;
1214
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1215
+ }
1216
+ /**
1217
+ * @see https://redis.io/commands/?group=json
1218
+ */
1219
+ get json() {
1220
+ return {
1221
+ /**
1222
+ * @see https://redis.io/commands/json.arrappend
1223
+ */
1224
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1225
+ /**
1226
+ * @see https://redis.io/commands/json.arrindex
1227
+ */
1228
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1229
+ /**
1230
+ * @see https://redis.io/commands/json.arrinsert
1231
+ */
1232
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1233
+ /**
1234
+ * @see https://redis.io/commands/json.arrlen
1235
+ */
1236
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1237
+ /**
1238
+ * @see https://redis.io/commands/json.arrpop
1239
+ */
1240
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1241
+ /**
1242
+ * @see https://redis.io/commands/json.arrtrim
1243
+ */
1244
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1245
+ /**
1246
+ * @see https://redis.io/commands/json.clear
1247
+ */
1248
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1249
+ /**
1250
+ * @see https://redis.io/commands/json.del
1251
+ */
1252
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1253
+ /**
1254
+ * @see https://redis.io/commands/json.forget
1255
+ */
1256
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1257
+ /**
1258
+ * @see https://redis.io/commands/geoadd
1259
+ */
1260
+ geoadd: (...args) => new GeoAddCommand(args, this.commandOptions).exec(this.client),
1261
+ /**
1262
+ * @see https://redis.io/commands/geodist
1263
+ */
1264
+ geodist: (...args) => new GeoDistCommand(args, this.commandOptions).exec(this.client),
1265
+ /**
1266
+ * @see https://redis.io/commands/json.get
1267
+ */
1268
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1269
+ /**
1270
+ * @see https://redis.io/commands/json.mget
1271
+ */
1272
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1273
+ /**
1274
+ * @see https://redis.io/commands/json.numincrby
1275
+ */
1276
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1277
+ /**
1278
+ * @see https://redis.io/commands/json.nummultby
1279
+ */
1280
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1281
+ /**
1282
+ * @see https://redis.io/commands/json.objkeys
1283
+ */
1284
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1285
+ /**
1286
+ * @see https://redis.io/commands/json.objlen
1287
+ */
1288
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1289
+ /**
1290
+ * @see https://redis.io/commands/json.resp
1291
+ */
1292
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1293
+ /**
1294
+ * @see https://redis.io/commands/json.set
1295
+ */
1296
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1297
+ /**
1298
+ * @see https://redis.io/commands/json.strappend
1299
+ */
1300
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1301
+ /**
1302
+ * @see https://redis.io/commands/json.strlen
1303
+ */
1304
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1305
+ /**
1306
+ * @see https://redis.io/commands/json.toggle
1307
+ */
1308
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1309
+ /**
1310
+ * @see https://redis.io/commands/json.type
1311
+ */
1312
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1313
+ };
1133
1314
  }
1134
1315
  }