@upstash/redis 0.0.0-ci.fcd85d60 → 0.0.0
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 +44 -280
- 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/command.js +12 -3
- 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/json_arrappend.js +9 -0
- package/esm/pkg/commands/json_arrindex.js +9 -0
- package/esm/pkg/commands/json_arrinsert.js +9 -0
- package/esm/pkg/commands/json_arrlen.js +9 -0
- package/esm/pkg/commands/json_arrpop.js +9 -0
- package/esm/pkg/commands/json_arrtrim.js +12 -0
- package/esm/pkg/commands/json_clear.js +9 -0
- package/esm/pkg/commands/json_del.js +9 -0
- package/esm/pkg/commands/json_forget.js +9 -0
- package/esm/pkg/commands/json_get.js +30 -0
- package/esm/pkg/commands/json_mget.js +9 -0
- package/esm/pkg/commands/json_numincrby.js +9 -0
- package/esm/pkg/commands/json_nummultby.js +9 -0
- package/esm/pkg/commands/json_objkeys.js +9 -0
- package/esm/pkg/commands/json_objlen.js +9 -0
- package/esm/pkg/commands/json_resp.js +9 -0
- package/esm/pkg/commands/json_set.js +18 -0
- package/esm/pkg/commands/json_strappend.js +9 -0
- package/esm/pkg/commands/json_strlen.js +9 -0
- package/esm/pkg/commands/json_toggle.js +9 -0
- package/esm/pkg/commands/json_type.js +9 -0
- package/esm/pkg/commands/lmove.js +9 -0
- package/esm/pkg/commands/lpos.js +19 -0
- package/esm/pkg/commands/mod.js +27 -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/xadd.js +26 -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 +134 -9
- package/esm/pkg/pipeline.js +180 -12
- package/esm/pkg/redis.js +227 -2
- package/esm/pkg/script.js +77 -0
- package/esm/platforms/cloudflare.js +14 -26
- package/esm/platforms/fastly.js +10 -25
- package/esm/platforms/node_with_fetch.js +30 -26
- package/esm/platforms/nodejs.js +28 -26
- package/esm/version.js +1 -0
- package/package.json +53 -58
- 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/command.js +12 -3
- 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/json_arrappend.js +13 -0
- package/script/pkg/commands/json_arrindex.js +13 -0
- package/script/pkg/commands/json_arrinsert.js +13 -0
- package/script/pkg/commands/json_arrlen.js +13 -0
- package/script/pkg/commands/json_arrpop.js +13 -0
- package/script/pkg/commands/json_arrtrim.js +16 -0
- package/script/pkg/commands/json_clear.js +13 -0
- package/script/pkg/commands/json_del.js +13 -0
- package/script/pkg/commands/json_forget.js +13 -0
- package/script/pkg/commands/json_get.js +34 -0
- package/script/pkg/commands/json_mget.js +13 -0
- package/script/pkg/commands/json_numincrby.js +13 -0
- package/script/pkg/commands/json_nummultby.js +13 -0
- package/script/pkg/commands/json_objkeys.js +13 -0
- package/script/pkg/commands/json_objlen.js +13 -0
- package/script/pkg/commands/json_resp.js +13 -0
- package/script/pkg/commands/json_set.js +22 -0
- package/script/pkg/commands/json_strappend.js +13 -0
- package/script/pkg/commands/json_strlen.js +13 -0
- package/script/pkg/commands/json_toggle.js +13 -0
- package/script/pkg/commands/json_type.js +13 -0
- package/script/pkg/commands/lmove.js +13 -0
- package/script/pkg/commands/lpos.js +23 -0
- package/script/pkg/commands/mod.js +27 -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/xadd.js +30 -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 +134 -9
- package/script/pkg/pipeline.js +179 -11
- package/script/pkg/redis.js +226 -1
- package/script/pkg/script.js +81 -0
- package/script/platforms/cloudflare.js +14 -26
- package/script/platforms/fastly.js +10 -25
- package/script/platforms/node_with_fetch.js +30 -26
- package/script/platforms/nodejs.js +28 -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/command.d.ts +5 -5
- package/types/pkg/commands/getdel.d.ts +7 -0
- package/types/pkg/commands/hdel.d.ts +1 -1
- package/types/pkg/commands/hrandfield.d.ts +9 -0
- package/types/pkg/commands/json_arrappend.d.ts +7 -0
- package/types/pkg/commands/json_arrindex.d.ts +13 -0
- package/types/pkg/commands/json_arrinsert.d.ts +7 -0
- package/types/pkg/commands/json_arrlen.d.ts +7 -0
- package/types/pkg/commands/json_arrpop.d.ts +7 -0
- package/types/pkg/commands/json_arrtrim.d.ts +7 -0
- package/types/pkg/commands/json_clear.d.ts +7 -0
- package/types/pkg/commands/json_del.d.ts +7 -0
- package/types/pkg/commands/json_forget.d.ts +7 -0
- package/types/pkg/commands/json_get.d.ts +15 -0
- package/types/pkg/commands/json_mget.d.ts +7 -0
- package/types/pkg/commands/json_numincrby.d.ts +7 -0
- package/types/pkg/commands/json_nummultby.d.ts +7 -0
- package/types/pkg/commands/json_objkeys.d.ts +7 -0
- package/types/pkg/commands/json_objlen.d.ts +7 -0
- package/types/pkg/commands/json_resp.d.ts +7 -0
- package/types/pkg/commands/json_set.d.ts +18 -0
- package/types/pkg/commands/json_strappend.d.ts +7 -0
- package/types/pkg/commands/json_strlen.d.ts +7 -0
- package/types/pkg/commands/json_toggle.d.ts +7 -0
- package/types/pkg/commands/json_type.d.ts +7 -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 +27 -0
- package/types/pkg/commands/rpop.d.ts +2 -2
- package/types/pkg/commands/scan.d.ts +2 -1
- package/types/pkg/commands/script_flush.d.ts +1 -1
- 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/type.d.ts +1 -1
- package/types/pkg/commands/xadd.d.ts +31 -0
- package/types/pkg/commands/zadd.d.ts +4 -4
- package/types/pkg/commands/zdiffstore.d.ts +7 -0
- package/types/pkg/commands/zinterstore.d.ts +1 -1
- package/types/pkg/commands/zmscore.d.ts +7 -0
- package/types/pkg/commands/zrange.d.ts +8 -1
- package/types/pkg/commands/zunionstore.d.ts +1 -1
- package/types/pkg/http.d.ts +73 -8
- package/types/pkg/pipeline.d.ts +262 -124
- package/types/pkg/redis.d.ts +162 -19
- package/types/pkg/script.d.ts +42 -0
- package/types/pkg/types.d.ts +27 -1
- package/types/platforms/cloudflare.d.ts +9 -4
- package/types/platforms/fastly.d.ts +3 -3
- package/types/platforms/node_with_fetch.d.ts +3 -3
- package/types/platforms/nodejs.d.ts +19 -3
- package/types/version.d.ts +1 -0
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",
|
|
32
|
+
cache: config.cache,
|
|
33
|
+
};
|
|
22
34
|
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
23
|
-
this.headers = {
|
|
24
|
-
|
|
35
|
+
this.headers = {
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
...config.headers,
|
|
38
|
+
};
|
|
39
|
+
if (this.options.responseEncoding === "base64") {
|
|
40
|
+
this.headers["Upstash-Encoding"] = "base64";
|
|
41
|
+
}
|
|
42
|
+
if (typeof config?.retry === "boolean" && config?.retry === false) {
|
|
43
|
+
this.retry = {
|
|
44
|
+
attempts: 1,
|
|
45
|
+
backoff: () => 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.retry = {
|
|
50
|
+
attempts: config?.retry?.retries ?? 5,
|
|
51
|
+
backoff: config?.retry?.backoff ??
|
|
52
|
+
((retryCount) => Math.exp(retryCount) * 50),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
25
55
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
56
|
+
mergeTelemetry(telemetry) {
|
|
57
|
+
function merge(obj, key, value) {
|
|
58
|
+
if (!value) {
|
|
59
|
+
return obj;
|
|
60
|
+
}
|
|
61
|
+
if (obj[key]) {
|
|
62
|
+
obj[key] = [obj[key], value].join(",");
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
obj[key] = value;
|
|
66
|
+
}
|
|
67
|
+
return obj;
|
|
29
68
|
}
|
|
69
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Runtime", telemetry.runtime);
|
|
70
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Platform", telemetry.platform);
|
|
71
|
+
this.headers = merge(this.headers, "Upstash-Telemetry-Sdk", telemetry.sdk);
|
|
72
|
+
}
|
|
73
|
+
async request(req) {
|
|
30
74
|
const requestOptions = {
|
|
75
|
+
cache: this.options.cache,
|
|
31
76
|
method: "POST",
|
|
32
77
|
headers: this.headers,
|
|
33
78
|
body: JSON.stringify(req.body),
|
|
34
79
|
keepalive: true,
|
|
80
|
+
agent: this.options?.agent,
|
|
35
81
|
/**
|
|
36
82
|
* Fastly specific
|
|
37
83
|
*/
|
|
38
84
|
backend: this.options?.backend,
|
|
39
85
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
86
|
+
let res = null;
|
|
87
|
+
let error = null;
|
|
88
|
+
for (let i = 0; i <= this.retry.attempts; i++) {
|
|
89
|
+
try {
|
|
90
|
+
res = await fetch([this.baseUrl, ...(req.path ?? [])].join("/"), requestOptions);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
error = err;
|
|
95
|
+
await new Promise((r) => setTimeout(r, this.retry.backoff(i)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!res) {
|
|
99
|
+
throw error ?? new Error("Exhausted all retries");
|
|
100
|
+
}
|
|
43
101
|
const body = (await res.json());
|
|
44
102
|
if (!res.ok) {
|
|
45
|
-
throw new UpstashError(body.error);
|
|
103
|
+
throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
|
|
104
|
+
}
|
|
105
|
+
if (this.options?.responseEncoding === "base64") {
|
|
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 };
|
|
46
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) {
|
|
145
|
+
case "undefined":
|
|
146
|
+
return raw;
|
|
147
|
+
case "number": {
|
|
148
|
+
result = raw;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case "object": {
|
|
152
|
+
if (Array.isArray(raw)) {
|
|
153
|
+
result = raw.map((v) => typeof v === "string"
|
|
154
|
+
? base64decode(v)
|
|
155
|
+
: Array.isArray(v)
|
|
156
|
+
? v.map(decode)
|
|
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 === "OK" ? "OK" : base64decode(raw);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
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, 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";
|
|
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()
|
|
@@ -28,7 +31,7 @@ import { UpstashError } from "./error.js";
|
|
|
28
31
|
* const res = await p.set("key","value").get("key").exec()
|
|
29
32
|
* ```
|
|
30
33
|
*
|
|
31
|
-
*
|
|
34
|
+
* Return types are inferred if all commands are chained, but you can still
|
|
32
35
|
* override the response type manually:
|
|
33
36
|
* ```ts
|
|
34
37
|
* redis.pipeline()
|
|
@@ -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,14 +61,22 @@ 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
|
*
|
|
64
73
|
* Returns an array with the results of all pipelined commands.
|
|
65
74
|
*
|
|
66
|
-
* You can define a return type manually
|
|
75
|
+
* If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
|
|
67
76
|
* ```ts
|
|
68
|
-
* redis.pipeline()
|
|
77
|
+
* const p = redis.pipeline()
|
|
78
|
+
* p.get("key")
|
|
79
|
+
* const result = p.exec<[{ greeting: string }]>()
|
|
69
80
|
* ```
|
|
70
81
|
*/
|
|
71
82
|
Object.defineProperty(this, "exec", {
|
|
@@ -76,10 +87,12 @@ export class Pipeline {
|
|
|
76
87
|
if (this.commands.length === 0) {
|
|
77
88
|
throw new Error("Pipeline is empty");
|
|
78
89
|
}
|
|
90
|
+
const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
|
|
79
91
|
const res = (await this.client.request({
|
|
80
|
-
path
|
|
92
|
+
path,
|
|
81
93
|
body: Object.values(this.commands).map((c) => c.command),
|
|
82
94
|
}));
|
|
95
|
+
console.log("after req", { res });
|
|
83
96
|
return res.map(({ error, result }, i) => {
|
|
84
97
|
if (error) {
|
|
85
98
|
throw new UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
|
|
@@ -124,6 +137,15 @@ export class Pipeline {
|
|
|
124
137
|
writable: true,
|
|
125
138
|
value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
|
|
126
139
|
});
|
|
140
|
+
/**
|
|
141
|
+
* @see https://redis.io/commands/zdiffstore
|
|
142
|
+
*/
|
|
143
|
+
Object.defineProperty(this, "zdiffstore", {
|
|
144
|
+
enumerable: true,
|
|
145
|
+
configurable: true,
|
|
146
|
+
writable: true,
|
|
147
|
+
value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
|
|
148
|
+
});
|
|
127
149
|
/**
|
|
128
150
|
* @see https://redis.io/commands/dbsize
|
|
129
151
|
*/
|
|
@@ -250,6 +272,15 @@ export class Pipeline {
|
|
|
250
272
|
writable: true,
|
|
251
273
|
value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
|
|
252
274
|
});
|
|
275
|
+
/**
|
|
276
|
+
* @see https://redis.io/commands/getdel
|
|
277
|
+
*/
|
|
278
|
+
Object.defineProperty(this, "getdel", {
|
|
279
|
+
enumerable: true,
|
|
280
|
+
configurable: true,
|
|
281
|
+
writable: true,
|
|
282
|
+
value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
|
|
283
|
+
});
|
|
253
284
|
/**
|
|
254
285
|
* @see https://redis.io/commands/getrange
|
|
255
286
|
*/
|
|
@@ -358,6 +389,15 @@ export class Pipeline {
|
|
|
358
389
|
writable: true,
|
|
359
390
|
value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
|
|
360
391
|
});
|
|
392
|
+
/**
|
|
393
|
+
* @see https://redis.io/commands/hrandfield
|
|
394
|
+
*/
|
|
395
|
+
Object.defineProperty(this, "hrandfield", {
|
|
396
|
+
enumerable: true,
|
|
397
|
+
configurable: true,
|
|
398
|
+
writable: true,
|
|
399
|
+
value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
|
|
400
|
+
});
|
|
361
401
|
/**
|
|
362
402
|
* @see https://redis.io/commands/hscan
|
|
363
403
|
*/
|
|
@@ -466,6 +506,15 @@ export class Pipeline {
|
|
|
466
506
|
writable: true,
|
|
467
507
|
value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
|
|
468
508
|
});
|
|
509
|
+
/**
|
|
510
|
+
* @see https://redis.io/commands/lmove
|
|
511
|
+
*/
|
|
512
|
+
Object.defineProperty(this, "lmove", {
|
|
513
|
+
enumerable: true,
|
|
514
|
+
configurable: true,
|
|
515
|
+
writable: true,
|
|
516
|
+
value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
|
|
517
|
+
});
|
|
469
518
|
/**
|
|
470
519
|
* @see https://redis.io/commands/lpop
|
|
471
520
|
*/
|
|
@@ -475,6 +524,15 @@ export class Pipeline {
|
|
|
475
524
|
writable: true,
|
|
476
525
|
value: (...args) => this.chain(new LPopCommand(args, this.commandOptions))
|
|
477
526
|
});
|
|
527
|
+
/**
|
|
528
|
+
* @see https://redis.io/commands/lpos
|
|
529
|
+
*/
|
|
530
|
+
Object.defineProperty(this, "lpos", {
|
|
531
|
+
enumerable: true,
|
|
532
|
+
configurable: true,
|
|
533
|
+
writable: true,
|
|
534
|
+
value: (...args) => this.chain(new LPosCommand(args, this.commandOptions))
|
|
535
|
+
});
|
|
478
536
|
/**
|
|
479
537
|
* @see https://redis.io/commands/lpush
|
|
480
538
|
*/
|
|
@@ -826,6 +884,15 @@ export class Pipeline {
|
|
|
826
884
|
writable: true,
|
|
827
885
|
value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
|
|
828
886
|
});
|
|
887
|
+
/**
|
|
888
|
+
* @see https://redis.io/commands/smismember
|
|
889
|
+
*/
|
|
890
|
+
Object.defineProperty(this, "smismember", {
|
|
891
|
+
enumerable: true,
|
|
892
|
+
configurable: true,
|
|
893
|
+
writable: true,
|
|
894
|
+
value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
|
|
895
|
+
});
|
|
829
896
|
/**
|
|
830
897
|
* @see https://redis.io/commands/smove
|
|
831
898
|
*/
|
|
@@ -1002,6 +1069,15 @@ export class Pipeline {
|
|
|
1002
1069
|
writable: true,
|
|
1003
1070
|
value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
|
|
1004
1071
|
});
|
|
1072
|
+
/**
|
|
1073
|
+
* @see https://redis.io/commands/zmscore
|
|
1074
|
+
*/
|
|
1075
|
+
Object.defineProperty(this, "zmscore", {
|
|
1076
|
+
enumerable: true,
|
|
1077
|
+
configurable: true,
|
|
1078
|
+
writable: true,
|
|
1079
|
+
value: (...args) => this.chain(new ZMScoreCommand(args, this.commandOptions))
|
|
1080
|
+
});
|
|
1005
1081
|
/**
|
|
1006
1082
|
* @see https://redis.io/commands/zpopmax
|
|
1007
1083
|
*/
|
|
@@ -1110,16 +1186,108 @@ export class Pipeline {
|
|
|
1110
1186
|
writable: true,
|
|
1111
1187
|
value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
|
|
1112
1188
|
});
|
|
1113
|
-
this.client = client;
|
|
1114
|
-
this.commands = [];
|
|
1115
|
-
this.commandOptions = commandOptions;
|
|
1189
|
+
this.client = opts.client;
|
|
1190
|
+
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
|
|
1191
|
+
this.commandOptions = opts.commandOptions;
|
|
1192
|
+
this.multiExec = opts.multiExec ?? false;
|
|
1116
1193
|
}
|
|
1117
1194
|
/**
|
|
1118
|
-
* Pushes a command into the
|
|
1195
|
+
* Pushes a command into the pipeline and returns a chainable instance of the
|
|
1119
1196
|
* pipeline
|
|
1120
1197
|
*/
|
|
1121
1198
|
chain(command) {
|
|
1122
1199
|
this.commands.push(command);
|
|
1123
|
-
return this;
|
|
1200
|
+
return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
|
|
1201
|
+
}
|
|
1202
|
+
/**
|
|
1203
|
+
* @see https://redis.io/commands/?group=json
|
|
1204
|
+
*/
|
|
1205
|
+
get json() {
|
|
1206
|
+
return {
|
|
1207
|
+
/**
|
|
1208
|
+
* @see https://redis.io/commands/json.arrappend
|
|
1209
|
+
*/
|
|
1210
|
+
arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
|
|
1211
|
+
/**
|
|
1212
|
+
* @see https://redis.io/commands/json.arrindex
|
|
1213
|
+
*/
|
|
1214
|
+
arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
|
|
1215
|
+
/**
|
|
1216
|
+
* @see https://redis.io/commands/json.arrinsert
|
|
1217
|
+
*/
|
|
1218
|
+
arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
|
|
1219
|
+
/**
|
|
1220
|
+
* @see https://redis.io/commands/json.arrlen
|
|
1221
|
+
*/
|
|
1222
|
+
arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
|
|
1223
|
+
/**
|
|
1224
|
+
* @see https://redis.io/commands/json.arrpop
|
|
1225
|
+
*/
|
|
1226
|
+
arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
|
|
1227
|
+
/**
|
|
1228
|
+
* @see https://redis.io/commands/json.arrtrim
|
|
1229
|
+
*/
|
|
1230
|
+
arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
|
|
1231
|
+
/**
|
|
1232
|
+
* @see https://redis.io/commands/json.clear
|
|
1233
|
+
*/
|
|
1234
|
+
clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
|
|
1235
|
+
/**
|
|
1236
|
+
* @see https://redis.io/commands/json.del
|
|
1237
|
+
*/
|
|
1238
|
+
del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
|
|
1239
|
+
/**
|
|
1240
|
+
* @see https://redis.io/commands/json.forget
|
|
1241
|
+
*/
|
|
1242
|
+
forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
|
|
1243
|
+
/**
|
|
1244
|
+
* @see https://redis.io/commands/json.get
|
|
1245
|
+
*/
|
|
1246
|
+
get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
|
|
1247
|
+
/**
|
|
1248
|
+
* @see https://redis.io/commands/json.mget
|
|
1249
|
+
*/
|
|
1250
|
+
mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
|
|
1251
|
+
/**
|
|
1252
|
+
* @see https://redis.io/commands/json.numincrby
|
|
1253
|
+
*/
|
|
1254
|
+
numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
|
|
1255
|
+
/**
|
|
1256
|
+
* @see https://redis.io/commands/json.nummultby
|
|
1257
|
+
*/
|
|
1258
|
+
nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
|
|
1259
|
+
/**
|
|
1260
|
+
* @see https://redis.io/commands/json.objkeys
|
|
1261
|
+
*/
|
|
1262
|
+
objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
|
|
1263
|
+
/**
|
|
1264
|
+
* @see https://redis.io/commands/json.objlen
|
|
1265
|
+
*/
|
|
1266
|
+
objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
|
|
1267
|
+
/**
|
|
1268
|
+
* @see https://redis.io/commands/json.resp
|
|
1269
|
+
*/
|
|
1270
|
+
resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
|
|
1271
|
+
/**
|
|
1272
|
+
* @see https://redis.io/commands/json.set
|
|
1273
|
+
*/
|
|
1274
|
+
set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
|
|
1275
|
+
/**
|
|
1276
|
+
* @see https://redis.io/commands/json.strappend
|
|
1277
|
+
*/
|
|
1278
|
+
strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
|
|
1279
|
+
/**
|
|
1280
|
+
* @see https://redis.io/commands/json.strlen
|
|
1281
|
+
*/
|
|
1282
|
+
strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
|
|
1283
|
+
/**
|
|
1284
|
+
* @see https://redis.io/commands/json.toggle
|
|
1285
|
+
*/
|
|
1286
|
+
toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
|
|
1287
|
+
/**
|
|
1288
|
+
* @see https://redis.io/commands/json.type
|
|
1289
|
+
*/
|
|
1290
|
+
type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
|
|
1291
|
+
};
|
|
1124
1292
|
}
|
|
1125
1293
|
}
|