@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.
Files changed (88) hide show
  1. package/dist/keystone/kdf/kdf-constants.d.mts +25 -0
  2. package/dist/keystone/kdf/kdf-constants.d.mts.map +1 -0
  3. package/dist/keystone/kdf/kdf-constants.mjs +28 -0
  4. package/dist/keystone/kdf/kdf-constants.mjs.map +1 -0
  5. package/dist/keystone/kdf/kdf-helpers.d.mts +45 -0
  6. package/dist/keystone/kdf/kdf-helpers.d.mts.map +1 -0
  7. package/dist/keystone/kdf/kdf-helpers.mjs +94 -0
  8. package/dist/keystone/kdf/kdf-helpers.mjs.map +1 -0
  9. package/dist/keystone/kdf/kdf-types.d.mts +49 -0
  10. package/dist/keystone/kdf/kdf-types.d.mts.map +1 -0
  11. package/dist/keystone/kdf/kdf-types.mjs +2 -0
  12. package/dist/keystone/kdf/kdf-types.mjs.map +1 -0
  13. package/dist/keystone/keystone-config-builder.d.mts +65 -12
  14. package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
  15. package/dist/keystone/keystone-config-builder.mjs +138 -46
  16. package/dist/keystone/keystone-config-builder.mjs.map +1 -1
  17. package/dist/keystone/keystone-config-builder.respec.mjs +21 -13
  18. package/dist/keystone/keystone-config-builder.respec.mjs.map +1 -1
  19. package/dist/keystone/keystone-constants.d.mts +15 -0
  20. package/dist/keystone/keystone-constants.d.mts.map +1 -1
  21. package/dist/keystone/keystone-constants.mjs +16 -0
  22. package/dist/keystone/keystone-constants.mjs.map +1 -1
  23. package/dist/keystone/keystone-helpers.d.mts +4 -4
  24. package/dist/keystone/keystone-helpers.d.mts.map +1 -1
  25. package/dist/keystone/keystone-helpers.mjs +8 -5
  26. package/dist/keystone/keystone-helpers.mjs.map +1 -1
  27. package/dist/keystone/keystone-service-v1.d.mts +1 -1
  28. package/dist/keystone/keystone-service-v1.d.mts.map +1 -1
  29. package/dist/keystone/keystone-service-v1.mjs +6 -5
  30. package/dist/keystone/keystone-service-v1.mjs.map +1 -1
  31. package/dist/keystone/keystone-service-v1.respec.mjs +72 -45
  32. package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -1
  33. package/dist/keystone/keystone-types.d.mts +28 -18
  34. package/dist/keystone/keystone-types.d.mts.map +1 -1
  35. package/dist/keystone/keystone-types.mjs +26 -15
  36. package/dist/keystone/keystone-types.mjs.map +1 -1
  37. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.d.mts.map +1 -1
  38. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs +7 -10
  39. package/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs.map +1 -1
  40. package/dist/sync/sync-conflict-text-merge.respec.mjs +26 -26
  41. package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
  42. package/dist/sync/sync-constants.d.mts +9 -0
  43. package/dist/sync/sync-constants.d.mts.map +1 -1
  44. package/dist/sync/sync-constants.mjs +10 -0
  45. package/dist/sync/sync-constants.mjs.map +1 -1
  46. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts +7 -0
  47. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts.map +1 -0
  48. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +282 -0
  49. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +1 -0
  50. package/dist/sync/sync-saga-coordinator.d.mts +22 -11
  51. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  52. package/dist/sync/sync-saga-coordinator.mjs +120 -27
  53. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  54. package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +1 -7
  55. package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
  56. package/dist/sync/sync-types.d.mts +11 -0
  57. package/dist/sync/sync-types.d.mts.map +1 -1
  58. package/dist/sync/sync-types.mjs.map +1 -1
  59. package/dist/test/mock-space.d.mts +1 -38
  60. package/dist/test/mock-space.d.mts.map +1 -1
  61. package/dist/test/mock-space.mjs +73 -78
  62. package/dist/test/mock-space.mjs.map +1 -1
  63. package/package.json +1 -1
  64. package/src/keystone/README.md +119 -0
  65. package/src/keystone/docs/architecture.md +32 -1
  66. package/src/keystone/kdf/kdf-constants.mts +34 -0
  67. package/src/keystone/kdf/kdf-helpers.mts +105 -0
  68. package/src/keystone/kdf/kdf-types.mts +58 -0
  69. package/src/keystone/keystone-config-builder.mts +170 -47
  70. package/src/keystone/keystone-config-builder.respec.mts +21 -14
  71. package/src/keystone/keystone-constants.mts +21 -2
  72. package/src/keystone/keystone-helpers.mts +19 -14
  73. package/src/keystone/keystone-service-v1.mts +23 -22
  74. package/src/keystone/keystone-service-v1.respec.mts +71 -44
  75. package/src/keystone/keystone-types.mts +37 -23
  76. package/src/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mts +9 -13
  77. package/src/sync/README.md +122 -5
  78. package/src/sync/docs/architecture.md +2 -2
  79. package/src/sync/{SYNC_TESTING.md → docs/testing.md} +113 -28
  80. package/src/sync/sync-conflict-text-merge.respec.mts +25 -25
  81. package/src/sync/sync-constants.mts +12 -0
  82. package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +349 -0
  83. package/src/sync/sync-saga-coordinator.mts +158 -33
  84. package/src/sync/sync-saga-message/sync-saga-message-types.mts +1 -7
  85. package/src/sync/sync-types.mts +12 -0
  86. package/src/test/mock-space.mts +72 -72
  87. package/tmp.md +0 -274
  88. 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 to
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":"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"}
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 { SyncStage, SYNC_ATOM, SYNC_MSG_REL8N_NAME, SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN, SyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES, } from "./sync-constants.mjs";
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
- const sessionIdentity = useSessionIdentity
103
- ? await this.getSessionIdentity({ sagaId, metaspace, tempSpace })
104
- : undefined;
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 getSessionIdentity({ sagaId, metaspace, tempSpace, }) {
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
- const config = {
222
- id: 'default',
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: { size: 10, replenish: 'top-up', selectSequentially: 1, selectRandomly: 1, targetBindingChars: 0 },
226
- algo: 'SHA-256', rounds: 1
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: sagaId,
230
- configs: [config],
317
+ masterSecret: sessionSecret,
318
+ configs: [primaryPoolConfig],
231
319
  metaspace,
232
- space: tempSpace
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: 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, identitySecret, metaspace, }) {
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, identitySecret
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,