@ibgib/core-gib 0.1.55 → 0.1.58

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 (134) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/keystone/keystone-config-builder.d.mts +12 -1
  3. package/dist/keystone/keystone-config-builder.d.mts.map +1 -1
  4. package/dist/keystone/keystone-config-builder.mjs +58 -4
  5. package/dist/keystone/keystone-config-builder.mjs.map +1 -1
  6. package/dist/keystone/keystone-constants.d.mts +40 -5
  7. package/dist/keystone/keystone-constants.d.mts.map +1 -1
  8. package/dist/keystone/keystone-constants.mjs +39 -5
  9. package/dist/keystone/keystone-constants.mjs.map +1 -1
  10. package/dist/keystone/keystone-helpers.d.mts +11 -1
  11. package/dist/keystone/keystone-helpers.d.mts.map +1 -1
  12. package/dist/keystone/keystone-helpers.mjs +37 -1
  13. package/dist/keystone/keystone-helpers.mjs.map +1 -1
  14. package/dist/keystone/keystone-policy-types.d.mts +23 -0
  15. package/dist/keystone/keystone-policy-types.d.mts.map +1 -0
  16. package/dist/keystone/keystone-policy-types.mjs +2 -0
  17. package/dist/keystone/keystone-policy-types.mjs.map +1 -0
  18. package/dist/sync/graft-info/graft-info-helpers.respec.mjs +8 -8
  19. package/dist/sync/graft-info/graft-info-helpers.respec.mjs.map +1 -1
  20. package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs +22 -22
  21. package/dist/sync/sync-conflict-adv-multitimelines.respec.mjs.map +1 -1
  22. package/dist/sync/sync-conflict-basic-divergence.respec.mjs +3 -3
  23. package/dist/sync/sync-conflict-basic-divergence.respec.mjs.map +1 -1
  24. package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs +6 -6
  25. package/dist/sync/sync-conflict-basic-multitimelines.respec.mjs.map +1 -1
  26. package/dist/sync/sync-conflict-text-merge.respec.mjs +26 -26
  27. package/dist/sync/sync-conflict-text-merge.respec.mjs.map +1 -1
  28. package/dist/sync/sync-helpers.d.mts +19 -0
  29. package/dist/sync/sync-helpers.d.mts.map +1 -1
  30. package/dist/sync/sync-helpers.mjs +51 -1
  31. package/dist/sync/sync-helpers.mjs.map +1 -1
  32. package/dist/sync/sync-innerspace-constants.respec.mjs +2 -2
  33. package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
  34. package/dist/sync/sync-innerspace-deep-updates.respec.mjs +2 -2
  35. package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
  36. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +4 -4
  37. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
  38. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +2 -2
  39. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
  40. package/dist/sync/sync-innerspace-partial-update.respec.mjs +3 -3
  41. package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
  42. package/dist/sync/sync-innerspace.respec.mjs +4 -4
  43. package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
  44. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts +5 -0
  45. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.d.mts.map +1 -1
  46. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs +18 -0
  47. package/dist/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mjs.map +1 -1
  48. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts +5 -0
  49. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.d.mts.map +1 -1
  50. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs +21 -3
  51. package/dist/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mjs.map +1 -1
  52. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +12 -0
  53. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
  54. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +34 -0
  55. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
  56. package/dist/sync/sync-peer/sync-peer-types.d.mts +69 -1
  57. package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
  58. package/dist/sync/sync-peer/sync-peer-v1.d.mts +30 -0
  59. package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
  60. package/dist/sync/sync-peer/sync-peer-v1.mjs +88 -1
  61. package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
  62. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts +30 -0
  63. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.d.mts.map +1 -0
  64. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs +2 -0
  65. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mjs.map +1 -0
  66. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts +66 -0
  67. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.d.mts.map +1 -0
  68. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs +280 -0
  69. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mjs.map +1 -0
  70. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts +85 -0
  71. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.d.mts.map +1 -0
  72. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs +332 -0
  73. package/dist/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs.map +1 -0
  74. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts +29 -0
  75. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.d.mts.map +1 -0
  76. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs +2 -0
  77. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mjs.map +1 -0
  78. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts +42 -0
  79. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.d.mts.map +1 -0
  80. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs +282 -0
  81. package/dist/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs.map +1 -0
  82. package/dist/sync/sync-saga-coordinator.d.mts +35 -1
  83. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  84. package/dist/sync/sync-saga-coordinator.mjs +62 -1
  85. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  86. package/dist/sync/sync-withid.connect.respec.d.mts +12 -0
  87. package/dist/sync/sync-withid.connect.respec.d.mts.map +1 -0
  88. package/dist/sync/sync-withid.connect.respec.mjs +205 -0
  89. package/dist/sync/sync-withid.connect.respec.mjs.map +1 -0
  90. package/dist/sync/sync-withid.establish.respec.d.mts +19 -0
  91. package/dist/sync/sync-withid.establish.respec.d.mts.map +1 -0
  92. package/dist/sync/sync-withid.establish.respec.mjs +322 -0
  93. package/dist/sync/sync-withid.establish.respec.mjs.map +1 -0
  94. package/package.json +1 -1
  95. package/src/keystone/keystone-config-builder.mts +73 -4
  96. package/src/keystone/keystone-constants.mts +42 -6
  97. package/src/keystone/keystone-helpers.mts +44 -2
  98. package/src/keystone/keystone-policy-types.mts +25 -0
  99. package/src/keystone/keystone-policy.schema.json +51 -0
  100. package/src/keystone/keystone-service-v1.mts +3 -3
  101. package/src/sync/README.md +1 -104
  102. package/src/sync/docs/architecture.md +28 -8
  103. package/src/sync/docs/security.md +380 -0
  104. package/src/sync/graft-info/graft-info-helpers.respec.mts +7 -7
  105. package/src/sync/sync-conflict-adv-multitimelines.respec.mts +21 -21
  106. package/src/sync/sync-conflict-basic-divergence.respec.mts +2 -2
  107. package/src/sync/sync-conflict-basic-multitimelines.respec.mts +5 -5
  108. package/src/sync/sync-conflict-text-merge.respec.mts +25 -25
  109. package/src/sync/sync-helpers.mts +51 -1
  110. package/src/sync/sync-innerspace-constants.respec.mts +1 -1
  111. package/src/sync/sync-innerspace-deep-updates.respec.mts +1 -1
  112. package/src/sync/sync-innerspace-dest-ahead.respec.mts +3 -3
  113. package/src/sync/sync-innerspace-multiple-timelines.respec.mts +1 -1
  114. package/src/sync/sync-innerspace-partial-update.respec.mts +2 -2
  115. package/src/sync/sync-innerspace.respec.mts +3 -3
  116. package/src/sync/sync-peer/sync-peer-http-receiver/sync-peer-http-receiver-v1.mts +20 -0
  117. package/src/sync/sync-peer/sync-peer-http-sender/sync-peer-http-sender-v1.mts +23 -3
  118. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +38 -1
  119. package/src/sync/sync-peer/sync-peer-types.mts +70 -1
  120. package/src/sync/sync-peer/sync-peer-v1.mts +94 -1
  121. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-types.mts +36 -0
  122. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-peer-websocket-receiver-v1.mts +337 -0
  123. package/src/sync/sync-peer/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mts +388 -0
  124. package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-types.mts +35 -0
  125. package/src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts +321 -0
  126. package/src/sync/sync-saga-coordinator.mts +84 -0
  127. package/src/sync/sync-withid.connect.respec.mts +243 -0
  128. package/src/sync/sync-withid.establish.respec.mts +361 -0
  129. package/src/sync/unused-identity-backup.mts.md +1 -1
  130. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts +0 -2
  131. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.d.mts.map +0 -1
  132. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs +0 -310
  133. package/dist/sync/sync-innerspace-dest-ahead-withid.respec.mjs.map +0 -1
  134. package/src/sync/sync-innerspace-dest-ahead-withid.respec.mts +0 -364
@@ -0,0 +1,282 @@
1
+ /**
2
+ * @module sync-peer-websocket-sender-v1
3
+ */
4
+ import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
5
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
6
+ import { KeystoneService_V1 } from '../../../keystone/keystone-service-v1.mjs';
7
+ import { KeystoneStrategyFactory } from '../../../keystone/strategy/keystone-strategy-factory.mjs';
8
+ import { deriveSessionSecret } from '../../sync-helpers.mjs';
9
+ import { SyncPeer_V1 } from '../sync-peer-v1.mjs';
10
+ import { GLOBAL_LOG_A_LOT } from '../../../core-constants.mjs';
11
+ import { SESSION_KEYSTONE_POLICY, getConnectChallenge } from '../sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs';
12
+ const logalot = GLOBAL_LOG_A_LOT || true;
13
+ /**
14
+ * WebSocket Sender Peer implementation running in browser/native environment.
15
+ */
16
+ export class SyncPeerWebSocketSender_V1 extends SyncPeer_V1 {
17
+ lc = `[${SyncPeerWebSocketSender_V1.name}]`;
18
+ get classname() {
19
+ return SyncPeerWebSocketSender_V1.name;
20
+ }
21
+ get isSocketOpen() {
22
+ return this.ws !== undefined && this.ws.readyState === WebSocket.OPEN;
23
+ }
24
+ ws;
25
+ activeResolve;
26
+ activeReject;
27
+ constructor(initialData, initialRel8ns) {
28
+ super(initialData, initialRel8ns);
29
+ }
30
+ async preConnectCheck(opts) {
31
+ const lc = `${this.lc}[${this.preConnectCheck.name}]`;
32
+ if (!this.data?.wsUrl) {
33
+ throw new Error(`Missing wsUrl in peer data (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c910)`);
34
+ }
35
+ if (!this.data?.httpEvolveUrl) {
36
+ throw new Error(`Missing httpEvolveUrl in peer data (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c911)`);
37
+ }
38
+ }
39
+ /**
40
+ * Submits the evolved master identity (I1) and new session keystone (S) to the server's HTTP registry.
41
+ */
42
+ async postEstablishToReceiver({ newSenderIdentity, sessionIdentity, }) {
43
+ const lc = `${this.lc}[${this.postEstablishToReceiver.name}]`;
44
+ try {
45
+ if (logalot) {
46
+ console.log(`${lc} posting evolved keystones to ${this.data.httpEvolveUrl}...`);
47
+ }
48
+ if (!this.data) {
49
+ throw new Error(`(UNEXPECTED) this.data falsy? (E: d642e8a9af18b532c87c6f581aa53b26)`);
50
+ }
51
+ if (!this.data.httpEvolveUrl) {
52
+ throw new Error(`(UNEXPECTED) this.data.httpEvolveUrl falsy? (E: 8589ddbb155914d85c09658881da2c26)`);
53
+ }
54
+ const response = await fetch(this.data.httpEvolveUrl, {
55
+ method: 'PUT',
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ },
59
+ body: JSON.stringify({
60
+ keystoneIbGib: newSenderIdentity,
61
+ relatedIbGibs: [sessionIdentity]
62
+ }),
63
+ });
64
+ if (!response.ok) {
65
+ const data = await response.json().catch(() => ({}));
66
+ const errorMsg = data.message || data.error || 'Unknown error';
67
+ throw new Error(`HTTP ${response.status} evolution post rejected. errorMsg: ${errorMsg} (E: e8a478291b88d05c68cf6b385684b826)`);
68
+ }
69
+ if (logalot) {
70
+ console.log(`${lc} evolve post accepted by server.`);
71
+ }
72
+ }
73
+ catch (error) {
74
+ console.error(`${lc} establish post failed: ${extractErrorMsg(error)}`);
75
+ throw error;
76
+ }
77
+ }
78
+ /**
79
+ * Establishes the stateful WebSocket connection and performs the multi-turn cryptographic challenge connect.
80
+ */
81
+ async connectImpl(opts) {
82
+ const lc = `${this.lc}[${this.connectImpl.name}]`;
83
+ try {
84
+ if (logalot) {
85
+ console.log(`${lc} starting...`);
86
+ }
87
+ const { senderIdentity, fnSenderSecret, sagaId, localMetaspace, localSpace } = this.opts;
88
+ if (!senderIdentity || !fnSenderSecret || !sagaId) {
89
+ throw new Error(`Missing identity parameters in peer options (E: ed49b6711ac82efcdb42b8a28c5b6826)`);
90
+ }
91
+ // 1. Solve upfront pre-filter solution
92
+ const senderSecret = await fnSenderSecret();
93
+ const sessionSecret = await deriveSessionSecret({ senderSecret, sagaId });
94
+ // Fetch session identity S that establishSessionIdentity just created
95
+ const sAddr_tjp = getIbGibAddr({ ibGib: senderIdentity }); // wait, S's past contains I
96
+ // Actually, we can get the S keystone that was returned by establishSessionIdentity.
97
+ // Let's resolve S from the sender localSpace using its target claim or the targetAddrs
98
+ const sAddr = getIbGibAddr({ ibGib: senderIdentity.rel8ns?.past ? senderIdentity : senderIdentity }); // stub: get the actual generated S
99
+ // To make sure we have the exact session identity S, we can query localSpace.
100
+ // Since we know the sagaId, we can walk or locate it.
101
+ // But wait, the coordinator calls establishSessionIdentity first, which returns the created S keystone!
102
+ // Let's store a reference to the sessionIdentity S on this class during establish, or lookup from localSpace.
103
+ // Wait, does the coordinator let the peer store S? No, but let's query the latest keystone in localSpace.
104
+ const senderIdentityLatestAddr = await localMetaspace.getLatestAddr({ ibGib: senderIdentity, space: localSpace });
105
+ if (!senderIdentityLatestAddr) {
106
+ throw new Error(`senderIdentityLatestAddr falsy. we should have a latest addr that is different than the sender identity at this point (done in the peer establish phase) (E: 225607318bef485d7821f82de97b6826)`);
107
+ }
108
+ const resGet = await localMetaspace.get({ addrs: [senderIdentityLatestAddr], space: localSpace });
109
+ const I_tip = resGet.ibGibs?.[0];
110
+ // const targetSAddr = I_tip?.rel8ns?.past?.[0] ?? I_tip?.data?.proofs?.[0]?.claim?.target;
111
+ const targetSAddr = I_tip.data.proofs.at(0)?.claim.target;
112
+ if (!targetSAddr) {
113
+ throw new Error(`Could not locate session keystone target from identity (E: 5ec4882f7e5e4c33fbd00ab8b3166726)`);
114
+ }
115
+ const resGetS = await localMetaspace.get({ addrs: [targetSAddr], space: localSpace });
116
+ const sessionS = resGetS.ibGibs?.[0];
117
+ if (!sessionS) {
118
+ throw new Error(`Session keystone not found in local space: ${targetSAddr} (E: 9ba818e6622808bb4ae749be31f80b26)`);
119
+ }
120
+ // Solve dynamic upfront picket-fence challenge
121
+ const connectPool = (sessionS.data?.challengePools ?? [])
122
+ .find(p => p.id === SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID);
123
+ if (!connectPool) {
124
+ throw new Error(`Session keystone missing connect pool (E: f50968afca04b6d38ec19824ea201826)`);
125
+ }
126
+ const { challengeId } = getConnectChallenge(sessionS);
127
+ const strategy = KeystoneStrategyFactory.create({ config: connectPool.config });
128
+ const poolSecret = await strategy.derivePoolSecret({ masterSecret: sessionSecret });
129
+ const solution = await strategy.generateSolution({
130
+ poolSecret,
131
+ poolId: SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID,
132
+ challengeId
133
+ });
134
+ // 2. Open WebSocket connection
135
+ const wsUrl = `${this.data.wsUrl}?sAddr=${encodeURIComponent(targetSAddr)}&solution=${encodeURIComponent(solution.value)}`;
136
+ if (logalot) {
137
+ console.log(`${lc} connecting to WebSocket: ${wsUrl}`);
138
+ }
139
+ const ws = new WebSocket(wsUrl);
140
+ this.ws = ws;
141
+ return new Promise((resolve, reject) => {
142
+ let isResolved = false;
143
+ ws.addEventListener('open', () => {
144
+ if (logalot) {
145
+ console.log(`${lc} WebSocket opened. Awaiting challenge...`);
146
+ }
147
+ });
148
+ ws.addEventListener('message', async (ev) => {
149
+ try {
150
+ const msg = JSON.parse(ev.data);
151
+ if (logalot) {
152
+ console.log(`${lc} received frame: ${msg.type}`);
153
+ }
154
+ if (msg.type === 'auth-challenge-init') {
155
+ ws.send(JSON.stringify({
156
+ type: 'auth-init',
157
+ sAddr: targetSAddr
158
+ }));
159
+ }
160
+ else if (msg.type === 'auth-challenge') {
161
+ const { challengeUuid, demandedIds } = msg;
162
+ if (logalot) {
163
+ console.log(`${lc} solving demanded challenges: ${demandedIds.join(', ')}`);
164
+ }
165
+ const keystoneService = new KeystoneService_V1();
166
+ const proofFrame = await keystoneService.sign({
167
+ latestKeystone: sessionS,
168
+ masterSecret: sessionSecret,
169
+ poolId: SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID,
170
+ requiredChallengeIds: demandedIds,
171
+ claim: {
172
+ verb: SESSION_KEYSTONE_POLICY.CONNECT_POOL.VERB,
173
+ target: challengeUuid
174
+ },
175
+ metaspace: localMetaspace,
176
+ space: localSpace
177
+ });
178
+ ws.send(JSON.stringify({
179
+ type: 'auth-proof',
180
+ proofFrame
181
+ }));
182
+ }
183
+ else if (msg.type === 'auth-ok') {
184
+ if (logalot) {
185
+ console.log(`${lc} WebSocket connect SUCCESS!`);
186
+ }
187
+ isResolved = true;
188
+ // Setup persistent runtime listeners
189
+ ws.removeEventListener('message', (() => { }));
190
+ ws.addEventListener('message', (event) => this.handleRuntimeMessage(event));
191
+ resolve();
192
+ }
193
+ else if (msg.type === 'auth-fail') {
194
+ reject(new Error(`Connect failed: ${msg.message}`));
195
+ }
196
+ }
197
+ catch (error) {
198
+ reject(error);
199
+ }
200
+ });
201
+ ws.addEventListener('close', (event) => {
202
+ if (!isResolved) {
203
+ reject(new Error(`WebSocket closed before connect completed (code: ${event.code})`));
204
+ }
205
+ });
206
+ ws.addEventListener('error', (err) => {
207
+ if (!isResolved) {
208
+ reject(new Error(`WebSocket connection error`));
209
+ }
210
+ });
211
+ });
212
+ }
213
+ catch (error) {
214
+ console.error(`${lc} connect failed: ${extractErrorMsg(error)}`);
215
+ throw error;
216
+ }
217
+ }
218
+ /**
219
+ * Handles synchronizing messages and evolved context frames during active transaction turns.
220
+ */
221
+ handleRuntimeMessage(event) {
222
+ const lc = `${this.lc}[${this.handleRuntimeMessage.name}]`;
223
+ try {
224
+ const msg = JSON.parse(event.data);
225
+ if (logalot) {
226
+ console.log(`${lc} received runtime frame: ${msg.type}`);
227
+ }
228
+ if (msg.type === 'sync-frame-response') {
229
+ if (this.activeResolve) {
230
+ const responseContext = msg.context;
231
+ const resolve = this.activeResolve;
232
+ this.activeResolve = undefined;
233
+ this.activeReject = undefined;
234
+ resolve(responseContext);
235
+ }
236
+ }
237
+ else if (msg.type === 'domain-payload') {
238
+ const payload = msg.ibGib;
239
+ this.payloadIbGibsDomainReceived$.next(payload);
240
+ }
241
+ }
242
+ catch (error) {
243
+ console.error(`${lc} failed parsing runtime frame: ${extractErrorMsg(error)}`);
244
+ if (this.activeReject) {
245
+ this.activeReject(error);
246
+ }
247
+ }
248
+ }
249
+ /**
250
+ * Serializes the transaction context and payload down the active WebSocket connection.
251
+ */
252
+ async sendContextRequest(context) {
253
+ const lc = `${this.lc}[${this.sendContextRequest.name}]`;
254
+ try {
255
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
256
+ throw new Error(`WebSocket is not connected or open (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c915)`);
257
+ }
258
+ // 1. Push any outgoing payload domain ibgibs down the pipe
259
+ const domainPayloads = context.payloadIbGibsDomain ?? [];
260
+ for (const ibGib of domainPayloads) {
261
+ this.ws.send(JSON.stringify({
262
+ type: 'domain-payload',
263
+ ibGib
264
+ }));
265
+ }
266
+ // 2. Transmit the synchronizing transaction context
267
+ return new Promise((resolve, reject) => {
268
+ this.activeResolve = resolve;
269
+ this.activeReject = reject;
270
+ this.ws.send(JSON.stringify({
271
+ type: 'sync-frame',
272
+ context
273
+ }));
274
+ });
275
+ }
276
+ catch (error) {
277
+ console.error(`${lc} sendContextRequest failed: ${extractErrorMsg(error)}`);
278
+ throw error;
279
+ }
280
+ }
281
+ }
282
+ //# sourceMappingURL=sync-peer-websocket-sender-v1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-peer-websocket-sender-v1.mjs","sourceRoot":"","sources":["../../../../src/sync/sync-peer/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import { SyncConflictStrategy } from "./sync-constants.mjs";
5
5
  import { SyncSagaInfo } from "./sync-types.mjs";
6
6
  import { SyncPeerWitness } from "./sync-peer/sync-peer-types.mjs";
7
7
  import { SyncSagaContextIbGib_V1 } from "./sync-saga-context/sync-saga-context-types.mjs";
8
+ import { KeystoneIbGib_V1 } from "../keystone/keystone-types.mjs";
9
+ import { KeystonePoolConfig } from "../keystone/keystone-types.mjs";
8
10
  /**
9
11
  * Orchestrates the synchronization process between two spaces (Source and Destination).
10
12
  *
@@ -21,6 +23,22 @@ import { SyncSagaContextIbGib_V1 } from "./sync-saga-context/sync-saga-context-t
21
23
  export declare class SyncSagaCoordinator {
22
24
  private lc;
23
25
  constructor();
26
+ /**
27
+ * Default pool config for the session keystone's `connect` pool.
28
+ * Consumed exactly once per saga during `peer.connect()`.
29
+ * Uses `deleteAll` replenish strategy — after the handshake, the pool is gone.
30
+ *
31
+ * Override in subclasses or pass custom config via opts to change security parameters.
32
+ */
33
+ protected defaultSessionConnectPoolConfig(): KeystonePoolConfig;
34
+ /**
35
+ * Default pool config for the session keystone's per-turn `sync` pool.
36
+ * Used on each outgoing context frame (Init, Delta, Commit).
37
+ * Uses `topUp` replenish strategy to stay active throughout the saga.
38
+ *
39
+ * Override in subclasses or pass custom config via opts to change security parameters.
40
+ */
41
+ protected defaultSessionSyncPoolConfig(): KeystonePoolConfig;
24
42
  /**
25
43
  * Executes a synchronization saga using the Symmetric Sync Protocol.
26
44
  *
@@ -28,7 +46,7 @@ export declare class SyncSagaCoordinator {
28
46
  * **Execution Context**: **Sender (Local)**.
29
47
  * This method is the entry point for starting a sync saga.
30
48
  */
31
- sync({ peer, domainIbGibs, conflictStrategy, metaspace, localSpace, }: {
49
+ sync({ peer, domainIbGibs, senderIdentity, fnSenderSecret, conflictStrategy, metaspace, localSpace, }: {
32
50
  /**
33
51
  * The peer we are syncing with.
34
52
  */
@@ -40,6 +58,22 @@ export declare class SyncSagaCoordinator {
40
58
  * These should all exist in {@link localSpace}
41
59
  */
42
60
  domainIbGibs: IbGib_V1[];
61
+ /**
62
+ * If present, this is the primary identity of the sender, i.e., who is
63
+ * initiating the sync.
64
+ *
65
+ * This should be the most recent frame (tip) of the senderIdentity's
66
+ * timeline.
67
+ *
68
+ * NOTE: {@link fnSenderSecret} must be truthy if this is truthy, and vice versa.
69
+ */
70
+ senderIdentity?: KeystoneIbGib_V1;
71
+ /**
72
+ * secret corresponding to {@link senderIdentity}.
73
+ *
74
+ * NOTE: {@link senderIdentity} must be truthy if this is truthy, and vice versa.
75
+ */
76
+ fnSenderSecret?: () => Promise<string>;
43
77
  /**
44
78
  * The space containing the {@link domainIbGibs} we want to sync. If
45
79
  * sync is successful, any updates to timelines will be stored here.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-saga-coordinator.d.mts","sourceRoot":"","sources":["../../src/sync/sync-saga-coordinator.mts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAG,MAAM,iCAAiC,CAAC;AAI5D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAClF,OAAO,EAEH,oBAAoB,EAEvB,MAAM,sBAAsB,CAAC;AAqB9B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAA0B,uBAAuB,EAA6B,MAAM,iDAAiD,CAAC;AAoB7I;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,EAAE,CAA2C;;IAMrD;;;;;;OAMG;IACU,IAAI,CAAC,EACd,IAAI,EACJ,YAAY,EACZ,gBAA6C,EAC7C,SAAS,EACT,UAAU,GACb,EAAE;QACC;;WAEG;QACH,IAAI,EAAE,eAAe,CAAC;QACtB;;;;;WAKG;QACH,YAAY,EAAE,QAAQ,EAAE,CAAC;QACzB;;;WAGG;QACH,UAAU,EAAE,aAAa,CAAC;QAC1B;;WAEG;QACH,SAAS,EAAE,gBAAgB,CAAC;QAC5B;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;KAC3C,GAAG,OAAO,CAAC,YAAY,CAAC;IAkFzB;;;;;;;;;;OAUG;IACU,YAAY,CAAC,EACtB,WAAW,EACX,OAAO,EACP,WAAW,EACX,SAAS,GACZ,EAAE;QACC,WAAW,EAAE,uBAAuB,CAAC;QACrC;;WAEG;QACH,OAAO,EAAE,aAAa,CAAC;QACvB;;WAEG;QACH,WAAW,EAAE,aAAa,CAAC;QAC3B,SAAS,EAAE,gBAAgB,CAAC;KAC/B,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAwD3C;;;;;;;;;;;;;;OAcG;YACW,eAAe;IA6M7B;;;;;;;;;;OAUG;YACW,qBAAqB;IA2FnC;;;OAGG;IACU,eAAe,CAAC,EACzB,KAAK,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,GACX,EAAE;QACC,KAAK,EAAE,aAAa,CAAC;QACrB,SAAS,EAAE,gBAAgB,CAAC;QAC5B,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GAAG,OAAO,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;YAoD/B,mBAAmB;IAqCjC;;;;;;;;OAQG;YACW,eAAe;IAyE7B;;;;;OAKG;YACW,qBAAqB;IAgEnC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;YACW,yBAAyB;IA6FvC;;;;;;;;;;;OAWG;YACW,eAAe;IAuV7B;;;;;;;;;;;;;;OAcG;YACW,cAAc;IAmR5B;;;;;;;;;;;;OAYG;YACW,gBAAgB;IAuW9B;;OAEG;YACW,kBAAkB;YAgQlB,iBAAiB;YAqDjB,iBAAiB;YAmFjB,kBAAkB;YAmClB,4BAA4B;IAiE1C;;OAEG;YACW,mBAAmB;YA8GnB,2BAA2B;IAoCzC,OAAO,CAAC,0BAA0B;CA+DrC"}
1
+ {"version":3,"file":"sync-saga-coordinator.d.mts","sourceRoot":"","sources":["../../src/sync/sync-saga-coordinator.mts"],"names":[],"mappings":"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"}
@@ -21,6 +21,9 @@ import { graftTimelines, } from "./graft-info/graft-info-helpers.mjs";
21
21
  import { GRAFT_INFO_REL8N_NAME } from "./graft-info/graft-info-constants.mjs";
22
22
  import { validateIbGibIntrinsically } from "@ibgib/ts-gib/dist/V1/validate-helper.mjs";
23
23
  import { SYNC_SAGA_CONTEXT_ATOM } from "./sync-saga-context/sync-saga-context-constants.mjs";
24
+ import { createStandardPoolConfig } from "../keystone/keystone-config-builder.mjs";
25
+ import { POOL_ID_CONNECT, POOL_ID_SYNC, KEYSTONE_VERB_CONNECT, KEYSTONE_VERB_SYNC } from "../keystone/keystone-constants.mjs";
26
+ import { KeystoneReplenishStrategy } from "../keystone/keystone-types.mjs";
24
27
  const logalot = GLOBAL_LOG_A_LOT;
25
28
  const logalotControlDomain = false;
26
29
  const lcControlDomain = '[ControlDomain]';
@@ -41,6 +44,44 @@ export class SyncSagaCoordinator {
41
44
  lc = `[${SyncSagaCoordinator.name}]`;
42
45
  constructor() {
43
46
  }
47
+ /**
48
+ * Default pool config for the session keystone's `connect` pool.
49
+ * Consumed exactly once per saga during `peer.connect()`.
50
+ * Uses `deleteAll` replenish strategy — after the handshake, the pool is gone.
51
+ *
52
+ * Override in subclasses or pass custom config via opts to change security parameters.
53
+ */
54
+ defaultSessionConnectPoolConfig() {
55
+ return createStandardPoolConfig({
56
+ id: POOL_ID_CONNECT,
57
+ salt: `session-connect-${Date.now()}`,
58
+ verbs: [KEYSTONE_VERB_CONNECT],
59
+ size: 20,
60
+ sequential: 2,
61
+ random: 2,
62
+ targetBinding: 0,
63
+ replenishStrategy: KeystoneReplenishStrategy.deleteAll,
64
+ });
65
+ }
66
+ /**
67
+ * Default pool config for the session keystone's per-turn `sync` pool.
68
+ * Used on each outgoing context frame (Init, Delta, Commit).
69
+ * Uses `topUp` replenish strategy to stay active throughout the saga.
70
+ *
71
+ * Override in subclasses or pass custom config via opts to change security parameters.
72
+ */
73
+ defaultSessionSyncPoolConfig() {
74
+ return createStandardPoolConfig({
75
+ id: POOL_ID_SYNC,
76
+ salt: `session-sync-${Date.now()}`,
77
+ verbs: [KEYSTONE_VERB_SYNC],
78
+ size: 200,
79
+ sequential: 3,
80
+ random: 3,
81
+ targetBinding: 3,
82
+ replenishStrategy: KeystoneReplenishStrategy.topUp,
83
+ });
84
+ }
44
85
  /**
45
86
  * Executes a synchronization saga using the Symmetric Sync Protocol.
46
87
  *
@@ -48,7 +89,7 @@ export class SyncSagaCoordinator {
48
89
  * **Execution Context**: **Sender (Local)**.
49
90
  * This method is the entry point for starting a sync saga.
50
91
  */
51
- async sync({ peer, domainIbGibs, conflictStrategy = SyncConflictStrategy.abort, metaspace, localSpace, }) {
92
+ async sync({ peer, domainIbGibs, senderIdentity, fnSenderSecret, conflictStrategy = SyncConflictStrategy.abort, metaspace, localSpace, }) {
52
93
  const lc = `${this.lc}[${this.sync.name}]`;
53
94
  if (logalot) {
54
95
  console.log(`${lc} starting...`);
@@ -57,6 +98,14 @@ export class SyncSagaCoordinator {
57
98
  debugger;
58
99
  throw new Error(`${lc} source (or localSpace) required (E: 25df3761f7686a1099a552f83c95d326)`);
59
100
  }
101
+ if (senderIdentity || fnSenderSecret) {
102
+ if (!senderIdentity) {
103
+ throw new Error(`(UNEXPECTED) senderIdentity falsy but fnSenderSecret truthy? if either is used, both must be truthy. (E: e366628a4919c7d727d2cbd8e5b75e26)`);
104
+ }
105
+ if (!fnSenderSecret) {
106
+ throw new Error(`(UNEXPECTED) fnSenderSecret falsy but senderIdentity truthy? if either is used, both must be truthy. (E: 7d55ce37ae482fec48e3398158161926)`);
107
+ }
108
+ }
60
109
  // 1. SETUP SAGA METADATA
61
110
  const sagaId = await getUUID();
62
111
  // Setup Observable & Promise
@@ -92,6 +141,18 @@ export class SyncSagaCoordinator {
92
141
  // Async execution wrapper
93
142
  (async () => {
94
143
  try {
144
+ const targetAddrs = domainIbGibs ? domainIbGibs.map(domain => getIbGibAddr({ ibGib: domain })) : undefined;
145
+ // Attach saga-scoped identity opts to peer now that sagaId is known.
146
+ peer.setOptionalOpts({
147
+ sagaId,
148
+ senderIdentity,
149
+ fnSenderSecret,
150
+ sessionConnectPoolConfig: this.defaultSessionConnectPoolConfig(),
151
+ sessionSyncPoolConfig: this.defaultSessionSyncPoolConfig(),
152
+ targetAddrs,
153
+ });
154
+ // ESTABLISH SESSION IDENTITY (pre-connect, if identity provided)
155
+ const sessionIdentity = await peer.establishSessionIdentity();
95
156
  // CONNECT PEER (if needed)
96
157
  await peer.connect({ sagaId });
97
158
  // CREATE INITIAL FRAME (Stage.init)