agent-comms 8.3.0 → 8.4.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 (150) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +27 -16
  4. package/dist/bridges/user/web/frontend/mesh-client.js +1 -1
  5. package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -1
  6. package/dist/bridges/user/web/server.d.ts +1 -1
  7. package/dist/bridges/user/web/server.d.ts.map +1 -1
  8. package/dist/bridges/user/web/server.js +6 -12
  9. package/dist/bridges/user/web/server.js.map +1 -1
  10. package/dist/bridges/user/web/test/lan-web-server.integration.test.js +30 -1
  11. package/dist/bridges/user/web/test/lan-web-server.integration.test.js.map +1 -1
  12. package/dist/bridges/user/web/test/orpc-router.integration.test.js +15 -1
  13. package/dist/bridges/user/web/test/orpc-router.integration.test.js.map +1 -1
  14. package/dist/bridges/user/web/test/web-access.unit.test.js +127 -2
  15. package/dist/bridges/user/web/test/web-access.unit.test.js.map +1 -1
  16. package/dist/bridges/user/web/web-access.d.ts +9 -6
  17. package/dist/bridges/user/web/web-access.d.ts.map +1 -1
  18. package/dist/bridges/user/web/web-access.js +70 -22
  19. package/dist/bridges/user/web/web-access.js.map +1 -1
  20. package/dist/core/coordinator-role.d.ts +68 -0
  21. package/dist/core/coordinator-role.d.ts.map +1 -0
  22. package/dist/core/coordinator-role.js +161 -0
  23. package/dist/core/coordinator-role.js.map +1 -0
  24. package/dist/core/delivery-engine.d.ts.map +1 -1
  25. package/dist/core/delivery-engine.js +2 -0
  26. package/dist/core/delivery-engine.js.map +1 -1
  27. package/dist/core/election-sessions.d.ts +31 -0
  28. package/dist/core/election-sessions.d.ts.map +1 -0
  29. package/dist/core/election-sessions.js +59 -0
  30. package/dist/core/election-sessions.js.map +1 -0
  31. package/dist/core/loopback-address.d.ts +6 -0
  32. package/dist/core/loopback-address.d.ts.map +1 -0
  33. package/dist/core/loopback-address.js +21 -0
  34. package/dist/core/loopback-address.js.map +1 -0
  35. package/dist/core/mesh-store-options.d.ts +2 -0
  36. package/dist/core/mesh-store-options.d.ts.map +1 -1
  37. package/dist/core/mesh-store.d.ts +8 -2
  38. package/dist/core/mesh-store.d.ts.map +1 -1
  39. package/dist/core/mesh-store.js +41 -46
  40. package/dist/core/mesh-store.js.map +1 -1
  41. package/dist/core/peer-lifecycle.d.ts +18 -10
  42. package/dist/core/peer-lifecycle.d.ts.map +1 -1
  43. package/dist/core/peer-lifecycle.js +50 -9
  44. package/dist/core/peer-lifecycle.js.map +1 -1
  45. package/dist/core/pending-connection.d.ts +24 -0
  46. package/dist/core/pending-connection.d.ts.map +1 -0
  47. package/dist/core/pending-connection.js +25 -0
  48. package/dist/core/pending-connection.js.map +1 -0
  49. package/dist/core/stale-agent-checker.d.ts +4 -2
  50. package/dist/core/stale-agent-checker.d.ts.map +1 -1
  51. package/dist/core/stale-agent-checker.js +5 -4
  52. package/dist/core/stale-agent-checker.js.map +1 -1
  53. package/dist/core/transport-events.d.ts +2 -0
  54. package/dist/core/transport-events.d.ts.map +1 -1
  55. package/dist/core/transport-events.js +8 -0
  56. package/dist/core/transport-events.js.map +1 -1
  57. package/dist/core/transport.d.ts +22 -2
  58. package/dist/core/transport.d.ts.map +1 -1
  59. package/dist/core/wire-mesh-transport-options.d.ts +14 -0
  60. package/dist/core/wire-mesh-transport-options.d.ts.map +1 -1
  61. package/dist/core/wire-mesh-transport-options.js +23 -1
  62. package/dist/core/wire-mesh-transport-options.js.map +1 -1
  63. package/dist/core/wire-mesh-transport.d.ts +7 -5
  64. package/dist/core/wire-mesh-transport.d.ts.map +1 -1
  65. package/dist/core/wire-mesh-transport.js +53 -52
  66. package/dist/core/wire-mesh-transport.js.map +1 -1
  67. package/dist/core/ws-dial.d.ts +3 -1
  68. package/dist/core/ws-dial.d.ts.map +1 -1
  69. package/dist/core/ws-dial.js +15 -0
  70. package/dist/core/ws-dial.js.map +1 -1
  71. package/dist/test/agent-comms-version-gossip.integration.test.js +2 -0
  72. package/dist/test/agent-comms-version-gossip.integration.test.js.map +1 -1
  73. package/dist/test/agent-self-gossip.integration.test.js +2 -0
  74. package/dist/test/agent-self-gossip.integration.test.js.map +1 -1
  75. package/dist/test/become-coordinator-actual-port.integration.test.js +2 -0
  76. package/dist/test/become-coordinator-actual-port.integration.test.js.map +1 -1
  77. package/dist/test/coordinator-claim-sessions.integration.test.d.ts +5 -0
  78. package/dist/test/coordinator-claim-sessions.integration.test.d.ts.map +1 -0
  79. package/dist/test/coordinator-claim-sessions.integration.test.js +276 -0
  80. package/dist/test/coordinator-claim-sessions.integration.test.js.map +1 -0
  81. package/dist/test/coordinator-election.integration.test.d.ts +5 -0
  82. package/dist/test/coordinator-election.integration.test.d.ts.map +1 -0
  83. package/dist/test/coordinator-election.integration.test.js +182 -0
  84. package/dist/test/coordinator-election.integration.test.js.map +1 -0
  85. package/dist/test/coordinator-failover.unit.test.d.ts +1 -1
  86. package/dist/test/coordinator-failover.unit.test.js +171 -68
  87. package/dist/test/coordinator-failover.unit.test.js.map +1 -1
  88. package/dist/test/coordinator-role.unit.test.d.ts +5 -0
  89. package/dist/test/coordinator-role.unit.test.d.ts.map +1 -0
  90. package/dist/test/coordinator-role.unit.test.js +296 -0
  91. package/dist/test/coordinator-role.unit.test.js.map +1 -0
  92. package/dist/test/data-sync-frame-handling.integration.test.js +2 -0
  93. package/dist/test/data-sync-frame-handling.integration.test.js.map +1 -1
  94. package/dist/test/delivery-engine-delivery.unit.test.js +3 -0
  95. package/dist/test/delivery-engine-delivery.unit.test.js.map +1 -1
  96. package/dist/test/delivery-engine-directed-notify.unit.test.js +3 -0
  97. package/dist/test/delivery-engine-directed-notify.unit.test.js.map +1 -1
  98. package/dist/test/delivery-engine-own-agent.unit.test.js +3 -0
  99. package/dist/test/delivery-engine-own-agent.unit.test.js.map +1 -1
  100. package/dist/test/delivery-engine.unit.test.js +12 -0
  101. package/dist/test/delivery-engine.unit.test.js.map +1 -1
  102. package/dist/test/gossip-directory-aggregation.integration.test.js +2 -0
  103. package/dist/test/gossip-directory-aggregation.integration.test.js.map +1 -1
  104. package/dist/test/gossip-listener-addresses.integration.test.js +2 -0
  105. package/dist/test/gossip-listener-addresses.integration.test.js.map +1 -1
  106. package/dist/test/hosted-rooms-gossip.integration.test.js +2 -0
  107. package/dist/test/hosted-rooms-gossip.integration.test.js.map +1 -1
  108. package/dist/test/hub-mode-session.integration.test.js +2 -0
  109. package/dist/test/hub-mode-session.integration.test.js.map +1 -1
  110. package/dist/test/hub-session-dispatch.unit.test.js +2 -0
  111. package/dist/test/hub-session-dispatch.unit.test.js.map +1 -1
  112. package/dist/test/listener-policy.integration.test.js +2 -0
  113. package/dist/test/listener-policy.integration.test.js.map +1 -1
  114. package/dist/test/loopback-address.unit.test.d.ts +5 -0
  115. package/dist/test/loopback-address.unit.test.d.ts.map +1 -0
  116. package/dist/test/loopback-address.unit.test.js +28 -0
  117. package/dist/test/loopback-address.unit.test.js.map +1 -0
  118. package/dist/test/mesh-graph-trace.integration.test.js +2 -0
  119. package/dist/test/mesh-graph-trace.integration.test.js.map +1 -1
  120. package/dist/test/mesh-store-orchestration.unit.test.js +23 -6
  121. package/dist/test/mesh-store-orchestration.unit.test.js.map +1 -1
  122. package/dist/test/peer-lifecycle.unit.test.js +35 -15
  123. package/dist/test/peer-lifecycle.unit.test.js.map +1 -1
  124. package/dist/test/presence-readvertise.integration.test.js +49 -0
  125. package/dist/test/presence-readvertise.integration.test.js.map +1 -1
  126. package/dist/test/query-version.integration.test.js +2 -0
  127. package/dist/test/query-version.integration.test.js.map +1 -1
  128. package/dist/test/room-join-admission.integration.test.js +3 -0
  129. package/dist/test/room-join-admission.integration.test.js.map +1 -1
  130. package/dist/test/room-router.unit.test.js +2 -0
  131. package/dist/test/room-router.unit.test.js.map +1 -1
  132. package/dist/test/room-send-retry-queue.integration.test.js +3 -0
  133. package/dist/test/room-send-retry-queue.integration.test.js.map +1 -1
  134. package/dist/test/stale-agent-checker.unit.test.js +5 -0
  135. package/dist/test/stale-agent-checker.unit.test.js.map +1 -1
  136. package/dist/test/test-transport.d.ts +3 -0
  137. package/dist/test/test-transport.d.ts.map +1 -1
  138. package/dist/test/test-transport.js +19 -0
  139. package/dist/test/test-transport.js.map +1 -1
  140. package/dist/test/wire-mesh-transport-gateway-trust.integration.test.js +2 -0
  141. package/dist/test/wire-mesh-transport-gateway-trust.integration.test.js.map +1 -1
  142. package/dist/test/wire-mesh-transport-hub.integration.test.js +2 -0
  143. package/dist/test/wire-mesh-transport-hub.integration.test.js.map +1 -1
  144. package/dist/test/wire-mesh-transport-shutdown-unref.integration.test.js +10 -26
  145. package/dist/test/wire-mesh-transport-shutdown-unref.integration.test.js.map +1 -1
  146. package/dist/test/wire-mesh-transport.integration.test.js +51 -51
  147. package/dist/test/wire-mesh-transport.integration.test.js.map +1 -1
  148. package/dist/test/wss-remote-connect.integration.test.js +2 -0
  149. package/dist/test/wss-remote-connect.integration.test.js.map +1 -1
  150. package/package.json +2 -2
@@ -1,15 +1,23 @@
1
1
  /**
2
- * PeerLifecycle's crash-race coordinator failover decision (agent-comms#285), exercised against fakes: which disconnects contest the vacated coordinator role, what a peer that loses the bind race does instead, and who retires a departed peer's own agent record. The real-socket counterpart lives in coordinator-failover.integration.test.ts.
2
+ * PeerLifecycle's failover decisions, exercised against fakes with a real CoordinatorRole: which disconnects contest the vacated well-known port (agent-comms#285), what a peer that loses the bind race does instead, how the elected coordinator role is recovered when its holder departs (agent-comms#341), and who retires a departed peer's own agent record. The real-socket counterparts live in coordinator-failover.integration.test.ts and coordinator-election.integration.test.ts.
3
3
  */
4
- import { test, expect } from "vitest";
4
+ import { afterEach, test, expect, vi } from "vitest";
5
+ import { deviceIdFromHex } from "wire-mesh-core/domain/device-id";
5
6
  import { PeerLifecycle } from "../core/peer-lifecycle.js";
7
+ import { CoordinatorRole } from "../core/coordinator-role.js";
8
+ import { ROOM_REQUEST_TIMEOUT_MS } from "../core/request-timeouts.js";
6
9
  const COORDINATOR_PORT = 19_876;
7
10
  const SELF_DATA_PORT = 41_001;
8
11
  const COORDINATOR_DATA_PORT = 41_002;
9
12
  const SURVIVOR_DATA_PORT = 41_003;
10
- const SELF_ID = "self-peer";
11
- const COORDINATOR_ID = "coordinator-peer";
12
- const SURVIVOR_ID = "survivor-peer";
13
+ const DEVICE_ID_HEX_LENGTH = 64;
14
+ /** Device-ids in ascending order, so which survivor is the lowest is fixed per test: the departing peer sorts first, then this side, then the other survivor, unless a test swaps the last two. */
15
+ const COORDINATOR_ID = "1".repeat(DEVICE_ID_HEX_LENGTH);
16
+ const LOW_ID = "2".repeat(DEVICE_ID_HEX_LENGTH);
17
+ const HIGH_ID = "3".repeat(DEVICE_ID_HEX_LENGTH);
18
+ /** Sorts below every other id here, for a peer this side lists but can never hold an election with. */
19
+ const UNENROLLED_ID = "0".repeat(DEVICE_ID_HEX_LENGTH);
20
+ const UNENROLLED_DATA_PORT = 41_004;
13
21
  function peer(id, port, startedAt) {
14
22
  return { id, port, startedAt };
15
23
  }
@@ -28,24 +36,24 @@ function agentRecord(id, status) {
28
36
  subscribedRooms: [],
29
37
  };
30
38
  }
39
+ function claimFor(holderHex, term) {
40
+ return { type: "coordinator", term, coordinator: deviceIdFromHex(holderHex) };
41
+ }
31
42
  function makeHarness(options = {}) {
43
+ const selfId = options.selfId ?? LOW_ID;
32
44
  const calls = {
33
45
  becomeCoordinator: [],
34
46
  connectToCoordinator: [],
35
47
  connectToPeer: [],
36
48
  broadcasts: [],
49
+ claims: [],
37
50
  };
38
- const harness = {
39
- // Assigned below, once the deps it closes over exist.
40
- lifecycle: undefined,
41
- calls,
42
- peerInfo: new Map(),
43
- agents: new Map(),
44
- roomStatusNotifications: [],
45
- staleCheckerStarts: 0,
46
- roleChanges: 0,
47
- errors: [],
48
- };
51
+ const peerInfo = new Map();
52
+ const agents = new Map();
53
+ const roomStatusNotifications = [];
54
+ const errors = [];
55
+ const notEnrolled = new Set(options.notEnrolled);
56
+ let gains = 0;
49
57
  let isCoordinator = options.isCoordinator ?? false;
50
58
  const transport = {
51
59
  dataPort: SELF_DATA_PORT,
@@ -73,6 +81,12 @@ function makeHarness(options = {}) {
73
81
  connectToRemote: async () => { },
74
82
  broadcast: async () => { },
75
83
  broadcastRevocation: async () => { },
84
+ broadcastCoordinatorClaim: async (frame) => {
85
+ calls.claims.push(frame);
86
+ },
87
+ sendCoordinatorClaim: async () => { },
88
+ // Every peer this side still lists has a machine-local session to it unless the test says otherwise; handlePeerDeparture drops a departed peer from peerInfo just as the transport drops its closed session.
89
+ electionPeerIds: () => new Set([...peerInfo.keys()].filter((id) => id !== selfId && !notEnrolled.has(id))),
76
90
  sendRoomRequest: async () => ({ result: "ok" }),
77
91
  addListener: async () => "listener",
78
92
  removeListener: async () => { },
@@ -80,11 +94,23 @@ function makeHarness(options = {}) {
80
94
  shutdown: async () => { },
81
95
  unref: () => { },
82
96
  };
97
+ const role = new CoordinatorRole({
98
+ getPeerId: () => selfId,
99
+ requireTransport: () => transport,
100
+ claimWaitMs: ROOM_REQUEST_TIMEOUT_MS,
101
+ onGained: async () => {
102
+ gains += 1;
103
+ },
104
+ onLost: async () => { },
105
+ onError: (error) => {
106
+ errors.push(error instanceof Error ? error : new Error(String(error)));
107
+ },
108
+ });
83
109
  const deps = {
84
- peerInfo: harness.peerInfo,
85
- agents: harness.agents,
110
+ peerInfo,
111
+ agents,
86
112
  coordinatorPort: COORDINATOR_PORT,
87
- getPeerId: () => SELF_ID,
113
+ getPeerId: () => selfId,
88
114
  getCoordinatorPeerId: () => transport.coordinatorPeerId,
89
115
  requireTransport: () => transport,
90
116
  serialise: () => ({
@@ -99,80 +125,96 @@ function makeHarness(options = {}) {
99
125
  applyStateSync: () => { },
100
126
  applyPatch: async () => { },
101
127
  notifyRoomsOfStatus: async (agentId, status) => {
102
- harness.roomStatusNotifications.push({ agentId, status });
128
+ roomStatusNotifications.push({ agentId, status });
103
129
  },
104
130
  broadcastPatch: async (patch) => {
105
131
  calls.broadcasts.push(patch);
106
132
  },
107
- },
108
- staleAgentChecker: {
109
- start: () => {
110
- harness.staleCheckerStarts += 1;
133
+ bump: (entity) => {
134
+ entity.version += 1;
135
+ return entity;
111
136
  },
112
137
  },
113
- onCoordinatorRoleChanged: () => {
114
- harness.roleChanges += 1;
115
- },
138
+ coordinatorRole: role,
116
139
  onError: (error) => {
117
- harness.errors.push(error);
140
+ errors.push(error);
118
141
  },
119
142
  };
120
- harness.lifecycle = new PeerLifecycle(deps);
121
- return harness;
143
+ peerInfo.set(selfId, peer(selfId, SELF_DATA_PORT, "2026-01-01T00:00:02.000Z"));
144
+ peerInfo.set(COORDINATOR_ID, peer(COORDINATOR_ID, COORDINATOR_DATA_PORT, "2026-01-01T00:00:00.000Z"));
145
+ const survivorId = options.survivorId ?? HIGH_ID;
146
+ peerInfo.set(survivorId, peer(survivorId, SURVIVOR_DATA_PORT, "2026-01-01T00:00:01.000Z"));
147
+ return {
148
+ lifecycle: new PeerLifecycle(deps),
149
+ role,
150
+ calls,
151
+ peerInfo,
152
+ agents,
153
+ roomStatusNotifications,
154
+ get gains() {
155
+ return gains;
156
+ },
157
+ errors,
158
+ };
122
159
  }
123
- /** The peer list every test starts from: this side, the coordinator that is about to die, and one other survivor. */
124
- function seedMesh(harness) {
125
- harness.peerInfo.set(SELF_ID, peer(SELF_ID, SELF_DATA_PORT, "2026-01-01T00:00:02.000Z"));
126
- harness.peerInfo.set(COORDINATOR_ID, peer(COORDINATOR_ID, COORDINATOR_DATA_PORT, "2026-01-01T00:00:00.000Z"));
127
- harness.peerInfo.set(SURVIVOR_ID, peer(SURVIVOR_ID, SURVIVOR_DATA_PORT, "2026-01-01T00:00:01.000Z"));
160
+ /** Makes holderHex the elected incumbent at term, as if its claim had just been gossiped to this side. */
161
+ async function electHolder(harness, holderHex, term) {
162
+ await harness.role.handleClaim({ id: holderHex }, claimFor(holderHex, term));
163
+ harness.calls.claims.length = 0;
128
164
  }
129
- test("the coordinator's own disconnect makes this peer contest the coordinator port", async () => {
165
+ afterEach(() => {
166
+ vi.useRealTimers();
167
+ });
168
+ test("the port holder's own disconnect makes this peer contest the well-known port", async () => {
130
169
  const harness = makeHarness({ coordinatorPeerId: COORDINATOR_ID });
131
- seedMesh(harness);
132
170
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
133
171
  expect(harness.calls.becomeCoordinator).toEqual([
134
172
  { host: "127.0.0.1", port: COORDINATOR_PORT },
135
173
  ]);
136
- expect(harness.staleCheckerStarts).toBe(1);
137
- expect(harness.roleChanges).toBe(1);
138
174
  expect(harness.errors).toEqual([]);
139
175
  });
140
- test("taking over keeps this peer's own entry and drops the dead coordinator's", async () => {
176
+ test("winning the vacated port does not by itself carry the coordinator duties while another live peer holds the elected role", async () => {
141
177
  const harness = makeHarness({ coordinatorPeerId: COORDINATOR_ID });
142
- seedMesh(harness);
178
+ await electHolder(harness, HIGH_ID, 0);
143
179
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
144
- expect([...harness.peerInfo.keys()].sort()).toEqual([SELF_ID, SURVIVOR_ID].sort());
145
- expect(harness.calls.connectToPeer).toEqual([SURVIVOR_ID]);
180
+ expect(harness.calls.becomeCoordinator).toHaveLength(1);
181
+ expect(harness.role.isHolder()).toBe(false);
182
+ expect(harness.gains).toBe(0);
183
+ expect(harness.calls.claims).toEqual([]);
146
184
  });
147
- test("an ordinary peer's disconnect never contests the coordinator role", async () => {
185
+ test("taking over the port keeps this peer's own entry and drops the dead holder's", async () => {
148
186
  const harness = makeHarness({ coordinatorPeerId: COORDINATOR_ID });
149
- seedMesh(harness);
150
- await harness.lifecycle.handlePeerDeparture(SURVIVOR_ID);
187
+ await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
188
+ expect([...harness.peerInfo.keys()].sort()).toEqual([LOW_ID, HIGH_ID].sort());
189
+ expect(harness.calls.connectToPeer).toEqual([HIGH_ID]);
190
+ });
191
+ test("an ordinary peer's disconnect contests neither the port nor the elected role", async () => {
192
+ const harness = makeHarness({ coordinatorPeerId: COORDINATOR_ID });
193
+ await electHolder(harness, COORDINATOR_ID, 0);
194
+ await harness.lifecycle.handlePeerDeparture(HIGH_ID);
151
195
  expect(harness.calls.becomeCoordinator).toEqual([]);
152
196
  expect(harness.calls.connectToCoordinator).toEqual([]);
153
- expect(harness.peerInfo.has(SURVIVOR_ID)).toBe(false);
197
+ expect(harness.calls.claims).toEqual([]);
198
+ expect(harness.peerInfo.has(HIGH_ID)).toBe(false);
154
199
  });
155
- test("a peer that already holds the coordinator role never contests it", async () => {
200
+ test("a peer that already holds the port listener never contests it", async () => {
156
201
  const harness = makeHarness({
157
202
  isCoordinator: true,
158
203
  coordinatorPeerId: COORDINATOR_ID,
159
204
  });
160
- seedMesh(harness);
161
205
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
162
206
  expect(harness.calls.becomeCoordinator).toEqual([]);
163
207
  });
164
- test("losing the bind race makes this peer rejoin under the new coordinator", async () => {
208
+ test("losing the bind race makes this peer rejoin under the new port holder", async () => {
165
209
  const harness = makeHarness({
166
210
  coordinatorPeerId: COORDINATOR_ID,
167
211
  bindFailure: new Error("listen EADDRINUSE: address already in use"),
168
212
  });
169
- seedMesh(harness);
170
213
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
171
214
  expect(harness.calls.becomeCoordinator).toHaveLength(1);
172
215
  expect(harness.calls.connectToCoordinator).toEqual([
173
- { port: COORDINATOR_PORT, peerId: SELF_ID, dataPort: SELF_DATA_PORT },
216
+ { port: COORDINATOR_PORT, peerId: LOW_ID, dataPort: SELF_DATA_PORT },
174
217
  ]);
175
- expect(harness.staleCheckerStarts).toBe(0);
176
218
  expect(harness.errors).toEqual([]);
177
219
  });
178
220
  test("a bind failure that is not a port conflict is reported, not retried as a rejoin", async () => {
@@ -180,29 +222,87 @@ test("a bind failure that is not a port conflict is reported, not retried as a r
180
222
  coordinatorPeerId: COORDINATOR_ID,
181
223
  bindFailure: new Error("EACCES: permission denied"),
182
224
  });
183
- seedMesh(harness);
184
225
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
185
226
  expect(harness.calls.connectToCoordinator).toEqual([]);
186
227
  expect(harness.errors.map((error) => error.message)).toEqual([
187
- "PeerLifecycle: could not take over the vacated coordinator role: EACCES: permission denied",
228
+ "PeerLifecycle: could not take over the vacated coordinator port: EACCES: permission denied",
188
229
  ]);
189
230
  });
190
- test("the coordinator retires a departed peer's own agent record", async () => {
191
- const harness = makeHarness({ isCoordinator: true });
192
- seedMesh(harness);
193
- harness.agents.set(SURVIVOR_ID, agentRecord(SURVIVOR_ID, "active"));
194
- await harness.lifecycle.handlePeerDeparture(SURVIVOR_ID);
195
- expect(harness.agents.get(SURVIVOR_ID)?.status).toBe("offline");
231
+ test("the elected holder's departure makes the lowest surviving device-id claim the role at a raised term, whether or not it wins the port", async () => {
232
+ const harness = makeHarness({
233
+ coordinatorPeerId: COORDINATOR_ID,
234
+ bindFailure: new Error("listen EADDRINUSE: address already in use"),
235
+ });
236
+ const departedTerm = 3;
237
+ await electHolder(harness, COORDINATOR_ID, departedTerm);
238
+ await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
239
+ expect(harness.calls.claims).toEqual([claimFor(LOW_ID, departedTerm + 1)]);
240
+ expect(harness.role.isHolder()).toBe(true);
241
+ expect(harness.gains).toBe(1);
242
+ expect(harness.calls.becomeCoordinator).toHaveLength(1);
243
+ });
244
+ test("a lower-id peer this side lists but has no machine-local session to does not hold the lowest survivor back from claiming at once", async () => {
245
+ const harness = makeHarness({ notEnrolled: [UNENROLLED_ID] });
246
+ harness.peerInfo.set(UNENROLLED_ID, peer(UNENROLLED_ID, UNENROLLED_DATA_PORT, "2026-01-01T00:00:03.000Z"));
247
+ await electHolder(harness, COORDINATOR_ID, 0);
248
+ await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
249
+ expect(harness.calls.claims).toEqual([claimFor(LOW_ID, 1)]);
250
+ expect(harness.role.isHolder()).toBe(true);
251
+ });
252
+ test("a survivor that is not the lowest device-id leaves the claim to the lowest one", async () => {
253
+ vi.useFakeTimers();
254
+ const harness = makeHarness({ selfId: HIGH_ID, survivorId: LOW_ID });
255
+ await electHolder(harness, COORDINATOR_ID, 0);
256
+ await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
257
+ await harness.role.handleClaim({ id: LOW_ID }, claimFor(LOW_ID, 1));
258
+ harness.calls.claims.length = 0;
259
+ await vi.advanceTimersByTimeAsync(ROOM_REQUEST_TIMEOUT_MS);
260
+ expect(harness.role.isHolder()).toBe(false);
261
+ expect(harness.role.current()).toEqual({ term: 1, holder: LOW_ID });
262
+ expect(harness.calls.claims).toEqual([]);
263
+ });
264
+ test("a survivor claims the role itself once the expected successor's claim never arrives, and retires the departed holder", async () => {
265
+ vi.useFakeTimers();
266
+ const harness = makeHarness({ selfId: HIGH_ID, survivorId: LOW_ID });
267
+ harness.agents.set(COORDINATOR_ID, agentRecord(COORDINATOR_ID, "active"));
268
+ await electHolder(harness, COORDINATOR_ID, 0);
269
+ await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
270
+ expect(harness.calls.claims).toEqual([]);
271
+ await vi.advanceTimersByTimeAsync(ROOM_REQUEST_TIMEOUT_MS);
272
+ expect(harness.calls.claims).toEqual([claimFor(HIGH_ID, 1)]);
273
+ expect(harness.role.isHolder()).toBe(true);
274
+ expect(harness.agents.get(COORDINATOR_ID)?.status).toBe("offline");
275
+ expect(harness.calls.broadcasts).toEqual([
276
+ { type: "agent_offline", agentId: COORDINATOR_ID },
277
+ ]);
278
+ });
279
+ test("the elected holder retires a departed peer's own agent record", async () => {
280
+ const harness = makeHarness();
281
+ await harness.role.claimIfVacant();
282
+ const running = agentRecord(HIGH_ID, "active");
283
+ harness.agents.set(HIGH_ID, structuredClone(running));
284
+ await harness.lifecycle.handlePeerDeparture(HIGH_ID);
285
+ expect(harness.agents.get(HIGH_ID)?.status).toBe("offline");
286
+ // Above the revision a survivor's snapshot from before the departure would carry.
287
+ expect(harness.agents.get(HIGH_ID)?.version).toBe(running.version + 1);
196
288
  expect(harness.roomStatusNotifications).toEqual([
197
- { agentId: SURVIVOR_ID, status: "offline" },
289
+ { agentId: HIGH_ID, status: "offline" },
198
290
  ]);
199
291
  expect(harness.calls.broadcasts).toEqual([
200
- { type: "agent_offline", agentId: SURVIVOR_ID },
292
+ { type: "agent_offline", agentId: HIGH_ID },
201
293
  ]);
202
294
  });
203
- test("a peer that takes over retires the dead coordinator's own agent record", async () => {
295
+ test("holding only the port listener gives no authority to retire a departed peer", async () => {
296
+ const harness = makeHarness({ isCoordinator: true });
297
+ await electHolder(harness, COORDINATOR_ID, 0);
298
+ harness.agents.set(HIGH_ID, agentRecord(HIGH_ID, "active"));
299
+ await harness.lifecycle.handlePeerDeparture(HIGH_ID);
300
+ expect(harness.agents.get(HIGH_ID)?.status).toBe("active");
301
+ expect(harness.calls.broadcasts).toEqual([]);
302
+ });
303
+ test("a peer that takes over the elected role retires the dead holder's own agent record", async () => {
204
304
  const harness = makeHarness({ coordinatorPeerId: COORDINATOR_ID });
205
- seedMesh(harness);
305
+ await electHolder(harness, COORDINATOR_ID, 0);
206
306
  harness.agents.set(COORDINATOR_ID, agentRecord(COORDINATOR_ID, "active"));
207
307
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
208
308
  expect(harness.agents.get(COORDINATOR_ID)?.status).toBe("offline");
@@ -210,14 +310,17 @@ test("a peer that takes over retires the dead coordinator's own agent record", a
210
310
  { type: "agent_offline", agentId: COORDINATOR_ID },
211
311
  ]);
212
312
  });
213
- test("a peer that loses the race leaves the offline announcement to the winner", async () => {
313
+ test("a survivor that does not take over the elected role leaves the offline announcement to the new holder, even when it wins the port", async () => {
314
+ vi.useFakeTimers();
214
315
  const harness = makeHarness({
316
+ selfId: HIGH_ID,
317
+ survivorId: LOW_ID,
215
318
  coordinatorPeerId: COORDINATOR_ID,
216
- bindFailure: new Error("listen EADDRINUSE: address already in use"),
217
319
  });
218
- seedMesh(harness);
320
+ await electHolder(harness, COORDINATOR_ID, 0);
219
321
  harness.agents.set(COORDINATOR_ID, agentRecord(COORDINATOR_ID, "active"));
220
322
  await harness.lifecycle.handlePeerDeparture(COORDINATOR_ID);
323
+ expect(harness.calls.becomeCoordinator).toHaveLength(1);
221
324
  expect(harness.calls.broadcasts).toEqual([]);
222
325
  expect(harness.roomStatusNotifications).toEqual([]);
223
326
  });
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator-failover.unit.test.js","sourceRoot":"","sources":["../../src/test/coordinator-failover.unit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coordinator-failover.unit.test.js","sourceRoot":"","sources":["../../src/test/coordinator-failover.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CoordinatorRole's election behaviour (agent-comms#341) over an in-memory bus: several roles, each gossiping its claims to every other exactly as WireMeshTransport gossips them over machine-local sessions, so convergence, supersession and the no-echo rule are observable without sockets.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=coordinator-role.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator-role.unit.test.d.ts","sourceRoot":"","sources":["../../src/test/coordinator-role.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}