@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.
Files changed (68) hide show
  1. package/dist/bridge.d.ts +23 -0
  2. package/dist/bridge.d.ts.map +1 -0
  3. package/dist/bridge.js +53 -0
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/browser-runtime.d.ts +58 -0
  6. package/dist/browser-runtime.d.ts.map +1 -0
  7. package/dist/browser-runtime.js +214 -0
  8. package/dist/browser-runtime.js.map +1 -0
  9. package/dist/browser-tls-rustls/browser_tls_rustls.d.ts +49 -0
  10. package/dist/browser-tls-rustls/browser_tls_rustls.js +401 -0
  11. package/dist/browser-tls-rustls/browser_tls_rustls_bg.wasm +0 -0
  12. package/dist/client.d.ts +22 -0
  13. package/dist/client.d.ts.map +1 -0
  14. package/dist/client.js +408 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/derivatives.d.ts +51 -0
  17. package/dist/derivatives.d.ts.map +1 -0
  18. package/dist/derivatives.js +87 -0
  19. package/dist/derivatives.js.map +1 -0
  20. package/dist/diagnostics.d.ts +166 -0
  21. package/dist/diagnostics.d.ts.map +1 -0
  22. package/dist/diagnostics.js +265 -0
  23. package/dist/diagnostics.js.map +1 -0
  24. package/dist/index.d.ts +18 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +19 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/mcp-store.d.ts +35 -0
  29. package/dist/mcp-store.d.ts.map +1 -0
  30. package/dist/mcp-store.js +208 -0
  31. package/dist/mcp-store.js.map +1 -0
  32. package/dist/owner-binding.d.ts +7 -0
  33. package/dist/owner-binding.d.ts.map +1 -0
  34. package/dist/owner-binding.js +18 -0
  35. package/dist/owner-binding.js.map +1 -0
  36. package/dist/persistence.d.ts +69 -0
  37. package/dist/persistence.d.ts.map +1 -0
  38. package/dist/persistence.js +58 -0
  39. package/dist/persistence.js.map +1 -0
  40. package/dist/relay-tls.d.ts +61 -0
  41. package/dist/relay-tls.d.ts.map +1 -0
  42. package/dist/relay-tls.js +316 -0
  43. package/dist/relay-tls.js.map +1 -0
  44. package/dist/relay.d.ts +149 -0
  45. package/dist/relay.d.ts.map +1 -0
  46. package/dist/relay.js +646 -0
  47. package/dist/relay.js.map +1 -0
  48. package/dist/runtime.d.ts +188 -0
  49. package/dist/runtime.d.ts.map +1 -0
  50. package/dist/runtime.js +1178 -0
  51. package/dist/runtime.js.map +1 -0
  52. package/dist/state.d.ts +72 -0
  53. package/dist/state.d.ts.map +1 -0
  54. package/dist/state.js +366 -0
  55. package/dist/state.js.map +1 -0
  56. package/dist/storage-utils.d.ts +8 -0
  57. package/dist/storage-utils.d.ts.map +1 -0
  58. package/dist/storage-utils.js +67 -0
  59. package/dist/storage-utils.js.map +1 -0
  60. package/dist/storage.d.ts +61 -0
  61. package/dist/storage.d.ts.map +1 -0
  62. package/dist/storage.js +718 -0
  63. package/dist/storage.js.map +1 -0
  64. package/dist/sync.d.ts +58 -0
  65. package/dist/sync.d.ts.map +1 -0
  66. package/dist/sync.js +216 -0
  67. package/dist/sync.js.map +1 -0
  68. 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":"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"}
@@ -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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"}