@ibgib/core-gib 0.1.42 → 0.1.44
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/keystone/kdf/kdf-constants.d.mts +25 -0
- package/dist/keystone/kdf/kdf-constants.d.mts.map +1 -0
- package/dist/keystone/kdf/kdf-constants.mjs +28 -0
- package/dist/keystone/kdf/kdf-constants.mjs.map +1 -0
- package/dist/keystone/kdf/kdf-helpers.d.mts +45 -0
- package/dist/keystone/kdf/kdf-helpers.d.mts.map +1 -0
- package/dist/keystone/kdf/kdf-helpers.mjs +94 -0
- package/dist/keystone/kdf/kdf-helpers.mjs.map +1 -0
- package/dist/keystone/kdf/kdf-types.d.mts +49 -0
- package/dist/keystone/kdf/kdf-types.d.mts.map +1 -0
- package/dist/keystone/kdf/kdf-types.mjs +2 -0
- package/dist/keystone/kdf/kdf-types.mjs.map +1 -0
- package/dist/keystone/keystone-config-builder.d.mts +65 -12
- package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
- package/dist/keystone/keystone-config-builder.mjs +138 -46
- package/dist/keystone/keystone-config-builder.mjs.map +1 -1
- package/dist/keystone/keystone-config-builder.respec.mjs +21 -13
- package/dist/keystone/keystone-config-builder.respec.mjs.map +1 -1
- package/dist/keystone/keystone-constants.d.mts +15 -0
- package/dist/keystone/keystone-constants.d.mts.map +1 -1
- package/dist/keystone/keystone-constants.mjs +16 -0
- package/dist/keystone/keystone-constants.mjs.map +1 -1
- package/dist/keystone/keystone-helpers.d.mts +4 -4
- package/dist/keystone/keystone-helpers.d.mts.map +1 -1
- package/dist/keystone/keystone-helpers.mjs +8 -5
- package/dist/keystone/keystone-helpers.mjs.map +1 -1
- package/dist/keystone/keystone-service-v1.d.mts +1 -1
- package/dist/keystone/keystone-service-v1.d.mts.map +1 -1
- package/dist/keystone/keystone-service-v1.mjs +6 -5
- package/dist/keystone/keystone-service-v1.mjs.map +1 -1
- package/dist/keystone/keystone-service-v1.respec.mjs +72 -45
- package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -1
- package/dist/keystone/keystone-types.d.mts +28 -18
- package/dist/keystone/keystone-types.d.mts.map +1 -1
- package/dist/keystone/keystone-types.mjs +26 -15
- package/dist/keystone/keystone-types.mjs.map +1 -1
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts.map +1 -1
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs +7 -10
- package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs.map +1 -1
- package/dist/sync/sync-conflict-text-merge.respec.mjs +26 -26
- package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
- package/dist/sync/sync-constants.d.mts +9 -0
- package/dist/sync/sync-constants.d.mts.map +1 -1
- package/dist/sync/sync-constants.mjs +10 -0
- package/dist/sync/sync-constants.mjs.map +1 -1
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts +7 -0
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts.map +1 -0
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +282 -0
- package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +1 -0
- package/dist/sync/sync-saga-coordinator.d.mts +22 -11
- package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
- package/dist/sync/sync-saga-coordinator.mjs +120 -27
- package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +1 -7
- package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
- package/dist/sync/sync-types.d.mts +11 -0
- package/dist/sync/sync-types.d.mts.map +1 -1
- package/dist/sync/sync-types.mjs.map +1 -1
- package/dist/test/mock-space.d.mts +1 -38
- package/dist/test/mock-space.d.mts.map +1 -1
- package/dist/test/mock-space.mjs +73 -78
- package/dist/test/mock-space.mjs.map +1 -1
- package/package.json +1 -1
- package/src/keystone/README.md +119 -0
- package/src/keystone/docs/architecture.md +32 -1
- package/src/keystone/kdf/kdf-constants.mts +34 -0
- package/src/keystone/kdf/kdf-helpers.mts +105 -0
- package/src/keystone/kdf/kdf-types.mts +58 -0
- package/src/keystone/keystone-config-builder.mts +170 -47
- package/src/keystone/keystone-config-builder.respec.mts +21 -14
- package/src/keystone/keystone-constants.mts +21 -2
- package/src/keystone/keystone-helpers.mts +19 -14
- package/src/keystone/keystone-service-v1.mts +23 -22
- package/src/keystone/keystone-service-v1.respec.mts +71 -44
- package/src/keystone/keystone-types.mts +37 -23
- package/src/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mts +9 -13
- package/src/sync/README.md +122 -5
- package/src/sync/docs/architecture.md +2 -2
- package/src/sync/{SYNC_TESTING.md → docs/testing.md} +113 -28
- package/src/sync/sync-conflict-text-merge.respec.mts +25 -25
- package/src/sync/sync-constants.mts +12 -0
- package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +349 -0
- package/src/sync/sync-saga-coordinator.mts +158 -33
- package/src/sync/sync-saga-message/sync-saga-message-types.mts +1 -7
- package/src/sync/sync-types.mts +12 -0
- package/src/test/mock-space.mts +72 -72
- package/tmp.md +0 -274
- package/src/sync/docs/verification.md +0 -43
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module sync-innerspace-dest-ahead.respec
|
|
3
|
+
*
|
|
4
|
+
* Verifies Sync Scenario where the receiver is ahead, with identity enabled.
|
|
5
|
+
*/
|
|
6
|
+
import { respecfully, ifWe, iReckon } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
7
|
+
const maam = `[${import.meta.url}]`, sir = maam;
|
|
8
|
+
import { clone, delay, extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
9
|
+
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
10
|
+
import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
|
|
11
|
+
import { putInSpace, getFromSpace, registerNewIbGib } from '../witness/space/space-helper.mjs';
|
|
12
|
+
import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
|
|
13
|
+
import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
|
|
14
|
+
import { createTimelineRootTestHelper, getTestKeystoneServiceHelper } from '../test-helpers.mjs';
|
|
15
|
+
import { mut8Timeline } from '../timeline/timeline-api.mjs';
|
|
16
|
+
import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
|
|
17
|
+
import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
|
|
18
|
+
import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
|
|
19
|
+
import { getDependencyGraph } from '../common/other/graph-helper.mjs';
|
|
20
|
+
import { fnObs } from '../common/pubsub/observer/observer-helper.mjs';
|
|
21
|
+
const logalot = false;
|
|
22
|
+
const lc = `[sync-innerspace-dest-ahead.respec]`;
|
|
23
|
+
await respecfully(sir, `Sync InnerSpaces (Dest Ahead)`, async () => {
|
|
24
|
+
let metaspace;
|
|
25
|
+
let sourceSpace;
|
|
26
|
+
let destSpace;
|
|
27
|
+
await respecfully(sir, `Dest Ahead (Remote Newer)`, async () => {
|
|
28
|
+
// 1. Setup Spaces
|
|
29
|
+
metaspace = new Metaspace_Innerspace(undefined);
|
|
30
|
+
await metaspace.initialize({
|
|
31
|
+
getFnAlert: () => async ({ title, msg }) => { },
|
|
32
|
+
getFnPrompt: () => async ({ title, msg }) => { return ''; },
|
|
33
|
+
getFnPromptPassword: () => async (title, msg) => { return null; },
|
|
34
|
+
});
|
|
35
|
+
while (!metaspace.initialized) {
|
|
36
|
+
await delay(10);
|
|
37
|
+
}
|
|
38
|
+
const defaultLocalUserSpace = await metaspace.getLocalUserSpace({ lock: false });
|
|
39
|
+
await defaultLocalUserSpace.initialized;
|
|
40
|
+
sourceSpace = new InnerSpace_V1({
|
|
41
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
42
|
+
name: 'source',
|
|
43
|
+
uuid: 'source_uuid',
|
|
44
|
+
description: 'source test space',
|
|
45
|
+
});
|
|
46
|
+
await sourceSpace.initialized;
|
|
47
|
+
destSpace = new InnerSpace_V1({
|
|
48
|
+
...DEFAULT_INNER_SPACE_DATA_V1,
|
|
49
|
+
name: 'dest',
|
|
50
|
+
uuid: 'dest_uuid',
|
|
51
|
+
description: 'dest test space',
|
|
52
|
+
});
|
|
53
|
+
await destSpace.initialized;
|
|
54
|
+
// 2. Seed Data
|
|
55
|
+
// Root -> V1 (Shared) -> V2 (Dest has New)
|
|
56
|
+
// Source only has V1.
|
|
57
|
+
const v0 = await createTimelineRootTestHelper({
|
|
58
|
+
ib: 'timeline_root_ff',
|
|
59
|
+
data: { type: 'root', label: 'Root' },
|
|
60
|
+
space: sourceSpace,
|
|
61
|
+
});
|
|
62
|
+
const addrV0 = getIbGibAddr({ ibGib: v0 });
|
|
63
|
+
console.log(pretty(v0));
|
|
64
|
+
// V1 (Both have it, but we create in source and copy to dest)
|
|
65
|
+
const v1 = await mut8Timeline({
|
|
66
|
+
timeline: v0,
|
|
67
|
+
mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1' } },
|
|
68
|
+
metaspace,
|
|
69
|
+
space: sourceSpace,
|
|
70
|
+
});
|
|
71
|
+
const addrV1 = getIbGibAddr({ ibGib: v1 });
|
|
72
|
+
console.log(pretty(v1));
|
|
73
|
+
// Transfer Root & V1 to Dest
|
|
74
|
+
const initialDepGraph = await getDependencyGraph({ ibGibs: [v0, v1], space: sourceSpace });
|
|
75
|
+
await putInSpace({ space: destSpace, ibGibs: Object.values(initialDepGraph) }); // Naive seeding
|
|
76
|
+
await registerNewIbGib({ space: destSpace, ibGib: v0 });
|
|
77
|
+
await registerNewIbGib({ space: destSpace, ibGib: v1 });
|
|
78
|
+
// V2 (Created in Dest ONLY)
|
|
79
|
+
const v2 = await mut8Timeline({
|
|
80
|
+
timeline: v1, // v1 is in memory, linked to source, but we want to Mutate IN DEST SPACE
|
|
81
|
+
mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2' } },
|
|
82
|
+
metaspace,
|
|
83
|
+
space: destSpace, // Mutate in Dest
|
|
84
|
+
});
|
|
85
|
+
const addrV2 = getIbGibAddr({ ibGib: v2 });
|
|
86
|
+
console.log(pretty(v2));
|
|
87
|
+
const fnAddrExistsInSpace = async (addr, space) => {
|
|
88
|
+
const resGet = await getFromSpace({ addr, space });
|
|
89
|
+
return resGet.success && resGet.ibGibs && resGet.ibGibs.length === 1;
|
|
90
|
+
};
|
|
91
|
+
await ifWe(sir, 'verify setup', async () => {
|
|
92
|
+
// Ensure V2 is ONLY in Dest (it is, per `space: destSpace`)
|
|
93
|
+
// Ensure Source does NOT have V2
|
|
94
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV0, sourceSpace)).asTo('source has V0').isGonnaBeTrue();
|
|
95
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV1, sourceSpace)).asTo('source has V1').isGonnaBeTrue();
|
|
96
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV2, sourceSpace)).asTo('source has V2').isGonnaBeFalse();
|
|
97
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV0, destSpace)).asTo('dest has V0').isGonnaBeTrue();
|
|
98
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV1, destSpace)).asTo('dest has V1').isGonnaBeTrue();
|
|
99
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV2, destSpace)).asTo('dest has V2').isGonnaBeTrue();
|
|
100
|
+
});
|
|
101
|
+
// 3. Setup Sync
|
|
102
|
+
const mockKeystone = await getTestKeystoneServiceHelper();
|
|
103
|
+
const senderCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
104
|
+
const receiverCoordinator = new SyncSagaCoordinator(mockKeystone);
|
|
105
|
+
const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
|
|
106
|
+
await peer.initialized;
|
|
107
|
+
await peer.initializeSender({
|
|
108
|
+
senderSpace: sourceSpace, // "Client"
|
|
109
|
+
receiverSpace: destSpace, // "Server"
|
|
110
|
+
receiverCoordinator,
|
|
111
|
+
receiverMetaspace: metaspace,
|
|
112
|
+
});
|
|
113
|
+
// 4. Run Sync (Source Pushes V1)
|
|
114
|
+
console.log(`${lc} Running Sync...`);
|
|
115
|
+
const { done, sagaId, updates$ } = await senderCoordinator.sync({
|
|
116
|
+
peer: peer,
|
|
117
|
+
localSpace: sourceSpace,
|
|
118
|
+
metaspace: metaspace,
|
|
119
|
+
domainIbGibs: [v1], // Source tries to push V1
|
|
120
|
+
useSessionIdentity: true,
|
|
121
|
+
});
|
|
122
|
+
const sublc = `${lc}[updates$]`;
|
|
123
|
+
/**
|
|
124
|
+
* I have added this so you can see how to subscribe to an ibgib
|
|
125
|
+
* observable using {@link fnObs}.
|
|
126
|
+
*/
|
|
127
|
+
const subscription = await updates$.subscribe(fnObs({
|
|
128
|
+
next: async (ctxIbGib) => {
|
|
129
|
+
// console.log(`${sublc} next fired. ${JSON.stringify(ctxIbGib)}`);
|
|
130
|
+
console.log(`${sublc} next fired. (I: e68d8894bac8800f9f3430e8a38d6626)`);
|
|
131
|
+
},
|
|
132
|
+
error: async (e) => {
|
|
133
|
+
if (e.data) {
|
|
134
|
+
console.error(`${sublc} error fired. error: ${JSON.stringify(e.data)} (E: eddf17f76a486b9c5a2f4ee86ed38b26)`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.dir(e);
|
|
138
|
+
console.error(`${sublc} error fired. error: ${extractErrorMsg(e)} (E: af9c3b6f1c88befeff77ca46111b3826)`);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
complete: async () => {
|
|
142
|
+
console.log(`${sublc} complete fired`);
|
|
143
|
+
},
|
|
144
|
+
}));
|
|
145
|
+
await done;
|
|
146
|
+
// TODO: Get saga IbGib to access session keystones
|
|
147
|
+
// Bill suggested either:
|
|
148
|
+
// 1. Subscribe to updates$ to inspect frames as sync progresses
|
|
149
|
+
// 2. Change done from Promise<void> to Promise<IbGibAddr>, return saga addr,
|
|
150
|
+
// then use getIbGibsFromCache_fallbackToSpaces and getFullSyncSagaHistory
|
|
151
|
+
// For now, leaving implementation for next step.
|
|
152
|
+
// 5. Verify Sync (v2 should be in both source and dest now)
|
|
153
|
+
console.log(`${lc} Verifying Sync...`);
|
|
154
|
+
await ifWe(sir, `verify v2 now also in source`, async () => {
|
|
155
|
+
// Verify Tip (V2)
|
|
156
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV0, sourceSpace)).asTo('source has V0').isGonnaBeTrue();
|
|
157
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV1, sourceSpace)).asTo('source has V1').isGonnaBeTrue();
|
|
158
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV2, sourceSpace)).asTo('source has V2').isGonnaBeTrue();
|
|
159
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV0, destSpace)).asTo('dest has V0').isGonnaBeTrue();
|
|
160
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV1, destSpace)).asTo('dest has V1').isGonnaBeTrue();
|
|
161
|
+
iReckon(sir, await fnAddrExistsInSpace(addrV2, destSpace)).asTo('dest has V2').isGonnaBeTrue();
|
|
162
|
+
});
|
|
163
|
+
await ifWe(sir, `dependency graphs the same`, async () => {
|
|
164
|
+
const sourceDepGraph = await getDependencyGraph({
|
|
165
|
+
ibGibAddr: addrV2,
|
|
166
|
+
space: sourceSpace,
|
|
167
|
+
});
|
|
168
|
+
const destDepGraph = await getDependencyGraph({
|
|
169
|
+
ibGibAddr: addrV2,
|
|
170
|
+
space: destSpace,
|
|
171
|
+
});
|
|
172
|
+
const sourceDepGraphAddrs = Object.keys(sourceDepGraph);
|
|
173
|
+
const destDepGraphAddrs = Object.keys(destDepGraph);
|
|
174
|
+
iReckon(sir, sourceDepGraphAddrs.length === destDepGraphAddrs.length).asTo('dep graphs same size').isGonnaBeTrue();
|
|
175
|
+
sourceDepGraphAddrs.forEach(sourceDepAddr => {
|
|
176
|
+
iReckon(sir, destDepGraphAddrs.includes(sourceDepAddr)).asTo(`${sourceDepAddr} is both graphs`).isGonnaBeTrue();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
// ========================================================================
|
|
180
|
+
// IDENTITY-RELATED ASSERTIONS (TDD - Expose Implementation Gaps)
|
|
181
|
+
// ========================================================================
|
|
182
|
+
// Need to capture session identity and saga context from sync result
|
|
183
|
+
// For now, we'll retrieve from spaces after sync completes
|
|
184
|
+
let sessionKeystoneAddr;
|
|
185
|
+
await ifWe(sir, 'IDENTITY: session keystone exists in sender space', async () => {
|
|
186
|
+
// TODO: Get saga IbGib and access sessionKeystones rel8n
|
|
187
|
+
// Once saga access is implemented (per Bill's guidance), retrieve keystone addr from:
|
|
188
|
+
// const keystoneAddrs = sagaIbGib.rel8ns?.sessionKeystones;
|
|
189
|
+
// Then verify keystone exists in space
|
|
190
|
+
// Placeholder - test passes because keystone creation works
|
|
191
|
+
iReckon(sir, true)
|
|
192
|
+
.asTo('session keystone created (saga access TODO)')
|
|
193
|
+
.isGonnaBeTrue();
|
|
194
|
+
});
|
|
195
|
+
await ifWe(sir, 'IDENTITY: session keystone exists in receiver space', async () => {
|
|
196
|
+
// Session keystone should be transferred to receiver's durable space
|
|
197
|
+
iReckon(sir, sessionKeystoneAddr)
|
|
198
|
+
.asTo('session keystone address was captured')
|
|
199
|
+
.isGonnaBeTruthy();
|
|
200
|
+
if (sessionKeystoneAddr) {
|
|
201
|
+
const destResult = await getFromSpace({ addr: sessionKeystoneAddr, space: destSpace });
|
|
202
|
+
iReckon(sir, destResult.success)
|
|
203
|
+
.asTo('receiver has session keystone')
|
|
204
|
+
.isGonnaBeTrue();
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
await ifWe(sir, 'IDENTITY: saga frames are signed', async () => {
|
|
208
|
+
// TODO: Get saga frames and check each has a proof
|
|
209
|
+
// This will FAIL when we actually check - that's the point (TDD RED)
|
|
210
|
+
iReckon(sir, false)
|
|
211
|
+
.asTo('saga frames have proofs (NOT IMPLEMENTED - should fail)')
|
|
212
|
+
.isGonnaBeTrue();
|
|
213
|
+
});
|
|
214
|
+
await ifWe(sir, 'IDENTITY: frame signatures are valid', async () => {
|
|
215
|
+
// TODO: For each saga frame, validate proof against session keystone
|
|
216
|
+
// const isValid = await validateProofWithKeystone({
|
|
217
|
+
// proof: frame.proof,
|
|
218
|
+
// keystone: sessionKeystone,
|
|
219
|
+
// targetFrame: frame
|
|
220
|
+
// });
|
|
221
|
+
// iReckon(sir, isValid).asTo('proof is valid').isGonnaBeTrue();
|
|
222
|
+
// Placeholder for now
|
|
223
|
+
iReckon(sir, true)
|
|
224
|
+
.asTo('proof validation not yet implemented')
|
|
225
|
+
.isGonnaBeTrue();
|
|
226
|
+
});
|
|
227
|
+
await ifWe(sir, 'IDENTITY: session keystone challenges are depleted', async () => {
|
|
228
|
+
// TODO: Session keystone should evolve after signing frames
|
|
229
|
+
// This will FAIL because keystone evolution not implemented yet
|
|
230
|
+
iReckon(sir, false)
|
|
231
|
+
.asTo('challenges depleted (NOT IMPLEMENTED - should fail)')
|
|
232
|
+
.isGonnaBeTrue();
|
|
233
|
+
});
|
|
234
|
+
await ifWe(sir, 'IDENTITY: frame timestamps are present and fresh', async () => {
|
|
235
|
+
// TODO: Check each frame has timestamp in proof claim
|
|
236
|
+
// const claim = JSON.parse(frame.proof.claim.scope);
|
|
237
|
+
// iReckon(sir, claim.timestamp).asTo('has timestamp').isGonnaBeTruthy();
|
|
238
|
+
// const age = Date.now() - claim.timestamp;
|
|
239
|
+
// iReckon(sir, age < 60000).asTo('timestamp is fresh (<60s)').isGonnaBeTrue();
|
|
240
|
+
// Placeholder
|
|
241
|
+
iReckon(sir, true)
|
|
242
|
+
.asTo('timestamp validation not yet implemented')
|
|
243
|
+
.isGonnaBeTrue();
|
|
244
|
+
});
|
|
245
|
+
await ifWe(sir, 'IDENTITY: keystone has no hard links to domain ibgibs', async () => {
|
|
246
|
+
if (sessionKeystoneAddr) {
|
|
247
|
+
const keystoneResult = await getFromSpace({
|
|
248
|
+
addr: sessionKeystoneAddr,
|
|
249
|
+
space: sourceSpace
|
|
250
|
+
});
|
|
251
|
+
if (keystoneResult.success && keystoneResult.ibGibs && keystoneResult.ibGibs.length > 0) {
|
|
252
|
+
const keystone = keystoneResult.ibGibs[0];
|
|
253
|
+
const rel8ns = keystone.rel8ns || {};
|
|
254
|
+
const allRel8nAddrs = Object.values(rel8ns)
|
|
255
|
+
.flat()
|
|
256
|
+
.filter(addr => typeof addr === 'string');
|
|
257
|
+
const domainAddrs = [addrV0, addrV1, addrV2];
|
|
258
|
+
for (const domainAddr of domainAddrs) {
|
|
259
|
+
iReckon(sir, allRel8nAddrs.includes(domainAddr))
|
|
260
|
+
.asTo(`keystone does not hard link to ${domainAddr}`)
|
|
261
|
+
.isGonnaBeFalse();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
await ifWe(sir, 'IDENTITY: saga frames have no hard links to domain ibgibs', async () => {
|
|
267
|
+
// Saga frames should NOT have hard links to domain ibgibs
|
|
268
|
+
// This currently PASSES but will expose issues if hard links exist
|
|
269
|
+
iReckon(sir, true)
|
|
270
|
+
.asTo('hard link validation (placeholder)')
|
|
271
|
+
.isGonnaBeTrue();
|
|
272
|
+
// TODO: Get saga frames and check their rel8ns
|
|
273
|
+
// for (const frame of sagaFrames) {
|
|
274
|
+
// const rel8nAddrs = Object.values(frame.rel8ns || {}).flat();
|
|
275
|
+
// for (const domainAddr of [addrV0, addrV1, addrV2]) {
|
|
276
|
+
// iReckon(sir, rel8nAddrs.includes(domainAddr)).asTo get('no hard link').isGonnaBeFalse();
|
|
277
|
+
// }
|
|
278
|
+
// }
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=sync-innerspace-dest-ahead-withid.respec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-innerspace-dest-ahead-withid.respec.mjs","sourceRoot":"","sources":["../../src/sync/sync-innerspace-dest-ahead-withid.respec.mts"],"names":[],"mappings":"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"}
|
|
@@ -30,14 +30,8 @@ export declare class SyncSagaCoordinator {
|
|
|
30
30
|
* @remarks
|
|
31
31
|
* **Execution Context**: **Sender (Local)**.
|
|
32
32
|
* This method is the entry point for starting a sync session.
|
|
33
|
-
*
|
|
34
|
-
* @param opts.peer - The remote peer witness to communicate with.
|
|
35
|
-
* @param opts.localSpace - The local space that will be read from and written to.
|
|
36
|
-
* @param opts.metaspace - Service for creating temp spaces and managing ibgibs.
|
|
37
|
-
* @param opts.domainIbGibs - The root ibgibs defining the scope of the sync.
|
|
38
|
-
* @param opts.useSessionIdentity - (Optional) Whether to create an ephemeral session identity. Default: true.
|
|
39
33
|
*/
|
|
40
|
-
sync({ peer, domainIbGibs, conflictStrategy, useSessionIdentity, metaspace, localSpace, }: {
|
|
34
|
+
sync({ peer, domainIbGibs, conflictStrategy, useSessionIdentity, identity, identitySecret, metaspace, localSpace, }: {
|
|
41
35
|
/**
|
|
42
36
|
* The peer we are syncing with.
|
|
43
37
|
*/
|
|
@@ -50,7 +44,8 @@ export declare class SyncSagaCoordinator {
|
|
|
50
44
|
*/
|
|
51
45
|
domainIbGibs: IbGib_V1[];
|
|
52
46
|
/**
|
|
53
|
-
* The space containing the {@link domainIbGibs} we want to sync.
|
|
47
|
+
* The space containing the {@link domainIbGibs} we want to sync. If
|
|
48
|
+
* sync is successful, any updates to timelines will be stored here.
|
|
54
49
|
*/
|
|
55
50
|
localSpace: IbGibSpaceAny;
|
|
56
51
|
/**
|
|
@@ -58,11 +53,17 @@ export declare class SyncSagaCoordinator {
|
|
|
58
53
|
*/
|
|
59
54
|
metaspace: MetaspaceService;
|
|
60
55
|
/**
|
|
61
|
-
* The identity authorizing this sync.
|
|
56
|
+
* The primary (i.e. non-session) identity authorizing this sync.
|
|
57
|
+
*
|
|
58
|
+
* If this is truthy, then {@link identitySecret} must also be provided.
|
|
62
59
|
*/
|
|
63
60
|
identity?: KeystoneIbGib_V1;
|
|
64
61
|
/**
|
|
65
62
|
* The secret for the identity (to sign the commit).
|
|
63
|
+
*
|
|
64
|
+
* If provided, this will drive both signing {@link identity} keystone
|
|
65
|
+
* (if provided) AND session keystone (if {@link useSessionIdentity} is
|
|
66
|
+
* true).
|
|
66
67
|
*/
|
|
67
68
|
identitySecret?: string;
|
|
68
69
|
/**
|
|
@@ -73,8 +74,10 @@ export declare class SyncSagaCoordinator {
|
|
|
73
74
|
*/
|
|
74
75
|
conflictStrategy?: SyncConflictStrategy;
|
|
75
76
|
/**
|
|
76
|
-
* If true, creates an ephemeral session identity for the sync process
|
|
77
|
-
* secure the sync transaction itself.
|
|
77
|
+
* If true, creates an ephemeral session identity for the sync process
|
|
78
|
+
* to secure the sync transaction itself.
|
|
79
|
+
*
|
|
80
|
+
* If this is true, {@link identitySecret} must also be provided.
|
|
78
81
|
*
|
|
79
82
|
* @default true
|
|
80
83
|
*/
|
|
@@ -101,10 +104,18 @@ export declare class SyncSagaCoordinator {
|
|
|
101
104
|
* Local temp space relative to the execution context's POV
|
|
102
105
|
*/
|
|
103
106
|
myTempSpace: IbGibSpaceAny;
|
|
107
|
+
/**
|
|
108
|
+
* @see {@link sync} `identity` param.
|
|
109
|
+
*/
|
|
104
110
|
identity?: KeystoneIbGib_V1;
|
|
111
|
+
/**
|
|
112
|
+
* @see {@link sync} `identitySecret` param.
|
|
113
|
+
*/
|
|
105
114
|
identitySecret?: string;
|
|
106
115
|
metaspace: MetaspaceService;
|
|
107
116
|
}): Promise<SyncSagaContextIbGib_V1 | null>;
|
|
117
|
+
private getSessionSecret;
|
|
118
|
+
private getInitialWeakDelegateSessionSecret;
|
|
108
119
|
private getSessionIdentity;
|
|
109
120
|
/**
|
|
110
121
|
* Drives the FSM loop of the Saga.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-saga-coordinator.d.mts","sourceRoot":"","sources":["../../src/sync/sync-saga-coordinator.mts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAG,MAAM,iCAAiC,CAAC;AAI5D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"sync-saga-coordinator.d.mts","sourceRoot":"","sources":["../../src/sync/sync-saga-coordinator.mts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,9 @@ import { getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
|
|
|
4
4
|
import { Factory_V1 } from "@ibgib/ts-gib/dist/V1/factory.mjs";
|
|
5
5
|
import { GLOBAL_LOG_A_LOT } from "../core-constants.mjs";
|
|
6
6
|
import { putInSpace, getLatestAddrs, getFromSpace, registerNewIbGib } from "../witness/space/space-helper.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { deriveKey } from "../keystone/kdf/kdf-helpers.mjs";
|
|
8
|
+
import { KdfStrategy } from "../keystone/kdf/kdf-constants.mjs";
|
|
9
|
+
import { SyncStage, SYNC_ATOM, SYNC_MSG_REL8N_NAME, SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN, SyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES, DEFAULT_SESSION_IDENTITY_INITIAL_DELEGATE_SECRET, } from "./sync-constants.mjs";
|
|
8
10
|
import { appendToTimeline, createTimeline, getHistory, getHistoryAddrs } from "../timeline/timeline-api.mjs";
|
|
9
11
|
import { SyncMode, } from "./sync-types.mjs";
|
|
10
12
|
import { getSyncSagaFrameOrigin, getFullSyncSagaHistory, getSyncIb, getTempSpaceName, isPastFrame, putInSpace_dnasThenNonDnas, validateFullSyncSagaHistory, getAllOrphanedAddresses, getFinalConflictsInfo } from "./sync-helpers.mjs";
|
|
@@ -19,6 +21,7 @@ import { fnObs } from "../common/pubsub/observer/observer-helper.mjs";
|
|
|
19
21
|
import { graftTimelines, } from "./graft-info/graft-info-helpers.mjs";
|
|
20
22
|
import { GRAFT_INFO_REL8N_NAME } from "./graft-info/graft-info-constants.mjs";
|
|
21
23
|
import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
|
|
24
|
+
import { KEYSTONE_VERB_MANAGE } from "../keystone/keystone-constants.mjs";
|
|
22
25
|
const logalot = GLOBAL_LOG_A_LOT;
|
|
23
26
|
const logalotControlDomain = false;
|
|
24
27
|
const lcControlDomain = '[ControlDomain]';
|
|
@@ -47,14 +50,8 @@ export class SyncSagaCoordinator {
|
|
|
47
50
|
* @remarks
|
|
48
51
|
* **Execution Context**: **Sender (Local)**.
|
|
49
52
|
* This method is the entry point for starting a sync session.
|
|
50
|
-
*
|
|
51
|
-
* @param opts.peer - The remote peer witness to communicate with.
|
|
52
|
-
* @param opts.localSpace - The local space that will be read from and written to.
|
|
53
|
-
* @param opts.metaspace - Service for creating temp spaces and managing ibgibs.
|
|
54
|
-
* @param opts.domainIbGibs - The root ibgibs defining the scope of the sync.
|
|
55
|
-
* @param opts.useSessionIdentity - (Optional) Whether to create an ephemeral session identity. Default: true.
|
|
56
53
|
*/
|
|
57
|
-
async sync({ peer, domainIbGibs, conflictStrategy = SyncConflictStrategy.abort, useSessionIdentity = true, metaspace, localSpace, }) {
|
|
54
|
+
async sync({ peer, domainIbGibs, conflictStrategy = SyncConflictStrategy.abort, useSessionIdentity = true, identity, identitySecret, metaspace, localSpace, }) {
|
|
58
55
|
const lc = `${this.lc}[${this.sync.name}]`;
|
|
59
56
|
if (logalot) {
|
|
60
57
|
console.log(`${lc} starting...`);
|
|
@@ -99,9 +96,13 @@ export class SyncSagaCoordinator {
|
|
|
99
96
|
(async () => {
|
|
100
97
|
try {
|
|
101
98
|
// BOOTSTRAP IDENTITY (Session Keystone)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
let sessionIdentity = undefined;
|
|
100
|
+
if (useSessionIdentity) {
|
|
101
|
+
if (!identitySecret) {
|
|
102
|
+
throw new Error(`useSessionIdentity is true, but identitySecret is falsy. Must provide a secret if you want to use a session identity. (E: 81915860c4dd3ea4dfd81825fa74c126)`);
|
|
103
|
+
}
|
|
104
|
+
sessionIdentity = await this.getSessionIdentity({ sagaId, identitySecret, metaspace, localSpace });
|
|
105
|
+
}
|
|
105
106
|
// if (logalot) { console.log(`${lc} sessionIdentity: ${sessionIdentity ? pretty(sessionIdentity) : 'undefined'} (I: abc01872800b3a66b819a05898bba826)`); }
|
|
106
107
|
// CREATE INITIAL FRAME (Stage.init)
|
|
107
108
|
const { initFrame, initDomainGraph } = await this.createInitFrame({
|
|
@@ -115,6 +116,7 @@ export class SyncSagaCoordinator {
|
|
|
115
116
|
await this.executeSagaLoop({
|
|
116
117
|
initFrame, initDomainGraph,
|
|
117
118
|
peer,
|
|
119
|
+
identitySecret,
|
|
118
120
|
sessionIdentity,
|
|
119
121
|
updates$,
|
|
120
122
|
localSpace,
|
|
@@ -163,7 +165,6 @@ export class SyncSagaCoordinator {
|
|
|
163
165
|
mySpace,
|
|
164
166
|
myTempSpace,
|
|
165
167
|
identity,
|
|
166
|
-
identitySecret,
|
|
167
168
|
metaspace,
|
|
168
169
|
});
|
|
169
170
|
if (!contextResult) {
|
|
@@ -212,25 +213,115 @@ export class SyncSagaCoordinator {
|
|
|
212
213
|
}
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
|
-
async
|
|
216
|
+
async getSessionSecret({ sagaId, identitySecret, }) {
|
|
217
|
+
const lc = `${this.lc}[${this.getSessionSecret.name}]`;
|
|
218
|
+
try {
|
|
219
|
+
if (logalot) {
|
|
220
|
+
console.log(`${lc} starting... (I: 0de03f8dcd3e32f1fca244e8f2a8a826)`);
|
|
221
|
+
}
|
|
222
|
+
// Derive session-specific secret using KDF
|
|
223
|
+
const sessionSecret = await deriveKey({
|
|
224
|
+
masterSecret: identitySecret,
|
|
225
|
+
kdfOpts: {
|
|
226
|
+
strategy: KdfStrategy.recursive_salt_wrap,
|
|
227
|
+
salt: sagaId,
|
|
228
|
+
rounds: 10000,
|
|
229
|
+
algorithm: 'SHA-256'
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return sessionSecret;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
if (logalot) {
|
|
240
|
+
console.log(`${lc} complete.`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async getInitialWeakDelegateSessionSecret({ sagaId, }) {
|
|
245
|
+
const lc = `${this.lc}[${this.getInitialWeakDelegateSessionSecret.name}]`;
|
|
246
|
+
try {
|
|
247
|
+
if (logalot) {
|
|
248
|
+
console.log(`${lc} starting... (I: 872ab81a78827b9f2822b78459203226)`);
|
|
249
|
+
}
|
|
250
|
+
// Create delegate pool bootstrap secret (publicly derivable)
|
|
251
|
+
const initialDelegateSecret = await deriveKey({
|
|
252
|
+
masterSecret: DEFAULT_SESSION_IDENTITY_INITIAL_DELEGATE_SECRET, // Weak, publicly derivable secret
|
|
253
|
+
kdfOpts: {
|
|
254
|
+
strategy: KdfStrategy.recursive_salt_wrap,
|
|
255
|
+
salt: sagaId,
|
|
256
|
+
rounds: 1, // Minimal rounds - this is meant to be weak
|
|
257
|
+
algorithm: 'SHA-256'
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
return initialDelegateSecret;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
if (logalot) {
|
|
268
|
+
console.log(`${lc} complete.`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async getSessionIdentity({ sagaId, identitySecret, metaspace, localSpace, }) {
|
|
216
273
|
const lc = `${this.lc}[${this.getSessionIdentity.name}]`;
|
|
217
274
|
try {
|
|
218
275
|
if (logalot) {
|
|
219
276
|
console.log(`${lc} starting... (I: 428392a4ee636b7bd8f7d5d89a87e826)`);
|
|
220
277
|
}
|
|
221
|
-
|
|
222
|
-
|
|
278
|
+
if (!identitySecret) {
|
|
279
|
+
throw new Error(`(UNEXPECTED) identitySecret falsy? This is expected to be truthy by this point. (E: 8ce053fe59825a6678713128953b9d26)`);
|
|
280
|
+
}
|
|
281
|
+
const sessionSecret = await this.getSessionSecret({ sagaId, identitySecret });
|
|
282
|
+
const init = await this.getInitialWeakDelegateSessionSecret({ sagaId });
|
|
283
|
+
// Create TWO pool configs: Primary (strong) + Delegate (weak bootstrap)
|
|
284
|
+
const primaryPoolConfig = {
|
|
285
|
+
allowedVerbs: [KEYSTONE_VERB_MANAGE],
|
|
286
|
+
id: 'primary',
|
|
223
287
|
type: 'hash-reveal-v1',
|
|
224
288
|
salt: sagaId,
|
|
225
|
-
behavior: {
|
|
226
|
-
|
|
289
|
+
behavior: {
|
|
290
|
+
size: 100, // Large pool for many signatures
|
|
291
|
+
replenish: 'top-up',
|
|
292
|
+
selectSequentially: 2,
|
|
293
|
+
selectRandomly: 2,
|
|
294
|
+
targetBindingChars: 10
|
|
295
|
+
},
|
|
296
|
+
algo: 'SHA-256',
|
|
297
|
+
rounds: 1
|
|
227
298
|
};
|
|
299
|
+
const delegatePoolConfig = {
|
|
300
|
+
id: 'delegate',
|
|
301
|
+
type: 'hash-reveal-v1',
|
|
302
|
+
salt: sagaId,
|
|
303
|
+
behavior: {
|
|
304
|
+
size: 10, // Small pool - only for initial handshake
|
|
305
|
+
replenish: 'top-up',
|
|
306
|
+
selectSequentially: 1,
|
|
307
|
+
selectRandomly: 1,
|
|
308
|
+
targetBindingChars: 0
|
|
309
|
+
},
|
|
310
|
+
algo: 'SHA-256',
|
|
311
|
+
rounds: 1
|
|
312
|
+
};
|
|
313
|
+
// Generate keystone with DUAL pools. We have to first genesis with
|
|
314
|
+
// one and then add the other, because we have two distinct
|
|
315
|
+
// secrets.
|
|
228
316
|
const sessionIdentity = await this.keystone.genesis({
|
|
229
|
-
masterSecret:
|
|
230
|
-
configs: [
|
|
317
|
+
masterSecret: sessionSecret,
|
|
318
|
+
configs: [primaryPoolConfig],
|
|
231
319
|
metaspace,
|
|
232
|
-
space:
|
|
320
|
+
space: localSpace
|
|
233
321
|
});
|
|
322
|
+
// TODO: Store delegate pool separate challenges derived from bootstrap secret
|
|
323
|
+
// This allows receiver to verify/evolve the delegate pool
|
|
324
|
+
// For now, the keystone genesis with multiple configs handles this
|
|
234
325
|
return sessionIdentity;
|
|
235
326
|
}
|
|
236
327
|
catch (error) {
|
|
@@ -258,7 +349,7 @@ export class SyncSagaCoordinator {
|
|
|
258
349
|
* the NEXT request context.
|
|
259
350
|
* When the Peer responds with data (in the response context), it is resolved and put into `tempSpace`.
|
|
260
351
|
*/
|
|
261
|
-
async executeSagaLoop({ initFrame, initDomainGraph, peer, sessionIdentity, updates$, localSpace, tempSpace, metaspace }) {
|
|
352
|
+
async executeSagaLoop({ initFrame, initDomainGraph, peer, sessionIdentity, identitySecret, updates$, localSpace, tempSpace, metaspace }) {
|
|
262
353
|
const lc = `${this.lc}[${this.executeSagaLoop.name}]`;
|
|
263
354
|
/** The current frame we just generated (e.g., Init or Delta Request) */
|
|
264
355
|
let currentFrame = initFrame;
|
|
@@ -566,7 +657,7 @@ export class SyncSagaCoordinator {
|
|
|
566
657
|
const sagaFrame = await this.evolveSyncSagaIbGib({
|
|
567
658
|
msgStones: [initStone],
|
|
568
659
|
conflictStrategy,
|
|
569
|
-
sessionIdentity
|
|
660
|
+
sessionIdentity,
|
|
570
661
|
metaspace,
|
|
571
662
|
localSpace,
|
|
572
663
|
});
|
|
@@ -669,7 +760,7 @@ export class SyncSagaCoordinator {
|
|
|
669
760
|
* receiver, since the sender's {@link executeSagaLoop} is what actually
|
|
670
761
|
* drives the ping-pong process.
|
|
671
762
|
*/
|
|
672
|
-
async handleResponseSagaContext({ sagaContext, initDomainGraph, mySpace, myTempSpace, identity,
|
|
763
|
+
async handleResponseSagaContext({ sagaContext, initDomainGraph, mySpace, myTempSpace, identity, metaspace, }) {
|
|
673
764
|
const lc = `${this.lc}[${this.handleResponseSagaContext.name}]`;
|
|
674
765
|
try {
|
|
675
766
|
if (logalot) {
|
|
@@ -694,7 +785,7 @@ export class SyncSagaCoordinator {
|
|
|
694
785
|
sagaIbGib,
|
|
695
786
|
messageData: messageData,
|
|
696
787
|
metaspace, mySpace, myTempSpace,
|
|
697
|
-
identity,
|
|
788
|
+
identity,
|
|
698
789
|
});
|
|
699
790
|
break;
|
|
700
791
|
case SyncStage.ack:
|
|
@@ -759,9 +850,7 @@ export class SyncSagaCoordinator {
|
|
|
759
850
|
* 3. Identifies what Receiver needs (`deltaRequestAddrInfos`).
|
|
760
851
|
* 4. Returns an `Ack` frame containing these lists.
|
|
761
852
|
*/
|
|
762
|
-
async handleInitFrame({ sagaIbGib, messageData, mySpace, myTempSpace, metaspace, identity,
|
|
763
|
-
// identitySecret,
|
|
764
|
-
}) {
|
|
853
|
+
async handleInitFrame({ sagaIbGib, messageData, mySpace, myTempSpace, metaspace, identity, }) {
|
|
765
854
|
const lc = `${this.lc}[${this.handleInitFrame.name}]`;
|
|
766
855
|
try {
|
|
767
856
|
if (logalot) {
|
|
@@ -2284,6 +2373,10 @@ export class SyncSagaCoordinator {
|
|
|
2284
2373
|
if (identityAddr) {
|
|
2285
2374
|
rel8ns.identity = [identityAddr];
|
|
2286
2375
|
}
|
|
2376
|
+
// Attach session keystone to saga frame via hard rel8n
|
|
2377
|
+
if (sessionIdentity) {
|
|
2378
|
+
rel8ns.sessionKeystones = [getIbGibAddr({ ibGib: sessionIdentity })];
|
|
2379
|
+
}
|
|
2287
2380
|
const resNew = await createTimeline({
|
|
2288
2381
|
space: localSpace,
|
|
2289
2382
|
metaspace,
|