@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.
- package/CHANGELOG.md +9 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs +6 -2
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +7 -11
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-types.d.mts +24 -1
- package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.d.mts +15 -4
- package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.mjs +120 -25
- package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.d.mts +46 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mjs +45 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mjs.map +1 -0
- 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
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +1 -0
- 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
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -0
- package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-v1.mjs +115 -61
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -0
- package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.d.mts +3 -3
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -0
- package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.mjs +6 -6
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -0
- 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
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +1 -0
- 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
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +447 -0
- package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +1 -0
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts +22 -5
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts.map +1 -1
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs +263 -28
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs.map +1 -1
- package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts +13 -0
- package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.d.mts +12 -1
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +106 -12
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-types.d.mts +24 -0
- package/dist/sync/sync-types.d.mts.map +1 -1
- package/dist/sync/sync-types.mjs +0 -1
- package/dist/sync/sync-types.mjs.map +1 -1
- package/dist/sync/sync-withid.connect.respec.mjs +3 -3
- package/dist/sync/sync-withid.connect.respec.mjs.map +1 -1
- package/dist/sync/sync-withid.pingpong.respec.d.mts +11 -0
- package/dist/sync/sync-withid.pingpong.respec.d.mts.map +1 -0
- package/dist/sync/sync-withid.pingpong.respec.mjs +199 -0
- package/dist/sync/sync-withid.pingpong.respec.mjs.map +1 -0
- package/dist/witness/space/inner-space/inner-space-v1.d.mts.map +1 -1
- package/dist/witness/space/inner-space/inner-space-v1.mjs +1 -1
- package/dist/witness/space/inner-space/inner-space-v1.mjs.map +1 -1
- package/package.json +1 -1
- package/src/sync/docs/security-3b.md +92 -0
- package/src/sync/docs/security.md +107 -39
- package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +6 -2
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mts +1 -1
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +11 -14
- package/src/sync/sync-peer/sync-peer-types.mts +28 -1
- package/src/sync/sync-peer/sync-peer-v1.mts +127 -35
- package/src/sync/sync-peer/sync-peer-websocket/README.md +42 -0
- package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mts +68 -0
- package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-types.mts +2 -2
- package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-v1.mts +128 -71
- package/src/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-websocket-peer-helpers.mts +8 -8
- package/src/sync/sync-peer/{sync-peer-websocket-sender → sync-peer-websocket/sync-peer-websocket-sender}/sync-peer-websocket-sender-types.mts +1 -1
- package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +509 -0
- package/src/sync/sync-saga-context/sync-saga-context-helpers.mts +267 -36
- package/src/sync/sync-saga-context/sync-saga-context-types.mts +14 -0
- package/src/sync/sync-saga-coordinator.mts +148 -8
- package/src/sync/sync-types.mts +28 -4
- package/src/sync/sync-withid.connect.respec.mts +3 -3
- package/src/sync/sync-withid.pingpong.respec.mts +234 -0
- package/src/witness/space/inner-space/inner-space-v1.mts +4 -5
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +0 -282
- package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +0 -1
- package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +0 -321
- /package/dist/sync/sync-peer/{sync-peer-websocket-receiver → sync-peer-websocket/sync-peer-websocket-receiver}/sync-peer-websocket-receiver-types.mjs +0 -0
- /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 =
|
|
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
|
-
|
|
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
|
-
|
|
678
|
-
|
|
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
|
|
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
|
package/src/sync/sync-types.mts
CHANGED
|
@@ -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 {
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
8
|
+
IbGibSpaceOptionsData, IbGibSpaceOptionsRel8ns,
|
|
9
9
|
IbGibSpaceOptionsIbGib, IbGibSpaceResultData, IbGibSpaceResultRel8ns,
|
|
10
|
-
IbGibSpaceResultIbGib,
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map
DELETED
|
@@ -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":""}
|
package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map
DELETED
|
@@ -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"}
|