@bridgekitux/relay 0.2.0

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 ADDED
@@ -0,0 +1,109 @@
1
+ # @bridgekitux/relay
2
+
3
+ Protocol-proxy relay runtime for BridgeKit.
4
+
5
+ This package is for the "proxy protocols, not libraries" path. Instead of reimplementing MongoDB, PostgreSQL, Redis, or other driver APIs, BridgeKit can expose local relay ports that forward raw TCP bytes through approved BridgeKit `tcp.stream` capabilities.
6
+
7
+ ## TCP relay
8
+
9
+ ```ts
10
+ import { bridgekit } from '@bridgekitux/client';
11
+ import { startTcpRelay } from '@bridgekitux/relay';
12
+
13
+ await bridgekit.connect({ manifest });
14
+
15
+ const relay = await startTcpRelay({
16
+ client: bridgekit,
17
+ resourceId: 'local-mongodb',
18
+ listen: { host: 'localhost', port: 27017 }
19
+ });
20
+
21
+ console.log(relay.url); // tcp://localhost:27017
22
+ ```
23
+
24
+ Then normal drivers can target the relay port where the runtime supports local TCP connections.
25
+
26
+ ```env
27
+ MONGODB_URI=mongodb://localhost:27017/stacktest
28
+ DATABASE_URL=postgres://user:pass@localhost:5432/app
29
+ ```
30
+
31
+ In production, swap environment variables to real infrastructure. The application code can keep using normal drivers.
32
+
33
+ ## Manifest relays
34
+
35
+ `bridgekit.config.json` can declare relay listeners:
36
+
37
+ ```json
38
+ {
39
+ "name": "driver-compatible-demo",
40
+ "runtime": "node",
41
+ "requires": {
42
+ "services": [
43
+ { "id": "local-mongodb", "type": "tcp", "permissions": ["stream"] }
44
+ ]
45
+ },
46
+ "relays": [
47
+ {
48
+ "id": "mongo-driver-port",
49
+ "type": "tcp",
50
+ "resourceId": "local-mongodb",
51
+ "protocol": "mongodb",
52
+ "listen": { "host": "localhost", "port": 27017 },
53
+ "options": { "keepAlive": true, "noDelay": true }
54
+ }
55
+ ]
56
+ }
57
+ ```
58
+
59
+ Start all relays in the manifest:
60
+
61
+ ```ts
62
+ import { connectAndStartTcpRelays } from '@bridgekitux/relay';
63
+
64
+ const bridge = await connectAndStartTcpRelays({
65
+ manifestPath: 'bridgekit.config.json',
66
+ agentUrl: 'ws://localhost:7777/bridgekit'
67
+ });
68
+
69
+ console.log(bridge.relays.map((relay) => relay.url));
70
+ ```
71
+
72
+ CLI:
73
+
74
+ ```bash
75
+ bridgekit-relay start --manifest bridgekit.config.json --agent-url ws://localhost:7777/bridgekit
76
+ ```
77
+
78
+ ## WebContainer backend companion
79
+
80
+ Backend:
81
+
82
+ ```ts
83
+ import { BridgeKitClient } from '@bridgekitux/client';
84
+ import { startTcpRelaysFromManifest } from '@bridgekitux/relay';
85
+ import { startWebContainerBridgeServer } from '@bridgekitux/relay/webcontainer-node';
86
+ import manifest from './bridgekit.config.json' assert { type: 'json' };
87
+
88
+ const bridgeServer = await startWebContainerBridgeServer({ host: 'localhost', port: 8787 });
89
+ const bridgekit = new BridgeKitClient({ transport: bridgeServer.transport, manifest });
90
+
91
+ await bridgekit.connect();
92
+ await startTcpRelaysFromManifest({ manifest, client: bridgekit });
93
+ ```
94
+
95
+ Browser companion page:
96
+
97
+ ```ts
98
+ import { createWebContainerRelayCompanion } from '@bridgekitux/relay/webcontainer-browser';
99
+
100
+ createWebContainerRelayCompanion({
101
+ backendUrl: 'ws://localhost:8787/bridgekit-relay'
102
+ });
103
+ ```
104
+
105
+ ## Notes
106
+
107
+ - Relay declarations map to `tcp.stream` permission requests.
108
+ - `tcp.stream` frames use `binaryBase64` for binary-safe protocol bytes.
109
+ - Raw TCP relay access is powerful; approve only named resources you trust for the current session.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { connectAndStartTcpRelays } from './index.js';
3
+ function parseArgs(argv) {
4
+ const options = { manifestPath: 'bridgekit.config.json' };
5
+ for (let index = 0; index < argv.length; index += 1) {
6
+ const arg = argv[index];
7
+ if (arg === 'start')
8
+ continue;
9
+ if (arg === '--manifest' || arg === '-m') {
10
+ const value = argv[index + 1];
11
+ if (!value)
12
+ throw new Error(`${arg} requires a path`);
13
+ options.manifestPath = value;
14
+ index += 1;
15
+ continue;
16
+ }
17
+ if (arg === '--agent-url' || arg === '--bridge-url') {
18
+ const value = argv[index + 1];
19
+ if (!value)
20
+ throw new Error(`${arg} requires a WebSocket URL`);
21
+ options.agentUrl = value;
22
+ index += 1;
23
+ continue;
24
+ }
25
+ if (arg === '--help' || arg === '-h') {
26
+ printHelp();
27
+ process.exit(0);
28
+ }
29
+ throw new Error(`Unknown argument: ${arg}`);
30
+ }
31
+ return options;
32
+ }
33
+ function printHelp() {
34
+ console.log(`BridgeKit relay
35
+
36
+ Usage:
37
+ bridgekit-relay start [--manifest bridgekit.config.json] [--agent-url ws://localhost:7777/bridgekit]
38
+
39
+ Starts TCP protocol-proxy relays declared in bridgekit.config.json relays[].
40
+ Normal drivers can then connect to the relay listen ports while BridgeKit forwards bytes through approved tcp.stream resources.
41
+ `);
42
+ }
43
+ async function main() {
44
+ const options = parseArgs(process.argv.slice(2));
45
+ const connected = await connectAndStartTcpRelays({ manifestPath: options.manifestPath, agentUrl: options.agentUrl });
46
+ if (connected.relays.length === 0) {
47
+ console.log(`No TCP relays declared in ${options.manifestPath}.`);
48
+ connected.client.close();
49
+ return;
50
+ }
51
+ console.log(`BridgeKit relay started ${connected.relays.length} relay(s) from ${options.manifestPath}:`);
52
+ for (const relay of connected.relays) {
53
+ const label = relay.id ? `${relay.id} -> ${relay.resourceId}` : relay.resourceId;
54
+ const protocol = relay.protocol ? ` (${relay.protocol})` : '';
55
+ console.log(`- ${label}${protocol}: ${relay.url}`);
56
+ }
57
+ console.log('Press Ctrl+C to stop.');
58
+ await new Promise((resolve) => {
59
+ const shutdown = () => {
60
+ void connected.close().finally(resolve);
61
+ };
62
+ process.once('SIGINT', shutdown);
63
+ process.once('SIGTERM', shutdown);
64
+ });
65
+ }
66
+ main().catch((error) => {
67
+ console.error(error instanceof Error ? error.message : error);
68
+ process.exitCode = 1;
69
+ });
70
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type BridgeKitClient, type BridgeKitNodeConnectOptions } from '@bridgekitux/client';
2
+ import { type BridgeKitManifest } from '@bridgekitux/protocol';
3
+ export interface TcpRelayListenOptions {
4
+ host?: string;
5
+ port: number;
6
+ }
7
+ export interface TcpRelayOptions {
8
+ /** Optional relay declaration ID from bridgekit.config.json. */
9
+ id?: string;
10
+ /** Approved BridgeKit TCP resource ID. */
11
+ resourceId: string;
12
+ /** Optional developer hint such as mongodb, postgres, mysql, redis, http, https, or custom. */
13
+ protocol?: string;
14
+ /** Local/WebContainer listener. */
15
+ listen: TcpRelayListenOptions;
16
+ /** Connected BridgeKit client. Defaults to the exported singleton. */
17
+ client?: BridgeKitClient;
18
+ /** Optional timeout passed to the BridgeKit TCP stream capability. */
19
+ timeoutMs?: number;
20
+ /** Optional idle timeout passed to the BridgeKit TCP stream capability. */
21
+ idleTimeoutMs?: number;
22
+ /** Enable TCP keepalive for the upstream BridgeKit stream where supported. */
23
+ keepAlive?: boolean;
24
+ /** Disable Nagle for low-latency protocol drivers. Defaults to true. */
25
+ noDelay?: boolean;
26
+ }
27
+ export interface StartedTcpRelay {
28
+ id?: string;
29
+ resourceId: string;
30
+ protocol?: string;
31
+ host: string;
32
+ port: number;
33
+ url: string;
34
+ close(): Promise<void>;
35
+ }
36
+ export interface StartTcpRelaysFromManifestOptions {
37
+ /** Inline manifest. If omitted, `manifestPath` is loaded from disk. */
38
+ manifest?: BridgeKitManifest | unknown;
39
+ /** Manifest file path. Defaults to `bridgekit.config.json`. */
40
+ manifestPath?: string;
41
+ /** Connected BridgeKit client. Defaults to the exported singleton. */
42
+ client?: BridgeKitClient;
43
+ }
44
+ export interface ConnectAndStartTcpRelaysOptions extends StartTcpRelaysFromManifestOptions, Pick<BridgeKitNodeConnectOptions, 'agentUrl' | 'bridgeUrl' | 'pairingTimeoutMs' | 'pollIntervalMs'> {
45
+ }
46
+ export interface ConnectedTcpRelays {
47
+ client: BridgeKitClient;
48
+ manifest: BridgeKitManifest;
49
+ relays: StartedTcpRelay[];
50
+ close(): Promise<void>;
51
+ }
52
+ export declare function startTcpRelay(options: TcpRelayOptions): Promise<StartedTcpRelay>;
53
+ export declare function startTcpRelays(relays: TcpRelayOptions[]): Promise<StartedTcpRelay[]>;
54
+ export declare function tcpRelayOptionsFromManifest(input: BridgeKitManifest | unknown, client?: BridgeKitClient): TcpRelayOptions[];
55
+ export declare function startTcpRelaysFromManifest(options?: StartTcpRelaysFromManifestOptions): Promise<StartedTcpRelay[]>;
56
+ export declare function connectAndStartTcpRelays(options?: ConnectAndStartTcpRelaysOptions): Promise<ConnectedTcpRelays>;
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,2BAA2B,EAEjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAoB,KAAK,iBAAiB,EAAiC,MAAM,uBAAuB,CAAC;AAEhH,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,sEAAsE;IACtE,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,iCAAiC;IAChD,uEAAuE;IACvE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;IACvC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,+BAAgC,SAAQ,iCAAiC,EAAE,IAAI,CAAC,2BAA2B,EAAE,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;CAAG;AAElM,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAyBtF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAS1F;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,EAAE,MAAM,GAAE,eAA2B,GAAG,eAAe,EAAE,CAetI;AAED,wBAAsB,0BAA0B,CAAC,OAAO,GAAE,iCAAsC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAG5H;AAED,wBAAsB,wBAAwB,CAAC,OAAO,GAAE,+BAAoC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCzH"}
@@ -0,0 +1,149 @@
1
+ import { createServer } from 'node:net';
2
+ import { bridgekit, connectBridgeKitNode, loadBridgeKitManifestFromFile } from '@bridgekitux/client';
3
+ import { validateManifest } from '@bridgekitux/protocol';
4
+ export async function startTcpRelay(options) {
5
+ const client = options.client ?? bridgekit;
6
+ const host = options.listen.host ?? 'localhost';
7
+ const requestedPort = options.listen.port;
8
+ const server = createServer((socket) => {
9
+ void handleSocket(socket, options, client);
10
+ });
11
+ await new Promise((resolve, reject) => {
12
+ server.once('error', reject);
13
+ server.listen(requestedPort, host, () => {
14
+ server.off('error', reject);
15
+ resolve();
16
+ });
17
+ });
18
+ const address = server.address();
19
+ const port = typeof address === 'object' && address ? address.port : requestedPort;
20
+ return {
21
+ id: options.id,
22
+ resourceId: options.resourceId,
23
+ protocol: options.protocol,
24
+ host,
25
+ port,
26
+ url: `tcp://${host}:${port}`,
27
+ close: () => closeServer(server)
28
+ };
29
+ }
30
+ export async function startTcpRelays(relays) {
31
+ const started = [];
32
+ try {
33
+ for (const relay of relays)
34
+ started.push(await startTcpRelay(relay));
35
+ return started;
36
+ }
37
+ catch (error) {
38
+ await Promise.allSettled(started.map((relay) => relay.close()));
39
+ throw error;
40
+ }
41
+ }
42
+ export function tcpRelayOptionsFromManifest(input, client = bridgekit) {
43
+ const manifest = validateManifest(input);
44
+ return (manifest.relays ?? [])
45
+ .filter((relay) => relay.type === 'tcp')
46
+ .map((relay) => ({
47
+ id: relay.id,
48
+ resourceId: relay.resourceId,
49
+ protocol: relay.protocol,
50
+ listen: relay.listen,
51
+ client,
52
+ timeoutMs: relay.options?.timeoutMs,
53
+ idleTimeoutMs: relay.options?.idleTimeoutMs,
54
+ keepAlive: relay.options?.keepAlive,
55
+ noDelay: relay.options?.noDelay
56
+ }));
57
+ }
58
+ export async function startTcpRelaysFromManifest(options = {}) {
59
+ const manifest = validateManifest(options.manifest ?? await loadBridgeKitManifestFromFile(options.manifestPath ?? 'bridgekit.config.json'));
60
+ return startTcpRelays(tcpRelayOptionsFromManifest(manifest, options.client ?? bridgekit));
61
+ }
62
+ export async function connectAndStartTcpRelays(options = {}) {
63
+ const client = options.client ?? bridgekit;
64
+ const manifest = validateManifest(options.manifest ?? await loadBridgeKitManifestFromFile(options.manifestPath ?? 'bridgekit.config.json'));
65
+ const relayOptions = tcpRelayOptionsFromManifest(manifest, client);
66
+ if (relayOptions.length === 0) {
67
+ return {
68
+ client,
69
+ manifest,
70
+ relays: [],
71
+ close: async () => client.close()
72
+ };
73
+ }
74
+ if (!client.state.connected) {
75
+ await connectBridgeKitNode({
76
+ client,
77
+ manifest,
78
+ agentUrl: options.agentUrl,
79
+ bridgeUrl: options.bridgeUrl,
80
+ pairingTimeoutMs: options.pairingTimeoutMs,
81
+ pollIntervalMs: options.pollIntervalMs
82
+ });
83
+ }
84
+ const relays = await startTcpRelays(relayOptions);
85
+ return {
86
+ client,
87
+ manifest,
88
+ relays,
89
+ close: async () => {
90
+ await Promise.allSettled(relays.map((relay) => relay.close()));
91
+ client.close();
92
+ }
93
+ };
94
+ }
95
+ async function handleSocket(socket, options, client) {
96
+ socket.pause();
97
+ let subscription;
98
+ let closed = false;
99
+ const closeBoth = () => {
100
+ if (closed)
101
+ return;
102
+ closed = true;
103
+ socket.destroy();
104
+ void subscription?.unsubscribe().catch(() => undefined);
105
+ };
106
+ try {
107
+ subscription = await client.tcp(options.resourceId).stream({
108
+ encoding: 'utf8',
109
+ timeoutMs: options.timeoutMs,
110
+ idleTimeoutMs: options.idleTimeoutMs,
111
+ keepAlive: options.keepAlive,
112
+ noDelay: options.noDelay ?? true
113
+ }, (event) => {
114
+ const data = event.data;
115
+ if (event.event === 'tcp.data') {
116
+ const payload = data?.binaryBase64 ? Buffer.from(data.binaryBase64, 'base64') : Buffer.from(data?.chunk ?? '', 'utf8');
117
+ if (payload.length > 0 && !socket.destroyed)
118
+ socket.write(payload);
119
+ return;
120
+ }
121
+ if (event.event === 'tcp.end') {
122
+ if (!socket.destroyed)
123
+ socket.end();
124
+ return;
125
+ }
126
+ if (event.event === 'tcp.close' || event.event === 'tcp.error' || event.event === 'tcp.timeout') {
127
+ closeBoth();
128
+ }
129
+ });
130
+ socket.on('data', (chunk) => {
131
+ void subscription.send(undefined, { binaryBase64: chunk.toString('base64') }).catch(closeBoth);
132
+ });
133
+ socket.on('end', () => {
134
+ void subscription.end().catch(() => undefined);
135
+ });
136
+ socket.on('error', closeBoth);
137
+ socket.on('close', closeBoth);
138
+ socket.resume();
139
+ }
140
+ catch {
141
+ closeBoth();
142
+ }
143
+ }
144
+ function closeServer(server) {
145
+ return new Promise((resolve) => {
146
+ server.close(() => resolve());
147
+ });
148
+ }
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface WebContainerRelayCompanionOptions {
2
+ /** WebSocket URL served by the WebContainer/backend relay process. */
3
+ backendUrl?: string;
4
+ /** Target origin for window.postMessage to the BridgeKit extension/host bridge. Defaults to current origin. */
5
+ targetOrigin?: string;
6
+ /** Reconnect delay for the backend companion socket. Defaults to 1000ms. */
7
+ reconnectMs?: number;
8
+ }
9
+ export interface WebContainerRelayCompanionController {
10
+ close(): void;
11
+ }
12
+ export declare function createWebContainerRelayCompanion(options?: WebContainerRelayCompanionOptions): WebContainerRelayCompanionController;
13
+ //# sourceMappingURL=webcontainer-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcontainer-browser.d.ts","sourceRoot":"","sources":["../../src/webcontainer-browser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iCAAiC;IAChD,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+GAA+G;IAC/G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oCAAoC;IACnD,KAAK,IAAI,IAAI,CAAC;CACf;AAWD,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,iCAAsC,GAAG,oCAAoC,CAyEtI"}
@@ -0,0 +1,85 @@
1
+ import { parseMessage, toBridgeKitError } from '@bridgekitux/protocol';
2
+ const BACKEND_SOURCE = 'bridgekit-webcontainer-backend';
3
+ const COMPANION_SOURCE = 'bridgekit-webcontainer-companion';
4
+ export function createWebContainerRelayCompanion(options = {}) {
5
+ if (typeof window === 'undefined')
6
+ throw new Error('createWebContainerRelayCompanion() must run in a browser page');
7
+ const targetOrigin = options.targetOrigin ?? window.location.origin;
8
+ const backendUrl = options.backendUrl ?? defaultBackendUrl();
9
+ const reconnectMs = options.reconnectMs ?? 1_000;
10
+ let socket;
11
+ let reconnectTimer;
12
+ let closed = false;
13
+ function connect() {
14
+ if (closed)
15
+ return;
16
+ socket = new WebSocket(backendUrl);
17
+ socket.addEventListener('open', () => {
18
+ window.postMessage({ source: 'bridgekit-client', type: 'bridgekit.detect' }, targetOrigin);
19
+ });
20
+ socket.addEventListener('message', (event) => handleBackendMessage(event.data));
21
+ socket.addEventListener('close', scheduleReconnect);
22
+ socket.addEventListener('error', scheduleReconnect);
23
+ }
24
+ function scheduleReconnect() {
25
+ if (closed || reconnectTimer)
26
+ return;
27
+ reconnectTimer = setTimeout(() => {
28
+ reconnectTimer = undefined;
29
+ connect();
30
+ }, reconnectMs);
31
+ }
32
+ function handleBackendMessage(raw) {
33
+ let message;
34
+ try {
35
+ const envelope = JSON.parse(String(raw));
36
+ if (!envelope || envelope.source !== BACKEND_SOURCE || envelope.type !== 'bridgekit.request')
37
+ return;
38
+ message = parseMessage(envelope.message);
39
+ }
40
+ catch (error) {
41
+ sendToBackend({
42
+ protocolVersion: '0.1.0',
43
+ type: 'bridgekit.response',
44
+ error: toBridgeKitError(error)
45
+ });
46
+ return;
47
+ }
48
+ window.postMessage({ source: 'bridgekit-client', type: 'bridgekit.request', message }, targetOrigin);
49
+ }
50
+ function handleWindowMessage(event) {
51
+ if (event.origin !== targetOrigin)
52
+ return;
53
+ const data = event.data;
54
+ if (!data || data.source !== 'bridgekit-bridge')
55
+ return;
56
+ if (data.type !== 'bridgekit.response' && data.type !== 'bridgekit.event')
57
+ return;
58
+ sendToBackend(data.message);
59
+ }
60
+ function sendToBackend(message) {
61
+ if (!socket || socket.readyState !== WebSocket.OPEN)
62
+ return;
63
+ socket.send(JSON.stringify({
64
+ source: COMPANION_SOURCE,
65
+ type: 'bridgekit.forward',
66
+ message
67
+ }));
68
+ }
69
+ window.addEventListener('message', handleWindowMessage);
70
+ connect();
71
+ return {
72
+ close() {
73
+ closed = true;
74
+ if (reconnectTimer)
75
+ clearTimeout(reconnectTimer);
76
+ window.removeEventListener('message', handleWindowMessage);
77
+ socket?.close();
78
+ }
79
+ };
80
+ }
81
+ function defaultBackendUrl() {
82
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
83
+ return `${protocol}//${window.location.hostname}:8787/bridgekit-relay`;
84
+ }
85
+ //# sourceMappingURL=webcontainer-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcontainer-browser.js","sourceRoot":"","sources":["../../src/webcontainer-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAyB,MAAM,uBAAuB,CAAC;AAqB9F,MAAM,cAAc,GAAG,gCAAgC,CAAC;AACxD,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;AAE5D,MAAM,UAAU,gCAAgC,CAAC,UAA6C,EAAE;IAC9F,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACpH,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACpE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IACjD,IAAI,MAA6B,CAAC;IAClC,IAAI,cAAyD,CAAC;IAC9D,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,SAAS,OAAO;QACd,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,YAAY,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED,SAAS,iBAAiB;QACxB,IAAI,MAAM,IAAI,cAAc;YAAE,OAAO;QACrC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,cAAc,GAAG,SAAS,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,WAAW,CAAC,CAAC;IAClB,CAAC;IAED,SAAS,oBAAoB,CAAC,GAAY;QACxC,IAAI,OAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAmB,CAAC;YAC3D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB;gBAAE,OAAO;YACrG,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC;gBACZ,eAAe,EAAE,OAAO;gBACxB,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC;aAC/B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IACvG,CAAC;IAED,SAAS,mBAAmB,CAAC,KAAmB;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;QAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB;YAAE,OAAO;QACxD,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO;QAClF,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS,aAAa,CAAC,OAAgB;QACrC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,OAAO;QAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE,mBAAmB;YACzB,OAAO;SACR,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC;IAEV,OAAO;QACL,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,cAAc;gBAAE,YAAY,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC3D,MAAM,EAAE,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,OAAO,GAAG,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,uBAAuB,CAAC;AACzE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { AddressInfo } from 'node:net';
2
+ import type { BridgeTransport } from '@bridgekitux/client';
3
+ export interface WebContainerBridgeServerOptions {
4
+ host?: string;
5
+ port?: number;
6
+ path?: string;
7
+ requestTimeoutMs?: number;
8
+ companionTimeoutMs?: number;
9
+ }
10
+ export interface StartedWebContainerBridgeServer {
11
+ host: string;
12
+ port: number;
13
+ path: string;
14
+ url: string;
15
+ transport: BridgeTransport;
16
+ close(): Promise<void>;
17
+ }
18
+ export declare function startWebContainerBridgeServer(options?: WebContainerBridgeServerOptions): Promise<StartedWebContainerBridgeServer>;
19
+ export declare function getWebContainerBridgeServerAddress(server: StartedWebContainerBridgeServer): AddressInfo;
20
+ //# sourceMappingURL=webcontainer-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcontainer-node.d.ts","sourceRoot":"","sources":["../../src/webcontainer-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU5C,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEnF,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAWD,wBAAsB,6BAA6B,CAAC,OAAO,GAAE,+BAAoC,GAAG,OAAO,CAAC,+BAA+B,CAAC,CA+H3I;AAWD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,+BAA+B,GAAG,WAAW,CAEvG"}
@@ -0,0 +1,148 @@
1
+ import { createServer } from 'node:http';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { WebSocketServer, WebSocket } from 'ws';
4
+ import { createMessage, parseMessage, toBridgeKitError } from '@bridgekitux/protocol';
5
+ const BACKEND_SOURCE = 'bridgekit-webcontainer-backend';
6
+ const COMPANION_SOURCE = 'bridgekit-webcontainer-companion';
7
+ export async function startWebContainerBridgeServer(options = {}) {
8
+ const host = options.host ?? 'localhost';
9
+ const requestedPort = options.port ?? 8787;
10
+ const path = options.path ?? '/bridgekit-relay';
11
+ const httpServer = createServer();
12
+ const wsServer = new WebSocketServer({ server: httpServer, path });
13
+ const companions = new Set();
14
+ const pending = new Map();
15
+ const eventListeners = new Set();
16
+ const companionWaiters = new Set();
17
+ wsServer.on('connection', (socket) => {
18
+ companions.add(socket);
19
+ for (const resolve of companionWaiters)
20
+ resolve();
21
+ companionWaiters.clear();
22
+ socket.on('message', (raw) => handleCompanionMessage(raw));
23
+ socket.on('close', () => companions.delete(socket));
24
+ });
25
+ await new Promise((resolve, reject) => {
26
+ httpServer.once('error', reject);
27
+ httpServer.listen(requestedPort, host, () => {
28
+ httpServer.off('error', reject);
29
+ resolve();
30
+ });
31
+ });
32
+ const address = httpServer.address();
33
+ const port = typeof address === 'object' && address ? address.port : requestedPort;
34
+ const url = `ws://${host}:${port}${path}`;
35
+ function activeCompanion() {
36
+ return [...companions].find((socket) => socket.readyState === WebSocket.OPEN);
37
+ }
38
+ async function waitForCompanion(timeoutMs = options.companionTimeoutMs ?? 30_000) {
39
+ if (activeCompanion())
40
+ return;
41
+ await new Promise((resolve, reject) => {
42
+ const timer = setTimeout(() => {
43
+ companionWaiters.delete(onCompanion);
44
+ reject(new Error(`BridgeKit WebContainer companion did not connect within ${timeoutMs}ms`));
45
+ }, timeoutMs);
46
+ const onCompanion = () => {
47
+ clearTimeout(timer);
48
+ resolve();
49
+ };
50
+ companionWaiters.add(onCompanion);
51
+ });
52
+ }
53
+ function sendToCompanion(message) {
54
+ const companion = activeCompanion();
55
+ if (!companion)
56
+ throw new Error('BridgeKit WebContainer companion is not connected');
57
+ companion.send(JSON.stringify({ source: BACKEND_SOURCE, type: 'bridgekit.request', message }));
58
+ }
59
+ function handleCompanionMessage(raw) {
60
+ let message;
61
+ try {
62
+ const envelope = JSON.parse(raw.toString());
63
+ if (!envelope || envelope.source !== COMPANION_SOURCE)
64
+ return;
65
+ message = parseMessage(envelope.message);
66
+ }
67
+ catch (error) {
68
+ const bridgeError = toBridgeKitError(error);
69
+ for (const pendingRequest of pending.values())
70
+ pendingRequest.reject(Object.assign(new Error(bridgeError.message), { bridgeKit: bridgeError }));
71
+ pending.clear();
72
+ return;
73
+ }
74
+ if (message.type === 'event') {
75
+ for (const listener of eventListeners)
76
+ listener(message.payload);
77
+ return;
78
+ }
79
+ if (!message.id)
80
+ return;
81
+ const pendingRequest = pending.get(message.id);
82
+ if (!pendingRequest)
83
+ return;
84
+ clearTimeout(pendingRequest.timer);
85
+ pending.delete(message.id);
86
+ if (message.error)
87
+ pendingRequest.reject(Object.assign(new Error(message.error.message), { bridgeKit: message.error }));
88
+ else
89
+ pendingRequest.resolve(message);
90
+ }
91
+ const transport = {
92
+ kind: 'host-page',
93
+ connect: () => waitForCompanion(),
94
+ request: async (type, payload) => {
95
+ await waitForCompanion();
96
+ const id = `bk_wc_${Date.now()}_${randomUUID()}`;
97
+ const message = createMessage(type, payload, id);
98
+ return new Promise((resolve, reject) => {
99
+ const timer = setTimeout(() => {
100
+ pending.delete(id);
101
+ reject(new Error(`BridgeKit WebContainer bridge request timed out: ${type}`));
102
+ }, options.requestTimeoutMs ?? 30_000);
103
+ pending.set(id, { resolve: resolve, reject, timer });
104
+ try {
105
+ sendToCompanion(message);
106
+ }
107
+ catch (error) {
108
+ clearTimeout(timer);
109
+ pending.delete(id);
110
+ reject(error instanceof Error ? error : new Error(String(error)));
111
+ }
112
+ });
113
+ },
114
+ onEvent: (listener) => {
115
+ eventListeners.add(listener);
116
+ return () => eventListeners.delete(listener);
117
+ },
118
+ close: () => {
119
+ for (const pendingRequest of pending.values()) {
120
+ clearTimeout(pendingRequest.timer);
121
+ pendingRequest.reject(new Error('BridgeKit WebContainer bridge transport closed'));
122
+ }
123
+ pending.clear();
124
+ for (const companion of companions)
125
+ companion.close();
126
+ }
127
+ };
128
+ return {
129
+ host,
130
+ port,
131
+ path,
132
+ url,
133
+ transport,
134
+ close: () => closeServer(httpServer, wsServer, transport)
135
+ };
136
+ }
137
+ function closeServer(httpServer, wsServer, transport) {
138
+ transport.close();
139
+ return new Promise((resolve) => {
140
+ wsServer.close(() => {
141
+ httpServer.close(() => resolve());
142
+ });
143
+ });
144
+ }
145
+ export function getWebContainerBridgeServerAddress(server) {
146
+ return { address: server.host, family: 'IPv4', port: server.port };
147
+ }
148
+ //# sourceMappingURL=webcontainer-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcontainer-node.js","sourceRoot":"","sources":["../../src/webcontainer-node.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@bridgekitux/relay",
3
+ "version": "0.2.0",
4
+ "license": "Apache-2.0",
5
+ "description": "BridgeKit protocol proxy relay runtime for local/WebContainer development.",
6
+ "type": "module",
7
+ "main": "./dist/src/index.js",
8
+ "types": "./dist/src/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/src/index.d.ts",
12
+ "import": "./dist/src/index.js"
13
+ },
14
+ "./webcontainer-node": {
15
+ "types": "./dist/src/webcontainer-node.d.ts",
16
+ "import": "./dist/src/webcontainer-node.js"
17
+ },
18
+ "./webcontainer-browser": {
19
+ "types": "./dist/src/webcontainer-browser.d.ts",
20
+ "import": "./dist/src/webcontainer-browser.js"
21
+ }
22
+ },
23
+ "bin": {
24
+ "bridgekit-relay": "dist/src/cli.js"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -b",
28
+ "test": "node --test dist/test/*.test.js"
29
+ },
30
+ "dependencies": {
31
+ "@bridgekitux/client": "0.2.0",
32
+ "@bridgekitux/protocol": "0.2.0",
33
+ "ws": "^8.21.0"
34
+ },
35
+ "devDependencies": {
36
+ "@bridgekitux/agent": "0.2.0"
37
+ },
38
+ "files": [
39
+ "dist/src",
40
+ "README.md"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "keywords": [
46
+ "bridgekit",
47
+ "relay",
48
+ "tcp-proxy",
49
+ "webcontainer",
50
+ "sandbox",
51
+ "protocol-proxy"
52
+ ]
53
+ }