@ibgib/core-gib 0.1.53 → 0.1.55
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 +16 -2
- package/README.md +12 -15
- package/dist/keystone/aggregate-details.respec.d.mts +2 -0
- package/dist/keystone/aggregate-details.respec.d.mts.map +1 -0
- package/dist/keystone/aggregate-details.respec.mjs +118 -0
- package/dist/keystone/aggregate-details.respec.mjs.map +1 -0
- package/dist/keystone/keystone-constants.d.mts +5 -0
- package/dist/keystone/keystone-constants.d.mts.map +1 -1
- package/dist/keystone/keystone-constants.mjs +6 -1
- package/dist/keystone/keystone-constants.mjs.map +1 -1
- package/dist/keystone/keystone-helpers.d.mts +7 -1
- package/dist/keystone/keystone-helpers.d.mts.map +1 -1
- package/dist/keystone/keystone-helpers.mjs +5 -2
- package/dist/keystone/keystone-helpers.mjs.map +1 -1
- package/dist/keystone/keystone-service-v1.d.mts +51 -0
- package/dist/keystone/keystone-service-v1.d.mts.map +1 -1
- package/dist/keystone/keystone-service-v1.mjs +176 -9
- package/dist/keystone/keystone-service-v1.mjs.map +1 -1
- package/dist/keystone/keystone-service-v1.respec.mjs +40 -98
- package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -1
- package/dist/keystone/keystone-types.d.mts +5 -0
- package/dist/keystone/keystone-types.d.mts.map +1 -1
- package/dist/sync/graft-info/graft-info-helpers.respec.mjs +8 -8
- package/dist/sync/graft-info/graft-info-helpers.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs +26 -30
- package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-basic-divergence.respec.mjs +7 -8
- package/dist/sync/sync-conflict-basic-divergence.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs +10 -11
- package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs.map +1 -1
- package/dist/sync/sync-conflict-text-merge.respec.mjs +30 -33
- package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
- package/dist/sync/sync-constants.d.mts +1 -56
- package/dist/sync/sync-constants.d.mts.map +1 -1
- package/dist/sync/sync-constants.mjs +2 -59
- package/dist/sync/sync-constants.mjs.map +1 -1
- package/dist/sync/sync-helpers.d.mts +0 -1
- package/dist/sync/sync-helpers.d.mts.map +1 -1
- package/dist/sync/sync-helpers.mjs +1 -6
- package/dist/sync/sync-helpers.mjs.map +1 -1
- package/dist/sync/sync-innerspace-constants.respec.mjs +5 -9
- package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs +6 -7
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +22 -22
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +8 -9
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +6 -7
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-partial-update.respec.mjs +7 -8
- package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace.respec.mjs +8 -11
- package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-http-node-adapter.mjs +10 -5
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-http-node-adapter.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-types.d.mts +3 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts +4 -2
- 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 +37 -6
- 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-http-sender/sync-peer-http-sender-types.d.mts +3 -1
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts +4 -2
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs +37 -0
- package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts +7 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +10 -2
- 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 +50 -38
- 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 +21 -5
- package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.d.mts +30 -5
- package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.mjs +41 -25
- package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts +2 -11
- 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 +7 -51
- 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 +1 -47
- package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.d.mts +6 -58
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +23 -425
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +2 -2
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
- package/dist/sync/sync-types.d.mts +2 -19
- package/dist/sync/sync-types.d.mts.map +1 -1
- package/dist/sync/sync-types.mjs.map +1 -1
- package/dist/test/mock-space.mjs +1 -1
- package/dist/test/mock-space.mjs.map +1 -1
- package/dist/test-helpers.d.mts +0 -6
- package/dist/test-helpers.d.mts.map +1 -1
- package/dist/test-helpers.mjs +2 -25
- package/dist/test-helpers.mjs.map +1 -1
- package/package.json +10 -34
- package/src/keystone/aggregate-details.respec.mts +137 -0
- package/src/keystone/docs/architecture.md +16 -0
- package/src/keystone/keystone-constants.mts +6 -1
- package/src/keystone/keystone-helpers.mts +9 -1
- package/src/keystone/keystone-service-v1.mts +216 -8
- package/src/keystone/keystone-service-v1.respec.mts +39 -103
- package/src/keystone/keystone-types.mts +6 -0
- package/src/sync/README.md +18 -0
- package/src/sync/docs/architecture.md +21 -0
- package/src/sync/graft-info/graft-info-helpers.respec.mts +7 -7
- package/src/sync/sync-conflict-adv-multitimelines.respec.mts +25 -29
- package/src/sync/sync-conflict-basic-divergence.respec.mts +6 -7
- package/src/sync/sync-conflict-basic-multitimelines.respec.mts +9 -10
- package/src/sync/sync-conflict-text-merge.respec.mts +29 -32
- package/src/sync/sync-constants.mts +2 -62
- package/src/sync/sync-helpers.mts +1 -8
- package/src/sync/sync-id-testlog.txt +421 -0
- package/src/sync/sync-innerspace-constants.respec.mts +4 -8
- package/src/sync/sync-innerspace-deep-updates.respec.mts +5 -6
- package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +23 -25
- package/src/sync/sync-innerspace-dest-ahead.respec.mts +7 -8
- package/src/sync/sync-innerspace-multiple-timelines.respec.mts +5 -6
- package/src/sync/sync-innerspace-partial-update.respec.mts +6 -7
- package/src/sync/sync-innerspace.respec.mts +7 -10
- package/src/sync/sync-peer/sync-peer-http-receiver/sync-http-node-adapter.mts +5 -5
- package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-types.mts +5 -1
- package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +30 -9
- package/src/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-types.mts +3 -1
- package/src/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mts +29 -2
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mts +7 -1
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +51 -38
- package/src/sync/sync-peer/sync-peer-types.mts +23 -6
- package/src/sync/sync-peer/sync-peer-v1.mts +68 -28
- package/src/sync/sync-saga-context/sync-saga-context-helpers.mts +6 -66
- package/src/sync/sync-saga-context/sync-saga-context-types.mts +1 -48
- package/src/sync/sync-saga-coordinator.mts +12 -552
- package/src/sync/sync-saga-message/sync-saga-message-types.mts +2 -3
- package/src/sync/sync-types.mts +2 -22
- package/src/sync/unused-identity-backup.mts.md +311 -0
- package/src/test/mock-space.mts +1 -1
- package/src/test-helpers.mts +1 -26
- package/test_output.log +0 -0
- package/test_output_utf8.txt +398 -0
- package/.vscode/core-gib-snippets.code-snippets +0 -293
- package/.vscode/launch.json +0 -40
- package/.vscode/settings.json +0 -58
- package/.vscode/tasks.json +0 -37
- package/dist/sync/sync-peer/sync-peer-http.respec.d.mts +0 -2
- package/dist/sync/sync-peer/sync-peer-http.respec.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-http.respec.mjs +0 -340
- package/dist/sync/sync-peer/sync-peer-http.respec.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.d.mts +0 -42
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.mjs +0 -312
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.d.mts +0 -84
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.mjs +0 -65
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.d.mts +0 -73
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.mjs +0 -667
- package/dist/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs +0 -67
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs +0 -67
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs +0 -68
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs +0 -69
- package/dist/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/src/sync/sync-peer/sync-peer-http.respec.mts +0 -396
- package/src/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-helper.mts +0 -298
- package/src/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-types.mts +0 -150
- package/src/witness/space/filesystem-space/node-filesystem-space/node-filesystem-space-v1.mts +0 -666
- package/src/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mts +0 -87
- package/src/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mts +0 -88
- package/src/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mts +0 -88
- package/src/witness/space/filesystem-space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mts +0 -90
|
@@ -17,7 +17,7 @@ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
|
17
17
|
import { putInSpace, getFromSpace, registerNewIbGib } from '../witness/space/space-helper.mjs';
|
|
18
18
|
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
|
-
import { createTimelineRootTestHelper,
|
|
20
|
+
import { createTimelineRootTestHelper, } from '../test-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
23
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
@@ -116,7 +116,7 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
116
116
|
return resGet.success && resGet.ibGibs && resGet.ibGibs.length === 1;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
await
|
|
119
|
+
await ifWeMight(sir, 'verify setup', async () => {
|
|
120
120
|
// Ensure V2 is ONLY in Dest (it is, per `space: destSpace`)
|
|
121
121
|
// Ensure Source does NOT have V2
|
|
122
122
|
iReckon(sir, await fnAddrExistsInSpace(addrV0, sourceSpace)).asTo('source has V0').isGonnaBeTrue();
|
|
@@ -128,13 +128,13 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
// 3. Setup Sync
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
131
|
+
const senderCoordinator = new SyncSagaCoordinator();
|
|
132
|
+
const receiverCoordinator = new SyncSagaCoordinator();
|
|
134
133
|
|
|
135
134
|
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
136
135
|
await peer.initialized;
|
|
137
136
|
await peer.initializeOpts({
|
|
137
|
+
localMetaspace: metaspace,
|
|
138
138
|
localSpace: sourceSpace, // "Client"
|
|
139
139
|
receiverSpace: destSpace, // "Server"
|
|
140
140
|
receiverCoordinator,
|
|
@@ -148,14 +148,13 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
148
148
|
localSpace: sourceSpace,
|
|
149
149
|
metaspace: metaspace,
|
|
150
150
|
domainIbGibs: [v1], // Source tries to push V1
|
|
151
|
-
useSessionIdentity: false,
|
|
152
151
|
});
|
|
153
152
|
await done;
|
|
154
153
|
|
|
155
154
|
// 5. Verify Sync (v2 should be in both source and dest now)
|
|
156
155
|
console.log(`${lc} Verifying Sync...`);
|
|
157
156
|
|
|
158
|
-
await
|
|
157
|
+
await ifWeMight(sir, `verify v2 now also in source`, async () => {
|
|
159
158
|
// Verify Tip (V2)
|
|
160
159
|
|
|
161
160
|
iReckon(sir, await fnAddrExistsInSpace(addrV0, sourceSpace)).asTo('source has V0').isGonnaBeTrue();
|
|
@@ -167,7 +166,7 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
167
166
|
|
|
168
167
|
});
|
|
169
168
|
|
|
170
|
-
await
|
|
169
|
+
await ifWeMight(sir, `dependency graphs the same`, async () => {
|
|
171
170
|
|
|
172
171
|
const sourceDepGraph = await getDependencyGraph({
|
|
173
172
|
ibGibAddr: addrV2,
|
|
@@ -17,7 +17,7 @@ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
|
17
17
|
import { putInSpace, getFromSpace } from '../witness/space/space-helper.mjs';
|
|
18
18
|
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
|
-
import { createTimelineRootTestHelper,
|
|
20
|
+
import { createTimelineRootTestHelper, } from '../test-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
23
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
@@ -101,13 +101,13 @@ await respecfully(sir, `Sync InnerSpaces (Multiple Timelines)`, async () => {
|
|
|
101
101
|
const addrB = getIbGibAddr({ ibGib: childB2 });
|
|
102
102
|
|
|
103
103
|
// 3. Setup Coordinators & Peer
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
104
|
+
const senderCoordinator = new SyncSagaCoordinator();
|
|
105
|
+
const receiverCoordinator = new SyncSagaCoordinator();
|
|
107
106
|
|
|
108
107
|
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
109
108
|
await peer.initialized;
|
|
110
109
|
await peer.initializeOpts({
|
|
110
|
+
localMetaspace: metaspace,
|
|
111
111
|
localSpace: sourceSpace, // "Client"
|
|
112
112
|
receiverSpace: destSpace, // "Server"
|
|
113
113
|
receiverCoordinator,
|
|
@@ -121,7 +121,6 @@ await respecfully(sir, `Sync InnerSpaces (Multiple Timelines)`, async () => {
|
|
|
121
121
|
localSpace: sourceSpace,
|
|
122
122
|
metaspace: metaspace,
|
|
123
123
|
domainIbGibs: [childA, childB2], // Sync both tips
|
|
124
|
-
useSessionIdentity: false,
|
|
125
124
|
});
|
|
126
125
|
|
|
127
126
|
await resSync.done;
|
|
@@ -130,7 +129,7 @@ await respecfully(sir, `Sync InnerSpaces (Multiple Timelines)`, async () => {
|
|
|
130
129
|
// 5. Verify Dest
|
|
131
130
|
console.log(`${lc} Verifying Destination...`);
|
|
132
131
|
|
|
133
|
-
await
|
|
132
|
+
await ifWeMight(sir, `verify timelines present`, async () => {
|
|
134
133
|
// Verify A
|
|
135
134
|
const getA = await getFromSpace({ space: destSpace, addr: addrA });
|
|
136
135
|
iReckon(sir, getA.success).asTo('Timeline A present').isGonnaBeTrue();
|
|
@@ -17,7 +17,7 @@ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
|
17
17
|
import { putInSpace, getFromSpace } from '../witness/space/space-helper.mjs';
|
|
18
18
|
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
|
-
import { createTimelineRootTestHelper,
|
|
20
|
+
import { createTimelineRootTestHelper, } from '../test-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
23
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
@@ -98,7 +98,7 @@ await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
|
98
98
|
// Transfer Root & V1 to Dest (Simulate previous sync)
|
|
99
99
|
await putInSpace({ space: destSpace, ibGibs: [root, v1] });
|
|
100
100
|
|
|
101
|
-
await
|
|
101
|
+
await ifWeMight(sir, 'verify setup', async () => {
|
|
102
102
|
// Verify Dest has V1
|
|
103
103
|
const checkV1 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: v1 }) });
|
|
104
104
|
iReckon(sir, checkV1.success).asTo('Dest has V1').isGonnaBeTrue();
|
|
@@ -109,13 +109,13 @@ await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
|
109
109
|
});
|
|
110
110
|
|
|
111
111
|
// 3. Setup Sync
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
112
|
+
const senderCoordinator = new SyncSagaCoordinator();
|
|
113
|
+
const receiverCoordinator = new SyncSagaCoordinator();
|
|
115
114
|
|
|
116
115
|
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
117
116
|
await peer.initialized;
|
|
118
117
|
await peer.initializeOpts({
|
|
118
|
+
localMetaspace: metaspace,
|
|
119
119
|
localSpace: sourceSpace, // "Client"
|
|
120
120
|
receiverSpace: destSpace, // "Server"
|
|
121
121
|
receiverCoordinator,
|
|
@@ -129,7 +129,6 @@ await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
|
129
129
|
localSpace: sourceSpace,
|
|
130
130
|
metaspace: metaspace,
|
|
131
131
|
domainIbGibs: [v2],
|
|
132
|
-
useSessionIdentity: false,
|
|
133
132
|
});
|
|
134
133
|
|
|
135
134
|
await resSync.done;
|
|
@@ -137,7 +136,7 @@ await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
|
137
136
|
// 5. Verify Dest (Should now have V2)
|
|
138
137
|
console.log(`${lc} Verifying Destination...`);
|
|
139
138
|
|
|
140
|
-
await
|
|
139
|
+
await ifWeMight(sir, `verify dest updated`, async () => {
|
|
141
140
|
// Verify Tip (V2)
|
|
142
141
|
const getV2 = await getFromSpace({ space: destSpace, addr: addrV2 });
|
|
143
142
|
iReckon(sir, getV2.success).asTo('V2 present in Dest').isGonnaBeTrue();
|
|
@@ -18,7 +18,7 @@ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
|
18
18
|
import { getFromSpace } from '../witness/space/space-helper.mjs';
|
|
19
19
|
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
20
20
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
21
|
-
import { createTimelineRootTestHelper,
|
|
21
|
+
import { createTimelineRootTestHelper, } from '../test-helpers.mjs';
|
|
22
22
|
import { mut8Timeline, } from '../timeline/timeline-api.mjs';
|
|
23
23
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
24
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
@@ -92,27 +92,25 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
92
92
|
|
|
93
93
|
// 3. Setup Coordinators & Peer
|
|
94
94
|
if (logalot) { console.log(`${lc} Setting up Coordinators...`); }
|
|
95
|
-
const mockKeystone = await getTestKeystoneServiceHelper();
|
|
96
|
-
// const identity = await (mockKeystone as any).getIdentity(); // SKIP IDENTITY FOR INITIAL TESTING SIMPLICITY
|
|
97
95
|
|
|
98
96
|
// Sender Coordinator
|
|
99
|
-
const senderCoordinator = new SyncSagaCoordinator(
|
|
97
|
+
const senderCoordinator = new SyncSagaCoordinator();
|
|
100
98
|
|
|
101
99
|
// Receiver Coordinator
|
|
102
100
|
// Note: Receiver acts "globally" usually, but here we treat it as bound to the dest operations?
|
|
103
101
|
// Actually SyncSagaCoordinator isn't bound to a space. It works ON a space.
|
|
104
102
|
// So we can reuse or create separate instances. Let's create separate to simulate remote.
|
|
105
|
-
const receiverCoordinator = new SyncSagaCoordinator(
|
|
103
|
+
const receiverCoordinator = new SyncSagaCoordinator();
|
|
106
104
|
|
|
107
105
|
// Peer (The "Network")
|
|
108
106
|
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
109
107
|
await peer.initialized;
|
|
110
108
|
await peer.initializeOpts({
|
|
109
|
+
localMetaspace: metaspace,
|
|
111
110
|
localSpace: sourceSpace, // "Client"
|
|
112
111
|
receiverSpace: destSpace, // "Server"
|
|
113
112
|
receiverCoordinator,
|
|
114
113
|
receiverMetaspace: metaspace,
|
|
115
|
-
keystoneSvc: mockKeystone
|
|
116
114
|
});
|
|
117
115
|
|
|
118
116
|
// 4. Run Sync
|
|
@@ -122,7 +120,6 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
122
120
|
localSpace: sourceSpace,
|
|
123
121
|
metaspace: metaspace,
|
|
124
122
|
domainIbGibs: [child], // Sync the child
|
|
125
|
-
useSessionIdentity: false,
|
|
126
123
|
}); // Type cast if needed until we align optional params
|
|
127
124
|
|
|
128
125
|
if (logalot) { console.log(`${lc} resSync: ${pretty(resSync)}`); }
|
|
@@ -155,18 +152,18 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
155
152
|
try {
|
|
156
153
|
const getChildInDest = await getFromSpace({ space: destSpace, addr: childAddr });
|
|
157
154
|
|
|
158
|
-
await
|
|
155
|
+
await ifWeMight(sir, `verify success getChildInDest`, async () => {
|
|
159
156
|
iReckon(sir, getChildInDest.success).asTo('Child present in Dest').isGonnaBeTrue();
|
|
160
157
|
});
|
|
161
158
|
|
|
162
|
-
await
|
|
159
|
+
await ifWeMight(sir, `verify getChildInDest.ibGibs`, async () => {
|
|
163
160
|
const firstChild = getChildInDest.ibGibs?.[0];
|
|
164
161
|
if (logalot) { console.log(`${lc} firstChild: ${pretty(firstChild)}`); }
|
|
165
162
|
iReckon(sir, firstChild?.data?.n).asTo('Child content matches').isGonnaBe(2);
|
|
166
163
|
});
|
|
167
164
|
|
|
168
165
|
} catch (error) {
|
|
169
|
-
await
|
|
166
|
+
await ifWeMight(sir, `doh`, async () => {
|
|
170
167
|
// hack here I'm getting tired...
|
|
171
168
|
iReckon(sir, true).asTo(`error: ${extractErrorMsg(error)}`).isGonnaBeFalse();
|
|
172
169
|
});
|
|
@@ -80,10 +80,10 @@ export class SyncHttpNodeAdapter_V1 {
|
|
|
80
80
|
const secureOpts: http2.SecureServerOptions = {
|
|
81
81
|
allowHTTP1: true // Fallback to HTTP/1.1 for clients that don't support HTTP/2
|
|
82
82
|
};
|
|
83
|
-
if (this.opts.key) secureOpts.key = this.opts.key;
|
|
84
|
-
if (this.opts.cert) secureOpts.cert = this.opts.cert;
|
|
85
|
-
if (this.opts.pfx) secureOpts.pfx = this.opts.pfx;
|
|
86
|
-
if (this.opts.passphrase) secureOpts.passphrase = this.opts.passphrase;
|
|
83
|
+
if (this.opts.key) { secureOpts.key = this.opts.key; }
|
|
84
|
+
if (this.opts.cert) { secureOpts.cert = this.opts.cert; }
|
|
85
|
+
if (this.opts.pfx) { secureOpts.pfx = this.opts.pfx; }
|
|
86
|
+
if (this.opts.passphrase) { secureOpts.passphrase = this.opts.passphrase; }
|
|
87
87
|
|
|
88
88
|
this.server = http2.createSecureServer(secureOpts, requestHandler);
|
|
89
89
|
} else {
|
|
@@ -119,7 +119,7 @@ export class SyncHttpNodeAdapter_V1 {
|
|
|
119
119
|
|
|
120
120
|
if (this.server) {
|
|
121
121
|
this.server.close((err) => {
|
|
122
|
-
if (err) return reject(err);
|
|
122
|
+
if (err) { return reject(err); }
|
|
123
123
|
resolve();
|
|
124
124
|
});
|
|
125
125
|
} else {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module sync-peer-http-receiver-types
|
|
3
3
|
*/
|
|
4
4
|
import { IbGibData_V1, IbGibRel8ns_V1, IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
|
|
5
|
-
import { SyncPeerData_V1, SyncPeerRel8ns_V1, SyncPeerWitness, InitializeSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
5
|
+
import { SyncPeerData_V1, SyncPeerRel8ns_V1, SyncPeerWitness, InitializeSyncPeerOpts, ConnectSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
6
6
|
import { MetaspaceService } from '../../../witness/space/metaspace/metaspace-types.mjs';
|
|
7
7
|
import { SyncSagaCoordinator } from '../../sync-saga-coordinator.mjs';
|
|
8
8
|
import { IbGibSpaceAny } from '../../../witness/space/space-base-v1.mjs';
|
|
@@ -24,6 +24,10 @@ export interface SyncPeerHttpReceiverRel8ns_V1 extends SyncPeerRel8ns_V1 {
|
|
|
24
24
|
*/
|
|
25
25
|
export interface SyncPeerHttpReceiverIbGib_V1 extends IbGib_V1<SyncPeerHttpReceiverData_V1, SyncPeerHttpReceiverRel8ns_V1> { }
|
|
26
26
|
|
|
27
|
+
export interface ConnectSyncPeerHttpReceiverOpts extends ConnectSyncPeerOpts {
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
27
31
|
export interface InitializeSyncPeerHttpReceiverOpts extends InitializeSyncPeerOpts {
|
|
28
32
|
localCoordinator: SyncSagaCoordinator;
|
|
29
33
|
localMetaspace: MetaspaceService;
|
|
@@ -14,7 +14,8 @@ import {
|
|
|
14
14
|
InitializeSyncPeerHttpReceiverOpts,
|
|
15
15
|
SyncPeerHttpReceiverData_V1,
|
|
16
16
|
SyncPeerHttpReceiverRel8ns_V1,
|
|
17
|
-
SyncPeerHttpReceiverIbGib_V1
|
|
17
|
+
SyncPeerHttpReceiverIbGib_V1,
|
|
18
|
+
ConnectSyncPeerHttpReceiverOpts
|
|
18
19
|
} from './sync-peer-http-receiver-types.mjs';
|
|
19
20
|
import { putInSpace, registerNewIbGib } from '../../../witness/space/space-helper.mjs';
|
|
20
21
|
|
|
@@ -25,7 +26,7 @@ const logalot = GLOBAL_LOG_A_LOT;
|
|
|
25
26
|
* Acts as the Symmetric Server Node. Accepts requests, routes to Receiver Coordinator.
|
|
26
27
|
*/
|
|
27
28
|
export class SyncPeerHttpReceiver_V1
|
|
28
|
-
extends SyncPeer_V1<InitializeSyncPeerHttpReceiverOpts>
|
|
29
|
+
extends SyncPeer_V1<ConnectSyncPeerHttpReceiverOpts, InitializeSyncPeerHttpReceiverOpts>
|
|
29
30
|
implements SyncPeerHttpReceiverIbGib_V1 {
|
|
30
31
|
|
|
31
32
|
protected override lc: string = `[${SyncPeerHttpReceiver_V1.name}]`;
|
|
@@ -44,6 +45,33 @@ export class SyncPeerHttpReceiver_V1
|
|
|
44
45
|
super(initialData, initialRel8ns);
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
protected override async preConnectCheck(opts: ConnectSyncPeerHttpReceiverOpts): Promise<void> {
|
|
49
|
+
const lc = `${this.lc}[${this.preConnectCheck.name}]`;
|
|
50
|
+
try {
|
|
51
|
+
if (logalot) { console.log(`${lc} starting... (I: 7cf8f805a31877fddf25b0ee09e49e26)`); }
|
|
52
|
+
throw new Error(`not implemented (E: 4163e88d42f811da8b699cb6f7554a26)`);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
55
|
+
throw error;
|
|
56
|
+
} finally {
|
|
57
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected override async connectImpl(opts: ConnectSyncPeerHttpReceiverOpts): Promise<void> {
|
|
62
|
+
const lc = `${this.lc}[${this.connectImpl.name}]`;
|
|
63
|
+
try {
|
|
64
|
+
if (logalot) { console.log(`${lc} starting... (I: 4c3d2a1b5f6e4d5c3b2a1b9c8d7e6f5a)`); }
|
|
65
|
+
// Stub implementation for now.
|
|
66
|
+
throw new Error(`not implemented (E: 48a5b8714d6861272510fc8c3cfef726)`);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
69
|
+
throw error;
|
|
70
|
+
} finally {
|
|
71
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
47
75
|
protected async ensureLocalTempSpace(): Promise<IbGibSpaceAny> {
|
|
48
76
|
const lc = `${this.lc}[${this.ensureLocalTempSpace.name}]`;
|
|
49
77
|
try {
|
|
@@ -121,7 +149,6 @@ export class SyncPeerHttpReceiver_V1
|
|
|
121
149
|
const authErrors = await authenticateContext({
|
|
122
150
|
context,
|
|
123
151
|
space: localSpace,
|
|
124
|
-
keystoneSvc: localCoordinator.keystoneSvc,
|
|
125
152
|
});
|
|
126
153
|
if (authErrors.length > 0) {
|
|
127
154
|
throw new Error(`Context authentication failed: ${authErrors.join(', ')} (E: d34b8ad97d84d1ba8d8f7facd288826)`);
|
|
@@ -134,17 +161,11 @@ export class SyncPeerHttpReceiver_V1
|
|
|
134
161
|
}
|
|
135
162
|
}
|
|
136
163
|
|
|
137
|
-
const identitySecret = context.fnIdentitySecret ?
|
|
138
|
-
await context.fnIdentitySecret() :
|
|
139
|
-
undefined;
|
|
140
|
-
|
|
141
164
|
const responseCtx = await localCoordinator.continueSync({
|
|
142
165
|
sagaContext: context,
|
|
143
166
|
metaspace: localMetaspace,
|
|
144
167
|
mySpace: localSpace,
|
|
145
168
|
myTempSpace: localTempSpace,
|
|
146
|
-
identity: context.signedSessionKeystone,
|
|
147
|
-
identitySecret,
|
|
148
169
|
});
|
|
149
170
|
|
|
150
171
|
return responseCtx || undefined;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module sync-peer-http-sender-types
|
|
3
3
|
*/
|
|
4
4
|
import { IbGibData_V1, IbGibRel8ns_V1, IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';
|
|
5
|
-
import { SyncPeerData_V1, SyncPeerRel8ns_V1, SyncPeerWitness, InitializeSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
5
|
+
import { SyncPeerData_V1, SyncPeerRel8ns_V1, SyncPeerWitness, InitializeSyncPeerOpts, ConnectSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Data for the SyncPeerHttpSender witness.
|
|
@@ -25,6 +25,8 @@ export interface SyncPeerHttpSenderRel8ns_V1 extends SyncPeerRel8ns_V1 {
|
|
|
25
25
|
*/
|
|
26
26
|
export interface SyncPeerHttpSenderIbGib_V1 extends IbGib_V1<SyncPeerHttpSenderData_V1, SyncPeerHttpSenderRel8ns_V1> { }
|
|
27
27
|
|
|
28
|
+
export interface ConnectSyncPeerHttpSenderOpts extends ConnectSyncPeerOpts {
|
|
29
|
+
}
|
|
28
30
|
export interface InitializeSyncPeerHttpSenderOpts extends InitializeSyncPeerOpts {
|
|
29
31
|
/**
|
|
30
32
|
* Specific options needed for initializing the HTTP sender
|
|
@@ -11,7 +11,8 @@ import {
|
|
|
11
11
|
InitializeSyncPeerHttpSenderOpts,
|
|
12
12
|
SyncPeerHttpSenderData_V1,
|
|
13
13
|
SyncPeerHttpSenderRel8ns_V1,
|
|
14
|
-
SyncPeerHttpSenderIbGib_V1
|
|
14
|
+
SyncPeerHttpSenderIbGib_V1,
|
|
15
|
+
ConnectSyncPeerHttpSenderOpts
|
|
15
16
|
} from './sync-peer-http-sender-types.mjs';
|
|
16
17
|
|
|
17
18
|
const logalot = GLOBAL_LOG_A_LOT;
|
|
@@ -21,7 +22,7 @@ const logalot = GLOBAL_LOG_A_LOT;
|
|
|
21
22
|
* Sends Context to a remote server utilizing POST for uplink and SSE for downlink.
|
|
22
23
|
*/
|
|
23
24
|
export class SyncPeerHttpSender_V1
|
|
24
|
-
extends SyncPeer_V1<InitializeSyncPeerHttpSenderOpts>
|
|
25
|
+
extends SyncPeer_V1<ConnectSyncPeerHttpSenderOpts, InitializeSyncPeerHttpSenderOpts>
|
|
25
26
|
implements SyncPeerHttpSenderIbGib_V1 {
|
|
26
27
|
|
|
27
28
|
protected override lc: string = `[${SyncPeerHttpSender_V1.name}]`;
|
|
@@ -46,7 +47,33 @@ export class SyncPeerHttpSender_V1
|
|
|
46
47
|
super(initialData, initialRel8ns);
|
|
47
48
|
}
|
|
48
49
|
|
|
50
|
+
protected override preConnectCheck(opts: ConnectSyncPeerHttpSenderOpts): Promise<void> {
|
|
51
|
+
const lc = `${this.lc}[${this.preConnectCheck.name}]`;
|
|
52
|
+
try {
|
|
53
|
+
if (logalot) { console.log(`${lc} starting... (I: 518718d0aa6830e182892b68fe2a2826)`); }
|
|
54
|
+
|
|
55
|
+
throw new Error(`not implemented (E: 248be8a09b4dbd2fa820ef78258c5326)`);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
58
|
+
throw error;
|
|
59
|
+
} finally {
|
|
60
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
49
63
|
|
|
64
|
+
protected override async connectImpl(opts: ConnectSyncPeerHttpSenderOpts): Promise<void> {
|
|
65
|
+
const lc = `${this.lc}[${this.connectImpl.name}]`;
|
|
66
|
+
try {
|
|
67
|
+
if (logalot) { console.log(`${lc} starting... (I: ad84d8137351662fb8a30114a1fa4826)`); }
|
|
68
|
+
throw new Error(`not implemented (E: 50752d5f4d188c45727d293549bffd26)`);
|
|
69
|
+
// Stub implementation for now.
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
72
|
+
throw error;
|
|
73
|
+
} finally {
|
|
74
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
50
77
|
|
|
51
78
|
protected override async sendContextRequest(context: SyncSagaContextIbGib_V1): Promise<SyncSagaContextIbGib_V1 | undefined> {
|
|
52
79
|
const lc = `${this.lc}[${this.sendContextRequest.name}]`;
|
|
@@ -39,9 +39,15 @@ export interface SyncPeerInnerspaceOptions {
|
|
|
39
39
|
* Temporary sync transaction space for the "receiver", for storage of
|
|
40
40
|
* domain ibgibs created/received throughout the sync saga until commit.
|
|
41
41
|
*
|
|
42
|
+
* If not available at first, this will be automatically created.
|
|
43
|
+
*
|
|
42
44
|
* @see {@link receiverSpace} notes.
|
|
43
45
|
*/
|
|
44
|
-
receiverTempSpace
|
|
46
|
+
receiverTempSpace?: IbGibSpaceAny;
|
|
47
|
+
/**
|
|
48
|
+
* The sender coordinator, used for authentication-related (k eystones).
|
|
49
|
+
*/
|
|
50
|
+
senderCoordinator?: SyncSagaCoordinator;
|
|
45
51
|
}
|
|
46
52
|
|
|
47
53
|
export interface SyncPeerInnerspaceIb_V1 {
|
|
@@ -15,7 +15,7 @@ import { SyncPeerInnerspaceData_V1, SyncPeerInnerspaceIbGib_V1, SyncPeerInnerspa
|
|
|
15
15
|
import { authenticateContext } from '../../sync-saga-context/sync-saga-context-helpers.mjs';
|
|
16
16
|
import { MetaspaceService } from '../../../witness/space/metaspace/metaspace-types.mjs';
|
|
17
17
|
import { SyncSagaCoordinator } from '../../sync-saga-coordinator.mjs';
|
|
18
|
-
import { InitializeSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
18
|
+
import { ConnectSyncPeerOpts, InitializeSyncPeerOpts } from '../sync-peer-types.mjs';
|
|
19
19
|
import { getSyncSagaFrameDependencyGraph, putInSpace_dnasThenNonDnas } from '../../sync-helpers.mjs';
|
|
20
20
|
import { getDependencyGraph } from '../../../common/other/graph-helper.mjs';
|
|
21
21
|
import { SyncStage } from '../../sync-constants.mjs';
|
|
@@ -26,6 +26,10 @@ const logalot = GLOBAL_LOG_A_LOT;
|
|
|
26
26
|
const logalotControlDomain = false;
|
|
27
27
|
const lcControlDomain = '[ControlDomain]';
|
|
28
28
|
|
|
29
|
+
export interface ConnectSyncPeerInnerspaceOpts extends ConnectSyncPeerOpts {
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
29
33
|
/**
|
|
30
34
|
* The innerspace sync peer works with innerspaces for both sender/receiver
|
|
31
35
|
* durable/temp spaces, as well as coordinators for each.
|
|
@@ -47,6 +51,10 @@ export interface InitializeSyncPeerInnerspaceOpts extends InitializeSyncPeerOpts
|
|
|
47
51
|
* If not available at first, this will be automatically created.
|
|
48
52
|
*/
|
|
49
53
|
receiverTempSpace?: IbGibSpaceAny;
|
|
54
|
+
/**
|
|
55
|
+
* The sender coordinator, used for authentication-related (k eystones).
|
|
56
|
+
*/
|
|
57
|
+
senderCoordinator?: SyncSagaCoordinator;
|
|
50
58
|
}
|
|
51
59
|
|
|
52
60
|
/**
|
|
@@ -55,7 +63,7 @@ export interface InitializeSyncPeerInnerspaceOpts extends InitializeSyncPeerOpts
|
|
|
55
63
|
* Acts as the "Network" layer, transferring data between two local spaces and
|
|
56
64
|
* executing the receiver's coordinator logic.
|
|
57
65
|
*/
|
|
58
|
-
export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnerspaceOpts>
|
|
66
|
+
export class SyncPeerInnerspace_V1 extends SyncPeer_V1<ConnectSyncPeerInnerspaceOpts, InitializeSyncPeerInnerspaceOpts>
|
|
59
67
|
implements SyncPeerInnerspaceIbGib_V1 {
|
|
60
68
|
|
|
61
69
|
protected lc: string = `[${SyncPeerInnerspace_V1.name}]`;
|
|
@@ -71,6 +79,41 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
71
79
|
super(initialData, initialRel8ns);
|
|
72
80
|
}
|
|
73
81
|
|
|
82
|
+
|
|
83
|
+
protected override async preConnectCheck(opts: ConnectSyncPeerInnerspaceOpts): Promise<void> {
|
|
84
|
+
const lc = `${this.lc}[${this.preConnectCheck.name}]`;
|
|
85
|
+
try {
|
|
86
|
+
if (logalot) { console.log(`${lc} starting... (I: af5dc1a0bf980848b84e50515614be26)`); }
|
|
87
|
+
|
|
88
|
+
if (!opts.sagaId) {
|
|
89
|
+
throw new Error(`${lc} sagaId required for connect (E: 8a4c0a9b8f1d4f2b1c3b5d6e8a4c0a9b)`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!this.opts) { throw new Error(`this.opts falsy. required to connect (E: 4c24fd577f9cd695a8bf0dc8ddea6826)`); }
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
95
|
+
throw error;
|
|
96
|
+
} finally {
|
|
97
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
protected async connectImpl(opts: ConnectSyncPeerInnerspaceOpts): Promise<void> {
|
|
102
|
+
const lc = `${this.lc}[${this.connectImpl.name}]`;
|
|
103
|
+
try {
|
|
104
|
+
if (logalot) { console.log(`${lc} starting... (I: 2b8f8040d9b4c48a735c021c33f2a826)`); }
|
|
105
|
+
|
|
106
|
+
if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? (E: d617e80d8e082bc76853dba8bb87cc26)`); }
|
|
107
|
+
// console.warn(`${lc} no op right now...hmm (W: )`)
|
|
108
|
+
// throw new Error(`not implemented (E: 4ff318e55d27a44eea06ba585a890c26)`);
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
111
|
+
throw error;
|
|
112
|
+
} finally {
|
|
113
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
74
117
|
protected async ensureReceiverTempSpace(): Promise<IbGibSpaceAny> {
|
|
75
118
|
const lc = `${this.lc}[${this.ensureReceiverTempSpace.name}]`;
|
|
76
119
|
try {
|
|
@@ -154,7 +197,7 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
154
197
|
// remoteTempSpace = senderSpace;
|
|
155
198
|
// }
|
|
156
199
|
|
|
157
|
-
const { sagaIbGib: _alreadyHave, msgStones,
|
|
200
|
+
const { sagaIbGib: _alreadyHave, msgStones, } = await getSyncSagaFrameDependencyGraph({
|
|
158
201
|
sagaIbGib: sagaFrame,
|
|
159
202
|
localSpace: localSpace,
|
|
160
203
|
});
|
|
@@ -162,26 +205,8 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
162
205
|
const msg = msgStones[0];
|
|
163
206
|
if (!msg.data) { throw new Error(`(UNEXPECTED) sync saga message ibgib.data falsy? (E: 61ec18743988ad3cbab2072d1dd69826)`); }
|
|
164
207
|
|
|
165
|
-
|
|
166
|
-
//
|
|
167
|
-
// keystone. If it's the first turn (Init), we include the entire
|
|
168
|
-
// keystone graph to ensure the receiver has the primary-to-session
|
|
169
|
-
// authorized link.
|
|
170
|
-
const identityIbGibs: IbGib_V1[] = [];
|
|
171
|
-
const { signedSessionKeystone } = context;
|
|
172
|
-
if (signedSessionKeystone) {
|
|
173
|
-
if (msg.data.stage === SyncStage.init) {
|
|
174
|
-
// transmit full keystone graph on the first handshake
|
|
175
|
-
const keystoneGraph = await getDependencyGraph({
|
|
176
|
-
ibGib: signedSessionKeystone,
|
|
177
|
-
space: localSpace,
|
|
178
|
-
});
|
|
179
|
-
identityIbGibs.push(...Object.values(keystoneGraph));
|
|
180
|
-
} else {
|
|
181
|
-
// transmit only the latest evolution for subsequent turns
|
|
182
|
-
identityIbGibs.push(signedSessionKeystone);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
208
|
+
|
|
209
|
+
// this is where we did the i dentityIbGibs
|
|
185
210
|
|
|
186
211
|
// send the context itself, then send the payload ibgibs separately.
|
|
187
212
|
// in this innerspace, this just means putting the control ibgibs
|
|
@@ -193,7 +218,7 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
193
218
|
// we store inside out, meaning we do the dependencies first and
|
|
194
219
|
// then the higher-level dependents.
|
|
195
220
|
const payloadIbGibsControl = [
|
|
196
|
-
|
|
221
|
+
msg, sagaFrame, context
|
|
197
222
|
].map(x => toDto({ ibGib: x }));
|
|
198
223
|
if (logalot) { console.log(`${lc} putting into receiverSpace: ${receiverSpace.ib} (I: 1ba18b14a26bdd0e7800da4812898826)`); }
|
|
199
224
|
await putInSpace({
|
|
@@ -230,22 +255,16 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
230
255
|
const authErrors = await authenticateContext({
|
|
231
256
|
context,
|
|
232
257
|
space: receiverSpace,
|
|
233
|
-
keystoneSvc: receiverCoordinator.keystoneSvc,
|
|
234
258
|
});
|
|
235
259
|
if (authErrors.length > 0) {
|
|
236
260
|
throw new Error(`Context authentication failed: ${authErrors.join(', ')} (E: d34b8ad98d84e1ba8d8f7facd288826)`);
|
|
237
261
|
}
|
|
238
262
|
|
|
239
|
-
const identitySecret = context.fnIdentitySecret ?
|
|
240
|
-
await context.fnIdentitySecret() :
|
|
241
|
-
undefined;
|
|
242
263
|
const responseCtx = await receiverCoordinator.continueSync({
|
|
243
264
|
sagaContext: context,
|
|
244
265
|
metaspace: receiverMetaspace,
|
|
245
266
|
mySpace: receiverSpace,
|
|
246
267
|
myTempSpace: receiverTempSpace,
|
|
247
|
-
identity: context.signedSessionKeystone,
|
|
248
|
-
identitySecret,
|
|
249
268
|
});
|
|
250
269
|
|
|
251
270
|
if (logalot) { console.log(`${lc} receiverCoordinator.continueSync responseCtx: ${responseCtx ? pretty(responseCtx) : 'undefined'} (I: fb2831decde1f2b3589021f85ab19126)`); }
|
|
@@ -262,7 +281,7 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
262
281
|
// the process of any response payloads, and return the context.
|
|
263
282
|
|
|
264
283
|
// get control ibgibs from the receiver space...
|
|
265
|
-
const { msgStones: msgStonesResponse,
|
|
284
|
+
const { msgStones: msgStonesResponse, } =
|
|
266
285
|
await getSyncSagaFrameDependencyGraph({
|
|
267
286
|
sagaIbGib: responseCtx.sagaFrame,
|
|
268
287
|
localSpace: receiverSpace,
|
|
@@ -271,14 +290,8 @@ export class SyncPeerInnerspace_V1 extends SyncPeer_V1<InitializeSyncPeerInnersp
|
|
|
271
290
|
const msgResponse = msgStonesResponse[0];
|
|
272
291
|
if (!msgResponse.data) { throw new Error(`(UNEXPECTED) sync saga message ibgib.data falsy? (E: 61ec18743988ad3cbab2072d1dd69826)`); }
|
|
273
292
|
|
|
274
|
-
const responseIdentityIbGibs: IbGib_V1[] = [];
|
|
275
|
-
if (responseCtx.signedSessionKeystone) {
|
|
276
|
-
// receiver also evolved the identity
|
|
277
|
-
responseIdentityIbGibs.push(responseCtx.signedSessionKeystone);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
293
|
const responsePayloadIbGibsControl = [
|
|
281
|
-
|
|
294
|
+
msgResponse, responseCtx.sagaFrame, context
|
|
282
295
|
].map(x => toDto({ ibGib: x }));
|
|
283
296
|
// ...put into sender's durable space
|
|
284
297
|
await putInSpace({
|