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.
Files changed (134) hide show
  1. package/data/dist/index.d.ts +31 -29
  2. package/data/dist/index.js +65 -81
  3. package/data/src/dict.ts +9 -12
  4. package/data/src/join.ts +30 -33
  5. package/data/src/struct-family.ts +17 -23
  6. package/data/src/struct.ts +9 -12
  7. package/dist/{chunk-JRENM6KL.js → chunk-BX3MTH2Z.js} +482 -385
  8. package/dist/chunk-D52JNVER.js +721 -0
  9. package/dist/chunk-EUVKUTW3.js +89 -0
  10. package/dist/index.d.ts +4 -3
  11. package/dist/index.js +35 -53
  12. package/ephemeral/dist/index.js +1 -1
  13. package/ephemeral/src/find-state.ts +1 -1
  14. package/immortal/dist/index.js +2 -2
  15. package/immortal/src/seek-state.ts +2 -2
  16. package/internal/dist/index.d.ts +141 -87
  17. package/internal/dist/index.js +1 -1
  18. package/internal/src/atom/create-regular-atom.ts +3 -3
  19. package/internal/src/atom/create-standalone-atom.ts +7 -5
  20. package/internal/src/atom/dispose-atom.ts +2 -9
  21. package/internal/src/families/create-atom-family.ts +5 -5
  22. package/internal/src/families/create-readonly-selector-family.ts +20 -9
  23. package/internal/src/families/create-regular-atom-family.ts +15 -6
  24. package/internal/src/families/create-selector-family.ts +5 -5
  25. package/internal/src/families/create-writable-selector-family.ts +20 -10
  26. package/internal/src/families/dispose-from-store.ts +43 -29
  27. package/internal/src/families/find-in-store.ts +28 -18
  28. package/internal/src/families/init-family-member.ts +9 -9
  29. package/internal/src/families/seek-in-store.ts +10 -10
  30. package/internal/src/get-state/get-from-store.ts +70 -47
  31. package/internal/src/ingest-updates/ingest-atom-update.ts +1 -1
  32. package/internal/src/ingest-updates/ingest-creation-disposal.ts +15 -6
  33. package/internal/src/molecule/create-molecule-family.ts +1 -1
  34. package/internal/src/molecule/dispose-molecule.ts +7 -18
  35. package/internal/src/molecule/grow-molecule-in-store.ts +1 -1
  36. package/internal/src/molecule/make-molecule-in-store.ts +5 -5
  37. package/internal/src/mutable/create-mutable-atom-family.ts +15 -6
  38. package/internal/src/mutable/create-mutable-atom.ts +3 -3
  39. package/internal/src/mutable/get-json-token.ts +2 -2
  40. package/internal/src/mutable/tracker-family.ts +3 -3
  41. package/internal/src/mutable/tracker.ts +14 -18
  42. package/internal/src/pretty-print.ts +1 -16
  43. package/internal/src/selector/create-readonly-selector.ts +2 -2
  44. package/internal/src/selector/create-standalone-selector.ts +5 -5
  45. package/internal/src/selector/create-writable-selector.ts +2 -2
  46. package/internal/src/selector/dispose-selector.ts +2 -9
  47. package/internal/src/selector/register-selector.ts +9 -9
  48. package/internal/src/set-state/set-into-store.ts +23 -33
  49. package/internal/src/store/circular-buffer.ts +34 -0
  50. package/internal/src/store/counterfeit.ts +109 -0
  51. package/internal/src/store/deposit.ts +67 -13
  52. package/internal/src/store/index.ts +1 -0
  53. package/internal/src/store/store.ts +4 -1
  54. package/internal/src/store/withdraw.ts +15 -10
  55. package/internal/src/subscribe/index.ts +2 -0
  56. package/internal/src/subscribe/subscribe-in-store.ts +62 -0
  57. package/internal/src/timeline/time-travel.ts +1 -1
  58. package/internal/src/transaction/build-transaction.ts +7 -6
  59. package/introspection/dist/index.d.ts +84 -4
  60. package/introspection/dist/index.js +1 -413
  61. package/introspection/src/attach-atom-index.ts +5 -8
  62. package/introspection/src/attach-introspection-states.ts +7 -4
  63. package/introspection/src/attach-selector-index.ts +6 -8
  64. package/introspection/src/attach-timeline-family.ts +25 -28
  65. package/introspection/src/attach-timeline-index.ts +5 -8
  66. package/introspection/src/attach-transaction-index.ts +5 -8
  67. package/introspection/src/attach-transaction-logs.ts +21 -27
  68. package/introspection/src/attach-type-selectors.ts +26 -0
  69. package/introspection/src/differ.ts +167 -0
  70. package/introspection/src/index.ts +2 -0
  71. package/introspection/src/refinery.ts +100 -0
  72. package/json/dist/index.d.ts +31 -30
  73. package/json/dist/index.js +2 -80
  74. package/json/src/entries.ts +6 -0
  75. package/json/src/index.ts +47 -6
  76. package/json/src/select-json-family.ts +4 -4
  77. package/json/src/select-json.ts +6 -9
  78. package/package.json +17 -8
  79. package/react/dist/index.js +7 -7
  80. package/react/src/parse-state-overloads.ts +2 -2
  81. package/react/src/use-i.ts +1 -1
  82. package/react/src/use-json.ts +2 -2
  83. package/react/src/use-o.ts +2 -2
  84. package/react-devtools/dist/index.d.ts +1 -91
  85. package/react-devtools/dist/index.js +285 -414
  86. package/react-devtools/src/AtomIODevtools.tsx +2 -2
  87. package/react-devtools/src/StateEditor.tsx +20 -12
  88. package/react-devtools/src/StateIndex.tsx +8 -26
  89. package/react-devtools/src/TimelineIndex.tsx +3 -3
  90. package/react-devtools/src/TransactionIndex.tsx +6 -6
  91. package/react-devtools/src/Updates.tsx +1 -4
  92. package/react-devtools/src/index.ts +0 -71
  93. package/react-devtools/src/store.ts +51 -0
  94. package/realtime/dist/index.d.ts +7 -7
  95. package/realtime/dist/index.js +18 -22
  96. package/realtime/src/realtime-continuity.ts +27 -35
  97. package/realtime-client/dist/index.js +59 -65
  98. package/realtime-client/src/pull-atom-family-member.ts +1 -1
  99. package/realtime-client/src/pull-atom.ts +1 -1
  100. package/realtime-client/src/pull-mutable-atom-family-member.ts +3 -3
  101. package/realtime-client/src/pull-mutable-atom.ts +3 -3
  102. package/realtime-client/src/realtime-client-stores/client-main-store.ts +6 -6
  103. package/realtime-client/src/sync-continuity.ts +55 -53
  104. package/realtime-react/dist/index.js +3 -3
  105. package/realtime-react/src/use-pull-atom-family-member.ts +1 -1
  106. package/realtime-react/src/use-pull-mutable-family-member.ts +1 -1
  107. package/realtime-react/src/use-pull-selector-family-member.ts +1 -1
  108. package/realtime-server/dist/index.js +72 -36
  109. package/realtime-server/src/realtime-continuity-synchronizer.ts +57 -93
  110. package/realtime-server/src/realtime-family-provider.ts +3 -3
  111. package/realtime-server/src/realtime-mutable-family-provider.ts +5 -5
  112. package/realtime-server/src/realtime-mutable-provider.ts +2 -2
  113. package/realtime-server/src/realtime-state-provider.ts +1 -1
  114. package/realtime-server/src/realtime-state-receiver.ts +1 -1
  115. package/realtime-testing/dist/index.d.ts +2 -0
  116. package/realtime-testing/dist/index.js +57 -15
  117. package/realtime-testing/src/setup-realtime-test.tsx +66 -16
  118. package/src/atom.ts +2 -2
  119. package/src/dispose-state.ts +2 -2
  120. package/src/get-state.ts +9 -13
  121. package/src/molecule.ts +1 -1
  122. package/src/selector.ts +2 -2
  123. package/src/set-state.ts +10 -7
  124. package/src/silo.ts +29 -55
  125. package/src/subscribe.ts +3 -23
  126. package/src/timeline.ts +2 -2
  127. package/web/dist/index.d.ts +9 -0
  128. package/{dist/chunk-H6EDLPKH.js → web/dist/index.js} +5 -4
  129. package/web/package.json +13 -0
  130. package/web/src/index.ts +1 -0
  131. package/web/src/persist-sync.ts +25 -0
  132. package/dist/chunk-AK23DRMD.js +0 -21
  133. package/dist/chunk-IW6WYRS7.js +0 -140
  134. 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, store);
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, store);
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(token, store);
38
+ const jsonToken = getJsonToken(store, token);
39
39
  const updateToken = getUpdateToken(token);
40
40
  socket.on(`init:${token.key}`, (data) => {
41
- setIntoStore(jsonToken, data, store);
41
+ setIntoStore(store, jsonToken, data);
42
42
  });
43
43
  socket.on(
44
44
  `next:${token.key}`,
45
45
  (data) => {
46
- setIntoStore(updateToken, data, store);
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(token, store);
66
- setIntoStore(jsonToken, data, store);
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, store);
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: `myUsername`,
168
+ key: `myName`,
170
169
  default: null,
171
- effects: usernameEffects
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, store);
199
- const confirmedUpdates = getFromStore(confirmedUpdateQueue$1, store);
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 = null;
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(k, store);
210
+ k = getJsonToken(store, k);
212
211
  }
213
- setIntoStore(k, v, store);
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
- optimisticUpdateQueue$1,
231
- (queue) => {
232
- queue.shift();
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
- confirmedUpdateQueue$1,
361
- (queue) => {
362
- queue.push(confirmed);
363
- queue.sort((a, b) => a.epoch - b.epoch);
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
- confirmedUpdateQueue$1,
419
- (queue) => {
420
- queue.push(confirmed);
421
- queue.sort((a, b) => a.epoch - b.epoch);
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
- optimisticUpdateQueue$1,
455
- (queue) => {
456
- queue.push(clientUpdate);
457
- queue.sort((a, b) => a.epoch - b.epoch);
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
- optimisticUpdateQueue$1,
471
- (queue) => {
472
- queue[optimisticUpdateIndex] = clientUpdate;
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 = null;
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
- setIntoStore(k, v, store);
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, store)
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, store)
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(token, store)
24
- setIntoStore(jsonToken, data, store)
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, store)
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(token, store)
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, store)
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, store)
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: `myUsername`,
14
+ key: `myName`,
18
15
  default: null,
19
- effects: usernameEffects,
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 { Json } from "atom.io/json"
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(optimisticUpdateQueue, store)
31
- const confirmedUpdates = getFromStore(confirmedUpdateQueue, store)
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 = null
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(k, store)
46
+ k = getJsonToken(store, k)
45
47
  }
46
- setIntoStore(k, v, store)
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
- optimisticUpdateQueue,
70
- (queue) => {
71
- queue.shift()
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
- confirmedUpdateQueue,
204
- (queue) => {
205
- queue.push(confirmed)
206
- queue.sort((a, b) => a.epoch - b.epoch)
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
- confirmedUpdateQueue,
265
- (queue) => {
266
- queue.push(confirmed)
267
- queue.sort((a, b) => a.epoch - b.epoch)
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
- optimisticUpdateQueue,
302
- (queue) => {
303
- queue.push(clientUpdate)
304
- queue.sort((a, b) => a.epoch - b.epoch)
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
- optimisticUpdateQueue,
318
- (queue) => {
319
- queue[optimisticUpdateIndex] = clientUpdate
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 = null
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
- setIntoStore(k, v, store)
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, store);
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, store);
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, store);
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, store)
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, store)
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, store)
16
+ const token = findInStore(store, familyToken, key)
17
17
  useRealtimeService(`pull:${token.key}`, (socket) =>
18
18
  RTC.pullSelectorFamilyMember(token, socket, store),
19
19
  )