@ibgib/core-gib 0.1.22 → 0.1.25

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 (86) hide show
  1. package/dist/common/other/graph-helper.d.mts +25 -0
  2. package/dist/common/other/graph-helper.d.mts.map +1 -1
  3. package/dist/common/other/graph-helper.mjs +75 -1
  4. package/dist/common/other/graph-helper.mjs.map +1 -1
  5. package/dist/sync/graft-info/graft-info-helpers.mjs +2 -2
  6. package/dist/sync/graft-info/graft-info-helpers.mjs.map +1 -1
  7. package/dist/sync/sync-conflict.respec.mjs +8 -12
  8. package/dist/sync/sync-conflict.respec.mjs.map +1 -1
  9. package/dist/sync/sync-constants.d.mts +14 -4
  10. package/dist/sync/sync-constants.d.mts.map +1 -1
  11. package/dist/sync/sync-constants.mjs +15 -3
  12. package/dist/sync/sync-constants.mjs.map +1 -1
  13. package/dist/sync/sync-helpers.d.mts +22 -15
  14. package/dist/sync/sync-helpers.d.mts.map +1 -1
  15. package/dist/sync/sync-helpers.mjs +159 -90
  16. package/dist/sync/sync-helpers.mjs.map +1 -1
  17. package/dist/sync/sync-innerspace-constants.respec.mjs +8 -9
  18. package/dist/sync/sync-innerspace-constants.respec.mjs.map +1 -1
  19. package/dist/sync/sync-innerspace-deep-updates.respec.mjs +8 -9
  20. package/dist/sync/sync-innerspace-deep-updates.respec.mjs.map +1 -1
  21. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs +8 -9
  22. package/dist/sync/sync-innerspace-dest-ahead.respec.mjs.map +1 -1
  23. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs +8 -9
  24. package/dist/sync/sync-innerspace-multiple-timelines.respec.mjs.map +1 -1
  25. package/dist/sync/sync-innerspace-partial-update.respec.mjs +8 -9
  26. package/dist/sync/sync-innerspace-partial-update.respec.mjs.map +1 -1
  27. package/dist/sync/sync-innerspace.respec.mjs +6 -7
  28. package/dist/sync/sync-innerspace.respec.mjs.map +1 -1
  29. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.d.mts +2 -0
  30. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.d.mts.map +1 -1
  31. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs +4 -0
  32. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mjs.map +1 -1
  33. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts +0 -15
  34. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.d.mts.map +1 -1
  35. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts +30 -16
  36. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.d.mts.map +1 -1
  37. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs +47 -79
  38. package/dist/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mjs.map +1 -1
  39. package/dist/sync/sync-peer/sync-peer-types.d.mts +40 -1
  40. package/dist/sync/sync-peer/sync-peer-types.d.mts.map +1 -1
  41. package/dist/sync/sync-peer/sync-peer-v1.d.mts +47 -14
  42. package/dist/sync/sync-peer/sync-peer-v1.d.mts.map +1 -1
  43. package/dist/sync/sync-peer/sync-peer-v1.mjs +188 -144
  44. package/dist/sync/sync-peer/sync-peer-v1.mjs.map +1 -1
  45. package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts +39 -3
  46. package/dist/sync/sync-saga-context/sync-saga-context-helpers.d.mts.map +1 -1
  47. package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs +137 -31
  48. package/dist/sync/sync-saga-context/sync-saga-context-helpers.mjs.map +1 -1
  49. package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts +5 -0
  50. package/dist/sync/sync-saga-context/sync-saga-context-types.d.mts.map +1 -1
  51. package/dist/sync/sync-saga-coordinator.d.mts +81 -77
  52. package/dist/sync/sync-saga-coordinator.d.mts.map +1 -1
  53. package/dist/sync/sync-saga-coordinator.mjs +608 -597
  54. package/dist/sync/sync-saga-coordinator.mjs.map +1 -1
  55. package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts +154 -26
  56. package/dist/sync/sync-saga-message/sync-saga-message-types.d.mts.map +1 -1
  57. package/dist/sync/sync-types.d.mts +87 -92
  58. package/dist/sync/sync-types.d.mts.map +1 -1
  59. package/dist/sync/sync-types.mjs +6 -2
  60. package/dist/sync/sync-types.mjs.map +1 -1
  61. package/dist/timeline/timeline-api.d.mts.map +1 -1
  62. package/dist/timeline/timeline-api.mjs +15 -8
  63. package/dist/timeline/timeline-api.mjs.map +1 -1
  64. package/package.json +1 -1
  65. package/src/common/other/graph-helper.mts +79 -1
  66. package/src/sync/graft-info/graft-info-helpers.mts +3 -3
  67. package/src/sync/sync-conflict.respec.mts +8 -14
  68. package/src/sync/sync-constants.mts +15 -4
  69. package/src/sync/sync-helpers.mts +173 -101
  70. package/src/sync/sync-innerspace-constants.respec.mts +8 -9
  71. package/src/sync/sync-innerspace-deep-updates.respec.mts +8 -9
  72. package/src/sync/sync-innerspace-dest-ahead.respec.mts +8 -9
  73. package/src/sync/sync-innerspace-multiple-timelines.respec.mts +8 -9
  74. package/src/sync/sync-innerspace-partial-update.respec.mts +9 -12
  75. package/src/sync/sync-innerspace.respec.mts +6 -7
  76. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-constants.mts +7 -0
  77. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-types.mts +0 -15
  78. package/src/sync/sync-peer/sync-peer-innerspace/sync-peer-innerspace-v1.mts +72 -96
  79. package/src/sync/sync-peer/sync-peer-types.mts +43 -2
  80. package/src/sync/sync-peer/sync-peer-v1.mts +215 -142
  81. package/src/sync/sync-saga-context/sync-saga-context-helpers.mts +145 -37
  82. package/src/sync/sync-saga-context/sync-saga-context-types.mts +5 -0
  83. package/src/sync/sync-saga-coordinator.mts +680 -714
  84. package/src/sync/sync-saga-message/sync-saga-message-types.mts +160 -24
  85. package/src/sync/sync-types.mts +96 -105
  86. package/src/timeline/timeline-api.mts +17 -10
@@ -7,14 +7,20 @@ import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
7
7
  import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
8
8
  import { IbGib_V1, } from '@ibgib/ts-gib/dist/V1/types.mjs';
9
9
  import { Ib } from '@ibgib/ts-gib/dist/types.mjs';
10
+ import { validateIbGibIntrinsically } from '@ibgib/ts-gib/dist/V1/validate-helper.mjs';
10
11
 
12
+ import { GLOBAL_LOG_A_LOT } from '../../core-constants.mjs';
11
13
  import { SYNC_SAGA_CONTEXT_ATOM } from './sync-saga-context-constants.mjs';
12
14
  import { SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN } from '../sync-constants.mjs';
13
15
  import {
14
- SyncSagaContextData_V1, SyncSagaContextIbGib_V1,
15
- SyncSagaContextIb_V1, SyncSagaContextRel8ns_V1
16
+ SyncSagaContextData_V1, SyncSagaContextIbGib_V1, SyncSagaContextIb_V1,
17
+ SyncSagaContextRel8ns_V1,
16
18
  } from './sync-saga-context-types.mjs';
17
- import { getTimestampInfo } from '../../common/other/ibgib-helper.mjs';
19
+ import { IbGibSpaceAny } from '../../witness/space/space-base-v1.mjs';
20
+ import { putInSpace, registerNewIbGib } from '../../witness/space/space-helper.mjs';
21
+ import { SyncIbGib_V1 } from '../sync-types.mjs';
22
+
23
+ const logalot = GLOBAL_LOG_A_LOT;
18
24
 
19
25
  /**
20
26
  * Options for creating a SyncSagaContext ibgib.
@@ -23,7 +29,7 @@ export interface CreateSyncSagaContextOptions {
23
29
  /**
24
30
  * The main saga frame (Init, Ack, etc.).
25
31
  */
26
- sagaFrame: IbGib_V1;
32
+ sagaFrame: SyncIbGib_V1;
27
33
  /**
28
34
  * Session identity keystones.
29
35
  */
@@ -33,6 +39,11 @@ export interface CreateSyncSagaContextOptions {
33
39
  * payloads to send, e.g., in a Delta frame.
34
40
  */
35
41
  payloadIbGibsDomain?: IbGib_V1[];
42
+ /**
43
+ * we persist the context in the local/sender space (relative to our
44
+ * execution POV) right when we create it.
45
+ */
46
+ localSpace: IbGibSpaceAny;
36
47
  }
37
48
 
38
49
  /**
@@ -98,53 +109,150 @@ export async function parseSyncSagaContextIb({
98
109
  }
99
110
 
100
111
  /**
101
- * Creates a new SyncSagaContext ibGib stone.
102
- *
112
+ * Creates new SyncSagaContext stone. Puts/registers in {@link localSpace}
113
+ * immediately after creation.
114
+ *
103
115
  * @returns The context ibGib.
116
+ *
117
+ * ## notes
118
+ *
119
+ * the other ibgibs that are related to this context stone should already be
120
+ * put/registered in {@link localSpace}.
104
121
  */
105
122
  export async function createSyncSagaContext({
106
123
  sagaFrame,
107
124
  sessionKeystones,
108
125
  payloadIbGibsDomain,
126
+ localSpace,
109
127
  }: CreateSyncSagaContextOptions): Promise<SyncSagaContextIbGib_V1> {
128
+ const lc = `[${createSyncSagaContext.name}]`;
129
+ try {
130
+ if (logalot) { console.log(`${lc} starting... (I: 6b87bee313e811d1d2fc90e87fbec826)`); }
110
131
 
111
- const date = new Date();
112
- const timestamp = getTimestamp(date);
113
- const timestampMs = date.getMilliseconds();
132
+ const date = new Date();
133
+ const timestamp = getTimestamp(date);
134
+ const timestampMs = date.getMilliseconds();
114
135
 
115
- const data: SyncSagaContextData_V1 = {
116
- timestamp,
117
- timestampMs,
118
- };
136
+ const data: SyncSagaContextData_V1 = {
137
+ timestamp,
138
+ timestampMs,
139
+ };
119
140
 
120
- // Domain Payloads
121
- const payloadAddrsDomain = payloadIbGibsDomain ? payloadIbGibsDomain?.map(x => getIbGibAddr({ ibGib: x })) : undefined;
122
- if (payloadAddrsDomain && payloadAddrsDomain.length > 0) {
123
- data[SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN] = payloadAddrsDomain;
124
- }
141
+ // Domain Payloads
142
+ const payloadAddrsDomain = payloadIbGibsDomain ?
143
+ payloadIbGibsDomain?.map(x => getIbGibAddr({ ibGib: x })) :
144
+ undefined;
145
+ if (payloadAddrsDomain && payloadAddrsDomain.length > 0) {
146
+ data[SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN] = payloadAddrsDomain;
147
+ }
125
148
 
126
- // rel8ns should always have saga frame, sometimes have keystone
127
- const rel8ns: SyncSagaContextRel8ns_V1 = {
128
- sagaFrame: [getIbGibAddr({ ibGib: sagaFrame })],
129
- };
130
- if (sessionKeystones && sessionKeystones.length > 0) {
131
- rel8ns.sessionKeystone = sessionKeystones.map(x => getIbGibAddr({ ibGib: x }));
132
- }
149
+ // rel8ns should always have saga frame, sometimes have keystone
150
+ const rel8ns: SyncSagaContextRel8ns_V1 = {
151
+ sagaFrame: [getIbGibAddr({ ibGib: sagaFrame })],
152
+ };
153
+ if (sessionKeystones && sessionKeystones.length > 0) {
154
+ rel8ns.sessionKeystone = sessionKeystones.map(x => getIbGibAddr({ ibGib: x }));
155
+ }
156
+
157
+ // Generate standard ib
158
+ const ib = await getSyncSagaContextIb({ data });
133
159
 
134
- // Generate standard ib
135
- const ib = await getSyncSagaContextIb({ data });
160
+ const contextIbGib = await Factory_V1.stone<SyncSagaContextData_V1, SyncSagaContextRel8ns_V1>({
161
+ parentPrimitiveIb: SYNC_SAGA_CONTEXT_ATOM,
162
+ ib,
163
+ data,
164
+ rel8ns,
165
+ }) as SyncSagaContextIbGib_V1;
136
166
 
137
- const contextIbGib = await Factory_V1.stone<SyncSagaContextData_V1, SyncSagaContextRel8ns_V1>({
138
- parentPrimitiveIb: SYNC_SAGA_CONTEXT_ATOM,
139
- ib,
140
- data,
141
- rel8ns,
142
- }) as SyncSagaContextIbGib_V1;
167
+ // put/register immediately. Note that contextIbGib at this point is
168
+ // pure DTO, i.e., only ib, gib, data, rel8ns props.
169
+ await putInSpace({ ibGib: contextIbGib, space: localSpace, });
170
+ await registerNewIbGib({
171
+ ibGib: contextIbGib,
172
+ space: localSpace,
173
+ fnBroadcast: undefined,
174
+ });
175
+
176
+ // Attach actual ibgibs for transport (not pure DTO now)
177
+ contextIbGib.sagaFrame = sagaFrame;
178
+ if (payloadIbGibsDomain && payloadIbGibsDomain.length > 0) {
179
+ contextIbGib.payloadIbGibsDomain = payloadIbGibsDomain;
180
+ }
143
181
 
144
- // Attach actual ibgibs for transport
145
- if (payloadIbGibsDomain && payloadIbGibsDomain.length > 0) {
146
- contextIbGib.payloadIbGibsDomain = payloadIbGibsDomain;
182
+ return contextIbGib;
183
+ } catch (error) {
184
+ console.error(`${lc} ${extractErrorMsg(error)}`);
185
+ throw error;
186
+ } finally {
187
+ if (logalot) { console.log(`${lc} complete.`); }
147
188
  }
189
+ }
190
+
191
+ /**
192
+ * Validates ONLY the {@link context} ibgib itself and saga frame/msg stone(s)
193
+ * ({@link SyncSagaContextIbGib_V1.sagaFrame}).
194
+ *
195
+ * Does NOT...
196
+ * * validate keystones (authn or authz)
197
+ * * validate domain payload ibgibs...
198
+ * * intrinsically
199
+ * * in relation to this context (addrs match up)
200
+ *
201
+ * @returns empty array if valid, else validation errors
202
+ */
203
+ export async function validateContextAndSagaFrame({ context }: { context: SyncSagaContextIbGib_V1 }): Promise<string[]> {
204
+ const lc = `[${validateContextAndSagaFrame.name}]`;
205
+ try {
206
+ if (logalot) { console.log(`${lc} starting... (I: 7797f8294bd8f7e5089cb722ad468226)`); }
207
+
208
+ const errors: string[] = [];
209
+
210
+ // validate just the context first. if this fails we return early.
211
+ const intrinsicErrors = await validateIbGibIntrinsically({ ibGib: context });
212
+ if (intrinsicErrors && intrinsicErrors.length > 0) {
213
+ intrinsicErrors.forEach(x => errors.push(x));
214
+ return errors; /* <<<< returns early */
215
+ }
216
+
217
+ if (context.sagaFrame) {
218
+
219
+ } else {
220
+ errors.push(`context.sagaFrame is falsy. (E: b4edd88f4963f493789f83b29ba2df26)`);
221
+ }
222
+
223
+ // validate the entire context graph intrinsically, including saga frame, stones, identity(s) (if applicable but not authentication, that will be done in a separate step)
224
+
148
225
 
149
- return contextIbGib;
226
+
227
+ // ensure the non-dto properties on the context object (i.e. props
228
+ // that are not ib, gib, data, or rel8ns) match the data in the
229
+ // context object
230
+
231
+ throw new Error(`not implemented (E: cb639658e1183fa6c8a4ebca023ba926)`);
232
+ } catch (error) {
233
+ console.error(`${lc} ${extractErrorMsg(error)}`);
234
+ throw error;
235
+ } finally {
236
+ if (logalot) { console.log(`${lc} complete.`); }
237
+ }
150
238
  }
239
+
240
+
241
+ /**
242
+ * validates the payload ibgibs ({@link SyncSagaContextIbGib_V1.payloadIbGibsDomain}) intrinsically
243
+ *
244
+ * @returns empty array if valid, else validation errors
245
+ */
246
+ export async function validateContextDomainPayloadIbGibs({ context }: { context: SyncSagaContextIbGib_V1 }): Promise<string[]> {
247
+ const lc = `[${validateContextDomainPayloadIbGibs.name}]`;
248
+ try {
249
+ if (logalot) { console.log(`${lc} starting... (I: 9f9fe835bcc80c75aa7fd6d887fc0826)`); }
250
+ console.error(`${lc} NAG MESSAGE (NOT THROWN). not implemented (E: bfe02ab36a227291a8f17ffc08f2ef26)`)
251
+ return [];
252
+ } catch (error) {
253
+ console.error(`${lc} ${extractErrorMsg(error)}`);
254
+ throw error;
255
+ } finally {
256
+ if (logalot) { console.log(`${lc} complete.`); }
257
+ }
258
+ }
@@ -43,6 +43,11 @@ export interface SyncSagaContextRel8ns_V1 extends IbGibRel8ns_V1 {
43
43
  /**
44
44
  * The Ephemeral Session Keystone Identity used for this saga.
45
45
  * Required for validating the saga frame signature.
46
+ *
47
+ * ## notes
48
+ *
49
+ * This will be different for the sender and receiver, yes? hmm...
50
+ * I think I need to put "sender" or "receiver" in the session keystone ib.
46
51
  */
47
52
  sessionKeystone?: IbGibAddr[];
48
53
  }