@serfab/cadre-core 1.6.0 → 1.8.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 (179) hide show
  1. package/README.md +8 -6
  2. package/dist/cadre-node.d.ts +548 -137
  3. package/dist/cadre-node.js +1208 -383
  4. package/dist/cadre-node.js.map +1 -1
  5. package/dist/control-authorization.d.ts +2 -2
  6. package/dist/control-authorization.js +1 -0
  7. package/dist/control-authorization.js.map +1 -1
  8. package/dist/control-cohort.d.ts +6 -0
  9. package/dist/control-cohort.js +6 -0
  10. package/dist/control-cohort.js.map +1 -1
  11. package/dist/control-database.d.ts +46 -8
  12. package/dist/control-database.js +97 -18
  13. package/dist/control-database.js.map +1 -1
  14. package/dist/control-formation-recorder.d.ts +37 -14
  15. package/dist/control-formation-recorder.js +60 -10
  16. package/dist/control-formation-recorder.js.map +1 -1
  17. package/dist/control-read-retry.d.ts +13 -12
  18. package/dist/control-read-retry.js +14 -12
  19. package/dist/control-read-retry.js.map +1 -1
  20. package/dist/control-schema.d.ts +1 -1
  21. package/dist/control-schema.js +67 -5
  22. package/dist/control-schema.js.map +1 -1
  23. package/dist/control-stream.d.ts +9 -1
  24. package/dist/control-stream.js +24 -1
  25. package/dist/control-stream.js.map +1 -1
  26. package/dist/control-write-retry.d.ts +12 -2
  27. package/dist/control-write-retry.js +13 -2
  28. package/dist/control-write-retry.js.map +1 -1
  29. package/dist/delegate-admission.d.ts +11 -8
  30. package/dist/delegate-admission.js +19 -11
  31. package/dist/delegate-admission.js.map +1 -1
  32. package/dist/diagnostics/connection-path.d.ts +0 -7
  33. package/dist/diagnostics/connection-path.js +0 -7
  34. package/dist/diagnostics/connection-path.js.map +1 -1
  35. package/dist/formation-approval.d.ts +7 -0
  36. package/dist/formation-approval.js +9 -3
  37. package/dist/formation-approval.js.map +1 -1
  38. package/dist/fs-atomic.d.ts +11 -2
  39. package/dist/fs-atomic.js +13 -3
  40. package/dist/fs-atomic.js.map +1 -1
  41. package/dist/hibernation-manager.d.ts +111 -8
  42. package/dist/hibernation-manager.js +234 -49
  43. package/dist/hibernation-manager.js.map +1 -1
  44. package/dist/index.d.ts +13 -6
  45. package/dist/index.js +27 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/joined-strand-store.d.ts +177 -0
  48. package/dist/joined-strand-store.js +431 -0
  49. package/dist/joined-strand-store.js.map +1 -0
  50. package/dist/key-store-file.js +14 -5
  51. package/dist/key-store-file.js.map +1 -1
  52. package/dist/key-store.d.ts +6 -0
  53. package/dist/key-store.js.map +1 -1
  54. package/dist/link-budget.d.ts +367 -69
  55. package/dist/link-budget.js +375 -72
  56. package/dist/link-budget.js.map +1 -1
  57. package/dist/membership-connection-gater.d.ts +30 -43
  58. package/dist/membership-connection-gater.js +31 -42
  59. package/dist/membership-connection-gater.js.map +1 -1
  60. package/dist/node-local-snapshot.d.ts +5 -4
  61. package/dist/node-local-snapshot.js +6 -3
  62. package/dist/node-local-snapshot.js.map +1 -1
  63. package/dist/peer-dial.d.ts +24 -4
  64. package/dist/peer-dial.js +74 -5
  65. package/dist/peer-dial.js.map +1 -1
  66. package/dist/peer-join-backfill.d.ts +35 -15
  67. package/dist/peer-join-backfill.js +115 -55
  68. package/dist/peer-join-backfill.js.map +1 -1
  69. package/dist/push-fanout.d.ts +6 -0
  70. package/dist/push-fanout.js +6 -0
  71. package/dist/push-fanout.js.map +1 -1
  72. package/dist/relay-reservation.d.ts +3 -1
  73. package/dist/relay-reservation.js +3 -1
  74. package/dist/relay-reservation.js.map +1 -1
  75. package/dist/relay-server.d.ts +79 -0
  76. package/dist/relay-server.js +74 -0
  77. package/dist/relay-server.js.map +1 -0
  78. package/dist/seed-bootstrap.d.ts +57 -4
  79. package/dist/seed-bootstrap.js +107 -83
  80. package/dist/seed-bootstrap.js.map +1 -1
  81. package/dist/storage-scope.d.ts +33 -17
  82. package/dist/storage-scope.js +44 -23
  83. package/dist/storage-scope.js.map +1 -1
  84. package/dist/strand-addr-protocol.d.ts +58 -21
  85. package/dist/strand-addr-protocol.js +133 -85
  86. package/dist/strand-addr-protocol.js.map +1 -1
  87. package/dist/strand-database.d.ts +20 -2
  88. package/dist/strand-database.js +42 -5
  89. package/dist/strand-database.js.map +1 -1
  90. package/dist/strand-first-sync-gate.d.ts +59 -21
  91. package/dist/strand-first-sync-gate.js +58 -19
  92. package/dist/strand-first-sync-gate.js.map +1 -1
  93. package/dist/strand-formation-deadlines.d.ts +151 -0
  94. package/dist/strand-formation-deadlines.js +171 -0
  95. package/dist/strand-formation-deadlines.js.map +1 -0
  96. package/dist/strand-formation-manager.d.ts +63 -30
  97. package/dist/strand-formation-manager.js +67 -41
  98. package/dist/strand-formation-manager.js.map +1 -1
  99. package/dist/strand-formation-protocol.d.ts +45 -35
  100. package/dist/strand-formation-protocol.js +59 -122
  101. package/dist/strand-formation-protocol.js.map +1 -1
  102. package/dist/strand-instance-manager.d.ts +152 -6
  103. package/dist/strand-instance-manager.js +331 -42
  104. package/dist/strand-instance-manager.js.map +1 -1
  105. package/dist/strand-membership-writer.d.ts +6 -0
  106. package/dist/strand-membership-writer.js +11 -0
  107. package/dist/strand-membership-writer.js.map +1 -1
  108. package/dist/strand-peer-book-file.d.ts +12 -0
  109. package/dist/strand-peer-book-file.js +37 -0
  110. package/dist/strand-peer-book-file.js.map +1 -0
  111. package/dist/strand-peer-book-protocol.d.ts +168 -0
  112. package/dist/strand-peer-book-protocol.js +356 -0
  113. package/dist/strand-peer-book-protocol.js.map +1 -0
  114. package/dist/strand-peer-book-swap.d.ts +104 -0
  115. package/dist/strand-peer-book-swap.js +284 -0
  116. package/dist/strand-peer-book-swap.js.map +1 -0
  117. package/dist/strand-peer-book.d.ts +159 -0
  118. package/dist/strand-peer-book.js +361 -0
  119. package/dist/strand-peer-book.js.map +1 -0
  120. package/dist/strand-peer-observer.d.ts +88 -0
  121. package/dist/strand-peer-observer.js +180 -0
  122. package/dist/strand-peer-observer.js.map +1 -0
  123. package/dist/strand-revocation-enforcer.js +2 -1
  124. package/dist/strand-revocation-enforcer.js.map +1 -1
  125. package/dist/strand-solicitation.d.ts +36 -20
  126. package/dist/strand-solicitation.js +4 -4
  127. package/dist/strand-solicitation.js.map +1 -1
  128. package/dist/strand-wake-protocol.d.ts +80 -23
  129. package/dist/strand-wake-protocol.js +89 -64
  130. package/dist/strand-wake-protocol.js.map +1 -1
  131. package/dist/types.d.ts +181 -33
  132. package/dist/types.js +4 -3
  133. package/dist/types.js.map +1 -1
  134. package/package.json +11 -7
  135. package/src/cadre-node.ts +1316 -398
  136. package/src/control-authorization.ts +2 -1
  137. package/src/control-cohort.ts +6 -0
  138. package/src/control-database.ts +122 -18
  139. package/src/control-formation-recorder.ts +354 -305
  140. package/src/control-read-retry.ts +14 -12
  141. package/src/control-schema.ts +67 -5
  142. package/src/control-stream.ts +25 -1
  143. package/src/control-write-retry.ts +13 -2
  144. package/src/delegate-admission.ts +23 -13
  145. package/src/diagnostics/connection-path.ts +0 -7
  146. package/src/formation-approval.ts +610 -604
  147. package/src/fs-atomic.ts +14 -4
  148. package/src/hibernation-manager.ts +638 -437
  149. package/src/index.ts +91 -6
  150. package/src/joined-strand-store.ts +498 -0
  151. package/src/key-store-file.ts +14 -5
  152. package/src/key-store.ts +6 -0
  153. package/src/link-budget.ts +393 -74
  154. package/src/membership-connection-gater.ts +31 -45
  155. package/src/node-local-snapshot.ts +293 -289
  156. package/src/peer-dial.ts +81 -7
  157. package/src/peer-join-backfill.ts +120 -57
  158. package/src/push-fanout.ts +6 -0
  159. package/src/relay-reservation.ts +3 -1
  160. package/src/relay-server.ts +98 -0
  161. package/src/seed-bootstrap.ts +133 -91
  162. package/src/storage-scope.ts +44 -23
  163. package/src/strand-addr-protocol.ts +547 -458
  164. package/src/strand-database.ts +287 -242
  165. package/src/strand-first-sync-gate.ts +58 -19
  166. package/src/strand-formation-deadlines.ts +227 -0
  167. package/src/strand-formation-manager.ts +700 -647
  168. package/src/strand-formation-protocol.ts +103 -150
  169. package/src/strand-instance-manager.ts +387 -45
  170. package/src/strand-membership-writer.ts +12 -0
  171. package/src/strand-peer-book-file.ts +39 -0
  172. package/src/strand-peer-book-protocol.ts +466 -0
  173. package/src/strand-peer-book-swap.ts +338 -0
  174. package/src/strand-peer-book.ts +475 -0
  175. package/src/strand-peer-observer.ts +235 -0
  176. package/src/strand-revocation-enforcer.ts +2 -1
  177. package/src/strand-solicitation.ts +519 -500
  178. package/src/strand-wake-protocol.ts +401 -355
  179. package/src/types.ts +185 -33
@@ -27,6 +27,32 @@ export class HibernationManager {
27
27
  * concurrent wake.
28
28
  */
29
29
  this.wakePromises = new Map();
30
+ /**
31
+ * Hibernating strands whose armed check-in a wake cancelled, held until that wake
32
+ * settles. A wake that leaves the strand hibernating again (a failed rebuild, or a probe's
33
+ * window that re-quiesced it) re-arms the chain from here ({@link rearmAfterWake}); without
34
+ * it the strand is left with no runtime and nothing scheduled to retry.
35
+ */
36
+ this.checkInsCancelledByWake = new Set();
37
+ /**
38
+ * Strands an on-demand probe (`CadreNode.serviceWake`) holds from its wake to the end of its
39
+ * window, with whether a check-in chain was armed when it began. While held, the probe's end
40
+ * ({@link endProbe}) — not the wake's settle — sets the timers, since the window may
41
+ * re-hibernate the strand after the wake settled.
42
+ */
43
+ this.probes = new Map();
44
+ /**
45
+ * Strands whose check-in is running (its timer fired, `onCheckIn` not yet returned). A
46
+ * force-hibernate or untrack removes the strand, so the run's return schedules nothing: a
47
+ * check-in already running is part of the chain those calls cancel.
48
+ */
49
+ this.runningCheckIns = new Set();
50
+ /**
51
+ * Strands whose timer-driven hibernate is running (`onHibernate` not yet returned). A
52
+ * force-hibernate, untrack or stop removes the strand, so the return starts no check-in
53
+ * chain: a force-hibernate that joins the quiesce means "keep it down".
54
+ */
55
+ this.timerHibernates = new Set();
30
56
  this.running = false;
31
57
  this.config = config;
32
58
  this.callbacks = callbacks;
@@ -69,13 +95,17 @@ export class HibernationManager {
69
95
  clearTimeout(timer);
70
96
  }
71
97
  this.timers.clear();
72
- for (const timer of this.checkInTimers.values()) {
98
+ for (const { timer } of this.checkInTimers.values()) {
73
99
  clearTimeout(timer);
74
100
  }
75
101
  this.checkInTimers.clear();
76
102
  // In-flight wakes clean themselves up via their finally; drop the references
77
103
  // so a fresh start coalesces cleanly.
78
104
  this.wakePromises.clear();
105
+ this.checkInsCancelledByWake.clear();
106
+ this.probes.clear();
107
+ this.runningCheckIns.clear();
108
+ this.timerHibernates.clear();
79
109
  log('HibernationManager stopped');
80
110
  }
81
111
  /**
@@ -111,8 +141,14 @@ export class HibernationManager {
111
141
  }
112
142
  // Cancel idle/hibernate + check-in timers BEFORE quiescing so nothing fights
113
143
  // the imperative hibernate (a stale hibernate timer firing on the quiesced
114
- // strand, or a check-in resuming a strand the caller wants kept down).
144
+ // strand, or a check-in resuming a strand the caller wants kept down) — including
145
+ // a chain an in-flight wake or probe would restore when it settles, or one a
146
+ // timer-driven hibernate still quiescing would start when it returns.
115
147
  this.clearTimers(instance.strandId);
148
+ this.checkInsCancelledByWake.delete(instance.strandId);
149
+ this.probes.delete(instance.strandId);
150
+ this.runningCheckIns.delete(instance.strandId);
151
+ this.timerHibernates.delete(instance.strandId);
116
152
  await this.callbacks.onHibernate(instance.strandId);
117
153
  log('forceHibernate: strand %s hibernated (timers cancelled, not re-armed)', instance.strandId);
118
154
  return true;
@@ -138,6 +174,10 @@ export class HibernationManager {
138
174
  */
139
175
  untrackStrand(strandId) {
140
176
  this.clearTimers(strandId);
177
+ this.checkInsCancelledByWake.delete(strandId);
178
+ this.probes.delete(strandId);
179
+ this.runningCheckIns.delete(strandId);
180
+ this.timerHibernates.delete(strandId);
141
181
  log('Untracked strand %s from hibernation', strandId);
142
182
  }
143
183
  /**
@@ -148,28 +188,15 @@ export class HibernationManager {
148
188
  return;
149
189
  const { strandId, status, latencyHint } = instance;
150
190
  instance.lastActivity = new Date();
151
- // If idle or hibernating, wake up. Coalesce so two near-simultaneous
191
+ // If idle, hibernating or on its way there, wake up. Coalesce so two near-simultaneous
152
192
  // activities don't each fire onWake (which would rebuild two libp2p nodes).
153
- if (status === 'idle' || status === 'hibernating') {
193
+ if (status === 'idle' || status === 'hibernating' || this.callbacks.isQuiescing(strandId)) {
154
194
  log('Activity on %s strand %s - waking', status, strandId);
155
- this.clearTimers(strandId);
195
+ this.clearTimersForWake(strandId);
156
196
  // Fire-and-forget; force-wake awaiters see errors, so swallow (and log)
157
- // here to avoid an unhandled rejection on this best-effort path.
158
- //
159
- // Once the wake settles (CadreNode rebuilds the runtime and marks the
160
- // strand `active`), re-arm the idle→hibernate→check-in cycle. Without this
161
- // a strand that wakes then goes quiet stays `active` forever and never
162
- // re-hibernates — so the check-in backoff could never restart at base.
163
- // Guarded on `active` so a wake that did not transition (a coalesced
164
- // no-op, or a still-mid-flight rebuild) never arms a stray timer.
165
- void this.beginWake(strandId).then(() => {
166
- if (this.running && instance.status === 'active') {
167
- const timeouts = this.getTimeouts(instance.latencyHint);
168
- if (timeouts.idleTimeout !== Infinity) {
169
- this.scheduleIdleTransition(instance);
170
- }
171
- }
172
- }).catch((err) => {
197
+ // here to avoid an unhandled rejection on this best-effort path. The wake's
198
+ // settle re-arms the timers for the state it leaves (see beginWake).
199
+ void this.beginWake(instance).catch((err) => {
173
200
  log('Activity-driven wake failed for strand %s: %o', strandId, err);
174
201
  });
175
202
  return;
@@ -183,19 +210,59 @@ export class HibernationManager {
183
210
  }
184
211
  }
185
212
  /**
186
- * Force wake a hibernating strand
213
+ * Force-wake a strand (an explicit or peer-sent wake). Works whether or not hibernation is
214
+ * enabled; once the wake settles the strand has the timers its resulting state calls for
215
+ * ({@link rearmAfterWake}).
187
216
  */
188
- async wakeStrand(strandId) {
189
- this.clearTimers(strandId);
190
- await this.beginWake(strandId);
217
+ async wakeStrand(instance) {
218
+ this.clearTimersForWake(instance.strandId);
219
+ await this.beginWake(instance);
220
+ }
221
+ /**
222
+ * Wake a strand for an on-demand probe (`CadreNode.serviceWake`), holding it until
223
+ * {@link endProbe}: the probe's window runs after the wake settles and may re-hibernate the
224
+ * strand, so the wake's settle arms nothing. Records whether a check-in chain was armed —
225
+ * or already cancelled by a wake this one joins — so the end can restore it.
226
+ */
227
+ async probeWake(instance) {
228
+ const { strandId } = instance;
229
+ const hadCheckInChain = this.checkInTimers.has(strandId) || this.checkInsCancelledByWake.has(strandId);
230
+ this.probes.set(strandId, { hadCheckInChain });
231
+ this.clearTimersForWake(strandId);
232
+ await this.beginWake(instance);
233
+ }
234
+ /**
235
+ * End a probe begun by {@link probeWake}, success or failure: arm the timers the strand's
236
+ * state now calls for. A probe never creates a check-in chain, only restores one it
237
+ * interrupted. No-op when the probe is no longer held (a force-hibernate or untrack during
238
+ * it means "keep it down"). A wake that began during the probe's window — activity during
239
+ * its closing quiesce, say — is still rebuilding the strand, so it takes the chain and its
240
+ * settle decides.
241
+ */
242
+ endProbe(instance) {
243
+ const { strandId } = instance;
244
+ const probe = this.probes.get(strandId);
245
+ if (!probe)
246
+ return;
247
+ this.probes.delete(strandId);
248
+ if (this.wakePromises.has(strandId)) {
249
+ if (probe.hadCheckInChain) {
250
+ this.checkInsCancelledByWake.add(strandId);
251
+ }
252
+ return;
253
+ }
254
+ this.rearmAfterWake(instance, probe.hadCheckInChain);
191
255
  }
192
256
  /**
193
257
  * Begin a wake for a strand, or coalesce with one already in flight. Ensures
194
258
  * `onWake` runs at most once per concurrent wake — the returned promise is
195
259
  * shared by all overlapping callers and cleared once it settles. Force-wake
196
- * callers await it; activity-driven callers fire-and-forget.
260
+ * callers await it; activity-driven callers fire-and-forget. Success or failure,
261
+ * the settle re-arms the strand's timers (unless a probe holds it), and a failure
262
+ * then rejects.
197
263
  */
198
- beginWake(strandId) {
264
+ beginWake(instance) {
265
+ const { strandId } = instance;
199
266
  const existing = this.wakePromises.get(strandId);
200
267
  if (existing) {
201
268
  return existing;
@@ -205,12 +272,53 @@ export class HibernationManager {
205
272
  await this.callbacks.onWake(strandId);
206
273
  }
207
274
  finally {
208
- this.wakePromises.delete(strandId);
275
+ this.settleWake(instance);
209
276
  }
210
277
  })();
211
278
  this.wakePromises.set(strandId, wake);
212
279
  return wake;
213
280
  }
281
+ settleWake(instance) {
282
+ const { strandId } = instance;
283
+ const hadCheckInChain = this.checkInsCancelledByWake.delete(strandId);
284
+ this.wakePromises.delete(strandId);
285
+ if (!this.probes.has(strandId)) {
286
+ this.rearmAfterWake(instance, hadCheckInChain);
287
+ }
288
+ }
289
+ /**
290
+ * {@link clearTimers} for a wake, first remembering an armed check-in so a wake that leaves
291
+ * the strand hibernating can restore the chain. Only an ARMED chain is remembered: a strand
292
+ * force-hibernated without one (the mobile background path) must not gain one from a wake,
293
+ * and a check-in that is mid-run hands its chain to the wake when it returns
294
+ * ({@link handCheckInChainToHolder}).
295
+ */
296
+ clearTimersForWake(strandId) {
297
+ if (this.checkInTimers.has(strandId)) {
298
+ this.checkInsCancelledByWake.add(strandId);
299
+ }
300
+ this.clearTimers(strandId);
301
+ }
302
+ /**
303
+ * Leave a strand whose wake (or probe) settled with the timers its state calls for: the idle
304
+ * countdown if it is live, or — if it reads `hibernating` again (a failed rebuild, or a probe
305
+ * window that re-quiesced it) — the check-in chain it had before, at the base delay. A
306
+ * strand that had no chain gains none, and one in any other state gets nothing.
307
+ */
308
+ rearmAfterWake(instance, hadCheckInChain) {
309
+ if (!this.config.enabled || !this.running)
310
+ return;
311
+ if (instance.status === 'hibernating') {
312
+ // A hibernating strand has no idle countdown, e.g. one activity armed mid-probe.
313
+ this.clearTimer(instance.strandId);
314
+ if (hadCheckInChain) {
315
+ log('Wake of strand %s left it hibernating; restoring its check-in chain', instance.strandId);
316
+ this.scheduleCheckIn(instance);
317
+ }
318
+ return;
319
+ }
320
+ this.rearmIdleIfLive(instance);
321
+ }
214
322
  scheduleIdleTransition(instance) {
215
323
  const { strandId, latencyHint } = instance;
216
324
  const timeouts = this.getTimeouts(latencyHint);
@@ -258,22 +366,39 @@ export class HibernationManager {
258
366
  // Transition to hibernating. onHibernate now releases strand-network
259
367
  // resources (quiesce), so its close()/stop() can reject — catch so a failed
260
368
  // hibernate logs instead of producing an unhandled rejection.
369
+ this.timerHibernates.add(strandId);
261
370
  void this.callbacks.onHibernate(strandId).then(() => {
262
- // Schedule periodic check-ins
263
- const timeouts = this.getTimeouts(latencyHint);
264
- if (timeouts.checkInInterval !== Infinity) {
265
- this.scheduleCheckIn(instance);
371
+ if (!this.timerHibernates.delete(strandId)) {
372
+ log('Hibernate of strand %s was force-hibernated or untracked meanwhile; no check-in chain', strandId);
373
+ return;
374
+ }
375
+ if (this.getTimeouts(latencyHint).checkInInterval !== Infinity) {
376
+ this.startCheckInChain(instance);
266
377
  }
267
378
  }).catch((err) => {
379
+ this.timerHibernates.delete(strandId);
268
380
  log('onHibernate failed for strand %s: %o', strandId, err);
269
381
  });
270
382
  }
383
+ /**
384
+ * Start the check-in chain of a strand the timer path just hibernated. A wake or probe that
385
+ * landed during the quiesce holds the strand and takes the chain instead
386
+ * ({@link handCheckInChainToHolder}); one that already settled left it live with its idle
387
+ * countdown, and a live strand gets no chain.
388
+ */
389
+ startCheckInChain(instance) {
390
+ if (this.handCheckInChainToHolder(instance))
391
+ return;
392
+ if (instance.status === 'hibernating') {
393
+ this.scheduleCheckIn(instance);
394
+ }
395
+ }
271
396
  /**
272
397
  * Arm the next check-in for a hibernating strand. Each call is a single-shot
273
398
  * `setTimeout` (not a fixed `setInterval`) so the period escalates per
274
399
  * {@link runCheckIn} and a slow `onCheckIn` never overlaps the next tick.
275
400
  *
276
- * `delay` is omitted by the chain start ({@link handleHibernateTimeout}),
401
+ * `delay` is omitted by a chain start ({@link startCheckInChain}, or a wake restoring one),
277
402
  * defaulting to the base `checkInInterval` — which is why backoff naturally
278
403
  * resets to base each fresh hibernation cycle, with no per-strand counter to
279
404
  * clear on wake. Subsequent ticks pass the escalated, capped delay.
@@ -282,15 +407,15 @@ export class HibernationManager {
282
407
  const { strandId, latencyHint } = instance;
283
408
  const timeouts = this.getTimeouts(latencyHint);
284
409
  const currentDelay = delay ?? timeouts.checkInInterval;
285
- // Replace any existing check-in timer (no-op if the firing timer rescheduled us).
286
- const existing = this.checkInTimers.get(strandId);
287
- if (existing) {
288
- clearTimeout(existing);
289
- }
410
+ // Replace any existing check-in timer.
411
+ this.clearCheckInTimer(strandId);
290
412
  const timer = setTimeout(() => {
413
+ // Only ARMED check-ins stay in the map, so a wake during this run does not take it
414
+ // for a chain to restore (see clearTimersForWake) — the run hands it over on return.
415
+ this.checkInTimers.delete(strandId);
291
416
  void this.runCheckIn(instance, currentDelay);
292
417
  }, currentDelay);
293
- this.checkInTimers.set(strandId, timer);
418
+ this.checkInTimers.set(strandId, { timer, instance });
294
419
  instance.nextCheckIn = new Date(Date.now() + currentDelay);
295
420
  }
296
421
  /**
@@ -298,10 +423,12 @@ export class HibernationManager {
298
423
  * sync window → re-hibernate-if-idle cycle in `CadreNode`) and AWAIT it before
299
424
  * deciding the next step.
300
425
  *
426
+ * - If a force-hibernate, untrack or stop cancelled the chain while it ran, stop.
427
+ * - If a wake or probe holds the strand, hand the chain to it
428
+ * ({@link handCheckInChainToHolder}).
301
429
  * - If the strand woke during the check-in (`onCheckIn` left it non-
302
- * `hibernating`), stop the chain — the activity path has re-armed the
303
- * idle/hibernate timers, and the next hibernation restarts the chain at the
304
- * base delay (backoff reset).
430
+ * `hibernating`), stop the chain and restart the idle countdown; the next
431
+ * hibernation restarts the chain at the base delay (backoff reset).
305
432
  * - Otherwise escalate the delay by `checkInBackoffFactor`, capped at
306
433
  * `checkInMaxInterval`, and reschedule.
307
434
  */
@@ -310,6 +437,7 @@ export class HibernationManager {
310
437
  if (!this.running)
311
438
  return;
312
439
  log('Check-in for hibernating strand %s (delay=%dms)', strandId, currentDelay);
440
+ this.runningCheckIns.add(strandId);
313
441
  try {
314
442
  await this.callbacks.onCheckIn(strandId);
315
443
  }
@@ -318,22 +446,74 @@ export class HibernationManager {
318
446
  // fall through to reschedule the next, longer-delayed attempt.
319
447
  log('onCheckIn failed for strand %s: %o', strandId, err);
320
448
  }
321
- if (!this.running)
449
+ if (!this.runningCheckIns.delete(strandId) || !this.running) {
450
+ log('Check-in chain of strand %s was cancelled while it ran; not rescheduling', strandId);
451
+ instance.nextCheckIn = undefined;
452
+ return;
453
+ }
454
+ if (this.handCheckInChainToHolder(instance))
322
455
  return;
323
456
  // The check-in either woke the strand (CadreNode left it active) or left it
324
457
  // hibernating. Inspect the shared instance the callback just mutated.
325
458
  if (instance.status !== 'hibernating') {
326
459
  log('Check-in woke strand %s; backoff resets on next hibernation', strandId);
327
- this.checkInTimers.delete(strandId);
460
+ this.clearCheckInTimer(strandId);
328
461
  // The chain is stopping; drop the now-stale next-check-in advertisement so
329
462
  // `getStrand` doesn't report a phantom check-in for a strand that is awake.
330
463
  instance.nextCheckIn = undefined;
464
+ this.rearmIdleIfLive(instance);
331
465
  return;
332
466
  }
333
467
  const timeouts = this.getTimeouts(latencyHint);
334
468
  const nextDelay = Math.min(currentDelay * timeouts.checkInBackoffFactor, timeouts.checkInMaxInterval);
335
469
  this.scheduleCheckIn(instance, nextDelay);
336
470
  }
471
+ /**
472
+ * Give a check-in chain — a returning check-in's, or the one the timer path starts
473
+ * ({@link startCheckInChain}) — to a wake or probe that holds the strand, as if that
474
+ * wake had cancelled an armed check-in: its settle ({@link settleWake}) or end
475
+ * ({@link endProbe}) restores the chain at the base delay if the strand ends `hibernating`,
476
+ * and starts the idle countdown if it ends live. The status the check-in left says nothing
477
+ * yet: a check-in that failed before its rebuild leaves the strand to a wake still building
478
+ * it (`starting`), and one that ends `hibernating` may be overtaken by a wake still in
479
+ * flight. Deciding here would drop the chain if that wake then fails, or leave a check-in
480
+ * armed on a strand it brings up.
481
+ *
482
+ * @returns whether a wake or probe took the chain.
483
+ */
484
+ handCheckInChainToHolder(instance) {
485
+ const { strandId } = instance;
486
+ const probe = this.probes.get(strandId);
487
+ if (probe) {
488
+ probe.hadCheckInChain = true;
489
+ }
490
+ else if (this.wakePromises.has(strandId)) {
491
+ this.checkInsCancelledByWake.add(strandId);
492
+ }
493
+ else {
494
+ return false;
495
+ }
496
+ log('Strand %s: a wake holds it, so the wake decides its check-in chain', strandId);
497
+ this.clearCheckInTimer(strandId);
498
+ instance.nextCheckIn = undefined;
499
+ return true;
500
+ }
501
+ /**
502
+ * Start the idle countdown for a strand a check-in or wake left live. Activity recorded
503
+ * while the runtime was still rebuilding found the strand neither idle nor active, so it
504
+ * armed nothing — without this the strand would stay up until the next activity. Only for
505
+ * a live status: a strand stopped or failed mid-rebuild must not gain a timer chain. Nor
506
+ * one being quiesced: it reads live until the quiesce ends, e.g. a force-hibernate queued
507
+ * behind the rebuild of the wake settling now, and the countdown would later idle the
508
+ * quiesced strand and start a check-in chain the caller meant to keep off.
509
+ */
510
+ rearmIdleIfLive(instance) {
511
+ const live = (instance.status === 'active' || instance.status === 'syncing')
512
+ && !this.callbacks.isQuiescing(instance.strandId);
513
+ if (live && this.getTimeouts(instance.latencyHint).idleTimeout !== Infinity) {
514
+ this.scheduleIdleTransition(instance);
515
+ }
516
+ }
337
517
  clearTimer(strandId) {
338
518
  const timer = this.timers.get(strandId);
339
519
  if (timer) {
@@ -341,14 +521,19 @@ export class HibernationManager {
341
521
  this.timers.delete(strandId);
342
522
  }
343
523
  }
344
- clearTimers(strandId) {
345
- this.clearTimer(strandId);
346
- const checkInTimer = this.checkInTimers.get(strandId);
347
- if (checkInTimer) {
348
- clearTimeout(checkInTimer);
524
+ clearCheckInTimer(strandId) {
525
+ const pending = this.checkInTimers.get(strandId);
526
+ if (pending) {
527
+ clearTimeout(pending.timer);
349
528
  this.checkInTimers.delete(strandId);
529
+ // `getStrand` must not advertise a check-in that is no longer scheduled.
530
+ pending.instance.nextCheckIn = undefined;
350
531
  }
351
532
  }
533
+ clearTimers(strandId) {
534
+ this.clearTimer(strandId);
535
+ this.clearCheckInTimer(strandId);
536
+ }
352
537
  /**
353
538
  * Get the current status of hibernation tracking
354
539
  */
@@ -1 +1 @@
1
- {"version":3,"file":"hibernation-manager.js","sourceRoot":"","sources":["../src/hibernation-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hibernation-manager.js","sourceRoot":"","sources":["../src/hibernation-manager.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,11 @@ export { MemoryTrustedOwnerStore, PersistentTrustedOwnerStore, type TrustedOwner
13
13
  export type { DurableSlot } from './node-local-snapshot.js';
14
14
  export { MemoryBootstrapPeerStore, PersistentBootstrapPeerStore, type BootstrapPeerStore, type BootstrapPeerEntry } from './bootstrap-peer-store.js';
15
15
  export { MemoryEnrolledMachineStore, PersistentEnrolledMachineStore, type EnrolledMachineStore } from './enrolled-machine-store.js';
16
+ export { MemoryJoinedStrandStore, KeyStoreJoinedStrandStore, type JoinedStrandStore, type JoinedStrandRecord } from './joined-strand-store.js';
17
+ export { MemoryStrandPeerBookStore, PersistentStrandPeerBookStore, mergeStrandPeerEntry, sanitizeStrandPeerEntry, strandPeerFreshness, MAX_STRAND_PEERS, STRAND_PEER_MAX_AGE_MS, type StrandPeerBookStore, type StrandPeerBookOptions, type StrandPeerEntry } from './strand-peer-book.js';
18
+ export { StrandPeerObserver, dialableAddrs, connectedIdentifiedPeers, STRAND_PEER_OBSERVE_THROTTLE_MS, type StrandPeerObservation, type StrandPeerObserverDeps, type StrandPeerObserverOptions, type ConnectedIdentifiedPeer } from './strand-peer-observer.js';
19
+ export { STRAND_PEER_BOOK_PROTOCOL, SIGNED_STRAND_PEER_ENTRY_VERSION, STRAND_PEER_ISSUED_AT_SKEW_MS, MAX_BOOK_FRAME_SIZE, StrandPeerBookService, exchangeStrandPeerBook, signStrandPeerEntry, signedStrandPeerEntryPayload, verifySignedStrandPeerEntry, verifyStrandPeerBookFrame, trimBookFrameToFit, assertBookFrameFits, type SignedStrandPeerEntry, type StrandPeerBookFrame, type StrandPeerEntryVerdict, type StrandPeerBookServiceDeps, type ExchangeStrandPeerBookOptions } from './strand-peer-book-protocol.js';
20
+ export { StrandPeerBookSwap, STRAND_PEER_BOOK_SWAP_THROTTLE_MS, OWN_ENTRY_RESIGN_DEBOUNCE_MS, type StrandPeerBookSwapDeps, type StrandPeerBookSwapOptions } from './strand-peer-book-swap.js';
16
21
  export { controlStorageScope, isControlStorageScope, isValidStrandScopeKey, assertStrandScopeKey, InvalidStrandIdError } from './storage-scope.js';
17
22
  export { StrandDatabase, type StrandDatabaseConfig } from './strand-database.js';
18
23
  export { StrandWatcher, type StrandWatcherCallbacks, type StrandQueryable, type SAppIdLookup, type StrandRowWithApp } from './strand-watcher.js';
@@ -25,7 +30,7 @@ export { defaultTimeoutScheduler, type TimeoutScheduler } from './timeout-schedu
25
30
  export { HibernationManager, type HibernationCallbacks } from './hibernation-manager.js';
26
31
  export { ArachnodeStub, createArachnodeStub, type RingConfig } from './arachnode-stub.js';
27
32
  export { EnrollmentService, type MemberVerifier, type MemberRegistry } from './enrollment.js';
28
- export { StrandSolicitationService, createDefaultFormationResponseValidator, type DisclosureValidator, type FormationUsageRecorder, type ResolvedHostStrand, type StrandProvisioner, type FormationResponseValidator, type StrandSolicitationServiceOptions } from './strand-solicitation.js';
33
+ export { StrandSolicitationService, createDefaultFormationResponseValidator, type DisclosureValidator, type FormationUsageRecorder, type FormationUsageParams, type AuthorizedFormationUsage, type ResolvedHostStrand, type StrandProvisioner, type FormationResponseValidator, type StrandSolicitationServiceOptions } from './strand-solicitation.js';
29
34
  export { createHttpFormationApprover, signFormationApproval, verifyFormationApproval, FormationApprovalError, type FormationApprovalRequest, type FormationVouchFields, type FormationApproval, type FormationApprover, type FormationApprovalFailure } from './formation-approval.js';
30
35
  export { ControlFormationUsageRecorder } from './control-formation-recorder.js';
31
36
  export { generateStrandMemberKey, strandMemberKeyPair } from './strand-member-key.js';
@@ -35,7 +40,7 @@ export { StrandMemberRegistry, StrandMemberVerifier, memberRegistrationPayload,
35
40
  export { SeedBootstrapService, SEED_PROTOCOL, ed25519PublicKeyB64FromPeerId, type SeedBootstrapConfig, type SeedEventCallbacks } from './seed-bootstrap.js';
36
41
  export { peerAuthorizationDigest, cadrePeerVoucherDigest, cadrePeerRemoveDigest, deviceTokenAddDigest, deviceTokenRemoveDigest, formationConsentDigest, verifyPeerAuthorization, verifyCadrePeerVoucher, verifyFormationConsent, type DeviceTokenAuthorizedRow } from './peer-authorization.js';
37
42
  export { StrandWakeService, dialWake, WAKE_PROTOCOL, DEFAULT_WAKE_DIAL_BUDGET_MS, type StrandWakeServiceOptions, type DialWakeOptions } from './strand-wake-protocol.js';
38
- export { StrandAddrService, collectStrandAddrs, STRAND_ADDR_PROTOCOL, type StrandAddrServiceOptions, type StrandAddrPeer, type CollectStrandAddrsOptions } from './strand-addr-protocol.js';
43
+ export { StrandAddrService, collectStrandAddrs, STRAND_ADDR_PROTOCOL, type StrandAddrServiceOptions, type StrandAddrPeer, type CollectStrandAddrsOptions, type StrandAddrOutcome, type StrandAddrCollection } from './strand-addr-protocol.js';
39
44
  export { peerRecordSignedPayload, signPeerRecord, verifyPeerRecordSignature, isPeerRecordFresh, isSignalingAddr, orderSignalingFirst, withTrailingPeerId, currentMemberTrustPolicy, DEFAULT_PEER_RECORD_MAX_AGE_MS, DEFAULT_PEER_RECORD_HEARTBEAT_MS } from './peer-record.js';
40
45
  export { deviceTokenSignedPayload, signDeviceTokenRecord, verifyDeviceTokenSignature, isPushPlatform } from './device-token.js';
41
46
  export { STRAND_WAKE_TYPE, type StrandWakePayload } from './strand-wake-payload.js';
@@ -43,14 +48,16 @@ export type { PushNotifier, PushMessage, PushSendResult } from './push-notifier.
43
48
  export { validatePushCredentials, redactPushCredentials, REDACTED } from './push-credentials.js';
44
49
  export { PushFanoutService, DEFAULT_PUSH_COOLDOWN_MS, DEFAULT_PUSH_DEBOUNCE_MS, type PushFanoutOptions, type FanoutMember } from './push-fanout.js';
45
50
  export { selectControlCohortDials, DEFAULT_CONTROL_COHORT_RECONCILE_MS, DEFAULT_CONTROL_COHORT_TARGET_DEGREE, type ControlCohortSelection, type ControlCohortReconcileResult } from './control-cohort.js';
46
- export { dialPeerAddrs, tryAddrsInTurn, directBeforeRelayed, DEFAULT_CONTROL_COHORT_DIAL_TIMEOUT_MS, DEFAULT_CONTROL_COHORT_PER_ADDRESS_DIAL_TIMEOUT_MS, CONTROL_COHORT_DIAL_ADDRESS_ATTEMPTS, DEFAULT_PEER_DIAL_BUDGET, type PeerDialBudget, type AddrDialer } from './peer-dial.js';
47
- export { DECLARED_LINK_ROUND_TRIP_MS, RELAYED_DIAL_ROUND_TRIPS, RELAY_RESERVATION_ROUND_TRIPS, CIRCUIT_REQUEST_ROUND_TRIPS, PUSH_TRANSFER_ALLOWANCE_MS, resolveLinkRoundTripMs, relayedDialBudgetMs, connectionManagerTimeouts, relayReservationBudgetMs, circuitRequestBudgetMs, peerJoinPushBudget, type PeerJoinPushBudget } from './link-budget.js';
51
+ export { dialPeerAddrs, SelfRelayOnlyError, tryAddrsInTurn, directBeforeRelayed, DEFAULT_CONTROL_COHORT_DIAL_TIMEOUT_MS, DEFAULT_CONTROL_COHORT_PER_ADDRESS_DIAL_TIMEOUT_MS, CONTROL_COHORT_DIAL_ADDRESS_ATTEMPTS, DEFAULT_PEER_DIAL_BUDGET, type PeerDialBudget, type AddrDialer } from './peer-dial.js';
52
+ export { DECLARED_LINK_ROUND_TRIP_MS, RELAYED_DIAL_ROUND_TRIPS, RELAY_RESERVATION_ROUND_TRIPS, CIRCUIT_REQUEST_ROUND_TRIPS, RELAYED_REQUEST_ROUND_TRIPS, PUSH_TRANSFER_ALLOWANCE_MS, ADMISSION_DECISION_TIMEOUT_MS, resolveLinkRoundTripMs, relayedDialBudgetMs, relayReservationBudgetMs, circuitRequestBudgetMs, relayedRequestBudgetMs, peerJoinPushBudget, type PeerJoinPushBudget } from './link-budget.js';
48
53
  export { anchoredTrustPolicy, pinnedKeyTrustPolicy, tofuTrustPolicy, type SeedTrustPolicy, type SeedTrustContext, type SeedTrustDecision } from './seed-trust-policy.js';
49
54
  export { signSchema, verifySchema, assertSchemaSignature, SchemaVerificationError } from './schema-verification.js';
50
55
  export { FormationListener, dialFormation, isValidResponderCreatesResult, isWellFormedMembershipInvite, sanitizeStrandAddrs, FORMATION_PROTOCOL, type FormationParty, type FormationContactMessage, type FormationResultMessage, type FormationProvisionResult, type FormationStrandInfo, type FormationDbConnectionInfo, type FormationListenerOptions, type FormationDialOptions, type FormationDialResult, type ResponderProvisionOutcome } from './strand-formation-protocol.js';
51
- export { StrandFormationManager, createStrandFormationManager, MEMBERSHIP_INVITE_TTL_MS, MEMBERSHIP_INVITE_UNAVAILABLE_REASON, HOST_STRAND_MUST_BE_RECREATED_REASON, type StrandFormationManagerConfig, type StrandFormationManagerOptions } from './strand-formation-manager.js';
52
- export { createMembershipConnectionGater, STRANGER_OPEN_PROTOCOLS, DEFAULT_ENROLLMENT_WINDOW_MS, ADMISSION_DECISION_TIMEOUT_MS, RELAY_ADMISSION_RESERVE_DEADLINE_MS, RELAY_ADMISSION_CLOSE_TIMEOUT_MS, MAX_UNAUTHORIZED_RELAY_RESERVATIONS, UNAUTHORIZED_RESERVATION_TTL_MS, UnauthorizedReservationBudget, type InboundAdmissionPolicy, type InboundConnectionVerdict } from './membership-connection-gater.js';
56
+ export { formationDeadlines, type FormationDeadlines } from './strand-formation-deadlines.js';
57
+ export { StrandFormationManager, createStrandFormationManager, MEMBERSHIP_INVITE_TTL_MS, MEMBERSHIP_INVITE_UNAVAILABLE_REASON, HOST_STRAND_MUST_BE_RECREATED_REASON, type MembershipInviteIssuer, type StrandFormationManagerConfig, type StrandFormationManagerOptions } from './strand-formation-manager.js';
58
+ export { createMembershipConnectionGater, STRANGER_OPEN_PROTOCOLS, DEFAULT_ENROLLMENT_WINDOW_MS, RELAY_ADMISSION_RESERVE_DEADLINE_MS, RELAY_ADMISSION_CLOSE_TIMEOUT_MS, MAX_UNAUTHORIZED_RELAY_RESERVATIONS, UnauthorizedReservationBudget, type InboundAdmissionPolicy, type InboundConnectionVerdict } from './membership-connection-gater.js';
53
59
  export { RelayReservationFailedError, UnbindableListenAddressError, RELAY_SEARCH_LISTEN_ADDR, resolveListenAddrs } from './relay-addrs.js';
54
60
  export { strandNodeAddrs, type StrandNodeAddrs } from './strand-network-config.js';
61
+ export { resolveRelayServer, PARTY_RELAY_MAX_RESERVATIONS, PARTY_RELAY_RESERVATION_TTL_MS, type ResolvedRelayServer, type ResolvedRelayReservations } from './relay-server.js';
55
62
  export { circuitMultiaddrs, superviseRelayReservation, DEFAULT_RELAY_RESERVE_TIMEOUT_MS, DEFAULT_RELAY_RESERVE_POLL_MS, DEFAULT_RELAY_CHECK_MS, DEFAULT_RELAY_MIN_BACKOFF_MS, DEFAULT_RELAY_MAX_BACKOFF_MS, type RelayReservationStatus, type RelayReservationState, type RelayReserveOptions, type RelayReservationSupervisor, type RelayReservationSupervisorOptions } from './relay-reservation.js';
56
63
  export { classifyTransport, classifyConnectionPath, summarizeConnectionPaths, emptyConnectionPathSummary, DEFAULT_SETTLE_WINDOW_MS, type ConnectionPathKind, type ConnectionTransport, type ConnectionPath, type ConnectionPathSummary, type ConnectionLike } from './diagnostics/connection-path.js';
package/dist/index.js CHANGED
@@ -49,10 +49,27 @@ export { MemoryBootstrapPeerStore, PersistentBootstrapPeerStore } from './bootst
49
49
  // DIVERGES from theirs (an unreadable slot cold-starts rather than throwing) —
50
50
  // see the module comment before unifying the three.
51
51
  export { MemoryEnrolledMachineStore, PersistentEnrolledMachineStore } from './enrolled-machine-store.js';
52
+ // Node-local record of the strands this node joined from ANOTHER party and has not yet
53
+ // published party-wide, re-offered on every start as `strand:discovered`.
54
+ // Cross-platform: its durable form rides the KeyStore seam above (the record carries a
55
+ // closed strand's read secret), so there is no file-backed subpath.
56
+ export { MemoryJoinedStrandStore, KeyStoreJoinedStrandStore } from './joined-strand-store.js';
57
+ // Node-local strand peer book: per strand, the strand peers this node has met and
58
+ // their last-known addresses, dialed first on every launch so a restarted machine
59
+ // re-finds the other parties. Same cross-platform split as the bootstrap-peer store
60
+ // above — interface + in-memory + slot-backed stores here, Node-only file backend
61
+ // behind the subpath '@serfab/cadre-core/strand-peer-book-file'.
62
+ export { MemoryStrandPeerBookStore, PersistentStrandPeerBookStore, mergeStrandPeerEntry, sanitizeStrandPeerEntry, strandPeerFreshness, MAX_STRAND_PEERS, STRAND_PEER_MAX_AGE_MS } from './strand-peer-book.js';
63
+ export { StrandPeerObserver, dialableAddrs, connectedIdentifiedPeers, STRAND_PEER_OBSERVE_THROTTLE_MS } from './strand-peer-observer.js';
64
+ // The signed book SWAP between strand peers (`/sereus/strand-peers/1.0.0`): the wire
65
+ // protocol, signing and verification, and the per-strand driver that arms it.
66
+ export { STRAND_PEER_BOOK_PROTOCOL, SIGNED_STRAND_PEER_ENTRY_VERSION, STRAND_PEER_ISSUED_AT_SKEW_MS, MAX_BOOK_FRAME_SIZE, StrandPeerBookService, exchangeStrandPeerBook, signStrandPeerEntry, signedStrandPeerEntryPayload, verifySignedStrandPeerEntry, verifyStrandPeerBookFrame, trimBookFrameToFit, assertBookFrameFits } from './strand-peer-book-protocol.js';
67
+ export { StrandPeerBookSwap, STRAND_PEER_BOOK_SWAP_THROTTLE_MS, OWN_ENTRY_RESIGN_DEBOUNCE_MS } from './strand-peer-book-swap.js';
52
68
  // Storage scope keys — what `CadreNodeConfig.storage.provider` is called with. A
53
69
  // strand's key is its strand id; the control database's key carries the party id,
54
70
  // so two parties on one device never share a control store. Every key stays within
55
- // `[A-Za-z0-9._-]`: the control key by base64url encoding, a strand's by
71
+ // `[a-z0-9._-]` — lowercase, so distinct keys stay distinct on a case-insensitive
72
+ // filesystem: the control key by lowercase hex encoding, a strand's by
56
73
  // `assertStrandScopeKey`, which every strand launch runs.
57
74
  export { controlStorageScope, isControlStorageScope, isValidStrandScopeKey, assertStrandScopeKey, InvalidStrandIdError } from './storage-scope.js';
58
75
  // Strand database
@@ -115,7 +132,7 @@ export { peerAuthorizationDigest, cadrePeerVoucherDigest, cadrePeerRemoveDigest,
115
132
  // Strand Wake (control-network push-wake protocol)
116
133
  export { StrandWakeService, dialWake, WAKE_PROTOCOL, DEFAULT_WAKE_DIAL_BUDGET_MS } from './strand-wake-protocol.js';
117
134
  // Strand Address (control-network strand-address RPC) — wire types come via
118
- // `export * from './types.js'` (StrandAddrRequest / StrandAddrResponse).
135
+ // `export * from './types.js'` (StrandAddrRequest / StrandAddrResponse / StrandAddrStatus).
119
136
  export { StrandAddrService, collectStrandAddrs, STRAND_ADDR_PROTOCOL } from './strand-addr-protocol.js';
120
137
  // Peer-address record (self-published, signed, freshness-stamped CadrePeer row)
121
138
  export { peerRecordSignedPayload, signPeerRecord, verifyPeerRecordSignature, isPeerRecordFresh, isSignalingAddr, orderSignalingFirst, withTrailingPeerId, currentMemberTrustPolicy, DEFAULT_PEER_RECORD_MAX_AGE_MS, DEFAULT_PEER_RECORD_HEARTBEAT_MS } from './peer-record.js';
@@ -136,20 +153,21 @@ export { PushFanoutService, DEFAULT_PUSH_COOLDOWN_MS, DEFAULT_PUSH_DEBOUNCE_MS }
136
153
  export { selectControlCohortDials, DEFAULT_CONTROL_COHORT_RECONCILE_MS, DEFAULT_CONTROL_COHORT_TARGET_DEGREE } from './control-cohort.js';
137
154
  // Dialing one peer from several candidate addresses, each under its own time
138
155
  // limit, so an address that never answers cannot starve the rest.
139
- export { dialPeerAddrs, tryAddrsInTurn, directBeforeRelayed, DEFAULT_CONTROL_COHORT_DIAL_TIMEOUT_MS, DEFAULT_CONTROL_COHORT_PER_ADDRESS_DIAL_TIMEOUT_MS, CONTROL_COHORT_DIAL_ADDRESS_ATTEMPTS, DEFAULT_PEER_DIAL_BUDGET } from './peer-dial.js';
156
+ export { dialPeerAddrs, SelfRelayOnlyError, tryAddrsInTurn, directBeforeRelayed, DEFAULT_CONTROL_COHORT_DIAL_TIMEOUT_MS, DEFAULT_CONTROL_COHORT_PER_ADDRESS_DIAL_TIMEOUT_MS, CONTROL_COHORT_DIAL_ADDRESS_ATTEMPTS, DEFAULT_PEER_DIAL_BUDGET } from './peer-dial.js';
140
157
  // Dial and reservation budgets counted in link round trips rather than fixed milliseconds, so
141
158
  // one declared assumption about the link moves them all — see `NetworkConfig.linkRoundTripMs`.
142
- export { DECLARED_LINK_ROUND_TRIP_MS, RELAYED_DIAL_ROUND_TRIPS, RELAY_RESERVATION_ROUND_TRIPS, CIRCUIT_REQUEST_ROUND_TRIPS, PUSH_TRANSFER_ALLOWANCE_MS, resolveLinkRoundTripMs, relayedDialBudgetMs, connectionManagerTimeouts, relayReservationBudgetMs, circuitRequestBudgetMs, peerJoinPushBudget } from './link-budget.js';
159
+ export { DECLARED_LINK_ROUND_TRIP_MS, RELAYED_DIAL_ROUND_TRIPS, RELAY_RESERVATION_ROUND_TRIPS, CIRCUIT_REQUEST_ROUND_TRIPS, RELAYED_REQUEST_ROUND_TRIPS, PUSH_TRANSFER_ALLOWANCE_MS, ADMISSION_DECISION_TIMEOUT_MS, resolveLinkRoundTripMs, relayedDialBudgetMs, relayReservationBudgetMs, circuitRequestBudgetMs, relayedRequestBudgetMs, peerJoinPushBudget } from './link-budget.js';
143
160
  // Seed trust policy (trust anchor for incoming seeds)
144
161
  export { anchoredTrustPolicy, pinnedKeyTrustPolicy, tofuTrustPolicy } from './seed-trust-policy.js';
145
162
  // Schema Verification
146
163
  export { signSchema, verifySchema, assertSchemaSignature, SchemaVerificationError } from './schema-verification.js';
147
164
  // Strand Formation transport (native cadre-core protocol)
148
165
  export { FormationListener, dialFormation, isValidResponderCreatesResult, isWellFormedMembershipInvite, sanitizeStrandAddrs, FORMATION_PROTOCOL } from './strand-formation-protocol.js';
166
+ export { formationDeadlines } from './strand-formation-deadlines.js';
149
167
  // Strand Formation manager (drives the native transport)
150
168
  export { StrandFormationManager, createStrandFormationManager, MEMBERSHIP_INVITE_TTL_MS, MEMBERSHIP_INVITE_UNAVAILABLE_REASON, HOST_STRAND_MUST_BE_RECREATED_REASON } from './strand-formation-manager.js';
151
169
  // Control-network inbound connection gate (membership defense-in-depth)
152
- export { createMembershipConnectionGater, STRANGER_OPEN_PROTOCOLS, DEFAULT_ENROLLMENT_WINDOW_MS, ADMISSION_DECISION_TIMEOUT_MS, RELAY_ADMISSION_RESERVE_DEADLINE_MS, RELAY_ADMISSION_CLOSE_TIMEOUT_MS, MAX_UNAUTHORIZED_RELAY_RESERVATIONS, UNAUTHORIZED_RESERVATION_TTL_MS, UnauthorizedReservationBudget } from './membership-connection-gater.js';
170
+ export { createMembershipConnectionGater, STRANGER_OPEN_PROTOCOLS, DEFAULT_ENROLLMENT_WINDOW_MS, RELAY_ADMISSION_RESERVE_DEADLINE_MS, RELAY_ADMISSION_CLOSE_TIMEOUT_MS, MAX_UNAUTHORIZED_RELAY_RESERVATIONS, UnauthorizedReservationBudget } from './membership-connection-gater.js';
153
171
  // Thrown out of `CadreNode.start()` when a `network.relayAddrs` reservation does
154
172
  // not land on its first attempt — the fail-fast posture of that config field now
155
173
  // that the control node reserves AFTER control-database bring-up (relay-addrs.ts).
@@ -165,6 +183,10 @@ export { createMembershipConnectionGater, STRANGER_OPEN_PROTOCOLS, DEFAULT_ENROL
165
183
  // spelling.
166
184
  export { RelayReservationFailedError, UnbindableListenAddressError, RELAY_SEARCH_LISTEN_ADDR, resolveListenAddrs } from './relay-addrs.js';
167
185
  export { strandNodeAddrs } from './strand-network-config.js';
186
+ // The circuit-relay SERVER a node runs, and with which init — one resolution shared by the
187
+ // control node and every strand node. Exported alongside the listen derivations above for the
188
+ // same reason: an embedder can assert on what its `network` block resolves to.
189
+ export { resolveRelayServer, PARTY_RELAY_MAX_RESERVATIONS, PARTY_RELAY_RESERVATION_TTL_MS } from './relay-server.js';
168
190
  // Relay reservation via the bare `/p2p-circuit` search listener — the one route
169
191
  // every control node takes; `network.relayAddrs` is its fail-fast posture
170
192
  // (see relay-reservation.ts)