@ibgib/core-gib 0.1.18 → 0.1.20
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/dist/common/other/ibgib-helper.d.mts +13 -0
- package/dist/common/other/ibgib-helper.d.mts.map +1 -1
- package/dist/common/other/ibgib-helper.mjs +44 -0
- package/dist/common/other/ibgib-helper.mjs.map +1 -1
- package/dist/sync/merge-info/merge-info-constants.d.mts +2 -0
- package/dist/sync/merge-info/merge-info-constants.d.mts.map +1 -0
- package/dist/sync/merge-info/merge-info-constants.mjs +2 -0
- package/dist/sync/merge-info/merge-info-constants.mjs.map +1 -0
- package/dist/sync/merge-info/merge-info-helpers.d.mts +51 -0
- package/dist/sync/merge-info/merge-info-helpers.d.mts.map +1 -0
- package/dist/sync/merge-info/merge-info-helpers.mjs +92 -0
- package/dist/sync/merge-info/merge-info-helpers.mjs.map +1 -0
- package/dist/sync/merge-info/merge-info-helpers.respec.d.mts +2 -0
- package/dist/sync/merge-info/merge-info-helpers.respec.d.mts.map +1 -0
- package/dist/sync/merge-info/merge-info-helpers.respec.mjs +32 -0
- package/dist/sync/merge-info/merge-info-helpers.respec.mjs.map +1 -0
- package/dist/sync/merge-info/merge-info-types.d.mts +26 -0
- package/dist/sync/merge-info/merge-info-types.d.mts.map +1 -0
- package/dist/sync/merge-info/merge-info-types.mjs +2 -0
- package/dist/sync/merge-info/merge-info-types.mjs.map +1 -0
- package/dist/sync/strategies/conflict-optimistic.d.mts +37 -0
- package/dist/sync/strategies/conflict-optimistic.d.mts.map +1 -0
- package/dist/sync/strategies/conflict-optimistic.mjs +162 -0
- package/dist/sync/strategies/conflict-optimistic.mjs.map +1 -0
- package/dist/sync/sync-conflict.respec.d.mts +8 -0
- package/dist/sync/sync-conflict.respec.d.mts.map +1 -0
- package/dist/sync/sync-conflict.respec.mjs +158 -0
- package/dist/sync/sync-conflict.respec.mjs.map +1 -0
- package/dist/sync/sync-innerspace-constants.respec.d.mts +8 -0
- package/dist/sync/sync-innerspace-constants.respec.d.mts.map +1 -0
- package/dist/sync/sync-innerspace-constants.respec.mjs +116 -0
- package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -0
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs +2 -3
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +3 -3
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +2 -2
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-partial-update.respec.d.mts +7 -0
- package/dist/sync/sync-innerspace-partial-update.respec.d.mts.map +1 -0
- package/dist/sync/sync-innerspace-partial-update.respec.mjs +116 -0
- package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -0
- package/dist/sync/sync-innerspace.respec.mjs +5 -5
- package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
- package/dist/sync/sync-saga-coordinator.d.mts +23 -12
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +612 -95
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-helpers.d.mts +11 -0
- package/dist/sync/sync-saga-message/sync-saga-message-helpers.d.mts.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-helpers.mjs +24 -0
- package/dist/sync/sync-saga-message/sync-saga-message-helpers.mjs.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +30 -0
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
- package/dist/sync/sync-types.d.mts +31 -4
- package/dist/sync/sync-types.d.mts.map +1 -1
- package/dist/sync/sync-types.mjs.map +1 -1
- package/ibgib-foundations.md +129 -0
- package/package.json +1 -1
- package/roadmap.md +59 -0
- package/src/common/other/ibgib-helper.mts +52 -0
- package/src/keystone/README.md +13 -155
- package/src/keystone/docs/architecture.md +55 -0
- package/src/sync/README.md +37 -42
- package/src/sync/docs/architecture.md +69 -0
- package/src/sync/docs/verification.md +43 -0
- package/src/sync/merge-info/merge-info-constants.mts +1 -0
- package/src/sync/merge-info/merge-info-helpers.mts +134 -0
- package/src/sync/merge-info/merge-info-helpers.respec.mts +41 -0
- package/src/sync/merge-info/merge-info-types.mts +28 -0
- package/src/sync/strategies/conflict-optimistic.mts +208 -0
- package/src/sync/sync-conflict.respec.mts +194 -0
- package/src/sync/sync-innerspace-constants.respec.mts +133 -0
- package/src/sync/sync-innerspace-deep-updates.respec.mts +1 -2
- package/src/sync/sync-innerspace-dest-ahead.respec.mts +2 -2
- package/src/sync/sync-innerspace-multiple-timelines.respec.mts +1 -1
- package/src/sync/sync-innerspace-partial-update.respec.mts +150 -0
- package/src/sync/sync-innerspace.respec.mts +4 -4
- package/src/sync/sync-saga-coordinator.mts +673 -103
- package/src/sync/sync-saga-message/sync-saga-message-helpers.mts +41 -0
- package/src/sync/sync-saga-message/sync-saga-message-types.mts +28 -0
- package/src/sync/sync-types.mts +33 -4
- package/tmp.md +2 -374
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module sync-innerspace-partial-update.respec
|
|
3
|
+
*
|
|
4
|
+
* Verifies Sync Scenarios where the Destination has partial history.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
respecfully, lastOfAll, ifWe, iReckon,
|
|
9
|
+
ifWeMight
|
|
10
|
+
} from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
11
|
+
const maam = `[${import.meta.url}]`, sir = maam;
|
|
12
|
+
import { delay, extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
13
|
+
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
14
|
+
import { getDependencyGraph } from '../common/other/graph-helper.mjs';
|
|
15
|
+
|
|
16
|
+
import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
17
|
+
import { putInSpace, getFromSpace } from '../witness/space/space-helper.mjs';
|
|
18
|
+
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
19
|
+
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
|
+
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
|
+
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
|
+
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
|
+
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
25
|
+
|
|
26
|
+
const logalot = true;
|
|
27
|
+
const lc = `[sync-innerspace-partial-update.respec]`;
|
|
28
|
+
|
|
29
|
+
await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
30
|
+
|
|
31
|
+
let metaspace: Metaspace_Innerspace;
|
|
32
|
+
let sourceSpace: InnerSpace_V1;
|
|
33
|
+
let destSpace: InnerSpace_V1;
|
|
34
|
+
|
|
35
|
+
interface TestData {
|
|
36
|
+
type: string;
|
|
37
|
+
label?: string;
|
|
38
|
+
uuid?: string;
|
|
39
|
+
n?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
await respecfully(sir, `Sender Newer (Partial History)`, async () => {
|
|
43
|
+
// 1. Setup Spaces
|
|
44
|
+
metaspace = new Metaspace_Innerspace(undefined);
|
|
45
|
+
await metaspace.initialize({
|
|
46
|
+
getFnAlert: () => async ({ title, msg }) => { },
|
|
47
|
+
getFnPrompt: () => async ({ title, msg }) => { return ''; },
|
|
48
|
+
getFnPromptPassword: () => async (title, msg) => { return null; },
|
|
49
|
+
});
|
|
50
|
+
while (!metaspace.initialized) { await delay(10); }
|
|
51
|
+
|
|
52
|
+
const defaultLocalUserSpace = await metaspace.getLocalUserSpace({ lock: false });
|
|
53
|
+
await defaultLocalUserSpace!.initialized;
|
|
54
|
+
|
|
55
|
+
sourceSpace = new InnerSpace_V1({
|
|
56
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
57
|
+
name: 'source',
|
|
58
|
+
uuid: 'source_uuid',
|
|
59
|
+
description: 'source test space',
|
|
60
|
+
});
|
|
61
|
+
await sourceSpace.initialized;
|
|
62
|
+
|
|
63
|
+
destSpace = new InnerSpace_V1({
|
|
64
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
65
|
+
name: 'dest',
|
|
66
|
+
uuid: 'dest_uuid',
|
|
67
|
+
description: 'dest test space',
|
|
68
|
+
});
|
|
69
|
+
await destSpace.initialized;
|
|
70
|
+
|
|
71
|
+
// 2. See Data
|
|
72
|
+
// Root -> V1 (Shared) -> V2 (Source Only)
|
|
73
|
+
|
|
74
|
+
const root = await createTimelineRootHelper<TestData>({
|
|
75
|
+
ib: 'timeline_root_partial',
|
|
76
|
+
data: { type: 'root', label: 'Root' },
|
|
77
|
+
space: sourceSpace,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// V1
|
|
81
|
+
const v1 = await mut8Timeline<TestData>({
|
|
82
|
+
timeline: root,
|
|
83
|
+
mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1' } },
|
|
84
|
+
metaspace,
|
|
85
|
+
space: sourceSpace,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// V2 (Source Only)
|
|
89
|
+
const v2 = await mut8Timeline<TestData>({
|
|
90
|
+
timeline: v1,
|
|
91
|
+
mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2' } },
|
|
92
|
+
metaspace,
|
|
93
|
+
space: sourceSpace,
|
|
94
|
+
});
|
|
95
|
+
const addrV2 = getIbGibAddr({ ibGib: v2 });
|
|
96
|
+
|
|
97
|
+
// Transfer Root & V1 to Dest (Simulate previous sync)
|
|
98
|
+
await putInSpace({ space: destSpace, ibGibs: [root, v1] });
|
|
99
|
+
|
|
100
|
+
await ifWe(sir, 'verify setup', async () => {
|
|
101
|
+
// Verify Dest has V1
|
|
102
|
+
const checkV1 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: v1 }) });
|
|
103
|
+
iReckon(sir, checkV1.success).asTo('Dest has V1').isGonnaBeTrue();
|
|
104
|
+
|
|
105
|
+
// Verify Dest does NOT have V2
|
|
106
|
+
const checkV2 = await getFromSpace({ space: destSpace, addr: addrV2 });
|
|
107
|
+
iReckon(sir, checkV2.success && !!checkV2.ibGibs?.length).asTo('Dest has V2').isGonnaBeFalse();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// 3. Setup Sync
|
|
111
|
+
const mockKeystone = await getTestKeystoneServiceHelper();
|
|
112
|
+
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
113
|
+
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
114
|
+
|
|
115
|
+
const peer = new SyncPeerInnerspace_V1({
|
|
116
|
+
senderSpace: sourceSpace,
|
|
117
|
+
receiverSpace: destSpace,
|
|
118
|
+
receiverCoordinator: receiverCoordinator,
|
|
119
|
+
receiverMetaspace: metaspace,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// 4. Run Sync (Source Pushes V2)
|
|
123
|
+
console.log(`${lc} Running Sync...`);
|
|
124
|
+
const resSync = await senderCoordinator.sync({
|
|
125
|
+
peer: peer,
|
|
126
|
+
localSpace: sourceSpace,
|
|
127
|
+
metaspace: metaspace,
|
|
128
|
+
domainIbGibs: [v2],
|
|
129
|
+
useSessionIdentity: false,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
await resSync.done;
|
|
133
|
+
|
|
134
|
+
// 5. Verify Dest (Should now have V2)
|
|
135
|
+
console.log(`${lc} Verifying Destination...`);
|
|
136
|
+
|
|
137
|
+
await ifWe(sir, `verify dest updated`, async () => {
|
|
138
|
+
// Verify Tip (V2)
|
|
139
|
+
const getV2 = await getFromSpace({ space: destSpace, addr: addrV2 });
|
|
140
|
+
iReckon(sir, getV2.success).asTo('V2 present in Dest').isGonnaBeTrue();
|
|
141
|
+
|
|
142
|
+
// Verify V2 points to V1
|
|
143
|
+
const v2IbGib = getV2.ibGibs![0];
|
|
144
|
+
const pastAddr = v2IbGib.rel8ns?.past?.at(-1);
|
|
145
|
+
iReckon(sir, pastAddr === getIbGibAddr({ ibGib: v1 })).asTo('V2 points to V1').isGonnaBeTrue();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
});
|
|
@@ -33,7 +33,7 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
33
33
|
let sourceSpace: InnerSpace_V1;
|
|
34
34
|
let destSpace: InnerSpace_V1;
|
|
35
35
|
|
|
36
|
-
await
|
|
36
|
+
await respecfully(sir, `Basic Push Sync (Source -> Dest)`, async () => {
|
|
37
37
|
// 1. Setup Spaces
|
|
38
38
|
metaspace = new Metaspace_Innerspace(undefined);
|
|
39
39
|
await metaspace.initialize({
|
|
@@ -150,18 +150,18 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
150
150
|
try {
|
|
151
151
|
const getChildInDest = await getFromSpace({ space: destSpace, addr: childAddr });
|
|
152
152
|
|
|
153
|
-
await
|
|
153
|
+
await ifWe(sir, `verify success getChildInDest`, async () => {
|
|
154
154
|
iReckon(sir, getChildInDest.success).asTo('Child present in Dest').isGonnaBeTrue();
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
await
|
|
157
|
+
await ifWe(sir, `verify getChildInDest.ibGibs`, async () => {
|
|
158
158
|
const firstChild = getChildInDest.ibGibs?.[0];
|
|
159
159
|
console.log(`${lc} firstChild: ${pretty(firstChild)}`);
|
|
160
160
|
iReckon(sir, firstChild?.data?.n).asTo('Child content matches').isGonnaBe(2);
|
|
161
161
|
});
|
|
162
162
|
|
|
163
163
|
} catch (error) {
|
|
164
|
-
await
|
|
164
|
+
await ifWe(sir, `doh`, async () => {
|
|
165
165
|
// hack here I'm getting tired...
|
|
166
166
|
iReckon(sir, true).asTo(`error: ${extractErrorMsg(error)}`).isGonnaBeFalse();
|
|
167
167
|
});
|