@upstash/redis 0.0.0-ci.5f29e95e → 0.0.0-ci.608697de-20221129
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 +14 -19
- 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/mod.js +2 -0
- package/esm/pkg/commands/scan.js +3 -0
- package/esm/pkg/commands/set.js +16 -4
- package/esm/pkg/commands/zmscore.js +10 -0
- package/esm/pkg/http.js +82 -2
- package/esm/pkg/pipeline.js +43 -6
- package/esm/pkg/redis.js +58 -2
- package/esm/pkg/script.js +77 -0
- package/esm/platforms/cloudflare.js +10 -2
- package/esm/platforms/fastly.js +1 -0
- package/esm/platforms/node_with_fetch.js +14 -1
- package/esm/platforms/nodejs.js +14 -1
- 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/mod.js +2 -0
- package/script/pkg/commands/scan.js +3 -0
- package/script/pkg/commands/set.js +16 -4
- package/script/pkg/commands/zmscore.js +14 -0
- package/script/pkg/http.js +82 -2
- package/script/pkg/pipeline.js +42 -5
- package/script/pkg/redis.js +57 -1
- package/script/pkg/script.js +81 -0
- package/script/platforms/cloudflare.js +10 -2
- package/script/platforms/fastly.js +1 -0
- package/script/platforms/node_with_fetch.js +14 -1
- package/script/platforms/nodejs.js +14 -1
- 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/getdel.d.ts +7 -0
- package/types/pkg/commands/hrandfield.d.ts +9 -0
- package/types/pkg/commands/mod.d.ts +2 -0
- package/types/pkg/commands/scan.d.ts +1 -0
- package/types/pkg/commands/set.d.ts +31 -2
- package/types/pkg/commands/zmscore.d.ts +7 -0
- package/types/pkg/http.d.ts +52 -4
- package/types/pkg/pipeline.d.ts +20 -3
- package/types/pkg/redis.d.ts +29 -1
- package/types/pkg/script.d.ts +42 -0
- package/types/platforms/cloudflare.d.ts +8 -7
- package/types/platforms/fastly.d.ts +2 -6
- package/types/platforms/node_with_fetch.d.ts +2 -21
- package/types/platforms/nodejs.d.ts +3 -6
- package/types/version.d.ts +1 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sha1 = exports.SHA1 = exports.BYTES = void 0;
|
|
4
|
+
const deps_js_1 = require("./deps.js");
|
|
5
|
+
function rotl(x, n) {
|
|
6
|
+
return (x << n) | (x >>> (32 - n));
|
|
7
|
+
}
|
|
8
|
+
/** Byte length of a SHA1 digest. */
|
|
9
|
+
exports.BYTES = 20;
|
|
10
|
+
/** A class representation of the SHA1 algorithm. */
|
|
11
|
+
class SHA1 {
|
|
12
|
+
/** Creates a SHA1 instance. */
|
|
13
|
+
constructor() {
|
|
14
|
+
Object.defineProperty(this, "hashSize", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: exports.BYTES
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(this, "_buf", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: new Uint8Array(64)
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(this, "_bufIdx", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: void 0
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(this, "_count", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: void 0
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(this, "_K", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: new Uint32Array([0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6])
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(this, "_H", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: void 0
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(this, "_finalized", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
writable: true,
|
|
54
|
+
value: void 0
|
|
55
|
+
});
|
|
56
|
+
this.init();
|
|
57
|
+
}
|
|
58
|
+
/** Reduces the four input numbers to a single one. */
|
|
59
|
+
static F(t, b, c, d) {
|
|
60
|
+
if (t <= 19) {
|
|
61
|
+
return (b & c) | (~b & d);
|
|
62
|
+
}
|
|
63
|
+
else if (t <= 39) {
|
|
64
|
+
return b ^ c ^ d;
|
|
65
|
+
}
|
|
66
|
+
else if (t <= 59) {
|
|
67
|
+
return (b & c) | (b & d) | (c & d);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return b ^ c ^ d;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Initializes a hash instance. */
|
|
74
|
+
init() {
|
|
75
|
+
// prettier-ignore
|
|
76
|
+
this._H = new Uint32Array([
|
|
77
|
+
0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0
|
|
78
|
+
]);
|
|
79
|
+
this._bufIdx = 0;
|
|
80
|
+
this._count = new Uint32Array(2);
|
|
81
|
+
this._buf.fill(0);
|
|
82
|
+
this._finalized = false;
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/** Updates a hash with additional message data. */
|
|
86
|
+
update(msg, inputEncoding) {
|
|
87
|
+
if (msg === null) {
|
|
88
|
+
throw new TypeError("msg must be a string or Uint8Array.");
|
|
89
|
+
}
|
|
90
|
+
else if (typeof msg === "string") {
|
|
91
|
+
msg = (0, deps_js_1.encode)(msg, inputEncoding);
|
|
92
|
+
}
|
|
93
|
+
// process the msg as many times as possible, the rest is stored in the buffer
|
|
94
|
+
// message is processed in 512 bit (64 byte chunks)
|
|
95
|
+
for (let i = 0; i < msg.length; i++) {
|
|
96
|
+
this._buf[this._bufIdx++] = msg[i];
|
|
97
|
+
if (this._bufIdx === 64) {
|
|
98
|
+
this.transform();
|
|
99
|
+
this._bufIdx = 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// counter update (number of message bits)
|
|
103
|
+
const c = this._count;
|
|
104
|
+
if ((c[0] += msg.length << 3) < msg.length << 3) {
|
|
105
|
+
c[1]++;
|
|
106
|
+
}
|
|
107
|
+
c[1] += msg.length >>> 29;
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
/** Finalizes a hash with additional message data. */
|
|
111
|
+
digest(outputEncoding) {
|
|
112
|
+
if (this._finalized) {
|
|
113
|
+
throw new Error("digest has already been called.");
|
|
114
|
+
}
|
|
115
|
+
this._finalized = true;
|
|
116
|
+
// append '1'
|
|
117
|
+
const b = this._buf;
|
|
118
|
+
let idx = this._bufIdx;
|
|
119
|
+
b[idx++] = 0x80;
|
|
120
|
+
// zeropad up to byte pos 56
|
|
121
|
+
while (idx !== 56) {
|
|
122
|
+
if (idx === 64) {
|
|
123
|
+
this.transform();
|
|
124
|
+
idx = 0;
|
|
125
|
+
}
|
|
126
|
+
b[idx++] = 0;
|
|
127
|
+
}
|
|
128
|
+
// append length in bits
|
|
129
|
+
const c = this._count;
|
|
130
|
+
b[56] = (c[1] >>> 24) & 0xff;
|
|
131
|
+
b[57] = (c[1] >>> 16) & 0xff;
|
|
132
|
+
b[58] = (c[1] >>> 8) & 0xff;
|
|
133
|
+
b[59] = (c[1] >>> 0) & 0xff;
|
|
134
|
+
b[60] = (c[0] >>> 24) & 0xff;
|
|
135
|
+
b[61] = (c[0] >>> 16) & 0xff;
|
|
136
|
+
b[62] = (c[0] >>> 8) & 0xff;
|
|
137
|
+
b[63] = (c[0] >>> 0) & 0xff;
|
|
138
|
+
this.transform();
|
|
139
|
+
// return the hash as byte array (20 bytes)
|
|
140
|
+
const hash = new Uint8Array(exports.BYTES);
|
|
141
|
+
for (let i = 0; i < 5; i++) {
|
|
142
|
+
hash[(i << 2) + 0] = (this._H[i] >>> 24) & 0xff;
|
|
143
|
+
hash[(i << 2) + 1] = (this._H[i] >>> 16) & 0xff;
|
|
144
|
+
hash[(i << 2) + 2] = (this._H[i] >>> 8) & 0xff;
|
|
145
|
+
hash[(i << 2) + 3] = (this._H[i] >>> 0) & 0xff;
|
|
146
|
+
}
|
|
147
|
+
// clear internal states and prepare for new hash
|
|
148
|
+
this.init();
|
|
149
|
+
return outputEncoding ? (0, deps_js_1.decode)(hash, outputEncoding) : hash;
|
|
150
|
+
}
|
|
151
|
+
/** Performs one transformation cycle. */
|
|
152
|
+
transform() {
|
|
153
|
+
const h = this._H;
|
|
154
|
+
let a = h[0];
|
|
155
|
+
let b = h[1];
|
|
156
|
+
let c = h[2];
|
|
157
|
+
let d = h[3];
|
|
158
|
+
let e = h[4];
|
|
159
|
+
// convert byte buffer to words
|
|
160
|
+
const w = new Uint32Array(80);
|
|
161
|
+
for (let i = 0; i < 16; i++) {
|
|
162
|
+
w[i] =
|
|
163
|
+
this._buf[(i << 2) + 3] |
|
|
164
|
+
(this._buf[(i << 2) + 2] << 8) |
|
|
165
|
+
(this._buf[(i << 2) + 1] << 16) |
|
|
166
|
+
(this._buf[i << 2] << 24);
|
|
167
|
+
}
|
|
168
|
+
for (let t = 0; t < 80; t++) {
|
|
169
|
+
if (t >= 16) {
|
|
170
|
+
w[t] = rotl(w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16], 1);
|
|
171
|
+
}
|
|
172
|
+
const tmp = (rotl(a, 5) +
|
|
173
|
+
SHA1.F(t, b, c, d) +
|
|
174
|
+
e +
|
|
175
|
+
w[t] +
|
|
176
|
+
this._K[Math.floor(t / 20)]) |
|
|
177
|
+
0;
|
|
178
|
+
e = d;
|
|
179
|
+
d = c;
|
|
180
|
+
c = rotl(b, 30);
|
|
181
|
+
b = a;
|
|
182
|
+
a = tmp;
|
|
183
|
+
}
|
|
184
|
+
h[0] = (h[0] + a) | 0;
|
|
185
|
+
h[1] = (h[1] + b) | 0;
|
|
186
|
+
h[2] = (h[2] + c) | 0;
|
|
187
|
+
h[3] = (h[3] + d) | 0;
|
|
188
|
+
h[4] = (h[4] + e) | 0;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.SHA1 = SHA1;
|
|
192
|
+
/** Generates a SHA1 hash of the input data. */
|
|
193
|
+
function sha1(msg, inputEncoding, outputEncoding) {
|
|
194
|
+
return new SHA1().update(msg, inputEncoding).digest(outputEncoding);
|
|
195
|
+
}
|
|
196
|
+
exports.sha1 = sha1;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encode = exports.decode = void 0;
|
|
4
|
+
const base64url_js_1 = require("../../../deno.land/x/base64@v0.2.1/base64url.js");
|
|
5
|
+
const decoder = new TextDecoder();
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
/** Serializes a Uint8Array to a hexadecimal string. */
|
|
8
|
+
function toHexString(buf) {
|
|
9
|
+
return buf.reduce((hex, byte) => `${hex}${byte < 16 ? "0" : ""}${byte.toString(16)}`, "");
|
|
10
|
+
}
|
|
11
|
+
/** Deserializes a Uint8Array from a hexadecimal string. */
|
|
12
|
+
function fromHexString(hex) {
|
|
13
|
+
const len = hex.length;
|
|
14
|
+
if (len % 2 || !/^[0-9a-fA-F]+$/.test(hex)) {
|
|
15
|
+
throw new TypeError("Invalid hex string.");
|
|
16
|
+
}
|
|
17
|
+
hex = hex.toLowerCase();
|
|
18
|
+
const buf = new Uint8Array(Math.floor(len / 2));
|
|
19
|
+
const end = len / 2;
|
|
20
|
+
for (let i = 0; i < end; ++i) {
|
|
21
|
+
buf[i] = parseInt(hex.substr(i * 2, 2), 16);
|
|
22
|
+
}
|
|
23
|
+
return buf;
|
|
24
|
+
}
|
|
25
|
+
/** Decodes a Uint8Array to utf8-, base64-, or hex-encoded string. */
|
|
26
|
+
function decode(buf, encoding = "utf8") {
|
|
27
|
+
if (/^utf-?8$/i.test(encoding)) {
|
|
28
|
+
return decoder.decode(buf);
|
|
29
|
+
}
|
|
30
|
+
else if (/^base64$/i.test(encoding)) {
|
|
31
|
+
return (0, base64url_js_1.fromUint8Array)(buf);
|
|
32
|
+
}
|
|
33
|
+
else if (/^hex(?:adecimal)?$/i.test(encoding)) {
|
|
34
|
+
return toHexString(buf);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new TypeError("Unsupported string encoding.");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.decode = decode;
|
|
41
|
+
function encode(str, encoding = "utf8") {
|
|
42
|
+
if (/^utf-?8$/i.test(encoding)) {
|
|
43
|
+
return encoder.encode(str);
|
|
44
|
+
}
|
|
45
|
+
else if (/^base64$/i.test(encoding)) {
|
|
46
|
+
return (0, base64url_js_1.toUint8Array)(str);
|
|
47
|
+
}
|
|
48
|
+
else if (/^hex(?:adecimal)?$/i.test(encoding)) {
|
|
49
|
+
return fromHexString(str);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new TypeError("Unsupported string encoding.");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.encode = encode;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GetDelCommand = void 0;
|
|
4
|
+
const command_js_1 = require("./command.js");
|
|
5
|
+
/**
|
|
6
|
+
* @see https://redis.io/commands/getdel
|
|
7
|
+
*/
|
|
8
|
+
class GetDelCommand extends command_js_1.Command {
|
|
9
|
+
constructor(cmd, opts) {
|
|
10
|
+
super(["getdel", ...cmd], opts);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.GetDelCommand = GetDelCommand;
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HGetAllCommand = void 0;
|
|
4
4
|
const command_js_1 = require("./command.js");
|
|
5
|
-
/**
|
|
6
|
-
* @param result De
|
|
7
|
-
* @returns
|
|
8
|
-
*/
|
|
9
5
|
function deserialize(result) {
|
|
10
6
|
if (result.length === 0) {
|
|
11
7
|
return null;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HRandFieldCommand = void 0;
|
|
4
|
+
const command_js_1 = require("./command.js");
|
|
5
|
+
function deserialize(result) {
|
|
6
|
+
if (result.length === 0) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const obj = {};
|
|
10
|
+
while (result.length >= 2) {
|
|
11
|
+
const key = result.shift();
|
|
12
|
+
const value = result.shift();
|
|
13
|
+
try {
|
|
14
|
+
obj[key] = JSON.parse(value);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
obj[key] = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @see https://redis.io/commands/hrandfield
|
|
24
|
+
*/
|
|
25
|
+
class HRandFieldCommand extends command_js_1.Command {
|
|
26
|
+
constructor(cmd, opts) {
|
|
27
|
+
const command = ["hrandfield", cmd[0]];
|
|
28
|
+
if (typeof cmd[1] === "number") {
|
|
29
|
+
command.push(cmd[1]);
|
|
30
|
+
}
|
|
31
|
+
if (cmd[2]) {
|
|
32
|
+
command.push("WITHVALUES");
|
|
33
|
+
}
|
|
34
|
+
super(command, {
|
|
35
|
+
// @ts-ignore TODO:
|
|
36
|
+
deserialize: cmd[2]
|
|
37
|
+
? (result) => deserialize(result)
|
|
38
|
+
: opts?.deserialize,
|
|
39
|
+
...opts,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.HRandFieldCommand = HRandFieldCommand;
|
|
@@ -33,6 +33,7 @@ __exportStar(require("./flushall.js"), exports);
|
|
|
33
33
|
__exportStar(require("./flushdb.js"), exports);
|
|
34
34
|
__exportStar(require("./get.js"), exports);
|
|
35
35
|
__exportStar(require("./getbit.js"), exports);
|
|
36
|
+
__exportStar(require("./getdel.js"), exports);
|
|
36
37
|
__exportStar(require("./getrange.js"), exports);
|
|
37
38
|
__exportStar(require("./getset.js"), exports);
|
|
38
39
|
__exportStar(require("./hdel.js"), exports);
|
|
@@ -45,6 +46,7 @@ __exportStar(require("./hkeys.js"), exports);
|
|
|
45
46
|
__exportStar(require("./hlen.js"), exports);
|
|
46
47
|
__exportStar(require("./hmget.js"), exports);
|
|
47
48
|
__exportStar(require("./hmset.js"), exports);
|
|
49
|
+
__exportStar(require("./hrandfield.js"), exports);
|
|
48
50
|
__exportStar(require("./hscan.js"), exports);
|
|
49
51
|
__exportStar(require("./hset.js"), exports);
|
|
50
52
|
__exportStar(require("./hsetnx.js"), exports);
|
|
@@ -9,17 +9,29 @@ class SetCommand extends command_js_1.Command {
|
|
|
9
9
|
constructor([key, value, opts], cmdOpts) {
|
|
10
10
|
const command = ["set", key, value];
|
|
11
11
|
if (opts) {
|
|
12
|
+
if ("nx" in opts && opts.nx) {
|
|
13
|
+
command.push("nx");
|
|
14
|
+
}
|
|
15
|
+
else if ("xx" in opts && opts.xx) {
|
|
16
|
+
command.push("xx");
|
|
17
|
+
}
|
|
18
|
+
if ("get" in opts && opts.get) {
|
|
19
|
+
command.push("get");
|
|
20
|
+
}
|
|
12
21
|
if ("ex" in opts && typeof opts.ex === "number") {
|
|
13
22
|
command.push("ex", opts.ex);
|
|
14
23
|
}
|
|
15
24
|
else if ("px" in opts && typeof opts.px === "number") {
|
|
16
25
|
command.push("px", opts.px);
|
|
17
26
|
}
|
|
18
|
-
if ("
|
|
19
|
-
command.push("
|
|
27
|
+
else if ("exat" in opts && typeof opts.exat === "number") {
|
|
28
|
+
command.push("exat", opts.exat);
|
|
20
29
|
}
|
|
21
|
-
else if ("
|
|
22
|
-
command.push("
|
|
30
|
+
else if ("pxat" in opts && typeof opts.pxat === "number") {
|
|
31
|
+
command.push("pxat", opts.pxat);
|
|
32
|
+
}
|
|
33
|
+
else if ("keepTtl" in opts && opts.keepTtl) {
|
|
34
|
+
command.push("keepTtl", opts.keepTtl);
|
|
23
35
|
}
|
|
24
36
|
}
|
|
25
37
|
super(command, cmdOpts);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZMScoreCommand = void 0;
|
|
4
|
+
const command_js_1 = require("./command.js");
|
|
5
|
+
/**
|
|
6
|
+
* @see https://redis.io/commands/zmscore
|
|
7
|
+
*/
|
|
8
|
+
class ZMScoreCommand extends command_js_1.Command {
|
|
9
|
+
constructor(cmd, opts) {
|
|
10
|
+
const [key, members] = cmd;
|
|
11
|
+
super(["zmscore", key, ...members], opts);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ZMScoreCommand = ZMScoreCommand;
|
package/script/pkg/http.js
CHANGED
|
@@ -28,9 +28,28 @@ class HttpClient {
|
|
|
28
28
|
writable: true,
|
|
29
29
|
value: void 0
|
|
30
30
|
});
|
|
31
|
+
this.options = {
|
|
32
|
+
backend: config.options?.backend,
|
|
33
|
+
agent: config.agent,
|
|
34
|
+
responseEncoding: config.responseEncoding ?? "base64", // default to base64
|
|
35
|
+
};
|
|
31
36
|
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
32
|
-
this.headers = {
|
|
33
|
-
|
|
37
|
+
this.headers = {
|
|
38
|
+
"Content-Type": "application/json",
|
|
39
|
+
...config.headers,
|
|
40
|
+
};
|
|
41
|
+
if (config.telemetry?.runtime) {
|
|
42
|
+
this.headers["Upstash-Telemetry-Runtime"] = config.telemetry.runtime;
|
|
43
|
+
}
|
|
44
|
+
if (config.telemetry?.platform) {
|
|
45
|
+
this.headers["Upstash-Telemetry-Platform"] = config.telemetry.platform;
|
|
46
|
+
}
|
|
47
|
+
if (config.telemetry?.sdk) {
|
|
48
|
+
this.headers["Upstash-Telemetry-Sdk"] = config.telemetry.sdk;
|
|
49
|
+
}
|
|
50
|
+
if (this.options.responseEncoding === "base64") {
|
|
51
|
+
this.headers["Upstash-Encoding"] = "base64";
|
|
52
|
+
}
|
|
34
53
|
if (typeof config?.retry === "boolean" && config?.retry === false) {
|
|
35
54
|
this.retry = {
|
|
36
55
|
attempts: 1,
|
|
@@ -51,6 +70,7 @@ class HttpClient {
|
|
|
51
70
|
headers: this.headers,
|
|
52
71
|
body: JSON.stringify(req.body),
|
|
53
72
|
keepalive: true,
|
|
73
|
+
agent: this.options?.agent,
|
|
54
74
|
/**
|
|
55
75
|
* Fastly specific
|
|
56
76
|
*/
|
|
@@ -75,7 +95,67 @@ class HttpClient {
|
|
|
75
95
|
if (!res.ok) {
|
|
76
96
|
throw new error_js_1.UpstashError(body.error);
|
|
77
97
|
}
|
|
98
|
+
if (this.options?.responseEncoding === "base64") {
|
|
99
|
+
return Array.isArray(body) ? body.map(decode) : decode(body);
|
|
100
|
+
}
|
|
78
101
|
return body;
|
|
79
102
|
}
|
|
80
103
|
}
|
|
81
104
|
exports.HttpClient = HttpClient;
|
|
105
|
+
function base64decode(b64) {
|
|
106
|
+
let dec = "";
|
|
107
|
+
try {
|
|
108
|
+
/**
|
|
109
|
+
* Using only atob() is not enough because it doesn't work with unicode characters
|
|
110
|
+
*/
|
|
111
|
+
const binString = atob(b64);
|
|
112
|
+
const size = binString.length;
|
|
113
|
+
const bytes = new Uint8Array(size);
|
|
114
|
+
for (let i = 0; i < size; i++) {
|
|
115
|
+
bytes[i] = binString.charCodeAt(i);
|
|
116
|
+
}
|
|
117
|
+
dec = new TextDecoder().decode(bytes);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
dec = b64;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return decodeURIComponent(dec);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return dec;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function decode(raw) {
|
|
130
|
+
let result = undefined;
|
|
131
|
+
switch (typeof raw.result) {
|
|
132
|
+
case "undefined":
|
|
133
|
+
return raw;
|
|
134
|
+
case "number": {
|
|
135
|
+
result = raw.result;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case "object": {
|
|
139
|
+
if (Array.isArray(raw.result)) {
|
|
140
|
+
result = raw.result.map((v) => typeof v === "string"
|
|
141
|
+
? base64decode(v)
|
|
142
|
+
: Array.isArray(v)
|
|
143
|
+
? v.map(base64decode)
|
|
144
|
+
: v);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
// If it's not an array it must be null
|
|
148
|
+
// Apparently null is an object in javascript
|
|
149
|
+
result = null;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case "string": {
|
|
154
|
+
result = raw.result === "OK" ? "OK" : base64decode(raw.result);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
default:
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
return { result, error: raw.error };
|
|
161
|
+
}
|
package/script/pkg/pipeline.js
CHANGED
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Pipeline = void 0;
|
|
4
4
|
const mod_js_1 = require("./commands/mod.js");
|
|
5
5
|
const error_js_1 = require("./error.js");
|
|
6
|
+
const zmscore_js_1 = require("./commands/zmscore.js");
|
|
7
|
+
const hrandfield_js_1 = require("./commands/hrandfield.js");
|
|
6
8
|
/**
|
|
7
9
|
* Upstash REST API supports command pipelining to send multiple commands in
|
|
8
10
|
* batch, instead of sending each command one by one and waiting for a response.
|
|
@@ -19,7 +21,7 @@ const error_js_1 = require("./error.js");
|
|
|
19
21
|
* **Examples:**
|
|
20
22
|
*
|
|
21
23
|
* ```ts
|
|
22
|
-
* const p = redis.pipeline()
|
|
24
|
+
* const p = redis.pipeline() // or redis.multi()
|
|
23
25
|
* p.set("key","value")
|
|
24
26
|
* p.get("key")
|
|
25
27
|
* const res = await p.exec()
|
|
@@ -42,7 +44,7 @@ const error_js_1 = require("./error.js");
|
|
|
42
44
|
* ```
|
|
43
45
|
*/
|
|
44
46
|
class Pipeline {
|
|
45
|
-
constructor(
|
|
47
|
+
constructor(opts) {
|
|
46
48
|
Object.defineProperty(this, "client", {
|
|
47
49
|
enumerable: true,
|
|
48
50
|
configurable: true,
|
|
@@ -61,6 +63,12 @@ class Pipeline {
|
|
|
61
63
|
writable: true,
|
|
62
64
|
value: void 0
|
|
63
65
|
});
|
|
66
|
+
Object.defineProperty(this, "multiExec", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
configurable: true,
|
|
69
|
+
writable: true,
|
|
70
|
+
value: void 0
|
|
71
|
+
});
|
|
64
72
|
/**
|
|
65
73
|
* Send the pipeline request to upstash.
|
|
66
74
|
*
|
|
@@ -79,8 +87,9 @@ class Pipeline {
|
|
|
79
87
|
if (this.commands.length === 0) {
|
|
80
88
|
throw new Error("Pipeline is empty");
|
|
81
89
|
}
|
|
90
|
+
const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
|
|
82
91
|
const res = (await this.client.request({
|
|
83
|
-
path
|
|
92
|
+
path,
|
|
84
93
|
body: Object.values(this.commands).map((c) => c.command),
|
|
85
94
|
}));
|
|
86
95
|
return res.map(({ error, result }, i) => {
|
|
@@ -253,6 +262,15 @@ class Pipeline {
|
|
|
253
262
|
writable: true,
|
|
254
263
|
value: (...args) => this.chain(new mod_js_1.GetBitCommand(args, this.commandOptions))
|
|
255
264
|
});
|
|
265
|
+
/**
|
|
266
|
+
* @see https://redis.io/commands/getdel
|
|
267
|
+
*/
|
|
268
|
+
Object.defineProperty(this, "getdel", {
|
|
269
|
+
enumerable: true,
|
|
270
|
+
configurable: true,
|
|
271
|
+
writable: true,
|
|
272
|
+
value: (...args) => this.chain(new mod_js_1.GetDelCommand(args, this.commandOptions))
|
|
273
|
+
});
|
|
256
274
|
/**
|
|
257
275
|
* @see https://redis.io/commands/getrange
|
|
258
276
|
*/
|
|
@@ -361,6 +379,15 @@ class Pipeline {
|
|
|
361
379
|
writable: true,
|
|
362
380
|
value: (key, kv) => this.chain(new mod_js_1.HMSetCommand([key, kv], this.commandOptions))
|
|
363
381
|
});
|
|
382
|
+
/**
|
|
383
|
+
* @see https://redis.io/commands/hrandfield
|
|
384
|
+
*/
|
|
385
|
+
Object.defineProperty(this, "hrandfield", {
|
|
386
|
+
enumerable: true,
|
|
387
|
+
configurable: true,
|
|
388
|
+
writable: true,
|
|
389
|
+
value: (key, count, withValues) => this.chain(new hrandfield_js_1.HRandFieldCommand([key, count, withValues], this.commandOptions))
|
|
390
|
+
});
|
|
364
391
|
/**
|
|
365
392
|
* @see https://redis.io/commands/hscan
|
|
366
393
|
*/
|
|
@@ -1014,6 +1041,15 @@ class Pipeline {
|
|
|
1014
1041
|
writable: true,
|
|
1015
1042
|
value: (...args) => this.chain(new mod_js_1.ZLexCountCommand(args, this.commandOptions))
|
|
1016
1043
|
});
|
|
1044
|
+
/**
|
|
1045
|
+
* @see https://redis.io/commands/zmscore
|
|
1046
|
+
*/
|
|
1047
|
+
Object.defineProperty(this, "zmscore", {
|
|
1048
|
+
enumerable: true,
|
|
1049
|
+
configurable: true,
|
|
1050
|
+
writable: true,
|
|
1051
|
+
value: (...args) => this.chain(new zmscore_js_1.ZMScoreCommand(args, this.commandOptions))
|
|
1052
|
+
});
|
|
1017
1053
|
/**
|
|
1018
1054
|
* @see https://redis.io/commands/zpopmax
|
|
1019
1055
|
*/
|
|
@@ -1122,9 +1158,10 @@ class Pipeline {
|
|
|
1122
1158
|
writable: true,
|
|
1123
1159
|
value: (...args) => this.chain(new mod_js_1.ZUnionStoreCommand(args, this.commandOptions))
|
|
1124
1160
|
});
|
|
1125
|
-
this.client = client;
|
|
1161
|
+
this.client = opts.client;
|
|
1126
1162
|
this.commands = [];
|
|
1127
|
-
this.commandOptions = commandOptions;
|
|
1163
|
+
this.commandOptions = opts.commandOptions;
|
|
1164
|
+
this.multiExec = opts.multiExec ?? false;
|
|
1128
1165
|
}
|
|
1129
1166
|
/**
|
|
1130
1167
|
* Pushes a command into the pipelien and returns a chainable instance of the
|