atom.io 0.27.4 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.d.ts +31 -29
- package/data/dist/index.js +65 -81
- package/data/src/dict.ts +9 -12
- package/data/src/join.ts +30 -33
- package/data/src/struct-family.ts +17 -23
- package/data/src/struct.ts +9 -12
- package/dist/{chunk-JRENM6KL.js → chunk-BX3MTH2Z.js} +482 -385
- package/dist/chunk-D52JNVER.js +721 -0
- package/dist/chunk-EUVKUTW3.js +89 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +35 -53
- package/ephemeral/dist/index.js +1 -1
- package/ephemeral/src/find-state.ts +1 -1
- package/immortal/dist/index.js +2 -2
- package/immortal/src/seek-state.ts +2 -2
- package/internal/dist/index.d.ts +141 -87
- package/internal/dist/index.js +1 -1
- package/internal/src/atom/create-regular-atom.ts +3 -3
- package/internal/src/atom/create-standalone-atom.ts +7 -5
- package/internal/src/atom/dispose-atom.ts +2 -9
- package/internal/src/families/create-atom-family.ts +5 -5
- package/internal/src/families/create-readonly-selector-family.ts +20 -9
- package/internal/src/families/create-regular-atom-family.ts +15 -6
- package/internal/src/families/create-selector-family.ts +5 -5
- package/internal/src/families/create-writable-selector-family.ts +20 -10
- package/internal/src/families/dispose-from-store.ts +43 -29
- package/internal/src/families/find-in-store.ts +28 -18
- package/internal/src/families/init-family-member.ts +9 -9
- package/internal/src/families/seek-in-store.ts +10 -10
- package/internal/src/get-state/get-from-store.ts +70 -47
- package/internal/src/ingest-updates/ingest-atom-update.ts +1 -1
- package/internal/src/ingest-updates/ingest-creation-disposal.ts +15 -6
- package/internal/src/molecule/create-molecule-family.ts +1 -1
- package/internal/src/molecule/dispose-molecule.ts +7 -18
- package/internal/src/molecule/grow-molecule-in-store.ts +1 -1
- package/internal/src/molecule/make-molecule-in-store.ts +5 -5
- package/internal/src/mutable/create-mutable-atom-family.ts +15 -6
- package/internal/src/mutable/create-mutable-atom.ts +3 -3
- package/internal/src/mutable/get-json-token.ts +2 -2
- package/internal/src/mutable/tracker-family.ts +3 -3
- package/internal/src/mutable/tracker.ts +14 -18
- package/internal/src/pretty-print.ts +1 -16
- package/internal/src/selector/create-readonly-selector.ts +2 -2
- package/internal/src/selector/create-standalone-selector.ts +5 -5
- package/internal/src/selector/create-writable-selector.ts +2 -2
- package/internal/src/selector/dispose-selector.ts +2 -9
- package/internal/src/selector/register-selector.ts +9 -9
- package/internal/src/set-state/set-into-store.ts +23 -33
- package/internal/src/store/circular-buffer.ts +34 -0
- package/internal/src/store/counterfeit.ts +109 -0
- package/internal/src/store/deposit.ts +67 -13
- package/internal/src/store/index.ts +1 -0
- package/internal/src/store/store.ts +4 -1
- package/internal/src/store/withdraw.ts +15 -10
- package/internal/src/subscribe/index.ts +2 -0
- package/internal/src/subscribe/subscribe-in-store.ts +62 -0
- package/internal/src/timeline/time-travel.ts +1 -1
- package/internal/src/transaction/build-transaction.ts +7 -6
- package/introspection/dist/index.d.ts +84 -4
- package/introspection/dist/index.js +1 -413
- package/introspection/src/attach-atom-index.ts +5 -8
- package/introspection/src/attach-introspection-states.ts +7 -4
- package/introspection/src/attach-selector-index.ts +6 -8
- package/introspection/src/attach-timeline-family.ts +25 -28
- package/introspection/src/attach-timeline-index.ts +5 -8
- package/introspection/src/attach-transaction-index.ts +5 -8
- package/introspection/src/attach-transaction-logs.ts +21 -27
- package/introspection/src/attach-type-selectors.ts +26 -0
- package/introspection/src/differ.ts +167 -0
- package/introspection/src/index.ts +2 -0
- package/introspection/src/refinery.ts +100 -0
- package/json/dist/index.d.ts +31 -30
- package/json/dist/index.js +2 -80
- package/json/src/entries.ts +6 -0
- package/json/src/index.ts +47 -6
- package/json/src/select-json-family.ts +4 -4
- package/json/src/select-json.ts +6 -9
- package/package.json +17 -8
- package/react/dist/index.js +7 -7
- package/react/src/parse-state-overloads.ts +2 -2
- package/react/src/use-i.ts +1 -1
- package/react/src/use-json.ts +2 -2
- package/react/src/use-o.ts +2 -2
- package/react-devtools/dist/index.d.ts +1 -91
- package/react-devtools/dist/index.js +285 -414
- package/react-devtools/src/AtomIODevtools.tsx +2 -2
- package/react-devtools/src/StateEditor.tsx +20 -12
- package/react-devtools/src/StateIndex.tsx +8 -26
- package/react-devtools/src/TimelineIndex.tsx +3 -3
- package/react-devtools/src/TransactionIndex.tsx +6 -6
- package/react-devtools/src/Updates.tsx +1 -4
- package/react-devtools/src/index.ts +0 -71
- package/react-devtools/src/store.ts +51 -0
- package/realtime/dist/index.d.ts +7 -7
- package/realtime/dist/index.js +18 -22
- package/realtime/src/realtime-continuity.ts +27 -35
- package/realtime-client/dist/index.js +59 -65
- package/realtime-client/src/pull-atom-family-member.ts +1 -1
- package/realtime-client/src/pull-atom.ts +1 -1
- package/realtime-client/src/pull-mutable-atom-family-member.ts +3 -3
- package/realtime-client/src/pull-mutable-atom.ts +3 -3
- package/realtime-client/src/realtime-client-stores/client-main-store.ts +6 -6
- package/realtime-client/src/sync-continuity.ts +55 -53
- package/realtime-react/dist/index.js +3 -3
- package/realtime-react/src/use-pull-atom-family-member.ts +1 -1
- package/realtime-react/src/use-pull-mutable-family-member.ts +1 -1
- package/realtime-react/src/use-pull-selector-family-member.ts +1 -1
- package/realtime-server/dist/index.js +72 -36
- package/realtime-server/src/realtime-continuity-synchronizer.ts +57 -93
- package/realtime-server/src/realtime-family-provider.ts +3 -3
- package/realtime-server/src/realtime-mutable-family-provider.ts +5 -5
- package/realtime-server/src/realtime-mutable-provider.ts +2 -2
- package/realtime-server/src/realtime-state-provider.ts +1 -1
- package/realtime-server/src/realtime-state-receiver.ts +1 -1
- package/realtime-testing/dist/index.d.ts +2 -0
- package/realtime-testing/dist/index.js +57 -15
- package/realtime-testing/src/setup-realtime-test.tsx +66 -16
- package/src/atom.ts +2 -2
- package/src/dispose-state.ts +2 -2
- package/src/get-state.ts +9 -13
- package/src/molecule.ts +1 -1
- package/src/selector.ts +2 -2
- package/src/set-state.ts +10 -7
- package/src/silo.ts +29 -55
- package/src/subscribe.ts +3 -23
- package/src/timeline.ts +2 -2
- package/web/dist/index.d.ts +9 -0
- package/{dist/chunk-H6EDLPKH.js → web/dist/index.js} +5 -4
- package/web/package.json +13 -0
- package/web/src/index.ts +1 -0
- package/web/src/persist-sync.ts +25 -0
- package/dist/chunk-AK23DRMD.js +0 -21
- package/dist/chunk-IW6WYRS7.js +0 -140
- package/internal/src/families/throw-in-case-of-conflicting-family.ts +0 -18
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { lazyLocalStorageEffect } from '../../dist/chunk-H6EDLPKH.js';
|
|
2
1
|
import '../../dist/chunk-XWL6SNVU.js';
|
|
3
2
|
import * as Internal from 'atom.io/internal';
|
|
4
|
-
import { setIntoStore, getJsonToken, getUpdateToken, getFromStore, assignTransactionToContinuity, subscribeToTransaction, disposeAtom, setEpochNumberOfContinuity, getEpochNumberOfContinuity, isRootStore, ingestTransactionUpdate, actUponStore } from 'atom.io/internal';
|
|
3
|
+
import { setIntoStore, getJsonToken, getUpdateToken, getFromStore, assignTransactionToContinuity, subscribeToTransaction, disposeAtom, setEpochNumberOfContinuity, getEpochNumberOfContinuity, isRootStore, ingestTransactionUpdate, growMoleculeInStore, initFamilyMemberInStore, actUponStore } from 'atom.io/internal';
|
|
5
4
|
import { parseJson } from 'atom.io/json';
|
|
6
5
|
import * as AtomIO from 'atom.io';
|
|
6
|
+
import { persistSync } from 'atom.io/web';
|
|
7
7
|
import { optimisticUpdateQueue as optimisticUpdateQueue$1, confirmedUpdateQueue as confirmedUpdateQueue$1 } from 'atom.io/realtime-client';
|
|
8
8
|
|
|
9
9
|
function pullAtom(token, socket, store) {
|
|
10
10
|
const setServedValue = (data) => {
|
|
11
|
-
setIntoStore(token, data
|
|
11
|
+
setIntoStore(store, token, data);
|
|
12
12
|
};
|
|
13
13
|
socket.on(`serve:${token.key}`, setServedValue);
|
|
14
14
|
socket.emit(`sub:${token.key}`);
|
|
@@ -26,7 +26,7 @@ function pullAtomFamilyMember(token, socket, store) {
|
|
|
26
26
|
const { key: familyKey, subKey: serializedSubKey } = token.family;
|
|
27
27
|
const subKey = parseJson(serializedSubKey);
|
|
28
28
|
socket?.on(`serve:${token.key}`, (data) => {
|
|
29
|
-
setIntoStore(token, data
|
|
29
|
+
setIntoStore(store, token, data);
|
|
30
30
|
});
|
|
31
31
|
socket?.emit(`sub:${familyKey}`, subKey);
|
|
32
32
|
return () => {
|
|
@@ -35,15 +35,15 @@ function pullAtomFamilyMember(token, socket, store) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
function pullMutableAtom(token, socket, store) {
|
|
38
|
-
const jsonToken = getJsonToken(
|
|
38
|
+
const jsonToken = getJsonToken(store, token);
|
|
39
39
|
const updateToken = getUpdateToken(token);
|
|
40
40
|
socket.on(`init:${token.key}`, (data) => {
|
|
41
|
-
setIntoStore(jsonToken, data
|
|
41
|
+
setIntoStore(store, jsonToken, data);
|
|
42
42
|
});
|
|
43
43
|
socket.on(
|
|
44
44
|
`next:${token.key}`,
|
|
45
45
|
(data) => {
|
|
46
|
-
setIntoStore(updateToken, data
|
|
46
|
+
setIntoStore(store, updateToken, data);
|
|
47
47
|
}
|
|
48
48
|
);
|
|
49
49
|
socket.emit(`sub:${token.key}`);
|
|
@@ -62,14 +62,14 @@ function pullMutableAtomFamilyMember(token, socket, store) {
|
|
|
62
62
|
const { key: familyKey, subKey: serializedSubKey } = token.family;
|
|
63
63
|
const subKey = parseJson(serializedSubKey);
|
|
64
64
|
socket.on(`init:${token.key}`, (data) => {
|
|
65
|
-
const jsonToken = getJsonToken(
|
|
66
|
-
setIntoStore(jsonToken, data
|
|
65
|
+
const jsonToken = getJsonToken(store, token);
|
|
66
|
+
setIntoStore(store, jsonToken, data);
|
|
67
67
|
});
|
|
68
68
|
socket.on(
|
|
69
69
|
`next:${token.key}`,
|
|
70
70
|
(data) => {
|
|
71
71
|
const trackerToken = getUpdateToken(token);
|
|
72
|
-
setIntoStore(trackerToken, data
|
|
72
|
+
setIntoStore(store, trackerToken, data);
|
|
73
73
|
}
|
|
74
74
|
);
|
|
75
75
|
socket.emit(`sub:${familyKey}`, subKey);
|
|
@@ -164,11 +164,10 @@ var myIdState = AtomIO.selector({
|
|
|
164
164
|
key: `mySocketId`,
|
|
165
165
|
get: ({ get }) => get(myIdState__INTERNAL)
|
|
166
166
|
});
|
|
167
|
-
var usernameEffects = typeof window === `undefined` ? [] : [lazyLocalStorageEffect(`myUsername`)];
|
|
168
167
|
var myUsernameState = AtomIO.atom({
|
|
169
|
-
key: `
|
|
168
|
+
key: `myName`,
|
|
170
169
|
default: null,
|
|
171
|
-
effects:
|
|
170
|
+
effects: typeof window === `undefined` ? [] : [persistSync(window.localStorage, JSON, `myUsername`)]
|
|
172
171
|
});
|
|
173
172
|
var optimisticUpdateQueue = AtomIO.atom({
|
|
174
173
|
key: `updateQueue`,
|
|
@@ -195,22 +194,22 @@ function serverAction(token, socket, store) {
|
|
|
195
194
|
}
|
|
196
195
|
function syncContinuity(continuity, socket, store) {
|
|
197
196
|
const continuityKey = continuity.key;
|
|
198
|
-
const optimisticUpdates = getFromStore(optimisticUpdateQueue$1
|
|
199
|
-
const confirmedUpdates = getFromStore(confirmedUpdateQueue$1
|
|
197
|
+
const optimisticUpdates = getFromStore(store, optimisticUpdateQueue$1);
|
|
198
|
+
const confirmedUpdates = getFromStore(store, confirmedUpdateQueue$1);
|
|
200
199
|
const initializeContinuity = (epoch, payload) => {
|
|
201
200
|
socket.off(`continuity-init:${continuityKey}`, initializeContinuity);
|
|
202
201
|
let i = 0;
|
|
203
|
-
let k
|
|
204
|
-
let v
|
|
202
|
+
let k;
|
|
203
|
+
let v;
|
|
205
204
|
for (const x of payload) {
|
|
206
205
|
if (i % 2 === 0) {
|
|
207
206
|
k = x;
|
|
208
207
|
} else {
|
|
209
208
|
v = x;
|
|
210
209
|
if (`type` in k && k.type === `mutable_atom`) {
|
|
211
|
-
k = getJsonToken(
|
|
210
|
+
k = getJsonToken(store, k);
|
|
212
211
|
}
|
|
213
|
-
setIntoStore(k, v
|
|
212
|
+
setIntoStore(store, k, v);
|
|
214
213
|
}
|
|
215
214
|
i++;
|
|
216
215
|
}
|
|
@@ -226,14 +225,10 @@ function syncContinuity(continuity, socket, store) {
|
|
|
226
225
|
continuityKey,
|
|
227
226
|
`reconciling updates`
|
|
228
227
|
);
|
|
229
|
-
setIntoStore(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
return queue;
|
|
234
|
-
},
|
|
235
|
-
store
|
|
236
|
-
);
|
|
228
|
+
setIntoStore(store, optimisticUpdateQueue$1, (queue) => {
|
|
229
|
+
queue.shift();
|
|
230
|
+
return queue;
|
|
231
|
+
});
|
|
237
232
|
if (optimisticUpdate.id === confirmedUpdate.id) {
|
|
238
233
|
const clientResult = JSON.stringify(optimisticUpdate.updates);
|
|
239
234
|
const serverResult = JSON.stringify(confirmedUpdate.updates);
|
|
@@ -356,15 +351,11 @@ function syncContinuity(continuity, socket, store) {
|
|
|
356
351
|
`pushing confirmed update to queue`,
|
|
357
352
|
confirmed
|
|
358
353
|
);
|
|
359
|
-
setIntoStore(
|
|
360
|
-
|
|
361
|
-
(
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
return queue;
|
|
365
|
-
},
|
|
366
|
-
store
|
|
367
|
-
);
|
|
354
|
+
setIntoStore(store, confirmedUpdateQueue$1, (queue) => {
|
|
355
|
+
queue.push(confirmed);
|
|
356
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
357
|
+
return queue;
|
|
358
|
+
});
|
|
368
359
|
}
|
|
369
360
|
}
|
|
370
361
|
} else {
|
|
@@ -414,15 +405,11 @@ function syncContinuity(continuity, socket, store) {
|
|
|
414
405
|
continuityKey,
|
|
415
406
|
`pushing confirmed update #${confirmed.epoch} to queue`
|
|
416
407
|
);
|
|
417
|
-
setIntoStore(
|
|
418
|
-
|
|
419
|
-
(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
return queue;
|
|
423
|
-
},
|
|
424
|
-
store
|
|
425
|
-
);
|
|
408
|
+
setIntoStore(store, confirmedUpdateQueue$1, (queue) => {
|
|
409
|
+
queue.push(confirmed);
|
|
410
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
411
|
+
return queue;
|
|
412
|
+
});
|
|
426
413
|
}
|
|
427
414
|
}
|
|
428
415
|
}
|
|
@@ -450,15 +437,11 @@ function syncContinuity(continuity, socket, store) {
|
|
|
450
437
|
continuityKey,
|
|
451
438
|
`enqueuing new optimistic update`
|
|
452
439
|
);
|
|
453
|
-
setIntoStore(
|
|
454
|
-
|
|
455
|
-
(
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
return queue;
|
|
459
|
-
},
|
|
460
|
-
store
|
|
461
|
-
);
|
|
440
|
+
setIntoStore(store, optimisticUpdateQueue$1, (queue) => {
|
|
441
|
+
queue.push(clientUpdate);
|
|
442
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
443
|
+
return queue;
|
|
444
|
+
});
|
|
462
445
|
} else {
|
|
463
446
|
store.logger.info(
|
|
464
447
|
`\u{1F91E}`,
|
|
@@ -466,14 +449,10 @@ function syncContinuity(continuity, socket, store) {
|
|
|
466
449
|
continuityKey,
|
|
467
450
|
`replacing existing optimistic update at index ${optimisticUpdateIndex}`
|
|
468
451
|
);
|
|
469
|
-
setIntoStore(
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
return queue;
|
|
474
|
-
},
|
|
475
|
-
store
|
|
476
|
-
);
|
|
452
|
+
setIntoStore(store, optimisticUpdateQueue$1, (queue) => {
|
|
453
|
+
queue[optimisticUpdateIndex] = clientUpdate;
|
|
454
|
+
return queue;
|
|
455
|
+
});
|
|
477
456
|
}
|
|
478
457
|
socket.emit(`tx-run:${continuityKey}`, {
|
|
479
458
|
id: clientUpdate.id,
|
|
@@ -488,14 +467,14 @@ function syncContinuity(continuity, socket, store) {
|
|
|
488
467
|
});
|
|
489
468
|
socket.on(`reveal:${continuityKey}`, (revealed) => {
|
|
490
469
|
let i = 0;
|
|
491
|
-
let k
|
|
492
|
-
let v
|
|
470
|
+
let k;
|
|
471
|
+
let v;
|
|
493
472
|
for (const x of revealed) {
|
|
494
473
|
if (i % 2 === 0) {
|
|
495
474
|
k = x;
|
|
496
475
|
} else {
|
|
497
476
|
v = x;
|
|
498
|
-
|
|
477
|
+
upsertState(k, v, store);
|
|
499
478
|
}
|
|
500
479
|
i++;
|
|
501
480
|
}
|
|
@@ -515,5 +494,20 @@ function syncContinuity(continuity, socket, store) {
|
|
|
515
494
|
for (const unsubscribe of unsubscribeFunctions) unsubscribe();
|
|
516
495
|
};
|
|
517
496
|
}
|
|
497
|
+
function upsertState(store, token, value) {
|
|
498
|
+
if (token.family) {
|
|
499
|
+
const family = store.families.get(token.family.key);
|
|
500
|
+
if (family) {
|
|
501
|
+
const molecule = store.molecules.get(token.family.subKey);
|
|
502
|
+
if (molecule) {
|
|
503
|
+
growMoleculeInStore(molecule, family, store);
|
|
504
|
+
} else if (store.config.lifespan === `immortal`) {
|
|
505
|
+
throw new Error(`No molecule found for key "${token.family.subKey}"`);
|
|
506
|
+
}
|
|
507
|
+
initFamilyMemberInStore(store, family, parseJson(token.family.subKey));
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
setIntoStore(store, token, value);
|
|
511
|
+
}
|
|
518
512
|
|
|
519
513
|
export { confirmedUpdateQueue, myIdState, myIdState__INTERNAL, myUsernameState, optimisticUpdateQueue, pullAtom, pullAtomFamilyMember, pullMutableAtom, pullMutableAtomFamilyMember, pullSelector, pullSelectorFamilyMember, pushState, serverAction, syncContinuity };
|
|
@@ -16,7 +16,7 @@ export function pullAtomFamilyMember<J extends Json.Serializable>(
|
|
|
16
16
|
const { key: familyKey, subKey: serializedSubKey } = token.family
|
|
17
17
|
const subKey = parseJson(serializedSubKey)
|
|
18
18
|
socket?.on(`serve:${token.key}`, (data: J) => {
|
|
19
|
-
setIntoStore(token, data
|
|
19
|
+
setIntoStore(store, token, data)
|
|
20
20
|
})
|
|
21
21
|
socket?.emit(`sub:${familyKey}`, subKey)
|
|
22
22
|
return () => {
|
|
@@ -9,7 +9,7 @@ export function pullAtom<J extends Json.Serializable>(
|
|
|
9
9
|
store: Store,
|
|
10
10
|
): () => void {
|
|
11
11
|
const setServedValue = (data: J) => {
|
|
12
|
-
setIntoStore(token, data
|
|
12
|
+
setIntoStore(store, token, data)
|
|
13
13
|
}
|
|
14
14
|
socket.on(`serve:${token.key}`, setServedValue)
|
|
15
15
|
socket.emit(`sub:${token.key}`)
|
|
@@ -20,14 +20,14 @@ export function pullMutableAtomFamilyMember<
|
|
|
20
20
|
const { key: familyKey, subKey: serializedSubKey } = token.family
|
|
21
21
|
const subKey = parseJson(serializedSubKey)
|
|
22
22
|
socket.on(`init:${token.key}`, (data: J) => {
|
|
23
|
-
const jsonToken = getJsonToken(
|
|
24
|
-
setIntoStore(jsonToken, data
|
|
23
|
+
const jsonToken = getJsonToken(store, token)
|
|
24
|
+
setIntoStore(store, jsonToken, data)
|
|
25
25
|
})
|
|
26
26
|
socket.on(
|
|
27
27
|
`next:${token.key}`,
|
|
28
28
|
(data: T extends Transceiver<infer Signal> ? Signal : never) => {
|
|
29
29
|
const trackerToken = getUpdateToken(token)
|
|
30
|
-
setIntoStore(trackerToken, data
|
|
30
|
+
setIntoStore(store, trackerToken, data)
|
|
31
31
|
},
|
|
32
32
|
)
|
|
33
33
|
socket.emit(`sub:${familyKey}`, subKey)
|
|
@@ -12,15 +12,15 @@ export function pullMutableAtom<
|
|
|
12
12
|
socket: Socket,
|
|
13
13
|
store: Store,
|
|
14
14
|
): () => void {
|
|
15
|
-
const jsonToken = getJsonToken(
|
|
15
|
+
const jsonToken = getJsonToken(store, token)
|
|
16
16
|
const updateToken = getUpdateToken(token)
|
|
17
17
|
socket.on(`init:${token.key}`, (data: J) => {
|
|
18
|
-
setIntoStore(jsonToken, data
|
|
18
|
+
setIntoStore(store, jsonToken, data)
|
|
19
19
|
})
|
|
20
20
|
socket.on(
|
|
21
21
|
`next:${token.key}`,
|
|
22
22
|
(data: T extends Transceiver<infer Update> ? Update : never) => {
|
|
23
|
-
setIntoStore(updateToken, data
|
|
23
|
+
setIntoStore(store, updateToken, data)
|
|
24
24
|
},
|
|
25
25
|
)
|
|
26
26
|
socket.emit(`sub:${token.key}`)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as AtomIO from "atom.io"
|
|
2
|
-
|
|
3
|
-
import { lazyLocalStorageEffect } from "~/packages/atom.io/__unstable__/web-effects/src/storage"
|
|
2
|
+
import { persistSync } from "atom.io/web"
|
|
4
3
|
|
|
5
4
|
export const myIdState__INTERNAL = AtomIO.atom<string | undefined>({
|
|
6
5
|
key: `mySocketId__INTERNAL`,
|
|
@@ -11,10 +10,11 @@ export const myIdState = AtomIO.selector<string | undefined>({
|
|
|
11
10
|
get: ({ get }) => get(myIdState__INTERNAL),
|
|
12
11
|
})
|
|
13
12
|
|
|
14
|
-
const usernameEffects =
|
|
15
|
-
typeof window === `undefined` ? [] : [lazyLocalStorageEffect(`myUsername`)]
|
|
16
13
|
export const myUsernameState = AtomIO.atom<string | null>({
|
|
17
|
-
key: `
|
|
14
|
+
key: `myName`,
|
|
18
15
|
default: null,
|
|
19
|
-
effects:
|
|
16
|
+
effects:
|
|
17
|
+
typeof window === `undefined`
|
|
18
|
+
? []
|
|
19
|
+
: [persistSync(window.localStorage, JSON, `myUsername`)],
|
|
20
20
|
})
|
|
@@ -7,13 +7,15 @@ import {
|
|
|
7
7
|
getEpochNumberOfContinuity,
|
|
8
8
|
getFromStore,
|
|
9
9
|
getJsonToken,
|
|
10
|
+
growMoleculeInStore,
|
|
10
11
|
ingestTransactionUpdate,
|
|
12
|
+
initFamilyMemberInStore,
|
|
11
13
|
isRootStore,
|
|
12
14
|
setEpochNumberOfContinuity,
|
|
13
15
|
setIntoStore,
|
|
14
16
|
subscribeToTransaction,
|
|
15
17
|
} from "atom.io/internal"
|
|
16
|
-
import type
|
|
18
|
+
import { type Json, parseJson } from "atom.io/json"
|
|
17
19
|
import type { ContinuityToken } from "atom.io/realtime"
|
|
18
20
|
import {
|
|
19
21
|
confirmedUpdateQueue,
|
|
@@ -27,23 +29,23 @@ export function syncContinuity<F extends Func>(
|
|
|
27
29
|
store: Store,
|
|
28
30
|
): () => void {
|
|
29
31
|
const continuityKey = continuity.key
|
|
30
|
-
const optimisticUpdates = getFromStore(
|
|
31
|
-
const confirmedUpdates = getFromStore(
|
|
32
|
+
const optimisticUpdates = getFromStore(store, optimisticUpdateQueue)
|
|
33
|
+
const confirmedUpdates = getFromStore(store, confirmedUpdateQueue)
|
|
32
34
|
|
|
33
35
|
const initializeContinuity = (epoch: number, payload: Json.Array) => {
|
|
34
36
|
socket.off(`continuity-init:${continuityKey}`, initializeContinuity)
|
|
35
37
|
let i = 0
|
|
36
|
-
let k: any
|
|
37
|
-
let v: any
|
|
38
|
+
let k: any
|
|
39
|
+
let v: any
|
|
38
40
|
for (const x of payload) {
|
|
39
41
|
if (i % 2 === 0) {
|
|
40
42
|
k = x
|
|
41
43
|
} else {
|
|
42
44
|
v = x
|
|
43
45
|
if (`type` in k && k.type === `mutable_atom`) {
|
|
44
|
-
k = getJsonToken(
|
|
46
|
+
k = getJsonToken(store, k)
|
|
45
47
|
}
|
|
46
|
-
setIntoStore(k, v
|
|
48
|
+
setIntoStore(store, k, v)
|
|
47
49
|
}
|
|
48
50
|
i++
|
|
49
51
|
}
|
|
@@ -65,14 +67,10 @@ export function syncContinuity<F extends Func>(
|
|
|
65
67
|
continuityKey,
|
|
66
68
|
`reconciling updates`,
|
|
67
69
|
)
|
|
68
|
-
setIntoStore(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return queue
|
|
73
|
-
},
|
|
74
|
-
store,
|
|
75
|
-
)
|
|
70
|
+
setIntoStore(store, optimisticUpdateQueue, (queue) => {
|
|
71
|
+
queue.shift()
|
|
72
|
+
return queue
|
|
73
|
+
})
|
|
76
74
|
if (optimisticUpdate.id === confirmedUpdate.id) {
|
|
77
75
|
const clientResult = JSON.stringify(optimisticUpdate.updates)
|
|
78
76
|
const serverResult = JSON.stringify(confirmedUpdate.updates)
|
|
@@ -199,15 +197,11 @@ export function syncContinuity<F extends Func>(
|
|
|
199
197
|
`pushing confirmed update to queue`,
|
|
200
198
|
confirmed,
|
|
201
199
|
)
|
|
202
|
-
setIntoStore(
|
|
203
|
-
|
|
204
|
-
(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return queue
|
|
208
|
-
},
|
|
209
|
-
store,
|
|
210
|
-
)
|
|
200
|
+
setIntoStore(store, confirmedUpdateQueue, (queue) => {
|
|
201
|
+
queue.push(confirmed)
|
|
202
|
+
queue.sort((a, b) => a.epoch - b.epoch)
|
|
203
|
+
return queue
|
|
204
|
+
})
|
|
211
205
|
}
|
|
212
206
|
}
|
|
213
207
|
} else {
|
|
@@ -260,15 +254,11 @@ export function syncContinuity<F extends Func>(
|
|
|
260
254
|
continuityKey,
|
|
261
255
|
`pushing confirmed update #${confirmed.epoch} to queue`,
|
|
262
256
|
)
|
|
263
|
-
setIntoStore(
|
|
264
|
-
|
|
265
|
-
(
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
return queue
|
|
269
|
-
},
|
|
270
|
-
store,
|
|
271
|
-
)
|
|
257
|
+
setIntoStore(store, confirmedUpdateQueue, (queue) => {
|
|
258
|
+
queue.push(confirmed)
|
|
259
|
+
queue.sort((a, b) => a.epoch - b.epoch)
|
|
260
|
+
return queue
|
|
261
|
+
})
|
|
272
262
|
}
|
|
273
263
|
}
|
|
274
264
|
}
|
|
@@ -297,15 +287,11 @@ export function syncContinuity<F extends Func>(
|
|
|
297
287
|
continuityKey,
|
|
298
288
|
`enqueuing new optimistic update`,
|
|
299
289
|
)
|
|
300
|
-
setIntoStore(
|
|
301
|
-
|
|
302
|
-
(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
return queue
|
|
306
|
-
},
|
|
307
|
-
store,
|
|
308
|
-
)
|
|
290
|
+
setIntoStore(store, optimisticUpdateQueue, (queue) => {
|
|
291
|
+
queue.push(clientUpdate)
|
|
292
|
+
queue.sort((a, b) => a.epoch - b.epoch)
|
|
293
|
+
return queue
|
|
294
|
+
})
|
|
309
295
|
} else {
|
|
310
296
|
store.logger.info(
|
|
311
297
|
`🤞`,
|
|
@@ -313,14 +299,10 @@ export function syncContinuity<F extends Func>(
|
|
|
313
299
|
continuityKey,
|
|
314
300
|
`replacing existing optimistic update at index ${optimisticUpdateIndex}`,
|
|
315
301
|
)
|
|
316
|
-
setIntoStore(
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
return queue
|
|
321
|
-
},
|
|
322
|
-
store,
|
|
323
|
-
)
|
|
302
|
+
setIntoStore(store, optimisticUpdateQueue, (queue) => {
|
|
303
|
+
queue[optimisticUpdateIndex] = clientUpdate
|
|
304
|
+
return queue
|
|
305
|
+
})
|
|
324
306
|
}
|
|
325
307
|
socket.emit(`tx-run:${continuityKey}`, {
|
|
326
308
|
id: clientUpdate.id,
|
|
@@ -336,14 +318,14 @@ export function syncContinuity<F extends Func>(
|
|
|
336
318
|
|
|
337
319
|
socket.on(`reveal:${continuityKey}`, (revealed: Json.Array) => {
|
|
338
320
|
let i = 0
|
|
339
|
-
let k: any
|
|
340
|
-
let v: any
|
|
321
|
+
let k: any
|
|
322
|
+
let v: any
|
|
341
323
|
for (const x of revealed) {
|
|
342
324
|
if (i % 2 === 0) {
|
|
343
325
|
k = x
|
|
344
326
|
} else {
|
|
345
327
|
v = x
|
|
346
|
-
|
|
328
|
+
upsertState(k, v, store)
|
|
347
329
|
}
|
|
348
330
|
i++
|
|
349
331
|
}
|
|
@@ -365,3 +347,23 @@ export function syncContinuity<F extends Func>(
|
|
|
365
347
|
// socket.emit(`unsub:${continuityKey}`)
|
|
366
348
|
}
|
|
367
349
|
}
|
|
350
|
+
|
|
351
|
+
function upsertState<T>(
|
|
352
|
+
store: Store,
|
|
353
|
+
token: AtomIO.WritableToken<T>,
|
|
354
|
+
value: T,
|
|
355
|
+
): void {
|
|
356
|
+
if (token.family) {
|
|
357
|
+
const family = store.families.get(token.family.key)
|
|
358
|
+
if (family) {
|
|
359
|
+
const molecule = store.molecules.get(token.family.subKey)
|
|
360
|
+
if (molecule) {
|
|
361
|
+
growMoleculeInStore(molecule, family, store)
|
|
362
|
+
} else if (store.config.lifespan === `immortal`) {
|
|
363
|
+
throw new Error(`No molecule found for key "${token.family.subKey}"`)
|
|
364
|
+
}
|
|
365
|
+
initFamilyMemberInStore(store, family, parseJson(token.family.subKey))
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
setIntoStore(store, token, value)
|
|
369
|
+
}
|
|
@@ -88,7 +88,7 @@ function usePullAtom(token) {
|
|
|
88
88
|
}
|
|
89
89
|
function usePullAtomFamilyMember(family, subKey) {
|
|
90
90
|
const store = React.useContext(StoreContext);
|
|
91
|
-
const token = findInStore(family, subKey
|
|
91
|
+
const token = findInStore(store, family, subKey);
|
|
92
92
|
useRealtimeService(
|
|
93
93
|
`pull:${token.key}`,
|
|
94
94
|
(socket) => RTC.pullAtomFamilyMember(token, socket, store)
|
|
@@ -105,7 +105,7 @@ function usePullMutable(token) {
|
|
|
105
105
|
}
|
|
106
106
|
function usePullMutableAtomFamilyMember(familyToken, key) {
|
|
107
107
|
const store = React.useContext(StoreContext);
|
|
108
|
-
const token = findInStore(familyToken, key
|
|
108
|
+
const token = findInStore(store, familyToken, key);
|
|
109
109
|
useRealtimeService(
|
|
110
110
|
`pull:${token.key}`,
|
|
111
111
|
(socket) => RTC.pullMutableAtomFamilyMember(token, socket, store)
|
|
@@ -122,7 +122,7 @@ function usePullSelector(token) {
|
|
|
122
122
|
}
|
|
123
123
|
function usePullSelectorFamilyMember(familyToken, key) {
|
|
124
124
|
const store = React.useContext(StoreContext);
|
|
125
|
-
const token = findInStore(familyToken, key
|
|
125
|
+
const token = findInStore(store, familyToken, key);
|
|
126
126
|
useRealtimeService(
|
|
127
127
|
`pull:${token.key}`,
|
|
128
128
|
(socket) => RTC.pullSelectorFamilyMember(token, socket, store)
|
|
@@ -13,7 +13,7 @@ export function usePullAtomFamilyMember<
|
|
|
13
13
|
Key extends K,
|
|
14
14
|
>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {
|
|
15
15
|
const store = React.useContext(StoreContext)
|
|
16
|
-
const token = findInStore(family, subKey
|
|
16
|
+
const token = findInStore(store, family, subKey)
|
|
17
17
|
useRealtimeService(`pull:${token.key}`, (socket) =>
|
|
18
18
|
RTC.pullAtomFamilyMember(token, socket, store),
|
|
19
19
|
)
|
|
@@ -15,7 +15,7 @@ export function usePullMutableAtomFamilyMember<
|
|
|
15
15
|
Key extends K,
|
|
16
16
|
>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {
|
|
17
17
|
const store = React.useContext(StoreContext)
|
|
18
|
-
const token = findInStore(familyToken, key
|
|
18
|
+
const token = findInStore(store, familyToken, key)
|
|
19
19
|
useRealtimeService(`pull:${token.key}`, (socket) =>
|
|
20
20
|
RTC.pullMutableAtomFamilyMember(token, socket, store),
|
|
21
21
|
)
|
|
@@ -13,7 +13,7 @@ export function usePullSelectorFamilyMember<
|
|
|
13
13
|
Key extends K,
|
|
14
14
|
>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {
|
|
15
15
|
const store = React.useContext(StoreContext)
|
|
16
|
-
const token = findInStore(familyToken, key
|
|
16
|
+
const token = findInStore(store, familyToken, key)
|
|
17
17
|
useRealtimeService(`pull:${token.key}`, (socket) =>
|
|
18
18
|
RTC.pullSelectorFamilyMember(token, socket, store),
|
|
19
19
|
)
|