@upstash/redis 0.0.0-ci.d5601844-20220803 → 0.0.0-ci.d93ae2f1-20230531

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 (146) hide show
  1. package/README.md +20 -18
  2. package/esm/deps/deno.land/x/base64@v0.2.1/base.js +100 -0
  3. package/esm/deps/deno.land/x/base64@v0.2.1/base64url.js +9 -0
  4. package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
  5. package/esm/deps/deno.land/x/sha1@v1.0.3/mod.js +191 -0
  6. package/esm/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +50 -0
  7. package/esm/pkg/commands/command.js +12 -3
  8. package/esm/pkg/commands/getdel.js +9 -0
  9. package/esm/pkg/commands/hgetall.js +0 -4
  10. package/esm/pkg/commands/hrandfield.js +39 -0
  11. package/esm/pkg/commands/json_arrappend.js +9 -0
  12. package/esm/pkg/commands/json_arrindex.js +9 -0
  13. package/esm/pkg/commands/json_arrinsert.js +9 -0
  14. package/esm/pkg/commands/json_arrlen.js +9 -0
  15. package/esm/pkg/commands/json_arrpop.js +9 -0
  16. package/esm/pkg/commands/json_arrtrim.js +12 -0
  17. package/esm/pkg/commands/json_clear.js +9 -0
  18. package/esm/pkg/commands/json_del.js +9 -0
  19. package/esm/pkg/commands/json_forget.js +9 -0
  20. package/esm/pkg/commands/json_get.js +30 -0
  21. package/esm/pkg/commands/json_mget.js +9 -0
  22. package/esm/pkg/commands/json_numincrby.js +9 -0
  23. package/esm/pkg/commands/json_nummultby.js +9 -0
  24. package/esm/pkg/commands/json_objkeys.js +9 -0
  25. package/esm/pkg/commands/json_objlen.js +9 -0
  26. package/esm/pkg/commands/json_resp.js +9 -0
  27. package/esm/pkg/commands/json_set.js +18 -0
  28. package/esm/pkg/commands/json_strappend.js +9 -0
  29. package/esm/pkg/commands/json_strlen.js +9 -0
  30. package/esm/pkg/commands/json_toggle.js +9 -0
  31. package/esm/pkg/commands/json_type.js +9 -0
  32. package/esm/pkg/commands/lmove.js +9 -0
  33. package/esm/pkg/commands/mod.js +25 -0
  34. package/esm/pkg/commands/scan.js +3 -0
  35. package/esm/pkg/commands/smismember.js +9 -0
  36. package/esm/pkg/commands/zdiffstore.js +9 -0
  37. package/esm/pkg/commands/zmscore.js +10 -0
  38. package/esm/pkg/http.js +92 -2
  39. package/esm/pkg/pipeline.js +170 -12
  40. package/esm/pkg/redis.js +202 -2
  41. package/esm/pkg/script.js +77 -0
  42. package/esm/platforms/cloudflare.js +10 -2
  43. package/esm/platforms/fastly.js +6 -0
  44. package/esm/platforms/node_with_fetch.js +26 -1
  45. package/esm/platforms/nodejs.js +24 -1
  46. package/esm/version.js +1 -0
  47. package/package.json +41 -54
  48. package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
  49. package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
  50. package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
  51. package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
  52. package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
  53. package/script/pkg/commands/command.js +12 -3
  54. package/script/pkg/commands/getdel.js +13 -0
  55. package/script/pkg/commands/hgetall.js +0 -4
  56. package/script/pkg/commands/hrandfield.js +43 -0
  57. package/script/pkg/commands/json_arrappend.js +13 -0
  58. package/script/pkg/commands/json_arrindex.js +13 -0
  59. package/script/pkg/commands/json_arrinsert.js +13 -0
  60. package/script/pkg/commands/json_arrlen.js +13 -0
  61. package/script/pkg/commands/json_arrpop.js +13 -0
  62. package/script/pkg/commands/json_arrtrim.js +16 -0
  63. package/script/pkg/commands/json_clear.js +13 -0
  64. package/script/pkg/commands/json_del.js +13 -0
  65. package/script/pkg/commands/json_forget.js +13 -0
  66. package/script/pkg/commands/json_get.js +34 -0
  67. package/script/pkg/commands/json_mget.js +13 -0
  68. package/script/pkg/commands/json_numincrby.js +13 -0
  69. package/script/pkg/commands/json_nummultby.js +13 -0
  70. package/script/pkg/commands/json_objkeys.js +13 -0
  71. package/script/pkg/commands/json_objlen.js +13 -0
  72. package/script/pkg/commands/json_resp.js +13 -0
  73. package/script/pkg/commands/json_set.js +22 -0
  74. package/script/pkg/commands/json_strappend.js +13 -0
  75. package/script/pkg/commands/json_strlen.js +13 -0
  76. package/script/pkg/commands/json_toggle.js +13 -0
  77. package/script/pkg/commands/json_type.js +13 -0
  78. package/script/pkg/commands/lmove.js +13 -0
  79. package/script/pkg/commands/mod.js +25 -0
  80. package/script/pkg/commands/scan.js +3 -0
  81. package/script/pkg/commands/smismember.js +13 -0
  82. package/script/pkg/commands/zdiffstore.js +13 -0
  83. package/script/pkg/commands/zmscore.js +14 -0
  84. package/script/pkg/http.js +92 -2
  85. package/script/pkg/pipeline.js +169 -11
  86. package/script/pkg/redis.js +201 -1
  87. package/script/pkg/script.js +81 -0
  88. package/script/platforms/cloudflare.js +10 -2
  89. package/script/platforms/fastly.js +6 -0
  90. package/script/platforms/node_with_fetch.js +26 -1
  91. package/script/platforms/nodejs.js +24 -1
  92. package/script/version.js +4 -0
  93. package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
  94. package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
  95. package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
  96. package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
  97. package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
  98. package/types/pkg/commands/command.d.ts +5 -5
  99. package/types/pkg/commands/getdel.d.ts +7 -0
  100. package/types/pkg/commands/hdel.d.ts +1 -1
  101. package/types/pkg/commands/hrandfield.d.ts +9 -0
  102. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  103. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  104. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  105. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  106. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  107. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  108. package/types/pkg/commands/json_clear.d.ts +7 -0
  109. package/types/pkg/commands/json_del.d.ts +7 -0
  110. package/types/pkg/commands/json_forget.d.ts +7 -0
  111. package/types/pkg/commands/json_get.d.ts +15 -0
  112. package/types/pkg/commands/json_mget.d.ts +7 -0
  113. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  114. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  115. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  116. package/types/pkg/commands/json_objlen.d.ts +7 -0
  117. package/types/pkg/commands/json_resp.d.ts +7 -0
  118. package/types/pkg/commands/json_set.d.ts +18 -0
  119. package/types/pkg/commands/json_strappend.d.ts +7 -0
  120. package/types/pkg/commands/json_strlen.d.ts +7 -0
  121. package/types/pkg/commands/json_toggle.d.ts +7 -0
  122. package/types/pkg/commands/json_type.d.ts +7 -0
  123. package/types/pkg/commands/lmove.d.ts +12 -0
  124. package/types/pkg/commands/mod.d.ts +25 -0
  125. package/types/pkg/commands/scan.d.ts +2 -1
  126. package/types/pkg/commands/script_flush.d.ts +1 -1
  127. package/types/pkg/commands/set.d.ts +3 -3
  128. package/types/pkg/commands/smembers.d.ts +2 -2
  129. package/types/pkg/commands/smismember.d.ts +7 -0
  130. package/types/pkg/commands/type.d.ts +1 -1
  131. package/types/pkg/commands/zadd.d.ts +3 -3
  132. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  133. package/types/pkg/commands/zinterstore.d.ts +1 -1
  134. package/types/pkg/commands/zmscore.d.ts +7 -0
  135. package/types/pkg/commands/zrange.d.ts +1 -1
  136. package/types/pkg/commands/zunionstore.d.ts +1 -1
  137. package/types/pkg/http.d.ts +44 -7
  138. package/types/pkg/pipeline.d.ts +255 -125
  139. package/types/pkg/redis.d.ts +144 -13
  140. package/types/pkg/script.d.ts +42 -0
  141. package/types/pkg/types.d.ts +27 -1
  142. package/types/platforms/cloudflare.d.ts +9 -8
  143. package/types/platforms/fastly.d.ts +3 -7
  144. package/types/platforms/node_with_fetch.d.ts +3 -22
  145. package/types/platforms/nodejs.d.ts +4 -7
  146. package/types/version.d.ts +1 -0
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.objkeys
4
+ */
5
+ export class JsonObjKeysCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.OBJKEYS", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.objlen
4
+ */
5
+ export class JsonObjLenCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.OBJLEN", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.resp
4
+ */
5
+ export class JsonRespCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.RESP", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.set
4
+ */
5
+ export class JsonSetCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const command = ["JSON.SET", cmd[0], cmd[1], cmd[2]];
8
+ if (cmd[3]) {
9
+ if (cmd[3].nx) {
10
+ command.push("NX");
11
+ }
12
+ else if (cmd[3].xx) {
13
+ command.push("XX");
14
+ }
15
+ }
16
+ super(command, opts);
17
+ }
18
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.strappend
4
+ */
5
+ export class JsonStrAppendCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.STRAPPEND", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.strlen
4
+ */
5
+ export class JsonStrLenCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.STRLEN", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.toggle
4
+ */
5
+ export class JsonToggleCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.TOGGLE", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.type
4
+ */
5
+ export class JsonTypeCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.TYPE", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/lmove
4
+ */
5
+ export class LMoveCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["lmove", ...cmd], opts);
8
+ }
9
+ }
@@ -17,6 +17,7 @@ export * from "./flushall.js";
17
17
  export * from "./flushdb.js";
18
18
  export * from "./get.js";
19
19
  export * from "./getbit.js";
20
+ export * from "./getdel.js";
20
21
  export * from "./getrange.js";
21
22
  export * from "./getset.js";
22
23
  export * from "./hdel.js";
@@ -29,6 +30,7 @@ export * from "./hkeys.js";
29
30
  export * from "./hlen.js";
30
31
  export * from "./hmget.js";
31
32
  export * from "./hmset.js";
33
+ export * from "./hrandfield.js";
32
34
  export * from "./hscan.js";
33
35
  export * from "./hset.js";
34
36
  export * from "./hsetnx.js";
@@ -37,10 +39,32 @@ export * from "./hvals.js";
37
39
  export * from "./incr.js";
38
40
  export * from "./incrby.js";
39
41
  export * from "./incrbyfloat.js";
42
+ export * from "./json_arrappend.js";
43
+ export * from "./json_arrindex.js";
44
+ export * from "./json_arrinsert.js";
45
+ export * from "./json_arrlen.js";
46
+ export * from "./json_arrpop.js";
47
+ export * from "./json_arrtrim.js";
48
+ export * from "./json_clear.js";
49
+ export * from "./json_del.js";
50
+ export * from "./json_forget.js";
51
+ export * from "./json_get.js";
52
+ export * from "./json_mget.js";
53
+ export * from "./json_numincrby.js";
54
+ export * from "./json_nummultby.js";
55
+ export * from "./json_objkeys.js";
56
+ export * from "./json_objlen.js";
57
+ export * from "./json_resp.js";
58
+ export * from "./json_set.js";
59
+ export * from "./json_strappend.js";
60
+ export * from "./json_strlen.js";
61
+ export * from "./json_toggle.js";
62
+ export * from "./json_type.js";
40
63
  export * from "./keys.js";
41
64
  export * from "./lindex.js";
42
65
  export * from "./linsert.js";
43
66
  export * from "./llen.js";
67
+ export * from "./lmove.js";
44
68
  export * from "./lpop.js";
45
69
  export * from "./lpos.js";
46
70
  export * from "./lpush.js";
@@ -82,6 +106,7 @@ export * from "./sinter.js";
82
106
  export * from "./sinterstore.js";
83
107
  export * from "./sismember.js";
84
108
  export * from "./smembers.js";
109
+ export * from "./smismember.js";
85
110
  export * from "./smove.js";
86
111
  export * from "./spop.js";
87
112
  export * from "./srandmember.js";
@@ -11,6 +11,9 @@ export class ScanCommand extends Command {
11
11
  if (typeof opts?.count === "number") {
12
12
  command.push("count", opts.count);
13
13
  }
14
+ if (opts?.type && opts.type.length > 0) {
15
+ command.push("type", opts.type);
16
+ }
14
17
  super(command, cmdOpts);
15
18
  }
16
19
  }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/smismember
4
+ */
5
+ export class SMIsMemberCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["smismember", cmd[0], ...cmd[1]], opts);
8
+ }
9
+ }
@@ -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
+ }
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
  */
@@ -72,6 +102,66 @@ export class HttpClient {
72
102
  if (!res.ok) {
73
103
  throw new UpstashError(body.error);
74
104
  }
105
+ if (this.options?.responseEncoding === "base64") {
106
+ return Array.isArray(body) ? body.map(decode) : decode(body);
107
+ }
75
108
  return body;
76
109
  }
77
110
  }
111
+ function base64decode(b64) {
112
+ let dec = "";
113
+ try {
114
+ /**
115
+ * Using only atob() is not enough because it doesn't work with unicode characters
116
+ */
117
+ const binString = atob(b64);
118
+ const size = binString.length;
119
+ const bytes = new Uint8Array(size);
120
+ for (let i = 0; i < size; i++) {
121
+ bytes[i] = binString.charCodeAt(i);
122
+ }
123
+ dec = new TextDecoder().decode(bytes);
124
+ }
125
+ catch {
126
+ dec = b64;
127
+ }
128
+ return dec;
129
+ // try {
130
+ // return decodeURIComponent(dec);
131
+ // } catch {
132
+ // return dec;
133
+ // }
134
+ }
135
+ function decode(raw) {
136
+ let result = undefined;
137
+ switch (typeof raw.result) {
138
+ case "undefined":
139
+ return raw;
140
+ case "number": {
141
+ result = raw.result;
142
+ break;
143
+ }
144
+ case "object": {
145
+ if (Array.isArray(raw.result)) {
146
+ result = raw.result.map((v) => typeof v === "string"
147
+ ? base64decode(v)
148
+ : Array.isArray(v)
149
+ ? v.map(base64decode)
150
+ : v);
151
+ }
152
+ else {
153
+ // If it's not an array it must be null
154
+ // Apparently null is an object in javascript
155
+ result = null;
156
+ }
157
+ break;
158
+ }
159
+ case "string": {
160
+ result = raw.result === "OK" ? "OK" : base64decode(raw.result);
161
+ break;
162
+ }
163
+ default:
164
+ break;
165
+ }
166
+ return { result, error: raw.error };
167
+ }
@@ -1,5 +1,8 @@
1
- import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, JsonArrAppendCommand, JsonArrIndexCommand, JsonArrInsertCommand, JsonArrLenCommand, JsonArrPopCommand, JsonArrTrimCommand, JsonClearCommand, JsonDelCommand, JsonForgetCommand, JsonGetCommand, JsonMGetCommand, JsonNumIncrByCommand, JsonNumMultByCommand, JsonObjKeysCommand, JsonObjLenCommand, JsonRespCommand, JsonSetCommand, JsonStrAppendCommand, JsonStrLenCommand, JsonToggleCommand, JsonTypeCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LMoveCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { UpstashError } from "./error.js";
3
+ import { ZMScoreCommand } from "./commands/zmscore.js";
4
+ import { HRandFieldCommand } from "./commands/hrandfield.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
3
6
  /**
4
7
  * Upstash REST API supports command pipelining to send multiple commands in
5
8
  * batch, instead of sending each command one by one and waiting for a response.
@@ -16,7 +19,7 @@ import { UpstashError } from "./error.js";
16
19
  * **Examples:**
17
20
  *
18
21
  * ```ts
19
- * const p = redis.pipeline()
22
+ * const p = redis.pipeline() // or redis.multi()
20
23
  * p.set("key","value")
21
24
  * p.get("key")
22
25
  * const res = await p.exec()
@@ -28,7 +31,7 @@ import { UpstashError } from "./error.js";
28
31
  * const res = await p.set("key","value").get("key").exec()
29
32
  * ```
30
33
  *
31
- * It's not possible to infer correct types with a dynamic pipeline, so you can
34
+ * Return types are inferred if all commands are chained, but you can still
32
35
  * override the response type manually:
33
36
  * ```ts
34
37
  * redis.pipeline()
@@ -39,7 +42,7 @@ import { UpstashError } from "./error.js";
39
42
  * ```
40
43
  */
41
44
  export class Pipeline {
42
- constructor(client, commandOptions) {
45
+ constructor(opts) {
43
46
  Object.defineProperty(this, "client", {
44
47
  enumerable: true,
45
48
  configurable: true,
@@ -58,14 +61,22 @@ export class Pipeline {
58
61
  writable: true,
59
62
  value: void 0
60
63
  });
64
+ Object.defineProperty(this, "multiExec", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
61
70
  /**
62
71
  * Send the pipeline request to upstash.
63
72
  *
64
73
  * Returns an array with the results of all pipelined commands.
65
74
  *
66
- * You can define a return type manually to make working in typescript easier
75
+ * If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
67
76
  * ```ts
68
- * redis.pipeline().get("key").exec<[{ greeting: string }]>()
77
+ * const p = redis.pipeline()
78
+ * p.get("key")
79
+ * const result = p.exec<[{ greeting: string }]>()
69
80
  * ```
70
81
  */
71
82
  Object.defineProperty(this, "exec", {
@@ -76,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,108 @@ 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
+ this.client = opts.client;
1189
+ 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
1190
+ this.commandOptions = opts.commandOptions;
1191
+ this.multiExec = opts.multiExec ?? false;
1125
1192
  }
1126
1193
  /**
1127
- * Pushes a command into the pipelien and returns a chainable instance of the
1194
+ * Pushes a command into the pipeline and returns a chainable instance of the
1128
1195
  * pipeline
1129
1196
  */
1130
1197
  chain(command) {
1131
1198
  this.commands.push(command);
1132
- return this;
1199
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1200
+ }
1201
+ /**
1202
+ * @see https://redis.io/commands/?group=json
1203
+ */
1204
+ get json() {
1205
+ return {
1206
+ /**
1207
+ * @see https://redis.io/commands/json.arrappend
1208
+ */
1209
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1210
+ /**
1211
+ * @see https://redis.io/commands/json.arrindex
1212
+ */
1213
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1214
+ /**
1215
+ * @see https://redis.io/commands/json.arrinsert
1216
+ */
1217
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1218
+ /**
1219
+ * @see https://redis.io/commands/json.arrlen
1220
+ */
1221
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1222
+ /**
1223
+ * @see https://redis.io/commands/json.arrpop
1224
+ */
1225
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1226
+ /**
1227
+ * @see https://redis.io/commands/json.arrtrim
1228
+ */
1229
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1230
+ /**
1231
+ * @see https://redis.io/commands/json.clear
1232
+ */
1233
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1234
+ /**
1235
+ * @see https://redis.io/commands/json.del
1236
+ */
1237
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1238
+ /**
1239
+ * @see https://redis.io/commands/json.forget
1240
+ */
1241
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1242
+ /**
1243
+ * @see https://redis.io/commands/json.get
1244
+ */
1245
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1246
+ /**
1247
+ * @see https://redis.io/commands/json.mget
1248
+ */
1249
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1250
+ /**
1251
+ * @see https://redis.io/commands/json.numincrby
1252
+ */
1253
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1254
+ /**
1255
+ * @see https://redis.io/commands/json.nummultby
1256
+ */
1257
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1258
+ /**
1259
+ * @see https://redis.io/commands/json.objkeys
1260
+ */
1261
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1262
+ /**
1263
+ * @see https://redis.io/commands/json.objlen
1264
+ */
1265
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1266
+ /**
1267
+ * @see https://redis.io/commands/json.resp
1268
+ */
1269
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1270
+ /**
1271
+ * @see https://redis.io/commands/json.set
1272
+ */
1273
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1274
+ /**
1275
+ * @see https://redis.io/commands/json.strappend
1276
+ */
1277
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1278
+ /**
1279
+ * @see https://redis.io/commands/json.strlen
1280
+ */
1281
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1282
+ /**
1283
+ * @see https://redis.io/commands/json.toggle
1284
+ */
1285
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1286
+ /**
1287
+ * @see https://redis.io/commands/json.type
1288
+ */
1289
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1290
+ };
1133
1291
  }
1134
1292
  }