agent-comms 1.14.0 → 1.15.1
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.map +1 -1
- package/dist/bridges/pi/index.js +39 -17
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +9 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +25 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +2 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +2 -0
- package/dist/bridges/user/web/build.d.ts.map +1 -1
- package/dist/bridges/user/web/build.js +44 -0
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +5 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +6 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- 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 +7 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +15 -9
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +1 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +73 -5
- 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/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/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/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 +254 -12
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/core/bridge.d.ts +28 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +137 -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 +11 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +72 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +467 -352
- 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/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 +136 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +71 -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 +4 -1
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TcpTransport — TCP localhost transport for the peer mesh.
|
|
3
|
+
*
|
|
4
|
+
* Owns all net.Server and net.Socket instances. Handles connection
|
|
5
|
+
* establishment, framing, and message routing. Fires events via
|
|
6
|
+
* TransportEvents for MeshStore to handle state management.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle mirrors the MeshTransport interface:
|
|
9
|
+
* 1. startDataServer() — listen for incoming peer data connections
|
|
10
|
+
* 2. connectToCoordinator() — join an existing mesh
|
|
11
|
+
* OR becomeCoordinator() — start a new mesh as coordinator
|
|
12
|
+
* 3. connectToPeer() — establish data connection to a discovered peer
|
|
13
|
+
* 4. send() / broadcast() — send wire messages
|
|
14
|
+
* 5. shutdown() — close all connections and servers
|
|
15
|
+
*/
|
|
16
|
+
import * as net from "node:net";
|
|
17
|
+
import { encode, isMeshMessage, MessageBuffer } from "./wire-protocol.js";
|
|
18
|
+
import { nanoid } from "./nanoid.js";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Constants
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** Host all mesh servers bind to. */
|
|
23
|
+
const COORDINATOR_HOST = "127.0.0.1";
|
|
24
|
+
/** Timeout for connecting to the coordinator before giving up. */
|
|
25
|
+
const CONNECT_TIMEOUT_MS = 2000;
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Async socket write helper (not exported)
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
function writeAsync(socket, data) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
if (socket.destroyed) {
|
|
32
|
+
resolve();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
socket.write(data, "utf-8", (err) => {
|
|
36
|
+
if (err)
|
|
37
|
+
reject(err);
|
|
38
|
+
else
|
|
39
|
+
resolve();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// TcpTransport
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
export class TcpTransport {
|
|
47
|
+
// -- Data server (accepts incoming peer data connections) --
|
|
48
|
+
dataServer;
|
|
49
|
+
_dataPort = 0;
|
|
50
|
+
// -- Coordinator listeners (multiple adapters) --
|
|
51
|
+
coordinatorListeners = new Map();
|
|
52
|
+
/** The default localhost listener ID (set once during becomeCoordinator). */
|
|
53
|
+
defaultListenerId;
|
|
54
|
+
_isCoordinator = false;
|
|
55
|
+
// -- Coordinator client socket (connection to the coordinator) --
|
|
56
|
+
coordinatorSocket;
|
|
57
|
+
// -- Peer data connections (peer ID → socket + buffer) --
|
|
58
|
+
peerConnections = new Map();
|
|
59
|
+
// -- All sockets accepted by the data server (for shutdown cleanup) --
|
|
60
|
+
dataServerSockets = new Set();
|
|
61
|
+
// -- All sockets accepted by coordinator servers (for shutdown cleanup) --
|
|
62
|
+
coordinatorServerSockets = new Set();
|
|
63
|
+
// -- Coordinator introduction connections (handle ID → socket) --
|
|
64
|
+
// Maps the introducing peer's ID to the coordinator server socket, so
|
|
65
|
+
// MeshStore can send the peer_list response via transport.send().
|
|
66
|
+
introConnections = new Map();
|
|
67
|
+
// -- Pending connections awaiting approval (handle ID → socket + request info) --
|
|
68
|
+
pendingConnections = new Map();
|
|
69
|
+
// -- Shutdown sentinel — prevents callbacks after shutdown() --
|
|
70
|
+
shutDown = false;
|
|
71
|
+
// -- This peer's ID (set during connectToCoordinator or becomeCoordinator) --
|
|
72
|
+
_peerId = "";
|
|
73
|
+
events;
|
|
74
|
+
constructor(events) {
|
|
75
|
+
this.events = events;
|
|
76
|
+
}
|
|
77
|
+
// -- Public getters for interface properties --
|
|
78
|
+
get dataPort() {
|
|
79
|
+
return this._dataPort;
|
|
80
|
+
}
|
|
81
|
+
get isCoordinator() {
|
|
82
|
+
return this._isCoordinator;
|
|
83
|
+
}
|
|
84
|
+
// -----------------------------------------------------------------------
|
|
85
|
+
// MeshTransport — Data server
|
|
86
|
+
// -----------------------------------------------------------------------
|
|
87
|
+
async startDataServer() {
|
|
88
|
+
await new Promise((resolve, reject) => {
|
|
89
|
+
this.dataServer = net.createServer((socket) => {
|
|
90
|
+
this.handleIncomingDataConnection(socket);
|
|
91
|
+
});
|
|
92
|
+
this.dataServer.listen(0, COORDINATOR_HOST, () => {
|
|
93
|
+
const addr = this.dataServer?.address();
|
|
94
|
+
if (typeof addr === "object" && addr !== null) {
|
|
95
|
+
this._dataPort = addr.port;
|
|
96
|
+
}
|
|
97
|
+
resolve();
|
|
98
|
+
});
|
|
99
|
+
this.dataServer.on("error", reject);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// -----------------------------------------------------------------------
|
|
103
|
+
// MeshTransport — Coordinator connection (client side)
|
|
104
|
+
// -----------------------------------------------------------------------
|
|
105
|
+
async connectToCoordinator(host, port, peerId, localDataPort) {
|
|
106
|
+
this._peerId = peerId;
|
|
107
|
+
await new Promise((resolve, reject) => {
|
|
108
|
+
const socket = net.createConnection({ port, host }, () => {
|
|
109
|
+
this.coordinatorSocket = socket;
|
|
110
|
+
// Send introduction
|
|
111
|
+
const intro = {
|
|
112
|
+
method: "introduce",
|
|
113
|
+
peerId,
|
|
114
|
+
dataPort: localDataPort,
|
|
115
|
+
};
|
|
116
|
+
socket.write(encode(intro));
|
|
117
|
+
// Wire up coordinator message handling
|
|
118
|
+
const buffer = new MessageBuffer();
|
|
119
|
+
socket.on("data", (data) => {
|
|
120
|
+
const items = buffer.append(data.toString());
|
|
121
|
+
for (const item of items) {
|
|
122
|
+
if (isMeshMessage(item)) {
|
|
123
|
+
this.dispatchCoordinatorClientMessage(item);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
socket.on("error", () => {
|
|
128
|
+
/* ignore late errors on coordinator connection */
|
|
129
|
+
});
|
|
130
|
+
clearTimeout(timer);
|
|
131
|
+
resolve();
|
|
132
|
+
});
|
|
133
|
+
const timer = setTimeout(() => {
|
|
134
|
+
socket.destroy();
|
|
135
|
+
reject(new Error("Coordinator connection timeout"));
|
|
136
|
+
}, CONNECT_TIMEOUT_MS);
|
|
137
|
+
socket.on("error", (err) => {
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
socket.destroy();
|
|
140
|
+
reject(err);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// -----------------------------------------------------------------------
|
|
145
|
+
// MeshTransport — Connect to remote coordinator with approval
|
|
146
|
+
// -----------------------------------------------------------------------
|
|
147
|
+
async connectToRemote(host, port, peerId, localDataPort, name, fingerprint) {
|
|
148
|
+
this._peerId = peerId;
|
|
149
|
+
await new Promise((resolve, reject) => {
|
|
150
|
+
const socket = net.createConnection({ port, host }, () => {
|
|
151
|
+
this.coordinatorSocket = socket;
|
|
152
|
+
// Send connect_request instead of introduce
|
|
153
|
+
const req = {
|
|
154
|
+
method: "connect_request",
|
|
155
|
+
peerId,
|
|
156
|
+
dataPort: localDataPort,
|
|
157
|
+
name,
|
|
158
|
+
fingerprint,
|
|
159
|
+
};
|
|
160
|
+
socket.write(encode(req));
|
|
161
|
+
// Wire up coordinator message handling
|
|
162
|
+
// Pending: wait for connect_accepted/rejected, then normal dispatch
|
|
163
|
+
const buffer = new MessageBuffer();
|
|
164
|
+
let approved = false;
|
|
165
|
+
socket.on("data", (data) => {
|
|
166
|
+
const items = buffer.append(data.toString());
|
|
167
|
+
for (const item of items) {
|
|
168
|
+
if (!isMeshMessage(item))
|
|
169
|
+
continue;
|
|
170
|
+
if (!approved) {
|
|
171
|
+
if (item.method === "connect_accepted") {
|
|
172
|
+
approved = true;
|
|
173
|
+
resolve();
|
|
174
|
+
}
|
|
175
|
+
else if (item.method === "connect_rejected") {
|
|
176
|
+
socket.destroy();
|
|
177
|
+
reject(new Error(`Connection rejected: ${item.reason}`));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.dispatchCoordinatorClientMessage(item);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
socket.on("error", () => {
|
|
187
|
+
/* ignore late errors on coordinator connection */
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
const timer = setTimeout(() => {
|
|
191
|
+
socket.destroy();
|
|
192
|
+
reject(new Error("Remote connection timeout"));
|
|
193
|
+
}, CONNECT_TIMEOUT_MS);
|
|
194
|
+
socket.on("error", (err) => {
|
|
195
|
+
clearTimeout(timer);
|
|
196
|
+
socket.destroy();
|
|
197
|
+
reject(err);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// -----------------------------------------------------------------------
|
|
202
|
+
// MeshTransport — Become coordinator (server side)
|
|
203
|
+
// -----------------------------------------------------------------------
|
|
204
|
+
async becomeCoordinator(host, port) {
|
|
205
|
+
const id = nanoid(8);
|
|
206
|
+
await new Promise((resolve, reject) => {
|
|
207
|
+
const server = net.createServer((socket) => {
|
|
208
|
+
this.handleCoordinatorServerConnection(socket, "full");
|
|
209
|
+
});
|
|
210
|
+
server.listen(port, host, () => {
|
|
211
|
+
this._isCoordinator = true;
|
|
212
|
+
this.coordinatorListeners.set(id, {
|
|
213
|
+
server,
|
|
214
|
+
policy: "full",
|
|
215
|
+
host,
|
|
216
|
+
port,
|
|
217
|
+
isDefault: true,
|
|
218
|
+
});
|
|
219
|
+
this.defaultListenerId = id;
|
|
220
|
+
resolve();
|
|
221
|
+
});
|
|
222
|
+
server.on("error", (err) => {
|
|
223
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// -----------------------------------------------------------------------
|
|
228
|
+
// MeshTransport — Multi-listener management
|
|
229
|
+
// -----------------------------------------------------------------------
|
|
230
|
+
async addListener(host, port, policy) {
|
|
231
|
+
if (!this._isCoordinator) {
|
|
232
|
+
throw new Error("Only the coordinator can add listeners");
|
|
233
|
+
}
|
|
234
|
+
const id = nanoid(8);
|
|
235
|
+
await new Promise((resolve, reject) => {
|
|
236
|
+
const server = net.createServer((socket) => {
|
|
237
|
+
this.handleCoordinatorServerConnection(socket, policy);
|
|
238
|
+
});
|
|
239
|
+
server.listen(port, host, () => {
|
|
240
|
+
const addr = server.address();
|
|
241
|
+
const actualPort = typeof addr === "object" && addr !== null ? addr.port : port;
|
|
242
|
+
this.coordinatorListeners.set(id, {
|
|
243
|
+
server,
|
|
244
|
+
policy,
|
|
245
|
+
host,
|
|
246
|
+
port: actualPort,
|
|
247
|
+
isDefault: false,
|
|
248
|
+
});
|
|
249
|
+
resolve();
|
|
250
|
+
});
|
|
251
|
+
server.on("error", (err) => {
|
|
252
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
return id;
|
|
256
|
+
}
|
|
257
|
+
async removeListener(id) {
|
|
258
|
+
const listener = this.coordinatorListeners.get(id);
|
|
259
|
+
if (!listener) {
|
|
260
|
+
throw new Error(`Listener ${id} not found`);
|
|
261
|
+
}
|
|
262
|
+
if (listener.isDefault) {
|
|
263
|
+
throw new Error("Cannot remove the default localhost listener");
|
|
264
|
+
}
|
|
265
|
+
listener.server.unref();
|
|
266
|
+
listener.server.close();
|
|
267
|
+
this.coordinatorListeners.delete(id);
|
|
268
|
+
}
|
|
269
|
+
listListeners() {
|
|
270
|
+
const result = [];
|
|
271
|
+
for (const [id, listener] of this.coordinatorListeners) {
|
|
272
|
+
result.push({
|
|
273
|
+
id,
|
|
274
|
+
host: listener.host,
|
|
275
|
+
port: listener.port,
|
|
276
|
+
policy: listener.policy,
|
|
277
|
+
isDefault: listener.isDefault,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
// -----------------------------------------------------------------------
|
|
283
|
+
// MeshTransport — Connect to a peer's data server
|
|
284
|
+
// -----------------------------------------------------------------------
|
|
285
|
+
async connectToPeer(peer, ownPeerId) {
|
|
286
|
+
if (this.peerConnections.has(peer.id))
|
|
287
|
+
return;
|
|
288
|
+
await new Promise((resolve) => {
|
|
289
|
+
const socket = net.createConnection({ port: peer.port, host: COORDINATOR_HOST }, () => {
|
|
290
|
+
const buffer = new MessageBuffer();
|
|
291
|
+
this.peerConnections.set(peer.id, { socket, buffer });
|
|
292
|
+
// Identify ourselves
|
|
293
|
+
const pong = { method: "pong", peerId: ownPeerId };
|
|
294
|
+
socket.write(encode(pong));
|
|
295
|
+
// Wire up ongoing message handling
|
|
296
|
+
socket.on("data", (data) => {
|
|
297
|
+
const items = buffer.append(data.toString());
|
|
298
|
+
for (const item of items) {
|
|
299
|
+
if (isMeshMessage(item)) {
|
|
300
|
+
const handle = { id: peer.id };
|
|
301
|
+
this.dispatchDataMessage(handle, item);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
resolve();
|
|
306
|
+
});
|
|
307
|
+
const handle = { id: peer.id };
|
|
308
|
+
let disconnected = false;
|
|
309
|
+
const onDisconnect = () => {
|
|
310
|
+
if (disconnected)
|
|
311
|
+
return;
|
|
312
|
+
disconnected = true;
|
|
313
|
+
const wasConnected = this.peerConnections.has(peer.id);
|
|
314
|
+
this.peerConnections.delete(peer.id);
|
|
315
|
+
if (wasConnected && !this.shutDown) {
|
|
316
|
+
this.events.onPeerDisconnected(handle);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
socket.on("close", onDisconnect);
|
|
320
|
+
socket.on("error", () => {
|
|
321
|
+
onDisconnect();
|
|
322
|
+
socket.destroy();
|
|
323
|
+
resolve();
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
// -----------------------------------------------------------------------
|
|
328
|
+
// MeshTransport — Send / broadcast
|
|
329
|
+
// -----------------------------------------------------------------------
|
|
330
|
+
async send(handle, message) {
|
|
331
|
+
// Check data connections first
|
|
332
|
+
const peerConn = this.peerConnections.get(handle.id);
|
|
333
|
+
if (peerConn) {
|
|
334
|
+
await writeAsync(peerConn.socket, encode(message));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
// Check coordinator introduction connections
|
|
338
|
+
const introSocket = this.introConnections.get(handle.id);
|
|
339
|
+
if (introSocket) {
|
|
340
|
+
await writeAsync(introSocket, encode(message));
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
throw new Error(`No connection for handle ${handle.id}`);
|
|
344
|
+
}
|
|
345
|
+
async acceptConnection(handle) {
|
|
346
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
347
|
+
if (!pending) {
|
|
348
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
349
|
+
}
|
|
350
|
+
this.pendingConnections.delete(handle.id);
|
|
351
|
+
const { socket, peerId, dataPort, name, fingerprint, policy } = pending;
|
|
352
|
+
// Move to introConnections so send() can reach this peer
|
|
353
|
+
this.introConnections.set(peerId, socket);
|
|
354
|
+
// Send acceptance to the connecting peer
|
|
355
|
+
const accepted = {
|
|
356
|
+
method: "connect_accepted",
|
|
357
|
+
peerId: this._peerId,
|
|
358
|
+
dataPort: this._dataPort,
|
|
359
|
+
};
|
|
360
|
+
await writeAsync(socket, encode(accepted));
|
|
361
|
+
// Fire onIntroduction so MeshStore processes the new peer normally
|
|
362
|
+
const connHandle = { id: peerId, policy };
|
|
363
|
+
this.events.onIntroduction(connHandle, { peerId, dataPort });
|
|
364
|
+
// Suppress unused-var warnings
|
|
365
|
+
void name;
|
|
366
|
+
void fingerprint;
|
|
367
|
+
}
|
|
368
|
+
async rejectConnection(handle, reason) {
|
|
369
|
+
const pending = this.pendingConnections.get(handle.id);
|
|
370
|
+
if (!pending) {
|
|
371
|
+
throw new Error(`No pending connection for handle ${handle.id}`);
|
|
372
|
+
}
|
|
373
|
+
this.pendingConnections.delete(handle.id);
|
|
374
|
+
const { socket } = pending;
|
|
375
|
+
const rejected = {
|
|
376
|
+
method: "connect_rejected",
|
|
377
|
+
peerId: handle.id,
|
|
378
|
+
reason,
|
|
379
|
+
};
|
|
380
|
+
await writeAsync(socket, encode(rejected));
|
|
381
|
+
socket.destroy();
|
|
382
|
+
}
|
|
383
|
+
async broadcast(message) {
|
|
384
|
+
const data = encode(message);
|
|
385
|
+
const writes = [];
|
|
386
|
+
for (const [, peer] of this.peerConnections) {
|
|
387
|
+
writes.push(writeAsync(peer.socket, data).catch(() => {
|
|
388
|
+
/* broken connection — cleanup handled by close/error listeners */
|
|
389
|
+
}));
|
|
390
|
+
}
|
|
391
|
+
await Promise.all(writes);
|
|
392
|
+
}
|
|
393
|
+
// -----------------------------------------------------------------------
|
|
394
|
+
// MeshTransport — Shutdown / unref
|
|
395
|
+
// -----------------------------------------------------------------------
|
|
396
|
+
async shutdown() {
|
|
397
|
+
this.shutDown = true;
|
|
398
|
+
// Destroy the coordinator client socket
|
|
399
|
+
this.coordinatorSocket?.unref();
|
|
400
|
+
this.coordinatorSocket?.destroy();
|
|
401
|
+
this.coordinatorSocket = undefined;
|
|
402
|
+
// Destroy all identified peer connections
|
|
403
|
+
for (const [, peer] of this.peerConnections) {
|
|
404
|
+
peer.socket.unref();
|
|
405
|
+
peer.socket.destroy();
|
|
406
|
+
}
|
|
407
|
+
this.peerConnections.clear();
|
|
408
|
+
// Destroy all data server accepted sockets (including unidentified)
|
|
409
|
+
for (const socket of this.dataServerSockets) {
|
|
410
|
+
socket.unref();
|
|
411
|
+
socket.destroy();
|
|
412
|
+
}
|
|
413
|
+
this.dataServerSockets.clear();
|
|
414
|
+
// Destroy all coordinator server accepted sockets
|
|
415
|
+
for (const socket of this.coordinatorServerSockets) {
|
|
416
|
+
socket.unref();
|
|
417
|
+
socket.destroy();
|
|
418
|
+
}
|
|
419
|
+
this.coordinatorServerSockets.clear();
|
|
420
|
+
// Clear introduction connection tracking
|
|
421
|
+
this.introConnections.clear();
|
|
422
|
+
// Clear pending connections
|
|
423
|
+
for (const [, pending] of this.pendingConnections) {
|
|
424
|
+
pending.socket.unref();
|
|
425
|
+
pending.socket.destroy();
|
|
426
|
+
}
|
|
427
|
+
this.pendingConnections.clear();
|
|
428
|
+
// Close data server
|
|
429
|
+
this.dataServer?.unref();
|
|
430
|
+
this.dataServer?.close();
|
|
431
|
+
this.dataServer = undefined;
|
|
432
|
+
// Close coordinator listener servers — stop accepting new connections
|
|
433
|
+
for (const [, listener] of this.coordinatorListeners) {
|
|
434
|
+
listener.server.unref();
|
|
435
|
+
listener.server.close();
|
|
436
|
+
}
|
|
437
|
+
this.coordinatorListeners.clear();
|
|
438
|
+
this.defaultListenerId = undefined;
|
|
439
|
+
this._isCoordinator = false;
|
|
440
|
+
}
|
|
441
|
+
unref() {
|
|
442
|
+
this.dataServer?.unref();
|
|
443
|
+
for (const [, listener] of this.coordinatorListeners) {
|
|
444
|
+
listener.server.unref();
|
|
445
|
+
}
|
|
446
|
+
this.coordinatorSocket?.unref();
|
|
447
|
+
}
|
|
448
|
+
// -----------------------------------------------------------------------
|
|
449
|
+
// Internal — Coordinator client message dispatch
|
|
450
|
+
// -----------------------------------------------------------------------
|
|
451
|
+
/**
|
|
452
|
+
* Handles messages received on the coordinator client socket (the
|
|
453
|
+
* connection from this peer TO the coordinator). Fires the appropriate
|
|
454
|
+
* TransportEvents for peer_list, peer_joined, and become_coordinator.
|
|
455
|
+
*/
|
|
456
|
+
dispatchCoordinatorClientMessage(msg) {
|
|
457
|
+
if (this.shutDown)
|
|
458
|
+
return;
|
|
459
|
+
if (msg.method === "peer_list") {
|
|
460
|
+
this.events.onPeerList(msg.peers);
|
|
461
|
+
}
|
|
462
|
+
else if (msg.method === "peer_joined") {
|
|
463
|
+
this.events.onPeerJoined(msg.peer);
|
|
464
|
+
}
|
|
465
|
+
else if (msg.method === "become_coordinator") {
|
|
466
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// -----------------------------------------------------------------------
|
|
470
|
+
// Internal — Data message dispatch
|
|
471
|
+
// -----------------------------------------------------------------------
|
|
472
|
+
/**
|
|
473
|
+
* Routes a message received on a peer data connection to the
|
|
474
|
+
* appropriate event. become_coordinator has its own event; all
|
|
475
|
+
* other messages fire onMessage for MeshStore to handle.
|
|
476
|
+
*/
|
|
477
|
+
dispatchDataMessage(handle, msg) {
|
|
478
|
+
if (this.shutDown)
|
|
479
|
+
return;
|
|
480
|
+
if (msg.method === "become_coordinator") {
|
|
481
|
+
this.events.onBecomeCoordinator(msg.peerList);
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
this.events.onMessage(handle, msg);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// -----------------------------------------------------------------------
|
|
488
|
+
// Internal — Coordinator server connection handling
|
|
489
|
+
// -----------------------------------------------------------------------
|
|
490
|
+
/**
|
|
491
|
+
* Accepts a new connection on a coordinator server. Reads
|
|
492
|
+
* introduce messages and fires onIntroduction so MeshStore can
|
|
493
|
+
* respond with the peer list and broadcast the arrival.
|
|
494
|
+
* The connection is tagged with the listener's policy.
|
|
495
|
+
*/
|
|
496
|
+
handleCoordinatorServerConnection(socket, policy) {
|
|
497
|
+
if (this.shutDown) {
|
|
498
|
+
socket.destroy();
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
this.coordinatorServerSockets.add(socket);
|
|
502
|
+
socket.on("close", () => this.coordinatorServerSockets.delete(socket));
|
|
503
|
+
socket.on("error", () => this.coordinatorServerSockets.delete(socket));
|
|
504
|
+
const buffer = new MessageBuffer();
|
|
505
|
+
socket.on("data", (data) => {
|
|
506
|
+
const items = buffer.append(data.toString());
|
|
507
|
+
for (const item of items) {
|
|
508
|
+
if (!isMeshMessage(item))
|
|
509
|
+
continue;
|
|
510
|
+
if (item.method === "introduce") {
|
|
511
|
+
const handle = { id: item.peerId, policy };
|
|
512
|
+
this.introConnections.set(handle.id, socket);
|
|
513
|
+
this.events.onIntroduction(handle, {
|
|
514
|
+
peerId: item.peerId,
|
|
515
|
+
dataPort: item.dataPort,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
else if (item.method === "connect_request") {
|
|
519
|
+
const handle = { id: item.peerId, policy };
|
|
520
|
+
this.pendingConnections.set(handle.id, {
|
|
521
|
+
socket,
|
|
522
|
+
peerId: item.peerId,
|
|
523
|
+
dataPort: item.dataPort,
|
|
524
|
+
name: item.name,
|
|
525
|
+
fingerprint: item.fingerprint,
|
|
526
|
+
policy,
|
|
527
|
+
});
|
|
528
|
+
this.events.onConnectionRequest(handle, {
|
|
529
|
+
peerId: item.peerId,
|
|
530
|
+
dataPort: item.dataPort,
|
|
531
|
+
name: item.name,
|
|
532
|
+
fingerprint: item.fingerprint,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
// -----------------------------------------------------------------------
|
|
539
|
+
// Internal — Incoming data connection handling
|
|
540
|
+
// -----------------------------------------------------------------------
|
|
541
|
+
/**
|
|
542
|
+
* Accepts a new connection on the data server. Reads the initial
|
|
543
|
+
* pong to identify the peer, then fires onMessage for subsequent
|
|
544
|
+
* messages. Tracks the connection for cleanup on close/error.
|
|
545
|
+
*/
|
|
546
|
+
handleIncomingDataConnection(socket) {
|
|
547
|
+
if (this.shutDown) {
|
|
548
|
+
socket.destroy();
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
this.dataServerSockets.add(socket);
|
|
552
|
+
socket.on("close", () => this.dataServerSockets.delete(socket));
|
|
553
|
+
const buffer = new MessageBuffer();
|
|
554
|
+
let remotePeerId;
|
|
555
|
+
let disconnected = false;
|
|
556
|
+
socket.on("data", (data) => {
|
|
557
|
+
const items = buffer.append(data.toString());
|
|
558
|
+
for (const item of items) {
|
|
559
|
+
if (isMeshMessage(item)) {
|
|
560
|
+
if (item.method === "pong") {
|
|
561
|
+
const peerId = item.peerId;
|
|
562
|
+
remotePeerId = peerId;
|
|
563
|
+
if (!this.peerConnections.has(peerId)) {
|
|
564
|
+
this.peerConnections.set(peerId, { socket, buffer });
|
|
565
|
+
}
|
|
566
|
+
const handle = { id: peerId };
|
|
567
|
+
const info = {
|
|
568
|
+
id: peerId,
|
|
569
|
+
port: 0,
|
|
570
|
+
startedAt: new Date().toISOString(),
|
|
571
|
+
};
|
|
572
|
+
this.events.onPeerConnected(handle, info);
|
|
573
|
+
}
|
|
574
|
+
else if (remotePeerId !== undefined) {
|
|
575
|
+
const handle = { id: remotePeerId };
|
|
576
|
+
this.dispatchDataMessage(handle, item);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
const onDisconnect = () => {
|
|
582
|
+
if (disconnected)
|
|
583
|
+
return;
|
|
584
|
+
disconnected = true;
|
|
585
|
+
if (remotePeerId !== undefined) {
|
|
586
|
+
this.peerConnections.delete(remotePeerId);
|
|
587
|
+
if (!this.shutDown) {
|
|
588
|
+
this.events.onPeerDisconnected({ id: remotePeerId });
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
socket.on("close", onDisconnect);
|
|
593
|
+
socket.on("error", onDisconnect);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=tcp-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../src/core/tcp-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.unit.test.d.ts","sourceRoot":"","sources":["../../../src/core/test/identity.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|