@yefengr/remote-pi 0.7.4 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +81 -586
  2. package/dist/bin/supervisord.js +4 -5
  3. package/dist/bin/supervisord.js.map +1 -1
  4. package/dist/config.d.ts +1 -1
  5. package/dist/config.js +2 -2
  6. package/dist/daemon/cli-links.d.ts +30 -0
  7. package/dist/daemon/cli-links.js +134 -0
  8. package/dist/daemon/cli-links.js.map +1 -0
  9. package/dist/daemon/commands.d.ts +27 -0
  10. package/dist/daemon/commands.js +295 -0
  11. package/dist/daemon/commands.js.map +1 -0
  12. package/dist/daemon/control_protocol.d.ts +53 -31
  13. package/dist/daemon/control_protocol.js +8 -31
  14. package/dist/daemon/control_protocol.js.map +1 -1
  15. package/dist/daemon/cron_log.d.ts +2 -23
  16. package/dist/daemon/cron_log.js +10 -25
  17. package/dist/daemon/cron_log.js.map +1 -1
  18. package/dist/daemon/cron_registry.d.ts +3 -40
  19. package/dist/daemon/cron_registry.js +58 -103
  20. package/dist/daemon/cron_registry.js.map +1 -1
  21. package/dist/daemon/install-runtime.d.ts +10 -0
  22. package/dist/daemon/install-runtime.js +81 -0
  23. package/dist/daemon/install-runtime.js.map +1 -0
  24. package/dist/daemon/install.d.ts +3 -63
  25. package/dist/daemon/install.js +5 -289
  26. package/dist/daemon/install.js.map +1 -1
  27. package/dist/daemon/preflight.d.ts +51 -0
  28. package/dist/daemon/preflight.js +136 -0
  29. package/dist/daemon/preflight.js.map +1 -0
  30. package/dist/daemon/registry.d.ts +33 -45
  31. package/dist/daemon/registry.js +171 -117
  32. package/dist/daemon/registry.js.map +1 -1
  33. package/dist/daemon/rpc_child.d.ts +92 -146
  34. package/dist/daemon/rpc_child.js +336 -263
  35. package/dist/daemon/rpc_child.js.map +1 -1
  36. package/dist/daemon/status.d.ts +45 -0
  37. package/dist/daemon/status.js +87 -0
  38. package/dist/daemon/status.js.map +1 -0
  39. package/dist/daemon/supervisor-ipc.d.ts +2 -0
  40. package/dist/daemon/supervisor-ipc.js +20 -0
  41. package/dist/daemon/supervisor-ipc.js.map +1 -0
  42. package/dist/daemon/supervisor.d.ts +48 -71
  43. package/dist/daemon/supervisor.js +430 -420
  44. package/dist/daemon/supervisor.js.map +1 -1
  45. package/dist/extension_ui_bridge.d.ts +4 -3
  46. package/dist/extension_ui_bridge.js +10 -0
  47. package/dist/extension_ui_bridge.js.map +1 -1
  48. package/dist/index.d.ts +25 -230
  49. package/dist/index.js +515 -5553
  50. package/dist/index.js.map +1 -1
  51. package/dist/pairing/crypto.d.ts +8 -1
  52. package/dist/pairing/crypto.js +56 -6
  53. package/dist/pairing/crypto.js.map +1 -1
  54. package/dist/pairing/owner_storage.d.ts +42 -0
  55. package/dist/pairing/owner_storage.js +207 -0
  56. package/dist/pairing/owner_storage.js.map +1 -0
  57. package/dist/pairing/qr.d.ts +3 -42
  58. package/dist/pairing/qr.js +9 -59
  59. package/dist/pairing/qr.js.map +1 -1
  60. package/dist/pairing/storage.d.ts +3 -45
  61. package/dist/pairing/storage.js +10 -223
  62. package/dist/pairing/storage.js.map +1 -1
  63. package/dist/protocol/types.d.ts +1 -1
  64. package/dist/protocol/v2/schemas.d.ts +1 -1
  65. package/dist/protocol/v2/schemas.js +1 -1
  66. package/dist/protocol/v2/schemas.js.map +1 -1
  67. package/dist/runtime/owner_router.d.ts +16 -0
  68. package/dist/runtime/owner_router.js +37 -0
  69. package/dist/runtime/owner_router.js.map +1 -0
  70. package/dist/session/ipc.d.ts +1 -22
  71. package/dist/session/ipc.js +4 -11
  72. package/dist/session/ipc.js.map +1 -1
  73. package/dist/session/local_config.d.ts +4 -47
  74. package/dist/session/local_config.js +19 -101
  75. package/dist/session/local_config.js.map +1 -1
  76. package/dist/transport/peer_channel.d.ts +25 -39
  77. package/dist/transport/peer_channel.js +74 -131
  78. package/dist/transport/peer_channel.js.map +1 -1
  79. package/dist/transport/relay_client.d.ts +26 -70
  80. package/dist/transport/relay_client.js +37 -106
  81. package/dist/transport/relay_client.js.map +1 -1
  82. package/docs/daemon.md +91 -207
  83. package/package.json +21 -17
  84. package/dist/daemon/id.d.ts +0 -24
  85. package/dist/daemon/id.js +0 -36
  86. package/dist/daemon/id.js.map +0 -1
  87. package/dist/mcp/mesh_result.d.ts +0 -10
  88. package/dist/mcp/mesh_result.js +0 -42
  89. package/dist/mcp/mesh_result.js.map +0 -1
  90. package/dist/mcp/mesh_server.d.ts +0 -16
  91. package/dist/mcp/mesh_server.js +0 -327
  92. package/dist/mcp/mesh_server.js.map +0 -1
  93. package/dist/mesh/canonical.d.ts +0 -30
  94. package/dist/mesh/canonical.js +0 -61
  95. package/dist/mesh/canonical.js.map +0 -1
  96. package/dist/mesh/client.d.ts +0 -18
  97. package/dist/mesh/client.js +0 -125
  98. package/dist/mesh/client.js.map +0 -1
  99. package/dist/mesh/encoding.d.ts +0 -38
  100. package/dist/mesh/encoding.js +0 -216
  101. package/dist/mesh/encoding.js.map +0 -1
  102. package/dist/mesh/self_revoke.d.ts +0 -73
  103. package/dist/mesh/self_revoke.js +0 -401
  104. package/dist/mesh/self_revoke.js.map +0 -1
  105. package/dist/mesh/siblings.d.ts +0 -49
  106. package/dist/mesh/siblings.js +0 -159
  107. package/dist/mesh/siblings.js.map +0 -1
  108. package/dist/mesh/types.d.ts +0 -34
  109. package/dist/mesh/types.js +0 -11
  110. package/dist/mesh/types.js.map +0 -1
  111. package/dist/mesh/verify.d.ts +0 -17
  112. package/dist/mesh/verify.js +0 -86
  113. package/dist/mesh/verify.js.map +0 -1
  114. package/dist/rooms.d.ts +0 -29
  115. package/dist/rooms.js +0 -57
  116. package/dist/rooms.js.map +0 -1
  117. package/dist/session/bridge.d.ts +0 -37
  118. package/dist/session/bridge.js +0 -130
  119. package/dist/session/bridge.js.map +0 -1
  120. package/dist/session/broker.d.ts +0 -189
  121. package/dist/session/broker.js +0 -507
  122. package/dist/session/broker.js.map +0 -1
  123. package/dist/session/broker_remote.d.ts +0 -74
  124. package/dist/session/broker_remote.js +0 -583
  125. package/dist/session/broker_remote.js.map +0 -1
  126. package/dist/session/cwd_lock.d.ts +0 -33
  127. package/dist/session/cwd_lock.js +0 -126
  128. package/dist/session/cwd_lock.js.map +0 -1
  129. package/dist/session/envelope.d.ts +0 -33
  130. package/dist/session/envelope.js +0 -117
  131. package/dist/session/envelope.js.map +0 -1
  132. package/dist/session/global_config.d.ts +0 -33
  133. package/dist/session/global_config.js +0 -73
  134. package/dist/session/global_config.js.map +0 -1
  135. package/dist/session/leader_election.d.ts +0 -32
  136. package/dist/session/leader_election.js +0 -106
  137. package/dist/session/leader_election.js.map +0 -1
  138. package/dist/session/mesh_node.d.ts +0 -116
  139. package/dist/session/mesh_node.js +0 -573
  140. package/dist/session/mesh_node.js.map +0 -1
  141. package/dist/session/peer.d.ts +0 -139
  142. package/dist/session/peer.js +0 -451
  143. package/dist/session/peer.js.map +0 -1
  144. package/dist/session/peer_inventory.d.ts +0 -13
  145. package/dist/session/peer_inventory.js +0 -48
  146. package/dist/session/peer_inventory.js.map +0 -1
  147. package/dist/session/peer_limits.d.ts +0 -9
  148. package/dist/session/peer_limits.js +0 -21
  149. package/dist/session/peer_limits.js.map +0 -1
  150. package/dist/session/setup_wizard.d.ts +0 -39
  151. package/dist/session/setup_wizard.js +0 -63
  152. package/dist/session/setup_wizard.js.map +0 -1
  153. package/dist/session/tools.d.ts +0 -24
  154. package/dist/session/tools.js +0 -252
  155. package/dist/session/tools.js.map +0 -1
  156. package/dist/session/wizard.d.ts +0 -13
  157. package/dist/session/wizard.js +0 -20
  158. package/dist/session/wizard.js.map +0 -1
  159. package/dist/transport/pi_forward_client.d.ts +0 -29
  160. package/dist/transport/pi_forward_client.js +0 -62
  161. package/dist/transport/pi_forward_client.js.map +0 -1
  162. package/dist/ui/footer.d.ts +0 -32
  163. package/dist/ui/footer.js +0 -34
  164. package/dist/ui/footer.js.map +0 -1
  165. package/skills/agent-network/SKILL.md +0 -310
@@ -1,573 +0,0 @@
1
- import { SessionPeer } from "./peer.js";
2
- import { RelayClient } from "../transport/relay_client.js";
3
- import { attachCrossPcBridge, } from "./bridge.js";
4
- import { getOrCreateEd25519Keypair } from "../pairing/storage.js";
5
- import { canonicalizeEd25519PublicKey, } from "../mesh/encoding.js";
6
- import { roomIdFor } from "../rooms.js";
7
- import { toWebSocketUrl } from "../config.js";
8
- function compareAscii(left, right) {
9
- return left < right ? -1 : left > right ? 1 : 0;
10
- }
11
- function validateAlias(alias, field) {
12
- if (typeof alias !== "string" || alias.length === 0 || alias.includes(":")) {
13
- throw new Error(`mesh: ${field} is not a valid routing alias`);
14
- }
15
- return alias;
16
- }
17
- function validateLegacyPcLabel(label, field) {
18
- if (typeof label !== "string" || label.length === 0) {
19
- throw new Error(`mesh: ${field} is not a valid legacy PC label`);
20
- }
21
- return label;
22
- }
23
- function ownTopology(snapshot) {
24
- const selfPubkey = canonicalizeEd25519PublicKey(snapshot.self?.pcPubkey, "self public key");
25
- const selfLabel = validateAlias(snapshot.self?.pcLabel, "self.pcLabel");
26
- const selfLegacyPcLabel = validateLegacyPcLabel(snapshot.self?.legacyPcLabel, "self.legacyPcLabel");
27
- const self = Object.freeze({
28
- pcLabel: selfLabel,
29
- pcPubkey: selfPubkey,
30
- legacyPcLabel: selfLegacyPcLabel,
31
- });
32
- const siblingKeys = new Set();
33
- const siblingAliases = new Set();
34
- const siblings = [];
35
- for (const [index, sibling] of snapshot.siblings.entries()) {
36
- const pcPubkey = canonicalizeEd25519PublicKey(sibling?.pcPubkey, `siblings[${index}].pcPubkey`);
37
- if (pcPubkey === selfPubkey)
38
- continue;
39
- const pcLabel = validateAlias(sibling?.pcLabel, `siblings[${index}].pcLabel`);
40
- const legacyPcLabel = validateLegacyPcLabel(sibling?.legacyPcLabel, `siblings[${index}].legacyPcLabel`);
41
- if (pcLabel === selfLabel || siblingAliases.has(pcLabel)) {
42
- throw new Error("mesh: duplicate sibling routing alias");
43
- }
44
- if (siblingKeys.has(pcPubkey)) {
45
- throw new Error("mesh: duplicate sibling public key");
46
- }
47
- siblingAliases.add(pcLabel);
48
- siblingKeys.add(pcPubkey);
49
- siblings.push(Object.freeze({ pcLabel, pcPubkey, legacyPcLabel }));
50
- }
51
- siblings.sort((left, right) => compareAscii(left.pcPubkey, right.pcPubkey));
52
- return Object.freeze({ self, siblings: Object.freeze(siblings) });
53
- }
54
- function topologyEquals(left, right) {
55
- if (!left)
56
- return false;
57
- if (left.self.pcPubkey !== right.self.pcPubkey ||
58
- left.self.pcLabel !== right.self.pcLabel ||
59
- left.self.legacyPcLabel !== right.self.legacyPcLabel ||
60
- left.siblings.length !== right.siblings.length) {
61
- return false;
62
- }
63
- return left.siblings.every((identity, index) => {
64
- const other = right.siblings[index];
65
- return other !== undefined &&
66
- identity.pcPubkey === other.pcPubkey &&
67
- identity.pcLabel === other.pcLabel &&
68
- identity.legacyPcLabel === other.legacyPcLabel;
69
- });
70
- }
71
- function keypairEquals(left, right) {
72
- if (left === right)
73
- return true;
74
- if (!left || !right)
75
- return false;
76
- return Buffer.from(left.publicKey).equals(Buffer.from(right.publicKey)) &&
77
- Buffer.from(left.secretKey).equals(Buffer.from(right.secretKey));
78
- }
79
- function bridgeParamsEqual(left, right) {
80
- return left !== null &&
81
- left.relayUrl === right.relayUrl &&
82
- left.cwd === right.cwd &&
83
- left.sessionName === right.sessionName &&
84
- left.meshRequestTimeoutMs === right.meshRequestTimeoutMs &&
85
- left.injectedRelay === right.injectedRelay &&
86
- keypairEquals(left.keypair, right.keypair);
87
- }
88
- export class MeshNode {
89
- peer_;
90
- log;
91
- latestTopology = null;
92
- topologyRevision = 0;
93
- bridgeGeneration = 0;
94
- bridgeAttachInFlight = null;
95
- bridgeAttachQueued = false;
96
- closed = false;
97
- closeInFlight = null;
98
- activeBridge = null;
99
- relay = null;
100
- relayOwned = false;
101
- relayCloseHandler = null;
102
- brokerRemote = null;
103
- piForward = null;
104
- keypair = null;
105
- bridgeParams = null;
106
- reconnectWired = false;
107
- closedOwnedRelays = new WeakSet();
108
- /** Self-managed relay reconnect state. Injected Relay reconnect is host-owned. */
109
- relayReconnectTimer = null;
110
- relayBackoffIdx = 0;
111
- static RELAY_RECONNECT_BACKOFFS_MS = [1_000, 2_000, 5_000, 10_000, 30_000];
112
- constructor(opts) {
113
- this.log = opts.log ?? (() => { });
114
- const peerOpts = { sockPath: opts.sockPath, name: opts.name };
115
- if (opts.cwd !== undefined)
116
- peerOpts.cwd = opts.cwd;
117
- if (opts.takeoverExisting !== undefined)
118
- peerOpts.takeoverExisting = opts.takeoverExisting;
119
- if (opts.auditPath !== undefined)
120
- peerOpts.auditPath = opts.auditPath;
121
- this.peer_ = new SessionPeer(peerOpts);
122
- if (opts.bridge) {
123
- this.bridgeParams = {
124
- relayUrl: opts.bridge.relayUrl,
125
- cwd: opts.bridge.cwd,
126
- ...(opts.bridge.sessionName !== undefined
127
- ? { sessionName: opts.bridge.sessionName }
128
- : {}),
129
- ...(opts.bridge.meshRequestTimeoutMs !== undefined
130
- ? { meshRequestTimeoutMs: opts.bridge.meshRequestTimeoutMs }
131
- : {}),
132
- };
133
- }
134
- }
135
- /** Join (or lead) the mesh. Resolves with the assigned name. */
136
- async connect() {
137
- this._assertOpen();
138
- const name = await this.peer_.start();
139
- this._assertOpen();
140
- this._wireReconnect();
141
- if (this.bridgeParams) {
142
- await this._requestBridge();
143
- while (this.bridgeAttachQueued)
144
- await this._requestBridge();
145
- const currentParams = this.bridgeParams;
146
- if (!this.relay &&
147
- currentParams !== null &&
148
- !currentParams.injectedRelay &&
149
- this.peer_.currentRole() === "leader") {
150
- this._scheduleRelayReconnect();
151
- }
152
- }
153
- return name;
154
- }
155
- /** Attach an externally-owned Relay. MeshNode never closes this Relay. */
156
- async attachBridge(opts) {
157
- this._assertOpen();
158
- const next = {
159
- relayUrl: opts.relayUrl,
160
- injectedRelay: opts.relay,
161
- ...(opts.keypair !== undefined ? { keypair: opts.keypair } : {}),
162
- ...(opts.meshRequestTimeoutMs !== undefined
163
- ? { meshRequestTimeoutMs: opts.meshRequestTimeoutMs }
164
- : {}),
165
- };
166
- if (!bridgeParamsEqual(this.bridgeParams, next)) {
167
- this.bridgeGeneration += 1;
168
- this._clearRelayReconnectTimer();
169
- this._teardownPublishedBridge(true);
170
- this.bridgeParams = next;
171
- }
172
- this._wireReconnect();
173
- this.bridgeAttachQueued = true;
174
- await this._requestBridge();
175
- while (this.bridgeAttachQueued)
176
- await this._requestBridge();
177
- }
178
- /** Retain a canonical immutable topology independently from bridge state. */
179
- setTopology(snapshot) {
180
- const owned = ownTopology(snapshot);
181
- if (this.latestTopology &&
182
- this.latestTopology.self.pcPubkey !== owned.self.pcPubkey) {
183
- throw new Error("mesh: technical self key cannot change");
184
- }
185
- if (!topologyEquals(this.latestTopology, owned)) {
186
- this.topologyRevision += 1;
187
- }
188
- this.latestTopology = owned;
189
- // Identical calls still reach an active router so dirty refreshes retry.
190
- this.brokerRemote?.setTopology(owned);
191
- }
192
- hasTopology() {
193
- return this.latestTopology !== null;
194
- }
195
- /** Forget bridge parameters and tear down publication, retaining topology. */
196
- detachBridge() {
197
- this.bridgeGeneration += 1;
198
- this.bridgeAttachQueued = false;
199
- this.bridgeParams = null;
200
- this._clearRelayReconnectTimer();
201
- this._teardownPublishedBridge(true);
202
- }
203
- _assertOpen() {
204
- if (this.closed)
205
- throw new Error("mesh: node is closed");
206
- }
207
- _wireReconnect() {
208
- if (this.reconnectWired)
209
- return;
210
- this.reconnectWired = true;
211
- this.peer_.onReconnect(() => { void this._onReconnect(); });
212
- }
213
- async _onReconnect() {
214
- if (this.closed || !this.bridgeParams)
215
- return;
216
- this.bridgeGeneration += 1;
217
- this._clearRelayReconnectTimer();
218
- this._teardownPublishedBridge(true);
219
- this.bridgeAttachQueued = true;
220
- try {
221
- await this._requestBridge();
222
- }
223
- catch (error) {
224
- this.log(`mesh bridge: re-attach after failover failed: ${String(error)}`);
225
- }
226
- finally {
227
- const currentParams = this.bridgeParams;
228
- if (currentParams !== null &&
229
- !currentParams.injectedRelay &&
230
- this.peer_.currentRole() === "leader" &&
231
- !this.relay) {
232
- this._scheduleRelayReconnect();
233
- }
234
- }
235
- }
236
- /** One serialized attach loop. Newer generations are drained before exit. */
237
- _requestBridge() {
238
- if (this.closed)
239
- return Promise.reject(new Error("mesh: node is closed"));
240
- this.bridgeAttachQueued = true;
241
- if (this.bridgeAttachInFlight)
242
- return this.bridgeAttachInFlight;
243
- const run = async () => {
244
- while (this.bridgeAttachQueued) {
245
- this.bridgeAttachQueued = false;
246
- const generation = this.bridgeGeneration;
247
- try {
248
- await this._attemptBridge(generation);
249
- }
250
- catch (error) {
251
- if (generation !== this.bridgeGeneration) {
252
- this.bridgeAttachQueued = true;
253
- continue;
254
- }
255
- throw error;
256
- }
257
- if (generation !== this.bridgeGeneration) {
258
- this.bridgeAttachQueued = true;
259
- }
260
- }
261
- };
262
- const inFlight = run().finally(() => {
263
- if (this.bridgeAttachInFlight === inFlight) {
264
- this.bridgeAttachInFlight = null;
265
- }
266
- });
267
- this.bridgeAttachInFlight = inFlight;
268
- return inFlight;
269
- }
270
- async _attemptBridge(generation) {
271
- if (this.closed || this.activeBridge)
272
- return;
273
- if (this.peer_.currentRole() !== "leader")
274
- return;
275
- const broker = this.peer_.localBroker();
276
- if (!broker)
277
- return;
278
- const paramsAtStart = this.bridgeParams;
279
- if (!paramsAtStart)
280
- return;
281
- const revisionAtStart = this.topologyRevision;
282
- const keypair = paramsAtStart.keypair ?? this.keypair ??
283
- await getOrCreateEd25519Keypair();
284
- if (generation !== this.bridgeGeneration || paramsAtStart !== this.bridgeParams) {
285
- return;
286
- }
287
- const candidateRelayOwned = paramsAtStart.injectedRelay === undefined;
288
- let candidateRelay;
289
- if (paramsAtStart.injectedRelay) {
290
- candidateRelay = paramsAtStart.injectedRelay;
291
- }
292
- else {
293
- const roomName = paramsAtStart.sessionName ?? this.peer_.name();
294
- candidateRelay = new RelayClient(toWebSocketUrl(paramsAtStart.relayUrl), keypair);
295
- const roomId = roomIdFor(paramsAtStart.cwd, roomName);
296
- try {
297
- await candidateRelay.connect({
298
- roomId,
299
- roomMeta: { name: roomName, cwd: paramsAtStart.cwd },
300
- });
301
- }
302
- catch (error) {
303
- this._closeOwnedRelay(candidateRelay);
304
- this.log(`mesh bridge: relay connect failed: ${String(error)}`);
305
- return;
306
- }
307
- }
308
- if (this._relayIsClosed(candidateRelay)) {
309
- if (candidateRelayOwned)
310
- this._closeOwnedRelay(candidateRelay);
311
- return;
312
- }
313
- let candidateClosed = false;
314
- const markCandidateClosed = () => { candidateClosed = true; };
315
- let markerInstalled = false;
316
- let result = null;
317
- let publishedCloseHandler = null;
318
- let publishedCloseInstalled = false;
319
- try {
320
- candidateRelay.on("close", markCandidateClosed);
321
- markerInstalled = true;
322
- result = await attachCrossPcBridge({
323
- broker,
324
- relay: candidateRelay,
325
- relayUrl: paramsAtStart.relayUrl,
326
- keypair,
327
- ...(this.latestTopology ? { topology: this.latestTopology } : {}),
328
- ...(paramsAtStart.meshRequestTimeoutMs !== undefined
329
- ? { meshRequestTimeoutMs: paramsAtStart.meshRequestTimeoutMs }
330
- : {}),
331
- log: this.log,
332
- });
333
- if (this._attemptIsStale(generation, paramsAtStart, broker, candidateRelay, candidateClosed)) {
334
- result.detach();
335
- this._removeMarker(candidateRelay, markCandidateClosed, markerInstalled);
336
- markerInstalled = false;
337
- if (candidateRelayOwned)
338
- this._closeOwnedRelay(candidateRelay);
339
- return;
340
- }
341
- if (this.latestTopology) {
342
- if (this.topologyRevision !== revisionAtStart) {
343
- result.brokerRemote.setTopology(this.latestTopology);
344
- }
345
- }
346
- else {
347
- this.setTopology(result.topology);
348
- }
349
- result.activate();
350
- if (candidateRelayOwned) {
351
- publishedCloseHandler = () => this._onSelfRelayClosed(candidateRelay);
352
- candidateRelay.on("close", publishedCloseHandler);
353
- publishedCloseInstalled = true;
354
- }
355
- if (this._attemptIsStale(generation, paramsAtStart, broker, candidateRelay, candidateClosed)) {
356
- if (publishedCloseInstalled && publishedCloseHandler) {
357
- candidateRelay.off("close", publishedCloseHandler);
358
- publishedCloseInstalled = false;
359
- }
360
- result.detach();
361
- this._removeMarker(candidateRelay, markCandidateClosed, markerInstalled);
362
- markerInstalled = false;
363
- if (candidateRelayOwned)
364
- this._closeOwnedRelay(candidateRelay);
365
- return;
366
- }
367
- this._removeMarker(candidateRelay, markCandidateClosed, markerInstalled);
368
- markerInstalled = false;
369
- // Publish only after activation and owned-close handler installation.
370
- this.activeBridge = result;
371
- this.brokerRemote = result.brokerRemote;
372
- this.piForward = result.piForward;
373
- this.relay = candidateRelay;
374
- this.relayOwned = candidateRelayOwned;
375
- this.relayCloseHandler = publishedCloseHandler;
376
- this.keypair = keypair;
377
- if (candidateRelayOwned) {
378
- this._clearRelayReconnectTimer();
379
- this.relayBackoffIdx = 0;
380
- }
381
- }
382
- catch (error) {
383
- if (publishedCloseInstalled && publishedCloseHandler) {
384
- try {
385
- candidateRelay.off("close", publishedCloseHandler);
386
- }
387
- catch { /* best-effort */ }
388
- }
389
- if (markerInstalled) {
390
- try {
391
- candidateRelay.off("close", markCandidateClosed);
392
- }
393
- catch { /* best-effort */ }
394
- }
395
- try {
396
- result?.detach();
397
- }
398
- catch { /* preserve original error */ }
399
- if (candidateRelayOwned)
400
- this._closeOwnedRelay(candidateRelay);
401
- throw error;
402
- }
403
- }
404
- _attemptIsStale(generation, paramsAtStart, broker, candidateRelay, candidateClosed) {
405
- return this.closed ||
406
- generation !== this.bridgeGeneration ||
407
- paramsAtStart !== this.bridgeParams ||
408
- this.peer_.currentRole() !== "leader" ||
409
- this.peer_.localBroker() !== broker ||
410
- candidateClosed ||
411
- this._relayIsClosed(candidateRelay);
412
- }
413
- _relayIsClosed(relay) {
414
- return !relay.isOpen();
415
- }
416
- _removeMarker(relay, marker, installed) {
417
- if (installed)
418
- relay.off("close", marker);
419
- }
420
- _closeOwnedRelay(relay) {
421
- if (this.closedOwnedRelays.has(relay))
422
- return;
423
- this.closedOwnedRelays.add(relay);
424
- try {
425
- relay.close();
426
- }
427
- catch { /* best-effort candidate cleanup */ }
428
- }
429
- _teardownPublishedBridge(closeOwnedRelay) {
430
- const bridge = this.activeBridge;
431
- const relay = this.relay;
432
- const relayOwned = this.relayOwned;
433
- const closeHandler = this.relayCloseHandler;
434
- // Clear ownership before any detach/close callback can observe stale state.
435
- this.activeBridge = null;
436
- this.brokerRemote = null;
437
- this.piForward = null;
438
- this.relay = null;
439
- this.relayOwned = false;
440
- this.relayCloseHandler = null;
441
- if (relay && closeHandler) {
442
- try {
443
- relay.off("close", closeHandler);
444
- }
445
- catch { /* best-effort */ }
446
- }
447
- try {
448
- bridge?.detach();
449
- }
450
- catch { /* best-effort teardown */ }
451
- if (closeOwnedRelay && relayOwned && relay)
452
- this._closeOwnedRelay(relay);
453
- }
454
- _onSelfRelayClosed(closed) {
455
- if (closed !== this.relay || !this.relayOwned)
456
- return;
457
- this.log("mesh bridge: relay closed — scheduling reconnect");
458
- this.bridgeGeneration += 1;
459
- this._teardownPublishedBridge(false);
460
- this._scheduleRelayReconnect();
461
- }
462
- _clearRelayReconnectTimer() {
463
- if (!this.relayReconnectTimer)
464
- return;
465
- clearTimeout(this.relayReconnectTimer);
466
- this.relayReconnectTimer = null;
467
- }
468
- _scheduleRelayReconnect() {
469
- if (this.closed || this.relayReconnectTimer)
470
- return;
471
- if (!this.bridgeParams || this.bridgeParams.injectedRelay)
472
- return;
473
- const backoffs = MeshNode.RELAY_RECONNECT_BACKOFFS_MS;
474
- const delay = backoffs[Math.min(this.relayBackoffIdx, backoffs.length - 1)];
475
- const timer = setTimeout(() => {
476
- this.relayReconnectTimer = null;
477
- void this._attemptRelayReconnect();
478
- }, delay);
479
- timer.unref?.();
480
- this.relayReconnectTimer = timer;
481
- }
482
- async _attemptRelayReconnect() {
483
- try {
484
- if (this.closed || !this.bridgeParams || this.bridgeParams.injectedRelay)
485
- return;
486
- if (this.peer_.currentRole() !== "leader" || this.activeBridge)
487
- return;
488
- this.bridgeAttachQueued = true;
489
- await this._requestBridge();
490
- if (this.relay) {
491
- this.log("mesh bridge: relay reconnected");
492
- }
493
- else {
494
- this.relayBackoffIdx += 1;
495
- this._scheduleRelayReconnect();
496
- }
497
- }
498
- catch (error) {
499
- this.log(`mesh bridge: relay reconnect failed: ${String(error)}`);
500
- this.relayBackoffIdx += 1;
501
- this._scheduleRelayReconnect();
502
- }
503
- }
504
- /** Announce the local peer set to siblings (Pi broker peer_joined/left). */
505
- onLocalPeersChanged(local) {
506
- this.brokerRemote?.onLocalPeersChanged(local);
507
- }
508
- /** True when the cross-PC relay bridge is active (this node is leader). */
509
- hasBridge() {
510
- return this.activeBridge !== null;
511
- }
512
- // ── Mesh API (delegates to SessionPeer) ─────────────────────────────────────
513
- /** The underlying SessionPeer — for consumers that need it directly (tools). */
514
- peer() {
515
- return this.peer_;
516
- }
517
- /** Fire-and-forget send. `to` may be a name, `<pc>:<name>`, or "broadcast". */
518
- async send(to, body, re = null) {
519
- return this.peer_.send(to, body, re);
520
- }
521
- /** Unicast send + await broker ACK (received/busy/denied/timeout). */
522
- async sendWithAck(to, body, re = null, timeoutMs) {
523
- return timeoutMs === undefined
524
- ? this.peer_.sendWithAck(to, body, re)
525
- : this.peer_.sendWithAck(to, body, re, timeoutMs);
526
- }
527
- /** Send + await the first reply whose `re` matches the outbound id. */
528
- async request(to, body, timeoutMs) {
529
- return timeoutMs === undefined
530
- ? this.peer_.request(to, body)
531
- : this.peer_.request(to, body, timeoutMs);
532
- }
533
- /** Subscribe to inbound envelopes. Returns an unsubscribe fn. */
534
- onMessage(handler) {
535
- return this.peer_.onMessage(handler);
536
- }
537
- /** Subscribe to post-failover reconnects. Returns an unsubscribe fn. */
538
- onReconnect(handler) {
539
- return this.peer_.onReconnect(handler);
540
- }
541
- /** Assigned clean mesh name (after any #N collision suffix). */
542
- name() {
543
- return this.peer_.name();
544
- }
545
- /** Canonical mesh address (`[<pc>:]<cwd>@<nome>`) — echo, never compose. */
546
- address() {
547
- return this.peer_.address();
548
- }
549
- async rename(newName) {
550
- return this.peer_.rename(newName);
551
- }
552
- currentRole() {
553
- return this.peer_.currentRole();
554
- }
555
- localBroker() {
556
- return this.peer_.localBroker();
557
- }
558
- async listPeers(timeoutMs = 2_000) {
559
- const reply = await this.peer_.request("broker", { type: "list_peers" }, timeoutMs);
560
- const body = reply.body;
561
- return (body?.peers ?? []).filter((peer) => peer !== this.peer_.address());
562
- }
563
- close() {
564
- if (this.closeInFlight)
565
- return this.closeInFlight;
566
- this.closed = true;
567
- this.detachBridge();
568
- const leaving = Promise.resolve(this.peer_.leave());
569
- this.closeInFlight = leaving;
570
- return leaving;
571
- }
572
- }
573
- //# sourceMappingURL=mesh_node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mesh_node.js","sourceRoot":"","sources":["../../src/session/mesh_node.ts"],"names":[],"mappings":"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"}