@ibgib/core-gib 0.1.21 → 0.1.23
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/graph-helper.d.mts +8 -0
- package/dist/common/other/graph-helper.d.mts.map +1 -1
- package/dist/common/other/graph-helper.mjs +31 -1
- package/dist/common/other/graph-helper.mjs.map +1 -1
- package/dist/sync/sync-conflict.respec.mjs +31 -28
- package/dist/sync/sync-conflict.respec.mjs.map +1 -1
- package/dist/sync/sync-constants.d.mts +21 -11
- package/dist/sync/sync-constants.d.mts.map +1 -1
- package/dist/sync/sync-constants.mjs +18 -6
- package/dist/sync/sync-constants.mjs.map +1 -1
- package/dist/sync/sync-helpers.d.mts +24 -15
- package/dist/sync/sync-helpers.d.mts.map +1 -1
- package/dist/sync/sync-helpers.mjs +163 -92
- package/dist/sync/sync-helpers.mjs.map +1 -1
- package/dist/sync/sync-innerspace-constants.respec.mjs +12 -7
- package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs +12 -7
- package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +15 -10
- package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +13 -7
- package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace-partial-update.respec.mjs +15 -7
- package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
- package/dist/sync/sync-innerspace.respec.mjs +13 -7
- package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
- package/dist/sync/sync-peer/sync-peer-constants.d.mts +2 -0
- package/dist/sync/sync-peer/sync-peer-constants.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-constants.mjs +2 -0
- package/dist/sync/sync-peer/sync-peer-constants.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-helpers.d.mts +2 -0
- package/dist/sync/sync-peer/sync-peer-helpers.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-helpers.mjs +2 -0
- package/dist/sync/sync-peer/sync-peer-helpers.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.d.mts +8 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs +8 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-helpers.d.mts +18 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-helpers.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-helpers.mjs +54 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-helpers.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts +65 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mjs +5 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +44 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +183 -0
- package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -0
- package/dist/sync/sync-peer/sync-peer-types.d.mts +28 -0
- package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.d.mts +51 -9
- package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
- package/dist/sync/sync-peer/sync-peer-v1.mjs +244 -26
- package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
- package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts +26 -10
- 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 +119 -30
- 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 +31 -22
- package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts.map +1 -1
- package/dist/sync/sync-saga-context/sync-saga-context-types.mjs +1 -9
- package/dist/sync/sync-saga-context/sync-saga-context-types.mjs.map +1 -1
- package/dist/sync/sync-saga-coordinator.d.mts +81 -87
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +627 -571
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +105 -22
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
- package/dist/sync/sync-types.d.mts +56 -76
- package/dist/sync/sync-types.d.mts.map +1 -1
- package/dist/sync/sync-types.mjs +5 -0
- package/dist/sync/sync-types.mjs.map +1 -1
- package/dist/timeline/timeline-api.d.mts.map +1 -1
- package/dist/timeline/timeline-api.mjs +15 -8
- package/dist/timeline/timeline-api.mjs.map +1 -1
- package/dist/witness/light-witness-base-v1.d.mts.map +1 -1
- package/dist/witness/light-witness-base-v1.mjs +2 -0
- package/dist/witness/light-witness-base-v1.mjs.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/common/other/graph-helper.mts +26 -1
- package/src/sync/README.md +31 -22
- package/src/sync/sync-conflict.respec.mts +31 -26
- package/src/sync/sync-constants.mts +19 -9
- package/src/sync/sync-helpers.mts +173 -97
- package/src/sync/sync-innerspace-constants.respec.mts +12 -7
- package/src/sync/sync-innerspace-deep-updates.respec.mts +12 -7
- package/src/sync/sync-innerspace-dest-ahead.respec.mts +14 -9
- package/src/sync/sync-innerspace-multiple-timelines.respec.mts +13 -7
- package/src/sync/sync-innerspace-partial-update.respec.mts +15 -7
- package/src/sync/sync-innerspace.respec.mts +13 -7
- package/src/sync/sync-peer/sync-peer-constants.mts +0 -0
- package/src/sync/sync-peer/sync-peer-helpers.mts +0 -0
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mts +8 -0
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-helpers.mts +72 -0
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mts +72 -0
- package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +193 -0
- package/src/sync/sync-peer/sync-peer-types.mts +30 -1
- package/src/sync/sync-peer/sync-peer-v1.mts +229 -30
- package/src/sync/sync-saga-context/sync-saga-context-helpers.mts +140 -43
- package/src/sync/sync-saga-context/sync-saga-context-types.mts +34 -30
- package/src/sync/sync-saga-coordinator.mts +678 -660
- package/src/sync/sync-saga-message/sync-saga-message-types.mts +106 -22
- package/src/sync/sync-types.mts +59 -87
- package/src/timeline/timeline-api.mts +17 -10
- package/src/witness/light-witness-base-v1.mts +2 -1
- package/src/witness/space/inner-space/inner-space-v1.mts +1 -1
- package/test_output.log +0 -0
- package/tmp.md +62 -44
- package/dist/sync/sync-local-spaces.respec.d.mts +0 -2
- package/dist/sync/sync-local-spaces.respec.d.mts.map +0 -1
- package/dist/sync/sync-local-spaces.respec.mjs +0 -159
- package/dist/sync/sync-local-spaces.respec.mjs.map +0 -1
- package/dist/sync/sync-peer/sync-peer-innerspace-v1.d.mts +0 -42
- package/dist/sync/sync-peer/sync-peer-innerspace-v1.d.mts.map +0 -1
- package/dist/sync/sync-peer/sync-peer-innerspace-v1.mjs +0 -194
- package/dist/sync/sync-peer/sync-peer-innerspace-v1.mjs.map +0 -1
- package/dist/sync/sync-saga-coordinator.respec.d.mts +0 -2
- package/dist/sync/sync-saga-coordinator.respec.d.mts.map +0 -1
- package/dist/sync/sync-saga-coordinator.respec.mjs +0 -40
- package/dist/sync/sync-saga-coordinator.respec.mjs.map +0 -1
- package/src/sync/sync-local-spaces.respec.mts +0 -200
- package/src/sync/sync-peer/sync-peer-innerspace-v1.mts +0 -240
- package/src/sync/sync-saga-coordinator.respec.mts +0 -52
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
export const SYNC_ATOM = "sync";
|
|
2
2
|
|
|
3
|
-
export const SYNC_MSG_REL8N_NAME = "
|
|
4
|
-
export const SYNC_SAGA_PAYLOAD_ADDRS_REL8N_NAME = "@payloadAddrs";
|
|
5
|
-
|
|
3
|
+
export const SYNC_MSG_REL8N_NAME = "syncmsg";
|
|
6
4
|
/**
|
|
7
|
-
*
|
|
5
|
+
* payload addrs should be domain-only, i.e., we are not including the sync
|
|
6
|
+
* saga ibgib, or its message stone, or identity keystones.
|
|
8
7
|
*/
|
|
9
|
-
export const
|
|
8
|
+
export const SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN = "@payloadAddrsDomain";
|
|
10
9
|
|
|
10
|
+
// #region SyncStage
|
|
11
11
|
export const SYNC_STAGE_INIT = "init";
|
|
12
12
|
export const SYNC_STAGE_ACK = "ack";
|
|
13
|
-
export const SYNC_STAGE_REQUEST = "request";
|
|
14
13
|
export const SYNC_STAGE_DELTA = "delta";
|
|
15
14
|
export const SYNC_STAGE_COMMIT = "commit";
|
|
16
15
|
|
|
17
16
|
export type SyncStage =
|
|
18
17
|
| typeof SYNC_STAGE_INIT
|
|
19
18
|
| typeof SYNC_STAGE_ACK
|
|
20
|
-
| typeof SYNC_STAGE_REQUEST
|
|
21
19
|
| typeof SYNC_STAGE_DELTA
|
|
22
20
|
| typeof SYNC_STAGE_COMMIT;
|
|
23
21
|
|
|
24
22
|
export const SyncStage = {
|
|
23
|
+
/**
|
|
24
|
+
* first frame
|
|
25
|
+
*/
|
|
25
26
|
init: SYNC_STAGE_INIT,
|
|
27
|
+
/**
|
|
28
|
+
* 2nd frame, response to init
|
|
29
|
+
*/
|
|
26
30
|
ack: SYNC_STAGE_ACK,
|
|
27
|
-
|
|
31
|
+
/**
|
|
32
|
+
* exchanging/negotiating ibgibs
|
|
33
|
+
*/
|
|
28
34
|
delta: SYNC_STAGE_DELTA,
|
|
35
|
+
/**
|
|
36
|
+
* final phases of sync
|
|
37
|
+
*/
|
|
29
38
|
commit: SYNC_STAGE_COMMIT,
|
|
30
|
-
}
|
|
39
|
+
} satisfies { [key: string]: SyncStage };
|
|
40
|
+
// #endregion SyncStage
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { extractErrorMsg } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
1
|
+
import { extractErrorMsg, getUUID } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
|
|
2
2
|
import { IbGib_V1 } from "@ibgib/ts-gib/dist/V1/types.mjs";
|
|
3
3
|
import { Ib } from "@ibgib/ts-gib/dist/types.mjs";
|
|
4
|
+
import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
|
|
4
5
|
|
|
5
6
|
import { GLOBAL_LOG_A_LOT } from "../core-constants.mjs";
|
|
6
7
|
import { SYNC_ATOM, SYNC_MSG_REL8N_NAME } from "./sync-constants.mjs";
|
|
7
|
-
import { SyncData_V1, SyncIb_V1, SyncIbGib_V1 } from "./sync-types.mjs";
|
|
8
|
+
import { isValidSyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES, SyncData_V1, SyncIb_V1, SyncIbGib_V1, SyncSagaFrameDependencyGraph } from "./sync-types.mjs";
|
|
8
9
|
import { IbGibSpaceAny } from "../witness/space/space-base-v1.mjs";
|
|
9
10
|
import { getFromSpace } from "../witness/space/space-helper.mjs";
|
|
11
|
+
import { IbGibSpaceResultData, IbGibSpaceResultIbGib, IbGibSpaceResultRel8ns } from "../witness/space/space-types.mjs";
|
|
12
|
+
import { KeystoneIbGib_V1 } from "../keystone/keystone-types.mjs";
|
|
10
13
|
|
|
11
14
|
const logalot = GLOBAL_LOG_A_LOT;
|
|
12
15
|
|
|
@@ -68,139 +71,212 @@ export async function parseSyncIb({
|
|
|
68
71
|
}
|
|
69
72
|
|
|
70
73
|
/**
|
|
71
|
-
*
|
|
74
|
+
* @returns the name for a tempSpace in the sync
|
|
75
|
+
*/
|
|
76
|
+
export async function getTempSpaceName(): Promise<string> {
|
|
77
|
+
const uuid = await getUUID();
|
|
78
|
+
return `tmp_sync_space_${uuid.substring(0, 8)}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* UNTESTED
|
|
72
83
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
84
|
+
* Checks if an {@link olderAddr} is the address of a past frame in the ibgib
|
|
85
|
+
* with {@link newerAddr}.
|
|
75
86
|
*/
|
|
76
87
|
export async function isPastFrame({
|
|
77
88
|
olderAddr,
|
|
78
89
|
newerAddr,
|
|
79
90
|
space,
|
|
80
|
-
inMemoryGraph,
|
|
81
91
|
}: {
|
|
82
92
|
olderAddr: string, // Was ancestorAddr
|
|
83
93
|
newerAddr: string, // Was descendantAddr
|
|
84
|
-
space
|
|
85
|
-
inMemoryGraph?: { [addr: string]: IbGib_V1 },
|
|
94
|
+
space: IbGibSpaceAny,
|
|
86
95
|
}): Promise<boolean> {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (inMemoryGraph) {
|
|
91
|
-
// Optimization: Iterate the graph values (or keys) and see if olderAddr is in any 'past'
|
|
92
|
-
// Actually we need to traverse from newerAddr back to olderAddr using the graph.
|
|
93
|
-
|
|
94
|
-
const queue = [newerAddr];
|
|
95
|
-
const visited = new Set<string>();
|
|
96
|
-
|
|
97
|
-
while (queue.length > 0) {
|
|
98
|
-
const currentAddr = queue.shift()!;
|
|
99
|
-
if (visited.has(currentAddr)) continue;
|
|
100
|
-
visited.add(currentAddr);
|
|
101
|
-
|
|
102
|
-
if (currentAddr === olderAddr) return true;
|
|
103
|
-
|
|
104
|
-
const node = inMemoryGraph[currentAddr];
|
|
105
|
-
// If node not in memory graph, we can't traverse further in memory.
|
|
106
|
-
// If we have space, we could fallback, but usually mixed mode is tricky.
|
|
107
|
-
// For now, if provided inMemoryGraph, assume it contains the relevant segment.
|
|
108
|
-
if (!node && space) {
|
|
109
|
-
// optional fallback to space if allowed?
|
|
110
|
-
// User requirement: "at most we are looking... in dependency graph".
|
|
111
|
-
// So let's fallback if space provided.
|
|
112
|
-
const res = await getFromSpace({ space, addr: currentAddr });
|
|
113
|
-
if (res.success && res.ibGibs?.length) {
|
|
114
|
-
const spaceNode = res.ibGibs[0];
|
|
115
|
-
if (spaceNode.rel8ns && spaceNode.rel8ns.past) {
|
|
116
|
-
for (const pastAddr of spaceNode.rel8ns.past) {
|
|
117
|
-
if (!visited.has(pastAddr)) queue.push(pastAddr);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
continue;
|
|
122
|
-
} else if (!node) {
|
|
123
|
-
continue; // Dead end in memory
|
|
124
|
-
}
|
|
96
|
+
const lc = `[${isPastFrame.name}]`;
|
|
97
|
+
try {
|
|
98
|
+
if (logalot) { console.log(`${lc} starting... (I: 4b3548cbc9a2eb749f447ed82fdcf826)`); }
|
|
125
99
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
}
|
|
100
|
+
// quick check...
|
|
101
|
+
if (olderAddr === newerAddr) {
|
|
102
|
+
return true; /* <<<< returns early */
|
|
131
103
|
}
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
104
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
105
|
+
// diff, so get the actual ibGib
|
|
106
|
+
let newerIbGib: IbGib_V1;
|
|
107
|
+
const res = await getFromSpace({ space, addr: newerAddr });
|
|
108
|
+
if (res.success && res.ibGibs?.length === 1) {
|
|
109
|
+
newerIbGib = res.ibGibs[0];
|
|
110
|
+
} else {
|
|
111
|
+
throw new Error(`couldn't get newerAddr (${newerAddr}) from space (${space.ib}). (E: 36c758c22b181b2c89a1cd28937a6826)`);
|
|
112
|
+
}
|
|
140
113
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
114
|
+
if (!newerIbGib.rel8ns) {
|
|
115
|
+
console.warn(`${lc} newerIbGib.rel8ns falsy? newerAddr: ${newerAddr}. (W: 6f920811f7080281189f767813814826)`);
|
|
116
|
+
return false; /* <<<< returns early */
|
|
117
|
+
}
|
|
145
118
|
|
|
146
|
-
|
|
119
|
+
const pastAddrs = newerIbGib.rel8ns.past ?? [];
|
|
120
|
+
if (pastAddrs.length === 0) {
|
|
121
|
+
return false; /* <<<< returns early */
|
|
122
|
+
}
|
|
147
123
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const node = res.ibGibs[0];
|
|
151
|
-
if (node.rel8ns && node.rel8ns.past) {
|
|
152
|
-
for (const pastAddr of node.rel8ns.past) {
|
|
153
|
-
if (!visited.has(pastAddr)) queue.push(pastAddr);
|
|
154
|
-
}
|
|
124
|
+
if (pastAddrs.includes(olderAddr)) {
|
|
125
|
+
return true; /* <<<< returns early */
|
|
155
126
|
}
|
|
127
|
+
|
|
128
|
+
// at this point, for most ibgibs we could leave it here. But
|
|
129
|
+
// conceivably, the past could be a linked rel8n. so recurse on the
|
|
130
|
+
// oldest in the past
|
|
131
|
+
|
|
132
|
+
const oldestAddrInThisPast = pastAddrs[0];
|
|
133
|
+
const resRecurse = await isPastFrame({
|
|
134
|
+
olderAddr,
|
|
135
|
+
newerAddr: oldestAddrInThisPast,
|
|
136
|
+
space,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
return resRecurse;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
142
|
+
throw error;
|
|
143
|
+
} finally {
|
|
144
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
156
145
|
}
|
|
157
146
|
|
|
158
|
-
return false;
|
|
159
147
|
}
|
|
160
148
|
|
|
161
149
|
/**
|
|
162
150
|
* Gets a shallow dependency graph for a Sync Saga Frame.
|
|
163
151
|
*
|
|
152
|
+
* DOES NOT GET THE ENTIRE DEPENDENCY FRAME (INCLUDING PAST).
|
|
153
|
+
*
|
|
164
154
|
* Unlike standard `getDependencyGraph`, this does NOT traverse `ancestor` (history) or `past`.
|
|
165
155
|
* It only retrieves the *content* of the current frame:
|
|
166
156
|
* 1. The Frame itself.
|
|
167
157
|
* 2. The Message Stone(s) (`rel8ns.msg`).
|
|
168
|
-
* 3. The Identity (`rel8ns.identity`).
|
|
158
|
+
* 3. The Identity(s) (`rel8ns.identity`).
|
|
169
159
|
*
|
|
170
160
|
* This is used for efficient transmission of the "Current Step" without re-sending the entire history.
|
|
171
161
|
*/
|
|
172
|
-
export async function
|
|
173
|
-
|
|
174
|
-
|
|
162
|
+
export async function getSyncSagaFrameDependencyGraph({
|
|
163
|
+
sagaIbGib,
|
|
164
|
+
localSpace,
|
|
175
165
|
}: {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}): Promise<
|
|
179
|
-
const lc = `[${
|
|
180
|
-
const result: IbGib_V1[] = [ibGib];
|
|
166
|
+
sagaIbGib: SyncIbGib_V1,
|
|
167
|
+
localSpace: IbGibSpaceAny,
|
|
168
|
+
}): Promise<SyncSagaFrameDependencyGraph> {
|
|
169
|
+
const lc = `[${getSyncSagaFrameDependencyGraph.name}]`;
|
|
181
170
|
|
|
182
171
|
// Helper to fetch and push
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
172
|
+
const fnGet = async (addrs: string[]) => {
|
|
173
|
+
const resGet = await getFromSpace({ space: localSpace, addrs });
|
|
174
|
+
if (resGet.success && resGet.ibGibs?.length === addrs.length) {
|
|
175
|
+
return resGet.ibGibs!;
|
|
176
|
+
} else {
|
|
177
|
+
const resIbGib =
|
|
178
|
+
resGet.rawResultIbGib as IbGibSpaceResultIbGib<IbGib_V1, IbGibSpaceResultData, IbGibSpaceResultRel8ns>
|
|
179
|
+
if (!resIbGib.data) { throw new Error(`(UNEXPECTED) resGet.rawResultIbGib.data falsy? (E: c26c681d2f831fc537ba6f48fee36d26)`); }
|
|
180
|
+
throw new Error(`(UNEXPECTED) couldn't find addrs? addrsNotFound: ${resIbGib.data.addrsNotFound}? (E: 43b7b5a6ad982715c8f3eed69bfa0d26)`);
|
|
191
181
|
}
|
|
192
182
|
};
|
|
193
183
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
184
|
+
const validationErrors = await validateSyncSagaFrame({ sagaIbGib });
|
|
185
|
+
if (validationErrors.length > 0) {
|
|
186
|
+
throw new Error(`invalid sync sagaIbGib. validationErrors: ${validationErrors} (E: 19f9e8c9643858ff41312b62293d2126)`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!sagaIbGib.rel8ns) { throw new Error(`(UNEXPECTED) validated sagaIbGib.rel8ns falsy? (E: 73af48be8bbf271ec5cf78187ce8c826)`); }
|
|
190
|
+
|
|
191
|
+
// msg stones
|
|
192
|
+
const msgStoneAddrs = sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME]!;
|
|
193
|
+
const msgStones = await fnGet(msgStoneAddrs);
|
|
194
|
+
|
|
195
|
+
// identities
|
|
196
|
+
const identities = sagaIbGib.rel8ns.identity && sagaIbGib.rel8ns.identity.length > 0 ?
|
|
197
|
+
await fnGet(sagaIbGib.rel8ns.identity) as KeystoneIbGib_V1[] :
|
|
198
|
+
[];
|
|
199
|
+
|
|
200
|
+
return { sagaIbGib, msgStones, identities, };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* only validates this single frame. does not validate any dependencies or past.
|
|
205
|
+
* @returns array of errors, empty if valid
|
|
206
|
+
*/
|
|
207
|
+
export async function validateSyncSagaFrame({
|
|
208
|
+
sagaIbGib
|
|
209
|
+
}: {
|
|
210
|
+
sagaIbGib: SyncIbGib_V1;
|
|
211
|
+
}): Promise<string[]> {
|
|
212
|
+
const lc = `[${validateSyncSagaFrame.name}]`;
|
|
213
|
+
try {
|
|
214
|
+
if (logalot) { console.log(`${lc} starting... (I: dac978e9ec5820f128fbbff817b82826)`); }
|
|
215
|
+
|
|
216
|
+
const errors: string[] = await validateIbGibIntrinsically({ ibGib: sagaIbGib }) ?? [];
|
|
217
|
+
|
|
218
|
+
// intrinsic errors are a non-starter
|
|
219
|
+
if (errors.length > 0) { return errors; /* <<<< returns early */ }
|
|
220
|
+
|
|
221
|
+
if (sagaIbGib.data) {
|
|
222
|
+
const { data } = sagaIbGib;
|
|
223
|
+
|
|
224
|
+
if (data.uuid) {
|
|
225
|
+
// todo: validate uuid
|
|
226
|
+
} else {
|
|
227
|
+
errors.push(`data.uuid required (E: aa24eeda7b88d22e5832a2e8083c0826)`);
|
|
228
|
+
}
|
|
229
|
+
if (data.timestamp) {
|
|
230
|
+
// todo: validate timestamp
|
|
231
|
+
} else {
|
|
232
|
+
errors.push(`data.timestamp required (E: 9c82a88548f4b63c38687428754b3826)`);
|
|
233
|
+
}
|
|
234
|
+
if (data.timestampMs || data.timestampMs === 0) {
|
|
235
|
+
// todo: validate timestampMs
|
|
236
|
+
} else {
|
|
237
|
+
errors.push(`data.timestampMs required (E: 9c82a88548f4b63c38687428754b3826)`);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (data.conflictStrategy) {
|
|
241
|
+
if (!isValidSyncConflictStrategy(data.conflictStrategy)) {
|
|
242
|
+
errors.push(`data.conflictStrategy (${data.conflictStrategy}) is invalid. Must be one of "${SYNC_CONFLICT_STRATEGY_VALID_VALUES}". (E: 6223a8813b688fa2c8644fa8a491bf26)`)
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
errors.push(`data.conflictStrategy required (E: 9c82a88548f4b63c38687428754b3826)`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (data.expirationTimestamp) {
|
|
249
|
+
// todo: validate expirationTimestamp
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (data.errors) {
|
|
253
|
+
// todo: validate errors?
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (data.successCount) {
|
|
257
|
+
// todo: validate successCount
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
} else {
|
|
261
|
+
errors.push(`sagaIbGib.data falsy (E: 4de5e8de589d0af7245600fb4fe30926)`);
|
|
198
262
|
}
|
|
199
|
-
|
|
200
|
-
if (
|
|
201
|
-
|
|
263
|
+
|
|
264
|
+
if (sagaIbGib.rel8ns) {
|
|
265
|
+
const msgAddrs = sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME];
|
|
266
|
+
if (msgAddrs && msgAddrs.length > 0) {
|
|
267
|
+
// todo: validate the syncmsg addr?
|
|
268
|
+
} else {
|
|
269
|
+
errors.push(`sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME] required. (E: df648dc18148e718682acb4842ecf826)`);
|
|
270
|
+
}
|
|
271
|
+
} else {
|
|
272
|
+
errors.push(`sagaIbGib.rel8ns falsy (E: da37aa492a7275b68a5e1912c7a5e126)`);
|
|
202
273
|
}
|
|
203
|
-
}
|
|
204
274
|
|
|
205
|
-
|
|
275
|
+
return errors;
|
|
276
|
+
} catch (error) {
|
|
277
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
278
|
+
throw error;
|
|
279
|
+
} finally {
|
|
280
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
281
|
+
}
|
|
206
282
|
}
|
|
@@ -16,10 +16,10 @@ import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/index.mjs';
|
|
|
16
16
|
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
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
20
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
21
20
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
22
21
|
import { getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
22
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
23
23
|
|
|
24
24
|
const lc = `[sync-innerspace-constants.respec]`;
|
|
25
25
|
|
|
@@ -69,12 +69,17 @@ await respecfully(sir, `Sync Constants (No TJP)`, async () => {
|
|
|
69
69
|
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
70
70
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
71
71
|
|
|
72
|
-
const peer = new SyncPeerInnerspace_V1({
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
// const peer = new SyncPeerInnerspace_V1({
|
|
73
|
+
// senderSpace: sourceSpace,
|
|
74
|
+
// receiverSpace: destSpace,
|
|
75
|
+
// receiverCoordinator: receiverCoordinator,
|
|
76
|
+
// receiverMetaspace: metaspace,
|
|
77
|
+
// receiverTempSpace: 0 as any, // placeholder this is wrong // just to get to compile
|
|
78
|
+
// senderTempSpace: 0 as any, // placeholder this is wrong // just to get to compile
|
|
79
|
+
// }, {
|
|
80
|
+
// classname: SyncPeerInnerspace_V1.name,
|
|
81
|
+
// });
|
|
82
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
78
83
|
|
|
79
84
|
// 4. Sync C1 (First Pass)
|
|
80
85
|
let resSync = await senderCoordinator.sync({
|
|
@@ -19,9 +19,9 @@ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-inner
|
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
20
|
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
24
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
25
25
|
|
|
26
26
|
const logalot = true;
|
|
27
27
|
const lc = `[sync-innerspace-deep-updates.respec]`;
|
|
@@ -100,12 +100,17 @@ await respecfully(sir, `Sync InnerSpaces (Deep Updates)`, async () => {
|
|
|
100
100
|
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
101
101
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
102
102
|
|
|
103
|
-
const peer = new SyncPeerInnerspace_V1(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
// const peer = new SyncPeerInnerspace_V1(
|
|
104
|
+
// senderSpace: sourceSpace,
|
|
105
|
+
// receiverSpace: destSpace,
|
|
106
|
+
// receiverCoordinator: receiverCoordinator,
|
|
107
|
+
// receiverMetaspace: metaspace,
|
|
108
|
+
// receiverTempSpace: 0 as any, // just to get to compile
|
|
109
|
+
// senderTempSpace: 0 as any, // just to get to compile
|
|
110
|
+
// }, {
|
|
111
|
+
// classname: SyncPeerInnerspace_V1.name,
|
|
112
|
+
// });
|
|
113
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
109
114
|
|
|
110
115
|
// 4. Run Sync
|
|
111
116
|
console.log(`${lc} Running Sync...`);
|
|
@@ -19,9 +19,9 @@ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-inner
|
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
20
|
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
24
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
25
25
|
|
|
26
26
|
const logalot = true;
|
|
27
27
|
const lc = `[sync-innerspace-dest-ahead.respec]`;
|
|
@@ -98,7 +98,7 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
98
98
|
});
|
|
99
99
|
const addrV2 = getIbGibAddr({ ibGib: v2 });
|
|
100
100
|
|
|
101
|
-
await
|
|
101
|
+
await ifWeMight(sir, 'verify setup', async () => {
|
|
102
102
|
// Ensure V2 is ONLY in Dest (it is, per `space: destSpace`)
|
|
103
103
|
// Ensure Source does NOT have V2
|
|
104
104
|
const checkV2InSource = await getFromSpace({ space: sourceSpace, addr: addrV2 });
|
|
@@ -110,12 +110,17 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
110
110
|
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
111
111
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
112
112
|
|
|
113
|
-
const peer = new SyncPeerInnerspace_V1({
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
113
|
+
// const peer = new SyncPeerInnerspace_V1({
|
|
114
|
+
// senderSpace: sourceSpace,
|
|
115
|
+
// receiverSpace: destSpace,
|
|
116
|
+
// receiverCoordinator: receiverCoordinator,
|
|
117
|
+
// receiverMetaspace: metaspace,
|
|
118
|
+
// receiverTempSpace: 0 as any,// this is wrong just getting to build
|
|
119
|
+
// senderTempSpace: 0 as any, // this is wrong just getting to build
|
|
120
|
+
// }, {
|
|
121
|
+
// classname: SyncPeerInnerspace_V1.name
|
|
122
|
+
// });
|
|
123
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
119
124
|
|
|
120
125
|
// 4. Run Sync (Source Pushes V1)
|
|
121
126
|
console.log(`${lc} Running Sync...`);
|
|
@@ -132,7 +137,7 @@ await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
|
132
137
|
// 5. Verify Dest (Should still have V2 as latest)
|
|
133
138
|
console.log(`${lc} Verifying Destination...`);
|
|
134
139
|
|
|
135
|
-
await
|
|
140
|
+
await ifWeMight(sir, `verify dest stays ahead`, async () => {
|
|
136
141
|
// Verify Tip (V2)
|
|
137
142
|
const getV2 = await getFromSpace({ space: destSpace, addr: addrV2 });
|
|
138
143
|
iReckon(sir, getV2.success).asTo('V2 still present in Dest').isGonnaBeTrue();
|
|
@@ -19,9 +19,9 @@ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-inner
|
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
20
|
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
24
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
25
25
|
|
|
26
26
|
const logalot = true;
|
|
27
27
|
const lc = `[sync-innerspace-multiple-timelines.respec]`;
|
|
@@ -104,12 +104,18 @@ await respecfully(sir, `Sync InnerSpaces (Multiple Timelines)`, async () => {
|
|
|
104
104
|
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
105
105
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
106
106
|
|
|
107
|
-
const peer = new SyncPeerInnerspace_V1({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
107
|
+
// const peer = new SyncPeerInnerspace_V1({
|
|
108
|
+
// senderSpace: sourceSpace,
|
|
109
|
+
// receiverSpace: destSpace,
|
|
110
|
+
// receiverCoordinator: receiverCoordinator,
|
|
111
|
+
// receiverMetaspace: metaspace,
|
|
112
|
+
// receiverTempSpace: 0 as any, // just to get to compile
|
|
113
|
+
// senderTempSpace: 0 as any, // just to get to compile
|
|
114
|
+
// }, {
|
|
115
|
+
// classname: SyncPeerInnerspace_V1.name,
|
|
116
|
+
// });
|
|
117
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
118
|
+
await peer.initialized;
|
|
113
119
|
|
|
114
120
|
// 4. Run Sync (Push Both)
|
|
115
121
|
console.log(`${lc} Running Sync...`);
|
|
@@ -19,9 +19,9 @@ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-inner
|
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
20
|
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
21
|
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
22
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
24
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
25
25
|
|
|
26
26
|
const logalot = true;
|
|
27
27
|
const lc = `[sync-innerspace-partial-update.respec]`;
|
|
@@ -112,12 +112,20 @@ await respecfully(sir, `Sync InnerSpaces (Partial Update)`, async () => {
|
|
|
112
112
|
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
113
113
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
114
114
|
|
|
115
|
-
const peer = new SyncPeerInnerspace_V1({
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
// const peer = new SyncPeerInnerspace_V1({
|
|
116
|
+
// senderSpace: sourceSpace,
|
|
117
|
+
// receiverSpace: destSpace,
|
|
118
|
+
// receiverCoordinator: receiverCoordinator,
|
|
119
|
+
// receiverMetaspace: metaspace,
|
|
120
|
+
// receiverTempSpace: 0 as any, // just to get to compile
|
|
121
|
+
// senderTempSpace: 0 as any, // just to get to compile
|
|
122
|
+
// },
|
|
123
|
+
// {
|
|
124
|
+
// classname: SyncPeerInnerspace_V1.name,
|
|
125
|
+
// }
|
|
126
|
+
// );
|
|
127
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
128
|
+
await peer.initialized;
|
|
121
129
|
|
|
122
130
|
// 4. Run Sync (Source Pushes V2)
|
|
123
131
|
console.log(`${lc} Running Sync...`);
|
|
@@ -19,10 +19,10 @@ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-inner
|
|
|
19
19
|
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
20
20
|
import { createTimelineRootHelper, getTestKeystoneServiceHelper } from '../agent-helpers.mjs';
|
|
21
21
|
import { mut8Timeline, } from '../timeline/timeline-api.mjs';
|
|
22
|
-
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace-v1.mjs';
|
|
23
22
|
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
24
23
|
import { toDto } from '../common/other/ibgib-helper.mjs';
|
|
25
24
|
import { fnObs } from '../common/pubsub/observer/observer-helper.mjs';
|
|
25
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
26
26
|
|
|
27
27
|
const logalot = true;
|
|
28
28
|
const lc = `[sync-innerspace.respec]`;
|
|
@@ -103,12 +103,18 @@ await respecfully(sir, `Sync InnerSpaces`, async () => {
|
|
|
103
103
|
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
104
104
|
|
|
105
105
|
// Peer (The "Network")
|
|
106
|
-
const peer = new SyncPeerInnerspace_V1({
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
// const peer = new SyncPeerInnerspace_V1({
|
|
107
|
+
// senderSpace: sourceSpace, // "Client"
|
|
108
|
+
// receiverSpace: destSpace, // "Server"
|
|
109
|
+
// receiverCoordinator: receiverCoordinator,
|
|
110
|
+
// receiverMetaspace: metaspace,
|
|
111
|
+
// senderTempSpace: 0 as any,
|
|
112
|
+
// receiverTempSpace: 0 as any,
|
|
113
|
+
// }, {
|
|
114
|
+
// classname: SyncPeerInnerspace_V1.name,
|
|
115
|
+
// });
|
|
116
|
+
const peer = new SyncPeerInnerspace_V1(0 as any, 0 as any, 0 as any, 0 as any);
|
|
117
|
+
await peer.initialized;
|
|
112
118
|
|
|
113
119
|
// 4. Run Sync
|
|
114
120
|
console.log(`${lc} Running Sync...`);
|
|
File without changes
|
|
File without changes
|