@upstash/redis 0.0.0-ci.bafaa360-20230119 → 0.0.0-ci.bc4f4560-20231018

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 (124) hide show
  1. package/README.md +1 -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/geo_hash.js +14 -0
  5. package/esm/pkg/commands/hgetall.js +9 -1
  6. package/esm/pkg/commands/json_arrappend.js +9 -0
  7. package/esm/pkg/commands/json_arrindex.js +9 -0
  8. package/esm/pkg/commands/json_arrinsert.js +9 -0
  9. package/esm/pkg/commands/json_arrlen.js +9 -0
  10. package/esm/pkg/commands/json_arrpop.js +9 -0
  11. package/esm/pkg/commands/json_arrtrim.js +12 -0
  12. package/esm/pkg/commands/json_clear.js +9 -0
  13. package/esm/pkg/commands/json_del.js +9 -0
  14. package/esm/pkg/commands/json_forget.js +9 -0
  15. package/esm/pkg/commands/json_get.js +30 -0
  16. package/esm/pkg/commands/json_mget.js +9 -0
  17. package/esm/pkg/commands/json_numincrby.js +9 -0
  18. package/esm/pkg/commands/json_nummultby.js +9 -0
  19. package/esm/pkg/commands/json_objkeys.js +9 -0
  20. package/esm/pkg/commands/json_objlen.js +9 -0
  21. package/esm/pkg/commands/json_resp.js +9 -0
  22. package/esm/pkg/commands/json_set.js +18 -0
  23. package/esm/pkg/commands/json_strappend.js +9 -0
  24. package/esm/pkg/commands/json_strlen.js +9 -0
  25. package/esm/pkg/commands/json_toggle.js +9 -0
  26. package/esm/pkg/commands/json_type.js +9 -0
  27. package/esm/pkg/commands/mod.js +27 -1
  28. package/esm/pkg/commands/set.js +1 -1
  29. package/esm/pkg/commands/xadd.js +26 -0
  30. package/esm/pkg/commands/xrange.js +36 -0
  31. package/esm/pkg/commands/zunion.js +30 -0
  32. package/esm/pkg/http.js +19 -19
  33. package/esm/pkg/pipeline.js +119 -7
  34. package/esm/pkg/redis.js +135 -1
  35. package/esm/platforms/cloudflare.js +6 -6
  36. package/esm/platforms/fastly.js +5 -0
  37. package/esm/platforms/node_with_fetch.js +10 -11
  38. package/esm/platforms/nodejs.js +13 -11
  39. package/esm/version.js +1 -1
  40. package/package.json +53 -20
  41. package/script/pkg/commands/command.js +12 -3
  42. package/script/pkg/commands/geo_add.js +31 -0
  43. package/script/pkg/commands/geo_hash.js +18 -0
  44. package/script/pkg/commands/hgetall.js +9 -1
  45. package/script/pkg/commands/json_arrappend.js +13 -0
  46. package/script/pkg/commands/json_arrindex.js +13 -0
  47. package/script/pkg/commands/json_arrinsert.js +13 -0
  48. package/script/pkg/commands/json_arrlen.js +13 -0
  49. package/script/pkg/commands/json_arrpop.js +13 -0
  50. package/script/pkg/commands/json_arrtrim.js +16 -0
  51. package/script/pkg/commands/json_clear.js +13 -0
  52. package/script/pkg/commands/json_del.js +13 -0
  53. package/script/pkg/commands/json_forget.js +13 -0
  54. package/script/pkg/commands/json_get.js +34 -0
  55. package/script/pkg/commands/json_mget.js +13 -0
  56. package/script/pkg/commands/json_numincrby.js +13 -0
  57. package/script/pkg/commands/json_nummultby.js +13 -0
  58. package/script/pkg/commands/json_objkeys.js +13 -0
  59. package/script/pkg/commands/json_objlen.js +13 -0
  60. package/script/pkg/commands/json_resp.js +13 -0
  61. package/script/pkg/commands/json_set.js +22 -0
  62. package/script/pkg/commands/json_strappend.js +13 -0
  63. package/script/pkg/commands/json_strlen.js +13 -0
  64. package/script/pkg/commands/json_toggle.js +13 -0
  65. package/script/pkg/commands/json_type.js +13 -0
  66. package/script/pkg/commands/mod.js +27 -1
  67. package/script/pkg/commands/set.js +1 -1
  68. package/script/pkg/commands/xadd.js +30 -0
  69. package/script/pkg/commands/xrange.js +40 -0
  70. package/script/pkg/commands/zunion.js +34 -0
  71. package/script/pkg/http.js +19 -19
  72. package/script/pkg/pipeline.js +118 -6
  73. package/script/pkg/redis.js +134 -0
  74. package/script/platforms/cloudflare.js +6 -6
  75. package/script/platforms/fastly.js +5 -0
  76. package/script/platforms/node_with_fetch.js +10 -11
  77. package/script/platforms/nodejs.js +13 -11
  78. package/script/version.js +1 -1
  79. package/types/pkg/commands/command.d.ts +5 -5
  80. package/types/pkg/commands/geo_add.d.ts +25 -0
  81. package/types/pkg/commands/geo_hash.d.ts +7 -0
  82. package/types/pkg/commands/hdel.d.ts +1 -1
  83. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  84. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  85. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  86. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  87. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  88. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  89. package/types/pkg/commands/json_clear.d.ts +7 -0
  90. package/types/pkg/commands/json_del.d.ts +7 -0
  91. package/types/pkg/commands/json_forget.d.ts +7 -0
  92. package/types/pkg/commands/json_get.d.ts +15 -0
  93. package/types/pkg/commands/json_mget.d.ts +7 -0
  94. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  95. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  96. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  97. package/types/pkg/commands/json_objlen.d.ts +7 -0
  98. package/types/pkg/commands/json_resp.d.ts +7 -0
  99. package/types/pkg/commands/json_set.d.ts +18 -0
  100. package/types/pkg/commands/json_strappend.d.ts +7 -0
  101. package/types/pkg/commands/json_strlen.d.ts +7 -0
  102. package/types/pkg/commands/json_toggle.d.ts +7 -0
  103. package/types/pkg/commands/json_type.d.ts +7 -0
  104. package/types/pkg/commands/mod.d.ts +27 -1
  105. package/types/pkg/commands/scan.d.ts +1 -1
  106. package/types/pkg/commands/script_flush.d.ts +1 -1
  107. package/types/pkg/commands/set.d.ts +3 -3
  108. package/types/pkg/commands/type.d.ts +1 -1
  109. package/types/pkg/commands/xadd.d.ts +31 -0
  110. package/types/pkg/commands/xrange.d.ts +9 -0
  111. package/types/pkg/commands/zadd.d.ts +3 -3
  112. package/types/pkg/commands/zinterstore.d.ts +1 -1
  113. package/types/pkg/commands/zrange.d.ts +1 -1
  114. package/types/pkg/commands/zunion.d.ts +29 -0
  115. package/types/pkg/commands/zunionstore.d.ts +1 -1
  116. package/types/pkg/http.d.ts +14 -7
  117. package/types/pkg/pipeline.d.ts +242 -129
  118. package/types/pkg/redis.d.ts +138 -13
  119. package/types/pkg/types.d.ts +11 -2
  120. package/types/platforms/cloudflare.d.ts +2 -2
  121. package/types/platforms/fastly.d.ts +1 -1
  122. package/types/platforms/node_with_fetch.d.ts +1 -1
  123. package/types/platforms/nodejs.d.ts +1 -1
  124. 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
@@ -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,14 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geohash
4
+ */
5
+ export class GeoHashCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const [key] = cmd;
8
+ // Check if the second argument is an array of strings (members).
9
+ // If it is, use it directly; if not, it means the members were passed individually,
10
+ // so we slice the cmd from the second element onwards to get the members.
11
+ const members = Array.isArray(cmd[1]) ? cmd[1] : cmd.slice(1);
12
+ super(["GEOHASH", key, ...members], opts);
13
+ }
14
+ }
@@ -8,7 +8,15 @@ function deserialize(result) {
8
8
  const key = result.shift();
9
9
  const value = result.shift();
10
10
  try {
11
- obj[key] = JSON.parse(value);
11
+ // handle unsafe integer
12
+ const valueIsNumberAndNotSafeInteger = !isNaN(Number(value)) &&
13
+ !Number.isSafeInteger(value);
14
+ if (valueIsNumberAndNotSafeInteger) {
15
+ obj[key] = value;
16
+ }
17
+ else {
18
+ obj[key] = JSON.parse(value);
19
+ }
12
20
  }
13
21
  catch {
14
22
  obj[key] = value;
@@ -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
+ }
@@ -15,6 +15,8 @@ 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";
19
+ export * from "./geo_hash.js";
18
20
  export * from "./get.js";
19
21
  export * from "./getbit.js";
20
22
  export * from "./getdel.js";
@@ -23,7 +25,6 @@ export * from "./getset.js";
23
25
  export * from "./hdel.js";
24
26
  export * from "./hexists.js";
25
27
  export * from "./hget.js";
26
- export * from "./smismember.js";
27
28
  export * from "./hgetall.js";
28
29
  export * from "./hincrby.js";
29
30
  export * from "./hincrbyfloat.js";
@@ -40,6 +41,27 @@ export * from "./hvals.js";
40
41
  export * from "./incr.js";
41
42
  export * from "./incrby.js";
42
43
  export * from "./incrbyfloat.js";
44
+ export * from "./json_arrappend.js";
45
+ export * from "./json_arrindex.js";
46
+ export * from "./json_arrinsert.js";
47
+ export * from "./json_arrlen.js";
48
+ export * from "./json_arrpop.js";
49
+ export * from "./json_arrtrim.js";
50
+ export * from "./json_clear.js";
51
+ export * from "./json_del.js";
52
+ export * from "./json_forget.js";
53
+ export * from "./json_get.js";
54
+ export * from "./json_mget.js";
55
+ export * from "./json_numincrby.js";
56
+ export * from "./json_nummultby.js";
57
+ export * from "./json_objkeys.js";
58
+ export * from "./json_objlen.js";
59
+ export * from "./json_resp.js";
60
+ export * from "./json_set.js";
61
+ export * from "./json_strappend.js";
62
+ export * from "./json_strlen.js";
63
+ export * from "./json_toggle.js";
64
+ export * from "./json_type.js";
43
65
  export * from "./keys.js";
44
66
  export * from "./lindex.js";
45
67
  export * from "./linsert.js";
@@ -86,6 +108,7 @@ export * from "./sinter.js";
86
108
  export * from "./sinterstore.js";
87
109
  export * from "./sismember.js";
88
110
  export * from "./smembers.js";
111
+ export * from "./smismember.js";
89
112
  export * from "./smove.js";
90
113
  export * from "./spop.js";
91
114
  export * from "./srandmember.js";
@@ -116,4 +139,7 @@ export * from "./zremrangebyscore.js";
116
139
  export * from "./zrevrank.js";
117
140
  export * from "./zscan.js";
118
141
  export * from "./zscore.js";
142
+ export * from "./zunion.js";
119
143
  export * from "./zunionstore.js";
144
+ export * from "./xadd.js";
145
+ 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,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,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
  }
@@ -80,6 +72,7 @@ export class HttpClient {
80
72
  }
81
73
  async request(req) {
82
74
  const requestOptions = {
75
+ cache: this.options.cache,
83
76
  method: "POST",
84
77
  headers: this.headers,
85
78
  body: JSON.stringify(req.body),
@@ -107,10 +100,17 @@ export class HttpClient {
107
100
  }
108
101
  const body = (await res.json());
109
102
  if (!res.ok) {
110
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
111
104
  }
112
105
  if (this.options?.responseEncoding === "base64") {
113
- 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 };
114
114
  }
115
115
  return body;
116
116
  }
@@ -141,19 +141,19 @@ function base64decode(b64) {
141
141
  }
142
142
  function decode(raw) {
143
143
  let result = undefined;
144
- switch (typeof raw.result) {
144
+ switch (typeof raw) {
145
145
  case "undefined":
146
146
  return raw;
147
147
  case "number": {
148
- result = raw.result;
148
+ result = raw;
149
149
  break;
150
150
  }
151
151
  case "object": {
152
- if (Array.isArray(raw.result)) {
153
- result = raw.result.map((v) => typeof v === "string"
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
154
154
  ? base64decode(v)
155
155
  : Array.isArray(v)
156
- ? v.map(base64decode)
156
+ ? v.map(decode)
157
157
  : v);
158
158
  }
159
159
  else {
@@ -164,11 +164,11 @@ function decode(raw) {
164
164
  break;
165
165
  }
166
166
  case "string": {
167
- result = raw.result === "OK" ? "OK" : base64decode(raw.result);
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
168
168
  break;
169
169
  }
170
170
  default:
171
171
  break;
172
172
  }
173
- return { result, error: raw.error };
173
+ return result;
174
174
  }