@serfab/cadre-core 1.9.0 → 1.11.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 (119) hide show
  1. package/dist/cadre-node.d.ts +148 -44
  2. package/dist/cadre-node.js +363 -139
  3. package/dist/cadre-node.js.map +1 -1
  4. package/dist/control-authorization.d.ts +2 -2
  5. package/dist/control-authorization.js +1 -0
  6. package/dist/control-authorization.js.map +1 -1
  7. package/dist/control-cohort.d.ts +1 -1
  8. package/dist/control-cohort.js +1 -1
  9. package/dist/control-database.d.ts +105 -14
  10. package/dist/control-database.js +242 -73
  11. package/dist/control-database.js.map +1 -1
  12. package/dist/control-formation-recorder.d.ts +6 -6
  13. package/dist/control-formation-recorder.js +7 -8
  14. package/dist/control-formation-recorder.js.map +1 -1
  15. package/dist/control-schema.d.ts +1 -1
  16. package/dist/control-schema.js +1066 -979
  17. package/dist/control-schema.js.map +1 -1
  18. package/dist/control-write-retry.d.ts +21 -15
  19. package/dist/control-write-retry.js +21 -15
  20. package/dist/control-write-retry.js.map +1 -1
  21. package/dist/diagnostics/connection-path.d.ts +1 -18
  22. package/dist/diagnostics/connection-path.js +1 -20
  23. package/dist/diagnostics/connection-path.js.map +1 -1
  24. package/dist/identity-key.d.ts +0 -30
  25. package/dist/identity-key.js +7 -40
  26. package/dist/identity-key.js.map +1 -1
  27. package/dist/index.d.ts +8 -5
  28. package/dist/index.js +12 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/invitation-bootstrap.d.ts +32 -0
  31. package/dist/invitation-bootstrap.js +30 -0
  32. package/dist/invitation-bootstrap.js.map +1 -0
  33. package/dist/link-budget.d.ts +204 -119
  34. package/dist/link-budget.js +208 -120
  35. package/dist/link-budget.js.map +1 -1
  36. package/dist/membership-connection-gater.d.ts +3 -3
  37. package/dist/membership-connection-gater.js +3 -3
  38. package/dist/peer-dial.d.ts +18 -14
  39. package/dist/peer-dial.js +18 -14
  40. package/dist/peer-dial.js.map +1 -1
  41. package/dist/peer-join-backfill.d.ts +3 -3
  42. package/dist/pending-join-runner.d.ts +186 -0
  43. package/dist/pending-join-runner.js +649 -0
  44. package/dist/pending-join-runner.js.map +1 -0
  45. package/dist/push-fanout.d.ts +1 -1
  46. package/dist/push-fanout.js +1 -1
  47. package/dist/relay-stun.d.ts +24 -0
  48. package/dist/relay-stun.js +51 -0
  49. package/dist/relay-stun.js.map +1 -0
  50. package/dist/seed-bootstrap.d.ts +2 -2
  51. package/dist/seed-bootstrap.js +5 -5
  52. package/dist/strand-addr-protocol.js +2 -2
  53. package/dist/strand-formation-deadlines.d.ts +5 -5
  54. package/dist/strand-formation-deadlines.js +5 -5
  55. package/dist/strand-formation-manager.d.ts +18 -4
  56. package/dist/strand-formation-manager.js +48 -33
  57. package/dist/strand-formation-manager.js.map +1 -1
  58. package/dist/strand-formation-protocol.d.ts +71 -14
  59. package/dist/strand-formation-protocol.js +222 -47
  60. package/dist/strand-formation-protocol.js.map +1 -1
  61. package/dist/strand-formation-rejection.d.ts +94 -0
  62. package/dist/strand-formation-rejection.js +77 -0
  63. package/dist/strand-formation-rejection.js.map +1 -0
  64. package/dist/strand-instance-manager.js +4 -1
  65. package/dist/strand-instance-manager.js.map +1 -1
  66. package/dist/strand-membership-writer.js +32 -32
  67. package/dist/strand-solicitation.d.ts +11 -3
  68. package/dist/strand-solicitation.js +9 -0
  69. package/dist/strand-solicitation.js.map +1 -1
  70. package/dist/types.d.ts +103 -17
  71. package/dist/types.js +5 -9
  72. package/dist/types.js.map +1 -1
  73. package/package.json +22 -22
  74. package/src/cadre-node.ts +8654 -8400
  75. package/src/control-authorization.ts +2 -1
  76. package/src/control-cohort.ts +128 -128
  77. package/src/control-database.ts +303 -82
  78. package/src/control-formation-recorder.ts +353 -354
  79. package/src/control-read-retry.ts +216 -216
  80. package/src/control-schema.ts +1078 -991
  81. package/src/control-write-retry.ts +567 -561
  82. package/src/diagnostics/connection-path.ts +1 -29
  83. package/src/formation-approval.ts +610 -610
  84. package/src/hibernation-manager.ts +638 -638
  85. package/src/identity-key.ts +7 -62
  86. package/src/index.ts +644 -627
  87. package/src/invitation-bootstrap.ts +40 -0
  88. package/src/joined-strand-store.ts +498 -498
  89. package/src/link-budget.ts +684 -583
  90. package/src/membership-connection-gater.ts +570 -570
  91. package/src/node-local-snapshot.ts +298 -298
  92. package/src/peer-dial.ts +315 -311
  93. package/src/peer-join-backfill.ts +710 -710
  94. package/src/pending-join-runner.ts +735 -0
  95. package/src/push-fanout.ts +1 -1
  96. package/src/relay-reservation.ts +1121 -1121
  97. package/src/relay-server.ts +98 -98
  98. package/src/relay-stun.ts +58 -0
  99. package/src/seed-bootstrap.ts +1448 -1448
  100. package/src/strand-addr-protocol.ts +547 -547
  101. package/src/strand-database.ts +287 -287
  102. package/src/strand-first-sync-gate.ts +391 -391
  103. package/src/strand-formation-deadlines.ts +227 -227
  104. package/src/strand-formation-manager.ts +725 -700
  105. package/src/strand-formation-protocol.ts +1036 -802
  106. package/src/strand-formation-rejection.ts +129 -0
  107. package/src/strand-fret-addrs.ts +145 -145
  108. package/src/strand-instance-manager.ts +1789 -1786
  109. package/src/strand-membership-writer.ts +1974 -1974
  110. package/src/strand-network-state-file.ts +40 -40
  111. package/src/strand-network-state.ts +243 -243
  112. package/src/strand-revocation-enforcer.ts +654 -654
  113. package/src/strand-solicitation.ts +532 -519
  114. package/src/strand-wake-protocol.ts +401 -401
  115. package/src/types.ts +2222 -2140
  116. package/dist/diagnostics/webrtc-turn-tracker.d.ts +0 -50
  117. package/dist/diagnostics/webrtc-turn-tracker.js +0 -196
  118. package/dist/diagnostics/webrtc-turn-tracker.js.map +0 -1
  119. package/src/diagnostics/webrtc-turn-tracker.ts +0 -222
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { Libp2p } from '@libp2p/interface';
21
21
  import type { StrandFormationDisclosure, StrandMembershipInvite } from './types.js';
22
+ import { type FormationRejectionCode } from './strand-formation-rejection.js';
22
23
  /** Protocol id for the native formation transport (parallel to `/sereus/seed/1.0.0`). */
23
24
  export declare const FORMATION_PROTOCOL = "/sereus/formation/1.0.0";
24
25
  /**
25
- * Rejection reason for an invitation that cannot be redeemed at all — unknown, expired, or
26
- * fully spent. Shared with `StrandFormationManager`, which reports an
27
- * `InvitationExhaustedError` (an invite spent out from under a redemption already in flight)
28
- * with this SAME wording on purpose: a joiner that lost the race must be indistinguishable
29
- * from a non-racing latecomer, so the two sites must never drift apart.
26
+ * Rejection reason for an invitation that cannot be redeemed — unknown here
27
+ * (`'token-unknown'`), or expired or fully spent (`'token-spent'`); the code tells them
28
+ * apart. Shared with `StrandFormationManager`, which reports an `InvitationExhaustedError`
29
+ * (an invite spent out from under a redemption already in flight) with this SAME wording and
30
+ * code on purpose: a joiner that lost the race must be indistinguishable from a non-racing
31
+ * latecomer, so the two sites must never drift apart.
30
32
  */
31
33
  export declare const INVALID_TOKEN_REASON = "Invalid token";
32
34
  export type FormationParty = 'initiator' | 'responder';
@@ -72,9 +74,23 @@ export interface FormationProvisionResult {
72
74
  export type ResponderProvisionOutcome = {
73
75
  approved: true;
74
76
  result: FormationProvisionResult;
75
- } | {
77
+ } | FormationRejection;
78
+ /**
79
+ * A refusal as the responder sends it: never without a code. Carries nothing else — no
80
+ * identity, addresses or keys — so a rejection discloses nothing about the responder.
81
+ */
82
+ export interface FormationRejection {
76
83
  approved: false;
84
+ code: FormationRejectionCode;
85
+ /** Human-facing text for logs; joiners branch on `code`. */
77
86
  reason: string;
87
+ }
88
+ /** What the responder's token check yields; an invalid token names which way it failed. */
89
+ export type FormationTokenCheck = {
90
+ valid: true;
91
+ } | {
92
+ valid: false;
93
+ code: Extract<FormationRejectionCode, 'token-unknown' | 'token-spent'>;
78
94
  };
79
95
  /** Initiator → Responder: carries the real token + disclosure + initiator cadre. */
80
96
  export interface FormationContactMessage {
@@ -102,7 +118,13 @@ export interface FormationContactMessage {
102
118
  /** Responder → Initiator: responder identity/cadre disclosed only after validation. */
103
119
  export interface FormationResultMessage {
104
120
  approved: boolean;
105
- /** Present iff `approved === false`. */
121
+ /**
122
+ * Why the responder refused; present iff `approved === false`. Optional on this wire type
123
+ * only because a frame from another version may omit it — the responder always sends one
124
+ * ({@link FormationRejection}), and the joiner reads a missing one as `'unrecognized'`.
125
+ */
126
+ code?: FormationRejectionCode;
127
+ /** Human-facing text; present iff `approved === false`. */
106
128
  reason?: string;
107
129
  /** Responder's real party id (disclosed only after validation). */
108
130
  partyId?: string;
@@ -162,10 +184,8 @@ export declare function isWellFormedMembershipInvite(value: unknown): value is S
162
184
  */
163
185
  export declare function isValidResponderCreatesResult(response: FormationResultMessage): boolean;
164
186
  export interface FormationListenerOptions {
165
- /** Validate the invitation token; returns whether it is valid. */
166
- validateToken(token: string): Promise<{
167
- valid: boolean;
168
- }>;
187
+ /** Validate the invitation token; an invalid one says whether it is unknown here or spent. */
188
+ validateToken(token: string): Promise<FormationTokenCheck>;
169
189
  /** Validate the initiator's disclosure with the REAL token + disclosure. */
170
190
  validateDisclosure(token: string, disclosure: StrandFormationDisclosure): Promise<boolean>;
171
191
  /**
@@ -268,8 +288,10 @@ export declare class FormationListener {
268
288
  * ({@link formationDeadlines}), which is exactly what runs after the insert attempt passes
269
289
  * its abort check, so at that link the late outcome lands inside it.
270
290
  *
271
- * NOTE: a commit that outlasts even the derived grace (a link slower than declared, or a
272
- * configured `provisionTimeoutMs` whose half-cap shrank the grace) still tells the joiner
291
+ * NOTE: a commit that outlasts even the derived grace (a link slower than declared, a
292
+ * configured `provisionTimeoutMs` whose half-cap shrank the grace, or a commit phase that
293
+ * re-picks an unanswering coordinator, which Optimystic lets run to its transaction budget,
294
+ * 170 s at the default declared link) still tells the joiner
273
295
  * 'timed out' while its one-time invite is in fact spent, and since every retry mints a
274
296
  * fresh keypair no recovery path can match it. Nothing can un-spend an append-only row, so
275
297
  * the late-settle logging below is the observability for it; if it is seen in the wild,
@@ -302,7 +324,21 @@ export declare class FormationListener {
302
324
  export interface FormationDialOptions {
303
325
  /** The contact message to send (real token, partyId, disclosure, initiator cadre). */
304
326
  contact: FormationContactMessage;
305
- /** Responder multiaddrs to dial. */
327
+ /**
328
+ * Responder multiaddrs to dial, normally the invitation's bootstrap list. Every entry that
329
+ * parses is tried, in the order libp2p's default address sorter picks (loopback last, then
330
+ * public before private, then circuit after direct), until one connects, all under one
331
+ * dial-connect budget (`dialTimeoutMs`); an entry that does not parse is skipped.
332
+ *
333
+ * {@link dialFormation} dials ONE machine, so every entry must name the same trailing peer
334
+ * id (or none). An invitation names several machines of the inviting party; hand it to
335
+ * {@link dialFormationByMachine}, which splits the list by trailing peer id, drops entries
336
+ * that name no peer, and runs one {@link dialFormation} session per machine, in the order
337
+ * each machine first appears. Each session keeps its own deadline ladder, so a machine that
338
+ * cannot be dialled costs one `dialTimeoutMs` and one that accepts the contact and then
339
+ * stalls costs up to one `sessionTimeoutMs`; `CadreNode.createOpenInvitation` names at most
340
+ * four machines.
341
+ */
306
342
  responderAddrs: string[];
307
343
  /** Validate the responder's result; a false return aborts the formation. */
308
344
  validateResponse(response: FormationResultMessage): Promise<boolean>;
@@ -350,5 +386,26 @@ export interface FormationDialResult {
350
386
  * contact (carrying the real disclosure/token/cadre), validates the responder's
351
387
  * result, and returns the strand the responder provisioned plus the responder's
352
388
  * strand-network addresses (see {@link FormationDialResult}).
389
+ *
390
+ * Throws {@link FormationUnreachableError} for every failure before a result frame is read
391
+ * (including the session deadline passing first), {@link FormationRejectedError} when the
392
+ * responder refuses, and a plain `Error` for an approval that fails validation.
353
393
  */
354
394
  export declare function dialFormation(node: Libp2p, options: FormationDialOptions): Promise<FormationDialResult>;
395
+ /**
396
+ * Initiator side for a whole invitation: one {@link dialFormation} session per machine of the
397
+ * inviting party the bootstrap list names (see {@link FormationDialOptions.responderAddrs}), in
398
+ * order, until one approves.
399
+ *
400
+ * A machine that cannot be reached, or that refuses retryably, hands over to the next. A final
401
+ * refusal, or an approval that fails validation, is thrown at once: another machine of the
402
+ * same party would answer the same, and an approval may already have spent the invitation.
403
+ * With no machine left, throws the last retryable refusal when any machine answered (the party
404
+ * is reachable but not ready, which says more than "unreachable"), otherwise one
405
+ * {@link FormationUnreachableError} naming each machine's failure.
406
+ *
407
+ * Every session sends the SAME contact. `FormationUsage` is keyed by the contact's
408
+ * `usageStampId`, so at most one machine of the inviting party can record this redemption,
409
+ * even when one the joiner gave up on was still committing it.
410
+ */
411
+ export declare function dialFormationByMachine(node: Libp2p, options: FormationDialOptions): Promise<FormationDialResult>;
@@ -26,16 +26,19 @@ import { verifyFormationConsent } from './peer-authorization.js';
26
26
  // seed-bootstrap imports neither this protocol nor the manager/solicitation layers,
27
27
  // so this import introduces no cycle.
28
28
  import { ed25519PublicKeyB64FromPeerId } from './seed-bootstrap.js';
29
+ import { trailingPeerId } from './peer-record.js';
29
30
  import { formationDeadlines, resolveProvisionTimeoutMs, responderClampReserveMs, splitProvisionBudget } from './strand-formation-deadlines.js';
31
+ import { FormationRejectedError, FormationUnreachableError } from './strand-formation-rejection.js';
30
32
  const log = debug('sereus:cadre:formation-proto');
31
33
  /** Protocol id for the native formation transport (parallel to `/sereus/seed/1.0.0`). */
32
34
  export const FORMATION_PROTOCOL = '/sereus/formation/1.0.0';
33
35
  /**
34
- * Rejection reason for an invitation that cannot be redeemed at all — unknown, expired, or
35
- * fully spent. Shared with `StrandFormationManager`, which reports an
36
- * `InvitationExhaustedError` (an invite spent out from under a redemption already in flight)
37
- * with this SAME wording on purpose: a joiner that lost the race must be indistinguishable
38
- * from a non-racing latecomer, so the two sites must never drift apart.
36
+ * Rejection reason for an invitation that cannot be redeemed — unknown here
37
+ * (`'token-unknown'`), or expired or fully spent (`'token-spent'`); the code tells them
38
+ * apart. Shared with `StrandFormationManager`, which reports an `InvitationExhaustedError`
39
+ * (an invite spent out from under a redemption already in flight) with this SAME wording and
40
+ * code on purpose: a joiner that lost the race must be indistinguishable from a non-racing
41
+ * latecomer, so the two sites must never drift apart.
39
42
  */
40
43
  export const INVALID_TOKEN_REASON = 'Invalid token';
41
44
  /** Maximum formation message size (1MB). */
@@ -259,7 +262,7 @@ export class FormationListener {
259
262
  }
260
263
  async handleStream(stream) {
261
264
  if (this.activeSessions >= this.maxConcurrentSessions) {
262
- const rejection = { approved: false, reason: 'Too many concurrent formation sessions' };
265
+ const rejection = { approved: false, code: 'busy', reason: 'Too many concurrent formation sessions' };
263
266
  try {
264
267
  writeFrame(stream, rejection);
265
268
  }
@@ -325,8 +328,10 @@ export class FormationListener {
325
328
  * ({@link formationDeadlines}), which is exactly what runs after the insert attempt passes
326
329
  * its abort check, so at that link the late outcome lands inside it.
327
330
  *
328
- * NOTE: a commit that outlasts even the derived grace (a link slower than declared, or a
329
- * configured `provisionTimeoutMs` whose half-cap shrank the grace) still tells the joiner
331
+ * NOTE: a commit that outlasts even the derived grace (a link slower than declared, a
332
+ * configured `provisionTimeoutMs` whose half-cap shrank the grace, or a commit phase that
333
+ * re-picks an unanswering coordinator, which Optimystic lets run to its transaction budget,
334
+ * 170 s at the default declared link) still tells the joiner
330
335
  * 'timed out' while its one-time invite is in fact spent, and since every retry mints a
331
336
  * fresh keypair no recovery path can match it. Nothing can un-spend an append-only row, so
332
337
  * the late-settle logging below is the observability for it; if it is seen in the wild,
@@ -424,30 +429,31 @@ export class FormationListener {
424
429
  const contact = await withTimeout(this.awaitContactMs, `Formation await-contact#${id}`, () => reader.read());
425
430
  log('formation session #%d contact: token=%s party=%s', id, contact.token, contact.partyId);
426
431
  if (!this.isJoinerConsentValid(id, contact)) {
427
- send({ approved: false, reason: 'Invalid joiner consent' });
432
+ send({ approved: false, code: 'consent-invalid', reason: 'Invalid joiner consent' });
428
433
  return;
429
434
  }
430
435
  const tokenResult = await this.options.validateToken(contact.token);
431
436
  if (!tokenResult.valid) {
432
- send({ approved: false, reason: INVALID_TOKEN_REASON });
437
+ send({ approved: false, code: tokenResult.code, reason: INVALID_TOKEN_REASON });
433
438
  return;
434
439
  }
435
440
  const disclosureOk = await this.options.validateDisclosure(contact.token, contact.disclosure);
436
441
  if (!disclosureOk) {
437
- send({ approved: false, reason: 'Invalid disclosure' });
442
+ send({ approved: false, code: 'disclosure-invalid', reason: 'Invalid disclosure' });
438
443
  return;
439
444
  }
440
445
  const outcome = await this.provision(id, contact);
441
446
  if (!outcome) {
442
447
  // Reported as its own retryable reason rather than falling through to the generic
443
448
  // catch below, which would report the misleading 'Internal formation error'.
444
- send({ approved: false, reason: 'Formation provisioning timed out' });
449
+ send({ approved: false, code: 'provisioning-timeout', reason: 'Formation provisioning timed out' });
445
450
  return;
446
451
  }
447
452
  if (!outcome.approved) {
448
- // A post-validation rejection still discloses NEITHER identity NOR cadre,
449
- // exactly like the token/disclosure rejections above.
450
- send({ approved: false, reason: outcome.reason });
453
+ // A post-validation rejection still discloses NEITHER identity NOR cadre, exactly
454
+ // like the token/disclosure rejections above — copied field by field so nothing else
455
+ // a hook put on its outcome reaches the wire.
456
+ send({ approved: false, code: outcome.code, reason: outcome.reason });
451
457
  return;
452
458
  }
453
459
  // Validation + provisioning passed → safe to disclose responder identity/cadre.
@@ -472,7 +478,7 @@ export class FormationListener {
472
478
  // log + close. Re-throw either way so the failure is still recorded — this is a
473
479
  // deliberate, logged conversion, not silent.
474
480
  if (!wroteFrame) {
475
- const internalError = { approved: false, reason: 'Internal formation error' };
481
+ const internalError = { approved: false, code: 'internal', reason: 'Internal formation error' };
476
482
  try {
477
483
  writeFrame(stream, internalError);
478
484
  }
@@ -492,58 +498,227 @@ export class FormationListener {
492
498
  * `exchangeFrame` (`control-stream.ts`) gives a stream dialed past its deadline. A late
493
499
  * rejection is the abort itself, or reaches the caller through the awaited copy, so the
494
500
  * handler below only stops it being reported as unhandled.
501
+ *
502
+ * NOTE: libp2p tries `addrs` one after another, and they all share this one dial budget. Its
503
+ * per-address limit (`addressDialTimeout`: ten link round trips plus two admission decisions, as
504
+ * `optimysticDialLimits` states it) is longer than `dialTimeoutMs` (`formationDeadlines().dialMs`:
505
+ * five round trips plus one decision) at every declaration, so it never cuts off an address
506
+ * inside this dial. An address that hangs without answering (a black-holed relay host) uses the
507
+ * whole budget, and the join moves on to the party's next machine
508
+ * ({@link dialFormationByMachine}) rather than to this machine's next address; an address that is
509
+ * refused fails fast and still hands over to the next. A budget per address here would overrun
510
+ * the session or shrink the await-response budget ({@link formationDeadlines}). If joins through a
511
+ * hung first address are seen in practice, give each address a sub-budget or dial them in parallel.
495
512
  */
496
- function openFormationStream(node, addr, protocolId, dialTimeoutMs) {
497
- return withDeadline(dialTimeoutMs, 'Formation dial-connect', (signal) => {
498
- const pending = node.dialProtocol(addr, protocolId, { signal });
513
+ function openFormationStream(node, addrs, protocolId, dialTimeoutMs) {
514
+ return withDeadline(dialTimeoutMs, 'Formation dial-connect', async (signal) => {
515
+ const pending = node.dialProtocol(addrs, protocolId, { signal });
499
516
  void pending.then((stream) => {
500
517
  if (signal.aborted) {
501
518
  stream.abort(new Error('Formation dial-connect resolved after its deadline'));
502
519
  }
503
520
  }, () => { });
504
- return pending;
521
+ try {
522
+ return await pending;
523
+ }
524
+ catch (error) {
525
+ throw describeAllAddressesFailed(error);
526
+ }
505
527
  });
506
528
  }
529
+ const NO_RESPONDER_ADDRS = 'No responder addresses available for formation';
530
+ /**
531
+ * Parse the responder addresses, skipping any entry that does not parse: the list comes from
532
+ * a stranger's invitation, and one bad entry must not fail an otherwise good list. Entries
533
+ * naming different peers are left for libp2p to refuse; {@link dialFormationByMachine} hands
534
+ * this one machine's addresses at a time.
535
+ */
536
+ function parseResponderAddrs(addrs) {
537
+ const parsed = [];
538
+ for (const addr of addrs) {
539
+ const ma = parseResponderAddr(addr);
540
+ if (ma)
541
+ parsed.push(ma);
542
+ }
543
+ if (parsed.length === 0) {
544
+ throw new FormationUnreachableError(NO_RESPONDER_ADDRS);
545
+ }
546
+ return parsed;
547
+ }
548
+ function parseResponderAddr(addr) {
549
+ try {
550
+ return multiaddr(addr);
551
+ }
552
+ catch (error) {
553
+ log('responderAddrs: skipping unparsable entry: %o', error);
554
+ return null;
555
+ }
556
+ }
557
+ /**
558
+ * Split the responder addresses by the machine each reaches (its trailing peer id), keeping
559
+ * the order in which each machine first appears. An entry that does not parse, or names no
560
+ * peer, is dropped: every address an inviter mints (`getMultiaddrs()`, `resolvePeerAddrs`)
561
+ * names its machine, and libp2p refuses one dial that mixes named and unnamed addresses.
562
+ */
563
+ function groupResponderAddrsByMachine(addrs) {
564
+ const machines = new Map();
565
+ for (const addr of addrs) {
566
+ const ma = parseResponderAddr(addr);
567
+ if (!ma)
568
+ continue;
569
+ const peerId = trailingPeerId(ma);
570
+ if (!peerId) {
571
+ log('responderAddrs: skipping %s — it names no machine', addr);
572
+ continue;
573
+ }
574
+ const group = machines.get(peerId);
575
+ if (group)
576
+ group.push(addr);
577
+ else
578
+ machines.set(peerId, [addr]);
579
+ }
580
+ return [...machines].map(([peerId, group]) => ({ peerId, addrs: group }));
581
+ }
582
+ /**
583
+ * Worth asking the next machine of the inviting party: it could not be reached, or it answered
584
+ * with a refusal a sibling may not repeat (the invitation not replicated to it yet, the host
585
+ * strand not running there, …). A final refusal is the party's answer, not one machine's.
586
+ */
587
+ function shouldTryNextMachine(error) {
588
+ return error instanceof FormationUnreachableError || (error instanceof FormationRejectedError && error.retryable);
589
+ }
590
+ /**
591
+ * Every machine failed without a refusal. A single machine's error already names each address
592
+ * it tried, so it is thrown as is; several are restated as one error naming each machine.
593
+ */
594
+ function noMachineReached(failures) {
595
+ if (failures.length === 1)
596
+ return failures[0].error;
597
+ const errors = failures.map((failure) => failure.error);
598
+ return new FormationUnreachableError(`Formation could not reach any of the inviter's ${failures.length} machines: ` +
599
+ failures.map((failure) => `${failure.peerId}: ${failure.error.message}`).join('; '), { cause: new AggregateError(errors, 'Every inviting machine was unreachable') });
600
+ }
601
+ /**
602
+ * libp2p reports a dial in which every address failed as `AggregateError('All multiaddr dials
603
+ * failed')`, which names none of them; restate it with each address's own error, which names
604
+ * its host and port. A dial that tried only one address already surfaces that address's own
605
+ * error, so anything else passes through unchanged.
606
+ */
607
+ function describeAllAddressesFailed(error) {
608
+ if (!(error instanceof AggregateError))
609
+ return error;
610
+ const reasons = error.errors.map((reason) => reason instanceof Error ? reason.message : String(reason));
611
+ return new FormationUnreachableError(`Formation could not reach the inviter at any of the ${reasons.length} addresses tried: ${reasons.join('; ')}`, { cause: error });
612
+ }
613
+ /** Report a failure that came before any answer as {@link FormationUnreachableError}, keeping its message. */
614
+ function asUnreachable(error) {
615
+ if (error instanceof FormationUnreachableError)
616
+ return error;
617
+ return new FormationUnreachableError(error instanceof Error ? error.message : String(error), { cause: error });
618
+ }
619
+ /**
620
+ * Open the formation stream, send the contact, and read back the one result frame, closing
621
+ * the stream either way. Nothing here has an answer from the responder yet, so the caller
622
+ * reports any failure as {@link FormationUnreachableError} — a frame too large or not JSON
623
+ * included, since it is not an answer either.
624
+ */
625
+ async function exchangeContact(node, addrs, contact, budgets) {
626
+ const stream = await openFormationStream(node, addrs, budgets.protocolId, budgets.dialTimeoutMs);
627
+ try {
628
+ const reader = new FrameReader(stream);
629
+ writeFrame(stream, contact);
630
+ return await withTimeout(budgets.awaitResponseMs, 'Formation await-response', () => reader.read());
631
+ }
632
+ finally {
633
+ try {
634
+ await stream.close();
635
+ }
636
+ catch { /* ignore */ }
637
+ }
638
+ }
639
+ /**
640
+ * Turn the responder's answer into the dial's result. A refusal throws
641
+ * {@link FormationRejectedError}; an approval that fails validation throws a plain `Error`,
642
+ * since that is a misbehaving responder rather than a refusal.
643
+ */
644
+ async function acceptResult(response, validateResponse) {
645
+ if (!response.approved) {
646
+ throw new FormationRejectedError(response.code, response.reason);
647
+ }
648
+ if (!(await validateResponse(response)))
649
+ throw new Error('Responder result failed validation');
650
+ if (!response.provisionResult)
651
+ throw new Error('Missing provision result for responderCreates mode');
652
+ // Sanitized HERE — the wire boundary — so nothing above this call ever handles an
653
+ // unvalidated, unbounded address list from a remote peer.
654
+ return { provision: response.provisionResult, strandAddrs: sanitizeStrandAddrs(response.strandAddrs) };
655
+ }
507
656
  /**
508
657
  * Initiator side of the native formation protocol. Dials the responder, sends the
509
658
  * contact (carrying the real disclosure/token/cadre), validates the responder's
510
659
  * result, and returns the strand the responder provisioned plus the responder's
511
660
  * strand-network addresses (see {@link FormationDialResult}).
661
+ *
662
+ * Throws {@link FormationUnreachableError} for every failure before a result frame is read
663
+ * (including the session deadline passing first), {@link FormationRejectedError} when the
664
+ * responder refuses, and a plain `Error` for an approval that fails validation.
512
665
  */
513
666
  export async function dialFormation(node, options) {
514
- if (options.responderAddrs.length === 0) {
515
- throw new Error('No responder addresses available for formation');
516
- }
667
+ const addrs = parseResponderAddrs(options.responderAddrs);
517
668
  const protocolId = options.protocolId ?? FORMATION_PROTOCOL;
518
669
  const deadlines = formationDeadlines(options.linkRoundTripMs);
519
670
  const sessionTimeoutMs = options.sessionTimeoutMs ?? deadlines.sessionMs;
520
671
  const dialTimeoutMs = options.dialTimeoutMs ?? deadlines.dialMs;
521
- const provisionTimeoutMs = resolveProvisionTimeoutMs(options.provisionTimeoutMs, deadlines.initiatorAwaitResponseMs, sessionTimeoutMs, dialTimeoutMs, 'dialFormation');
522
- const addr = multiaddr(options.responderAddrs[0]);
523
- return withTimeout(sessionTimeoutMs, 'Formation dial', async () => {
524
- const stream = await openFormationStream(node, addr, protocolId, dialTimeoutMs);
672
+ const awaitResponseMs = resolveProvisionTimeoutMs(options.provisionTimeoutMs, deadlines.initiatorAwaitResponseMs, sessionTimeoutMs, dialTimeoutMs, 'dialFormation');
673
+ let answered = false;
674
+ try {
675
+ return await withTimeout(sessionTimeoutMs, 'Formation dial', async () => {
676
+ const response = await exchangeContact(node, addrs, options.contact, { protocolId, dialTimeoutMs, awaitResponseMs });
677
+ answered = true;
678
+ return await acceptResult(response, options.validateResponse);
679
+ });
680
+ }
681
+ catch (error) {
682
+ throw answered ? error : asUnreachable(error);
683
+ }
684
+ }
685
+ /**
686
+ * Initiator side for a whole invitation: one {@link dialFormation} session per machine of the
687
+ * inviting party the bootstrap list names (see {@link FormationDialOptions.responderAddrs}), in
688
+ * order, until one approves.
689
+ *
690
+ * A machine that cannot be reached, or that refuses retryably, hands over to the next. A final
691
+ * refusal, or an approval that fails validation, is thrown at once: another machine of the
692
+ * same party would answer the same, and an approval may already have spent the invitation.
693
+ * With no machine left, throws the last retryable refusal when any machine answered (the party
694
+ * is reachable but not ready, which says more than "unreachable"), otherwise one
695
+ * {@link FormationUnreachableError} naming each machine's failure.
696
+ *
697
+ * Every session sends the SAME contact. `FormationUsage` is keyed by the contact's
698
+ * `usageStampId`, so at most one machine of the inviting party can record this redemption,
699
+ * even when one the joiner gave up on was still committing it.
700
+ */
701
+ export async function dialFormationByMachine(node, options) {
702
+ const machines = groupResponderAddrsByMachine(options.responderAddrs);
703
+ if (machines.length === 0) {
704
+ throw new FormationUnreachableError(NO_RESPONDER_ADDRS);
705
+ }
706
+ const unreached = [];
707
+ let refusal;
708
+ for (const machine of machines) {
525
709
  try {
526
- const reader = new FrameReader(stream);
527
- writeFrame(stream, options.contact);
528
- const response = await withTimeout(provisionTimeoutMs, 'Formation await-response', () => reader.read());
529
- if (!response.approved) {
530
- throw new Error(`Formation rejected: ${response.reason ?? 'no reason provided'}`);
531
- }
532
- const ok = await options.validateResponse(response);
533
- if (!ok)
534
- throw new Error('Responder result failed validation');
535
- if (!response.provisionResult)
536
- throw new Error('Missing provision result for responderCreates mode');
537
- // Sanitized HERE — the wire boundary — so nothing above this call ever handles an
538
- // unvalidated, unbounded address list from a remote peer.
539
- return { provision: response.provisionResult, strandAddrs: sanitizeStrandAddrs(response.strandAddrs) };
710
+ return await dialFormation(node, { ...options, responderAddrs: machine.addrs });
540
711
  }
541
- finally {
542
- try {
543
- await stream.close();
544
- }
545
- catch { /* ignore */ }
712
+ catch (error) {
713
+ if (!shouldTryNextMachine(error))
714
+ throw error;
715
+ log('formation via %s failed (%s), trying the next inviting machine', machine.peerId, error.message);
716
+ if (error instanceof FormationRejectedError)
717
+ refusal = error;
718
+ else
719
+ unreached.push({ peerId: machine.peerId, error });
546
720
  }
547
- });
721
+ }
722
+ throw refusal ?? noMachineReached(unreached);
548
723
  }
549
724
  //# sourceMappingURL=strand-formation-protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strand-formation-protocol.js","sourceRoot":"","sources":["../src/strand-formation-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAC;AAGpE,OAAO,EAAsB,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,oFAAoF;AACpF,sCAAsC;AACtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,GAAG,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAElD,yFAAyF;AACzF,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,4CAA4C;AAC5C,MAAM,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAyG5B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,MAAM,IAAI,gBAAgB;YAAE,MAAM;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC;YACH,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kFAAkF;YAClF,iFAAiF;YACjF,GAAG,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,WAAW;IAKf,YAAY,MAAiC,EAAE,SAAS,GAAG,sBAAsB;QAFzE,WAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAGjC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAC,KAAiB;QAC9B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,0FAA0F;IAClF,KAAK,CAAC,IAAI,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,IAAI;gBAAE,OAAO,KAAK,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,YAAY,UAAU;gBACvC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAE,KAAoC,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpH,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,yBAAyB,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;CACF;AAED,gFAAgF;AAEhF,wGAAwG;AACxG,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAC7C,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,KAAgC,CAAC;IACzE,MAAM,aAAa,GAAG,CAAC,GAAY,EAAW,EAAE,CAC9C,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,gCAAgC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzH,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgC;IAC5E,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC7D,iFAAiF;IACjF,oFAAoF;IACpF,4CAA4C;IAC5C,IAAI,SAAS,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AA0DD;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IAW5B,YAAY,OAAiC;QAJ5B,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,mBAAc,GAAG,CAAC,CAAC;QACnB,mBAAc,GAAG,CAAC,CAAC;QAGzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC,cAAc,CAAC;QACxE,MAAM,KAAK,GAAG,oBAAoB,CAAC,yBAAyB,CAC1D,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC,eAAe,GAAG,SAAS,CAAC,gBAAgB,EAClF,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,YAAY,EAAE,mBAAmB,EACxF,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CACxD,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,+BAA+B,CAAC;IAChG,CAAC;IAED,4CAA4C;IAC5C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,aAAqB,kBAAkB;QAClE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,SAAkB,EAAE,WAAoB,EAAE,EAAE;YAC/E,MAAM,IAAI,CAAC,YAAY,CAAC,SAA0B,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,oCAAoC,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,aAAqB,kBAAkB;QACpE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,sCAAsC,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAqB;QAC9C,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtD,MAAM,SAAS,GAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;YAChH,IAAI,CAAC;gBAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAClE,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACzG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,kCAAkC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACK,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,OAAgC;QAClE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,OAAO,MAAM,WAAW,CACtB,IAAI,CAAC,eAAe,EACpB,0BAA0B,EAAE,EAAE,EAC9B,GAAG,EAAE,CAAC,OAAO,EACb,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ;gBAAE,MAAM,GAAG,CAAC;YACzB,GAAG,CACD,iGAAiG,EACjG,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAChD,CAAC;YACF,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACK,KAAK,CAAC,iBAAiB,CAC7B,EAAU,EACV,OAA2C;QAE3C,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,IAAI,CAAC,gBAAgB,EACrB,oBAAoB,EAAE,EAAE,EACxB,GAAG,EAAE,CAAC,OAAO,EACb,GAAG,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,GAAG,CAAC,qFAAqF,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjH,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,GAAG,CAAC,+DAA+D,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC9E,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,GAAG,CAAC,uEAAuE,EAAE,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxG,8EAA8E;YAC9E,iCAAiC;YACjC,KAAK,OAAO,CAAC,IAAI,CACf,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,yEAAyE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAC3G,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,+DAA+D,EAAE,EAAE,EAAE,IAAI,CAAC,CACzF,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACK,oBAAoB,CAAC,EAAU,EAAE,OAAgC;QACvE,IAAI,CAAC;YACH,0BAA0B,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,mFAAmF;YACnF,qFAAqF;YACrF,4DAA4D;YAC5D,GAAG,CAAC,8EAA8E,EAAE,EAAE,CAAC,CAAC;YACxF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;YAC9C,GAAG,CAAC,sEAAsE,EAAE,EAAE,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,sBAAsB,CAAC;YACvC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC;YAC7C,OAAO,EAAE,OAAO,CAAC,aAAa;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,qEAAqE,EAAE,EAAE,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,cAAc,CAAC,EAAU,EAAE,QAAgB;QACjD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAAE,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,0EAA0E,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACnG,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAqB;QACxD,6EAA6E;QAC7E,kFAAkF;QAClF,mFAAmF;QACnF,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,GAA2B,EAAQ,EAAE;YACjD,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACxB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,2BAA2B,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAA2B,CAAC,CAAC;YACtI,GAAG,CAAC,kDAAkD,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE5F,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAC9F,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,kFAAkF;gBAClF,6EAA6E;gBAC7E,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,0EAA0E;gBAC1E,sDAAsD;gBACtD,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,gFAAgF;YAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5E,IAAI,CAAC;gBACH,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,kFAAkF;gBAClF,gFAAgF;gBAChF,2BAA2B;gBAC3B,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,eAAe,EAAE,OAAO,CAAC,MAAM;aAChC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,iFAAiF;YACjF,qFAAqF;YACrF,kFAAkF;YAClF,oFAAoF;YACpF,gFAAgF;YAChF,6CAA6C;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,aAAa,GAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBACtG,IAAI,CAAC;oBAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAoDD;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAe,EAAE,UAAkB,EAAE,aAAqB;IACnG,OAAO,YAAY,CAAC,aAAa,EAAE,wBAAwB,EAAE,CAAC,MAAM,EAAE,EAAE;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,KAAK,OAAO,CAAC,IAAI,CACf,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAmC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC,EACD,GAAG,EAAE,GAAgE,CAAC,CACvE,CAAC;QACF,OAAO,OAA4C,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAA6B;IAC7E,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAC5D,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC,SAAS,CAAC;IACzE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC,MAAM,CAAC;IAChE,MAAM,kBAAkB,GAAG,yBAAyB,CAClD,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC,wBAAwB,EAC9D,gBAAgB,EAAE,aAAa,EAAE,eAAe,CACjD,CAAC;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO,WAAW,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;YACvC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAEpC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAA0B,CAAC,CAAC;YAChI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAE/D,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACrG,kFAAkF;YAClF,0DAA0D;YAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,EAAE,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"strand-formation-protocol.js","sourceRoot":"","sources":["../src/strand-formation-protocol.ts"],"names":[],"mappings":"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"}