@bjorntech/key-ferry 0.0.0-stage → 0.1.4

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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +209 -2
  3. package/SECURITY.md +87 -0
  4. package/dist/contracts.d.ts +133 -0
  5. package/dist/contracts.d.ts.map +1 -0
  6. package/dist/contracts.js +29 -0
  7. package/dist/contracts.js.map +1 -0
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +12 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/options.d.ts +44 -0
  13. package/dist/options.d.ts.map +1 -0
  14. package/dist/options.js +260 -0
  15. package/dist/options.js.map +1 -0
  16. package/dist/plugin.d.ts +24 -0
  17. package/dist/plugin.d.ts.map +1 -0
  18. package/dist/plugin.js +215 -0
  19. package/dist/plugin.js.map +1 -0
  20. package/dist/relay/index.d.ts +37 -0
  21. package/dist/relay/index.d.ts.map +1 -0
  22. package/dist/relay/index.js +480 -0
  23. package/dist/relay/index.js.map +1 -0
  24. package/dist/remote.d.ts +62 -0
  25. package/dist/remote.d.ts.map +1 -0
  26. package/dist/remote.js +227 -0
  27. package/dist/remote.js.map +1 -0
  28. package/dist/rpc.d.ts +112 -0
  29. package/dist/rpc.d.ts.map +1 -0
  30. package/dist/rpc.js +117 -0
  31. package/dist/rpc.js.map +1 -0
  32. package/dist/services/process.d.ts +56 -0
  33. package/dist/services/process.d.ts.map +1 -0
  34. package/dist/services/process.js +208 -0
  35. package/dist/services/process.js.map +1 -0
  36. package/dist/tui.d.ts +59 -0
  37. package/dist/tui.d.ts.map +1 -0
  38. package/dist/tui.js +93 -0
  39. package/dist/tui.js.map +1 -0
  40. package/dist/varlock/manager.d.ts +6 -0
  41. package/dist/varlock/manager.d.ts.map +1 -0
  42. package/dist/varlock/manager.js +425 -0
  43. package/dist/varlock/manager.js.map +1 -0
  44. package/dist/varlock/protocol.d.ts +67 -0
  45. package/dist/varlock/protocol.d.ts.map +1 -0
  46. package/dist/varlock/protocol.js +248 -0
  47. package/dist/varlock/protocol.js.map +1 -0
  48. package/docs/architecture.md +179 -0
  49. package/docs/quality.md +102 -0
  50. package/docs/releasing.md +149 -0
  51. package/docs/troubleshooting.md +214 -0
  52. package/examples/.env.schema +17 -0
  53. package/examples/opencode.jsonc +44 -0
  54. package/package.json +96 -4
@@ -0,0 +1,480 @@
1
+ import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { Agent as HttpAgent, createServer, request as httpRequest, } from "node:http";
3
+ import { request as httpsRequest } from "node:https";
4
+ import { PassThrough } from "node:stream";
5
+ import { connect as tlsConnect } from "node:tls";
6
+ import { Data, Effect } from "effect";
7
+ export const RELAY_AUTH_HEADER = "x-varlock-relay-token";
8
+ export class RelayError extends Data.TaggedError("RelayError") {
9
+ }
10
+ const maxDefault = 4 * 1024 * 1024;
11
+ const connectDefault = 10_000;
12
+ const idleDefault = 120_000;
13
+ const connectionsDefault = 32;
14
+ const routesDefault = 256;
15
+ const hopByHop = new Set([
16
+ "connection",
17
+ "keep-alive",
18
+ "proxy-authenticate",
19
+ "proxy-authorization",
20
+ "te",
21
+ "trailer",
22
+ "transfer-encoding",
23
+ "upgrade",
24
+ ]);
25
+ const rejectedCredentialHeaders = new Set(["authorization", "cookie", "proxy-authorization"]);
26
+ const failure = (code) => new RelayError({ code, message: `relay ${code}` });
27
+ const parseUrl = (value, allowHttps) => {
28
+ try {
29
+ const url = new URL(value);
30
+ if ((!allowHttps && url.protocol !== "http:" && url.protocol !== "https:") ||
31
+ (allowHttps && url.protocol !== "https:"))
32
+ return undefined;
33
+ if (url.username || url.password || url.hash)
34
+ return undefined;
35
+ return url;
36
+ }
37
+ catch {
38
+ return undefined;
39
+ }
40
+ };
41
+ const isLoopback = (address) => address === "127.0.0.1" || address === "::1" || address === "::ffff:127.0.0.1";
42
+ const cleanHeaders = (headers, configured, target) => {
43
+ const result = {};
44
+ for (const [name, value] of Object.entries(headers)) {
45
+ const lower = name.toLowerCase();
46
+ if (lower === RELAY_AUTH_HEADER || hopByHop.has(lower) || lower === "host")
47
+ continue;
48
+ const replacement = configured[lower];
49
+ if (replacement !== undefined) {
50
+ result[lower] = replacement;
51
+ continue;
52
+ }
53
+ if (rejectedCredentialHeaders.has(lower))
54
+ continue;
55
+ if (value !== undefined)
56
+ result[lower] = value;
57
+ }
58
+ // The native MCP adapter deliberately does not carry credential headers.
59
+ // Inject the complete allowlisted set here, including headers absent from
60
+ // the downstream request, so authentication does not depend on clients
61
+ // echoing a header name back to the relay.
62
+ for (const [name, value] of Object.entries(configured))
63
+ result[name.toLowerCase()] = value;
64
+ result.host = target.host;
65
+ result["accept-encoding"] = "identity";
66
+ return result;
67
+ };
68
+ const responseHeaders = (headers, upstream, localOrigin, register) => {
69
+ const result = {};
70
+ for (const [name, value] of Object.entries(headers)) {
71
+ const lower = name.toLowerCase();
72
+ if (hopByHop.has(lower))
73
+ continue;
74
+ if (value === undefined)
75
+ continue;
76
+ if (lower === "location") {
77
+ const location = Array.isArray(value) ? value[0] : value;
78
+ if (location === undefined)
79
+ continue;
80
+ try {
81
+ const target = new URL(location, upstream);
82
+ if (target.protocol !== "https:" ||
83
+ target.origin !== upstream.origin ||
84
+ target.username ||
85
+ target.password ||
86
+ target.hash)
87
+ continue;
88
+ register(target);
89
+ result["location"] = `${localOrigin}${target.pathname}${target.search}`;
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ }
95
+ else
96
+ result[lower] = value;
97
+ }
98
+ return result;
99
+ };
100
+ const write = (res, chunk, signal) => {
101
+ if (res.write(chunk))
102
+ return Promise.resolve();
103
+ return new Promise((resolve, reject) => {
104
+ const done = () => {
105
+ cleanup();
106
+ resolve();
107
+ };
108
+ const fail = () => {
109
+ cleanup();
110
+ reject(failure("closed"));
111
+ };
112
+ const cleanup = () => {
113
+ res.removeListener("drain", done);
114
+ res.removeListener("close", fail);
115
+ signal.removeEventListener("abort", fail);
116
+ };
117
+ res.once("drain", done);
118
+ res.once("close", fail);
119
+ signal.addEventListener("abort", fail, { once: true });
120
+ });
121
+ };
122
+ const endpointRewrite = async function* (source, upstream, localOrigin, register, maxFrame) {
123
+ const decoder = new TextDecoder();
124
+ let pending = "";
125
+ let frame = "";
126
+ const emit = (value) => new TextEncoder().encode(value);
127
+ for await (const chunk of source) {
128
+ pending += decoder.decode(chunk, { stream: true });
129
+ if (pending.length > maxFrame * 2)
130
+ throw failure("body-too-large");
131
+ let index;
132
+ while ((index = pending.indexOf("\n")) >= 0) {
133
+ const line = pending.slice(0, index + 1);
134
+ pending = pending.slice(index + 1);
135
+ frame += line;
136
+ if (frame.length > maxFrame)
137
+ throw failure("body-too-large");
138
+ if (line === "\n" || line === "\r\n") {
139
+ const match = frame.match(/(^|\r?\n)event:\s*endpoint\s*\r?\n(?:data:\s*)([^\r\n]+)(?:\r?\n|$)/);
140
+ if (match) {
141
+ let endpoint;
142
+ try {
143
+ endpoint = new URL(match[2], upstream);
144
+ }
145
+ catch {
146
+ throw failure("path-denied");
147
+ }
148
+ if (endpoint.protocol !== "https:" ||
149
+ endpoint.origin !== upstream.origin ||
150
+ endpoint.username ||
151
+ endpoint.password ||
152
+ endpoint.hash)
153
+ throw failure("path-denied");
154
+ register(endpoint);
155
+ frame = frame.replace(match[2], `${localOrigin}${endpoint.pathname}${endpoint.search}`);
156
+ }
157
+ yield emit(frame);
158
+ frame = "";
159
+ }
160
+ }
161
+ }
162
+ pending += decoder.decode();
163
+ if (pending)
164
+ frame += pending;
165
+ if (frame)
166
+ yield emit(frame);
167
+ };
168
+ const throughProxy = (target, proxy, ca, method, headers, body, connectTimeout, idleTimeout, signal) => new Promise((resolve, reject) => {
169
+ const connectRequest = (proxy.protocol === "https:" ? httpsRequest : httpRequest)({
170
+ hostname: proxy.hostname,
171
+ port: proxy.port || (proxy.protocol === "https:" ? 443 : 80),
172
+ method: "CONNECT",
173
+ path: `${target.hostname}:${target.port || 443}`,
174
+ timeout: connectTimeout,
175
+ });
176
+ let settled = false;
177
+ let tls;
178
+ let request;
179
+ const fail = () => {
180
+ if (!settled) {
181
+ settled = true;
182
+ reject(failure("upstream-connect-failed"));
183
+ }
184
+ };
185
+ const cancel = () => {
186
+ connectRequest.destroy();
187
+ tls?.destroy();
188
+ request?.destroy();
189
+ if (!settled) {
190
+ settled = true;
191
+ reject(failure("closed"));
192
+ }
193
+ };
194
+ signal.addEventListener("abort", cancel, { once: true });
195
+ connectRequest.once("error", fail);
196
+ connectRequest.once("timeout", () => {
197
+ connectRequest.destroy();
198
+ if (!settled) {
199
+ settled = true;
200
+ reject(failure("timeout"));
201
+ }
202
+ });
203
+ connectRequest.once("connect", (response, socket) => {
204
+ if (response.statusCode !== 200) {
205
+ socket.destroy();
206
+ fail();
207
+ return;
208
+ }
209
+ try {
210
+ tls = tlsConnect({ socket, servername: target.hostname, ca, rejectUnauthorized: true });
211
+ }
212
+ catch {
213
+ socket.destroy();
214
+ if (!settled) {
215
+ settled = true;
216
+ reject(failure("upstream-tls-failed"));
217
+ }
218
+ return;
219
+ }
220
+ tls.once("error", () => {
221
+ if (!settled) {
222
+ settled = true;
223
+ reject(failure("upstream-tls-failed"));
224
+ }
225
+ });
226
+ tls.once("secureConnect", () => {
227
+ // The CONNECT socket is already a verified TLS connection to the
228
+ // Varlock MITM endpoint. Pass that socket to the plain HTTP framing
229
+ // API so no second TLS layer is created or validated.
230
+ class TunnelAgent extends HttpAgent {
231
+ createConnection(_options, callback) {
232
+ const socket = tls;
233
+ callback?.(null, socket);
234
+ return socket;
235
+ }
236
+ }
237
+ const socketAgent = new TunnelAgent({ keepAlive: false });
238
+ request = httpRequest({
239
+ hostname: target.hostname,
240
+ port: target.port || 443,
241
+ path: `${target.pathname}${target.search}`,
242
+ method,
243
+ headers,
244
+ agent: socketAgent,
245
+ timeout: idleTimeout,
246
+ });
247
+ request.once("error", () => {
248
+ if (!settled) {
249
+ settled = true;
250
+ reject(failure("upstream-connect-failed"));
251
+ }
252
+ });
253
+ const clientRequest = request;
254
+ clientRequest.once("timeout", () => clientRequest.destroy(failure("timeout")));
255
+ request.once("response", (upstreamResponse) => {
256
+ settled = true;
257
+ signal.removeEventListener("abort", cancel);
258
+ resolve({
259
+ statusCode: upstreamResponse.statusCode ?? 502,
260
+ headers: upstreamResponse.headers,
261
+ body: upstreamResponse,
262
+ });
263
+ });
264
+ if (body)
265
+ body.pipe(request);
266
+ else
267
+ request.end();
268
+ });
269
+ });
270
+ connectRequest.end();
271
+ });
272
+ const start = (config) => {
273
+ const upstream = parseUrl(config.upstreamUrl, true);
274
+ const proxy = parseUrl(config.proxyUrl, false);
275
+ if (!upstream || !proxy || config.oauth !== false || !config.managerCaPem)
276
+ return Effect.fail(failure("invalid-config"));
277
+ const maxBytes = config.maxRequestBytes ?? maxDefault;
278
+ const maxConnections = config.maxConnections ?? connectionsDefault;
279
+ if (!Number.isSafeInteger(maxBytes) ||
280
+ maxBytes < 1 ||
281
+ !Number.isSafeInteger(maxConnections) ||
282
+ maxConnections < 1)
283
+ return Effect.fail(failure("invalid-config"));
284
+ return Effect.acquireRelease(Effect.callback((resume) => {
285
+ let server;
286
+ const token = randomBytes(32).toString("base64url");
287
+ const tokenBytes = Buffer.from(token);
288
+ const sockets = new Set();
289
+ const routes = new Map();
290
+ const baseKey = `${upstream.pathname}${upstream.search}`;
291
+ routes.set(baseKey, upstream);
292
+ let active = 0;
293
+ let listening = false;
294
+ let stopped = false;
295
+ const controllers = new Set();
296
+ const localOrigin = () => {
297
+ const address = server.address();
298
+ return address && typeof address !== "string"
299
+ ? `http://127.0.0.1:${address.port}`
300
+ : "http://127.0.0.1";
301
+ };
302
+ const register = (target) => {
303
+ const key = `${target.pathname}${target.search}`;
304
+ if (routes.has(key))
305
+ return;
306
+ if (routes.size >= routesDefault)
307
+ throw failure("path-denied");
308
+ routes.set(key, target);
309
+ };
310
+ const reject = (res, status) => {
311
+ if (!res.headersSent)
312
+ res.writeHead(status, { "content-type": "text/plain", "content-length": "0" });
313
+ res.end();
314
+ };
315
+ const handle = (req, res) => Effect.tryPromise({
316
+ try: async () => {
317
+ if (stopped || !isLoopback(req.socket.remoteAddress))
318
+ return reject(res, 403);
319
+ const supplied = req.headers[RELAY_AUTH_HEADER];
320
+ const received = typeof supplied === "string" ? Buffer.from(supplied) : Buffer.alloc(0);
321
+ if (received.length !== tokenBytes.length || !timingSafeEqual(received, tokenBytes))
322
+ return reject(res, 401);
323
+ const rawPath = req.url ?? "/";
324
+ const target = routes.get(rawPath);
325
+ if (!target || target.origin !== upstream.origin)
326
+ return reject(res, 404);
327
+ if (!new Set(["GET", "POST", "DELETE"]).has(req.method ?? "GET"))
328
+ return reject(res, 405);
329
+ if (active >= maxConnections)
330
+ return reject(res, 429);
331
+ const length = req.headers["content-length"];
332
+ if (length && Number(length) > maxBytes)
333
+ return reject(res, 413);
334
+ active++;
335
+ const controller = new AbortController();
336
+ controllers.add(controller);
337
+ let finished = false;
338
+ const cancel = () => {
339
+ if (!finished && !res.writableEnded)
340
+ controller.abort();
341
+ };
342
+ req.once("aborted", cancel);
343
+ res.once("close", cancel);
344
+ const body = new PassThrough();
345
+ let bytes = 0;
346
+ let oversized = false;
347
+ let bodyTimer;
348
+ const resetBodyTimer = () => {
349
+ if (bodyTimer)
350
+ clearTimeout(bodyTimer);
351
+ bodyTimer = setTimeout(() => {
352
+ controller.abort();
353
+ body.destroy(failure("timeout"));
354
+ req.destroy();
355
+ }, config.idleTimeoutMs ?? idleDefault);
356
+ };
357
+ resetBodyTimer();
358
+ req.on("data", (chunk) => {
359
+ resetBodyTimer();
360
+ bytes += chunk.byteLength;
361
+ if (bytes > maxBytes && !oversized) {
362
+ oversized = true;
363
+ body.destroy(failure("body-too-large"));
364
+ req.destroy();
365
+ }
366
+ });
367
+ req.on("end", () => {
368
+ if (bodyTimer)
369
+ clearTimeout(bodyTimer);
370
+ body.end();
371
+ });
372
+ req.on("error", (cause) => body.destroy(cause));
373
+ req.pipe(body);
374
+ try {
375
+ const upstreamResponse = await throughProxy(target, proxy, config.managerCaPem, req.method ?? "GET", cleanHeaders(req.headers, Object.fromEntries(Object.entries(config.placeholderHeaders).map(([k, v]) => [k.toLowerCase(), v])), target), req.method === "GET" || req.method === "HEAD" ? undefined : body, config.connectTimeoutMs ?? connectDefault, config.idleTimeoutMs ?? idleDefault, controller.signal);
376
+ controller.signal.addEventListener("abort", () => upstreamResponse.body.destroy(), {
377
+ once: true,
378
+ });
379
+ const headers = responseHeaders(upstreamResponse.headers, upstream, localOrigin(), register);
380
+ const contentType = typeof headers["content-type"] === "string" ? headers["content-type"] : "";
381
+ const rewrittenSse = contentType.toLowerCase().includes("text/event-stream");
382
+ if (rewrittenSse &&
383
+ headers["content-encoding"] !== undefined &&
384
+ headers["content-encoding"] !== "identity")
385
+ throw failure("unsupported");
386
+ if (rewrittenSse) {
387
+ delete headers["content-length"];
388
+ delete headers["content-encoding"];
389
+ }
390
+ const stream = rewrittenSse
391
+ ? endpointRewrite(upstreamResponse.body, upstream, localOrigin(), register, maxBytes)
392
+ : upstreamResponse.body;
393
+ const iterator = stream[Symbol.asyncIterator]();
394
+ const first = await iterator.next();
395
+ res.writeHead(upstreamResponse.statusCode, headers);
396
+ if (!first.done)
397
+ await write(res, first.value, controller.signal);
398
+ for await (const chunk of { [Symbol.asyncIterator]: () => iterator })
399
+ await write(res, chunk, controller.signal);
400
+ res.end();
401
+ }
402
+ catch (cause) {
403
+ // A response may already have been obtained when SSE rewriting,
404
+ // backpressure, or endpoint validation fails. Abort the shared
405
+ // controller in every failure path so the CONNECT tunnel and
406
+ // upstream response cannot outlive this request.
407
+ controller.abort();
408
+ if (!res.headersSent)
409
+ reject(res, oversized ? 413 : 502);
410
+ else
411
+ res.destroy();
412
+ }
413
+ finally {
414
+ finished = true;
415
+ controllers.delete(controller);
416
+ req.removeListener("aborted", cancel);
417
+ res.removeListener("close", cancel);
418
+ if (bodyTimer)
419
+ clearTimeout(bodyTimer);
420
+ active--;
421
+ }
422
+ },
423
+ catch: () => failure("io"),
424
+ }).pipe(Effect.asVoid, Effect.catch(() => Effect.void));
425
+ server = createServer((req, res) => {
426
+ void Effect.runFork(handle(req, res));
427
+ });
428
+ server.maxConnections = maxConnections;
429
+ server.on("connection", (socket) => {
430
+ sockets.add(socket);
431
+ socket.once("close", () => sockets.delete(socket));
432
+ });
433
+ server.once("error", () => {
434
+ if (!listening)
435
+ resume(Effect.fail(failure("bind-failed")));
436
+ });
437
+ server.listen(0, "127.0.0.1", () => {
438
+ listening = true;
439
+ const address = server.address();
440
+ if (!address || typeof address === "string") {
441
+ resume(Effect.fail(failure("bind-failed")));
442
+ return;
443
+ }
444
+ const localUrl = `http://127.0.0.1:${address.port}${upstream.pathname}${upstream.search}`;
445
+ const stop = Effect.suspend(() => {
446
+ if (stopped)
447
+ return Effect.void;
448
+ stopped = true;
449
+ for (const controller of controllers)
450
+ controller.abort();
451
+ for (const socket of sockets)
452
+ socket.destroy();
453
+ return Effect.tryPromise({
454
+ try: () => new Promise((resolve) => server.close(() => resolve())),
455
+ catch: () => failure("closed"),
456
+ }).pipe(Effect.asVoid);
457
+ });
458
+ resume(Effect.succeed({
459
+ localUrl,
460
+ downstreamToken: token,
461
+ health: Effect.sync(() => ({
462
+ listening: listening && !stopped,
463
+ activeRequests: active,
464
+ localUrl,
465
+ })),
466
+ stop,
467
+ }));
468
+ });
469
+ return Effect.sync(() => {
470
+ stopped = true;
471
+ for (const controller of controllers)
472
+ controller.abort();
473
+ for (const socket of sockets)
474
+ socket.destroy();
475
+ server?.close();
476
+ });
477
+ }), (relay) => relay.stop.pipe(Effect.catch(() => Effect.void)));
478
+ };
479
+ export const startRelay = start;
480
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { Effect, Scope } from "effect";
2
+ import type { ServerProtection } from "./options.js";
3
+ /** Must stay in sync with the standalone relay implementation. */
4
+ export declare const RELAY_AUTH_HEADER = "x-varlock-relay-token";
5
+ export interface RemoteRelayConfig {
6
+ readonly upstreamUrl: string;
7
+ readonly proxyUrl: string;
8
+ readonly managerCaPem: string;
9
+ readonly placeholderHeaders: Readonly<Record<string, string>>;
10
+ readonly oauth: false;
11
+ readonly maxRequestBytes?: number;
12
+ readonly connectTimeoutMs?: number;
13
+ readonly idleTimeoutMs?: number;
14
+ readonly maxConnections?: number;
15
+ }
16
+ export interface RemoteRelayHealth {
17
+ readonly listening: boolean;
18
+ readonly activeRequests: number;
19
+ readonly localUrl: string;
20
+ }
21
+ export interface RemoteRelayHandle {
22
+ readonly localUrl: string;
23
+ /** Internal capability. Never expose this in status, RPC, logs, or TUI. */
24
+ readonly downstreamToken: string;
25
+ readonly health: Effect.Effect<RemoteRelayHealth, unknown>;
26
+ readonly stop: Effect.Effect<void, unknown>;
27
+ }
28
+ export type RemoteRelayFactory = (config: RemoteRelayConfig) => Effect.Effect<RemoteRelayHandle, unknown, Scope.Scope>;
29
+ export interface RemoteServerSnapshot {
30
+ readonly type: "remote";
31
+ readonly url: string;
32
+ readonly headers?: Readonly<Record<string, string>>;
33
+ readonly oauth?: unknown;
34
+ readonly disabled?: boolean;
35
+ readonly codemode?: boolean;
36
+ readonly timeout?: unknown;
37
+ readonly protocol?: unknown;
38
+ }
39
+ export interface RemoteDiagnostic {
40
+ readonly code: "remote_unavailable" | "remote_invalid_url" | "remote_oauth_required" | "remote_missing_placeholder" | "remote_invalid_header" | "remote_relay_failed";
41
+ readonly server: string;
42
+ readonly message: string;
43
+ }
44
+ export declare function isRemoteProtection(value: ServerProtection): value is Extract<ServerProtection, {
45
+ readonly remote: unknown;
46
+ }>;
47
+ export declare function sourceEnvironmentKeys(mapping: ServerProtection): readonly string[];
48
+ export declare function validateRemoteUrl(value: string, allowPrivateNetwork?: boolean): URL;
49
+ /** Remove mapped and dangerous configured headers from the native loopback config. */
50
+ export declare function safeForwardHeaders(headers: Readonly<Record<string, string>> | undefined, mapping: Extract<ServerProtection, {
51
+ readonly remote: unknown;
52
+ }>): Readonly<Record<string, string>> | undefined;
53
+ export interface RemoteRelayCoordinator {
54
+ readonly handles: ReadonlyMap<string, RemoteRelayHandle>;
55
+ readonly diagnostics: readonly RemoteDiagnostic[];
56
+ readonly reconcile: (servers: ReadonlyMap<string, RemoteServerSnapshot>, mappings: Readonly<Record<string, ServerProtection>>, environment: Readonly<Record<string, string>>, generation: number) => Effect.Effect<void, never, Scope.Scope>;
57
+ readonly health: Effect.Effect<boolean>;
58
+ readonly stopAll: Effect.Effect<void>;
59
+ }
60
+ /** Coordinates relay replacement without exposing relay tokens or secrets. */
61
+ export declare function makeRemoteRelayCoordinator(factory: RemoteRelayFactory | undefined, allowPrivateNetwork?: boolean): RemoteRelayCoordinator;
62
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}