@upstash/redis 0.0.0-ci.b4d4a1cc → 0.0.0-ci.b8efaf97-20230119
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.
- package/README.md +43 -279
- package/esm/deps/deno.land/x/base64@v0.2.1/base.js +100 -0
- package/esm/deps/deno.land/x/base64@v0.2.1/base64url.js +9 -0
- package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
- package/esm/deps/deno.land/x/sha1@v1.0.3/mod.js +191 -0
- package/esm/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +50 -0
- package/esm/pkg/commands/getdel.js +9 -0
- package/esm/pkg/commands/hgetall.js +0 -4
- package/esm/pkg/commands/hrandfield.js +39 -0
- package/esm/pkg/commands/lmove.js +9 -0
- package/esm/pkg/commands/lpos.js +19 -0
- package/esm/pkg/commands/mod.js +5 -0
- package/esm/pkg/commands/scan.js +3 -0
- package/esm/pkg/commands/sdiffstore.js +1 -1
- package/esm/pkg/commands/set.js +16 -4
- package/esm/pkg/commands/smismember.js +9 -0
- package/esm/pkg/commands/zdiffstore.js +9 -0
- package/esm/pkg/commands/zmscore.js +10 -0
- package/esm/pkg/commands/zrange.js +6 -0
- package/esm/pkg/http.js +133 -8
- package/esm/pkg/pipeline.js +80 -6
- package/esm/pkg/redis.js +125 -2
- package/esm/pkg/script.js +77 -0
- package/esm/platforms/cloudflare.js +14 -26
- package/esm/platforms/fastly.js +5 -25
- package/esm/platforms/node_with_fetch.js +31 -26
- package/esm/platforms/nodejs.js +26 -26
- package/esm/version.js +1 -0
- package/package.json +1 -39
- package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
- package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
- package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
- package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
- package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
- package/script/pkg/commands/getdel.js +13 -0
- package/script/pkg/commands/hgetall.js +0 -4
- package/script/pkg/commands/hrandfield.js +43 -0
- package/script/pkg/commands/lmove.js +13 -0
- package/script/pkg/commands/lpos.js +23 -0
- package/script/pkg/commands/mod.js +5 -0
- package/script/pkg/commands/scan.js +3 -0
- package/script/pkg/commands/sdiffstore.js +1 -1
- package/script/pkg/commands/set.js +16 -4
- package/script/pkg/commands/smismember.js +13 -0
- package/script/pkg/commands/zdiffstore.js +13 -0
- package/script/pkg/commands/zmscore.js +14 -0
- package/script/pkg/commands/zrange.js +6 -0
- package/script/pkg/http.js +133 -8
- package/script/pkg/pipeline.js +79 -5
- package/script/pkg/redis.js +124 -1
- package/script/pkg/script.js +81 -0
- package/script/platforms/cloudflare.js +14 -26
- package/script/platforms/fastly.js +5 -25
- package/script/platforms/node_with_fetch.js +31 -26
- package/script/platforms/nodejs.js +26 -26
- package/script/version.js +4 -0
- package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
- package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
- package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
- package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
- package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
- package/types/pkg/commands/bitop.d.ts +0 -1
- package/types/pkg/commands/bitpos.d.ts +1 -1
- package/types/pkg/commands/getdel.d.ts +7 -0
- package/types/pkg/commands/hrandfield.d.ts +9 -0
- package/types/pkg/commands/lmove.d.ts +12 -0
- package/types/pkg/commands/lpop.d.ts +1 -1
- package/types/pkg/commands/lpos.d.ts +15 -0
- package/types/pkg/commands/mget.d.ts +1 -1
- package/types/pkg/commands/mod.d.ts +5 -0
- package/types/pkg/commands/rpop.d.ts +2 -2
- package/types/pkg/commands/scan.d.ts +1 -0
- package/types/pkg/commands/sdiffstore.d.ts +1 -1
- package/types/pkg/commands/set.d.ts +31 -2
- package/types/pkg/commands/smembers.d.ts +2 -2
- package/types/pkg/commands/smismember.d.ts +7 -0
- package/types/pkg/commands/spop.d.ts +2 -2
- package/types/pkg/commands/zadd.d.ts +1 -1
- package/types/pkg/commands/zdiffstore.d.ts +7 -0
- package/types/pkg/commands/zmscore.d.ts +7 -0
- package/types/pkg/commands/zrange.d.ts +7 -0
- package/types/pkg/http.d.ts +63 -5
- package/types/pkg/pipeline.d.ts +46 -9
- package/types/pkg/redis.d.ts +65 -9
- package/types/pkg/script.d.ts +42 -0
- package/types/pkg/types.d.ts +17 -0
- package/types/platforms/cloudflare.d.ts +8 -3
- package/types/platforms/fastly.d.ts +2 -2
- package/types/platforms/node_with_fetch.d.ts +2 -2
- package/types/platforms/nodejs.d.ts +18 -2
- package/types/version.d.ts +1 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { toUint8Array, fromUint8Array } from "../../../deno.land/x/base64@v0.2.1/base64url.js";
|
|
2
|
+
const decoder = new TextDecoder();
|
|
3
|
+
const encoder = new TextEncoder();
|
|
4
|
+
/** Serializes a Uint8Array to a hexadecimal string. */
|
|
5
|
+
function toHexString(buf) {
|
|
6
|
+
return buf.reduce((hex, byte) => `${hex}${byte < 16 ? "0" : ""}${byte.toString(16)}`, "");
|
|
7
|
+
}
|
|
8
|
+
/** Deserializes a Uint8Array from a hexadecimal string. */
|
|
9
|
+
function fromHexString(hex) {
|
|
10
|
+
const len = hex.length;
|
|
11
|
+
if (len % 2 || !/^[0-9a-fA-F]+$/.test(hex)) {
|
|
12
|
+
throw new TypeError("Invalid hex string.");
|
|
13
|
+
}
|
|
14
|
+
hex = hex.toLowerCase();
|
|
15
|
+
const buf = new Uint8Array(Math.floor(len / 2));
|
|
16
|
+
const end = len / 2;
|
|
17
|
+
for (let i = 0; i < end; ++i) {
|
|
18
|
+
buf[i] = parseInt(hex.substr(i * 2, 2), 16);
|
|
19
|
+
}
|
|
20
|
+
return buf;
|
|
21
|
+
}
|
|
22
|
+
/** Decodes a Uint8Array to utf8-, base64-, or hex-encoded string. */
|
|
23
|
+
export function decode(buf, encoding = "utf8") {
|
|
24
|
+
if (/^utf-?8$/i.test(encoding)) {
|
|
25
|
+
return decoder.decode(buf);
|
|
26
|
+
}
|
|
27
|
+
else if (/^base64$/i.test(encoding)) {
|
|
28
|
+
return fromUint8Array(buf);
|
|
29
|
+
}
|
|
30
|
+
else if (/^hex(?:adecimal)?$/i.test(encoding)) {
|
|
31
|
+
return toHexString(buf);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
throw new TypeError("Unsupported string encoding.");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function encode(str, encoding = "utf8") {
|
|
38
|
+
if (/^utf-?8$/i.test(encoding)) {
|
|
39
|
+
return encoder.encode(str);
|
|
40
|
+
}
|
|
41
|
+
else if (/^base64$/i.test(encoding)) {
|
|
42
|
+
return toUint8Array(str);
|
|
43
|
+
}
|
|
44
|
+
else if (/^hex(?:adecimal)?$/i.test(encoding)) {
|
|
45
|
+
return fromHexString(str);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new TypeError("Unsupported string encoding.");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from "./command.js";
|
|
2
|
+
function deserialize(result) {
|
|
3
|
+
if (result.length === 0) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const obj = {};
|
|
7
|
+
while (result.length >= 2) {
|
|
8
|
+
const key = result.shift();
|
|
9
|
+
const value = result.shift();
|
|
10
|
+
try {
|
|
11
|
+
obj[key] = JSON.parse(value);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
obj[key] = value;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return obj;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @see https://redis.io/commands/hrandfield
|
|
21
|
+
*/
|
|
22
|
+
export class HRandFieldCommand extends Command {
|
|
23
|
+
constructor(cmd, opts) {
|
|
24
|
+
const command = ["hrandfield", cmd[0]];
|
|
25
|
+
if (typeof cmd[1] === "number") {
|
|
26
|
+
command.push(cmd[1]);
|
|
27
|
+
}
|
|
28
|
+
if (cmd[2]) {
|
|
29
|
+
command.push("WITHVALUES");
|
|
30
|
+
}
|
|
31
|
+
super(command, {
|
|
32
|
+
// @ts-ignore TODO:
|
|
33
|
+
deserialize: cmd[2]
|
|
34
|
+
? (result) => deserialize(result)
|
|
35
|
+
: opts?.deserialize,
|
|
36
|
+
...opts,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "./command.js";
|
|
2
|
+
/**
|
|
3
|
+
* @see https://redis.io/commands/lpos
|
|
4
|
+
*/
|
|
5
|
+
export class LPosCommand extends Command {
|
|
6
|
+
constructor(cmd, opts) {
|
|
7
|
+
const args = ["lpos", cmd[0], cmd[1]];
|
|
8
|
+
if (typeof cmd[2]?.rank === "number") {
|
|
9
|
+
args.push("rank", cmd[2].rank);
|
|
10
|
+
}
|
|
11
|
+
if (typeof cmd[2]?.count === "number") {
|
|
12
|
+
args.push("count", cmd[2].count);
|
|
13
|
+
}
|
|
14
|
+
if (typeof cmd[2]?.maxLen === "number") {
|
|
15
|
+
args.push("maxLen", cmd[2].maxLen);
|
|
16
|
+
}
|
|
17
|
+
super(args, opts);
|
|
18
|
+
}
|
|
19
|
+
}
|
package/esm/pkg/commands/mod.js
CHANGED
|
@@ -17,11 +17,13 @@ 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";
|
|
23
24
|
export * from "./hexists.js";
|
|
24
25
|
export * from "./hget.js";
|
|
26
|
+
export * from "./smismember.js";
|
|
25
27
|
export * from "./hgetall.js";
|
|
26
28
|
export * from "./hincrby.js";
|
|
27
29
|
export * from "./hincrbyfloat.js";
|
|
@@ -29,6 +31,7 @@ export * from "./hkeys.js";
|
|
|
29
31
|
export * from "./hlen.js";
|
|
30
32
|
export * from "./hmget.js";
|
|
31
33
|
export * from "./hmset.js";
|
|
34
|
+
export * from "./hrandfield.js";
|
|
32
35
|
export * from "./hscan.js";
|
|
33
36
|
export * from "./hset.js";
|
|
34
37
|
export * from "./hsetnx.js";
|
|
@@ -41,7 +44,9 @@ export * from "./keys.js";
|
|
|
41
44
|
export * from "./lindex.js";
|
|
42
45
|
export * from "./linsert.js";
|
|
43
46
|
export * from "./llen.js";
|
|
47
|
+
export * from "./lmove.js";
|
|
44
48
|
export * from "./lpop.js";
|
|
49
|
+
export * from "./lpos.js";
|
|
45
50
|
export * from "./lpush.js";
|
|
46
51
|
export * from "./lpushx.js";
|
|
47
52
|
export * from "./lrange.js";
|
package/esm/pkg/commands/scan.js
CHANGED
package/esm/pkg/commands/set.js
CHANGED
|
@@ -6,17 +6,29 @@ export class SetCommand extends Command {
|
|
|
6
6
|
constructor([key, value, opts], cmdOpts) {
|
|
7
7
|
const command = ["set", key, value];
|
|
8
8
|
if (opts) {
|
|
9
|
+
if ("nx" in opts && opts.nx) {
|
|
10
|
+
command.push("nx");
|
|
11
|
+
}
|
|
12
|
+
else if ("xx" in opts && opts.xx) {
|
|
13
|
+
command.push("xx");
|
|
14
|
+
}
|
|
15
|
+
if ("get" in opts && opts.get) {
|
|
16
|
+
command.push("get");
|
|
17
|
+
}
|
|
9
18
|
if ("ex" in opts && typeof opts.ex === "number") {
|
|
10
19
|
command.push("ex", opts.ex);
|
|
11
20
|
}
|
|
12
21
|
else if ("px" in opts && typeof opts.px === "number") {
|
|
13
22
|
command.push("px", opts.px);
|
|
14
23
|
}
|
|
15
|
-
if ("
|
|
16
|
-
command.push("
|
|
24
|
+
else if ("exat" in opts && typeof opts.exat === "number") {
|
|
25
|
+
command.push("exat", opts.exat);
|
|
17
26
|
}
|
|
18
|
-
else if ("
|
|
19
|
-
command.push("
|
|
27
|
+
else if ("pxat" in opts && typeof opts.pxat === "number") {
|
|
28
|
+
command.push("pxat", opts.pxat);
|
|
29
|
+
}
|
|
30
|
+
else if ("keepTtl" in opts && opts.keepTtl) {
|
|
31
|
+
command.push("keepTtl", opts.keepTtl);
|
|
20
32
|
}
|
|
21
33
|
}
|
|
22
34
|
super(command, cmdOpts);
|
|
@@ -12,6 +12,12 @@ export class ZRangeCommand extends Command {
|
|
|
12
12
|
if (opts?.byLex) {
|
|
13
13
|
command.push("bylex");
|
|
14
14
|
}
|
|
15
|
+
if (opts?.rev) {
|
|
16
|
+
command.push("rev");
|
|
17
|
+
}
|
|
18
|
+
if (typeof opts?.count !== "undefined" && typeof opts?.offset !== "undefined") {
|
|
19
|
+
command.push("limit", opts.offset, opts.count);
|
|
20
|
+
}
|
|
15
21
|
if (opts?.withScores) {
|
|
16
22
|
command.push("withscores");
|
|
17
23
|
}
|
package/esm/pkg/http.js
CHANGED
|
@@ -19,31 +19,156 @@ export class HttpClient {
|
|
|
19
19
|
writable: true,
|
|
20
20
|
value: void 0
|
|
21
21
|
});
|
|
22
|
+
Object.defineProperty(this, "retry", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
value: void 0
|
|
27
|
+
});
|
|
28
|
+
this.options = {
|
|
29
|
+
backend: config.options?.backend,
|
|
30
|
+
agent: config.agent,
|
|
31
|
+
responseEncoding: config.responseEncoding ?? "base64", // default to base64
|
|
32
|
+
};
|
|
22
33
|
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
23
|
-
this.headers = {
|
|
24
|
-
|
|
34
|
+
this.headers = {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
...config.headers,
|
|
37
|
+
};
|
|
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
|
+
if (this.options.responseEncoding === "base64") {
|
|
48
|
+
this.headers["Upstash-Encoding"] = "base64";
|
|
49
|
+
}
|
|
50
|
+
if (typeof config?.retry === "boolean" && config?.retry === false) {
|
|
51
|
+
this.retry = {
|
|
52
|
+
attempts: 1,
|
|
53
|
+
backoff: () => 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.retry = {
|
|
58
|
+
attempts: config?.retry?.retries ?? 5,
|
|
59
|
+
backoff: config?.retry?.backoff ??
|
|
60
|
+
((retryCount) => Math.exp(retryCount) * 50),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
25
63
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
64
|
+
mergeTelemetry(telemetry) {
|
|
65
|
+
function merge(obj, key, value) {
|
|
66
|
+
if (!value) {
|
|
67
|
+
return obj;
|
|
68
|
+
}
|
|
69
|
+
if (obj[key]) {
|
|
70
|
+
obj[key] = [obj[key], value].join(",");
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
obj[key] = value;
|
|
74
|
+
}
|
|
75
|
+
return obj;
|
|
29
76
|
}
|
|
77
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Runtime", telemetry.runtime);
|
|
78
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Platform", telemetry.platform);
|
|
79
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Sdk", telemetry.sdk);
|
|
80
|
+
}
|
|
81
|
+
async request(req) {
|
|
30
82
|
const requestOptions = {
|
|
31
83
|
method: "POST",
|
|
32
84
|
headers: this.headers,
|
|
33
85
|
body: JSON.stringify(req.body),
|
|
34
86
|
keepalive: true,
|
|
87
|
+
agent: this.options?.agent,
|
|
35
88
|
/**
|
|
36
89
|
* Fastly specific
|
|
37
90
|
*/
|
|
38
91
|
backend: this.options?.backend,
|
|
39
92
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
93
|
+
let res = null;
|
|
94
|
+
let error = null;
|
|
95
|
+
for (let i = 0; i <= this.retry.attempts; i++) {
|
|
96
|
+
try {
|
|
97
|
+
res = await fetch([this.baseUrl, ...(req.path ?? [])].join("/"), requestOptions);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
error = err;
|
|
102
|
+
await new Promise((r) => setTimeout(r, this.retry.backoff(i)));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (!res) {
|
|
106
|
+
throw error ?? new Error("Exhausted all retries");
|
|
107
|
+
}
|
|
43
108
|
const body = (await res.json());
|
|
44
109
|
if (!res.ok) {
|
|
45
110
|
throw new UpstashError(body.error);
|
|
46
111
|
}
|
|
112
|
+
if (this.options?.responseEncoding === "base64") {
|
|
113
|
+
return Array.isArray(body) ? body.map(decode) : decode(body);
|
|
114
|
+
}
|
|
47
115
|
return body;
|
|
48
116
|
}
|
|
49
117
|
}
|
|
118
|
+
function base64decode(b64) {
|
|
119
|
+
let dec = "";
|
|
120
|
+
try {
|
|
121
|
+
/**
|
|
122
|
+
* Using only atob() is not enough because it doesn't work with unicode characters
|
|
123
|
+
*/
|
|
124
|
+
const binString = atob(b64);
|
|
125
|
+
const size = binString.length;
|
|
126
|
+
const bytes = new Uint8Array(size);
|
|
127
|
+
for (let i = 0; i < size; i++) {
|
|
128
|
+
bytes[i] = binString.charCodeAt(i);
|
|
129
|
+
}
|
|
130
|
+
dec = new TextDecoder().decode(bytes);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
dec = b64;
|
|
134
|
+
}
|
|
135
|
+
return dec;
|
|
136
|
+
// try {
|
|
137
|
+
// return decodeURIComponent(dec);
|
|
138
|
+
// } catch {
|
|
139
|
+
// return dec;
|
|
140
|
+
// }
|
|
141
|
+
}
|
|
142
|
+
function decode(raw) {
|
|
143
|
+
let result = undefined;
|
|
144
|
+
switch (typeof raw.result) {
|
|
145
|
+
case "undefined":
|
|
146
|
+
return raw;
|
|
147
|
+
case "number": {
|
|
148
|
+
result = raw.result;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "object": {
|
|
152
|
+
if (Array.isArray(raw.result)) {
|
|
153
|
+
result = raw.result.map((v) => typeof v === "string"
|
|
154
|
+
? base64decode(v)
|
|
155
|
+
: Array.isArray(v)
|
|
156
|
+
? v.map(base64decode)
|
|
157
|
+
: v);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// If it's not an array it must be null
|
|
161
|
+
// Apparently null is an object in javascript
|
|
162
|
+
result = null;
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case "string": {
|
|
167
|
+
result = raw.result === "OK" ? "OK" : base64decode(raw.result);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
return { result, error: raw.error };
|
|
174
|
+
}
|
package/esm/pkg/pipeline.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
|
|
1
|
+
import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, 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()
|
|
@@ -39,7 +42,7 @@ import { UpstashError } from "./error.js";
|
|
|
39
42
|
* ```
|
|
40
43
|
*/
|
|
41
44
|
export class Pipeline {
|
|
42
|
-
constructor(
|
|
45
|
+
constructor(opts) {
|
|
43
46
|
Object.defineProperty(this, "client", {
|
|
44
47
|
enumerable: true,
|
|
45
48
|
configurable: true,
|
|
@@ -58,6 +61,12 @@ 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
|
*
|
|
@@ -76,8 +85,9 @@ export class Pipeline {
|
|
|
76
85
|
if (this.commands.length === 0) {
|
|
77
86
|
throw new Error("Pipeline is empty");
|
|
78
87
|
}
|
|
88
|
+
const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
|
|
79
89
|
const res = (await this.client.request({
|
|
80
|
-
path
|
|
90
|
+
path,
|
|
81
91
|
body: Object.values(this.commands).map((c) => c.command),
|
|
82
92
|
}));
|
|
83
93
|
return res.map(({ error, result }, i) => {
|
|
@@ -124,6 +134,15 @@ export class Pipeline {
|
|
|
124
134
|
writable: true,
|
|
125
135
|
value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
|
|
126
136
|
});
|
|
137
|
+
/**
|
|
138
|
+
* @see https://redis.io/commands/zdiffstore
|
|
139
|
+
*/
|
|
140
|
+
Object.defineProperty(this, "zdiffstore", {
|
|
141
|
+
enumerable: true,
|
|
142
|
+
configurable: true,
|
|
143
|
+
writable: true,
|
|
144
|
+
value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
|
|
145
|
+
});
|
|
127
146
|
/**
|
|
128
147
|
* @see https://redis.io/commands/dbsize
|
|
129
148
|
*/
|
|
@@ -250,6 +269,15 @@ export class Pipeline {
|
|
|
250
269
|
writable: true,
|
|
251
270
|
value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
|
|
252
271
|
});
|
|
272
|
+
/**
|
|
273
|
+
* @see https://redis.io/commands/getdel
|
|
274
|
+
*/
|
|
275
|
+
Object.defineProperty(this, "getdel", {
|
|
276
|
+
enumerable: true,
|
|
277
|
+
configurable: true,
|
|
278
|
+
writable: true,
|
|
279
|
+
value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
|
|
280
|
+
});
|
|
253
281
|
/**
|
|
254
282
|
* @see https://redis.io/commands/getrange
|
|
255
283
|
*/
|
|
@@ -358,6 +386,15 @@ export class Pipeline {
|
|
|
358
386
|
writable: true,
|
|
359
387
|
value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
|
|
360
388
|
});
|
|
389
|
+
/**
|
|
390
|
+
* @see https://redis.io/commands/hrandfield
|
|
391
|
+
*/
|
|
392
|
+
Object.defineProperty(this, "hrandfield", {
|
|
393
|
+
enumerable: true,
|
|
394
|
+
configurable: true,
|
|
395
|
+
writable: true,
|
|
396
|
+
value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
|
|
397
|
+
});
|
|
361
398
|
/**
|
|
362
399
|
* @see https://redis.io/commands/hscan
|
|
363
400
|
*/
|
|
@@ -466,6 +503,15 @@ export class Pipeline {
|
|
|
466
503
|
writable: true,
|
|
467
504
|
value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
|
|
468
505
|
});
|
|
506
|
+
/**
|
|
507
|
+
* @see https://redis.io/commands/lmove
|
|
508
|
+
*/
|
|
509
|
+
Object.defineProperty(this, "lmove", {
|
|
510
|
+
enumerable: true,
|
|
511
|
+
configurable: true,
|
|
512
|
+
writable: true,
|
|
513
|
+
value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
|
|
514
|
+
});
|
|
469
515
|
/**
|
|
470
516
|
* @see https://redis.io/commands/lpop
|
|
471
517
|
*/
|
|
@@ -475,6 +521,15 @@ export class Pipeline {
|
|
|
475
521
|
writable: true,
|
|
476
522
|
value: (...args) => this.chain(new LPopCommand(args, this.commandOptions))
|
|
477
523
|
});
|
|
524
|
+
/**
|
|
525
|
+
* @see https://redis.io/commands/lpos
|
|
526
|
+
*/
|
|
527
|
+
Object.defineProperty(this, "lpos", {
|
|
528
|
+
enumerable: true,
|
|
529
|
+
configurable: true,
|
|
530
|
+
writable: true,
|
|
531
|
+
value: (...args) => this.chain(new LPosCommand(args, this.commandOptions))
|
|
532
|
+
});
|
|
478
533
|
/**
|
|
479
534
|
* @see https://redis.io/commands/lpush
|
|
480
535
|
*/
|
|
@@ -826,6 +881,15 @@ export class Pipeline {
|
|
|
826
881
|
writable: true,
|
|
827
882
|
value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
|
|
828
883
|
});
|
|
884
|
+
/**
|
|
885
|
+
* @see https://redis.io/commands/smismember
|
|
886
|
+
*/
|
|
887
|
+
Object.defineProperty(this, "smismember", {
|
|
888
|
+
enumerable: true,
|
|
889
|
+
configurable: true,
|
|
890
|
+
writable: true,
|
|
891
|
+
value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
|
|
892
|
+
});
|
|
829
893
|
/**
|
|
830
894
|
* @see https://redis.io/commands/smove
|
|
831
895
|
*/
|
|
@@ -1002,6 +1066,15 @@ export class Pipeline {
|
|
|
1002
1066
|
writable: true,
|
|
1003
1067
|
value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
|
|
1004
1068
|
});
|
|
1069
|
+
/**
|
|
1070
|
+
* @see https://redis.io/commands/zmscore
|
|
1071
|
+
*/
|
|
1072
|
+
Object.defineProperty(this, "zmscore", {
|
|
1073
|
+
enumerable: true,
|
|
1074
|
+
configurable: true,
|
|
1075
|
+
writable: true,
|
|
1076
|
+
value: (...args) => this.chain(new ZMScoreCommand(args, this.commandOptions))
|
|
1077
|
+
});
|
|
1005
1078
|
/**
|
|
1006
1079
|
* @see https://redis.io/commands/zpopmax
|
|
1007
1080
|
*/
|
|
@@ -1110,9 +1183,10 @@ export class Pipeline {
|
|
|
1110
1183
|
writable: true,
|
|
1111
1184
|
value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
|
|
1112
1185
|
});
|
|
1113
|
-
this.client = client;
|
|
1186
|
+
this.client = opts.client;
|
|
1114
1187
|
this.commands = [];
|
|
1115
|
-
this.commandOptions = commandOptions;
|
|
1188
|
+
this.commandOptions = opts.commandOptions;
|
|
1189
|
+
this.multiExec = opts.multiExec ?? false;
|
|
1116
1190
|
}
|
|
1117
1191
|
/**
|
|
1118
1192
|
* Pushes a command into the pipelien and returns a chainable instance of the
|