@ibgib/core-gib 0.1.58 → 0.1.60

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 (96) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts.map +1 -1
  3. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs +6 -2
  4. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs.map +1 -1
  5. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts +1 -1
  6. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +1 -1
  7. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
  8. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +7 -11
  9. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
  10. package/dist/sync/sync-peer/sync-peer-types.d.mts +24 -1
  11. package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
  12. package/dist/sync/sync-peer/sync-peer-v1.d.mts +15 -4
  13. package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
  14. package/dist/sync/sync-peer/sync-peer-v1.mjs +120 -25
  15. package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
  16. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.d.mts +46 -0
  17. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.d.mts.map +1 -0
  18. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mjs +45 -0
  19. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mjs.map +1 -0
  20. package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-types.d.mts +2 -2
  21. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +1 -0
  22. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +1 -0
  23. package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-v1.d.mts +11 -8
  24. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -0
  25. package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-v1.mjs +115 -61
  26. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -0
  27. package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.d.mts +3 -3
  28. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -0
  29. package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.mjs +6 -6
  30. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -0
  31. package/dist/sync/sync-peer/{sync-peer-websocket-sender → sync-peer-websocket/sync-peer-websocket-sender}/sync-peer-websocket-sender-types.d.mts +1 -1
  32. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +1 -0
  33. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +1 -0
  34. package/dist/sync/sync-peer/{sync-peer-websocket-sender → sync-peer-websocket/sync-peer-websocket-sender}/sync-peer-websocket-sender-v1.d.mts +22 -4
  35. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +1 -0
  36. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +447 -0
  37. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +1 -0
  38. package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts +22 -5
  39. package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts.map +1 -1
  40. package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs +263 -28
  41. package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs.map +1 -1
  42. package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts +13 -0
  43. package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts.map +1 -1
  44. package/dist/sync/sync-saga-coordinator.d.mts +12 -1
  45. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  46. package/dist/sync/sync-saga-coordinator.mjs +106 -12
  47. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  48. package/dist/sync/sync-types.d.mts +24 -0
  49. package/dist/sync/sync-types.d.mts.map +1 -1
  50. package/dist/sync/sync-types.mjs +0 -1
  51. package/dist/sync/sync-types.mjs.map +1 -1
  52. package/dist/sync/sync-withid.connect.respec.mjs +3 -3
  53. package/dist/sync/sync-withid.connect.respec.mjs.map +1 -1
  54. package/dist/sync/sync-withid.pingpong.respec.d.mts +11 -0
  55. package/dist/sync/sync-withid.pingpong.respec.d.mts.map +1 -0
  56. package/dist/sync/sync-withid.pingpong.respec.mjs +199 -0
  57. package/dist/sync/sync-withid.pingpong.respec.mjs.map +1 -0
  58. package/dist/witness/space/inner-space/inner-space-v1.d.mts.map +1 -1
  59. package/dist/witness/space/inner-space/inner-space-v1.mjs +1 -1
  60. package/dist/witness/space/inner-space/inner-space-v1.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/src/sync/docs/security-3b.md +92 -0
  63. package/src/sync/docs/security.md +107 -39
  64. package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +6 -2
  65. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mts +1 -1
  66. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +11 -14
  67. package/src/sync/sync-peer/sync-peer-types.mts +28 -1
  68. package/src/sync/sync-peer/sync-peer-v1.mts +127 -35
  69. package/src/sync/sync-peer/sync-peer-websocket/README.md +42 -0
  70. package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mts +68 -0
  71. package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-types.mts +2 -2
  72. package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-v1.mts +128 -71
  73. package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.mts +8 -8
  74. package/src/sync/sync-peer/{sync-peer-websocket-sender → sync-peer-websocket/sync-peer-websocket-sender}/sync-peer-websocket-sender-types.mts +1 -1
  75. package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +509 -0
  76. package/src/sync/sync-saga-context/sync-saga-context-helpers.mts +267 -36
  77. package/src/sync/sync-saga-context/sync-saga-context-types.mts +14 -0
  78. package/src/sync/sync-saga-coordinator.mts +148 -8
  79. package/src/sync/sync-types.mts +28 -4
  80. package/src/sync/sync-withid.connect.respec.mts +3 -3
  81. package/src/sync/sync-withid.pingpong.respec.mts +234 -0
  82. package/src/witness/space/inner-space/inner-space-v1.mts +4 -5
  83. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +0 -1
  84. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +0 -1
  85. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +0 -1
  86. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +0 -1
  87. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +0 -1
  88. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +0 -1
  89. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +0 -1
  90. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +0 -1
  91. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +0 -1
  92. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +0 -282
  93. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +0 -1
  94. package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +0 -321
  95. /package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-types.mjs +0 -0
  96. /package/dist/sync/sync-peer/{sync-peer-websocket-sender → sync-peer-websocket/sync-peer-websocket-sender}/sync-peer-websocket-sender-types.mjs +0 -0
@@ -32,7 +32,7 @@ import {
32
32
  HandleSagaResponseContextResult,
33
33
  SyncSagaFrameDependencyGraph,
34
34
  } from "./sync-types.mjs";
35
- import { getSyncSagaFrameOrigin, getFullSyncSagaHistory, getSyncIb, getTempSpaceName, isPastFrame, putInSpace_dnasThenNonDnas, validateFullSyncSagaHistory, getAllOrphanedAddresses, getFinalConflictsInfo } from "./sync-helpers.mjs";
35
+ import { getSyncSagaFrameOrigin, getFullSyncSagaHistory, getSyncIb, getTempSpaceName, isPastFrame, putInSpace_dnasThenNonDnas, validateFullSyncSagaHistory, getAllOrphanedAddresses, getFinalConflictsInfo, getSyncSagaFrameDependencyGraph } from "./sync-helpers.mjs";
36
36
  import { getDeltaDependencyGraph, getDependencyGraph, toFlatGraph } from "../common/other/graph-helper.mjs";
37
37
  import {
38
38
  SyncSagaMessageData_V1, SyncSagaMessageInitData_V1,
@@ -44,7 +44,7 @@ import {
44
44
  import { getSyncSagaMessageIb } from "./sync-saga-message/sync-saga-message-helpers.mjs";
45
45
  import { SYNC_SAGA_MSG_ATOM } from "./sync-saga-message/sync-saga-message-constants.mjs";
46
46
  import { SyncSagaInfo } from "./sync-types.mjs";
47
- import { splitPerTjpAndOrDna, getTimelinesGroupedByTjp, isIbGib, getIbGibsFromCache_fallbackToSpaces } from "../common/other/ibgib-helper.mjs";
47
+ import { splitPerTjpAndOrDna, getTimelinesGroupedByTjp, isIbGib, getIbGibsFromCache_fallbackToSpaces, toDto, getTjpAddr } from "../common/other/ibgib-helper.mjs";
48
48
  import { SyncPeerWitness } from "./sync-peer/sync-peer-types.mjs";
49
49
  import { SyncSagaContextData_V1, SyncSagaContextIbGib_V1, SyncSagaContextRel8ns_V1, } from "./sync-saga-context/sync-saga-context-types.mjs";
50
50
  import { getSyncSagaContextIb, validateContextAndSagaFrame } from "./sync-saga-context/sync-saga-context-helpers.mjs";
@@ -66,10 +66,11 @@ import {
66
66
  POOL_ID_CONNECT, POOL_ID_SYNC, KEYSTONE_VERB_CONNECT, KEYSTONE_VERB_SYNC
67
67
  } from "../keystone/keystone-constants.mjs";
68
68
  import { KeystonePoolConfig, KeystoneReplenishStrategy } from "../keystone/keystone-types.mjs";
69
+ import { SyncPeer_V1 } from "./sync-peer/sync-peer-v1.mjs";
69
70
 
70
71
 
71
- const logalot = GLOBAL_LOG_A_LOT;
72
- const logalotControlDomain = false;
72
+ const logalot = GLOBAL_LOG_A_LOT || true;
73
+ const logalotControlDomain = true;
73
74
  const lcControlDomain = '[ControlDomain]';
74
75
 
75
76
  /**
@@ -253,7 +254,7 @@ export class SyncSagaCoordinator {
253
254
  } as any);
254
255
 
255
256
  // ESTABLISH SESSION IDENTITY (pre-connect, if identity provided)
256
- const sessionIdentity = await peer.establishSessionIdentity();
257
+ await peer.establishSessionIdentity();
257
258
 
258
259
  // CONNECT PEER (if needed)
259
260
  await peer.connect({ sagaId });
@@ -264,6 +265,7 @@ export class SyncSagaCoordinator {
264
265
  domainIbGibs,
265
266
  conflictStrategy,
266
267
  metaspace, localSpace, tempSpace,
268
+ peer,
267
269
  });
268
270
 
269
271
  // KICK OFF THE PING-PONG SAGA LOOP (FSM)
@@ -309,6 +311,7 @@ export class SyncSagaCoordinator {
309
311
  mySpace,
310
312
  myTempSpace,
311
313
  metaspace,
314
+ peer,
312
315
  }: {
313
316
  sagaContext: SyncSagaContextIbGib_V1,
314
317
  /**
@@ -320,6 +323,10 @@ export class SyncSagaCoordinator {
320
323
  */
321
324
  myTempSpace: IbGibSpaceAny,
322
325
  metaspace: MetaspaceService,
326
+ /**
327
+ * the peer that is continuing the sync
328
+ */
329
+ peer: SyncPeer_V1,
323
330
  }): Promise<SyncSagaContextIbGib_V1 | null> {
324
331
  const lc = `${this.lc}[${this.continueSync.name}]`;
325
332
  try {
@@ -357,6 +364,9 @@ export class SyncSagaCoordinator {
357
364
  localSpace: mySpace,
358
365
  payloadIbGibsDomain,
359
366
  metaspace,
367
+ sessionIdentityAddr: sagaContext.rel8ns?.sessionIdentity?.[0],
368
+ peer,
369
+ skipSign: true,
360
370
  });
361
371
 
362
372
 
@@ -468,6 +478,8 @@ export class SyncSagaCoordinator {
468
478
  payloadIbGibsDomain: nextDomainIbGibs,
469
479
  localSpace,
470
480
  metaspace,
481
+ sessionIdentityAddr: peer.currentSessionIdentityAddr,
482
+ peer,
471
483
  });
472
484
 
473
485
  // #region Log what we're sending
@@ -521,6 +533,16 @@ export class SyncSagaCoordinator {
521
533
  await validateContextAndSagaFrame({ context: responseCtx });
522
534
  if (contextAndSagaFrameValidationErrors.length > 0) { throw new Error(`contextAndSagaFrameValidationErrors: ${contextAndSagaFrameValidationErrors} (E: 6eebe8e7fa437c00a8cde3ada3c66826)`); }
523
535
 
536
+ // Turn-by-turn continuation & identity checks
537
+ const returnContextErrors = await this.validateReturnContext({
538
+ requestCtx,
539
+ responseCtx,
540
+ localSpace,
541
+ });
542
+ if (returnContextErrors.length > 0) {
543
+ throw new Error(`validateReturnContext errors: ${returnContextErrors.join(', ')} (E: cb8a023b9d0728cceb09fa3da0bb8226)`);
544
+ }
545
+
524
546
  // Extract expected domain addresses from response context
525
547
  const responsePayloadAddrsDomain = responseCtx.data[SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN] as string[] || [];
526
548
 
@@ -612,6 +634,9 @@ export class SyncSagaCoordinator {
612
634
  payloadIbGibsDomain,
613
635
  metaspace,
614
636
  localSpace,
637
+ sessionIdentityAddr,
638
+ peer,
639
+ skipSign,
615
640
  }: {
616
641
  /**
617
642
  * The main saga frame (Init, Ack, etc.).
@@ -631,6 +656,22 @@ export class SyncSagaCoordinator {
631
656
  * execution POV) right when we create it.
632
657
  */
633
658
  localSpace: IbGibSpaceAny;
659
+ sessionIdentityAddr?: string;
660
+ peer: SyncPeerWitness;
661
+ /**
662
+ * If true, will not sign context.
663
+ *
664
+ * For now, this should be true when we call {@link continueSync}, as
665
+ * the receiver does not sign any keystones.
666
+ *
667
+ * ## intent
668
+ *
669
+ * In V1, our receiving endpoint is not signing the context, rather, it
670
+ * is just returning its response context ibgib with the same session
671
+ * identity addr. We are thus trusting the security of the transport
672
+ * itself for now.
673
+ */
674
+ skipSign?: boolean,
634
675
  }): Promise<SyncSagaContextIbGib_V1> {
635
676
  const lc = `[${this.createSyncSagaContext.name}]`;
636
677
  try {
@@ -664,6 +705,20 @@ export class SyncSagaCoordinator {
664
705
  sagaFrame: [getIbGibAddr({ ibGib: sagaFrame })],
665
706
  };
666
707
 
708
+ let sessionIdentity: KeystoneIbGib_V1 | undefined = undefined;
709
+ if (sessionIdentityAddr) {
710
+ sessionIdentityAddr =
711
+ await metaspace.getLatestAddr({ addr: sessionIdentityAddr, space: localSpace }) ?? sessionIdentityAddr;
712
+ const resGet = await getFromSpace({ addr: sessionIdentityAddr, space: localSpace });
713
+ if (resGet.success && resGet.ibGibs?.length === 1) {
714
+ sessionIdentity = resGet.ibGibs![0]! as KeystoneIbGib_V1;
715
+ rel8ns.sessionIdentity = [sessionIdentityAddr];
716
+ } else {
717
+ debugger; // what stage of the algo is this? which side?
718
+ throw new Error(`Couldn't get sessionIdentityAddr (${sessionIdentityAddr}) in space: ${localSpace.ib} (E: 5c29e80d68dbd1749866c358be093826)`);
719
+ }
720
+ }
721
+
667
722
  // Generate standard ib
668
723
  const ib = await getSyncSagaContextIb({ data });
669
724
 
@@ -674,8 +729,16 @@ export class SyncSagaCoordinator {
674
729
  rel8ns,
675
730
  }) as SyncSagaContextIbGib_V1;
676
731
 
677
- // put/register immediately. Note that contextIbGib at this point is
678
- // pure DTO, i.e., only ib, gib, data, rel8ns props.
732
+ const contextAddr = getIbGibAddr({ ibGib: contextIbGib });
733
+ let signedSessionIdentity: KeystoneIbGib_V1 | undefined = undefined;
734
+ if (sessionIdentity && !skipSign) {
735
+ // signing context persists and registers the new keystone
736
+ // using the peer's localMetaspace and localSpace
737
+ signedSessionIdentity = await peer.signContext({ contextAddr });
738
+ }
739
+
740
+ // put/register context immediately in local space (currently is a
741
+ // DTO) but we don't want a broadcast on the metaspace
679
742
  await putInSpace({ ibGib: contextIbGib, space: localSpace, });
680
743
  await registerNewIbGib({
681
744
  ibGib: contextIbGib,
@@ -683,11 +746,24 @@ export class SyncSagaCoordinator {
683
746
  fnBroadcast: undefined,
684
747
  });
685
748
 
686
- // Attach actual ibgibs for transport (not pure DTO now)
749
+ // Attach actual ibgibs for transport
687
750
  contextIbGib.sagaFrame = sagaFrame;
751
+
752
+ const { msgStones } = await getSyncSagaFrameDependencyGraph({
753
+ sagaIbGib: sagaFrame,
754
+ localSpace: localSpace,
755
+ });
756
+ if (msgStones.length !== 1) {
757
+ throw new Error(`(UNEXPECTED) msgStones.length !== 1 inside createSyncSagaContext? (E: a98165cf46ab4e82b7bd5e45a273b826)`);
758
+ }
759
+ contextIbGib.sagaFrameMsg = msgStones[0];
760
+
688
761
  if (payloadIbGibsDomain && payloadIbGibsDomain.length > 0) {
689
762
  contextIbGib.payloadIbGibsDomain = payloadIbGibsDomain;
690
763
  }
764
+ if (signedSessionIdentity) {
765
+ contextIbGib.signedSessionIdentity = signedSessionIdentity;
766
+ }
691
767
 
692
768
  return contextIbGib;
693
769
  } catch (error) {
@@ -817,6 +893,7 @@ export class SyncSagaCoordinator {
817
893
  metaspace,
818
894
  localSpace,
819
895
  tempSpace,
896
+ peer,
820
897
  }: {
821
898
  sagaId: string,
822
899
  domainIbGibs: IbGib_V1[],
@@ -824,6 +901,7 @@ export class SyncSagaCoordinator {
824
901
  metaspace: MetaspaceService,
825
902
  localSpace: IbGibSpaceAny,
826
903
  tempSpace: IbGibSpaceAny,
904
+ peer: SyncPeerWitness,
827
905
  }): Promise<{ initFrame: SyncIbGib_V1, initDomainGraph: { [addr: string]: IbGib_V1 } }> {
828
906
  const lc = `${this.lc}[${this.createInitFrame.name}]`;
829
907
  try {
@@ -870,6 +948,7 @@ export class SyncSagaCoordinator {
870
948
  conflictStrategy,
871
949
  metaspace,
872
950
  localSpace,
951
+ sessionIdentity: peer.currentSessionIdentity,
873
952
  });
874
953
 
875
954
  if (logalot) { console.log(`${lc} sagaFrame (init): ${pretty(sagaFrame)} (I: b3d6a8be69248f18713cc3073cb08626)`); }
@@ -883,6 +962,54 @@ export class SyncSagaCoordinator {
883
962
  }
884
963
  }
885
964
 
965
+ /**
966
+ * Validates that the return context received from a peer is a valid
967
+ * continuation of the outbound context and that the session identity
968
+ * is consistent.
969
+ */
970
+ private async validateReturnContext({
971
+ requestCtx,
972
+ responseCtx,
973
+ localSpace,
974
+ }: {
975
+ requestCtx: SyncSagaContextIbGib_V1,
976
+ responseCtx: SyncSagaContextIbGib_V1,
977
+ localSpace: IbGibSpaceAny,
978
+ }): Promise<string[]> {
979
+ const lc = `${this.lc}[${this.validateReturnContext.name}]`;
980
+ const errors: string[] = [];
981
+ try {
982
+ // 1. Verify saga frame continuation
983
+ if (requestCtx.sagaFrame && responseCtx.sagaFrame) {
984
+ const requestFrameAddr = getIbGibAddr({ ibGib: requestCtx.sagaFrame });
985
+ const responseFrameAddr = getIbGibAddr({ ibGib: responseCtx.sagaFrame });
986
+
987
+ const isContinuation = await isPastFrame({
988
+ olderAddr: requestFrameAddr,
989
+ newerAddr: responseFrameAddr,
990
+ space: localSpace,
991
+ });
992
+ if (!isContinuation) {
993
+ errors.push(`Response saga frame (${responseFrameAddr}) is not a valid continuation of request saga frame (${requestFrameAddr}). (E: 2c85e8d97318ff24ac8a02bd3a068226)`);
994
+ }
995
+ } else {
996
+ errors.push(`Missing sagaFrame on requestCtx or responseCtx. (E: b65c68ff891000ddca8d22384a088226)`);
997
+ }
998
+
999
+ // 2. Verify session identity has not changed
1000
+ const expectedSessionIdAddr = requestCtx.signedSessionIdentity ?
1001
+ getIbGibAddr({ ibGib: requestCtx.signedSessionIdentity }) :
1002
+ requestCtx.rel8ns?.sessionIdentity?.[0];
1003
+ const responseSessionIdAddr = responseCtx.rel8ns?.sessionIdentity?.[0];
1004
+ if (expectedSessionIdAddr !== responseSessionIdAddr) {
1005
+ errors.push(`Session identity mismatch. Expected ${expectedSessionIdAddr}, got ${responseSessionIdAddr}. (E: ab98716bca88d2243cc822187768226)`);
1006
+ }
1007
+ } catch (error) {
1008
+ errors.push(`Error during validateReturnContext: ${extractErrorMsg(error)} (E: da878e1239aa88ee27bdfca005c28226)`);
1009
+ }
1010
+ return errors;
1011
+ }
1012
+
886
1013
  /**
887
1014
  * Helper to poll for streaming domain payloads and put them in the
888
1015
  * local {@link tempSpace}.
@@ -2593,12 +2720,19 @@ export class SyncSagaCoordinator {
2593
2720
  msgStones,
2594
2721
  localSpace,
2595
2722
  metaspace,
2723
+ sessionIdentity,
2596
2724
  }: {
2597
2725
  prevSagaIbGib?: SyncIbGib_V1,
2598
2726
  conflictStrategy?: SyncConflictStrategy,
2599
2727
  msgStones: IbGib_V1[],
2600
2728
  localSpace: IbGibSpaceAny,
2601
2729
  metaspace: MetaspaceService,
2730
+ /**
2731
+ * this is only used on the init frame ({@link prevSagaIbGib}).
2732
+ * otherwise, the sessionIdentityTjpAddr for the next sync saga ibgib
2733
+ * frame will be driven by the {@link prevSagaIbGib}.
2734
+ */
2735
+ sessionIdentity?: KeystoneIbGib_V1 | undefined,
2602
2736
  }): Promise<SyncIbGib_V1> {
2603
2737
  const lc = `${this.lc}[${this.evolveSyncSagaIbGib.name}]`;
2604
2738
  try {
@@ -2668,6 +2802,12 @@ export class SyncSagaCoordinator {
2668
2802
  isTjp: true,
2669
2803
  conflictStrategy,
2670
2804
  };
2805
+ if (sessionIdentity) {
2806
+ const sessionIdentityTjpAddr =
2807
+ getTjpAddr({ ibGib: sessionIdentity });
2808
+ if (!sessionIdentityTjpAddr) { throw new Error(`(UNEXPECTED) sessionIdentity is truthy but sessionIdentityTjpAddr falsy? (E: f52004c10288987a6886f4e8fdf90826)`); }
2809
+ data.sessionIdentityTjpAddr = sessionIdentityTjpAddr;
2810
+ }
2671
2811
  // ib
2672
2812
  const ib = await getSyncIb({ data });
2673
2813
  // rel8ns
@@ -4,11 +4,8 @@ import { IbGib_V1, IbGibData_V1, IbGibRel8ns_V1 } from "@ibgib/ts-gib/dist/V1/ty
4
4
  import { SubjectWitness } from "../common/pubsub/subject/subject-types.mjs";
5
5
  import { SyncSagaContextIbGib_V1 } from "./sync-saga-context/sync-saga-context-types.mjs";
6
6
  import { SYNC_ATOM, SYNC_MSG_REL8N_NAME, SyncConflictStrategy, } from "./sync-constants.mjs";
7
- import { IbGibSpaceAny } from "../witness/space/space-base-v1.mjs";
8
- import { MetaspaceService } from "../witness/space/metaspace/metaspace-types.mjs";
9
- import { SyncPeerWitness } from "./sync-peer/sync-peer-types.mjs";
10
7
  import { FlatIbGibGraph } from "../common/other/graph-types.mjs";
11
- import { SyncSagaConflictInfo, SyncSagaMessageIbGib_V1 } from "./sync-saga-message/sync-saga-message-types.mjs";
8
+ import { SyncSagaMessageIbGib_V1 } from "./sync-saga-message/sync-saga-message-types.mjs";
12
9
 
13
10
 
14
11
  // #region SyncMode
@@ -184,6 +181,14 @@ export interface SyncData_V1 extends IbGibData_V1 {
184
181
  * 2. Rate limiting / Backpressure (Don't process this old request).
185
182
  */
186
183
  expirationTimestamp?: string;
184
+
185
+ /**
186
+ * If using session identity in the sync saga, this should be set and
187
+ * carried over in each saga frame
188
+ *
189
+ * TODO: IMPLEMENT THIS IN CODE. I HAVE JUST STUBBED THIS PROPERTY BUT IT DOES NOT EXIST IN CODE.
190
+ */
191
+ sessionIdentityTjpAddr?: IbGibAddr;
187
192
  }
188
193
 
189
194
  export interface SyncRel8ns_V1 extends IbGibRel8ns_V1 {
@@ -197,3 +202,22 @@ export interface SyncRel8ns_V1 extends IbGibRel8ns_V1 {
197
202
  export interface SyncIbGib_V1 extends IbGib_V1<SyncData_V1, SyncRel8ns_V1> { }
198
203
 
199
204
  // #endregion Sync Ib, Data, Rel8ns, IbGib
205
+
206
+ /**
207
+ * A session keystone should have this info in
208
+ * `sessionIdentity.data.frameDetails`.
209
+ */
210
+ export interface SessionGenesisFrameDetails {
211
+ senderIdentityAddr: IbGibAddr;
212
+ senderIdentityTjpAddr: IbGibAddr;
213
+ targetAddrs?: IbGibAddr[];
214
+ }
215
+
216
+ /**
217
+ * used in authentication/validation/authorization
218
+ * basically, **when** are we calling this validation method?
219
+ *
220
+ * terrible name, probably a code smell, but i'm getting desperate here
221
+ * to get this working.
222
+ */
223
+ export type StageInProtocol = "beforeSend" | "beforeReceive";
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import {
13
- respecfully, ifWeMight, iReckon,
13
+ respecfully, ifWe, iReckon,
14
14
  } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
15
15
  const maam = `[${import.meta.url}]`, sir = maam;
16
16
  import { clone, delay, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
@@ -200,14 +200,14 @@ await respecfully(sir, `Test Phase 2: peer.connect()`, async () => {
200
200
 
201
201
  // #region Step 3: Check states
202
202
 
203
- await ifWeMight(sir, 'does not throw connection-specific errors', async () => {
203
+ await ifWe(sir, 'does not throw connection-specific errors', async () => {
204
204
  const errorMsg = syncError ? extractErrorMsg(syncError) : '';
205
205
  // If it throws, the error should NOT be related to establishment or connection.
206
206
  // It's expected to throw downstream in executeSagaLoop or continueSync due to missing context authentication/turn signing.
207
207
  iReckon(sir, errorMsg.includes('establish') || errorMsg.includes('connect')).asTo('error is NOT related to establish or connect').isGonnaBeFalsy();
208
208
  });
209
209
 
210
- await ifWeMight(sir, 'session identity S connect pool is not depleted (innerspace no-op asymmetry)', async () => {
210
+ await ifWe(sir, 'session identity S connect pool is not depleted (innerspace no-op asymmetry)', async () => {
211
211
  // Resolve latest evolved I1
212
212
  const newSenderIdentityAddr = await metaspace.getLatestAddr({
213
213
  ibGib: senderIdentity,
@@ -0,0 +1,234 @@
1
+ /**
2
+ * @module sync-withid.pingpong.respec
3
+ *
4
+ * Phase 3A — Basic Single-Timeline Sync with Identity
5
+ *
6
+ * Goal: Verify that the ping pong sync process completes successfully with identity.
7
+ *
8
+ * @see libs/core-gib/src/sync/docs/ping_pong_plan.md
9
+ */
10
+
11
+ import {
12
+ respecfully, ifWeMight, iReckon,
13
+ } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
14
+ const maam = `[${import.meta.url}]`, sir = maam;
15
+ import { clone, delay, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
16
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
17
+
18
+ import { GLOBAL_LOG_A_LOT } from '../core-constants.mjs';
19
+ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
20
+ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
21
+ import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
22
+ import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
23
+ import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
24
+ import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
25
+ import { KeystoneService_V1 } from '../keystone/keystone-service-v1.mjs';
26
+ import { KeystoneIbGib_V1 } from '../keystone/keystone-types.mjs';
27
+ import {
28
+ KEYSTONE_VERB_SYNC, POOL_ID_SYNC, POOL_ID_CONNECT, KEYSTONE_VERB_CONNECT,
29
+ } from '../keystone/keystone-constants.mjs';
30
+ import { createStandardPoolConfig } from '../keystone/keystone-config-builder.mjs';
31
+ import { KeystoneReplenishStrategy } from '../keystone/keystone-types.mjs';
32
+ import { SyncConflictStrategy } from './sync-constants.mjs';
33
+ import { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';
34
+ import { getIdentity_throwIfUndefined } from '../keystone/keystone-helpers.mjs';
35
+ import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
36
+ import { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
37
+ import { getDependencyGraph, graphsAreEquivalent } from '../common/other/graph-helper.mjs';
38
+ import { getFromSpace } from '../witness/space/space-helper.mjs';
39
+
40
+ const logalot = GLOBAL_LOG_A_LOT;
41
+ const lc = sir;
42
+
43
+ const SENDER_SECRET = 'test-sender-secret-phase1';
44
+
45
+ const SENDER_IDENTITY_SYNC_POOL_CONFIG = createStandardPoolConfig({
46
+ id: POOL_ID_SYNC,
47
+ salt: 'senderidentitysyncsaltphase1',
48
+ verbs: [KEYSTONE_VERB_SYNC],
49
+ size: 200,
50
+ sequential: 1,
51
+ random: 1,
52
+ targetBinding: 2,
53
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
54
+ });
55
+
56
+ await respecfully(sir, `Test Phase 3A: Ping Pong Sync with Identity`, async () => {
57
+
58
+ // #region Init/Setup
59
+
60
+ const metaspace = new Metaspace_Innerspace(undefined);
61
+ await metaspace.initialize({
62
+ getFnAlert: () => async ({ title, msg }) => { console.log(`[Alert] ${title}: ${msg}`); },
63
+ getFnPrompt: () => async ({ title, msg }) => { console.log(`[Prompt] ${title}: ${msg}`); return ''; },
64
+ getFnPromptPassword: () => async (title, msg) => { console.log(`[PromptPwd] ${title}: ${msg}`); return null; },
65
+ });
66
+ while (!metaspace.initialized) { await delay(10); }
67
+
68
+ const defaultLocalUserSpace = await metaspace.getLocalUserSpace({ lock: false });
69
+ await defaultLocalUserSpace!.initialized;
70
+
71
+ const sourceSpace = new InnerSpace_V1({
72
+ ...DEFAULT_INNER_SPACE_DATA_V1,
73
+ name: 'source',
74
+ uuid: 'source_uuid',
75
+ description: 'sender durable space',
76
+ });
77
+ await sourceSpace.initialized;
78
+
79
+ const destSpace = new InnerSpace_V1({
80
+ ...DEFAULT_INNER_SPACE_DATA_V1,
81
+ name: 'dest',
82
+ uuid: 'dest_uuid',
83
+ description: 'receiver (domain provider) durable space',
84
+ });
85
+ await destSpace.initialized;
86
+
87
+ const senderCoordinator = new SyncSagaCoordinator();
88
+ const receiverCoordinator = new SyncSagaCoordinator();
89
+
90
+ async function newTestIbGib_stone({ ib = 'test', data }: { ib: string, data?: any }): Promise<IbGib_V1> {
91
+ const stone = await Factory_V1.stone({
92
+ parentPrimitiveIb: ib.split(' ').at(0) ?? 'test',
93
+ ib,
94
+ data,
95
+ uuid: true,
96
+ });
97
+ return stone;
98
+ }
99
+
100
+ async function newTestPeer(): Promise<SyncPeerInnerspace_V1> {
101
+ const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
102
+ await peer.initialized;
103
+ await peer.initializeOpts({
104
+ sagaId: '',
105
+ localMetaspace: metaspace,
106
+ localSpace: sourceSpace,
107
+ receiverSpace: destSpace,
108
+ receiverCoordinator,
109
+ receiverMetaspace: metaspace,
110
+ });
111
+ return peer;
112
+ }
113
+
114
+ const keystoneSvc = new KeystoneService_V1();
115
+
116
+ // #endregion Init/Setup
117
+
118
+ let senderIdentity = await keystoneSvc.genesis({
119
+ masterSecret: SENDER_SECRET,
120
+ configs: [SENDER_IDENTITY_SYNC_POOL_CONFIG],
121
+ metaspace,
122
+ space: sourceSpace,
123
+ });
124
+
125
+ // post the senderIdentity to receiver
126
+ await metaspace.put({ ibGib: senderIdentity, space: destSpace });
127
+ await metaspace.registerNewIbGib({ ibGib: senderIdentity, space: destSpace });
128
+
129
+ let syncError: any = null;
130
+ let xStone: IbGib_V1;
131
+ let xStoneAddr: IbGibAddr;
132
+ let peer: SyncPeerInnerspace_V1;
133
+
134
+ try {
135
+ xStone = await newTestIbGib_stone({ ib: 'test-pingpong' });
136
+ xStoneAddr = getIbGibAddr({ ibGib: xStone });
137
+ await metaspace.put({ ibGib: xStone, space: sourceSpace });
138
+ await metaspace.registerNewIbGib({ ibGib: xStone, space: sourceSpace });
139
+
140
+ peer = await newTestPeer();
141
+
142
+ const syncSaga = await senderCoordinator.sync({
143
+ domainIbGibs: [xStone],
144
+ senderIdentity,
145
+ fnSenderSecret: async () => SENDER_SECRET,
146
+ peer,
147
+ localSpace: sourceSpace,
148
+ metaspace,
149
+ conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
150
+ });
151
+ await syncSaga.done;
152
+
153
+ } catch (error) {
154
+ syncError = error;
155
+ }
156
+
157
+ await ifWeMight(sir, 'completes the entire sync saga successfully', async () => {
158
+ const errorMsg = syncError ? extractErrorMsg(syncError) : '';
159
+ iReckon(sir, syncError).asTo(`syncError: ${errorMsg}`).isGonnaBeFalsy();
160
+ });
161
+
162
+ await ifWeMight(sir, 'alpha dep graph matches on source and dest', async () => {
163
+ const resGetDest = await getFromSpace({ space: destSpace, addr: xStoneAddr });
164
+ iReckon(sir, resGetDest.success && resGetDest.ibGibs?.length === 1).asTo('xStone exists in destSpace').isGonnaBeTrue();
165
+ if (resGetDest.success && resGetDest.ibGibs?.[0]) {
166
+ const xStoneDest = resGetDest.ibGibs[0];
167
+ const depGraphSource = await getDependencyGraph({ ibGib: xStone, space: sourceSpace });
168
+ const depGraphDest = await getDependencyGraph({ ibGib: xStoneDest, space: destSpace });
169
+ const equal = graphsAreEquivalent({ graphA: depGraphSource, graphB: depGraphDest });
170
+ iReckon(sir, equal).asTo('graphs are equivalent').isGonnaBeTrue();
171
+ }
172
+ });
173
+
174
+ await ifWeMight(sir, 'sessionIdentity evolved the expected number of times', async () => {
175
+ const latestS = peer.currentSessionIdentity;
176
+ iReckon(sir, latestS).asTo('latest session identity exists on peer').isGonnaBeTruthy();
177
+ if (latestS) {
178
+ iReckon(sir, latestS.data?.n).asTo('session identity data.n').isGonnaBe(2);
179
+ }
180
+ });
181
+
182
+ await ifWeMight(sir, 'sender durable space has I (evolved frame)', async () => {
183
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
184
+ addr: getIbGibAddr({ ibGib: senderIdentity }),
185
+ space: sourceSpace,
186
+ });
187
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
188
+ if (latestSenderIdentityAddr) {
189
+ const resGetSourceI = await getFromSpace({ space: sourceSpace, addr: latestSenderIdentityAddr });
190
+ iReckon(sir, resGetSourceI.success && resGetSourceI.ibGibs?.length === 1).asTo('evolved I exists in sourceSpace').isGonnaBeTrue();
191
+ if (resGetSourceI.success && resGetSourceI.ibGibs?.[0]) {
192
+ const evolvedI = resGetSourceI.ibGibs[0];
193
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
194
+ }
195
+ }
196
+ });
197
+
198
+ await ifWeMight(sir, 'receiver durable space has I (evolved frame)', async () => {
199
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
200
+ addr: getIbGibAddr({ ibGib: senderIdentity }),
201
+ space: sourceSpace,
202
+ });
203
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
204
+ if (latestSenderIdentityAddr) {
205
+ const resGetDestI = await getFromSpace({ space: destSpace, addr: latestSenderIdentityAddr });
206
+ iReckon(sir, resGetDestI.success && resGetDestI.ibGibs?.length === 1).asTo('evolved I exists in destSpace').isGonnaBeTrue();
207
+ if (resGetDestI.success && resGetDestI.ibGibs?.[0]) {
208
+ const evolvedI = resGetDestI.ibGibs[0];
209
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
210
+ }
211
+ }
212
+ });
213
+
214
+ await ifWeMight(sir, 'sender durable space has full S dep graph', async () => {
215
+ const latestS = peer.currentSessionIdentity;
216
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
217
+ if (latestS) {
218
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: sourceSpace });
219
+ const addrs = Object.keys(depGraphS);
220
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph > 2').isGonnaBeTrue();
221
+ }
222
+ });
223
+
224
+ await ifWeMight(sir, 'receiver durable space has full S dep graph', async () => {
225
+ const latestS = peer.currentSessionIdentity;
226
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
227
+ if (latestS) {
228
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: destSpace });
229
+ const addrs = Object.keys(depGraphS);
230
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph in destSpace > 2').isGonnaBeTrue();
231
+ }
232
+ });
233
+
234
+ });
@@ -5,19 +5,18 @@ import { validateIbGibIntrinsically } from '@ibgib/ts-gib/dist/V1/validate-helpe
5
5
 
6
6
  import { GLOBAL_LOG_A_LOT } from '../../../core-constants.mjs';
7
7
  import {
8
- IbGibSpaceData, IbGibSpaceOptionsData, IbGibSpaceOptionsRel8ns,
8
+ IbGibSpaceOptionsData, IbGibSpaceOptionsRel8ns,
9
9
  IbGibSpaceOptionsIbGib, IbGibSpaceResultData, IbGibSpaceResultRel8ns,
10
- IbGibSpaceResultIbGib, IbGibSpaceRel8ns,
10
+ IbGibSpaceResultIbGib,
11
11
  } from '../space-types.mjs';
12
12
  import { getSpaceIb, } from '../space-helper.mjs';
13
13
  import { getTjpAddr } from '../../../common/other/ibgib-helper.mjs';
14
- import { ReconciliationSpaceBase, ReconciliationSpaceData, ReconciliationSpaceRel8ns } from '../reconciliation-space/reconciliation-space-base.mjs';
14
+ import { ReconciliationSpaceBase, } from '../reconciliation-space/reconciliation-space-base.mjs';
15
15
  import { DEFAULT_INNER_SPACE_DATA_V1, InnerSpaceData_V1, InnerSpaceRel8ns_V1 } from './inner-space-types.mjs';
16
16
  import { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
17
17
  import { getGib } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
18
- import { isMetaStone, newUpMetaStone, parseMetaStoneIb } from '../../../common/meta-stone/meta-stone-helper.mjs';
18
+ import { isMetaStone, parseMetaStoneIb } from '../../../common/meta-stone/meta-stone-helper.mjs';
19
19
  import { MetaStoneIbGib_V1, MetaStoneIbInfo } from '../../../common/meta-stone/meta-stone-types.mjs';
20
- import { GIB } from '@ibgib/ts-gib/dist/V1/constants.mjs';
21
20
  import { META_STONE_TARGET_REL8N_NAME } from '../../../common/meta-stone/meta-stone-constants.mjs';
22
21
 
23
22
  const logalot = GLOBAL_LOG_A_LOT;
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-peer-websocket-receiver-types.d.mts","sourceRoot":"","sources":["../../../../src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACH,eAAe,EAAE,iBAAiB,EAClC,sBAAsB,EAAE,mBAAmB,EAC9C,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,gCAAiC,SAAQ,eAAe;CACxE;AAED;;GAEG;AACH,MAAM,WAAW,kCAAmC,SAAQ,iBAAiB;CAC5E;AAED;;GAEG;AACH,MAAM,WAAW,iCAAkC,SAAQ,QAAQ,CAAC,gCAAgC,EAAE,kCAAkC,CAAC;CAAI;AAE7I,MAAM,WAAW,oCAAqC,SAAQ,mBAAmB;CAChF;AAED,MAAM,WAAW,uCAAwC,SAAQ,sBAAsB;IACnF;;OAEG;IACH,gBAAgB,EAAE,mBAAmB,CAAC;CACzC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-peer-websocket-receiver-types.mjs","sourceRoot":"","sources":["../../../../src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-peer-websocket-receiver-v1.d.mts","sourceRoot":"","sources":["../../../../src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EACH,oCAAoC,EACpC,uCAAuC,EACvC,gCAAgC,EAAE,kCAAkC,EACpE,iCAAiC,EACpC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAKxE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAClD,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACvC;AAED;;;;;GAKG;AACH,qBAAa,4BACT,SAAQ,WAAW,CAAC,oCAAoC,EAAE,uCAAuC,CACjG,YAAW,iCAAiC;IAE5C,UAAmB,EAAE,EAAE,MAAM,CAA4C;IAEzE,IAAa,SAAS,IAAI,MAAM,CAE/B;IAEO,IAAI,EAAE,gCAAgC,GAAG,SAAS,CAAC;IACnD,MAAM,EAAE,kCAAkC,GAAG,SAAS,CAAC;IAE/D,SAAS,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAG5C,SAAS,CAAC,eAAe,UAAS;IAClC,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAGhC,WAAW,EAAE,gCAAgC,EAC7C,aAAa,CAAC,EAAE,kCAAkC;IAKtD;;;OAGG;IACU,UAAU,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;cAqB/C,eAAe,CAAC,IAAI,EAAE,oCAAoC,GAAG,OAAO,CAAC,IAAI,CAAC;cAI1E,WAAW,CAAC,IAAI,EAAE,oCAAoC,GAAG,OAAO,CAAC,IAAI,CAAC;cAItE,uBAAuB,CAAC,IAAI,EAAE;QACnD,iBAAiB,EAAE,gBAAgB,CAAC;QACpC,eAAe,EAAE,gBAAgB,CAAC;KACrC,GAAG,OAAO,CAAC,IAAI,CAAC;cAIQ,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAI3H,qDAAqD;cACrC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;cAU5D,oBAAoB,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9D;;OAEG;IACU,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuDtE;;OAEG;cACa,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmE3D;;OAEG;IACU,yBAAyB,CAAC,EACnC,OAAO,EACP,oBAAyB,GAC5B,EAAE;QACC,OAAO,EAAE,uBAAuB,CAAC;QACjC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC;KACrC,GAAG,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;CA8CnD"}