@upstash/redis 0.0.0-ci.fcd85d60 → 0.0.0

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 (165) hide show
  1. package/README.md +44 -280
  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/lpos.js +19 -0
  34. package/esm/pkg/commands/mod.js +27 -0
  35. package/esm/pkg/commands/scan.js +3 -0
  36. package/esm/pkg/commands/sdiffstore.js +1 -1
  37. package/esm/pkg/commands/set.js +16 -4
  38. package/esm/pkg/commands/smismember.js +9 -0
  39. package/esm/pkg/commands/xadd.js +26 -0
  40. package/esm/pkg/commands/zdiffstore.js +9 -0
  41. package/esm/pkg/commands/zmscore.js +10 -0
  42. package/esm/pkg/commands/zrange.js +6 -0
  43. package/esm/pkg/http.js +134 -9
  44. package/esm/pkg/pipeline.js +180 -12
  45. package/esm/pkg/redis.js +227 -2
  46. package/esm/pkg/script.js +77 -0
  47. package/esm/platforms/cloudflare.js +14 -26
  48. package/esm/platforms/fastly.js +10 -25
  49. package/esm/platforms/node_with_fetch.js +30 -26
  50. package/esm/platforms/nodejs.js +28 -26
  51. package/esm/version.js +1 -0
  52. package/package.json +53 -58
  53. package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
  54. package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
  55. package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
  56. package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
  57. package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
  58. package/script/pkg/commands/command.js +12 -3
  59. package/script/pkg/commands/getdel.js +13 -0
  60. package/script/pkg/commands/hgetall.js +0 -4
  61. package/script/pkg/commands/hrandfield.js +43 -0
  62. package/script/pkg/commands/json_arrappend.js +13 -0
  63. package/script/pkg/commands/json_arrindex.js +13 -0
  64. package/script/pkg/commands/json_arrinsert.js +13 -0
  65. package/script/pkg/commands/json_arrlen.js +13 -0
  66. package/script/pkg/commands/json_arrpop.js +13 -0
  67. package/script/pkg/commands/json_arrtrim.js +16 -0
  68. package/script/pkg/commands/json_clear.js +13 -0
  69. package/script/pkg/commands/json_del.js +13 -0
  70. package/script/pkg/commands/json_forget.js +13 -0
  71. package/script/pkg/commands/json_get.js +34 -0
  72. package/script/pkg/commands/json_mget.js +13 -0
  73. package/script/pkg/commands/json_numincrby.js +13 -0
  74. package/script/pkg/commands/json_nummultby.js +13 -0
  75. package/script/pkg/commands/json_objkeys.js +13 -0
  76. package/script/pkg/commands/json_objlen.js +13 -0
  77. package/script/pkg/commands/json_resp.js +13 -0
  78. package/script/pkg/commands/json_set.js +22 -0
  79. package/script/pkg/commands/json_strappend.js +13 -0
  80. package/script/pkg/commands/json_strlen.js +13 -0
  81. package/script/pkg/commands/json_toggle.js +13 -0
  82. package/script/pkg/commands/json_type.js +13 -0
  83. package/script/pkg/commands/lmove.js +13 -0
  84. package/script/pkg/commands/lpos.js +23 -0
  85. package/script/pkg/commands/mod.js +27 -0
  86. package/script/pkg/commands/scan.js +3 -0
  87. package/script/pkg/commands/sdiffstore.js +1 -1
  88. package/script/pkg/commands/set.js +16 -4
  89. package/script/pkg/commands/smismember.js +13 -0
  90. package/script/pkg/commands/xadd.js +30 -0
  91. package/script/pkg/commands/zdiffstore.js +13 -0
  92. package/script/pkg/commands/zmscore.js +14 -0
  93. package/script/pkg/commands/zrange.js +6 -0
  94. package/script/pkg/http.js +134 -9
  95. package/script/pkg/pipeline.js +179 -11
  96. package/script/pkg/redis.js +226 -1
  97. package/script/pkg/script.js +81 -0
  98. package/script/platforms/cloudflare.js +14 -26
  99. package/script/platforms/fastly.js +10 -25
  100. package/script/platforms/node_with_fetch.js +30 -26
  101. package/script/platforms/nodejs.js +28 -26
  102. package/script/version.js +4 -0
  103. package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
  104. package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
  105. package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
  106. package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
  107. package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
  108. package/types/pkg/commands/bitop.d.ts +0 -1
  109. package/types/pkg/commands/bitpos.d.ts +1 -1
  110. package/types/pkg/commands/command.d.ts +5 -5
  111. package/types/pkg/commands/getdel.d.ts +7 -0
  112. package/types/pkg/commands/hdel.d.ts +1 -1
  113. package/types/pkg/commands/hrandfield.d.ts +9 -0
  114. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  115. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  116. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  117. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  118. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  119. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  120. package/types/pkg/commands/json_clear.d.ts +7 -0
  121. package/types/pkg/commands/json_del.d.ts +7 -0
  122. package/types/pkg/commands/json_forget.d.ts +7 -0
  123. package/types/pkg/commands/json_get.d.ts +15 -0
  124. package/types/pkg/commands/json_mget.d.ts +7 -0
  125. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  126. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  127. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  128. package/types/pkg/commands/json_objlen.d.ts +7 -0
  129. package/types/pkg/commands/json_resp.d.ts +7 -0
  130. package/types/pkg/commands/json_set.d.ts +18 -0
  131. package/types/pkg/commands/json_strappend.d.ts +7 -0
  132. package/types/pkg/commands/json_strlen.d.ts +7 -0
  133. package/types/pkg/commands/json_toggle.d.ts +7 -0
  134. package/types/pkg/commands/json_type.d.ts +7 -0
  135. package/types/pkg/commands/lmove.d.ts +12 -0
  136. package/types/pkg/commands/lpop.d.ts +1 -1
  137. package/types/pkg/commands/lpos.d.ts +15 -0
  138. package/types/pkg/commands/mget.d.ts +1 -1
  139. package/types/pkg/commands/mod.d.ts +27 -0
  140. package/types/pkg/commands/rpop.d.ts +2 -2
  141. package/types/pkg/commands/scan.d.ts +2 -1
  142. package/types/pkg/commands/script_flush.d.ts +1 -1
  143. package/types/pkg/commands/sdiffstore.d.ts +1 -1
  144. package/types/pkg/commands/set.d.ts +31 -2
  145. package/types/pkg/commands/smembers.d.ts +2 -2
  146. package/types/pkg/commands/smismember.d.ts +7 -0
  147. package/types/pkg/commands/spop.d.ts +2 -2
  148. package/types/pkg/commands/type.d.ts +1 -1
  149. package/types/pkg/commands/xadd.d.ts +31 -0
  150. package/types/pkg/commands/zadd.d.ts +4 -4
  151. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  152. package/types/pkg/commands/zinterstore.d.ts +1 -1
  153. package/types/pkg/commands/zmscore.d.ts +7 -0
  154. package/types/pkg/commands/zrange.d.ts +8 -1
  155. package/types/pkg/commands/zunionstore.d.ts +1 -1
  156. package/types/pkg/http.d.ts +73 -8
  157. package/types/pkg/pipeline.d.ts +262 -124
  158. package/types/pkg/redis.d.ts +162 -19
  159. package/types/pkg/script.d.ts +42 -0
  160. package/types/pkg/types.d.ts +27 -1
  161. package/types/platforms/cloudflare.d.ts +9 -4
  162. package/types/platforms/fastly.d.ts +3 -3
  163. package/types/platforms/node_with_fetch.d.ts +3 -3
  164. package/types/platforms/nodejs.d.ts +19 -3
  165. package/types/version.d.ts +1 -0
package/esm/pkg/http.js CHANGED
@@ -19,31 +19,156 @@ export class HttpClient {
19
19
  writable: true,
20
20
  value: void 0
21
21
  });
22
+ Object.defineProperty(this, "retry", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ this.options = {
29
+ backend: config.options?.backend,
30
+ agent: config.agent,
31
+ responseEncoding: config.responseEncoding ?? "base64",
32
+ cache: config.cache,
33
+ };
22
34
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
23
- this.headers = { "Content-Type": "application/json", ...config.headers };
24
- this.options = config.options;
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
+ }
42
+ if (typeof config?.retry === "boolean" && config?.retry === false) {
43
+ this.retry = {
44
+ attempts: 1,
45
+ backoff: () => 0,
46
+ };
47
+ }
48
+ else {
49
+ this.retry = {
50
+ attempts: config?.retry?.retries ?? 5,
51
+ backoff: config?.retry?.backoff ??
52
+ ((retryCount) => Math.exp(retryCount) * 50),
53
+ };
54
+ }
25
55
  }
26
- async request(req) {
27
- if (!req.path) {
28
- req.path = [];
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;
29
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
+ }
73
+ async request(req) {
30
74
  const requestOptions = {
75
+ cache: this.options.cache,
31
76
  method: "POST",
32
77
  headers: this.headers,
33
78
  body: JSON.stringify(req.body),
34
79
  keepalive: true,
80
+ agent: this.options?.agent,
35
81
  /**
36
82
  * Fastly specific
37
83
  */
38
84
  backend: this.options?.backend,
39
85
  };
40
- // fetch is defined by isomorphic fetch
41
- // eslint-disable-next-line no-undef
42
- const res = await fetch([this.baseUrl, ...req.path].join("/"), requestOptions);
86
+ let res = null;
87
+ let error = null;
88
+ for (let i = 0; i <= this.retry.attempts; i++) {
89
+ try {
90
+ res = await fetch([this.baseUrl, ...(req.path ?? [])].join("/"), requestOptions);
91
+ break;
92
+ }
93
+ catch (err) {
94
+ error = err;
95
+ await new Promise((r) => setTimeout(r, this.retry.backoff(i)));
96
+ }
97
+ }
98
+ if (!res) {
99
+ throw error ?? new Error("Exhausted all retries");
100
+ }
43
101
  const body = (await res.json());
44
102
  if (!res.ok) {
45
- 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 };
46
114
  }
47
115
  return body;
48
116
  }
49
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, 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
  */
@@ -475,6 +524,15 @@ export class Pipeline {
475
524
  writable: true,
476
525
  value: (...args) => this.chain(new LPopCommand(args, this.commandOptions))
477
526
  });
527
+ /**
528
+ * @see https://redis.io/commands/lpos
529
+ */
530
+ Object.defineProperty(this, "lpos", {
531
+ enumerable: true,
532
+ configurable: true,
533
+ writable: true,
534
+ value: (...args) => this.chain(new LPosCommand(args, this.commandOptions))
535
+ });
478
536
  /**
479
537
  * @see https://redis.io/commands/lpush
480
538
  */
@@ -826,6 +884,15 @@ export class Pipeline {
826
884
  writable: true,
827
885
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
828
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
+ });
829
896
  /**
830
897
  * @see https://redis.io/commands/smove
831
898
  */
@@ -1002,6 +1069,15 @@ export class Pipeline {
1002
1069
  writable: true,
1003
1070
  value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
1004
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
+ });
1005
1081
  /**
1006
1082
  * @see https://redis.io/commands/zpopmax
1007
1083
  */
@@ -1110,16 +1186,108 @@ export class Pipeline {
1110
1186
  writable: true,
1111
1187
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1112
1188
  });
1113
- this.client = client;
1114
- this.commands = [];
1115
- 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;
1116
1193
  }
1117
1194
  /**
1118
- * 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
1119
1196
  * pipeline
1120
1197
  */
1121
1198
  chain(command) {
1122
1199
  this.commands.push(command);
1123
- 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
+ };
1124
1292
  }
1125
1293
  }