@base44/functions-compiler 0.1.5 → 0.1.6
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 +23 -9
- package/lib/src/assembly.js +2 -2
- package/lib/src/assembly.js.map +1 -1
- package/lib/src/assets.d.ts +7 -0
- package/lib/src/assets.js +15 -0
- package/lib/src/assets.js.map +1 -0
- package/lib/src/deno-bundle.js +2 -2
- package/lib/src/deno-bundle.js.map +1 -1
- package/lib/src/esbuild/deno-resolver.js +28 -24
- package/lib/src/esbuild/deno-resolver.js.map +1 -1
- package/lib/src/esbuild/private-data-sources-virtual.js +2 -3
- package/lib/src/esbuild/private-data-sources-virtual.js.map +1 -1
- package/lib/src/esbuild/runtime-context-specifier.d.ts +1 -0
- package/lib/src/esbuild/runtime-context-specifier.js +3 -0
- package/lib/src/esbuild/runtime-context-specifier.js.map +1 -0
- package/lib/src/esbuild/runtime-context-virtual.d.ts +2 -1
- package/lib/src/esbuild/runtime-context-virtual.js +4 -4
- package/lib/src/esbuild/runtime-context-virtual.js.map +1 -1
- package/lib/src/esbuild/runtime-virtual.js +4 -21
- package/lib/src/esbuild/runtime-virtual.js.map +1 -1
- package/lib/src/fetch-guard.js +4 -2
- package/lib/src/fetch-guard.js.map +1 -1
- package/lib/src/generated/assets.d.ts +1 -0
- package/lib/src/generated/assets.js +30 -0
- package/lib/src/generated/assets.js.map +1 -0
- package/lib/src/lazy-deps.d.ts +2 -0
- package/lib/src/lazy-deps.js +11 -0
- package/lib/src/lazy-deps.js.map +1 -0
- package/lib/src/version.d.ts +1 -1
- package/lib/src/version.js +1 -1
- package/lib/src/worker-entry.js +4 -12
- package/lib/src/worker-entry.js.map +1 -1
- package/package.json +4 -3
- package/lib/dist/activation-shim.mjs +0 -357
- package/lib/dist/actor.mjs +0 -1131
- package/lib/dist/deno-shim.mjs +0 -2347
- package/lib/src/private-data-sources/build-http.ts +0 -51
- package/lib/src/private-data-sources/elasticsearch.ts +0 -8
- package/lib/src/private-data-sources/http-url.ts +0 -23
- package/lib/src/private-data-sources/http.ts +0 -6
- package/lib/src/private-data-sources/hyperdrive.ts +0 -48
- package/lib/src/private-data-sources/ioredis-adapter.ts +0 -229
- package/lib/src/private-data-sources/manifest.ts +0 -150
- package/lib/src/private-data-sources/mariadb.ts +0 -8
- package/lib/src/private-data-sources/mongodb.ts +0 -70
- package/lib/src/private-data-sources/mysql.ts +0 -8
- package/lib/src/private-data-sources/node-net-adapter.ts +0 -247
- package/lib/src/private-data-sources/oracle.ts +0 -34
- package/lib/src/private-data-sources/postgres.ts +0 -8
- package/lib/src/private-data-sources/redis-auth.ts +0 -83
- package/lib/src/private-data-sources/redis.ts +0 -47
- package/lib/src/private-data-sources/runtime-environment.ts +0 -4
- package/lib/src/private-data-sources/runtime-manifest-store.ts +0 -32
- package/lib/src/private-data-sources/sqlserver.ts +0 -22
- package/lib/src/private-data-sources/tcp.ts +0 -86
- package/lib/src/private-data-sources/tedious-adapter.ts +0 -67
- package/lib/src/private-data-sources/types.ts +0 -29
- package/lib/src/runtime/index.ts +0 -30
- package/lib/src/runtime-context.ts +0 -29
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
// GENERATED by scripts/build-shim.ts from src/shim/activation.ts — do not edit.
|
|
2
|
-
// Regenerate with `npm run build:shim`.
|
|
3
|
-
|
|
4
|
-
// src/shim/activation.ts
|
|
5
|
-
import { inflateSync } from "node:zlib";
|
|
6
|
-
import { setRuntimeManifest } from "base44:private-data-sources/runtime-manifest-store";
|
|
7
|
-
var ACTIVATION_CHALLENGE_HEADER = "Base44-Activation-Challenge";
|
|
8
|
-
var ACTIVATION_PROOF_HEADER = "Base44-Activation-Proof";
|
|
9
|
-
var ACTIVATION_ERROR_HEADER = "X-Base44-Activation-Error";
|
|
10
|
-
var ACTIVATION_MARKER_HEADER = "X-Base44-Activation";
|
|
11
|
-
var ACTIVATION_DIGEST_HEADER = "X-Base44-Activation-Digest";
|
|
12
|
-
var ERROR_DIGEST_CONTEXT = "cf-activation-error-v1.";
|
|
13
|
-
var MARKER_DIGEST_CONTEXT = "cf-activation-marker-v1.";
|
|
14
|
-
var ACTIVATION_URL_ENV = "BASE44_ACTIVATION_URL";
|
|
15
|
-
var ACTIVATION_KEY_ENV = "BASE44_ACTIVATION_KEY";
|
|
16
|
-
var PULL_TIMEOUT_MS = 5e3;
|
|
17
|
-
var PULL_COOLDOWN_MS = 1e3;
|
|
18
|
-
var PROOF_CONTEXT = "cf-activation-proof-v1.";
|
|
19
|
-
var NONCE_LEN = 12;
|
|
20
|
-
var DATA_KEY_LEN = 32;
|
|
21
|
-
var PULL_BODY_MAX_CHARS = 1024;
|
|
22
|
-
var BLOB_BINDING_PREFIX = "BASE44_SECRETS_BLOB";
|
|
23
|
-
var BLOB_KEY_ID_LEN = 1;
|
|
24
|
-
var MANIFEST_KEY = "BASE44_PRIVATE_DATA_SOURCES";
|
|
25
|
-
var LATCHED_REASONS = [
|
|
26
|
-
"url_missing",
|
|
27
|
-
"key_missing",
|
|
28
|
-
"url_not_https",
|
|
29
|
-
"blob_missing",
|
|
30
|
-
"blob_unreadable"
|
|
31
|
-
];
|
|
32
|
-
var _uncurry = Function.prototype.bind.bind(Function.prototype.call);
|
|
33
|
-
var _subtle = crypto.subtle;
|
|
34
|
-
var _subtleImportKey = _subtle.importKey.bind(_subtle);
|
|
35
|
-
var _subtleDecrypt = _subtle.decrypt.bind(_subtle);
|
|
36
|
-
var _subtleSign = _subtle.sign.bind(_subtle);
|
|
37
|
-
var _subtleDigest = _subtle.digest.bind(_subtle);
|
|
38
|
-
var _fetch = globalThis.fetch.bind(globalThis);
|
|
39
|
-
var _abortTimeout = AbortSignal.timeout.bind(AbortSignal);
|
|
40
|
-
var _DateNow = Date.now;
|
|
41
|
-
var _JSONparse = JSON.parse;
|
|
42
|
-
var _TextDecoder = TextDecoder;
|
|
43
|
-
var _TextEncoder = TextEncoder;
|
|
44
|
-
var _decodeUtf8 = _uncurry(TextDecoder.prototype.decode);
|
|
45
|
-
var _encodeUtf8 = _uncurry(TextEncoder.prototype.encode);
|
|
46
|
-
var _Uint8Array = Uint8Array;
|
|
47
|
-
var _atob = atob;
|
|
48
|
-
var _btoa = btoa;
|
|
49
|
-
var _ObjectEntries = Object.entries;
|
|
50
|
-
var _Headers = Headers;
|
|
51
|
-
var _Request = Request;
|
|
52
|
-
var _Response = Response;
|
|
53
|
-
var _headersGet = _uncurry(Headers.prototype.get);
|
|
54
|
-
var _headersAppend = _uncurry(Headers.prototype.append);
|
|
55
|
-
var _headersEntries = _uncurry(Headers.prototype.entries);
|
|
56
|
-
var _resText = _uncurry(Response.prototype.text);
|
|
57
|
-
var _iterNext = _uncurry(Object.getPrototypeOf(new Headers().entries()).next);
|
|
58
|
-
function accessor(proto, name) {
|
|
59
|
-
for (let o = proto; o; o = Object.getPrototypeOf(o)) {
|
|
60
|
-
const d = Object.getOwnPropertyDescriptor(o, name);
|
|
61
|
-
if (d?.get) return _uncurry(d.get);
|
|
62
|
-
}
|
|
63
|
-
return void 0;
|
|
64
|
-
}
|
|
65
|
-
var _reqHeaders = accessor(Request.prototype, "headers");
|
|
66
|
-
var _resHeaders = accessor(Response.prototype, "headers");
|
|
67
|
-
var _resStatus = accessor(Response.prototype, "status");
|
|
68
|
-
var _resStatusText = accessor(Response.prototype, "statusText");
|
|
69
|
-
var _resBody = accessor(Response.prototype, "body");
|
|
70
|
-
var _resWebSocket = accessor(Response.prototype, "webSocket");
|
|
71
|
-
var RUNTIME_SECRETS_HEADER_LC = "base44-runtime-secrets";
|
|
72
|
-
var INBOUND_HEADERS_LC = ["base44-activation-challenge", RUNTIME_SECRETS_HEADER_LC];
|
|
73
|
-
var SHIM_RESPONSE_HEADERS_LC = [
|
|
74
|
-
"x-base44-activation-error",
|
|
75
|
-
"x-base44-activation",
|
|
76
|
-
"x-base44-activation-digest",
|
|
77
|
-
"x-base44-needs-activation"
|
|
78
|
-
];
|
|
79
|
-
delete process.env[ACTIVATION_URL_ENV];
|
|
80
|
-
delete process.env[ACTIVATION_KEY_ENV];
|
|
81
|
-
function listHas(list, value) {
|
|
82
|
-
for (let i = 0; i < list.length; i++) if (list[i] === value) return true;
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
function headersWithout(src, dropLowercased) {
|
|
86
|
-
const out = new _Headers();
|
|
87
|
-
const it = _headersEntries(src);
|
|
88
|
-
for (; ; ) {
|
|
89
|
-
const step = _iterNext(it);
|
|
90
|
-
if (step.done) break;
|
|
91
|
-
if (!listHas(dropLowercased, step.value[0])) {
|
|
92
|
-
_headersAppend(out, step.value[0], step.value[1]);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return out;
|
|
96
|
-
}
|
|
97
|
-
var ActivationError = class extends Error {
|
|
98
|
-
constructor(reason) {
|
|
99
|
-
super(reason);
|
|
100
|
-
this.reason = reason;
|
|
101
|
-
}
|
|
102
|
-
reason;
|
|
103
|
-
};
|
|
104
|
-
function reasonOf(e) {
|
|
105
|
-
return e instanceof ActivationError ? e.reason : "internal";
|
|
106
|
-
}
|
|
107
|
-
async function phase(reason, run) {
|
|
108
|
-
try {
|
|
109
|
-
return await run();
|
|
110
|
-
} catch (e) {
|
|
111
|
-
throw e instanceof ActivationError ? e : new ActivationError(reason);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
var installed = false;
|
|
115
|
-
var pendingInstall = null;
|
|
116
|
-
var installChain = Promise.resolve();
|
|
117
|
-
var latchedReason = null;
|
|
118
|
-
var cooldownReason = null;
|
|
119
|
-
var nextPullAt = 0;
|
|
120
|
-
async function activationProof(activationKeyB64, challenge) {
|
|
121
|
-
const key = await _subtleImportKey(
|
|
122
|
-
"raw",
|
|
123
|
-
fromBase64Url(activationKeyB64),
|
|
124
|
-
{ name: "HMAC", hash: "SHA-256" },
|
|
125
|
-
false,
|
|
126
|
-
["sign"]
|
|
127
|
-
);
|
|
128
|
-
const message = _encodeUtf8(new _TextEncoder(), PROOF_CONTEXT + challenge);
|
|
129
|
-
return toBase64Url(new _Uint8Array(await _subtleSign("HMAC", key, message)));
|
|
130
|
-
}
|
|
131
|
-
function endpointReason(status) {
|
|
132
|
-
switch (status) {
|
|
133
|
-
case 400:
|
|
134
|
-
return "endpoint_400";
|
|
135
|
-
case 401:
|
|
136
|
-
return "endpoint_401";
|
|
137
|
-
case 409:
|
|
138
|
-
return "endpoint_409";
|
|
139
|
-
case 429:
|
|
140
|
-
return "endpoint_429";
|
|
141
|
-
}
|
|
142
|
-
if (status >= 400 && status < 500) return "endpoint_4xx";
|
|
143
|
-
if (status >= 500 && status < 600) return "endpoint_5xx";
|
|
144
|
-
return "response_malformed";
|
|
145
|
-
}
|
|
146
|
-
async function pullDataKey(challenge, env) {
|
|
147
|
-
const bindings = env ?? {};
|
|
148
|
-
const url = bindings[ACTIVATION_URL_ENV];
|
|
149
|
-
const activationKeyB64 = bindings[ACTIVATION_KEY_ENV];
|
|
150
|
-
if (typeof url !== "string" || !url) throw new ActivationError("url_missing");
|
|
151
|
-
if (typeof activationKeyB64 !== "string" || !activationKeyB64) {
|
|
152
|
-
throw new ActivationError("key_missing");
|
|
153
|
-
}
|
|
154
|
-
if (!url.startsWith("https://")) throw new ActivationError("url_not_https");
|
|
155
|
-
const headers = new _Headers();
|
|
156
|
-
_headersAppend(headers, ACTIVATION_CHALLENGE_HEADER, challenge);
|
|
157
|
-
_headersAppend(
|
|
158
|
-
headers,
|
|
159
|
-
ACTIVATION_PROOF_HEADER,
|
|
160
|
-
await activationProof(activationKeyB64, challenge)
|
|
161
|
-
);
|
|
162
|
-
const signal = _abortTimeout(PULL_TIMEOUT_MS);
|
|
163
|
-
const transport = () => signal.aborted ? "endpoint_timeout" : "endpoint_unreachable";
|
|
164
|
-
let res;
|
|
165
|
-
try {
|
|
166
|
-
res = await _fetch(url, { method: "POST", headers, redirect: "manual", signal });
|
|
167
|
-
} catch {
|
|
168
|
-
throw new ActivationError(transport());
|
|
169
|
-
}
|
|
170
|
-
const status = _resStatus(res);
|
|
171
|
-
if (status !== 200) throw new ActivationError(endpointReason(status));
|
|
172
|
-
let body;
|
|
173
|
-
try {
|
|
174
|
-
body = await _resText(res);
|
|
175
|
-
} catch {
|
|
176
|
-
throw new ActivationError(transport());
|
|
177
|
-
}
|
|
178
|
-
if (body.length > PULL_BODY_MAX_CHARS) throw new ActivationError("response_malformed");
|
|
179
|
-
const parsed = await phase("response_malformed", () => _JSONparse(body));
|
|
180
|
-
const keyB64 = parsed !== null && typeof parsed === "object" ? parsed.key : void 0;
|
|
181
|
-
if (typeof keyB64 !== "string") throw new ActivationError("response_malformed");
|
|
182
|
-
const dataKey = await phase("response_malformed", () => fromBase64Url(keyB64));
|
|
183
|
-
if (dataKey.length !== DATA_KEY_LEN) throw new ActivationError("response_malformed");
|
|
184
|
-
return dataKey;
|
|
185
|
-
}
|
|
186
|
-
async function installFromDataKey(dataKeyBytes, env) {
|
|
187
|
-
const bindings = env ?? {};
|
|
188
|
-
const appId = bindings.BASE44_APP_ID;
|
|
189
|
-
const aad = _encodeUtf8(new _TextEncoder(), typeof appId === "string" ? appId : "");
|
|
190
|
-
let blobB64 = "";
|
|
191
|
-
for (let i = 0; ; i++) {
|
|
192
|
-
const part = bindings[`${BLOB_BINDING_PREFIX}_${i}`];
|
|
193
|
-
if (typeof part !== "string") break;
|
|
194
|
-
blobB64 += part;
|
|
195
|
-
}
|
|
196
|
-
if (blobB64 === "") throw new ActivationError("blob_missing");
|
|
197
|
-
const secrets = await phase("blob_unreadable", async () => {
|
|
198
|
-
const blob = fromBase64Url(blobB64);
|
|
199
|
-
const dataKey = await _subtleImportKey("raw", dataKeyBytes, "AES-GCM", false, ["decrypt"]);
|
|
200
|
-
const plaintext = await _subtleDecrypt(
|
|
201
|
-
{
|
|
202
|
-
name: "AES-GCM",
|
|
203
|
-
iv: blob.slice(BLOB_KEY_ID_LEN, BLOB_KEY_ID_LEN + NONCE_LEN),
|
|
204
|
-
additionalData: aad
|
|
205
|
-
},
|
|
206
|
-
dataKey,
|
|
207
|
-
blob.slice(BLOB_KEY_ID_LEN + NONCE_LEN)
|
|
208
|
-
);
|
|
209
|
-
const payload = _JSONparse(
|
|
210
|
-
_decodeUtf8(new _TextDecoder(), inflateSync(new _Uint8Array(plaintext)))
|
|
211
|
-
);
|
|
212
|
-
return payload && typeof payload === "object" && payload.secrets ? payload.secrets : {};
|
|
213
|
-
});
|
|
214
|
-
const manifestValue = secrets[MANIFEST_KEY];
|
|
215
|
-
setRuntimeManifest(typeof manifestValue === "string" ? manifestValue : "");
|
|
216
|
-
for (const [key, value] of _ObjectEntries(secrets)) {
|
|
217
|
-
if (key !== MANIFEST_KEY && typeof value === "string") process.env[key] = value;
|
|
218
|
-
}
|
|
219
|
-
installed = true;
|
|
220
|
-
}
|
|
221
|
-
function gateClosed() {
|
|
222
|
-
if (latchedReason) return latchedReason;
|
|
223
|
-
return _DateNow() < nextPullAt ? cooldownReason : null;
|
|
224
|
-
}
|
|
225
|
-
function installOnce(challenge, env) {
|
|
226
|
-
const run = installChain.then(async () => {
|
|
227
|
-
if (installed) return false;
|
|
228
|
-
const closed = gateClosed();
|
|
229
|
-
if (closed) throw new ActivationError(closed);
|
|
230
|
-
try {
|
|
231
|
-
await installFromDataKey(await pullDataKey(challenge, env), env);
|
|
232
|
-
return true;
|
|
233
|
-
} catch (e) {
|
|
234
|
-
const reason = reasonOf(e);
|
|
235
|
-
if (listHas(LATCHED_REASONS, reason)) {
|
|
236
|
-
latchedReason = reason;
|
|
237
|
-
} else if (reason !== "endpoint_409") {
|
|
238
|
-
cooldownReason = reason;
|
|
239
|
-
nextPullAt = _DateNow() + PULL_COOLDOWN_MS;
|
|
240
|
-
}
|
|
241
|
-
console.error(`Base44 runtime-secrets activation failed: ${reason}`);
|
|
242
|
-
throw new ActivationError(reason);
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
installChain = run.then(void 0, () => {
|
|
246
|
-
});
|
|
247
|
-
pendingInstall = run;
|
|
248
|
-
const clear = () => {
|
|
249
|
-
if (pendingInstall === run) pendingInstall = null;
|
|
250
|
-
};
|
|
251
|
-
run.then(clear, clear);
|
|
252
|
-
return run;
|
|
253
|
-
}
|
|
254
|
-
var PROCEED = Object.freeze({ response: null, pulledMs: null, markerDigest: null });
|
|
255
|
-
async function digestOf(text) {
|
|
256
|
-
return toBase64Url(new _Uint8Array(await _subtleDigest("SHA-256", _encodeUtf8(new _TextEncoder(), text))));
|
|
257
|
-
}
|
|
258
|
-
function errorDigest(reason, challenge) {
|
|
259
|
-
return digestOf(`${ERROR_DIGEST_CONTEXT}${reason}.${challenge}`);
|
|
260
|
-
}
|
|
261
|
-
function markerDigest(challenge) {
|
|
262
|
-
return digestOf(`${MARKER_DIGEST_CONTEXT}${challenge}`);
|
|
263
|
-
}
|
|
264
|
-
async function failure(reason, challenge) {
|
|
265
|
-
const headers = new _Headers();
|
|
266
|
-
_headersAppend(headers, ACTIVATION_ERROR_HEADER, reason);
|
|
267
|
-
if (challenge) {
|
|
268
|
-
try {
|
|
269
|
-
_headersAppend(headers, ACTIVATION_DIGEST_HEADER, await errorDigest(reason, challenge));
|
|
270
|
-
} catch {
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
_headersAppend(headers, "Cache-Control", "no-store");
|
|
274
|
-
return { response: new _Response(null, { status: 503, headers }), pulledMs: null, markerDigest: null };
|
|
275
|
-
}
|
|
276
|
-
async function ensureActivation(challenge, env) {
|
|
277
|
-
if (installed) return PROCEED;
|
|
278
|
-
try {
|
|
279
|
-
if (pendingInstall) {
|
|
280
|
-
try {
|
|
281
|
-
await pendingInstall;
|
|
282
|
-
return PROCEED;
|
|
283
|
-
} catch {
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (latchedReason) return await failure(latchedReason, challenge);
|
|
287
|
-
if (!challenge) return await failure("challenge_missing", null);
|
|
288
|
-
const closed = gateClosed();
|
|
289
|
-
if (closed) return await failure(closed, challenge);
|
|
290
|
-
const started = _DateNow();
|
|
291
|
-
if (!await installOnce(challenge, env)) return PROCEED;
|
|
292
|
-
const pulledMs = _DateNow() - started;
|
|
293
|
-
let digest = null;
|
|
294
|
-
try {
|
|
295
|
-
digest = await markerDigest(challenge);
|
|
296
|
-
} catch {
|
|
297
|
-
}
|
|
298
|
-
return { response: null, pulledMs, markerDigest: digest };
|
|
299
|
-
} catch (e) {
|
|
300
|
-
return failure(reasonOf(e), challenge);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
function takeActivationChallenge(request) {
|
|
304
|
-
const raw = _reqHeaders(request);
|
|
305
|
-
const challenge = _headersGet(raw, ACTIVATION_CHALLENGE_HEADER);
|
|
306
|
-
if (challenge === null && _headersGet(raw, RUNTIME_SECRETS_HEADER_LC) === null) return { challenge, request };
|
|
307
|
-
return { challenge, request: new _Request(request, { headers: headersWithout(raw, INBOUND_HEADERS_LC) }) };
|
|
308
|
-
}
|
|
309
|
-
function withoutActivationHeaders(response, activation) {
|
|
310
|
-
const raw = _resHeaders(response);
|
|
311
|
-
let forged = false;
|
|
312
|
-
for (let i = 0; i < SHIM_RESPONSE_HEADERS_LC.length; i++) {
|
|
313
|
-
if (_headersGet(raw, SHIM_RESPONSE_HEADERS_LC[i]) !== null) forged = true;
|
|
314
|
-
}
|
|
315
|
-
if (!forged) {
|
|
316
|
-
if (activation.pulledMs === null) return response;
|
|
317
|
-
try {
|
|
318
|
-
stampMarker(raw, activation);
|
|
319
|
-
return response;
|
|
320
|
-
} catch {
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
const headers = headersWithout(raw, SHIM_RESPONSE_HEADERS_LC);
|
|
324
|
-
if (activation.pulledMs !== null) stampMarker(headers, activation);
|
|
325
|
-
return new _Response(_resBody(response), {
|
|
326
|
-
status: _resStatus(response),
|
|
327
|
-
statusText: _resStatusText(response),
|
|
328
|
-
headers,
|
|
329
|
-
// Preserved or a 101 upgrade would fail to reconstruct.
|
|
330
|
-
webSocket: _resWebSocket ? _resWebSocket(response) : void 0
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
function stampMarker(headers, activation) {
|
|
334
|
-
_headersAppend(headers, ACTIVATION_MARKER_HEADER, `pulled;ms=${activation.pulledMs}`);
|
|
335
|
-
if (activation.markerDigest) _headersAppend(headers, ACTIVATION_DIGEST_HEADER, activation.markerDigest);
|
|
336
|
-
}
|
|
337
|
-
function toBase64Url(bytes) {
|
|
338
|
-
let bin = "";
|
|
339
|
-
for (const b of bytes) bin += String.fromCharCode(b);
|
|
340
|
-
return _btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
341
|
-
}
|
|
342
|
-
function fromBase64Url(value) {
|
|
343
|
-
const b64 = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
344
|
-
const padded = b64 + "=".repeat((4 - b64.length % 4) % 4);
|
|
345
|
-
const bin = _atob(padded);
|
|
346
|
-
const bytes = new _Uint8Array(bin.length);
|
|
347
|
-
for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
|
|
348
|
-
return bytes;
|
|
349
|
-
}
|
|
350
|
-
export {
|
|
351
|
-
activationProof,
|
|
352
|
-
ensureActivation,
|
|
353
|
-
errorDigest,
|
|
354
|
-
markerDigest,
|
|
355
|
-
takeActivationChallenge,
|
|
356
|
-
withoutActivationHeaders
|
|
357
|
-
};
|