@ibgib/core-gib 0.1.60 → 0.1.61

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 (179) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/dist/common/other/graph-helper.d.mts.map +1 -1
  3. package/dist/common/other/graph-helper.mjs +7 -6
  4. package/dist/common/other/graph-helper.mjs.map +1 -1
  5. package/dist/keystone/keystone-config-builder.d.mts +1 -2
  6. package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
  7. package/dist/keystone/keystone-config-builder.mjs +4 -19
  8. package/dist/keystone/keystone-config-builder.mjs.map +1 -1
  9. package/dist/keystone/keystone-constants.d.mts +2 -0
  10. package/dist/keystone/keystone-constants.d.mts.map +1 -1
  11. package/dist/keystone/keystone-constants.mjs +2 -0
  12. package/dist/keystone/keystone-constants.mjs.map +1 -1
  13. package/dist/keystone/keystone-helpers.d.mts +5 -15
  14. package/dist/keystone/keystone-helpers.d.mts.map +1 -1
  15. package/dist/keystone/keystone-helpers.mjs +59 -73
  16. package/dist/keystone/keystone-helpers.mjs.map +1 -1
  17. package/dist/keystone/keystone-policy-types.d.mts +6 -4
  18. package/dist/keystone/keystone-policy-types.d.mts.map +1 -1
  19. package/dist/keystone/keystone-service-v1.d.mts.map +1 -1
  20. package/dist/keystone/keystone-service-v1.mjs +4 -8
  21. package/dist/keystone/keystone-service-v1.mjs.map +1 -1
  22. package/dist/keystone/keystone-service-v1.respec.mjs +182 -33
  23. package/dist/keystone/keystone-service-v1.respec.mjs.map +1 -1
  24. package/dist/keystone/keystone-types.d.mts +4 -11
  25. package/dist/keystone/keystone-types.d.mts.map +1 -1
  26. package/dist/keystone/policy/keystone-profile-builder.d.mts +25 -0
  27. package/dist/keystone/policy/keystone-profile-builder.d.mts.map +1 -0
  28. package/dist/keystone/policy/keystone-profile-builder.mjs +117 -0
  29. package/dist/keystone/policy/keystone-profile-builder.mjs.map +1 -0
  30. package/dist/keystone/policy/profiles/profile-high.json +84 -0
  31. package/dist/keystone/policy/profiles/profile-low.json +84 -0
  32. package/dist/keystone/policy/profiles/profile-medium.json +84 -0
  33. package/dist/keystone/policy/profiles/profile-session.json +84 -0
  34. package/dist/keystone/policy/profiles/profile-test.json +84 -0
  35. package/dist/keystone/policy/schemas/connect-pool.high.schema.json +23 -0
  36. package/dist/keystone/policy/schemas/connect-pool.low.schema.json +23 -0
  37. package/dist/keystone/policy/schemas/connect-pool.medium.schema.json +23 -0
  38. package/dist/keystone/policy/schemas/keystone.high.schema.json +26 -0
  39. package/dist/keystone/policy/schemas/keystone.low.schema.json +26 -0
  40. package/dist/keystone/policy/schemas/keystone.medium.schema.json +26 -0
  41. package/dist/keystone/policy/schemas/manage-pool.high.schema.json +23 -0
  42. package/dist/keystone/policy/schemas/manage-pool.low.schema.json +23 -0
  43. package/dist/keystone/policy/schemas/manage-pool.medium.schema.json +23 -0
  44. package/dist/keystone/policy/schemas/revoke-pool.high.schema.json +23 -0
  45. package/dist/keystone/policy/schemas/revoke-pool.low.schema.json +23 -0
  46. package/dist/keystone/policy/schemas/revoke-pool.medium.schema.json +23 -0
  47. package/dist/keystone/policy/schemas/sign-pool.high.schema.json +23 -0
  48. package/dist/keystone/policy/schemas/sign-pool.low.schema.json +23 -0
  49. package/dist/keystone/policy/schemas/sign-pool.medium.schema.json +23 -0
  50. package/dist/keystone/policy/schemas/sync-pool.high.schema.json +23 -0
  51. package/dist/keystone/policy/schemas/sync-pool.low.schema.json +23 -0
  52. package/dist/keystone/policy/schemas/sync-pool.medium.schema.json +23 -0
  53. package/dist/sync/sync-conflict-adv-multitimelines.withid.respec.d.mts +8 -0
  54. package/dist/sync/sync-conflict-adv-multitimelines.withid.respec.d.mts.map +1 -0
  55. package/dist/sync/sync-conflict-adv-multitimelines.withid.respec.mjs +582 -0
  56. package/dist/sync/sync-conflict-adv-multitimelines.withid.respec.mjs.map +1 -0
  57. package/dist/sync/sync-conflict-basic-divergence.withid.respec.d.mts +7 -0
  58. package/dist/sync/sync-conflict-basic-divergence.withid.respec.d.mts.map +1 -0
  59. package/dist/sync/sync-conflict-basic-divergence.withid.respec.mjs +274 -0
  60. package/dist/sync/sync-conflict-basic-divergence.withid.respec.mjs.map +1 -0
  61. package/dist/sync/sync-conflict-basic-multitimelines.withid.respec.d.mts +8 -0
  62. package/dist/sync/sync-conflict-basic-multitimelines.withid.respec.d.mts.map +1 -0
  63. package/dist/sync/sync-conflict-basic-multitimelines.withid.respec.mjs +322 -0
  64. package/dist/sync/sync-conflict-basic-multitimelines.withid.respec.mjs.map +1 -0
  65. package/dist/sync/sync-conflict-text-merge.withid.respec.d.mts +7 -0
  66. package/dist/sync/sync-conflict-text-merge.withid.respec.d.mts.map +1 -0
  67. package/dist/sync/sync-conflict-text-merge.withid.respec.mjs +307 -0
  68. package/dist/sync/sync-conflict-text-merge.withid.respec.mjs.map +1 -0
  69. package/dist/sync/sync-innerspace-constants.withid.respec.d.mts +8 -0
  70. package/dist/sync/sync-innerspace-constants.withid.respec.d.mts.map +1 -0
  71. package/dist/sync/sync-innerspace-constants.withid.respec.mjs +233 -0
  72. package/dist/sync/sync-innerspace-constants.withid.respec.mjs.map +1 -0
  73. package/dist/sync/sync-innerspace-deep-updates.withid.respec.d.mts +7 -0
  74. package/dist/sync/sync-innerspace-deep-updates.withid.respec.d.mts.map +1 -0
  75. package/dist/sync/sync-innerspace-deep-updates.withid.respec.mjs +233 -0
  76. package/dist/sync/sync-innerspace-deep-updates.withid.respec.mjs.map +1 -0
  77. package/dist/sync/sync-innerspace-dest-ahead.withid.respec.d.mts +7 -0
  78. package/dist/sync/sync-innerspace-dest-ahead.withid.respec.d.mts.map +1 -0
  79. package/dist/sync/sync-innerspace-dest-ahead.withid.respec.mjs +225 -0
  80. package/dist/sync/sync-innerspace-dest-ahead.withid.respec.mjs.map +1 -0
  81. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
  82. package/dist/sync/sync-innerspace-multiple-timelines.withid.respec.d.mts +7 -0
  83. package/dist/sync/sync-innerspace-multiple-timelines.withid.respec.d.mts.map +1 -0
  84. package/dist/sync/sync-innerspace-multiple-timelines.withid.respec.mjs +235 -0
  85. package/dist/sync/sync-innerspace-multiple-timelines.withid.respec.mjs.map +1 -0
  86. package/dist/sync/sync-innerspace-partial-update.withid.respec.d.mts +7 -0
  87. package/dist/sync/sync-innerspace-partial-update.withid.respec.d.mts.map +1 -0
  88. package/dist/sync/sync-innerspace-partial-update.withid.respec.mjs +211 -0
  89. package/dist/sync/sync-innerspace-partial-update.withid.respec.mjs.map +1 -0
  90. package/dist/sync/sync-innerspace.withid.respec.d.mts +8 -0
  91. package/dist/sync/sync-innerspace.withid.respec.d.mts.map +1 -0
  92. package/dist/sync/sync-innerspace.withid.respec.mjs +260 -0
  93. package/dist/sync/sync-innerspace.withid.respec.mjs.map +1 -0
  94. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts +1 -0
  95. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -1
  96. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs +13 -4
  97. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -1
  98. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts +1 -1
  99. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -1
  100. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs +5 -3
  101. package/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -1
  102. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  103. package/dist/sync/sync-saga-coordinator.mjs +165 -145
  104. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  105. package/dist/sync/sync-withid.pingpong.respec.mjs +8 -8
  106. package/dist/sync/sync-withid.pingpong.respec.mjs.map +1 -1
  107. package/dist/timeline/timeline-api.d.mts.map +1 -1
  108. package/dist/timeline/timeline-api.mjs +1 -14
  109. package/dist/timeline/timeline-api.mjs.map +1 -1
  110. package/dist/witness/space/reconciliation-space/reconciliation-space-base.d.mts.map +1 -1
  111. package/dist/witness/space/reconciliation-space/reconciliation-space-base.mjs +0 -40
  112. package/dist/witness/space/reconciliation-space/reconciliation-space-base.mjs.map +1 -1
  113. package/dist/witness/space/reconciliation-space/reconciliation-space-helper.d.mts.map +1 -1
  114. package/dist/witness/space/reconciliation-space/reconciliation-space-helper.mjs +6 -6
  115. package/dist/witness/space/reconciliation-space/reconciliation-space-helper.mjs.map +1 -1
  116. package/ibgib-foundations.md +2 -1
  117. package/package.json +1 -1
  118. package/src/common/other/graph-helper.mts +7 -6
  119. package/src/keystone/README.md +19 -15
  120. package/src/keystone/docs/CRYPTANALYSIS.md +185 -0
  121. package/src/keystone/docs/architecture.md +24 -1
  122. package/src/keystone/docs/profiles.md +124 -0
  123. package/src/keystone/keystone-config-builder.mts +3 -21
  124. package/src/keystone/keystone-constants.mts +2 -0
  125. package/src/keystone/keystone-helpers.mts +74 -77
  126. package/src/keystone/keystone-policy-types.mts +6 -4
  127. package/src/keystone/keystone-service-v1.mts +4 -9
  128. package/src/keystone/keystone-service-v1.respec.mts +214 -32
  129. package/src/keystone/keystone-types.mts +5 -9
  130. package/src/keystone/policy/IMPLEMENTATION.md +60 -0
  131. package/src/keystone/policy/README.md +94 -0
  132. package/src/keystone/policy/keystone-profile-builder.mts +131 -0
  133. package/src/keystone/policy/profiles/profile-high.json +84 -0
  134. package/src/keystone/policy/profiles/profile-low.json +84 -0
  135. package/src/keystone/policy/profiles/profile-medium.json +84 -0
  136. package/src/keystone/policy/profiles/profile-session.json +84 -0
  137. package/src/keystone/policy/profiles/profile-test.json +84 -0
  138. package/src/keystone/policy/schemas/connect-pool.high.schema.json +23 -0
  139. package/src/keystone/policy/schemas/connect-pool.low.schema.json +23 -0
  140. package/src/keystone/policy/schemas/connect-pool.medium.schema.json +23 -0
  141. package/src/keystone/policy/schemas/keystone.high.schema.json +26 -0
  142. package/src/keystone/policy/schemas/keystone.low.schema.json +26 -0
  143. package/src/keystone/policy/schemas/keystone.medium.schema.json +26 -0
  144. package/src/keystone/policy/schemas/manage-pool.high.schema.json +23 -0
  145. package/src/keystone/policy/schemas/manage-pool.low.schema.json +23 -0
  146. package/src/keystone/policy/schemas/manage-pool.medium.schema.json +23 -0
  147. package/src/keystone/policy/schemas/revoke-pool.high.schema.json +23 -0
  148. package/src/keystone/policy/schemas/revoke-pool.low.schema.json +23 -0
  149. package/src/keystone/policy/schemas/revoke-pool.medium.schema.json +23 -0
  150. package/src/keystone/policy/schemas/sign-pool.high.schema.json +23 -0
  151. package/src/keystone/policy/schemas/sign-pool.low.schema.json +23 -0
  152. package/src/keystone/policy/schemas/sign-pool.medium.schema.json +23 -0
  153. package/src/keystone/policy/schemas/sync-pool.high.schema.json +23 -0
  154. package/src/keystone/policy/schemas/sync-pool.low.schema.json +23 -0
  155. package/src/keystone/policy/schemas/sync-pool.medium.schema.json +23 -0
  156. package/src/sync/docs/security.md +54 -21
  157. package/src/sync/sync-conflict-adv-multitimelines.withid.respec.mts +706 -0
  158. package/src/sync/sync-conflict-basic-divergence.withid.respec.mts +321 -0
  159. package/src/sync/sync-conflict-basic-multitimelines.withid.respec.mts +374 -0
  160. package/src/sync/sync-conflict-text-merge.withid.respec.mts +347 -0
  161. package/src/sync/sync-innerspace-constants.withid.respec.mts +264 -0
  162. package/src/sync/sync-innerspace-deep-updates.withid.respec.mts +272 -0
  163. package/src/sync/sync-innerspace-dest-ahead.withid.respec.mts +266 -0
  164. package/src/sync/sync-innerspace-multiple-timelines.respec.mts +0 -1
  165. package/src/sync/sync-innerspace-multiple-timelines.withid.respec.mts +273 -0
  166. package/src/sync/sync-innerspace-partial-update.withid.respec.mts +249 -0
  167. package/src/sync/sync-innerspace.withid.respec.mts +265 -0
  168. package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mts +12 -4
  169. package/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mts +5 -3
  170. package/src/sync/sync-saga-coordinator.mts +159 -143
  171. package/src/sync/sync-withid.pingpong.respec.mts +8 -8
  172. package/src/timeline/timeline-api.mts +1 -15
  173. package/src/timeline/timeline-api.respec.mts +3 -3
  174. package/src/witness/space/reconciliation-space/reconciliation-space-base.mts +0 -46
  175. package/src/witness/space/reconciliation-space/reconciliation-space-helper.mts +6 -5
  176. package/tsconfig.json +6 -1
  177. package/src/keystone/keystone-policy.schema.json +0 -51
  178. package/src/witness/space/reconciliation-space/reconciliation-space-base.mts.OLD.md +0 -884
  179. package/src/witness/space/reconciliation-space/reconciliation-space-helper.mts.OLD.md +0 -125
@@ -0,0 +1,273 @@
1
+ /**
2
+ * @module sync-innerspace-multiple-timelines.withid.respec
3
+ *
4
+ * Verifies syncing multiple independent timelines with Identity.
5
+ */
6
+
7
+ import {
8
+ respecfully, respecfullyDear, iReckon, ifWe, ifWeMight
9
+ } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
10
+ const maam = `[${import.meta.url}]`, sir = maam;
11
+ import { clone, delay, extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
12
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
13
+ import { getDependencyGraph, graphsAreEquivalent } from '../common/other/graph-helper.mjs';
14
+
15
+ import { GLOBAL_LOG_A_LOT } from '../core-constants.mjs';
16
+ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
17
+ import { getFromSpace } from '../witness/space/space-helper.mjs';
18
+ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
19
+ import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
20
+ import { createTimelineRootTestHelper } from '../test-helpers.mjs';
21
+ import { mut8Timeline } from '../timeline/timeline-api.mjs';
22
+ import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
23
+ import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
24
+ import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
25
+
26
+ import { KeystoneService_V1 } from '../keystone/keystone-service-v1.mjs';
27
+ import {
28
+ KEYSTONE_VERB_SYNC, POOL_ID_SYNC,
29
+ } from '../keystone/keystone-constants.mjs';
30
+ import { createStandardPoolConfig } from '../keystone/keystone-config-builder.mjs';
31
+ import { KeystoneReplenishStrategy } from '../keystone/keystone-types.mjs';
32
+
33
+ const logalot = GLOBAL_LOG_A_LOT || true;
34
+ const lc = `[sync-innerspace-multiple-timelines.withid.respec]`;
35
+
36
+ const SENDER_SECRET = 'test-sender-secret-multiple-timelines-withid';
37
+
38
+ const SENDER_IDENTITY_SYNC_POOL_CONFIG = createStandardPoolConfig({
39
+ id: POOL_ID_SYNC,
40
+ salt: 'senderidentitysyncsaltmultipletimelineswithid',
41
+ verbs: [KEYSTONE_VERB_SYNC],
42
+ size: 200,
43
+ sequential: 1,
44
+ random: 1,
45
+ targetBinding: 2,
46
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
47
+ });
48
+
49
+ await respecfully(sir, `Sync InnerSpaces (Multiple Timelines) with Identity`, async () => {
50
+
51
+ let metaspace: Metaspace_Innerspace;
52
+ let sourceSpace: InnerSpace_V1;
53
+ let destSpace: InnerSpace_V1;
54
+
55
+ interface TestData {
56
+ type: string;
57
+ label?: string;
58
+ uuid?: string;
59
+ n?: number;
60
+ }
61
+
62
+ // #region Round 1 - Multiple Timelines Push Sync
63
+ await respecfully(sir, `Multiple Timelines (Push Source -> Dest with Identity)`, async () => {
64
+ // 1. Setup Spaces
65
+ metaspace = new Metaspace_Innerspace(undefined);
66
+ await metaspace.initialize({
67
+ getFnAlert: () => async ({ title, msg }) => { console.log(`[Alert] ${title}: ${msg}`); },
68
+ getFnPrompt: () => async ({ title, msg }) => { console.log(`[Prompt] ${title}: ${msg}`); return ''; },
69
+ getFnPromptPassword: () => async (title, msg) => { console.log(`[PromptPwd] ${title}: ${msg}`); return null; },
70
+ });
71
+ while (!metaspace.initialized) { await delay(10); }
72
+
73
+ sourceSpace = new InnerSpace_V1({
74
+ ...DEFAULT_INNER_SPACE_DATA_V1,
75
+ name: 'source',
76
+ uuid: 'source_uuid',
77
+ description: 'source test space',
78
+ });
79
+ await sourceSpace.initialized;
80
+
81
+ destSpace = new InnerSpace_V1({
82
+ ...DEFAULT_INNER_SPACE_DATA_V1,
83
+ name: 'dest',
84
+ uuid: 'dest_uuid',
85
+ description: 'dest test space',
86
+ });
87
+ await destSpace.initialized;
88
+
89
+ // 2. Setup Identities
90
+ const keystoneSvc = new KeystoneService_V1();
91
+ const r1_senderIdentity_v0_source = await keystoneSvc.genesis({
92
+ masterSecret: SENDER_SECRET,
93
+ configs: [SENDER_IDENTITY_SYNC_POOL_CONFIG],
94
+ metaspace,
95
+ space: sourceSpace,
96
+ });
97
+
98
+ // Register sender identity on destination space as well
99
+ await metaspace.put({ ibGib: r1_senderIdentity_v0_source, space: destSpace });
100
+ await metaspace.registerNewIbGib({ ibGib: r1_senderIdentity_v0_source, space: destSpace });
101
+
102
+ // #region r1 setup
103
+ // 3. Seed Source Data (Multiple Independent Timelines)
104
+ console.log(`${lc} Creating data in Source...`);
105
+
106
+ // Timeline A
107
+ const r1_alpha_v0_source = await createTimelineRootTestHelper<TestData>({
108
+ ib: 'timeline_root_A',
109
+ data: { type: 'root', label: 'A' },
110
+ space: sourceSpace,
111
+ });
112
+ const r1_alpha_v1_source = await mut8Timeline<TestData>({
113
+ timeline: r1_alpha_v0_source,
114
+ mut8Opts: { dataToAddOrPatch: { type: 'child', label: 'A1' } },
115
+ metaspace,
116
+ space: sourceSpace,
117
+ });
118
+ const r1_alpha_v1_source_addr = getIbGibAddr({ ibGib: r1_alpha_v1_source });
119
+
120
+ // Timeline B
121
+ const r1_beta_v0_source = await createTimelineRootTestHelper<TestData>({
122
+ ib: 'timeline_root_B',
123
+ data: { type: 'root', label: 'B' },
124
+ space: sourceSpace,
125
+ });
126
+ const r1_beta_v1_source = await mut8Timeline<TestData>({
127
+ timeline: r1_beta_v0_source,
128
+ mut8Opts: { dataToAddOrPatch: { type: 'child', label: 'B1' } },
129
+ metaspace,
130
+ space: sourceSpace,
131
+ });
132
+ const r1_beta_v2_source = await mut8Timeline<TestData>({
133
+ timeline: r1_beta_v1_source,
134
+ mut8Opts: { dataToAddOrPatch: { type: 'child', label: 'B2' } },
135
+ metaspace,
136
+ space: sourceSpace,
137
+ });
138
+ const r1_beta_v2_source_addr = getIbGibAddr({ ibGib: r1_beta_v2_source });
139
+ // #endregion r1 setup
140
+
141
+ // #region r1 verify pre
142
+ await respecfully(sir, `r1 verify pre`, async () => {
143
+ await ifWe(sir, `Dest does not have any of the timeline frames initially`, async () => {
144
+ const getA1 = await getFromSpace({ space: destSpace, addr: r1_alpha_v1_source_addr });
145
+ const getA0 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: r1_alpha_v0_source }) });
146
+ const getB2 = await getFromSpace({ space: destSpace, addr: r1_beta_v2_source_addr });
147
+ const getB1 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: r1_beta_v1_source }) });
148
+ const getB0 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: r1_beta_v0_source }) });
149
+
150
+ iReckon(sir, getA1.success || getA0.success || getB2.success || getB1.success || getB0.success).asTo('Dest initially lacks alpha and beta frames').isGonnaBeFalse();
151
+ });
152
+ });
153
+ // #endregion r1 verify pre
154
+
155
+ // 4. Setup Coordinator & Peer
156
+ const senderCoordinator = new SyncSagaCoordinator();
157
+ const receiverCoordinator = new SyncSagaCoordinator();
158
+
159
+ const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
160
+ await peer.initialized;
161
+ await peer.initializeOpts({
162
+ sagaId: '',
163
+ localMetaspace: metaspace,
164
+ localSpace: sourceSpace, // "Client"
165
+ receiverSpace: destSpace, // "Server"
166
+ receiverCoordinator,
167
+ receiverMetaspace: metaspace,
168
+ });
169
+
170
+ // #region r1 syncs
171
+ // 5. Run Sync (Sync both tips: A1 and B2)
172
+ console.log(`${lc} Running Sync...`);
173
+ const resSync = await senderCoordinator.sync({
174
+ peer: peer,
175
+ localSpace: sourceSpace,
176
+ metaspace: metaspace,
177
+ domainIbGibs: [r1_alpha_v1_source, r1_beta_v2_source],
178
+ senderIdentity: r1_senderIdentity_v0_source,
179
+ fnSenderSecret: async () => SENDER_SECRET,
180
+ });
181
+ await resSync.done;
182
+ // #endregion r1 syncs
183
+
184
+ // #region r1 verify post
185
+ await respecfully(sir, `r1 verify post`, async () => {
186
+ await ifWe(sir, `verify timelines present and correct in Dest`, async () => {
187
+ // Verify A
188
+ const getA1 = await getFromSpace({ space: destSpace, addr: r1_alpha_v1_source_addr });
189
+ iReckon(sir, getA1.success).asTo('Timeline A present').isGonnaBeTrue();
190
+ iReckon(sir, getA1.ibGibs?.[0]?.data?.label).asTo('Label A match').isGonnaBe('A1');
191
+
192
+ // Verify B
193
+ const getB2 = await getFromSpace({ space: destSpace, addr: r1_beta_v2_source_addr });
194
+ iReckon(sir, getB2.success).asTo('Timeline B present').isGonnaBeTrue();
195
+ iReckon(sir, getB2.ibGibs?.[0]?.data?.label).asTo('Label B match').isGonnaBe('B2');
196
+ });
197
+
198
+ await ifWe(sir, 'sessionIdentity evolved the expected number of times', async () => {
199
+ const latestS = peer.currentSessionIdentity;
200
+ iReckon(sir, latestS).asTo('latest session identity exists on peer').isGonnaBeTruthy();
201
+ if (latestS) {
202
+ iReckon(sir, latestS.data?.n).asTo('session identity data.n').isGonnaBe(2);
203
+ }
204
+ });
205
+
206
+ await ifWe(sir, 'sender durable space has I (evolved frame)', async () => {
207
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
208
+ addr: getIbGibAddr({ ibGib: r1_senderIdentity_v0_source }),
209
+ space: sourceSpace,
210
+ });
211
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
212
+ if (latestSenderIdentityAddr) {
213
+ const resGetSourceI = await getFromSpace({ space: sourceSpace, addr: latestSenderIdentityAddr });
214
+ iReckon(sir, resGetSourceI.success && resGetSourceI.ibGibs?.length === 1).asTo('evolved I exists in sourceSpace').isGonnaBeTrue();
215
+ if (resGetSourceI.success && resGetSourceI.ibGibs?.[0]) {
216
+ const evolvedI = resGetSourceI.ibGibs[0];
217
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
218
+ }
219
+ }
220
+ });
221
+
222
+ await ifWe(sir, 'receiver durable space has I (evolved frame)', async () => {
223
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
224
+ addr: getIbGibAddr({ ibGib: r1_senderIdentity_v0_source }),
225
+ space: sourceSpace,
226
+ });
227
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
228
+ if (latestSenderIdentityAddr) {
229
+ const resGetDestI = await getFromSpace({ space: destSpace, addr: latestSenderIdentityAddr });
230
+ iReckon(sir, resGetDestI.success && resGetDestI.ibGibs?.length === 1).asTo('evolved I exists in destSpace').isGonnaBeTrue();
231
+ if (resGetDestI.success && resGetDestI.ibGibs?.[0]) {
232
+ const evolvedI = resGetDestI.ibGibs[0];
233
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
234
+ }
235
+ }
236
+ });
237
+
238
+ await ifWe(sir, 'sender durable space has full S dep graph', async () => {
239
+ const latestS = peer.currentSessionIdentity;
240
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
241
+ if (latestS) {
242
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: sourceSpace });
243
+ const addrs = Object.keys(depGraphS);
244
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph > 2').isGonnaBeTrue();
245
+ }
246
+ });
247
+
248
+ await ifWe(sir, 'receiver durable space has full S dep graph', async () => {
249
+ const latestS = peer.currentSessionIdentity;
250
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
251
+ if (latestS) {
252
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: destSpace });
253
+ const addrs = Object.keys(depGraphS);
254
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph in destSpace > 2').isGonnaBeTrue();
255
+ }
256
+ });
257
+
258
+ await ifWe(sir, 'session keystone dependency graphs are equivalent on source and dest', async () => {
259
+ const latestS = peer.currentSessionIdentity;
260
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
261
+ if (latestS) {
262
+ const depGraphSource = await getDependencyGraph({ ibGib: latestS, space: sourceSpace });
263
+ const depGraphDest = await getDependencyGraph({ ibGib: latestS, space: destSpace });
264
+ const equal = graphsAreEquivalent({ graphA: depGraphSource, graphB: depGraphDest });
265
+ iReckon(sir, equal).asTo('session graphs are equivalent').isGonnaBeTrue();
266
+ }
267
+ });
268
+ });
269
+ // #endregion r1 verify post
270
+ });
271
+ // #endregion Round 1 - Multiple Timelines Push Sync
272
+
273
+ });
@@ -0,0 +1,249 @@
1
+ /**
2
+ * @module sync-innerspace-partial-update.withid.respec
3
+ *
4
+ * Verifies Sync Scenarios where the Destination has partial history, using Identity.
5
+ */
6
+
7
+ import {
8
+ respecfully, ifWe, ifWeMight, iReckon
9
+ } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
10
+ const maam = `[${import.meta.url}]`, sir = maam;
11
+ import { clone, delay } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
12
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
13
+ import { getDependencyGraph } from '../common/other/graph-helper.mjs';
14
+
15
+ import { SyncSagaCoordinator } from './sync-saga-coordinator.mjs';
16
+ import { putInSpace, getFromSpace } from '../witness/space/space-helper.mjs';
17
+ import { Metaspace_Innerspace } from '../witness/space/metaspace/metaspace-innerspace/metaspace-innerspace.mjs';
18
+ import { InnerSpace_V1 } from '../witness/space/inner-space/inner-space-v1.mjs';
19
+ import { createTimelineRootTestHelper, } from '../test-helpers.mjs';
20
+ import { mut8Timeline } from '../timeline/timeline-api.mjs';
21
+ import { DEFAULT_INNER_SPACE_DATA_V1 } from '../witness/space/inner-space/inner-space-types.mjs';
22
+ import { SyncPeerInnerspace_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs';
23
+ import { SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1 } from './sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs';
24
+
25
+ import { KeystoneService_V1 } from '../keystone/keystone-service-v1.mjs';
26
+ import {
27
+ KEYSTONE_VERB_SYNC, POOL_ID_SYNC,
28
+ } from '../keystone/keystone-constants.mjs';
29
+ import { createStandardPoolConfig } from '../keystone/keystone-config-builder.mjs';
30
+ import { KeystoneReplenishStrategy, KeystoneIbGib_V1 } from '../keystone/keystone-types.mjs';
31
+
32
+ const logalot = true;
33
+ const lc = `[sync-innerspace-partial-update.withid.respec]`;
34
+
35
+ const SENDER_SECRET = 'test-sender-secret-partial-update-withid';
36
+
37
+ const SENDER_IDENTITY_SYNC_POOL_CONFIG = createStandardPoolConfig({
38
+ id: POOL_ID_SYNC,
39
+ salt: 'senderidentitysyncsaltpartialupdatewithid',
40
+ verbs: [KEYSTONE_VERB_SYNC],
41
+ size: 200,
42
+ sequential: 1,
43
+ random: 1,
44
+ targetBinding: 2,
45
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
46
+ });
47
+
48
+ await respecfully(sir, `Sync InnerSpaces (Partial Update) with Identity`, async () => {
49
+
50
+ let metaspace: Metaspace_Innerspace;
51
+ let sourceSpace: InnerSpace_V1;
52
+ let destSpace: InnerSpace_V1;
53
+
54
+ interface TestData {
55
+ type: string;
56
+ label?: string;
57
+ uuid?: string;
58
+ n?: number;
59
+ }
60
+
61
+ // #region Round 1 - Sync Destination with Partial History
62
+ await respecfully(sir, `Sender Newer (Partial History) (Source -> Dest)`, async () => {
63
+ // 1. Setup Spaces
64
+ metaspace = new Metaspace_Innerspace(undefined);
65
+ await metaspace.initialize({
66
+ getFnAlert: () => async ({ title, msg }) => { },
67
+ getFnPrompt: () => async ({ title, msg }) => { return ''; },
68
+ getFnPromptPassword: () => async (title, msg) => { return null; },
69
+ });
70
+ while (!metaspace.initialized) { await delay(10); }
71
+
72
+ sourceSpace = new InnerSpace_V1({
73
+ ...DEFAULT_INNER_SPACE_DATA_V1,
74
+ name: 'source',
75
+ uuid: 'source_uuid',
76
+ description: 'source test space',
77
+ });
78
+ await sourceSpace.initialized;
79
+
80
+ destSpace = new InnerSpace_V1({
81
+ ...DEFAULT_INNER_SPACE_DATA_V1,
82
+ name: 'dest',
83
+ uuid: 'dest_uuid',
84
+ description: 'dest test space',
85
+ });
86
+ await destSpace.initialized;
87
+
88
+ const keystoneSvc = new KeystoneService_V1();
89
+ const r1_senderIdentity_v0_source = await keystoneSvc.genesis({
90
+ masterSecret: SENDER_SECRET,
91
+ configs: [SENDER_IDENTITY_SYNC_POOL_CONFIG],
92
+ metaspace,
93
+ space: sourceSpace,
94
+ });
95
+
96
+ // post the senderIdentity to receiver
97
+ await metaspace.put({ ibGib: r1_senderIdentity_v0_source, space: destSpace });
98
+ await metaspace.registerNewIbGib({ ibGib: r1_senderIdentity_v0_source, space: destSpace });
99
+
100
+ // #region r1 setup
101
+ // 2. Create Timeline: Root -> V1 (Shared) -> V2 (Source Only)
102
+ const r1_alpha_v0_source = await createTimelineRootTestHelper<TestData>({
103
+ ib: 'timeline_root_partial',
104
+ data: { type: 'root', label: 'Root' },
105
+ space: sourceSpace,
106
+ });
107
+
108
+ // V1
109
+ const r1_alpha_v1_source = await mut8Timeline<TestData>({
110
+ timeline: r1_alpha_v0_source,
111
+ mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1' } },
112
+ metaspace,
113
+ space: sourceSpace,
114
+ });
115
+
116
+ // V2 (Source Only)
117
+ const r1_alpha_v2_source = await mut8Timeline<TestData>({
118
+ timeline: r1_alpha_v1_source,
119
+ mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2' } },
120
+ metaspace,
121
+ space: sourceSpace,
122
+ });
123
+ const r1_alpha_v2_source_addr = getIbGibAddr({ ibGib: r1_alpha_v2_source });
124
+
125
+ // Transfer Root & V1 to Dest (Simulate previous sync)
126
+ await putInSpace({ space: destSpace, ibGibs: [r1_alpha_v0_source, r1_alpha_v1_source] });
127
+ // #endregion r1 setup
128
+
129
+ // #region r1 verify pre
130
+ await respecfully(sir, `r1 verify pre`, async () => {
131
+ await ifWe(sir, `Dest has V1 but not V2 initially`, async () => {
132
+ // Verify Dest has V1
133
+ const checkV1 = await getFromSpace({ space: destSpace, addr: getIbGibAddr({ ibGib: r1_alpha_v1_source }) });
134
+ iReckon(sir, checkV1.success).asTo('Dest has V1').isGonnaBeTrue();
135
+
136
+ // Verify Dest does NOT have V2
137
+ const checkV2 = await getFromSpace({ space: destSpace, addr: r1_alpha_v2_source_addr });
138
+ iReckon(sir, checkV2.success && !!checkV2.ibGibs?.length).asTo('Dest does not have V2').isGonnaBeFalse();
139
+ });
140
+ });
141
+ // #endregion r1 verify pre
142
+
143
+ // 3. Setup Sync
144
+ const senderCoordinator = new SyncSagaCoordinator();
145
+ const receiverCoordinator = new SyncSagaCoordinator();
146
+
147
+ const peer = new SyncPeerInnerspace_V1(clone(SYNC_PEER_INNERSPACE_DEFAULT_DATA_V1));
148
+ await peer.initialized;
149
+ await peer.initializeOpts({
150
+ sagaId: '',
151
+ localMetaspace: metaspace,
152
+ localSpace: sourceSpace, // "Client"
153
+ receiverSpace: destSpace, // "Server"
154
+ receiverCoordinator,
155
+ receiverMetaspace: metaspace,
156
+ });
157
+
158
+ // #region r1 syncs
159
+ // 4. Run Sync (Source Pushes V2)
160
+ console.log(`${lc} Running Sync...`);
161
+ const resSync = await senderCoordinator.sync({
162
+ peer: peer,
163
+ localSpace: sourceSpace,
164
+ metaspace: metaspace,
165
+ domainIbGibs: [r1_alpha_v2_source],
166
+ senderIdentity: r1_senderIdentity_v0_source,
167
+ fnSenderSecret: async () => SENDER_SECRET,
168
+ });
169
+ await resSync.done;
170
+ // #endregion r1 syncs
171
+
172
+ // #region r1 verify post
173
+ await respecfully(sir, `r1 verify post`, async () => {
174
+ await ifWe(sir, `verify dest updated with V2 and links to V1`, async () => {
175
+ // Verify Tip (V2)
176
+ const getV2 = await getFromSpace({ space: destSpace, addr: r1_alpha_v2_source_addr });
177
+ iReckon(sir, getV2.success).asTo('V2 present in Dest').isGonnaBeTrue();
178
+
179
+ // Verify V2 points to V1
180
+ const v2IbGib = getV2.ibGibs![0];
181
+ const pastAddr = v2IbGib.rel8ns?.past?.at(-1);
182
+ iReckon(sir, pastAddr === getIbGibAddr({ ibGib: r1_alpha_v1_source })).asTo('V2 points to V1').isGonnaBeTrue();
183
+ });
184
+
185
+ await ifWe(sir, 'sessionIdentity evolved the expected number of times', async () => {
186
+ const latestS = peer.currentSessionIdentity;
187
+ iReckon(sir, latestS).asTo('latest session identity exists on peer').isGonnaBeTruthy();
188
+ if (latestS) {
189
+ iReckon(sir, latestS.data?.n).asTo('session identity data.n').isGonnaBe(2);
190
+ }
191
+ });
192
+
193
+ await ifWe(sir, 'sender durable space has I (evolved frame)', async () => {
194
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
195
+ addr: getIbGibAddr({ ibGib: r1_senderIdentity_v0_source }),
196
+ space: sourceSpace,
197
+ });
198
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
199
+ if (latestSenderIdentityAddr) {
200
+ const resGetSourceI = await getFromSpace({ space: sourceSpace, addr: latestSenderIdentityAddr });
201
+ iReckon(sir, resGetSourceI.success && resGetSourceI.ibGibs?.length === 1).asTo('evolved I exists in sourceSpace').isGonnaBeTrue();
202
+ if (resGetSourceI.success && resGetSourceI.ibGibs?.[0]) {
203
+ const evolvedI = resGetSourceI.ibGibs[0];
204
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
205
+ }
206
+ }
207
+ });
208
+
209
+ await ifWe(sir, 'receiver durable space has I (evolved frame)', async () => {
210
+ const latestSenderIdentityAddr = await metaspace.getLatestAddr({
211
+ addr: getIbGibAddr({ ibGib: r1_senderIdentity_v0_source }),
212
+ space: sourceSpace,
213
+ });
214
+ iReckon(sir, latestSenderIdentityAddr).asTo('latestSenderIdentityAddr exists').isGonnaBeTruthy();
215
+ if (latestSenderIdentityAddr) {
216
+ const resGetDestI = await getFromSpace({ space: destSpace, addr: latestSenderIdentityAddr });
217
+ iReckon(sir, resGetDestI.success && resGetDestI.ibGibs?.length === 1).asTo('evolved I exists in destSpace').isGonnaBeTrue();
218
+ if (resGetDestI.success && resGetDestI.ibGibs?.[0]) {
219
+ const evolvedI = resGetDestI.ibGibs[0];
220
+ iReckon(sir, evolvedI.data?.n).asTo('evolved I data.n').isGonnaBe(1);
221
+ }
222
+ }
223
+ });
224
+
225
+ await ifWe(sir, 'sender durable space has full S dep graph', async () => {
226
+ const latestS = peer.currentSessionIdentity;
227
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
228
+ if (latestS) {
229
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: sourceSpace });
230
+ const addrs = Object.keys(depGraphS);
231
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph > 2').isGonnaBeTrue();
232
+ }
233
+ });
234
+
235
+ await ifWe(sir, 'receiver durable space has full S dep graph', async () => {
236
+ const latestS = peer.currentSessionIdentity;
237
+ iReckon(sir, latestS).asTo('latestS exists').isGonnaBeTruthy();
238
+ if (latestS) {
239
+ const depGraphS = await getDependencyGraph({ ibGib: latestS, space: destSpace });
240
+ const addrs = Object.keys(depGraphS);
241
+ iReckon(sir, addrs.length > 2).asTo('number of nodes in S graph in destSpace > 2').isGonnaBeTrue();
242
+ }
243
+ });
244
+ });
245
+ // #endregion r1 verify post
246
+
247
+ });
248
+ // #endregion Round 1 - Sync Destination with Partial History
249
+ });