agent-comms 3.4.2 → 3.6.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.
Files changed (76) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/core/bridge-mesh.d.ts +2 -2
  5. package/dist/core/bridge-mesh.d.ts.map +1 -1
  6. package/dist/core/bridge-mesh.js +4 -4
  7. package/dist/core/bridge-mesh.js.map +1 -1
  8. package/dist/core/coordinator-gateway.d.ts +25 -0
  9. package/dist/core/coordinator-gateway.d.ts.map +1 -0
  10. package/dist/core/coordinator-gateway.js +34 -0
  11. package/dist/core/coordinator-gateway.js.map +1 -0
  12. package/dist/core/gossip-directory.d.ts +8 -0
  13. package/dist/core/gossip-directory.d.ts.map +1 -0
  14. package/dist/core/gossip-directory.js +16 -0
  15. package/dist/core/gossip-directory.js.map +1 -0
  16. package/dist/core/hub-session.d.ts +5 -1
  17. package/dist/core/hub-session.d.ts.map +1 -1
  18. package/dist/core/hub-session.js +18 -2
  19. package/dist/core/hub-session.js.map +1 -1
  20. package/dist/core/mesh-store-shared.d.ts +2 -0
  21. package/dist/core/mesh-store-shared.d.ts.map +1 -1
  22. package/dist/core/mesh-store-shared.js +2 -0
  23. package/dist/core/mesh-store-shared.js.map +1 -1
  24. package/dist/core/mesh-store.d.ts +3 -1
  25. package/dist/core/mesh-store.d.ts.map +1 -1
  26. package/dist/core/mesh-store.js +21 -2
  27. package/dist/core/mesh-store.js.map +1 -1
  28. package/dist/core/peer-lifecycle.d.ts +4 -1
  29. package/dist/core/peer-lifecycle.d.ts.map +1 -1
  30. package/dist/core/peer-lifecycle.js +1 -0
  31. package/dist/core/peer-lifecycle.js.map +1 -1
  32. package/dist/core/transport.d.ts +8 -0
  33. package/dist/core/transport.d.ts.map +1 -1
  34. package/dist/core/user-identity.d.ts +17 -0
  35. package/dist/core/user-identity.d.ts.map +1 -0
  36. package/dist/core/user-identity.js +125 -0
  37. package/dist/core/user-identity.js.map +1 -0
  38. package/dist/core/wire-mesh-transport.d.ts +2 -2
  39. package/dist/core/wire-mesh-transport.d.ts.map +1 -1
  40. package/dist/core/wire-mesh-transport.js +11 -12
  41. package/dist/core/wire-mesh-transport.js.map +1 -1
  42. package/dist/test/bridge-mesh.test.js +18 -0
  43. package/dist/test/bridge-mesh.test.js.map +1 -1
  44. package/dist/test/coordinator-gateway.test.d.ts +2 -0
  45. package/dist/test/coordinator-gateway.test.d.ts.map +1 -0
  46. package/dist/test/coordinator-gateway.test.js +88 -0
  47. package/dist/test/coordinator-gateway.test.js.map +1 -0
  48. package/dist/test/gossip-directory.test.d.ts +2 -0
  49. package/dist/test/gossip-directory.test.d.ts.map +1 -0
  50. package/dist/test/gossip-directory.test.js +67 -0
  51. package/dist/test/gossip-directory.test.js.map +1 -0
  52. package/dist/test/hub-helpers.d.ts +8 -0
  53. package/dist/test/hub-helpers.d.ts.map +1 -1
  54. package/dist/test/hub-helpers.js +132 -2
  55. package/dist/test/hub-helpers.js.map +1 -1
  56. package/dist/test/hub-mode-session.integration.test.js +47 -124
  57. package/dist/test/hub-mode-session.integration.test.js.map +1 -1
  58. package/dist/test/mesh-smoke.runner.js +3 -1
  59. package/dist/test/mesh-smoke.runner.js.map +1 -1
  60. package/dist/test/mesh-store-orchestration.test.js +57 -0
  61. package/dist/test/mesh-store-orchestration.test.js.map +1 -1
  62. package/dist/test/peer-lifecycle.test.js +8 -0
  63. package/dist/test/peer-lifecycle.test.js.map +1 -1
  64. package/dist/test/user-identity.test.d.ts +5 -0
  65. package/dist/test/user-identity.test.d.ts.map +1 -0
  66. package/dist/test/user-identity.test.js +91 -0
  67. package/dist/test/user-identity.test.js.map +1 -0
  68. package/dist/test/user-principal-mints-device-grant.test.d.ts +7 -0
  69. package/dist/test/user-principal-mints-device-grant.test.d.ts.map +1 -0
  70. package/dist/test/user-principal-mints-device-grant.test.js +64 -0
  71. package/dist/test/user-principal-mints-device-grant.test.js.map +1 -0
  72. package/dist/test/wire-mesh-transport-hub.test.d.ts +5 -0
  73. package/dist/test/wire-mesh-transport-hub.test.d.ts.map +1 -0
  74. package/dist/test/wire-mesh-transport-hub.test.js +50 -0
  75. package/dist/test/wire-mesh-transport-hub.test.js.map +1 -0
  76. package/package.json +1 -1
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Direct unit tests for mergeKnownDevices, extracted from WireMeshTransport (see gossip-directory.ts's own header) -- previously only exercised indirectly through gossip-directory-aggregation.integration.test.ts's real-session harness.
3
+ */
4
+ import { describe, expect, it } from "vitest";
5
+ import { mergeKnownDevices } from "../core/gossip-directory.js";
6
+ const DEVICE_ID_HEX_LENGTH = 64;
7
+ const DEVICE_A_HEX = "a".repeat(DEVICE_ID_HEX_LENGTH);
8
+ const DEVICE_B_HEX = "b".repeat(DEVICE_ID_HEX_LENGTH);
9
+ /** An arbitrary "later" snapshot-seconds value, distinct from every other one used in this file's fixtures. */
10
+ const NEWER_SNAPSHOT_SECONDS = 5;
11
+ function deviceIdBytes(hex) {
12
+ const bytes = new Uint8Array(new ArrayBuffer(hex.length / 2));
13
+ for (let i = 0; i < bytes.length; i += 1) {
14
+ bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
15
+ }
16
+ return bytes;
17
+ }
18
+ function advert(snapshotSeconds) {
19
+ return {
20
+ addresses: [],
21
+ "snapshot-seconds": snapshotSeconds,
22
+ };
23
+ }
24
+ function entry(hex, snapshotSeconds) {
25
+ return { device: deviceIdBytes(hex), advert: advert(snapshotSeconds) };
26
+ }
27
+ describe("mergeKnownDevices", () => {
28
+ it("records a device this map has never seen before", () => {
29
+ const knownDevices = new Map();
30
+ mergeKnownDevices(knownDevices, [entry(DEVICE_A_HEX, 1)]);
31
+ expect(knownDevices.get(DEVICE_A_HEX)?.["snapshot-seconds"]).toBe(1);
32
+ });
33
+ it("replaces an existing entry with a strictly newer advert", () => {
34
+ const knownDevices = new Map([
35
+ [DEVICE_A_HEX, advert(1)],
36
+ ]);
37
+ mergeKnownDevices(knownDevices, [entry(DEVICE_A_HEX, 2)]);
38
+ expect(knownDevices.get(DEVICE_A_HEX)?.["snapshot-seconds"]).toBe(2);
39
+ });
40
+ it("keeps an equal-snapshot advert as the incoming one (>=, not >)", () => {
41
+ const knownDevices = new Map([
42
+ [DEVICE_A_HEX, advert(1)],
43
+ ]);
44
+ const incoming = advert(1);
45
+ mergeKnownDevices(knownDevices, [
46
+ { device: deviceIdBytes(DEVICE_A_HEX), advert: incoming },
47
+ ]);
48
+ expect(knownDevices.get(DEVICE_A_HEX)).toBe(incoming);
49
+ });
50
+ it("never regresses an existing entry to an older advert", () => {
51
+ const knownDevices = new Map([
52
+ [DEVICE_A_HEX, advert(NEWER_SNAPSHOT_SECONDS)],
53
+ ]);
54
+ mergeKnownDevices(knownDevices, [entry(DEVICE_A_HEX, 1)]);
55
+ expect(knownDevices.get(DEVICE_A_HEX)?.["snapshot-seconds"]).toBe(NEWER_SNAPSHOT_SECONDS);
56
+ });
57
+ it("merges multiple distinct devices from the same directory independently", () => {
58
+ const knownDevices = new Map();
59
+ mergeKnownDevices(knownDevices, [
60
+ entry(DEVICE_A_HEX, 1),
61
+ entry(DEVICE_B_HEX, 2),
62
+ ]);
63
+ expect(knownDevices.get(DEVICE_A_HEX)?.["snapshot-seconds"]).toBe(1);
64
+ expect(knownDevices.get(DEVICE_B_HEX)?.["snapshot-seconds"]).toBe(2);
65
+ });
66
+ });
67
+ //# sourceMappingURL=gossip-directory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gossip-directory.test.js","sourceRoot":"","sources":["../../src/test/gossip-directory.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
1
  import type { Frame } from "wire-mesh-core/generated/protocol";
2
2
  export declare function cbor2ToBytes(frame: Frame): Uint8Array;
3
+ /** A real relay hub served over ws: each accepted socket is wrapped as a Connection for createRelayHub, exactly what the production Durable Object does (pre-hibernation shape). Also exposes the hub's own live-connection count, since a test asserting a client-side disconnect actually reached the far end needs an observable on the hub itself, not just the client. */
4
+ export declare function realHubOverWs(): Promise<{
5
+ url: string;
6
+ connectionCount: () => number;
7
+ close: () => Promise<void>;
8
+ }>;
9
+ /** Polls `condition` until it's true or `timeoutMs` elapses, rejecting on timeout -- the shared shape every hub integration test uses to wait out real async gossip/discovery/close propagation rather than asserting immediately after firing an action. */
10
+ export declare function waitForCondition(condition: () => boolean, timeoutMs?: number): Promise<void>;
3
11
  //# sourceMappingURL=hub-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hub-helpers.d.ts","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAErD"}
1
+ {"version":3,"file":"hub-helpers.d.ts","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAO/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAErD;AA2ED,+WAA+W;AAC/W,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAgCD;AAED,6PAA6P;AAC7P,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,OAAO,EACxB,SAAS,SAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,6 +1,136 @@
1
- // Shared helpers for the hub-mode integration test: canonical-CBOR bytes for frames crossing the test's own ws bridge.
2
- import { cdeEncodeOptions, encode } from "cbor2";
1
+ // Shared helpers for hub-mode integration tests: a real wire-mesh relay hub (createRelayHub -- the same domain logic the production mesh.exadev.io Durable Object runs) served over local WebSockets, canonical-CBOR framing for the ws bridge, and a condition-polling helper for the async discovery/gossip timing these tests exercise.
2
+ import { createServer } from "node:http";
3
+ import { WebSocketServer } from "ws";
4
+ import { cdeDecodeOptions, cdeEncodeOptions, decode, encode } from "cbor2";
5
+ import { frameSchema } from "wire-mesh-core/generated/protocol";
6
+ import { createRelayHub } from "wire-mesh-core/domain/relay-hub";
7
+ const SHUTDOWN_GRACE_MS = 250;
8
+ const CLOSE_NORMAL = 1000; // RFC 6455 normal closure
9
+ const POLL_INTERVAL_MS = 25;
10
+ const DEFAULT_CONDITION_TIMEOUT_MS = 5_000;
3
11
  export function cbor2ToBytes(frame) {
4
12
  return new Uint8Array(encode(frame, cdeEncodeOptions));
5
13
  }
14
+ /** ws's own RawData type is `Buffer | ArrayBuffer | Buffer[]`, but every caller here sets `socket.binaryType = "arraybuffer"` before this ever fires, so a real message is always an ArrayBuffer at runtime -- narrowed with a guard rather than asserted, since ws's declared type is genuinely broader than what this specific binaryType configuration guarantees. */
15
+ function isArrayBuffer(data) {
16
+ return data instanceof ArrayBuffer;
17
+ }
18
+ function wsReceiveStream(socket) {
19
+ const pending = [];
20
+ const waiters = [];
21
+ let ended = false;
22
+ socket.on("message", (data) => {
23
+ if (!isArrayBuffer(data))
24
+ return;
25
+ try {
26
+ const decoded = decode(new Uint8Array(data), cdeDecodeOptions);
27
+ const parsed = frameSchema.safeParse(decoded);
28
+ if (!parsed.success)
29
+ return;
30
+ const waiter = waiters.shift();
31
+ if (waiter !== undefined) {
32
+ waiter.resolve({ value: parsed.data, done: false });
33
+ }
34
+ else {
35
+ pending.push(parsed.data);
36
+ }
37
+ }
38
+ catch {
39
+ // Undecodable: drop, keeping the stream alive for the well-formed frames behind it (the hub's own tolerance).
40
+ }
41
+ });
42
+ socket.on("close", () => {
43
+ ended = true;
44
+ for (const waiter of waiters.splice(0)) {
45
+ waiter.resolve({ value: undefined, done: true });
46
+ }
47
+ });
48
+ socket.on("error", () => {
49
+ ended = true;
50
+ for (const waiter of waiters.splice(0)) {
51
+ waiter.resolve({ value: undefined, done: true });
52
+ }
53
+ });
54
+ return {
55
+ [Symbol.asyncIterator]() {
56
+ return {
57
+ async next() {
58
+ const next = pending.shift();
59
+ if (next !== undefined) {
60
+ return { value: next, done: false };
61
+ }
62
+ if (ended) {
63
+ return { value: undefined, done: true };
64
+ }
65
+ return new Promise((resolve, reject) => {
66
+ waiters.push({ resolve, reject });
67
+ });
68
+ },
69
+ };
70
+ },
71
+ };
72
+ }
73
+ function wsConnection(socket) {
74
+ return {
75
+ // async with no internal await, matching ws-dial.ts's own identical send() shape: promise-function-async requires the interface's Promise<void> return stay async, which is exactly what makes it have nothing to await.
76
+ send: async (frame) => {
77
+ socket.send(cbor2ToBytes(frame));
78
+ },
79
+ receive: () => wsReceiveStream(socket),
80
+ close: async () => {
81
+ socket.close(CLOSE_NORMAL);
82
+ },
83
+ };
84
+ }
85
+ /** A real relay hub served over ws: each accepted socket is wrapped as a Connection for createRelayHub, exactly what the production Durable Object does (pre-hibernation shape). Also exposes the hub's own live-connection count, since a test asserting a client-side disconnect actually reached the far end needs an observable on the hub itself, not just the client. */
86
+ export async function realHubOverWs() {
87
+ const http = createServer();
88
+ const wss = new WebSocketServer({ server: http });
89
+ const hub = createRelayHub();
90
+ wss.on("connection", (socket) => {
91
+ socket.binaryType = "arraybuffer";
92
+ void hub.handleConnection(wsConnection(socket));
93
+ });
94
+ await new Promise((resolve) => {
95
+ http.listen(0, "127.0.0.1", () => {
96
+ resolve();
97
+ });
98
+ });
99
+ const address = http.address();
100
+ if (address === null || typeof address === "string") {
101
+ throw new Error("expected a TCP listen address");
102
+ }
103
+ return {
104
+ url: `ws://127.0.0.1:${String(address.port)}/`,
105
+ connectionCount: () => wss.clients.size,
106
+ close: async () => new Promise((resolve) => {
107
+ for (const client of wss.clients) {
108
+ client.terminate();
109
+ }
110
+ wss.close();
111
+ http.close(() => {
112
+ resolve();
113
+ });
114
+ setTimeout(resolve, SHUTDOWN_GRACE_MS);
115
+ }),
116
+ };
117
+ }
118
+ /** Polls `condition` until it's true or `timeoutMs` elapses, rejecting on timeout -- the shared shape every hub integration test uses to wait out real async gossip/discovery/close propagation rather than asserting immediately after firing an action. */
119
+ export async function waitForCondition(condition, timeoutMs = DEFAULT_CONDITION_TIMEOUT_MS) {
120
+ return new Promise((resolve, reject) => {
121
+ const started = Date.now();
122
+ const check = () => {
123
+ if (condition()) {
124
+ resolve();
125
+ return;
126
+ }
127
+ if (Date.now() - started > timeoutMs) {
128
+ reject(new Error("condition not met within timeout"));
129
+ return;
130
+ }
131
+ setTimeout(check, POLL_INTERVAL_MS);
132
+ };
133
+ check();
134
+ });
135
+ }
6
136
  //# sourceMappingURL=hub-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hub-helpers.js","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGjD,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"hub-helpers.js","sourceRoot":"","sources":["../../src/test/hub-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,16 @@
1
1
  // Integration: two real agent-comms WireMeshTransports discovering each other and exchanging messages through a real wire-mesh relay hub (createRelayHub -- the same domain logic the production mesh.exadev.io Durable Object runs) served over local WebSockets. This is agent-comms#151's own acceptance shape: the hub connection is a relay, not a coordinator -- no connect_request/introduce approval applies, peers discover each other via the hub's gossip forwarding + catch-up, and messages ride relay pairings (sendManageRequest's own targetDevice routing).
2
- import { createServer } from "node:http";
3
- import { WebSocketServer } from "ws";
4
2
  import { afterEach, describe, expect, it } from "vitest";
5
- import { cdeDecodeOptions, decode } from "cbor2";
6
- import { frameSchema } from "wire-mesh-core/generated/protocol";
7
- import { cbor2ToBytes } from "./hub-helpers.js";
8
- import { createRelayHub } from "wire-mesh-core/domain/relay-hub";
3
+ import { realHubOverWs, waitForCondition } from "./hub-helpers.js";
9
4
  import { generateIdentity } from "../core/identity.js";
10
5
  import { WireMeshTransport } from "../core/wire-mesh-transport.js";
11
- const SHUTDOWN_GRACE_MS = 250;
12
- const CLOSE_NORMAL = 1000; // RFC 6455 normal closure
13
- const POLL_INTERVAL_MS = 25;
14
6
  function recordingEvents() {
15
7
  const messages = [];
8
+ const allMessages = [];
16
9
  return {
17
10
  messages,
11
+ allMessages,
18
12
  onMessage: (handle, message) => {
13
+ allMessages.push(message);
19
14
  if (message.method === "peer_joined") {
20
15
  messages.push({ from: handle.id, text: message.peer.id });
21
16
  }
@@ -31,104 +26,6 @@ function recordingEvents() {
31
26
  onPresenceAdvert: () => undefined,
32
27
  };
33
28
  }
34
- /** A real relay hub served over ws: each accepted socket is wrapped as a Connection for createRelayHub, exactly what the production Durable Object does (pre-hibernation shape). */
35
- async function realHubOverWs() {
36
- const http = createServer();
37
- const wss = new WebSocketServer({ server: http });
38
- const hub = createRelayHub();
39
- wss.on("connection", (socket) => {
40
- socket.binaryType = "arraybuffer";
41
- void hub.handleConnection(wsConnection(socket));
42
- });
43
- await new Promise((resolve) => {
44
- http.listen(0, "127.0.0.1", () => {
45
- resolve();
46
- });
47
- });
48
- const address = http.address();
49
- if (address === null || typeof address === "string") {
50
- throw new Error("expected a TCP listen address");
51
- }
52
- return {
53
- url: `ws://127.0.0.1:${String(address.port)}/`,
54
- close: async () => new Promise((resolve) => {
55
- for (const client of wss.clients) {
56
- client.terminate();
57
- }
58
- wss.close();
59
- http.close(() => {
60
- resolve();
61
- });
62
- setTimeout(resolve, SHUTDOWN_GRACE_MS);
63
- }),
64
- };
65
- }
66
- function wsConnection(socket) {
67
- return {
68
- send: async (frame) => {
69
- socket.send(cbor2ToBytes(frame));
70
- },
71
- receive: () => wsReceiveStream(socket),
72
- close: async () => {
73
- socket.close(CLOSE_NORMAL);
74
- },
75
- };
76
- }
77
- function wsReceiveStream(socket) {
78
- const pending = [];
79
- const waiters = [];
80
- let ended = false;
81
- socket.on("message", (data) => {
82
- void (async () => {
83
- try {
84
- const decoded = decode(new Uint8Array(data), cdeDecodeOptions);
85
- const parsed = frameSchema.safeParse(decoded);
86
- if (!parsed.success)
87
- return;
88
- const waiter = waiters.shift();
89
- if (waiter !== undefined) {
90
- waiter.resolve({ value: parsed.data, done: false });
91
- }
92
- else {
93
- pending.push(parsed.data);
94
- }
95
- }
96
- catch {
97
- // Undecodable: drop, keeping the stream alive for the well-formed frames behind it (the hub's own tolerance).
98
- }
99
- })();
100
- });
101
- socket.on("close", () => {
102
- ended = true;
103
- for (const waiter of waiters.splice(0)) {
104
- waiter.resolve({ value: undefined, done: true });
105
- }
106
- });
107
- socket.on("error", () => {
108
- ended = true;
109
- for (const waiter of waiters.splice(0)) {
110
- waiter.resolve({ value: undefined, done: true });
111
- }
112
- });
113
- return {
114
- [Symbol.asyncIterator]() {
115
- return {
116
- async next() {
117
- const next = pending.shift();
118
- if (next !== undefined) {
119
- return { value: next, done: false };
120
- }
121
- if (ended) {
122
- return { value: undefined, done: true };
123
- }
124
- return new Promise((resolve, reject) => {
125
- waiters.push({ resolve, reject });
126
- });
127
- },
128
- };
129
- },
130
- };
131
- }
132
29
  const cleanups = [];
133
30
  afterEach(async () => {
134
31
  for (const close of cleanups.splice(0)) {
@@ -167,22 +64,48 @@ describe("connectToHub", () => {
167
64
  await transportA.shutdown();
168
65
  await transportB.shutdown();
169
66
  });
170
- });
171
- async function waitForCondition(condition, timeoutMs = 5_000) {
172
- return new Promise((resolve, reject) => {
173
- const started = Date.now();
174
- const check = () => {
175
- if (condition()) {
176
- resolve();
177
- return;
178
- }
179
- if (Date.now() - started > timeoutMs) {
180
- reject(new Error("condition not met within timeout"));
181
- return;
182
- }
183
- setTimeout(check, POLL_INTERVAL_MS);
184
- };
185
- check();
67
+ it("never applies a state_sync or state_update relayed by an unauthenticated hub peer (agent-comms#169 security finding: real per-peer admission lands in #156, but nothing today should let any hub peer patch local mesh state)", async () => {
68
+ const hub = await realHubOverWs();
69
+ cleanups.push(hub.close);
70
+ const eventsA = recordingEvents();
71
+ const eventsB = recordingEvents();
72
+ const transportA = new WireMeshTransport(eventsA, generateIdentity());
73
+ const transportB = new WireMeshTransport(eventsB, generateIdentity());
74
+ await transportA.hub.connect(hub.url);
75
+ await transportB.hub.connect(hub.url);
76
+ const deviceA = await transportA.hub.ownDeviceHex();
77
+ const deviceB = await transportB.hub.ownDeviceHex();
78
+ await waitForCondition(() => {
79
+ return (transportA.hub.peers().includes(deviceB) &&
80
+ transportB.hub.peers().includes(deviceA));
81
+ });
82
+ await transportA.hub.sendToPeer(deviceB, {
83
+ method: "state_update",
84
+ patch: { type: "agent_offline", agentId: "spoofed" },
85
+ });
86
+ await transportA.hub.sendToPeer(deviceB, {
87
+ method: "state_sync",
88
+ state: {
89
+ agents: {},
90
+ rooms: {},
91
+ messages: {},
92
+ dms: {},
93
+ deliveryQueues: {},
94
+ },
95
+ });
96
+ // A message type this codebase's own onMessage handler treats as inert either way -- proves the hub connection and relay pairing genuinely delivered something to B (ruling out "nothing arrived at all" as a false-negative explanation for state_update/state_sync never showing up below), while confirming filtering is specific to the two state-mutating methods rather than a blanket drop of everything.
97
+ await transportA.hub.sendToPeer(deviceB, {
98
+ method: "peer_joined",
99
+ peer: {
100
+ id: "proof-of-delivery",
101
+ port: 0,
102
+ startedAt: "2026-01-01T00:00:00.000Z",
103
+ },
104
+ });
105
+ await waitForCondition(() => eventsB.messages.length > 0);
106
+ expect(eventsB.allMessages.some((m) => m.method === "state_update" || m.method === "state_sync")).toBe(false);
107
+ await transportA.shutdown();
108
+ await transportB.shutdown();
186
109
  });
187
- }
110
+ });
188
111
  //# sourceMappingURL=hub-mode-session.integration.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hub-mode-session.integration.test.js","sourceRoot":"","sources":["../../src/test/hub-mode-session.integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hub-mode-session.integration.test.js","sourceRoot":"","sources":["../../src/test/hub-mode-session.integration.test.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ import * as child_process from "node:child_process";
10
10
  import * as net from "node:net";
11
11
  const SMOKE_PORT = 19877;
12
12
  const SMOKE_HOST = "127.0.0.1";
13
+ // A guaranteed-unreachable local address, not the real default hub (agent-comms#154's MeshStore now dials one on becoming coordinator) -- this smoke test's own concern is the coordinator/discovery/delivery path across a real process boundary, not live connectivity to production infrastructure. Pointing at an address nothing listens on exercises CoordinatorGateway's own failure-isolation (a dial failure must never block local coordinator election) deterministically and offline, rather than this test's outcome depending on whether the CI runner can reach the internet.
14
+ const UNREACHABLE_HUB_URL = "ws://127.0.0.1:1/";
13
15
  // A hung child (a mesh operation that never resolves) must not hang this process indefinitely -- the child is killed and the promise rejects with a clear reason instead of Promise.all([...]) waiting forever.
14
16
  const PEER_EXIT_TIMEOUT_MS = 15_000;
15
17
  // -----------------------------------------------------------------------
@@ -104,7 +106,7 @@ function buildScript(name, actions) {
104
106
  `const fs = require("node:fs");`,
105
107
  `function log(msg) { process.stdout.write(JSON.stringify(msg) + "\\n"); }`,
106
108
  `(async () => {`,
107
- ` const store = new MeshStore(${String(SMOKE_PORT)});`,
109
+ ` const store = new MeshStore(${String(SMOKE_PORT)}, "${UNREACHABLE_HUB_URL}");`,
108
110
  ` const slot = { harness: "smoke-${name}", cwd: "/test/${name}", dir: fs.mkdtempSync(path.join(os.tmpdir(), "agent-comms-smoke-${name}-")) };`,
109
111
  ` const identity = loadOrCreateIdentity(slot);`,
110
112
  ` store.peerId = deviceIdToHex(Uint8Array.from(identity.deviceId));`,
@@ -1 +1 @@
1
- {"version":3,"file":"mesh-smoke.runner.js","sourceRoot":"","sources":["../../src/test/mesh-smoke.runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mesh-smoke.runner.js","sourceRoot":"","sources":["../../src/test/mesh-smoke.runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,MAAM,UAAU,GAAG,KAAK,CAAC;AACzB,MAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,6jBAA6jB;AAC7jB,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAYhD,gNAAgN;AAChN,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,0EAA0E;AAC1E,qBAAqB;AACrB,0EAA0E;AAE1E,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;QACxD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,aAAa,CAAC,MAAM,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACjD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,CACJ,IAAI,KAAK,CACP,GAAG,IAAI,wBAAwB,MAAM,CAAC,oBAAoB,CAAC,QAAQ,MAAM,EAAE,CAC5E,CACF,CAAC;QACJ,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,aAAa,CAAC,MAAM,CAAC;wBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU;gBACZ,CAAC;YACH,CAAC;YACD,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBAExB,MAAM,CACJ,IAAI,KAAK,CAAC,GAAG,IAAI,qBAAqB,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,CAClE,CAAC;QACN,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe;IAChD,OAAO;QACL,6DAA6D;QAC7D,uDAAuD;QACvD,8EAA8E;QAC9E,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,gFAAgF;QAChF,oFAAoF;QACpF,gCAAgC;QAChC,oCAAoC;QACpC,gCAAgC;QAChC,0EAA0E;QAC1E,gBAAgB;QAChB,iCAAiC,MAAM,CAAC,UAAU,CAAC,MAAM,mBAAmB,KAAK;QACjF,oCAAoC,IAAI,kBAAkB,IAAI,oEAAoE,IAAI,SAAS;QAC/I,gDAAgD;QAChD,qEAAqE;QACrE,8FAA8F;QAC9F,0IAA0I;QAC1I,sCAAsC;QACtC,0BAA0B;QAC1B,wCAAwC;QACxC,6BAA6B;QAC7B,iEAAiE;QACjE,MAAM;QACN,uBAAuB;QACvB,6CAA6C;QAC7C,cAAc,IAAI,sBAAsB,IAAI,IAAI;QAChD,mBAAmB,IAAI,sBAAsB;QAC7C,sCAAsC;QACtC,OAAO;QACP,wDAAwD;QACxD,+CAA+C;QAC/C,KAAK,OAAO,EAAE;QACd,gDAAgD;QAChD,oDAAoD;QACpD,4DAA4D;QAC5D,kDAAkD;QAClD,mGAAmG;QACnG,6EAA6E;QAC7E,2BAA2B;QAC3B,oBAAoB;QACpB,0DAA0D;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,UAAU;AACV,0EAA0E;AAE1E,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,2bAA2b;AAC3b,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,wBAAwB,CAAC;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,SAAS,OAAO;YACd,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC9B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,CACJ,IAAI,KAAK,CACP,QAAQ,MAAM,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,wBAAwB,CAAC,IAAI,CACjF,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,UAAU,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CACd,QAAgC,EAChC,IAAY;IAEZ,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,0EAA0E;AAC1E,OAAO;AACP,0EAA0E;AAE1E,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,SAAS,CACrB,GAAG,EACH;QACE,4CAA4C;QAC5C,uCAAuC;QACvC,kDAAkD;QAClD,mCAAmC;QACnC,KAAK;QACL,uDAAuD;QACvD,s5BAAs5B;QACt5B,6BAA6B;QAC7B,gCAAgC;QAChC,iDAAiD;QACjD,4DAA4D;QAC5D,gBAAgB;QAChB,uDAAuD;QACvD,8DAA8D;QAC9D,4BAA4B;QAC5B,YAAY;QACZ,KAAK;QACL,+CAA+C;QAC/C,GAAG;QACH,8EAA8E;QAC9E,4BAA4B;QAC5B,gCAAgC;QAChC,iDAAiD;QACjD,gFAAgF;QAChF,+CAA+C;QAC/C,GAAG;QACH,mFAAmF;QACnF,kEAAkE;QAClE,iDAAiD;KAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,qIAAqI;IACrI,MAAM,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,CACrB,GAAG,EACH;QACE,6CAA6C;QAC7C,wDAAwD;QACxD,6EAA6E;QAC7E,kBAAkB;QAClB,iDAAiD;QACjD,0DAA0D;QAC1D,UAAU;QACV,uCAAuC;QACvC,GAAG;KACJ,CAAC,IAAI,CAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5C,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,qBAAqB;IACrB,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAElD,MAAM,CAAC,EAAE,CACP,OAAO;QACL,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;QACtC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EACzB,uCAAuC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CACrE,CAAC;IACF,MAAM,CAAC,EAAE,CACP,OAAO;QACL,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;QACtC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EACzB,uCAAuC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CACrE,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACnE,MAAM,CAAC,EAAE,CACP,WAAW;QACT,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC1C,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAC7B,6CAA6C,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAC/E,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -32,6 +32,8 @@ function fakeTransport() {
32
32
  listListeners: vi.fn().mockReturnValue([]),
33
33
  shutdown: vi.fn().mockResolvedValue(undefined),
34
34
  unref: vi.fn(),
35
+ connectHub: vi.fn().mockResolvedValue(undefined),
36
+ disconnectHub: vi.fn().mockResolvedValue(undefined),
35
37
  };
36
38
  }
37
39
  /** Reaches a private collaborator for a whitebox delegation check -- see the file header for why this cast is justified rather than avoided. Returns `unknown`; each call site casts to the narrow method slice it actually needs. */
@@ -198,6 +200,48 @@ describe("MeshStore — init()", () => {
198
200
  await store.init();
199
201
  expect(transport.startDataServer).toHaveBeenCalledTimes(1);
200
202
  });
203
+ it("dials the default hub URL once it becomes coordinator on a fresh bind", async () => {
204
+ const store = new MeshStore();
205
+ const transport = fakeTransport();
206
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
207
+ store.setTransport(transport);
208
+ await store.init();
209
+ expect(transport.connectHub).toHaveBeenCalledWith("wss://mesh.exadev.io/");
210
+ expect(transport.connectHub).toHaveBeenCalledTimes(1);
211
+ });
212
+ it("dials the constructor-supplied hub URL override instead of the default", async () => {
213
+ const store = new MeshStore(undefined, "wss://hub.example.test/");
214
+ const transport = fakeTransport();
215
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
216
+ store.setTransport(transport);
217
+ await store.init();
218
+ expect(transport.connectHub).toHaveBeenCalledWith("wss://hub.example.test/");
219
+ });
220
+ it("never dials the hub when joining an existing coordinator rather than becoming one", async () => {
221
+ const store = new MeshStore();
222
+ const transport = fakeTransport();
223
+ store.setTransport(transport);
224
+ await store.init();
225
+ expect(transport.connectToCoordinator).toHaveBeenCalledTimes(1);
226
+ expect(transport.connectHub).not.toHaveBeenCalled();
227
+ });
228
+ it("still succeeds locally (becomes coordinator) when the hub dial fails -- local coordinator election must not depend on hub reachability", async () => {
229
+ const store = new MeshStore();
230
+ const transport = fakeTransport();
231
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
232
+ const { connectHub } = transport;
233
+ if (connectHub === undefined)
234
+ throw new Error("expected connectHub");
235
+ const hubError = new Error("hub unreachable");
236
+ vi.mocked(connectHub).mockRejectedValue(hubError);
237
+ store.setTransport(transport);
238
+ const onError = vi.fn();
239
+ store.onError = onError;
240
+ await expect(store.init()).resolves.toBeUndefined();
241
+ expect(transport.becomeCoordinator).toHaveBeenCalledTimes(1);
242
+ expect(onError).toHaveBeenCalledWith(hubError);
243
+ expect(transport.unref).toHaveBeenCalledTimes(1);
244
+ });
201
245
  });
202
246
  describe("MeshStore — events getter dispatch table", () => {
203
247
  it("dispatches every transport event to the collaborator method that owns it", () => {
@@ -499,5 +543,18 @@ describe("MeshStore — shutdown()", () => {
499
543
  await store.shutdown();
500
544
  expect(broadcastSpy).not.toHaveBeenCalled();
501
545
  });
546
+ it("drops the held hub connection when this instance had become coordinator", async () => {
547
+ vi.mocked(transport.connectToCoordinator).mockRejectedValue(new Error("ECONNREFUSED"));
548
+ await store.init();
549
+ expect(transport.connectHub).toHaveBeenCalledTimes(1);
550
+ await store.shutdown();
551
+ expect(transport.disconnectHub).toHaveBeenCalledTimes(1);
552
+ });
553
+ it("never touches disconnectHub when this instance never became coordinator", async () => {
554
+ await store.init();
555
+ expect(transport.connectHub).not.toHaveBeenCalled();
556
+ await store.shutdown();
557
+ expect(transport.disconnectHub).not.toHaveBeenCalled();
558
+ });
502
559
  });
503
560
  //# sourceMappingURL=mesh-store-orchestration.test.js.map