@opendatalabs/personal-server-ts-lite 0.0.1-canary.00328bf
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/dist/bridge.d.ts +23 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +53 -0
- package/dist/bridge.js.map +1 -0
- package/dist/browser-runtime.d.ts +58 -0
- package/dist/browser-runtime.d.ts.map +1 -0
- package/dist/browser-runtime.js +214 -0
- package/dist/browser-runtime.js.map +1 -0
- package/dist/browser-tls-rustls/browser_tls_rustls.d.ts +49 -0
- package/dist/browser-tls-rustls/browser_tls_rustls.js +401 -0
- package/dist/browser-tls-rustls/browser_tls_rustls_bg.wasm +0 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +408 -0
- package/dist/client.js.map +1 -0
- package/dist/derivatives.d.ts +51 -0
- package/dist/derivatives.d.ts.map +1 -0
- package/dist/derivatives.js +87 -0
- package/dist/derivatives.js.map +1 -0
- package/dist/diagnostics.d.ts +166 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +265 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-store.d.ts +35 -0
- package/dist/mcp-store.d.ts.map +1 -0
- package/dist/mcp-store.js +208 -0
- package/dist/mcp-store.js.map +1 -0
- package/dist/owner-binding.d.ts +7 -0
- package/dist/owner-binding.d.ts.map +1 -0
- package/dist/owner-binding.js +18 -0
- package/dist/owner-binding.js.map +1 -0
- package/dist/persistence.d.ts +69 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +58 -0
- package/dist/persistence.js.map +1 -0
- package/dist/relay-tls.d.ts +61 -0
- package/dist/relay-tls.d.ts.map +1 -0
- package/dist/relay-tls.js +316 -0
- package/dist/relay-tls.js.map +1 -0
- package/dist/relay.d.ts +149 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +646 -0
- package/dist/relay.js.map +1 -0
- package/dist/runtime.d.ts +188 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1178 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state.d.ts +72 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +366 -0
- package/dist/state.js.map +1 -0
- package/dist/storage-utils.d.ts +8 -0
- package/dist/storage-utils.d.ts.map +1 -0
- package/dist/storage-utils.js +67 -0
- package/dist/storage-utils.js.map +1 -0
- package/dist/storage.d.ts +61 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +718 -0
- package/dist/storage.js.map +1 -0
- package/dist/sync.d.ts +58 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +216 -0
- package/dist/sync.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import forge from "node-forge";
|
|
2
|
+
import initRustls, { TlsServer as RustlsServer, } from "./browser-tls-rustls/browser_tls_rustls.js";
|
|
3
|
+
const TLS_IDENTITY_CACHE_KEY = "personal-server-lite-tls-identity-v1";
|
|
4
|
+
const DEFAULT_PUBLIC_SUFFIX = "34.16.49.200.sslip.io";
|
|
5
|
+
const DEFAULT_ISSUE_CERT_TIMEOUT_MS = 60_000;
|
|
6
|
+
let rustlsInitPromise;
|
|
7
|
+
export function createRustlsPsLiteRelayTlsFactory(options) {
|
|
8
|
+
// Only a trusted relay identity is memoized for the factory's lifetime. A
|
|
9
|
+
// self-signed fallback must NOT be: it means issuance failed on this attempt
|
|
10
|
+
// (no issueToken yet, certificate endpoint error/timeout), and locking it in
|
|
11
|
+
// would strand the tab on an untrusted cert forever — even after a reconnect
|
|
12
|
+
// delivers a fresh issueToken (BUI-664). The relay factory outlives every
|
|
13
|
+
// reconnect, so a first-attempt fallback used to pin the whole session to
|
|
14
|
+
// self-signed. Leaving it unmemoized lets the next prepare/createStream retry
|
|
15
|
+
// issuance (or hit the persisted certificate cache once it succeeds).
|
|
16
|
+
let trustedIdentity;
|
|
17
|
+
let inFlight;
|
|
18
|
+
let inFlightToken;
|
|
19
|
+
// Do not create the browser default here: merely composing a relay factory
|
|
20
|
+
// must remain safe in a native/SSR host that has not injected localStorage.
|
|
21
|
+
// The default adapter is resolved only when a relay actually prepares TLS.
|
|
22
|
+
const identityStore = options.identityStore ??
|
|
23
|
+
(options.storage
|
|
24
|
+
? createLocalStoragePsLiteRelayTlsIdentityStore(options.storage)
|
|
25
|
+
: undefined);
|
|
26
|
+
async function resolveIdentity(input) {
|
|
27
|
+
if (trustedIdentity) {
|
|
28
|
+
return trustedIdentity;
|
|
29
|
+
}
|
|
30
|
+
// Coalesce concurrent callers onto one attempt, but clear on settle so a
|
|
31
|
+
// failed (self-signed) attempt doesn't block the next retry. A caller that
|
|
32
|
+
// brings a fresh issueToken must NOT join an in-flight attempt made with
|
|
33
|
+
// different (or no) credentials: that attempt can settle self-signed even
|
|
34
|
+
// though this caller could mint a trusted cert, and the first strict-TLS
|
|
35
|
+
// stream after recovery would still get the untrusted identity. Such a
|
|
36
|
+
// caller starts its own attempt; the superseded one settles harmlessly.
|
|
37
|
+
const token = input.issueToken ?? "";
|
|
38
|
+
if (!inFlight || (token && token !== inFlightToken)) {
|
|
39
|
+
const attempt = createTlsIdentity(input, options, identityStore ?? createLocalStoragePsLiteRelayTlsIdentityStore()).finally(() => {
|
|
40
|
+
if (inFlight === attempt) {
|
|
41
|
+
inFlight = undefined;
|
|
42
|
+
inFlightToken = undefined;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
inFlight = attempt;
|
|
46
|
+
inFlightToken = token;
|
|
47
|
+
}
|
|
48
|
+
const identity = await inFlight;
|
|
49
|
+
if (identity.trusted) {
|
|
50
|
+
trustedIdentity = identity;
|
|
51
|
+
}
|
|
52
|
+
else if (trustedIdentity) {
|
|
53
|
+
// A concurrent tokened attempt settled trusted while this caller was
|
|
54
|
+
// awaiting a fallback attempt — serve the trusted identity instead of
|
|
55
|
+
// handing one last stream a self-signed cert.
|
|
56
|
+
return trustedIdentity;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
options.logger?.(`serving self-signed cert for ${identity.hostname}; relay certificate unavailable this attempt, will retry on the next stream/reconnect`);
|
|
60
|
+
}
|
|
61
|
+
return identity;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
async prepare(input) {
|
|
65
|
+
await resolveIdentity(input);
|
|
66
|
+
},
|
|
67
|
+
async createStream(input) {
|
|
68
|
+
await ensureRustls();
|
|
69
|
+
const identity = await resolveIdentity(input);
|
|
70
|
+
const tls = new RustlsServer(identity.certPem, identity.keyPem);
|
|
71
|
+
return createRustlsStream(tls);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function psLiteRelayPublicHost(sessionId, publicSuffix = DEFAULT_PUBLIC_SUFFIX) {
|
|
76
|
+
return `${sessionId}.${publicSuffix.replace(/^\./, "")}`;
|
|
77
|
+
}
|
|
78
|
+
export function psLiteRelayPublicUrl(sessionId, publicSuffix = DEFAULT_PUBLIC_SUFFIX) {
|
|
79
|
+
return `https://${psLiteRelayPublicHost(sessionId, publicSuffix)}`;
|
|
80
|
+
}
|
|
81
|
+
function createRustlsStream(tls) {
|
|
82
|
+
return {
|
|
83
|
+
processTls(payload) {
|
|
84
|
+
return normalizeTlsStep(tls.process_tls(payload));
|
|
85
|
+
},
|
|
86
|
+
writePlaintext(payload, endStream) {
|
|
87
|
+
return normalizeTlsStep(tls.write_plaintext(payload, endStream));
|
|
88
|
+
},
|
|
89
|
+
close() {
|
|
90
|
+
tls.free();
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function ensureRustls() {
|
|
95
|
+
rustlsInitPromise ??= initRustls();
|
|
96
|
+
return rustlsInitPromise;
|
|
97
|
+
}
|
|
98
|
+
function normalizeTlsStep(value) {
|
|
99
|
+
const step = value;
|
|
100
|
+
return {
|
|
101
|
+
plaintext: step.plaintext instanceof Uint8Array ? step.plaintext : new Uint8Array(),
|
|
102
|
+
tls: step.tls instanceof Uint8Array ? step.tls : new Uint8Array(),
|
|
103
|
+
handshaking: Boolean(step.handshaking),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function createTlsIdentity(input, options, identityStore) {
|
|
107
|
+
const hostname = psLiteRelayPublicHost(input.sessionId, options.publicSuffix);
|
|
108
|
+
const cached = await readCachedTlsIdentity(hostname, identityStore);
|
|
109
|
+
if (cached) {
|
|
110
|
+
return cached;
|
|
111
|
+
}
|
|
112
|
+
// Fetch the relay's shared wildcard cert+key for this session (POST
|
|
113
|
+
// /session-cert). This replaces per-session ACME: the relay issues one
|
|
114
|
+
// `*.<suffix>` cert and hands it to every session, so there is no per-session
|
|
115
|
+
// DNS-01 challenge, no TXT-propagation race, and no Let's Encrypt rate-limit
|
|
116
|
+
// exposure. The wildcard SAN covers our `<sessionId>.<suffix>` hostname.
|
|
117
|
+
const wildcard = await requestSessionCertificate({
|
|
118
|
+
issuerUrl: resolveSessionCertUrl(options),
|
|
119
|
+
sessionId: input.sessionId,
|
|
120
|
+
issueToken: input.issueToken ?? "",
|
|
121
|
+
hostname,
|
|
122
|
+
identityStore,
|
|
123
|
+
logger: options.logger,
|
|
124
|
+
timeoutMs: options.issueCertTimeoutMs ?? DEFAULT_ISSUE_CERT_TIMEOUT_MS,
|
|
125
|
+
});
|
|
126
|
+
if (wildcard) {
|
|
127
|
+
return wildcard;
|
|
128
|
+
}
|
|
129
|
+
// Unmemoized self-signed fallback (BUI-664): the relay was unreachable or the
|
|
130
|
+
// wildcard was unavailable this attempt; retry issuance on the next stream.
|
|
131
|
+
const keys = await generateKeyPair();
|
|
132
|
+
const keyPem = forge.pki.privateKeyToPem(keys.privateKey);
|
|
133
|
+
return createSelfSignedIdentity(hostname, keyPem, keys);
|
|
134
|
+
}
|
|
135
|
+
function generateKeyPair() {
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
forge.pki.rsa.generateKeyPair({ bits: 2048, workers: -1 }, (error, keyPair) => {
|
|
138
|
+
if (error || !keyPair) {
|
|
139
|
+
reject(error ?? new Error("failed to generate keypair"));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
resolve(keyPair);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function createSelfSignedIdentity(hostname, keyPem, keys) {
|
|
147
|
+
const cert = forge.pki.createCertificate();
|
|
148
|
+
cert.publicKey = keys.publicKey;
|
|
149
|
+
cert.serialNumber = Array.from(crypto.getRandomValues(new Uint8Array(12)), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
150
|
+
cert.validity.notBefore = new Date(Date.now() - 60_000);
|
|
151
|
+
cert.validity.notAfter = new Date(Date.now() + 24 * 60 * 60 * 1000);
|
|
152
|
+
const attrs = [{ name: "commonName", value: hostname }];
|
|
153
|
+
cert.setSubject(attrs);
|
|
154
|
+
cert.setIssuer(attrs);
|
|
155
|
+
cert.setExtensions([
|
|
156
|
+
{ name: "basicConstraints", cA: false },
|
|
157
|
+
{ name: "keyUsage", digitalSignature: true, keyEncipherment: true },
|
|
158
|
+
{ name: "extKeyUsage", serverAuth: true },
|
|
159
|
+
{
|
|
160
|
+
name: "subjectAltName",
|
|
161
|
+
altNames: [{ type: 2, value: hostname }],
|
|
162
|
+
},
|
|
163
|
+
]);
|
|
164
|
+
cert.sign(keys.privateKey, forge.md.sha256.create());
|
|
165
|
+
return {
|
|
166
|
+
certPem: forge.pki.certificateToPem(cert),
|
|
167
|
+
keyPem,
|
|
168
|
+
hostname,
|
|
169
|
+
source: "self-signed",
|
|
170
|
+
trusted: false,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function issueCertAbortSignal(timeoutMs) {
|
|
174
|
+
return typeof AbortSignal !== "undefined" &&
|
|
175
|
+
typeof AbortSignal.timeout === "function"
|
|
176
|
+
? AbortSignal.timeout(timeoutMs)
|
|
177
|
+
: undefined;
|
|
178
|
+
}
|
|
179
|
+
function withIssueCertTimeout(promise, timeoutMs) {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
const timer = setTimeout(() => {
|
|
182
|
+
reject(new Error(`certificate issuer did not respond within ${timeoutMs}ms`));
|
|
183
|
+
}, timeoutMs);
|
|
184
|
+
promise.then((value) => {
|
|
185
|
+
clearTimeout(timer);
|
|
186
|
+
resolve(value);
|
|
187
|
+
}, (error) => {
|
|
188
|
+
clearTimeout(timer);
|
|
189
|
+
reject(error);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function resolveSessionCertUrl(options) {
|
|
194
|
+
const base = options.certIssuerUrl
|
|
195
|
+
? options.certIssuerUrl.replace(/\/+$/, "").replace(/\/issue-cert$/, "")
|
|
196
|
+
: (() => {
|
|
197
|
+
const url = new URL(options.controlUrl);
|
|
198
|
+
url.protocol = url.protocol === "wss:" ? "https:" : "http:";
|
|
199
|
+
url.pathname = "";
|
|
200
|
+
url.search = "";
|
|
201
|
+
url.hash = "";
|
|
202
|
+
return url.toString().replace(/\/+$/, "");
|
|
203
|
+
})();
|
|
204
|
+
return `${base}/session-cert`;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Fetch the relay's shared wildcard cert+key for this browser session. Unlike
|
|
208
|
+
* the per-session ACME path, the relay already holds the cert, so this is a
|
|
209
|
+
* fast lookup with no DNS challenge. Returns undefined (self-signed fallback)
|
|
210
|
+
* on any failure.
|
|
211
|
+
*/
|
|
212
|
+
async function requestSessionCertificate(input) {
|
|
213
|
+
if (!input.issueToken) {
|
|
214
|
+
input.logger?.("session issue token unavailable; using self-signed certificate");
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
return await withIssueCertTimeout(fetchSessionCert(input), input.timeoutMs);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
input.logger?.(error instanceof Error ? error.message : String(error));
|
|
222
|
+
input.logger?.("session certificate request failed; using self-signed certificate");
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function fetchSessionCert(input) {
|
|
227
|
+
const response = await fetch(input.issuerUrl, {
|
|
228
|
+
method: "POST",
|
|
229
|
+
headers: { "content-type": "application/json" },
|
|
230
|
+
body: JSON.stringify({
|
|
231
|
+
sessionId: input.sessionId,
|
|
232
|
+
issueToken: input.issueToken,
|
|
233
|
+
}),
|
|
234
|
+
signal: issueCertAbortSignal(input.timeoutMs),
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
const detail = await response.text();
|
|
238
|
+
input.logger?.(`session-cert unavailable (${response.status}); using self-signed certificate`);
|
|
239
|
+
input.logger?.(detail.slice(0, 240));
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
const payload = (await response.json());
|
|
243
|
+
if (!payload.certPem || !payload.keyPem) {
|
|
244
|
+
input.logger?.("session-cert returned no certificate; using self-signed certificate");
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
const identity = {
|
|
248
|
+
certPem: payload.certPem,
|
|
249
|
+
keyPem: payload.keyPem,
|
|
250
|
+
hostname: input.hostname,
|
|
251
|
+
source: "acme",
|
|
252
|
+
trusted: true,
|
|
253
|
+
};
|
|
254
|
+
try {
|
|
255
|
+
await cacheTlsIdentity(identity, input.identityStore);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
input.logger?.(`failed to persist session certificate (${error instanceof Error ? error.message : String(error)}); continuing with the in-memory identity`);
|
|
259
|
+
}
|
|
260
|
+
return identity;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Browser default relay TLS identity store: persists the issued cert in
|
|
264
|
+
* `localStorage`, matching PS Lite's pre-injection behavior byte for byte. This
|
|
265
|
+
* is the one place the relay TLS path is allowed to touch a browser global; the
|
|
266
|
+
* resolution logic above goes through the injected {@link PsLiteRelayTlsIdentityStore}.
|
|
267
|
+
*/
|
|
268
|
+
export function createLocalStoragePsLiteRelayTlsIdentityStore(storage = globalThis.localStorage) {
|
|
269
|
+
return {
|
|
270
|
+
read(hostname) {
|
|
271
|
+
const raw = storage.getItem(`${TLS_IDENTITY_CACHE_KEY}:${hostname}`);
|
|
272
|
+
return raw ? JSON.parse(raw) : null;
|
|
273
|
+
},
|
|
274
|
+
write(identity) {
|
|
275
|
+
storage.setItem(`${TLS_IDENTITY_CACHE_KEY}:${identity.hostname}`, JSON.stringify(identity));
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async function readCachedTlsIdentity(hostname, identityStore) {
|
|
280
|
+
try {
|
|
281
|
+
const identity = await identityStore.read(hostname);
|
|
282
|
+
if (!identity ||
|
|
283
|
+
identity.hostname !== hostname ||
|
|
284
|
+
!identity.certPem ||
|
|
285
|
+
!identity.keyPem ||
|
|
286
|
+
identity.source !== "acme") {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
const notAfter = firstCertificateNotAfter(identity.certPem);
|
|
290
|
+
if (notAfter.getTime() - Date.now() < 24 * 60 * 60 * 1000) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
...identity,
|
|
295
|
+
source: "cached-acme",
|
|
296
|
+
trusted: true,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function cacheTlsIdentity(identity, identityStore) {
|
|
304
|
+
if (identity.source !== "acme") {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
await identityStore.write(identity);
|
|
308
|
+
}
|
|
309
|
+
function firstCertificateNotAfter(certPem) {
|
|
310
|
+
const match = certPem.match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/);
|
|
311
|
+
if (!match) {
|
|
312
|
+
return new Date(0);
|
|
313
|
+
}
|
|
314
|
+
return forge.pki.certificateFromPem(match[0]).validity.notAfter;
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=relay-tls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-tls.js","sourceRoot":"","sources":["../src/relay-tls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAAU,EAAE,EACjB,SAAS,IAAI,YAAY,GAC1B,MAAM,4CAA4C,CAAC;AASpD,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AACtE,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AACtD,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAwD7C,IAAI,iBAA+C,CAAC;AAEpD,MAAM,UAAU,iCAAiC,CAC/C,OAAoC;IAEpC,0EAA0E;IAC1E,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,eAAmD,CAAC;IACxD,IAAI,QAAqD,CAAC;IAC1D,IAAI,aAAiC,CAAC;IACtC,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,aAAa,GACjB,OAAO,CAAC,aAAa;QACrB,CAAC,OAAO,CAAC,OAAO;YACd,CAAC,CAAC,6CAA6C,CAAC,OAAO,CAAC,OAAO,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjB,KAAK,UAAU,eAAe,CAC5B,KAAiC;QAEjC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,yEAAyE;QACzE,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,aAAa,CAAC,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,iBAAiB,CAC/B,KAAK,EACL,OAAO,EACP,aAAa,IAAI,6CAA6C,EAAE,CACjE,CAAC,OAAO,CAAC,GAAG,EAAE;gBACb,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,QAAQ,GAAG,SAAS,CAAC;oBACrB,aAAa,GAAG,SAAS,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,QAAQ,GAAG,OAAO,CAAC;YACnB,aAAa,GAAG,KAAK,CAAC;QACxB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;QAChC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,eAAe,GAAG,QAAQ,CAAC;QAC7B,CAAC;aAAM,IAAI,eAAe,EAAE,CAAC;YAC3B,qEAAqE;YACrE,sEAAsE;YACtE,8CAA8C;YAC9C,OAAO,eAAe,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,EAAE,CACd,gCAAgC,QAAQ,CAAC,QAAQ,uFAAuF,CACzI,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,KAAiC;YAC7C,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,KAAgC;YACjD,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChE,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,YAAY,GAAG,qBAAqB;IAEpC,OAAO,GAAG,SAAS,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,YAAY,GAAG,qBAAqB;IAEpC,OAAO,WAAW,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAiB;IAC3C,OAAO;QACL,UAAU,CAAC,OAAO;YAChB,OAAO,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,cAAc,CAAC,OAAO,EAAE,SAAS;YAC/B,OAAO,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,KAAK;YACH,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,iBAAiB,KAAK,UAAU,EAAE,CAAC;IACnC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,MAAM,IAAI,GAAG,KAAoC,CAAC;IAClD,OAAO;QACL,SAAS,EACP,IAAI,CAAC,SAAS,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE;QAC1E,GAAG,EAAE,IAAI,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE;QACjE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAiC,EACjC,OAAoC,EACpC,aAA0C;IAE1C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oEAAoE;IACpE,uEAAuE;IACvE,8EAA8E;IAC9E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,SAAS,EAAE,qBAAqB,CAAC,OAAO,CAAC;QACzC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,QAAQ;QACR,aAAa;QACb,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,kBAAkB,IAAI,6BAA6B;KACvE,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAC3B,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAC3B,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACjB,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAgB,EAChB,MAAc,EACd,IAA2B;IAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAC5B,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,EAC1C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAC7C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,aAAa,CAAC;QACjB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,KAAK,EAAE;QACvC,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;QACnE,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE;QACzC;YACE,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SACzC;KACF,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;QACzC,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO,OAAO,WAAW,KAAK,WAAW;QACvC,OAAO,WAAW,CAAC,OAAO,KAAK,UAAU;QACzC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;QAChC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAmB,EACnB,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CACJ,IAAI,KAAK,CAAC,6CAA6C,SAAS,IAAI,CAAC,CACtE,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAoC;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa;QAChC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG,IAAI,eAAe,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,yBAAyB,CAAC,KAQxC;IACC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,EAAE,CACZ,gEAAgE,CACjE,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,MAAM,EAAE,CACZ,mEAAmE,CACpE,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAQ/B;IACC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;QACF,MAAM,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC;KAC9C,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,CAAC,MAAM,EAAE,CACZ,6BAA6B,QAAQ,CAAC,MAAM,kCAAkC,CAC/E,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGrC,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,KAAK,CAAC,MAAM,EAAE,CACZ,qEAAqE,CACtE,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAA2B;QACvC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,IAAI;KACd,CAAC;IACF,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,MAAM,EAAE,CACZ,0CAA0C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAC5I,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6CAA6C,CAC3D,UAAmB,UAAU,CAAC,YAAY;IAE1C,OAAO;QACL,IAAI,CAAC,QAAQ;YACX,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,sBAAsB,IAAI,QAAQ,EAAE,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,OAAO,CAAC,OAAO,CACb,GAAG,sBAAsB,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAChD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,aAA0C;IAE1C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,IACE,CAAC,QAAQ;YACT,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YAC9B,CAAC,QAAQ,CAAC,OAAO;YACjB,CAAC,QAAQ,CAAC,MAAM;YAChB,QAAQ,CAAC,MAAM,KAAK,MAAM,EAC1B,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,GAAG,QAAQ;YACX,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgC,EAChC,aAA0C;IAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CACzB,8DAA8D,CAC/D,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAClE,CAAC"}
|
package/dist/relay.d.ts
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type { PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
|
|
2
|
+
import { type PsLiteBridgeResponse } from "./bridge.js";
|
|
3
|
+
import type { PsLiteRelayTlsIdentityStore } from "./relay-tls.js";
|
|
4
|
+
import type { PsLiteRuntime } from "./runtime.js";
|
|
5
|
+
export interface PsLiteRelayClientOptions {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
runtime: PsLiteRuntime;
|
|
8
|
+
controlUrl?: string;
|
|
9
|
+
publicSuffix?: string;
|
|
10
|
+
certIssuerUrl?: string;
|
|
11
|
+
origin?: string;
|
|
12
|
+
webSocketFactory?: PsLiteRelayWebSocketFactory;
|
|
13
|
+
tls?: PsLiteRelayTlsFactory | false;
|
|
14
|
+
/** Host-owned cache for the issued relay certificate identity. */
|
|
15
|
+
tlsIdentityStore?: PsLiteRelayTlsIdentityStore;
|
|
16
|
+
logger?: (line: string) => void;
|
|
17
|
+
onStatus?: (status: PsLiteRelayStatus, detail?: PsLiteRelayStatusDetail) => void;
|
|
18
|
+
/** Heartbeat ping cadence (ms). Default 20_000. */
|
|
19
|
+
heartbeatIntervalMs?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Force-reconnect when a ping the client actually sent goes unanswered by
|
|
22
|
+
* ANY relay frame for this long, measured by wall clock (ms). Default 45_000.
|
|
23
|
+
*/
|
|
24
|
+
heartbeatTimeoutMs?: number;
|
|
25
|
+
/** First reconnect backoff delay (ms); doubles up to the max. Default 1_000. */
|
|
26
|
+
reconnectInitialDelayMs?: number;
|
|
27
|
+
/** Max reconnect backoff delay (ms). Default 30_000. */
|
|
28
|
+
reconnectMaxDelayMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export type PsLiteRelayStatus = "connecting" | "connected" | "disconnected" | "closed" | "replaced" | "error";
|
|
31
|
+
/**
|
|
32
|
+
* Extra context for a relay status transition — the WebSocket close code/reason
|
|
33
|
+
* on `disconnected` / `closed` / `replaced`. Lets consumers distinguish an
|
|
34
|
+
* abnormal drop (1006) from a takeover (1012) or a clean close (1000) for
|
|
35
|
+
* reliability telemetry. Optional and additive: 1-arg `onStatus` handlers stay
|
|
36
|
+
* valid.
|
|
37
|
+
*/
|
|
38
|
+
export interface PsLiteRelayStatusDetail {
|
|
39
|
+
code?: number;
|
|
40
|
+
reason?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Close code the relay sends to the losing side when a new connection claims
|
|
44
|
+
* the same sessionId. Terminal for this client: reconnecting would evict the
|
|
45
|
+
* winner right back and the two tabs would trade the session every backoff
|
|
46
|
+
* tick (observed live as a 1012 eviction loop every ~2s with two app tabs).
|
|
47
|
+
*/
|
|
48
|
+
export declare const RELAY_CLOSE_SESSION_REPLACED = 1012;
|
|
49
|
+
export interface PsLiteRelayClient {
|
|
50
|
+
readonly sessionId: string;
|
|
51
|
+
readonly url: string;
|
|
52
|
+
close(reason?: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Resolves once the relay has finished delivering everything in flight: no
|
|
55
|
+
* HTTP streams open and the socket's send buffer empty. A non-OPEN socket
|
|
56
|
+
* counts as drained (its buffered bytes died with it and reconnect starts
|
|
57
|
+
* from a clean slate). Resolves after `timeoutMs` regardless, so callers can
|
|
58
|
+
* never deadlock on a wedged tunnel.
|
|
59
|
+
*/
|
|
60
|
+
whenDrained(options?: {
|
|
61
|
+
/** Max time to wait before resolving anyway (ms). Default 20_000. */
|
|
62
|
+
timeoutMs?: number;
|
|
63
|
+
/** Drain-state poll cadence (ms). Default 50. */
|
|
64
|
+
pollIntervalMs?: number;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export interface PsLiteRelayWebSocketFactory {
|
|
68
|
+
(url: string): PsLiteRelayWebSocket;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Subset of the standard CloseEvent the relay client reads. Browser
|
|
72
|
+
* WebSockets pass a full CloseEvent here; fakes may call onclose with
|
|
73
|
+
* nothing (treated as an abnormal close).
|
|
74
|
+
*/
|
|
75
|
+
export interface PsLiteRelayCloseEvent {
|
|
76
|
+
code?: number;
|
|
77
|
+
reason?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface PsLiteRelayWebSocket {
|
|
80
|
+
binaryType: string;
|
|
81
|
+
readonly readyState: number;
|
|
82
|
+
readonly OPEN: number;
|
|
83
|
+
readonly CONNECTING: number;
|
|
84
|
+
/**
|
|
85
|
+
* Bytes accepted by send() but not yet flushed to the network (standard
|
|
86
|
+
* WebSocket.bufferedAmount). Optional so lightweight fakes can omit it;
|
|
87
|
+
* treated as 0 when absent.
|
|
88
|
+
*/
|
|
89
|
+
readonly bufferedAmount?: number;
|
|
90
|
+
onopen: (() => void) | null;
|
|
91
|
+
onmessage: ((event: {
|
|
92
|
+
data: string | ArrayBuffer | Uint8Array;
|
|
93
|
+
}) => void) | null;
|
|
94
|
+
onclose: ((event?: PsLiteRelayCloseEvent) => void) | null;
|
|
95
|
+
onerror: (() => void) | null;
|
|
96
|
+
send(data: string | Uint8Array): void;
|
|
97
|
+
close(code?: number, reason?: string): void;
|
|
98
|
+
}
|
|
99
|
+
export interface PsLiteRelayTlsFactory {
|
|
100
|
+
prepare?(input: PsLiteRelayTlsPrepareInput): Promise<void>;
|
|
101
|
+
createStream(input: PsLiteRelayTlsStreamInput): Promise<PsLiteRelayTlsStream>;
|
|
102
|
+
}
|
|
103
|
+
export interface PsLiteRelayTlsPrepareInput {
|
|
104
|
+
sessionId: string;
|
|
105
|
+
issueToken?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface PsLiteRelayTlsStreamInput {
|
|
108
|
+
sessionId: string;
|
|
109
|
+
streamId: number;
|
|
110
|
+
issueToken?: string;
|
|
111
|
+
}
|
|
112
|
+
export interface PsLiteRelayTlsStream {
|
|
113
|
+
processTls(payload: Uint8Array): PsLiteRelayTlsStep;
|
|
114
|
+
writePlaintext(payload: Uint8Array, endStream: boolean): PsLiteRelayTlsStep;
|
|
115
|
+
close?(): void;
|
|
116
|
+
}
|
|
117
|
+
export interface PsLiteRelayTlsStep {
|
|
118
|
+
plaintext: Uint8Array;
|
|
119
|
+
tls: Uint8Array;
|
|
120
|
+
handshaking?: boolean;
|
|
121
|
+
}
|
|
122
|
+
export declare function psLiteRelayControlUrl(sessionId: string, controlUrl?: string): string;
|
|
123
|
+
export declare function psLiteRelayPublicUrl(sessionId: string, publicSuffix?: string): string;
|
|
124
|
+
/**
|
|
125
|
+
* Defers read-fulfillment reports until the relay has delivered the in-flight
|
|
126
|
+
* response. The core data handler reports fulfillment as soon as it BUILDS the
|
|
127
|
+
* response, but over the relay the (potentially multi-MB) body still has to be
|
|
128
|
+
* pumped through TLS over the WebSocket. Consumers act on the report
|
|
129
|
+
* immediately — the DCR approval page closes the tab hosting this PS — so an
|
|
130
|
+
* eager report kills the tunnel mid-transfer and the builder gets a truncated
|
|
131
|
+
* body (UND_ERR_RES_CONTENT_LENGTH_MISMATCH) after escrow already settled.
|
|
132
|
+
* Gating the report on relay drain makes "fulfilled" mean "delivered".
|
|
133
|
+
*
|
|
134
|
+
* `getRelayClient` is late-bound: the runtime needs the reporter at
|
|
135
|
+
* construction time, before the relay client exists. When it returns
|
|
136
|
+
* undefined (relay disabled / not started yet), reports pass straight through.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createRelayDrainGatedReadFulfillmentReporter(reporter: PersonalServerReadFulfillmentReporter, getRelayClient: () => Pick<PsLiteRelayClient, "whenDrained"> | undefined): PersonalServerReadFulfillmentReporter;
|
|
139
|
+
export declare function startPsLiteRelayClient(options: PsLiteRelayClientOptions): PsLiteRelayClient;
|
|
140
|
+
export declare function buildHttpResponse(response: PsLiteBridgeResponse, opts?: {
|
|
141
|
+
bodyOverride?: Uint8Array;
|
|
142
|
+
contentEncoding?: string;
|
|
143
|
+
}): string;
|
|
144
|
+
export declare function encodeDataFrame(streamId: number, payload: Uint8Array): Uint8Array;
|
|
145
|
+
export declare function decodeDataFrame(data: string | ArrayBuffer | Uint8Array): {
|
|
146
|
+
streamId: number;
|
|
147
|
+
payload: Uint8Array;
|
|
148
|
+
} | null;
|
|
149
|
+
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|