-
Notifications
You must be signed in to change notification settings - Fork 146
Expand file tree
/
Copy pathdata-encoder.ts
More file actions
126 lines (114 loc) · 3.27 KB
/
data-encoder.ts
File metadata and controls
126 lines (114 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { get } from 'svelte/store';
import { page } from '$app/stores';
import { translate } from '$lib/i18n/translate';
import {
setLastDataEncoderFailure,
setLastDataEncoderSuccess,
} from '$lib/stores/data-encoder-config';
import type { NetworkError, Settings } from '$lib/types/global';
import {
getCodecEndpoint,
getCodecIncludeCredentials,
getCodecPassAccessToken,
} from '$lib/utilities/get-codec';
import { validateHttps } from '$lib/utilities/is-http';
import { stringifyWithBigInt } from '$lib/utilities/parse-with-big-int';
import { getAccessToken, getIdToken } from '$lib/utilities/token-provider';
export type PotentialPayloads = { payloads: unknown[] };
export async function codeServerRequest({
type,
payloads,
namespace = get(page).params.namespace,
settings = get(page).data.settings,
}: {
type: 'decode' | 'encode';
payloads: PotentialPayloads;
namespace?: string;
settings?: Settings;
}): Promise<PotentialPayloads> {
const endpoint = getCodecEndpoint(settings);
const passAccessToken = getCodecPassAccessToken(settings);
const includeCredentials = getCodecIncludeCredentials(settings);
const headers = {
'Content-Type': 'application/json',
'X-Namespace': namespace,
};
if (passAccessToken) {
if (validateHttps(endpoint)) {
const accessToken = await getAccessToken();
const idToken = await getIdToken();
if (accessToken) {
headers['Authorization'] = `Bearer ${accessToken}`;
}
if (idToken) {
headers['Authorization-Extras'] = idToken;
}
} else {
setLastDataEncoderFailure();
return payloads;
}
}
const requestOptions = includeCredentials
? {
headers,
credentials: 'include' as RequestCredentials,
method: 'POST',
body: stringifyWithBigInt(payloads),
}
: {
headers,
method: 'POST',
body: stringifyWithBigInt(payloads),
};
const decoderResponse: Promise<PotentialPayloads> = fetch(
endpoint + `/${type}`,
requestOptions,
)
.then((response) => {
if (response.ok === false) {
throw {
statusCode: response.status,
statusText: response.statusText,
response,
message: translate(`common.${type}-failed`),
} as NetworkError;
} else {
return response.json();
}
})
.then((response) => {
setLastDataEncoderSuccess();
return response;
})
.catch((err: unknown) => {
setLastDataEncoderFailure(err);
if (type === 'decode') {
return payloads;
} else {
throw err;
}
});
return decoderResponse;
}
export async function decodePayloadsWithCodec({
payloads,
namespace = get(page).params.namespace,
settings = get(page).data.settings,
}: {
payloads: PotentialPayloads;
namespace?: string;
settings?: Settings;
}): Promise<PotentialPayloads> {
return codeServerRequest({ type: 'decode', payloads, namespace, settings });
}
export async function encodePayloadsWithCodec({
payloads,
namespace = get(page).params.namespace,
settings = get(page).data.settings,
}: {
payloads: PotentialPayloads;
namespace?: string;
settings?: Settings;
}): Promise<PotentialPayloads> {
return codeServerRequest({ type: 'encode', payloads, namespace, settings });
}