@upstash/redis 0.0.0-ci.e730ad54-20220901 → 0.0.0-ci.ed40a9ac-20230414
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 +20 -18
- 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/mod.js +25 -0
- package/esm/pkg/commands/smismember.js +9 -0
- package/esm/pkg/commands/zdiffstore.js +9 -0
- package/esm/pkg/commands/zmscore.js +1 -2
- package/esm/pkg/http.js +92 -2
- package/esm/pkg/pipeline.js +153 -6
- package/esm/pkg/redis.js +188 -2
- package/esm/platforms/cloudflare.js +10 -2
- package/esm/platforms/fastly.js +6 -0
- package/esm/platforms/node_with_fetch.js +26 -1
- package/esm/platforms/nodejs.js +22 -1
- package/esm/version.js +1 -0
- package/package.json +41 -16
- 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/mod.js +25 -0
- package/script/pkg/commands/smismember.js +13 -0
- package/script/pkg/commands/zdiffstore.js +13 -0
- package/script/pkg/commands/zmscore.js +1 -2
- package/script/pkg/http.js +92 -2
- package/script/pkg/pipeline.js +152 -5
- package/script/pkg/redis.js +187 -1
- package/script/platforms/cloudflare.js +10 -2
- package/script/platforms/fastly.js +6 -0
- package/script/platforms/node_with_fetch.js +26 -1
- package/script/platforms/nodejs.js +22 -1
- package/script/version.js +4 -0
- package/types/pkg/commands/command.d.ts +5 -5
- package/types/pkg/commands/getdel.d.ts +7 -0
- 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/mod.d.ts +25 -0
- package/types/pkg/commands/scan.d.ts +1 -1
- package/types/pkg/commands/script_flush.d.ts +1 -1
- package/types/pkg/commands/set.d.ts +1 -1
- package/types/pkg/commands/smembers.d.ts +2 -2
- package/types/pkg/commands/smismember.d.ts +7 -0
- package/types/pkg/commands/type.d.ts +1 -1
- package/types/pkg/commands/zadd.d.ts +3 -3
- 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 +1 -1
- package/types/pkg/commands/zrange.d.ts +1 -1
- package/types/pkg/commands/zunionstore.d.ts +1 -1
- package/types/pkg/http.d.ts +44 -7
- package/types/pkg/pipeline.d.ts +55 -4
- package/types/pkg/redis.d.ts +134 -10
- package/types/pkg/types.d.ts +27 -1
- package/types/platforms/cloudflare.d.ts +9 -8
- package/types/platforms/fastly.d.ts +3 -7
- package/types/platforms/node_with_fetch.d.ts +3 -22
- package/types/platforms/nodejs.d.ts +4 -7
- package/types/version.d.ts +1 -0
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ supported.
|
|
|
27
27
|
|
|
28
28
|
### Install
|
|
29
29
|
|
|
30
|
-
####
|
|
30
|
+
#### Node.js
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
npm install @upstash/redis
|
|
@@ -81,23 +81,12 @@ data = await redis.spop('animals', 1)
|
|
|
81
81
|
console.log(data)
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
## Troubleshooting
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
for
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
import { Redis } from "@upstash/redis/with-fetch";
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### Upgrading from v0.2.0?
|
|
96
|
-
|
|
97
|
-
Please read the
|
|
98
|
-
[migration guide](https://docs.upstash.com/redis/sdks/javascriptsdk/migration).
|
|
99
|
-
For further explanation we wrote a
|
|
100
|
-
[blog post](https://blog.upstash.com/upstash-redis-sdk-v1).
|
|
86
|
+
We have a
|
|
87
|
+
[dedicated page](https://docs.upstash.com/redis/sdks/javascriptsdk/troubleshooting)
|
|
88
|
+
for common problems. If you can't find a solution, please
|
|
89
|
+
[open an issue](https://github.com/upstash/upstash-redis/issues/new).
|
|
101
90
|
|
|
102
91
|
## Docs
|
|
103
92
|
|
|
@@ -119,5 +108,18 @@ the url and token
|
|
|
119
108
|
UPSTASH_REDIS_REST_URL=".." UPSTASH_REDIS_REST_TOKEN=".." deno test -A
|
|
120
109
|
```
|
|
121
110
|
|
|
122
|
-
|
|
111
|
+
### Telemetry
|
|
112
|
+
|
|
113
|
+
This library sends anonymous telemetry data to help us improve your experience.
|
|
114
|
+
We collect the following:
|
|
115
|
+
|
|
116
|
+
- SDK version
|
|
117
|
+
- Platform (Deno, Cloudflare, Vercel)
|
|
118
|
+
- Runtime version (node@18.x)
|
|
119
|
+
|
|
120
|
+
You can opt out by setting the `UPSTASH_DISABLE_TELEMETRY` environment variable
|
|
121
|
+
to any truthy value.
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
UPSTASH_DISABLE_TELEMETRY=1
|
|
123
125
|
```
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { UpstashError } from "../error.js";
|
|
2
2
|
import { parseResponse } from "../util.js";
|
|
3
|
-
const defaultSerializer = (c) =>
|
|
3
|
+
const defaultSerializer = (c) => {
|
|
4
|
+
switch (typeof c) {
|
|
5
|
+
case "string":
|
|
6
|
+
case "number":
|
|
7
|
+
case "boolean":
|
|
8
|
+
return c;
|
|
9
|
+
default:
|
|
10
|
+
return JSON.stringify(c);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
4
13
|
/**
|
|
5
14
|
* Command offers default (de)serialization and the exec method to all commands.
|
|
6
15
|
*
|
|
@@ -37,7 +46,7 @@ export class Command {
|
|
|
37
46
|
opts.automaticDeserialization
|
|
38
47
|
? opts?.deserialize ?? parseResponse
|
|
39
48
|
: (x) => x;
|
|
40
|
-
this.command = command.map(this.serialize);
|
|
49
|
+
this.command = command.map((c) => this.serialize(c));
|
|
41
50
|
}
|
|
42
51
|
/**
|
|
43
52
|
* Execute the command using a client.
|
|
@@ -50,7 +59,7 @@ export class Command {
|
|
|
50
59
|
throw new UpstashError(error);
|
|
51
60
|
}
|
|
52
61
|
if (typeof result === "undefined") {
|
|
53
|
-
throw new Error(
|
|
62
|
+
throw new Error("Request did not return a result");
|
|
54
63
|
}
|
|
55
64
|
return this.deserialize(result);
|
|
56
65
|
}
|
|
@@ -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,12 @@
|
|
|
1
|
+
import { Command } from "./command.js";
|
|
2
|
+
/**
|
|
3
|
+
* @see https://redis.io/commands/json.arrtrim
|
|
4
|
+
*/
|
|
5
|
+
export class JsonArrTrimCommand extends Command {
|
|
6
|
+
constructor(cmd, opts) {
|
|
7
|
+
const path = cmd[1] ?? "$";
|
|
8
|
+
const start = cmd[2] ?? 0;
|
|
9
|
+
const stop = cmd[3] ?? 0;
|
|
10
|
+
super(["JSON.ARRTRIM", cmd[0], path, start, stop], opts);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Command } from "./command.js";
|
|
2
|
+
/**
|
|
3
|
+
* @see https://redis.io/commands/json.get
|
|
4
|
+
*/
|
|
5
|
+
export class JsonGetCommand extends Command {
|
|
6
|
+
constructor(cmd, opts) {
|
|
7
|
+
const command = ["JSON.GET"];
|
|
8
|
+
if (typeof cmd[1] === "string") {
|
|
9
|
+
// @ts-ignore - we know this is a string
|
|
10
|
+
command.push(...cmd);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
command.push(cmd[0]);
|
|
14
|
+
if (cmd[1]) {
|
|
15
|
+
if (cmd[1].indent) {
|
|
16
|
+
command.push("INDENT", cmd[1].indent);
|
|
17
|
+
}
|
|
18
|
+
if (cmd[1].newline) {
|
|
19
|
+
command.push("NEWLINE", cmd[1].newline);
|
|
20
|
+
}
|
|
21
|
+
if (cmd[1].space) {
|
|
22
|
+
command.push("SPACE", cmd[1].space);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// @ts-ignore - we know this is a string
|
|
26
|
+
command.push(...cmd.slice(2));
|
|
27
|
+
}
|
|
28
|
+
super(command, opts);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Command } from "./command.js";
|
|
2
|
+
/**
|
|
3
|
+
* @see https://redis.io/commands/json.set
|
|
4
|
+
*/
|
|
5
|
+
export class JsonSetCommand extends Command {
|
|
6
|
+
constructor(cmd, opts) {
|
|
7
|
+
const command = ["JSON.SET", cmd[0], cmd[1], cmd[2]];
|
|
8
|
+
if (cmd[3]) {
|
|
9
|
+
if (cmd[3].nx) {
|
|
10
|
+
command.push("NX");
|
|
11
|
+
}
|
|
12
|
+
else if (cmd[3].xx) {
|
|
13
|
+
command.push("XX");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
super(command, opts);
|
|
17
|
+
}
|
|
18
|
+
}
|
package/esm/pkg/commands/mod.js
CHANGED
|
@@ -17,6 +17,7 @@ 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";
|
|
@@ -29,6 +30,7 @@ export * from "./hkeys.js";
|
|
|
29
30
|
export * from "./hlen.js";
|
|
30
31
|
export * from "./hmget.js";
|
|
31
32
|
export * from "./hmset.js";
|
|
33
|
+
export * from "./hrandfield.js";
|
|
32
34
|
export * from "./hscan.js";
|
|
33
35
|
export * from "./hset.js";
|
|
34
36
|
export * from "./hsetnx.js";
|
|
@@ -37,10 +39,32 @@ export * from "./hvals.js";
|
|
|
37
39
|
export * from "./incr.js";
|
|
38
40
|
export * from "./incrby.js";
|
|
39
41
|
export * from "./incrbyfloat.js";
|
|
42
|
+
export * from "./json_arrappend.js";
|
|
43
|
+
export * from "./json_arrindex.js";
|
|
44
|
+
export * from "./json_arrinsert.js";
|
|
45
|
+
export * from "./json_arrlen.js";
|
|
46
|
+
export * from "./json_arrpop.js";
|
|
47
|
+
export * from "./json_arrtrim.js";
|
|
48
|
+
export * from "./json_clear.js";
|
|
49
|
+
export * from "./json_del.js";
|
|
50
|
+
export * from "./json_forget.js";
|
|
51
|
+
export * from "./json_get.js";
|
|
52
|
+
export * from "./json_mget.js";
|
|
53
|
+
export * from "./json_numincrby.js";
|
|
54
|
+
export * from "./json_nummultby.js";
|
|
55
|
+
export * from "./json_objkeys.js";
|
|
56
|
+
export * from "./json_objlen.js";
|
|
57
|
+
export * from "./json_resp.js";
|
|
58
|
+
export * from "./json_set.js";
|
|
59
|
+
export * from "./json_strappend.js";
|
|
60
|
+
export * from "./json_strlen.js";
|
|
61
|
+
export * from "./json_toggle.js";
|
|
62
|
+
export * from "./json_type.js";
|
|
40
63
|
export * from "./keys.js";
|
|
41
64
|
export * from "./lindex.js";
|
|
42
65
|
export * from "./linsert.js";
|
|
43
66
|
export * from "./llen.js";
|
|
67
|
+
export * from "./lmove.js";
|
|
44
68
|
export * from "./lpop.js";
|
|
45
69
|
export * from "./lpos.js";
|
|
46
70
|
export * from "./lpush.js";
|
|
@@ -82,6 +106,7 @@ export * from "./sinter.js";
|
|
|
82
106
|
export * from "./sinterstore.js";
|
|
83
107
|
export * from "./sismember.js";
|
|
84
108
|
export * from "./smembers.js";
|
|
109
|
+
export * from "./smismember.js";
|
|
85
110
|
export * from "./smove.js";
|
|
86
111
|
export * from "./spop.js";
|
|
87
112
|
export * from "./srandmember.js";
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Command } from "./command.js";
|
|
2
2
|
/**
|
|
3
|
-
* @see https://redis.io/commands/
|
|
3
|
+
* @see https://redis.io/commands/zmscore
|
|
4
4
|
*/
|
|
5
5
|
export class ZMScoreCommand extends Command {
|
|
6
6
|
constructor(cmd, opts) {
|
|
7
7
|
const [key, members] = cmd;
|
|
8
|
-
console.log({ key, members });
|
|
9
8
|
super(["zmscore", key, ...members], opts);
|
|
10
9
|
}
|
|
11
10
|
}
|
package/esm/pkg/http.js
CHANGED
|
@@ -25,9 +25,20 @@ export class HttpClient {
|
|
|
25
25
|
writable: true,
|
|
26
26
|
value: void 0
|
|
27
27
|
});
|
|
28
|
+
this.options = {
|
|
29
|
+
backend: config.options?.backend,
|
|
30
|
+
agent: config.agent,
|
|
31
|
+
responseEncoding: config.responseEncoding ?? "base64",
|
|
32
|
+
cache: config.cache,
|
|
33
|
+
};
|
|
28
34
|
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
29
|
-
this.headers = {
|
|
30
|
-
|
|
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
|
+
}
|
|
31
42
|
if (typeof config?.retry === "boolean" && config?.retry === false) {
|
|
32
43
|
this.retry = {
|
|
33
44
|
attempts: 1,
|
|
@@ -42,12 +53,31 @@ export class HttpClient {
|
|
|
42
53
|
};
|
|
43
54
|
}
|
|
44
55
|
}
|
|
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;
|
|
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
|
+
}
|
|
45
73
|
async request(req) {
|
|
46
74
|
const requestOptions = {
|
|
75
|
+
cache: this.options.cache,
|
|
47
76
|
method: "POST",
|
|
48
77
|
headers: this.headers,
|
|
49
78
|
body: JSON.stringify(req.body),
|
|
50
79
|
keepalive: true,
|
|
80
|
+
agent: this.options?.agent,
|
|
51
81
|
/**
|
|
52
82
|
* Fastly specific
|
|
53
83
|
*/
|
|
@@ -72,6 +102,66 @@ export class HttpClient {
|
|
|
72
102
|
if (!res.ok) {
|
|
73
103
|
throw new UpstashError(body.error);
|
|
74
104
|
}
|
|
105
|
+
if (this.options?.responseEncoding === "base64") {
|
|
106
|
+
return Array.isArray(body) ? body.map(decode) : decode(body);
|
|
107
|
+
}
|
|
75
108
|
return body;
|
|
76
109
|
}
|
|
77
110
|
}
|
|
111
|
+
function base64decode(b64) {
|
|
112
|
+
let dec = "";
|
|
113
|
+
try {
|
|
114
|
+
/**
|
|
115
|
+
* Using only atob() is not enough because it doesn't work with unicode characters
|
|
116
|
+
*/
|
|
117
|
+
const binString = atob(b64);
|
|
118
|
+
const size = binString.length;
|
|
119
|
+
const bytes = new Uint8Array(size);
|
|
120
|
+
for (let i = 0; i < size; i++) {
|
|
121
|
+
bytes[i] = binString.charCodeAt(i);
|
|
122
|
+
}
|
|
123
|
+
dec = new TextDecoder().decode(bytes);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
dec = b64;
|
|
127
|
+
}
|
|
128
|
+
return dec;
|
|
129
|
+
// try {
|
|
130
|
+
// return decodeURIComponent(dec);
|
|
131
|
+
// } catch {
|
|
132
|
+
// return dec;
|
|
133
|
+
// }
|
|
134
|
+
}
|
|
135
|
+
function decode(raw) {
|
|
136
|
+
let result = undefined;
|
|
137
|
+
switch (typeof raw.result) {
|
|
138
|
+
case "undefined":
|
|
139
|
+
return raw;
|
|
140
|
+
case "number": {
|
|
141
|
+
result = raw.result;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case "object": {
|
|
145
|
+
if (Array.isArray(raw.result)) {
|
|
146
|
+
result = raw.result.map((v) => typeof v === "string"
|
|
147
|
+
? base64decode(v)
|
|
148
|
+
: Array.isArray(v)
|
|
149
|
+
? v.map(base64decode)
|
|
150
|
+
: v);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// If it's not an array it must be null
|
|
154
|
+
// Apparently null is an object in javascript
|
|
155
|
+
result = null;
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case "string": {
|
|
160
|
+
result = raw.result === "OK" ? "OK" : base64decode(raw.result);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
default:
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
return { result, error: raw.error };
|
|
167
|
+
}
|