@upstash/redis 0.0.0-ci.608697de-20221215 → 0.0.0-ci.64609219-20231017

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 (129) hide show
  1. package/README.md +8 -1
  2. package/esm/pkg/commands/command.js +12 -3
  3. package/esm/pkg/commands/geo_add.js +27 -0
  4. package/esm/pkg/commands/json_arrappend.js +9 -0
  5. package/esm/pkg/commands/json_arrindex.js +9 -0
  6. package/esm/pkg/commands/json_arrinsert.js +9 -0
  7. package/esm/pkg/commands/json_arrlen.js +9 -0
  8. package/esm/pkg/commands/json_arrpop.js +9 -0
  9. package/esm/pkg/commands/json_arrtrim.js +12 -0
  10. package/esm/pkg/commands/json_clear.js +9 -0
  11. package/esm/pkg/commands/json_del.js +9 -0
  12. package/esm/pkg/commands/json_forget.js +9 -0
  13. package/esm/pkg/commands/json_get.js +30 -0
  14. package/esm/pkg/commands/json_mget.js +9 -0
  15. package/esm/pkg/commands/json_numincrby.js +9 -0
  16. package/esm/pkg/commands/json_nummultby.js +9 -0
  17. package/esm/pkg/commands/json_objkeys.js +9 -0
  18. package/esm/pkg/commands/json_objlen.js +9 -0
  19. package/esm/pkg/commands/json_resp.js +9 -0
  20. package/esm/pkg/commands/json_set.js +18 -0
  21. package/esm/pkg/commands/json_strappend.js +9 -0
  22. package/esm/pkg/commands/json_strlen.js +9 -0
  23. package/esm/pkg/commands/json_toggle.js +9 -0
  24. package/esm/pkg/commands/json_type.js +9 -0
  25. package/esm/pkg/commands/lmove.js +9 -0
  26. package/esm/pkg/commands/mod.js +27 -0
  27. package/esm/pkg/commands/set.js +1 -1
  28. package/esm/pkg/commands/smismember.js +9 -0
  29. package/esm/pkg/commands/xadd.js +26 -0
  30. package/esm/pkg/commands/xrange.js +36 -0
  31. package/esm/pkg/commands/zdiffstore.js +9 -0
  32. package/esm/pkg/commands/zunion.js +30 -0
  33. package/esm/pkg/http.js +42 -25
  34. package/esm/pkg/pipeline.js +143 -7
  35. package/esm/pkg/redis.js +177 -3
  36. package/esm/platforms/cloudflare.js +6 -6
  37. package/esm/platforms/fastly.js +5 -0
  38. package/esm/platforms/node_with_fetch.js +23 -11
  39. package/esm/platforms/nodejs.js +21 -11
  40. package/esm/version.js +1 -1
  41. package/package.json +53 -20
  42. package/script/pkg/commands/command.js +12 -3
  43. package/script/pkg/commands/geo_add.js +31 -0
  44. package/script/pkg/commands/json_arrappend.js +13 -0
  45. package/script/pkg/commands/json_arrindex.js +13 -0
  46. package/script/pkg/commands/json_arrinsert.js +13 -0
  47. package/script/pkg/commands/json_arrlen.js +13 -0
  48. package/script/pkg/commands/json_arrpop.js +13 -0
  49. package/script/pkg/commands/json_arrtrim.js +16 -0
  50. package/script/pkg/commands/json_clear.js +13 -0
  51. package/script/pkg/commands/json_del.js +13 -0
  52. package/script/pkg/commands/json_forget.js +13 -0
  53. package/script/pkg/commands/json_get.js +34 -0
  54. package/script/pkg/commands/json_mget.js +13 -0
  55. package/script/pkg/commands/json_numincrby.js +13 -0
  56. package/script/pkg/commands/json_nummultby.js +13 -0
  57. package/script/pkg/commands/json_objkeys.js +13 -0
  58. package/script/pkg/commands/json_objlen.js +13 -0
  59. package/script/pkg/commands/json_resp.js +13 -0
  60. package/script/pkg/commands/json_set.js +22 -0
  61. package/script/pkg/commands/json_strappend.js +13 -0
  62. package/script/pkg/commands/json_strlen.js +13 -0
  63. package/script/pkg/commands/json_toggle.js +13 -0
  64. package/script/pkg/commands/json_type.js +13 -0
  65. package/script/pkg/commands/lmove.js +13 -0
  66. package/script/pkg/commands/mod.js +27 -0
  67. package/script/pkg/commands/set.js +1 -1
  68. package/script/pkg/commands/smismember.js +13 -0
  69. package/script/pkg/commands/xadd.js +30 -0
  70. package/script/pkg/commands/xrange.js +40 -0
  71. package/script/pkg/commands/zdiffstore.js +13 -0
  72. package/script/pkg/commands/zunion.js +34 -0
  73. package/script/pkg/http.js +42 -25
  74. package/script/pkg/pipeline.js +142 -6
  75. package/script/pkg/redis.js +176 -2
  76. package/script/platforms/cloudflare.js +6 -6
  77. package/script/platforms/fastly.js +5 -0
  78. package/script/platforms/node_with_fetch.js +23 -11
  79. package/script/platforms/nodejs.js +21 -11
  80. package/script/version.js +1 -1
  81. package/types/pkg/commands/command.d.ts +5 -5
  82. package/types/pkg/commands/geo_add.d.ts +25 -0
  83. package/types/pkg/commands/hdel.d.ts +1 -1
  84. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  85. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  86. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  87. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  88. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  89. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  90. package/types/pkg/commands/json_clear.d.ts +7 -0
  91. package/types/pkg/commands/json_del.d.ts +7 -0
  92. package/types/pkg/commands/json_forget.d.ts +7 -0
  93. package/types/pkg/commands/json_get.d.ts +15 -0
  94. package/types/pkg/commands/json_mget.d.ts +7 -0
  95. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  96. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  97. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  98. package/types/pkg/commands/json_objlen.d.ts +7 -0
  99. package/types/pkg/commands/json_resp.d.ts +7 -0
  100. package/types/pkg/commands/json_set.d.ts +18 -0
  101. package/types/pkg/commands/json_strappend.d.ts +7 -0
  102. package/types/pkg/commands/json_strlen.d.ts +7 -0
  103. package/types/pkg/commands/json_toggle.d.ts +7 -0
  104. package/types/pkg/commands/json_type.d.ts +7 -0
  105. package/types/pkg/commands/lmove.d.ts +12 -0
  106. package/types/pkg/commands/mod.d.ts +27 -0
  107. package/types/pkg/commands/scan.d.ts +1 -1
  108. package/types/pkg/commands/script_flush.d.ts +1 -1
  109. package/types/pkg/commands/set.d.ts +3 -3
  110. package/types/pkg/commands/smembers.d.ts +2 -2
  111. package/types/pkg/commands/smismember.d.ts +7 -0
  112. package/types/pkg/commands/type.d.ts +1 -1
  113. package/types/pkg/commands/xadd.d.ts +31 -0
  114. package/types/pkg/commands/xrange.d.ts +9 -0
  115. package/types/pkg/commands/zadd.d.ts +3 -3
  116. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  117. package/types/pkg/commands/zinterstore.d.ts +1 -1
  118. package/types/pkg/commands/zrange.d.ts +1 -1
  119. package/types/pkg/commands/zunion.d.ts +29 -0
  120. package/types/pkg/commands/zunionstore.d.ts +1 -1
  121. package/types/pkg/http.d.ts +16 -23
  122. package/types/pkg/pipeline.d.ts +247 -126
  123. package/types/pkg/redis.d.ts +149 -13
  124. package/types/pkg/types.d.ts +27 -1
  125. package/types/platforms/cloudflare.d.ts +2 -2
  126. package/types/platforms/fastly.d.ts +1 -1
  127. package/types/platforms/node_with_fetch.d.ts +1 -1
  128. package/types/platforms/nodejs.d.ts +1 -1
  129. package/types/version.d.ts +1 -1
package/README.md CHANGED
@@ -27,7 +27,7 @@ supported.
27
27
 
28
28
  ### Install
29
29
 
30
- #### npm
30
+ #### Node.js
31
31
 
32
32
  ```bash
33
33
  npm install @upstash/redis
@@ -81,6 +81,13 @@ data = await redis.spop('animals', 1)
81
81
  console.log(data)
82
82
  ```
83
83
 
84
+ ## Troubleshooting
85
+
86
+ We have a
87
+ [dedicated page](https://docs.upstash.com/redis/sdks/javascriptsdk/troubleshooting)
88
+ for common problems. If you can't find a solution, please
89
+ [open an issue](https://github.com/upstash/upstash-redis/issues/new).
90
+
84
91
  ## Docs
85
92
 
86
93
  See [the documentation](https://docs.upstash.com/features/javascriptsdk) for
@@ -1,6 +1,15 @@
1
1
  import { UpstashError } from "../error.js";
2
2
  import { parseResponse } from "../util.js";
3
- const defaultSerializer = (c) => typeof c === "string" ? c : JSON.stringify(c);
3
+ const defaultSerializer = (c) => {
4
+ switch (typeof c) {
5
+ case "string":
6
+ case "number":
7
+ case "boolean":
8
+ return c;
9
+ default:
10
+ return JSON.stringify(c);
11
+ }
12
+ };
4
13
  /**
5
14
  * Command offers default (de)serialization and the exec method to all commands.
6
15
  *
@@ -37,7 +46,7 @@ export class Command {
37
46
  opts.automaticDeserialization
38
47
  ? opts?.deserialize ?? parseResponse
39
48
  : (x) => x;
40
- this.command = command.map(this.serialize);
49
+ this.command = command.map((c) => this.serialize(c));
41
50
  }
42
51
  /**
43
52
  * Execute the command using a client.
@@ -50,7 +59,7 @@ export class Command {
50
59
  throw new UpstashError(error);
51
60
  }
52
61
  if (typeof result === "undefined") {
53
- throw new Error(`Request did not return a result`);
62
+ throw new Error("Request did not return a result");
54
63
  }
55
64
  return this.deserialize(result);
56
65
  }
@@ -0,0 +1,27 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geoadd
4
+ */
5
+ export class GeoAddCommand extends Command {
6
+ constructor([key, arg1, ...arg2], opts) {
7
+ const command = ["geoadd", key];
8
+ if ("nx" in arg1 && arg1.nx) {
9
+ command.push("nx");
10
+ }
11
+ else if ("xx" in arg1 && arg1.xx) {
12
+ command.push("xx");
13
+ }
14
+ if ("ch" in arg1 && arg1.ch) {
15
+ command.push("ch");
16
+ }
17
+ if ("latitude" in arg1 && arg1.latitude) {
18
+ command.push(arg1.longitude, arg1.latitude, arg1.member);
19
+ }
20
+ command.push(...arg2.flatMap(({ latitude, longitude, member }) => [
21
+ longitude,
22
+ latitude,
23
+ member,
24
+ ]));
25
+ super(command, opts);
26
+ }
27
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrappend
4
+ */
5
+ export class JsonArrAppendCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.ARRAPPEND", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrindex
4
+ */
5
+ export class JsonArrIndexCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.ARRINDEX", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrinsert
4
+ */
5
+ export class JsonArrInsertCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.ARRINSERT", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrlen
4
+ */
5
+ export class JsonArrLenCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.ARRLEN", cmd[0], cmd[1] ?? "$"], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrpop
4
+ */
5
+ export class JsonArrPopCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.ARRPOP", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,12 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.arrtrim
4
+ */
5
+ export class JsonArrTrimCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const path = cmd[1] ?? "$";
8
+ const start = cmd[2] ?? 0;
9
+ const stop = cmd[3] ?? 0;
10
+ super(["JSON.ARRTRIM", cmd[0], path, start, stop], opts);
11
+ }
12
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.clear
4
+ */
5
+ export class JsonClearCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.CLEAR", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.del
4
+ */
5
+ export class JsonDelCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.DEL", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.forget
4
+ */
5
+ export class JsonForgetCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.FORGET", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,30 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.get
4
+ */
5
+ export class JsonGetCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const command = ["JSON.GET"];
8
+ if (typeof cmd[1] === "string") {
9
+ // @ts-ignore - we know this is a string
10
+ command.push(...cmd);
11
+ }
12
+ else {
13
+ command.push(cmd[0]);
14
+ if (cmd[1]) {
15
+ if (cmd[1].indent) {
16
+ command.push("INDENT", cmd[1].indent);
17
+ }
18
+ if (cmd[1].newline) {
19
+ command.push("NEWLINE", cmd[1].newline);
20
+ }
21
+ if (cmd[1].space) {
22
+ command.push("SPACE", cmd[1].space);
23
+ }
24
+ }
25
+ // @ts-ignore - we know this is a string
26
+ command.push(...cmd.slice(2));
27
+ }
28
+ super(command, opts);
29
+ }
30
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.mget
4
+ */
5
+ export class JsonMGetCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.MGET", ...cmd[0], cmd[1]], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.numincrby
4
+ */
5
+ export class JsonNumIncrByCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.NUMINCRBY", ...cmd], opts);
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/json.nummultby
4
+ */
5
+ export class JsonNumMultByCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ super(["JSON.NUMMULTBY", ...cmd], opts);
8
+ }
9
+ }
@@ -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
+ }
@@ -15,6 +15,7 @@ export * from "./expire.js";
15
15
  export * from "./expireat.js";
16
16
  export * from "./flushall.js";
17
17
  export * from "./flushdb.js";
18
+ export * from "./geo_add.js";
18
19
  export * from "./get.js";
19
20
  export * from "./getbit.js";
20
21
  export * from "./getdel.js";
@@ -39,10 +40,32 @@ export * from "./hvals.js";
39
40
  export * from "./incr.js";
40
41
  export * from "./incrby.js";
41
42
  export * from "./incrbyfloat.js";
43
+ export * from "./json_arrappend.js";
44
+ export * from "./json_arrindex.js";
45
+ export * from "./json_arrinsert.js";
46
+ export * from "./json_arrlen.js";
47
+ export * from "./json_arrpop.js";
48
+ export * from "./json_arrtrim.js";
49
+ export * from "./json_clear.js";
50
+ export * from "./json_del.js";
51
+ export * from "./json_forget.js";
52
+ export * from "./json_get.js";
53
+ export * from "./json_mget.js";
54
+ export * from "./json_numincrby.js";
55
+ export * from "./json_nummultby.js";
56
+ export * from "./json_objkeys.js";
57
+ export * from "./json_objlen.js";
58
+ export * from "./json_resp.js";
59
+ export * from "./json_set.js";
60
+ export * from "./json_strappend.js";
61
+ export * from "./json_strlen.js";
62
+ export * from "./json_toggle.js";
63
+ export * from "./json_type.js";
42
64
  export * from "./keys.js";
43
65
  export * from "./lindex.js";
44
66
  export * from "./linsert.js";
45
67
  export * from "./llen.js";
68
+ export * from "./lmove.js";
46
69
  export * from "./lpop.js";
47
70
  export * from "./lpos.js";
48
71
  export * from "./lpush.js";
@@ -84,6 +107,7 @@ export * from "./sinter.js";
84
107
  export * from "./sinterstore.js";
85
108
  export * from "./sismember.js";
86
109
  export * from "./smembers.js";
110
+ export * from "./smismember.js";
87
111
  export * from "./smove.js";
88
112
  export * from "./spop.js";
89
113
  export * from "./srandmember.js";
@@ -114,4 +138,7 @@ export * from "./zremrangebyscore.js";
114
138
  export * from "./zrevrank.js";
115
139
  export * from "./zscan.js";
116
140
  export * from "./zscore.js";
141
+ export * from "./zunion.js";
117
142
  export * from "./zunionstore.js";
143
+ export * from "./xadd.js";
144
+ export * from "./xrange.js";
@@ -28,7 +28,7 @@ export class SetCommand extends Command {
28
28
  command.push("pxat", opts.pxat);
29
29
  }
30
30
  else if ("keepTtl" in opts && opts.keepTtl) {
31
- command.push("keepTtl", opts.keepTtl);
31
+ command.push("keepTtl");
32
32
  }
33
33
  }
34
34
  super(command, cmdOpts);
@@ -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,26 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/xadd
4
+ */
5
+ export class XAddCommand extends Command {
6
+ constructor([key, id, entries, opts], commandOptions) {
7
+ const command = ["XADD", key];
8
+ if (opts) {
9
+ if (opts.nomkStream) {
10
+ command.push("NOMKSTREAM");
11
+ }
12
+ if (opts.trim) {
13
+ command.push(opts.trim.type, opts.trim.comparison, opts.trim.threshold);
14
+ if (typeof opts.trim.limit !== "undefined") {
15
+ command.push("LIMIT", opts.trim.limit);
16
+ }
17
+ }
18
+ }
19
+ command.push(id);
20
+ // entries
21
+ Object.entries(entries).forEach(([k, v]) => {
22
+ command.push(k, v);
23
+ });
24
+ super(command, commandOptions);
25
+ }
26
+ }
@@ -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,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
@@ -28,22 +28,14 @@ export class HttpClient {
28
28
  this.options = {
29
29
  backend: config.options?.backend,
30
30
  agent: config.agent,
31
- responseEncoding: config.responseEncoding ?? "base64", // default to base64
31
+ responseEncoding: config.responseEncoding ?? "base64",
32
+ cache: config.cache,
32
33
  };
33
34
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
34
35
  this.headers = {
35
36
  "Content-Type": "application/json",
36
37
  ...config.headers,
37
38
  };
38
- if (config.telemetry?.runtime) {
39
- this.headers["Upstash-Telemetry-Runtime"] = config.telemetry.runtime;
40
- }
41
- if (config.telemetry?.platform) {
42
- this.headers["Upstash-Telemetry-Platform"] = config.telemetry.platform;
43
- }
44
- if (config.telemetry?.sdk) {
45
- this.headers["Upstash-Telemetry-Sdk"] = config.telemetry.sdk;
46
- }
47
39
  if (this.options.responseEncoding === "base64") {
48
40
  this.headers["Upstash-Encoding"] = "base64";
49
41
  }
@@ -61,8 +53,26 @@ export class HttpClient {
61
53
  };
62
54
  }
63
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
+ }
64
73
  async request(req) {
65
74
  const requestOptions = {
75
+ cache: this.options.cache,
66
76
  method: "POST",
67
77
  headers: this.headers,
68
78
  body: JSON.stringify(req.body),
@@ -90,10 +100,17 @@ export class HttpClient {
90
100
  }
91
101
  const body = (await res.json());
92
102
  if (!res.ok) {
93
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
94
104
  }
95
105
  if (this.options?.responseEncoding === "base64") {
96
- return Array.isArray(body) ? body.map(decode) : decode(body);
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 };
97
114
  }
98
115
  return body;
99
116
  }
@@ -115,28 +132,28 @@ function base64decode(b64) {
115
132
  catch {
116
133
  dec = b64;
117
134
  }
118
- try {
119
- return decodeURIComponent(dec);
120
- }
121
- catch {
122
- return dec;
123
- }
135
+ return dec;
136
+ // try {
137
+ // return decodeURIComponent(dec);
138
+ // } catch {
139
+ // return dec;
140
+ // }
124
141
  }
125
142
  function decode(raw) {
126
143
  let result = undefined;
127
- switch (typeof raw.result) {
144
+ switch (typeof raw) {
128
145
  case "undefined":
129
146
  return raw;
130
147
  case "number": {
131
- result = raw.result;
148
+ result = raw;
132
149
  break;
133
150
  }
134
151
  case "object": {
135
- if (Array.isArray(raw.result)) {
136
- result = raw.result.map((v) => typeof v === "string"
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
137
154
  ? base64decode(v)
138
155
  : Array.isArray(v)
139
- ? v.map(base64decode)
156
+ ? v.map(decode)
140
157
  : v);
141
158
  }
142
159
  else {
@@ -147,11 +164,11 @@ function decode(raw) {
147
164
  break;
148
165
  }
149
166
  case "string": {
150
- result = raw.result === "OK" ? "OK" : base64decode(raw.result);
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
151
168
  break;
152
169
  }
153
170
  default:
154
171
  break;
155
172
  }
156
- return { result, error: raw.error };
173
+ return result;
157
174
  }