@upstash/redis 0.0.0-ci.cc3aae65-20230625 → 0.0.0-ci.cd9a3478-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.
@@ -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,11 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geodist
4
+ */
5
+ export class GeoDistCommand extends Command {
6
+ constructor([key, member1, member2, unit = "M"], opts) {
7
+ const command = ["GEODIST", key];
8
+ command.push(member1, member2, unit);
9
+ super(command, opts);
10
+ }
11
+ }
@@ -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_dist.js";
18
20
  export * from "./get.js";
19
21
  export * from "./getbit.js";
20
22
  export * from "./getdel.js";
@@ -137,4 +139,7 @@ export * from "./zremrangebyscore.js";
137
139
  export * from "./zrevrank.js";
138
140
  export * from "./zscan.js";
139
141
  export * from "./zscore.js";
142
+ export * from "./zunion.js";
140
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
@@ -100,10 +100,17 @@ export class HttpClient {
100
100
  }
101
101
  const body = (await res.json());
102
102
  if (!res.ok) {
103
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
104
104
  }
105
105
  if (this.options?.responseEncoding === "base64") {
106
- 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 };
107
114
  }
108
115
  return body;
109
116
  }
@@ -134,19 +141,19 @@ function base64decode(b64) {
134
141
  }
135
142
  function decode(raw) {
136
143
  let result = undefined;
137
- switch (typeof raw.result) {
144
+ switch (typeof raw) {
138
145
  case "undefined":
139
146
  return raw;
140
147
  case "number": {
141
- result = raw.result;
148
+ result = raw;
142
149
  break;
143
150
  }
144
151
  case "object": {
145
- if (Array.isArray(raw.result)) {
146
- result = raw.result.map((v) => typeof v === "string"
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
147
154
  ? base64decode(v)
148
155
  : Array.isArray(v)
149
- ? v.map(base64decode)
156
+ ? v.map(decode)
150
157
  : v);
151
158
  }
152
159
  else {
@@ -157,11 +164,11 @@ function decode(raw) {
157
164
  break;
158
165
  }
159
166
  case "string": {
160
- result = raw.result === "OK" ? "OK" : base64decode(raw.result);
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
161
168
  break;
162
169
  }
163
170
  default:
164
171
  break;
165
172
  }
166
- return { result, error: raw.error };
173
+ return result;
167
174
  }
@@ -1,4 +1,4 @@
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";
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, ZUnionCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { UpstashError } from "./error.js";
3
3
  import { ZMScoreCommand } from "./commands/zmscore.js";
4
4
  import { HRandFieldCommand } from "./commands/hrandfield.js";
@@ -1185,11 +1185,26 @@ export class Pipeline {
1185
1185
  writable: true,
1186
1186
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1187
1187
  });
1188
+ /**
1189
+ * @see https://redis.io/commands/zunion
1190
+ */
1191
+ Object.defineProperty(this, "zunion", {
1192
+ enumerable: true,
1193
+ configurable: true,
1194
+ writable: true,
1195
+ value: (...args) => this.chain(new ZUnionCommand(args, this.commandOptions))
1196
+ });
1188
1197
  this.client = opts.client;
1189
1198
  this.commands = []; // the TCommands generic in the class definition is only used for carrying through chained command types and should never be explicitly set when instantiating the class
1190
1199
  this.commandOptions = opts.commandOptions;
1191
1200
  this.multiExec = opts.multiExec ?? false;
1192
1201
  }
1202
+ /**
1203
+ * Returns the length of pipeline before the execution
1204
+ */
1205
+ length() {
1206
+ return this.commands.length;
1207
+ }
1193
1208
  /**
1194
1209
  * Pushes a command into the pipeline and returns a chainable instance of the
1195
1210
  * pipeline
package/esm/pkg/redis.js CHANGED
@@ -1,4 +1,4 @@
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, HRandFieldCommand, 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";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GeoAddCommand, GeoDistCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HRandFieldCommand, 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, XAddCommand, XRangeCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { Pipeline } from "./pipeline.js";
3
3
  import { Script } from "./script.js";
4
4
  import { ZMScoreCommand } from "./commands/zmscore.js";
@@ -1005,6 +1005,24 @@ export class Redis {
1005
1005
  writable: true,
1006
1006
  value: (...args) => new UnlinkCommand(args, this.opts).exec(this.client)
1007
1007
  });
1008
+ /**
1009
+ * @see https://redis.io/commands/xadd
1010
+ */
1011
+ Object.defineProperty(this, "xadd", {
1012
+ enumerable: true,
1013
+ configurable: true,
1014
+ writable: true,
1015
+ value: (...args) => new XAddCommand(args, this.opts).exec(this.client)
1016
+ });
1017
+ /**
1018
+ * @see https://redis.io/commands/xrange
1019
+ */
1020
+ Object.defineProperty(this, "xrange", {
1021
+ enumerable: true,
1022
+ configurable: true,
1023
+ writable: true,
1024
+ value: (...args) => new XRangeCommand(args, this.opts).exec(this.client)
1025
+ });
1008
1026
  /**
1009
1027
  * @see https://redis.io/commands/zadd
1010
1028
  */
@@ -1181,6 +1199,15 @@ export class Redis {
1181
1199
  writable: true,
1182
1200
  value: (key, member) => new ZScoreCommand([key, member], this.opts).exec(this.client)
1183
1201
  });
1202
+ /**
1203
+ * @see https://redis.io/commands/zunion
1204
+ */
1205
+ Object.defineProperty(this, "zunion", {
1206
+ enumerable: true,
1207
+ configurable: true,
1208
+ writable: true,
1209
+ value: (...args) => new ZUnionCommand(args, this.opts).exec(this.client)
1210
+ });
1184
1211
  /**
1185
1212
  * @see https://redis.io/commands/zunionstore
1186
1213
  */
@@ -1232,6 +1259,14 @@ export class Redis {
1232
1259
  * @see https://redis.io/commands/json.forget
1233
1260
  */
1234
1261
  forget: (...args) => new JsonForgetCommand(args, this.opts).exec(this.client),
1262
+ /**
1263
+ * @see https://redis.io/commands/geoadd
1264
+ */
1265
+ geoadd: (...args) => new GeoAddCommand(args, this.opts).exec(this.client),
1266
+ /**
1267
+ * @see https://redis.io/commands/geodist
1268
+ */
1269
+ geodist: (...args) => new GeoDistCommand(args, this.opts).exec(this.client),
1235
1270
  /**
1236
1271
  * @see https://redis.io/commands/json.get
1237
1272
  */
@@ -35,7 +35,7 @@ export class Redis extends core.Redis {
35
35
  headers: { authorization: `Bearer ${configOrRequester.token}` },
36
36
  agent: configOrRequester.agent,
37
37
  responseEncoding: configOrRequester.responseEncoding,
38
- cache: "no-store",
38
+ cache: configOrRequester.cache || "no-store",
39
39
  });
40
40
  super(client, {
41
41
  automaticDeserialization: configOrRequester.automaticDeserialization,
package/esm/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = "v0.0.0-ci.cc3aae65-20230625";
1
+ export const VERSION = "v0.0.0-ci.cd9a3478-20231018";
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "main": "./script/platforms/nodejs.js",
4
4
  "types": "./types/platforms/nodejs.d.ts",
5
5
  "name": "@upstash/redis",
6
- "version": "v0.0.0-ci.cc3aae65-20230625",
6
+ "version": "v0.0.0-ci.cd9a3478-20231018",
7
7
  "description": "An HTTP/REST based Redis client built on top of Upstash REST API.",
8
8
  "repository": {
9
9
  "type": "git",
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeoAddCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/geoadd
7
+ */
8
+ class GeoAddCommand extends command_js_1.Command {
9
+ constructor([key, arg1, ...arg2], opts) {
10
+ const command = ["geoadd", key];
11
+ if ("nx" in arg1 && arg1.nx) {
12
+ command.push("nx");
13
+ }
14
+ else if ("xx" in arg1 && arg1.xx) {
15
+ command.push("xx");
16
+ }
17
+ if ("ch" in arg1 && arg1.ch) {
18
+ command.push("ch");
19
+ }
20
+ if ("latitude" in arg1 && arg1.latitude) {
21
+ command.push(arg1.longitude, arg1.latitude, arg1.member);
22
+ }
23
+ command.push(...arg2.flatMap(({ latitude, longitude, member }) => [
24
+ longitude,
25
+ latitude,
26
+ member,
27
+ ]));
28
+ super(command, opts);
29
+ }
30
+ }
31
+ exports.GeoAddCommand = GeoAddCommand;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeoDistCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/geodist
7
+ */
8
+ class GeoDistCommand extends command_js_1.Command {
9
+ constructor([key, member1, member2, unit = "M"], opts) {
10
+ const command = ["GEODIST", key];
11
+ command.push(member1, member2, unit);
12
+ super(command, opts);
13
+ }
14
+ }
15
+ exports.GeoDistCommand = GeoDistCommand;
@@ -31,6 +31,8 @@ __exportStar(require("./expire.js"), exports);
31
31
  __exportStar(require("./expireat.js"), exports);
32
32
  __exportStar(require("./flushall.js"), exports);
33
33
  __exportStar(require("./flushdb.js"), exports);
34
+ __exportStar(require("./geo_add.js"), exports);
35
+ __exportStar(require("./geo_dist.js"), exports);
34
36
  __exportStar(require("./get.js"), exports);
35
37
  __exportStar(require("./getbit.js"), exports);
36
38
  __exportStar(require("./getdel.js"), exports);
@@ -153,4 +155,7 @@ __exportStar(require("./zremrangebyscore.js"), exports);
153
155
  __exportStar(require("./zrevrank.js"), exports);
154
156
  __exportStar(require("./zscan.js"), exports);
155
157
  __exportStar(require("./zscore.js"), exports);
158
+ __exportStar(require("./zunion.js"), exports);
156
159
  __exportStar(require("./zunionstore.js"), exports);
160
+ __exportStar(require("./xadd.js"), exports);
161
+ __exportStar(require("./xrange.js"), exports);
@@ -31,7 +31,7 @@ class SetCommand extends command_js_1.Command {
31
31
  command.push("pxat", opts.pxat);
32
32
  }
33
33
  else if ("keepTtl" in opts && opts.keepTtl) {
34
- command.push("keepTtl", opts.keepTtl);
34
+ command.push("keepTtl");
35
35
  }
36
36
  }
37
37
  super(command, cmdOpts);
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XAddCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/xadd
7
+ */
8
+ class XAddCommand extends command_js_1.Command {
9
+ constructor([key, id, entries, opts], commandOptions) {
10
+ const command = ["XADD", key];
11
+ if (opts) {
12
+ if (opts.nomkStream) {
13
+ command.push("NOMKSTREAM");
14
+ }
15
+ if (opts.trim) {
16
+ command.push(opts.trim.type, opts.trim.comparison, opts.trim.threshold);
17
+ if (typeof opts.trim.limit !== "undefined") {
18
+ command.push("LIMIT", opts.trim.limit);
19
+ }
20
+ }
21
+ }
22
+ command.push(id);
23
+ // entries
24
+ Object.entries(entries).forEach(([k, v]) => {
25
+ command.push(k, v);
26
+ });
27
+ super(command, commandOptions);
28
+ }
29
+ }
30
+ exports.XAddCommand = XAddCommand;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XRangeCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ function deserialize(result) {
6
+ const obj = {};
7
+ for (const e of result) {
8
+ while (e.length >= 2) {
9
+ const streamId = e.shift();
10
+ const entries = e.shift();
11
+ if (!(streamId in obj)) {
12
+ obj[streamId] = {};
13
+ }
14
+ while (entries.length >= 2) {
15
+ const field = entries.shift();
16
+ const value = entries.shift();
17
+ try {
18
+ obj[streamId][field] = JSON.parse(value);
19
+ }
20
+ catch {
21
+ obj[streamId][field] = value;
22
+ }
23
+ }
24
+ }
25
+ }
26
+ return obj;
27
+ }
28
+ class XRangeCommand extends command_js_1.Command {
29
+ constructor([key, start, end, count], opts) {
30
+ const command = ["XRANGE", key, start, end];
31
+ if (typeof count === "number") {
32
+ command.push("COUNT", count);
33
+ }
34
+ super(command, {
35
+ deserialize: (result) => deserialize(result),
36
+ ...opts,
37
+ });
38
+ }
39
+ }
40
+ exports.XRangeCommand = XRangeCommand;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZUnionCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/zunion
7
+ */
8
+ class ZUnionCommand extends command_js_1.Command {
9
+ constructor([numKeys, keyOrKeys, opts], cmdOpts) {
10
+ const command = ["zunion", numKeys];
11
+ if (Array.isArray(keyOrKeys)) {
12
+ command.push(...keyOrKeys);
13
+ }
14
+ else {
15
+ command.push(keyOrKeys);
16
+ }
17
+ if (opts) {
18
+ if ("weights" in opts && opts.weights) {
19
+ command.push("weights", ...opts.weights);
20
+ }
21
+ else if ("weight" in opts && typeof opts.weight === "number") {
22
+ command.push("weights", opts.weight);
23
+ }
24
+ if ("aggregate" in opts) {
25
+ command.push("aggregate", opts.aggregate);
26
+ }
27
+ if (opts?.withScores) {
28
+ command.push("withscores");
29
+ }
30
+ }
31
+ super(command, cmdOpts);
32
+ }
33
+ }
34
+ exports.ZUnionCommand = ZUnionCommand;
@@ -103,10 +103,17 @@ class HttpClient {
103
103
  }
104
104
  const body = (await res.json());
105
105
  if (!res.ok) {
106
- throw new error_js_1.UpstashError(body.error);
106
+ throw new error_js_1.UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
107
107
  }
108
108
  if (this.options?.responseEncoding === "base64") {
109
- return Array.isArray(body) ? body.map(decode) : decode(body);
109
+ if (Array.isArray(body)) {
110
+ return body.map(({ result, error }) => ({
111
+ result: decode(result),
112
+ error,
113
+ }));
114
+ }
115
+ const result = decode(body.result);
116
+ return { result, error: body.error };
110
117
  }
111
118
  return body;
112
119
  }
@@ -138,19 +145,19 @@ function base64decode(b64) {
138
145
  }
139
146
  function decode(raw) {
140
147
  let result = undefined;
141
- switch (typeof raw.result) {
148
+ switch (typeof raw) {
142
149
  case "undefined":
143
150
  return raw;
144
151
  case "number": {
145
- result = raw.result;
152
+ result = raw;
146
153
  break;
147
154
  }
148
155
  case "object": {
149
- if (Array.isArray(raw.result)) {
150
- result = raw.result.map((v) => typeof v === "string"
156
+ if (Array.isArray(raw)) {
157
+ result = raw.map((v) => typeof v === "string"
151
158
  ? base64decode(v)
152
159
  : Array.isArray(v)
153
- ? v.map(base64decode)
160
+ ? v.map(decode)
154
161
  : v);
155
162
  }
156
163
  else {
@@ -161,11 +168,11 @@ function decode(raw) {
161
168
  break;
162
169
  }
163
170
  case "string": {
164
- result = raw.result === "OK" ? "OK" : base64decode(raw.result);
171
+ result = raw === "OK" ? "OK" : base64decode(raw);
165
172
  break;
166
173
  }
167
174
  default:
168
175
  break;
169
176
  }
170
- return { result, error: raw.error };
177
+ return result;
171
178
  }
@@ -1188,11 +1188,26 @@ class Pipeline {
1188
1188
  writable: true,
1189
1189
  value: (...args) => this.chain(new mod_js_1.ZUnionStoreCommand(args, this.commandOptions))
1190
1190
  });
1191
+ /**
1192
+ * @see https://redis.io/commands/zunion
1193
+ */
1194
+ Object.defineProperty(this, "zunion", {
1195
+ enumerable: true,
1196
+ configurable: true,
1197
+ writable: true,
1198
+ value: (...args) => this.chain(new mod_js_1.ZUnionCommand(args, this.commandOptions))
1199
+ });
1191
1200
  this.client = opts.client;
1192
1201
  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
1193
1202
  this.commandOptions = opts.commandOptions;
1194
1203
  this.multiExec = opts.multiExec ?? false;
1195
1204
  }
1205
+ /**
1206
+ * Returns the length of pipeline before the execution
1207
+ */
1208
+ length() {
1209
+ return this.commands.length;
1210
+ }
1196
1211
  /**
1197
1212
  * Pushes a command into the pipeline and returns a chainable instance of the
1198
1213
  * pipeline
@@ -1008,6 +1008,24 @@ class Redis {
1008
1008
  writable: true,
1009
1009
  value: (...args) => new mod_js_1.UnlinkCommand(args, this.opts).exec(this.client)
1010
1010
  });
1011
+ /**
1012
+ * @see https://redis.io/commands/xadd
1013
+ */
1014
+ Object.defineProperty(this, "xadd", {
1015
+ enumerable: true,
1016
+ configurable: true,
1017
+ writable: true,
1018
+ value: (...args) => new mod_js_1.XAddCommand(args, this.opts).exec(this.client)
1019
+ });
1020
+ /**
1021
+ * @see https://redis.io/commands/xrange
1022
+ */
1023
+ Object.defineProperty(this, "xrange", {
1024
+ enumerable: true,
1025
+ configurable: true,
1026
+ writable: true,
1027
+ value: (...args) => new mod_js_1.XRangeCommand(args, this.opts).exec(this.client)
1028
+ });
1011
1029
  /**
1012
1030
  * @see https://redis.io/commands/zadd
1013
1031
  */
@@ -1184,6 +1202,15 @@ class Redis {
1184
1202
  writable: true,
1185
1203
  value: (key, member) => new mod_js_1.ZScoreCommand([key, member], this.opts).exec(this.client)
1186
1204
  });
1205
+ /**
1206
+ * @see https://redis.io/commands/zunion
1207
+ */
1208
+ Object.defineProperty(this, "zunion", {
1209
+ enumerable: true,
1210
+ configurable: true,
1211
+ writable: true,
1212
+ value: (...args) => new mod_js_1.ZUnionCommand(args, this.opts).exec(this.client)
1213
+ });
1187
1214
  /**
1188
1215
  * @see https://redis.io/commands/zunionstore
1189
1216
  */
@@ -1235,6 +1262,14 @@ class Redis {
1235
1262
  * @see https://redis.io/commands/json.forget
1236
1263
  */
1237
1264
  forget: (...args) => new mod_js_1.JsonForgetCommand(args, this.opts).exec(this.client),
1265
+ /**
1266
+ * @see https://redis.io/commands/geoadd
1267
+ */
1268
+ geoadd: (...args) => new mod_js_1.GeoAddCommand(args, this.opts).exec(this.client),
1269
+ /**
1270
+ * @see https://redis.io/commands/geodist
1271
+ */
1272
+ geodist: (...args) => new mod_js_1.GeoDistCommand(args, this.opts).exec(this.client),
1238
1273
  /**
1239
1274
  * @see https://redis.io/commands/json.get
1240
1275
  */
@@ -61,7 +61,7 @@ class Redis extends core.Redis {
61
61
  headers: { authorization: `Bearer ${configOrRequester.token}` },
62
62
  agent: configOrRequester.agent,
63
63
  responseEncoding: configOrRequester.responseEncoding,
64
- cache: "no-store",
64
+ cache: configOrRequester.cache || "no-store",
65
65
  });
66
66
  super(client, {
67
67
  automaticDeserialization: configOrRequester.automaticDeserialization,
package/script/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "v0.0.0-ci.cc3aae65-20230625";
4
+ exports.VERSION = "v0.0.0-ci.cd9a3478-20231018";
@@ -0,0 +1,25 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export type GeoAddCommandOptions = {
3
+ nx?: boolean;
4
+ xx?: never;
5
+ } | ({
6
+ nx?: never;
7
+ xx?: boolean;
8
+ } & {
9
+ ch?: boolean;
10
+ });
11
+ export interface GeoMember<TMemberType> {
12
+ latitude: number;
13
+ longitude: number;
14
+ member: TMemberType;
15
+ }
16
+ /**
17
+ * @see https://redis.io/commands/geoadd
18
+ */
19
+ export declare class GeoAddCommand<TMemberType = string> extends Command<number | null, number | null> {
20
+ constructor([key, arg1, ...arg2]: [
21
+ string,
22
+ GeoMember<TMemberType> | GeoAddCommandOptions,
23
+ ...GeoMember<TMemberType>[]
24
+ ], opts?: CommandOptions<number | null, number | null>);
25
+ }
@@ -0,0 +1,12 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geodist
4
+ */
5
+ export declare class GeoDistCommand extends Command<number | null, number | null> {
6
+ constructor([key, member1, member2, unit]: [
7
+ key: string,
8
+ member1: string,
9
+ member2: string,
10
+ unit?: "M" | "KM" | "FT" | "MI"
11
+ ], opts?: CommandOptions<number | null, number | null>);
12
+ }
@@ -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_dist.js";
18
20
  export * from "./get.js";
19
21
  export * from "./getbit.js";
20
22
  export * from "./getdel.js";
@@ -137,4 +139,7 @@ export * from "./zremrangebyscore.js";
137
139
  export * from "./zrevrank.js";
138
140
  export * from "./zscan.js";
139
141
  export * from "./zscore.js";
142
+ export * from "./zunion.js";
140
143
  export * from "./zunionstore.js";
144
+ export * from "./xadd.js";
145
+ export * from "./xrange.js";
@@ -0,0 +1,31 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ type XAddCommandOptions = {
3
+ nomkStream?: boolean;
4
+ trim?: ({
5
+ type: "MAXLEN" | "maxlen";
6
+ threshold: number;
7
+ } | {
8
+ type: "MINID" | "minid";
9
+ threshold: string;
10
+ }) & ({
11
+ comparison: "~";
12
+ limit?: number;
13
+ } | {
14
+ comparison: "=";
15
+ limit?: never;
16
+ });
17
+ };
18
+ /**
19
+ * @see https://redis.io/commands/xadd
20
+ */
21
+ export declare class XAddCommand extends Command<string, string> {
22
+ constructor([key, id, entries, opts]: [
23
+ key: string,
24
+ id: "*" | string,
25
+ entries: {
26
+ [field: string]: unknown;
27
+ },
28
+ opts?: XAddCommandOptions
29
+ ], commandOptions?: CommandOptions<string, string>);
30
+ }
31
+ export {};
@@ -0,0 +1,9 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export declare class XRangeCommand<TData extends Record<string, Record<string, unknown>>> extends Command<string[][], TData> {
3
+ constructor([key, start, end, count]: [
4
+ key: string,
5
+ start: string,
6
+ end: string,
7
+ count?: number
8
+ ], opts?: CommandOptions<unknown[], TData[]>);
9
+ }
@@ -0,0 +1,29 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export type ZUnionCommandOptions = {
3
+ withScores?: boolean;
4
+ aggregate?: "sum" | "min" | "max";
5
+ } & ({
6
+ weight: number;
7
+ weights?: never;
8
+ } | {
9
+ weight?: never;
10
+ weights: number[];
11
+ } | {
12
+ weight?: never;
13
+ weights?: never;
14
+ });
15
+ /**
16
+ * @see https://redis.io/commands/zunion
17
+ */
18
+ export declare class ZUnionCommand<TData extends unknown[]> extends Command<string[], TData> {
19
+ constructor(cmd: [
20
+ numKeys: 1,
21
+ key: string,
22
+ opts?: ZUnionCommandOptions
23
+ ], cmdOpts?: CommandOptions<string[], TData>);
24
+ constructor(cmd: [
25
+ numKeys: number,
26
+ keys: string[],
27
+ opts?: ZUnionCommandOptions
28
+ ], cmdOpts?: CommandOptions<string[], TData>);
29
+ }
@@ -62,6 +62,11 @@ export type RequesterConfig = {
62
62
  * @default "base64"
63
63
  */
64
64
  responseEncoding?: false | "base64";
65
+ /**
66
+ * Configure the cache behaviour
67
+ * @default "no-store"
68
+ */
69
+ cache?: CacheSetting;
65
70
  };
66
71
  export type HttpClientConfig = {
67
72
  headers?: Record<string, string>;
@@ -69,7 +74,6 @@ export type HttpClientConfig = {
69
74
  options?: Options;
70
75
  retry?: RetryConfig;
71
76
  agent?: any;
72
- cache?: CacheSetting;
73
77
  } & RequesterConfig;
74
78
  export declare class HttpClient implements Requester {
75
79
  baseUrl: string;
@@ -66,6 +66,10 @@ export declare class Pipeline<TCommands extends Command<any, any>[] = []> {
66
66
  * ```
67
67
  */
68
68
  exec: <TCommandResults extends unknown[] = [] extends TCommands ? unknown[] : InferResponseData<TCommands>>() => Promise<TCommandResults>;
69
+ /**
70
+ * Returns the length of pipeline before the execution
71
+ */
72
+ length(): number;
69
73
  /**
70
74
  * Pushes a command into the pipeline and returns a chainable instance of the
71
75
  * pipeline
@@ -579,6 +583,10 @@ export declare class Pipeline<TCommands extends Command<any, any>[] = []> {
579
583
  * @see https://redis.io/commands/zunionstore
580
584
  */
581
585
  zunionstore: (destination: string, numKeys: number, keys: string[], opts?: import("./commands/zunionstore.js").ZUnionStoreCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
586
+ /**
587
+ * @see https://redis.io/commands/zunion
588
+ */
589
+ zunion: (numKeys: number, keys: string[], opts?: import("./commands/zunion.js").ZUnionCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, any>]>;
582
590
  /**
583
591
  * @see https://redis.io/commands/?group=json
584
592
  */
@@ -61,6 +61,14 @@ export declare class Redis {
61
61
  * @see https://redis.io/commands/json.forget
62
62
  */
63
63
  forget: (key: string, path?: string | undefined) => Promise<number>;
64
+ /**
65
+ * @see https://redis.io/commands/geoadd
66
+ */
67
+ geoadd: (args_0: string, args_1: import("./commands/geo_add.js").GeoAddCommandOptions | import("./commands/geo_add.js").GeoMember<unknown>, ...args_2: import("./commands/geo_add.js").GeoMember<unknown>[]) => Promise<number | null>;
68
+ /**
69
+ * @see https://redis.io/commands/geodist
70
+ */
71
+ geodist: (key: string, member1: string, member2: string, unit?: "M" | "KM" | "FT" | "MI" | undefined) => Promise<number | null>;
64
72
  /**
65
73
  * @see https://redis.io/commands/json.get
66
74
  */
@@ -562,6 +570,31 @@ export declare class Redis {
562
570
  * @see https://redis.io/commands/unlink
563
571
  */
564
572
  unlink: (...args: CommandArgs<typeof UnlinkCommand>) => Promise<number>;
573
+ /**
574
+ * @see https://redis.io/commands/xadd
575
+ */
576
+ xadd: (key: string, id: string, entries: {
577
+ [field: string]: unknown;
578
+ }, opts?: {
579
+ nomkStream?: boolean | undefined;
580
+ trim?: (({
581
+ type: "MAXLEN" | "maxlen";
582
+ threshold: number;
583
+ } | {
584
+ type: "MINID" | "minid";
585
+ threshold: string;
586
+ }) & ({
587
+ comparison: "~";
588
+ limit?: number | undefined;
589
+ } | {
590
+ comparison: "=";
591
+ limit?: undefined;
592
+ })) | undefined;
593
+ } | undefined) => Promise<string>;
594
+ /**
595
+ * @see https://redis.io/commands/xrange
596
+ */
597
+ xrange: (key: string, start: string, end: string, count?: number | undefined) => Promise<Record<string, Record<string, unknown>>>;
565
598
  /**
566
599
  * @see https://redis.io/commands/zadd
567
600
  */
@@ -652,6 +685,10 @@ export declare class Redis {
652
685
  * @see https://redis.io/commands/zscore
653
686
  */
654
687
  zscore: <TData>(key: string, member: TData) => Promise<number | null>;
688
+ /**
689
+ * @see https://redis.io/commands/zunion
690
+ */
691
+ zunion: (numKeys: number, keys: string[], opts?: import("./commands/zunion.js").ZUnionCommandOptions | undefined) => Promise<any>;
655
692
  /**
656
693
  * @see https://redis.io/commands/zunionstore
657
694
  */
@@ -1 +1 @@
1
- export declare const VERSION = "v0.0.0-ci.cc3aae65-20230625";
1
+ export declare const VERSION = "v0.0.0-ci.cd9a3478-20231018";