agent-comms 1.13.0 → 1.15.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/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +6 -1
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +6 -1
- package/dist/bridges/codex/tool.js.map +1 -1
- package/dist/bridges/mcp/index.d.ts.map +1 -1
- package/dist/bridges/mcp/index.js +6 -1
- package/dist/bridges/mcp/index.js.map +1 -1
- package/dist/bridges/opencode/plugin.d.ts.map +1 -1
- package/dist/bridges/opencode/plugin.js +5 -0
- package/dist/bridges/opencode/plugin.js.map +1 -1
- package/dist/bridges/pi/index.d.ts +5 -2
- package/dist/bridges/pi/index.d.ts.map +1 -1
- package/dist/bridges/pi/index.js +125 -20
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +10 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +37 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +4 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +4 -4
- package/dist/bridges/user/web/build.js +53 -34
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +28 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/App.js +7 -0
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts +14 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.js +38 -0
- package/dist/bridges/user/web/frontend/components/ChatArea.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts +11 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js +33 -0
- package/dist/bridges/user/web/frontend/components/CreateRoomForm.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts +11 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.js +28 -0
- package/dist/bridges/user/web/frontend/components/JoinForm.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Message.d.ts +8 -0
- package/dist/bridges/user/web/frontend/components/Message.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/Message.js +15 -0
- package/dist/bridges/user/web/frontend/components/Message.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts +8 -0
- package/dist/bridges/user/web/frontend/components/MessageList.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/MessageList.js +16 -0
- package/dist/bridges/user/web/frontend/components/MessageList.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts +17 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +62 -0
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +21 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.js +37 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -0
- package/dist/bridges/user/web/frontend/dom.d.ts +12 -22
- package/dist/bridges/user/web/frontend/dom.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/dom.js +24 -49
- package/dist/bridges/user/web/frontend/dom.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.d.ts +15 -0
- package/dist/bridges/user/web/frontend/input.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +39 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.d.ts +3 -3
- package/dist/bridges/user/web/frontend/main.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +135 -52
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/messages.d.ts +17 -0
- package/dist/bridges/user/web/frontend/messages.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/messages.js +82 -0
- package/dist/bridges/user/web/frontend/messages.js.map +1 -0
- package/dist/bridges/user/web/frontend/project-tree.d.ts +9 -0
- package/dist/bridges/user/web/frontend/project-tree.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/project-tree.js +173 -0
- package/dist/bridges/user/web/frontend/project-tree.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.js +97 -0
- package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
- package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/state.d.ts +8 -1
- package/dist/bridges/user/web/frontend/state.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/state.js +17 -1
- package/dist/bridges/user/web/frontend/state.js.map +1 -1
- package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
- package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/sw.js +145 -0
- package/dist/bridges/user/web/frontend/sw.js.map +1 -0
- package/dist/bridges/user/web/frontend/types.d.ts +52 -0
- package/dist/bridges/user/web/frontend/types.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.js +74 -0
- package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
- package/dist/bridges/user/web/server.d.ts +10 -3
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +280 -15
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/bridges/user/web/test/web-server.integration.test.d.ts +7 -0
- package/dist/bridges/user/web/test/web-server.integration.test.d.ts.map +1 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js +187 -0
- package/dist/bridges/user/web/test/web-server.integration.test.js.map +1 -0
- package/dist/core/bridge.d.ts +43 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +197 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/comms-store.d.ts +22 -1
- package/dist/core/comms-store.d.ts.map +1 -1
- package/dist/core/discovery-mdns.d.ts +33 -0
- package/dist/core/discovery-mdns.d.ts.map +1 -0
- package/dist/core/discovery-mdns.js +182 -0
- package/dist/core/discovery-mdns.js.map +1 -0
- package/dist/core/discovery-tailscale.d.ts +40 -0
- package/dist/core/discovery-tailscale.d.ts.map +1 -0
- package/dist/core/discovery-tailscale.js +158 -0
- package/dist/core/discovery-tailscale.js.map +1 -0
- package/dist/core/discovery.d.ts +82 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +194 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/federation.d.ts +100 -0
- package/dist/core/federation.d.ts.map +1 -0
- package/dist/core/federation.js +411 -0
- package/dist/core/federation.js.map +1 -0
- package/dist/core/identity.d.ts +31 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +251 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/index.d.ts +12 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +75 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +570 -355
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/push-manager.d.ts +41 -0
- package/dist/core/push-manager.d.ts.map +1 -0
- package/dist/core/push-manager.js +60 -0
- package/dist/core/push-manager.js.map +1 -0
- package/dist/core/store.d.ts +21 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +44 -0
- package/dist/core/store.js.map +1 -1
- package/dist/core/tcp-transport.d.ts +77 -0
- package/dist/core/tcp-transport.d.ts.map +1 -0
- package/dist/core/tcp-transport.js +596 -0
- package/dist/core/tcp-transport.js.map +1 -0
- package/dist/core/test/bridge.unit.test.d.ts +5 -0
- package/dist/core/test/bridge.unit.test.d.ts.map +1 -0
- package/dist/core/test/bridge.unit.test.js +120 -0
- package/dist/core/test/bridge.unit.test.js.map +1 -0
- package/dist/core/test/identity.unit.test.d.ts +5 -0
- package/dist/core/test/identity.unit.test.d.ts.map +1 -0
- package/dist/core/test/identity.unit.test.js +70 -0
- package/dist/core/test/identity.unit.test.js.map +1 -0
- package/dist/core/tls-transport.d.ts +69 -0
- package/dist/core/tls-transport.d.ts.map +1 -0
- package/dist/core/tls-transport.js +602 -0
- package/dist/core/tls-transport.js.map +1 -0
- package/dist/core/tool.d.ts +23 -2
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +269 -1
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +166 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +20 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/types.d.ts +146 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +77 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/vapid.d.ts +22 -0
- package/dist/core/vapid.d.ts.map +1 -0
- package/dist/core/vapid.js +50 -0
- package/dist/core/vapid.js.map +1 -0
- package/dist/core/web-push.d.ts +37 -0
- package/dist/core/web-push.d.ts.map +1 -0
- package/dist/core/web-push.js +198 -0
- package/dist/core/web-push.js.map +1 -0
- package/dist/core/wire-protocol.d.ts +131 -0
- package/dist/core/wire-protocol.d.ts.map +1 -0
- package/dist/core/wire-protocol.js +54 -0
- package/dist/core/wire-protocol.js.map +1 -0
- package/dist/core/ws-transport.d.ts +71 -0
- package/dist/core/ws-transport.d.ts.map +1 -0
- package/dist/core/ws-transport.js +560 -0
- package/dist/core/ws-transport.js.map +1 -0
- package/dist/test/approval.integration.test.d.ts +9 -0
- package/dist/test/approval.integration.test.d.ts.map +1 -0
- package/dist/test/approval.integration.test.js +361 -0
- package/dist/test/approval.integration.test.js.map +1 -0
- package/dist/test/delivery-receipt.helper.d.ts +16 -0
- package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
- package/dist/test/delivery-receipt.helper.js +409 -0
- package/dist/test/delivery-receipt.helper.js.map +1 -0
- package/dist/test/delivery-receipt.runner.d.ts +13 -0
- package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
- package/dist/test/delivery-receipt.runner.js +51 -0
- package/dist/test/delivery-receipt.runner.js.map +1 -0
- package/dist/test/federation.integration.test.d.ts +15 -0
- package/dist/test/federation.integration.test.d.ts.map +1 -0
- package/dist/test/federation.integration.test.js +218 -0
- package/dist/test/federation.integration.test.js.map +1 -0
- package/dist/test/listener-policy.integration.test.d.ts +9 -0
- package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
- package/dist/test/listener-policy.integration.test.js +239 -0
- package/dist/test/listener-policy.integration.test.js.map +1 -0
- package/dist/test/tls-transport.integration.test.d.ts +8 -0
- package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
- package/dist/test/tls-transport.integration.test.js +158 -0
- package/dist/test/tls-transport.integration.test.js.map +1 -0
- package/dist/test/visibility.integration.test.d.ts +12 -0
- package/dist/test/visibility.integration.test.d.ts.map +1 -0
- package/dist/test/visibility.integration.test.js +181 -0
- package/dist/test/visibility.integration.test.js.map +1 -0
- package/package.json +7 -3
- package/dist/bridges/user/web/frontend/render.d.ts +0 -30
- package/dist/bridges/user/web/frontend/render.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/render.js +0 -129
- package/dist/bridges/user/web/frontend/render.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/dom.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/dom.unit.test.js +0 -149
- package/dist/bridges/user/web/frontend/test/dom.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/input.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/input.unit.test.js +0 -131
- package/dist/bridges/user/web/frontend/test/input.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/render.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/render.unit.test.js +0 -436
- package/dist/bridges/user/web/frontend/test/render.unit.test.js.map +0 -1
- package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts +0 -5
- package/dist/bridges/user/web/frontend/test/state.unit.test.d.ts.map +0 -1
- package/dist/bridges/user/web/frontend/test/state.unit.test.js +0 -119
- package/dist/bridges/user/web/frontend/test/state.unit.test.js.map +0 -1
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocketTransport — WebSocket transport for the peer mesh.
|
|
3
|
+
*
|
|
4
|
+
* Carries the same wire protocol as TcpTransport but over WebSocket frames.
|
|
5
|
+
* Each WS frame is a complete JSON message — no newline delimiter or
|
|
6
|
+
* MessageBuffer needed. This enables browser-based peers (PWAs) to
|
|
7
|
+
* participate in the mesh.
|
|
8
|
+
*
|
|
9
|
+
* The transport is a drop-in replacement for TcpTransport. Same interface,
|
|
10
|
+
* same wire protocol, same event callbacks. MeshStore cannot tell the
|
|
11
|
+
* difference.
|
|
12
|
+
*/
|
|
13
|
+
import { WebSocket, WebSocketServer } from "ws";
|
|
14
|
+
import { isMeshMessage } from "./wire-protocol.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Constants
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/** Timeout for connecting to the coordinator before giving up. */
|
|
19
|
+
const CONNECT_TIMEOUT_MS = 2000;
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Async WS send helper (not exported)
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function sendAsync(ws, data) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
if (ws.readyState !== WebSocket.OPEN) {
|
|
26
|
+
resolve();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
ws.send(data, (err) => {
|
|
30
|
+
if (err)
|
|
31
|
+
reject(err);
|
|
32
|
+
else
|
|
33
|
+
resolve();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// WebSocketTransport
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
export class WebSocketTransport {
|
|
41
|
+
// -- Data server (accepts incoming peer data connections) --
|
|
42
|
+
dataServer;
|
|
43
|
+
_dataPort = 0;
|
|
44
|
+
// -- Coordinator server (accepts introductions from new peers) --
|
|
45
|
+
coordinatorServer;
|
|
46
|
+
_isCoordinator = false;
|
|
47
|
+
// -- Coordinator client socket (connection to the coordinator) --
|
|
48
|
+
coordinatorWs;
|
|
49
|
+
// -- Peer data connections (peer ID → WebSocket) --
|
|
50
|
+
peerConnections = new Map();
|
|
51
|
+
// -- All WS connections accepted by the data server (for shutdown cleanup) --
|
|
52
|
+
dataServerSockets = new Set();
|
|
53
|
+
// -- All WS connections accepted by the coordinator server (for shutdown cleanup) --
|
|
54
|
+
coordinatorServerSockets = new Set();
|
|
55
|
+
// -- Coordinator introduction connections (handle ID → WebSocket) --
|
|
56
|
+
// Maps the introducing peer's ID to the coordinator server WS, so
|
|
57
|
+
// MeshStore can send the peer_list response via transport.send().
|
|
58
|
+
introConnections = new Map();
|
|
59
|
+
// -- Pending connections awaiting approval (handle ID → WS + request info) --
|
|
60
|
+
pendingConnections = new Map();
|
|
61
|
+
// -- Shutdown sentinel — prevents callbacks after shutdown() --
|
|
62
|
+
shutDown = false;
|
|
63
|
+
// -- This peer's ID (set during connectToCoordinator or becomeCoordinator) --
|
|
64
|
+
_peerId = "";
|
|
65
|
+
events;
|
|
66
|
+
constructor(events) {
|
|
67
|
+
this.events = events;
|
|
68
|
+
}
|
|
69
|
+
// -- Public getters for interface properties --
|
|
70
|
+
get dataPort() {
|
|
71
|
+
return this._dataPort;
|
|
72
|
+
}
|
|
73
|
+
get isCoordinator() {
|
|
74
|
+
return this._isCoordinator;
|
|
75
|
+
}
|
|
76
|
+
// -----------------------------------------------------------------------
|
|
77
|
+
// MeshTransport — Data server
|
|
78
|
+
// -----------------------------------------------------------------------
|
|
79
|
+
async startDataServer() {
|
|
80
|
+
await new Promise((resolve, reject) => {
|
|
81
|
+
// WebSocketServer needs an underlying HTTP server to get an
|
|
82
|
+
// OS-assigned port via port 0.
|
|
83
|
+
this.dataServer = new WebSocketServer({ port: 0, host: "0.0.0.0" });
|
|
84
|
+
this.dataServer.on("error", reject);
|
|
85
|
+
this.dataServer.on("listening", () => {
|
|
86
|
+
const addr = this.dataServer?.address();
|
|
87
|
+
if (typeof addr === "object" && addr !== null) {
|
|
88
|
+
this._dataPort = addr.port;
|
|
89
|
+
}
|
|
90
|
+
resolve();
|
|
91
|
+
});
|
|
92
|
+
this.dataServer.on("connection", (ws) => {
|
|
93
|
+
this.handleIncomingDataConnection(ws);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// -----------------------------------------------------------------------
|
|
98
|
+
// MeshTransport — Coordinator connection (client side)
|
|
99
|
+
// -----------------------------------------------------------------------
|
|
100
|
+
async connectToCoordinator(host, port, peerId, localDataPort) {
|
|
101
|
+
this._peerId = peerId;
|
|
102
|
+
await new Promise((resolve, reject) => {
|
|
103
|
+
const url = `ws://${host}:${String(port)}`;
|
|
104
|
+
const ws = new WebSocket(url);
|
|
105
|
+
const timer = setTimeout(() => {
|
|
106
|
+
ws.terminate();
|
|
107
|
+
reject(new Error("Coordinator connection timeout"));
|
|
108
|
+
}, CONNECT_TIMEOUT_MS);
|
|
109
|
+
ws.on("unexpected-response", () => {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
ws.terminate();
|
|
112
|
+
reject(new Error("Coordinator connection rejected"));
|
|
113
|
+
});
|
|
114
|
+
ws.on("open", () => {
|
|
115
|
+
this.coordinatorWs = ws;
|
|
116
|
+
// Send introduction
|
|
117
|
+
const intro = {
|
|
118
|
+
method: "introduce",
|
|
119
|
+
peerId,
|
|
120
|
+
dataPort: localDataPort,
|
|
121
|
+
};
|
|
122
|
+
ws.send(JSON.stringify(intro));
|
|
123
|
+
// Wire up coordinator message handling
|
|
124
|
+
ws.on("message", (raw) => {
|
|
125
|
+
const msg = parseMessage(raw);
|
|
126
|
+
if (msg !== undefined) {
|
|
127
|
+
this.dispatchCoordinatorClientMessage(msg);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
ws.on("error", () => {
|
|
131
|
+
/* ignore late errors on coordinator connection */
|
|
132
|
+
});
|
|
133
|
+
clearTimeout(timer);
|
|
134
|
+
resolve();
|
|
135
|
+
});
|
|
136
|
+
ws.on("error", (err) => {
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
ws.terminate();
|
|
139
|
+
reject(err);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// -----------------------------------------------------------------------
|
|
144
|
+
// MeshTransport — Connect to remote coordinator with approval
|
|
145
|
+
// -----------------------------------------------------------------------
|
|
146
|
+
async connectToRemote(host, port, peerId, _localDataPort, name, fingerprint) {
|
|
147
|
+
this._peerId = peerId;
|
|
148
|
+
await new Promise((resolve, reject) => {
|
|
149
|
+
const url = `ws://${host}:${String(port)}`;
|
|
150
|
+
const ws = new WebSocket(url);
|
|
151
|
+
const timer = setTimeout(() => {
|
|
152
|
+
ws.terminate();
|
|
153
|
+
reject(new Error("Remote connection timeout"));
|
|
154
|
+
}, CONNECT_TIMEOUT_MS);
|
|
155
|
+
ws.on("unexpected-response", () => {
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
ws.terminate();
|
|
158
|
+
reject(new Error("Remote connection rejected"));
|
|
159
|
+
});
|
|
160
|
+
ws.on("open", () => {
|
|
161
|
+
this.coordinatorWs = ws;
|
|
162
|
+
// Send connect_request instead of introduce
|
|
163
|
+
const req = {
|
|
164
|
+
method: "connect_request",
|
|
165
|
+
peerId,
|
|
166
|
+
dataPort: _localDataPort,
|
|
167
|
+
name,
|
|
168
|
+
fingerprint,
|
|
169
|
+
};
|
|
170
|
+
ws.send(JSON.stringify(req));
|
|
171
|
+
// Wait for connect_accepted or connect_rejected
|
|
172
|
+
let approved = false;
|
|
173
|
+
ws.on("message", (raw) => {
|
|
174
|
+
const msg = parseMessage(raw);
|
|
175
|
+
if (msg === undefined)
|
|
176
|
+
return;
|
|
177
|
+
if (!approved) {
|
|
178
|
+
if (msg.method === "connect_accepted") {
|
|
179
|
+
approved = true;
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
resolve();
|
|
182
|
+
}
|
|
183
|
+
else if (msg.method === "connect_rejected") {
|
|
184
|
+
clearTimeout(timer);
|
|
185
|
+
ws.terminate();
|
|
186
|
+
reject(new Error(`Connection rejected: ${msg.reason}`));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.dispatchCoordinatorClientMessage(msg);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
ws.on("error", () => {
|
|
195
|
+
/* ignore late errors on coordinator connection */
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
ws.on("error", (err) => {
|
|
199
|
+
clearTimeout(timer);
|
|
200
|
+
ws.terminate();
|
|
201
|
+
reject(err);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// -----------------------------------------------------------------------
|
|
206
|
+
// MeshTransport — Become coordinator (server side)
|
|
207
|
+
// -----------------------------------------------------------------------
|
|
208
|
+
async becomeCoordinator(host, port) {
|
|
209
|
+
await new Promise((resolve, reject) => {
|
|
210
|
+
this.coordinatorServer = new WebSocketServer({ host, port });
|
|
211
|
+
this.coordinatorServer.on("error", (err) => {
|
|
212
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
213
|
+
});
|
|
214
|
+
this.coordinatorServer.on("listening", () => {
|
|
215
|
+
this._isCoordinator = true;
|
|
216
|
+
resolve();
|
|
217
|
+
});
|
|
218
|
+
this.coordinatorServer.on("connection", (ws) => {
|
|
219
|
+
this.handleCoordinatorServerConnection(ws);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// -----------------------------------------------------------------------
|
|
224
|
+
// MeshTransport — Connect to a peer's data server
|
|
225
|
+
// -----------------------------------------------------------------------
|
|
226
|
+
async connectToPeer(peer, ownPeerId) {
|
|
227
|
+
if (this.peerConnections.has(peer.id))
|
|
228
|
+
return;
|
|
229
|
+
await new Promise((resolve) => {
|
|
230
|
+
const url = `ws://127.0.0.1:${String(peer.port)}`;
|
|
231
|
+
const ws = new WebSocket(url);
|
|
232
|
+
ws.on("open", () => {
|
|
233
|
+
this.peerConnections.set(peer.id, ws);
|
|
234
|
+
// Identify ourselves
|
|
235
|
+
const pong = { method: "pong", peerId: ownPeerId };
|
|
236
|
+
ws.send(JSON.stringify(pong));
|
|
237
|
+
// Wire up ongoing message handling
|
|
238
|
+
ws.on("message", (raw) => {
|
|
239
|
+
const msg = parseMessage(raw);
|
|
240
|
+
if (msg !== undefined) {
|
|
241
|
+
const handle = { id: peer.id };
|
|
242
|
+
this.dispatchDataMessage(handle, msg);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
resolve();
|
|
246
|
+
});
|
|
247
|
+
const handle = { id: peer.id };
|
|
248
|
+
let disconnected = false;
|
|
249
|
+
const onDisconnect = () => {
|
|
250
|
+
if (disconnected)
|
|
251
|
+
return;
|
|
252
|
+
disconnected = true;
|
|
253
|
+
const wasConnected = this.peerConnections.has(peer.id);
|
|
254
|
+
this.peerConnections.delete(peer.id);
|
|
255
|
+
if (wasConnected && !this.shutDown) {
|
|
256
|
+
this.events.onPeerDisconnected(handle);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
ws.on("close", onDisconnect);
|
|
260
|
+
ws.on("error", () => {
|
|
261
|
+
onDisconnect();
|
|
262
|
+
ws.terminate();
|
|
263
|
+
resolve();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// -----------------------------------------------------------------------
|
|
268
|
+
// MeshTransport — Send / broadcast
|
|
269
|
+
// -----------------------------------------------------------------------
|
|
270
|
+
async send(handle, message) {
|
|
271
|
+
const data = JSON.stringify(message);
|
|
272
|
+
// Check data connections first
|
|
273
|
+
const peerWs = this.peerConnections.get(handle.id);
|
|
274
|
+
if (peerWs) {
|
|
275
|
+
await sendAsync(peerWs, data);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
// Check coordinator introduction connections
|
|
279
|
+
const introWs = this.introConnections.get(handle.id);
|
|
280
|
+
if (introWs) {
|
|
281
|
+
await sendAsync(introWs, data);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
throw new Error(`No connection for handle ${handle.id}`);
|
|
285
|
+
}
|
|
286
|
+
async acceptConnection(handle) {
|
|
287
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
288
|
+
if (!pending) {
|
|
289
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
290
|
+
}
|
|
291
|
+
this.pendingConnections.delete(handle.id);
|
|
292
|
+
const { ws, peerId, dataPort, name, fingerprint } = pending;
|
|
293
|
+
// Move to introConnections so send() can reach this peer
|
|
294
|
+
this.introConnections.set(peerId, ws);
|
|
295
|
+
// Send acceptance to the connecting peer
|
|
296
|
+
const accepted = {
|
|
297
|
+
method: "connect_accepted",
|
|
298
|
+
peerId: this._peerId,
|
|
299
|
+
dataPort: this._dataPort,
|
|
300
|
+
};
|
|
301
|
+
await sendAsync(ws, JSON.stringify(accepted));
|
|
302
|
+
// Fire onIntroduction so MeshStore processes the new peer normally
|
|
303
|
+
const connHandle = { id: peerId };
|
|
304
|
+
this.events.onIntroduction(connHandle, { peerId, dataPort });
|
|
305
|
+
void name;
|
|
306
|
+
void fingerprint;
|
|
307
|
+
}
|
|
308
|
+
async rejectConnection(handle, reason) {
|
|
309
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
310
|
+
if (!pending) {
|
|
311
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
312
|
+
}
|
|
313
|
+
this.pendingConnections.delete(handle.id);
|
|
314
|
+
const { ws } = pending;
|
|
315
|
+
const rejected = {
|
|
316
|
+
method: "connect_rejected",
|
|
317
|
+
peerId: handle.id,
|
|
318
|
+
reason,
|
|
319
|
+
};
|
|
320
|
+
await sendAsync(ws, JSON.stringify(rejected));
|
|
321
|
+
ws.terminate();
|
|
322
|
+
}
|
|
323
|
+
async broadcast(message) {
|
|
324
|
+
const data = JSON.stringify(message);
|
|
325
|
+
const writes = [];
|
|
326
|
+
for (const [, ws] of this.peerConnections) {
|
|
327
|
+
writes.push(sendAsync(ws, data).catch(() => {
|
|
328
|
+
/* broken connection — cleanup handled by close/error listeners */
|
|
329
|
+
}));
|
|
330
|
+
}
|
|
331
|
+
await Promise.all(writes);
|
|
332
|
+
}
|
|
333
|
+
// -----------------------------------------------------------------------
|
|
334
|
+
// MeshTransport — Listener management (not supported over WebSocket)
|
|
335
|
+
// -----------------------------------------------------------------------
|
|
336
|
+
async addListener() {
|
|
337
|
+
throw new Error("WebSocketTransport does not support listener management");
|
|
338
|
+
}
|
|
339
|
+
async removeListener() {
|
|
340
|
+
throw new Error("WebSocketTransport does not support listener management");
|
|
341
|
+
}
|
|
342
|
+
listListeners() {
|
|
343
|
+
return [];
|
|
344
|
+
}
|
|
345
|
+
// -----------------------------------------------------------------------
|
|
346
|
+
// MeshTransport — Shutdown / unref
|
|
347
|
+
// -----------------------------------------------------------------------
|
|
348
|
+
async shutdown() {
|
|
349
|
+
this.shutDown = true;
|
|
350
|
+
// Destroy the coordinator client socket
|
|
351
|
+
this.coordinatorWs?.terminate();
|
|
352
|
+
this.coordinatorWs = undefined;
|
|
353
|
+
// Destroy all identified peer connections
|
|
354
|
+
for (const [, ws] of this.peerConnections) {
|
|
355
|
+
ws.terminate();
|
|
356
|
+
}
|
|
357
|
+
this.peerConnections.clear();
|
|
358
|
+
// Destroy all data server accepted sockets (including unidentified)
|
|
359
|
+
for (const ws of this.dataServerSockets) {
|
|
360
|
+
ws.terminate();
|
|
361
|
+
}
|
|
362
|
+
this.dataServerSockets.clear();
|
|
363
|
+
// Destroy all coordinator server accepted sockets
|
|
364
|
+
for (const ws of this.coordinatorServerSockets) {
|
|
365
|
+
ws.terminate();
|
|
366
|
+
}
|
|
367
|
+
this.coordinatorServerSockets.clear();
|
|
368
|
+
// Clear introduction connection tracking
|
|
369
|
+
this.introConnections.clear();
|
|
370
|
+
// Clear pending connections
|
|
371
|
+
for (const [, pending] of this.pendingConnections) {
|
|
372
|
+
pending.ws.terminate();
|
|
373
|
+
}
|
|
374
|
+
this.pendingConnections.clear();
|
|
375
|
+
// Close servers — stop accepting new connections
|
|
376
|
+
this.dataServer?.close();
|
|
377
|
+
this.dataServer = undefined;
|
|
378
|
+
this.coordinatorServer?.close();
|
|
379
|
+
this.coordinatorServer = undefined;
|
|
380
|
+
this._isCoordinator = false;
|
|
381
|
+
}
|
|
382
|
+
unref() {
|
|
383
|
+
// WebSocketServer doesn't have an unref() method the way net.Server
|
|
384
|
+
// does. The servers will be closed on shutdown(). Peer WS connections
|
|
385
|
+
// are cleaned up on shutdown() as well.
|
|
386
|
+
}
|
|
387
|
+
// -----------------------------------------------------------------------
|
|
388
|
+
// Internal — Coordinator client message dispatch
|
|
389
|
+
// -----------------------------------------------------------------------
|
|
390
|
+
/**
|
|
391
|
+
* Handles messages received on the coordinator client socket (the
|
|
392
|
+
* connection from this peer TO the coordinator). Fires the appropriate
|
|
393
|
+
* TransportEvents for peer_list, peer_joined, and become_coordinator.
|
|
394
|
+
*/
|
|
395
|
+
dispatchCoordinatorClientMessage(msg) {
|
|
396
|
+
if (this.shutDown)
|
|
397
|
+
return;
|
|
398
|
+
if (msg.method === "peer_list") {
|
|
399
|
+
this.events.onPeerList(msg.peers);
|
|
400
|
+
}
|
|
401
|
+
else if (msg.method === "peer_joined") {
|
|
402
|
+
this.events.onPeerJoined(msg.peer);
|
|
403
|
+
}
|
|
404
|
+
else if (msg.method === "become_coordinator") {
|
|
405
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// -----------------------------------------------------------------------
|
|
409
|
+
// Internal — Data message dispatch
|
|
410
|
+
// -----------------------------------------------------------------------
|
|
411
|
+
/**
|
|
412
|
+
* Routes a message received on a peer data connection to the
|
|
413
|
+
* appropriate event. become_coordinator has its own event; all
|
|
414
|
+
* other messages fire onMessage for MeshStore to handle.
|
|
415
|
+
*/
|
|
416
|
+
dispatchDataMessage(handle, msg) {
|
|
417
|
+
if (this.shutDown)
|
|
418
|
+
return;
|
|
419
|
+
if (msg.method === "become_coordinator") {
|
|
420
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
this.events.onMessage(handle, msg);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// -----------------------------------------------------------------------
|
|
427
|
+
// Internal — Coordinator server connection handling
|
|
428
|
+
// -----------------------------------------------------------------------
|
|
429
|
+
/**
|
|
430
|
+
* Accepts a new connection on the coordinator server. Reads
|
|
431
|
+
* introduce messages and fires onIntroduction so MeshStore can
|
|
432
|
+
* respond with the peer list and broadcast the arrival.
|
|
433
|
+
*/
|
|
434
|
+
handleCoordinatorServerConnection(ws) {
|
|
435
|
+
if (this.shutDown) {
|
|
436
|
+
ws.terminate();
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
this.coordinatorServerSockets.add(ws);
|
|
440
|
+
ws.on("close", () => this.coordinatorServerSockets.delete(ws));
|
|
441
|
+
ws.on("error", () => this.coordinatorServerSockets.delete(ws));
|
|
442
|
+
ws.on("message", (raw) => {
|
|
443
|
+
const msg = parseMessage(raw);
|
|
444
|
+
if (msg === undefined)
|
|
445
|
+
return;
|
|
446
|
+
if (msg.method === "introduce") {
|
|
447
|
+
const handle = { id: msg.peerId };
|
|
448
|
+
this.introConnections.set(handle.id, ws);
|
|
449
|
+
this.events.onIntroduction(handle, {
|
|
450
|
+
peerId: msg.peerId,
|
|
451
|
+
dataPort: msg.dataPort,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
else if (msg.method === "connect_request") {
|
|
455
|
+
const handle = { id: msg.peerId };
|
|
456
|
+
this.pendingConnections.set(handle.id, {
|
|
457
|
+
ws,
|
|
458
|
+
peerId: msg.peerId,
|
|
459
|
+
dataPort: msg.dataPort,
|
|
460
|
+
name: msg.name,
|
|
461
|
+
fingerprint: msg.fingerprint,
|
|
462
|
+
});
|
|
463
|
+
this.events.onConnectionRequest(handle, {
|
|
464
|
+
peerId: msg.peerId,
|
|
465
|
+
dataPort: msg.dataPort,
|
|
466
|
+
name: msg.name,
|
|
467
|
+
fingerprint: msg.fingerprint,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
// -----------------------------------------------------------------------
|
|
473
|
+
// Internal — Incoming data connection handling
|
|
474
|
+
// -----------------------------------------------------------------------
|
|
475
|
+
/**
|
|
476
|
+
* Accepts a new connection on the data server. Reads the initial
|
|
477
|
+
* pong to identify the peer, then fires onMessage for subsequent
|
|
478
|
+
* messages. Tracks the connection for cleanup on close/error.
|
|
479
|
+
*/
|
|
480
|
+
handleIncomingDataConnection(ws) {
|
|
481
|
+
if (this.shutDown) {
|
|
482
|
+
ws.terminate();
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
this.dataServerSockets.add(ws);
|
|
486
|
+
ws.on("close", () => this.dataServerSockets.delete(ws));
|
|
487
|
+
let remotePeerId;
|
|
488
|
+
let disconnected = false;
|
|
489
|
+
ws.on("message", (raw) => {
|
|
490
|
+
const msg = parseMessage(raw);
|
|
491
|
+
if (msg === undefined)
|
|
492
|
+
return;
|
|
493
|
+
if (msg.method === "pong") {
|
|
494
|
+
const peerId = msg.peerId;
|
|
495
|
+
remotePeerId = peerId;
|
|
496
|
+
if (!this.peerConnections.has(peerId)) {
|
|
497
|
+
this.peerConnections.set(peerId, ws);
|
|
498
|
+
}
|
|
499
|
+
const handle = { id: peerId };
|
|
500
|
+
const info = {
|
|
501
|
+
id: peerId,
|
|
502
|
+
port: 0,
|
|
503
|
+
startedAt: new Date().toISOString(),
|
|
504
|
+
};
|
|
505
|
+
this.events.onPeerConnected(handle, info);
|
|
506
|
+
}
|
|
507
|
+
else if (remotePeerId !== undefined) {
|
|
508
|
+
const handle = { id: remotePeerId };
|
|
509
|
+
this.dispatchDataMessage(handle, msg);
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
const onDisconnect = () => {
|
|
513
|
+
if (disconnected)
|
|
514
|
+
return;
|
|
515
|
+
disconnected = true;
|
|
516
|
+
if (remotePeerId !== undefined) {
|
|
517
|
+
this.peerConnections.delete(remotePeerId);
|
|
518
|
+
if (!this.shutDown) {
|
|
519
|
+
this.events.onPeerDisconnected({ id: remotePeerId });
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
ws.on("close", onDisconnect);
|
|
524
|
+
ws.on("error", onDisconnect);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// ---------------------------------------------------------------------------
|
|
528
|
+
// Message parsing (not exported)
|
|
529
|
+
// ---------------------------------------------------------------------------
|
|
530
|
+
/**
|
|
531
|
+
* Parse a raw WS message into a MeshMessage, returning undefined for
|
|
532
|
+
* malformed data. Unlike TCP, each WS frame is a complete message —
|
|
533
|
+
* no newline delimiter or buffer splitting required.
|
|
534
|
+
*/
|
|
535
|
+
function parseMessage(raw) {
|
|
536
|
+
if (raw === undefined)
|
|
537
|
+
return undefined;
|
|
538
|
+
// WS data arrives as Buffer in Node, string in browsers
|
|
539
|
+
let text;
|
|
540
|
+
if (typeof raw === "string") {
|
|
541
|
+
text = raw;
|
|
542
|
+
}
|
|
543
|
+
else if (raw instanceof Buffer || ArrayBuffer.isView(raw)) {
|
|
544
|
+
text = new TextDecoder().decode(raw instanceof Buffer ? raw : new Uint8Array(raw.buffer));
|
|
545
|
+
}
|
|
546
|
+
else if (raw instanceof ArrayBuffer) {
|
|
547
|
+
text = new TextDecoder().decode(raw);
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
return undefined;
|
|
551
|
+
}
|
|
552
|
+
try {
|
|
553
|
+
const parsed = JSON.parse(text);
|
|
554
|
+
return isMeshMessage(parsed) ? parsed : undefined;
|
|
555
|
+
}
|
|
556
|
+
catch {
|
|
557
|
+
return undefined;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=ws-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-transport.js","sourceRoot":"","sources":["../../src/core/ws-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for bidirectional connection approval.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that a peer can connect via connect_request, the coordinator
|
|
5
|
+
* receives the request, accepts or rejects it, and the connection is
|
|
6
|
+
* established or torn down accordingly.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=approval.integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.integration.test.d.ts","sourceRoot":"","sources":["../../src/test/approval.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|