atom.io 0.40.0 → 0.40.2

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/dist/data/index.d.ts +1 -1
  2. package/dist/data/index.d.ts.map +1 -1
  3. package/dist/data/index.js.map +1 -1
  4. package/dist/internal/index.d.ts +205 -196
  5. package/dist/internal/index.d.ts.map +1 -1
  6. package/dist/internal/index.js +145 -107
  7. package/dist/internal/index.js.map +1 -1
  8. package/dist/introspection/index.d.ts +6 -6
  9. package/dist/introspection/index.d.ts.map +1 -1
  10. package/dist/introspection/index.js.map +1 -1
  11. package/dist/main/index.d.ts +93 -66
  12. package/dist/main/index.d.ts.map +1 -1
  13. package/dist/main/index.js +16 -13
  14. package/dist/main/index.js.map +1 -1
  15. package/dist/react/index.d.ts +14 -14
  16. package/dist/react/index.d.ts.map +1 -1
  17. package/dist/react/index.js.map +1 -1
  18. package/dist/react-devtools/index.js +1 -1
  19. package/dist/react-devtools/index.js.map +1 -1
  20. package/dist/realtime-client/index.d.ts +3 -3
  21. package/dist/realtime-client/index.d.ts.map +1 -1
  22. package/dist/realtime-client/index.js +3 -4
  23. package/dist/realtime-client/index.js.map +1 -1
  24. package/dist/realtime-server/index.d.ts +2 -2
  25. package/dist/realtime-server/index.d.ts.map +1 -1
  26. package/package.json +2 -2
  27. package/src/data/struct.ts +2 -2
  28. package/src/internal/atom/create-regular-atom.ts +11 -9
  29. package/src/internal/atom/dispose-atom.ts +11 -8
  30. package/src/internal/atom/has-role.ts +1 -1
  31. package/src/internal/caching.ts +15 -15
  32. package/src/internal/events/ingest-creation-disposal.ts +1 -1
  33. package/src/internal/families/create-readonly-held-selector-family.ts +3 -4
  34. package/src/internal/families/create-readonly-pure-selector-family.ts +25 -23
  35. package/src/internal/families/create-regular-atom-family.ts +21 -15
  36. package/src/internal/families/create-selector-family.ts +15 -15
  37. package/src/internal/families/create-writable-held-selector-family.ts +2 -2
  38. package/src/internal/families/create-writable-pure-selector-family.ts +25 -21
  39. package/src/internal/families/dispose-from-store.ts +17 -7
  40. package/src/internal/families/find-in-store.ts +23 -23
  41. package/src/internal/families/get-family-of-token.ts +17 -17
  42. package/src/internal/families/mint-in-store.ts +10 -10
  43. package/src/internal/families/seek-in-store.ts +26 -26
  44. package/src/internal/get-state/get-fallback.ts +8 -8
  45. package/src/internal/get-state/get-from-store.ts +20 -8
  46. package/src/internal/get-state/read-or-compute-value.ts +78 -14
  47. package/src/internal/get-state/reduce-reference.ts +10 -10
  48. package/src/internal/index.ts +65 -60
  49. package/src/internal/install-into-store.ts +2 -1
  50. package/src/internal/join/create-join.ts +2 -2
  51. package/src/internal/join/find-relations-in-store.ts +2 -2
  52. package/src/internal/join/get-internal-relations-from-store.ts +2 -2
  53. package/src/internal/join/get-join.ts +5 -2
  54. package/src/internal/join/join-internal.ts +30 -26
  55. package/src/internal/lineage.ts +12 -1
  56. package/src/internal/molecule.ts +64 -36
  57. package/src/internal/mutable/create-mutable-atom-family.ts +5 -5
  58. package/src/internal/mutable/create-mutable-atom.ts +2 -2
  59. package/src/internal/mutable/get-json-family.ts +3 -2
  60. package/src/internal/mutable/get-update-family.ts +7 -5
  61. package/src/internal/mutable/tracker-family.ts +8 -4
  62. package/src/internal/mutable/tracker.ts +5 -1
  63. package/src/internal/operation.ts +4 -2
  64. package/src/internal/selector/create-readonly-held-selector.ts +2 -2
  65. package/src/internal/selector/create-readonly-pure-selector.ts +10 -8
  66. package/src/internal/selector/create-standalone-selector.ts +10 -10
  67. package/src/internal/selector/create-writable-held-selector.ts +2 -2
  68. package/src/internal/selector/create-writable-pure-selector.ts +11 -9
  69. package/src/internal/selector/dispose-selector.ts +2 -2
  70. package/src/internal/selector/register-selector.ts +2 -2
  71. package/src/internal/selector/trace-selector-atoms.ts +3 -3
  72. package/src/internal/selector/update-selector-atoms.ts +1 -1
  73. package/src/internal/set-state/become.ts +1 -3
  74. package/src/internal/set-state/dispatch-state-update.ts +10 -6
  75. package/src/internal/set-state/evict-downstream.ts +4 -1
  76. package/src/internal/set-state/operate-on-store.ts +16 -10
  77. package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
  78. package/src/internal/set-state/reset-in-store.ts +17 -16
  79. package/src/internal/set-state/set-atom-or-selector.ts +1 -1
  80. package/src/internal/set-state/set-atom.ts +1 -1
  81. package/src/internal/set-state/set-into-store.ts +34 -7
  82. package/src/internal/set-state/set-selector.ts +1 -1
  83. package/src/internal/store/deposit.ts +38 -30
  84. package/src/internal/store/mint-or-counterfeit.ts +23 -23
  85. package/src/internal/store/store.ts +23 -21
  86. package/src/internal/store/withdraw.ts +68 -62
  87. package/src/internal/subscribe/recall-state.ts +4 -1
  88. package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
  89. package/src/internal/subscribe/subscribe-to-state.ts +4 -4
  90. package/src/internal/timeline/create-timeline.ts +11 -10
  91. package/src/internal/timeline/time-travel.ts +4 -3
  92. package/src/internal/transaction/abort-transaction.ts +3 -15
  93. package/src/internal/transaction/act-upon-store.ts +1 -5
  94. package/src/internal/transaction/apply-transaction.ts +3 -15
  95. package/src/internal/transaction/assign-transaction-to-continuity.ts +2 -7
  96. package/src/internal/transaction/build-transaction.ts +2 -3
  97. package/src/internal/transaction/create-transaction.ts +5 -6
  98. package/src/internal/transaction/get-epoch-number.ts +1 -7
  99. package/src/internal/transaction/set-epoch-number.ts +4 -12
  100. package/src/introspection/attach-atom-index.ts +2 -2
  101. package/src/introspection/attach-introspection-states.ts +4 -2
  102. package/src/introspection/attach-selector-index.ts +4 -2
  103. package/src/introspection/attach-timeline-family.ts +15 -13
  104. package/src/introspection/attach-timeline-index.ts +1 -1
  105. package/src/introspection/attach-transaction-index.ts +1 -1
  106. package/src/introspection/attach-transaction-logs.ts +6 -4
  107. package/src/introspection/attach-type-selectors.ts +4 -3
  108. package/src/introspection/index.ts +3 -5
  109. package/src/main/atom.ts +14 -8
  110. package/src/main/dispose-state.ts +1 -5
  111. package/src/main/events.ts +26 -26
  112. package/src/main/get-state.ts +10 -11
  113. package/src/main/realm.ts +36 -12
  114. package/src/main/reset-state.ts +5 -9
  115. package/src/main/selector.ts +40 -24
  116. package/src/main/set-state.ts +8 -11
  117. package/src/main/silo.ts +4 -3
  118. package/src/main/timeline.ts +5 -3
  119. package/src/main/tokens.ts +72 -44
  120. package/src/main/validators.ts +4 -4
  121. package/src/react/parse-state-overloads.ts +10 -10
  122. package/src/react/store-context.tsx +3 -3
  123. package/src/react/use-i.ts +6 -6
  124. package/src/react/use-loadable.ts +15 -15
  125. package/src/react/use-o.ts +9 -9
  126. package/src/react-devtools/Button.tsx +3 -2
  127. package/src/react-devtools/StateEditor.tsx +5 -3
  128. package/src/react-devtools/StateIndex.tsx +6 -4
  129. package/src/react-devtools/TimelineIndex.tsx +0 -2
  130. package/src/react-devtools/Updates.tsx +1 -1
  131. package/src/react-devtools/store.ts +18 -9
  132. package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +4 -8
  133. package/src/realtime-client/sync-continuity.ts +2 -2
  134. package/src/realtime-server/index.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["optimisticUpdateQueue","confirmedUpdateQueue","continuityEpoch: number | undefined","k: any","v: any","unsubscribes: Array<() => void>","unsubscribes: Array<() => void>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","optimisticUpdateQueue","confirmedUpdateQueue","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Fn, Store } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionOutcomeEvent,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"atom.io/realtime-server\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: Store,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t\tconfirmedUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t) =>\n\t(\n\t\tconfirmed: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>,\n\t): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\tqueue.shift()\n\t\t\t\treturn queue\n\t\t\t})\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.subEvents)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.subEvents)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.token.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.token.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionOutcomeEvent(store, subsequentOptimistic, `oldValue`)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, optimisticUpdate, `oldValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, confirmedUpdate, `newValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.token.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(store, token, id)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑‍⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate: confirmed, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmed.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmed)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tconst isRoot = isRootStore(store)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tif (isRoot) {\n\t\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\t\t\t}\n\n\t\t\tif (continuityEpoch === confirmed.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmed.epoch} (${confirmed.token.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionOutcomeEvent(store, confirmed, `newValue`)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmed.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(store, continuityKey, confirmed.epoch)\n\t\t\t} else if (isRoot && continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${confirmed.epoch} but still waiting for update #${\n\t\t\t\t\t\tcontinuityEpoch + 1\n\t\t\t\t\t}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmed.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmed.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmed.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<T extends Transceiver<any, any, any>>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tsetIntoStore(store, updateToken, data)\n\t})\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n>(store: Store, socket: Socket, token: AtomIO.MutableAtomToken<T>): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tconst trackerToken = getUpdateToken(token)\n\t\tsetIntoStore(store, trackerToken, data)\n\t})\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\n/* eslint-disable no-console */\n\nexport function pullSelectorFamilyMember<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type { WritableToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tsubscribeToState(store, token, `push`, ({ newValue }) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t})\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { persistSync } from \"atom.io/web\"\n\nexport const myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined> =\n\tAtomIO.atom<string | undefined>({\n\t\tkey: `mySocketId__INTERNAL`,\n\t\tdefault: undefined,\n\t})\nexport const myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined> =\n\tAtomIO.selector<string | undefined>({\n\t\tkey: `mySocketId`,\n\t\tget: ({ get }) => get(myIdState__INTERNAL),\n\t})\n\nexport const myUsernameState: AtomIO.RegularAtomToken<string | null> =\n\tAtomIO.atom<string | null>({\n\t\tkey: `myName`,\n\t\tdefault: null,\n\t\teffects:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `myUsername`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `updateQueue`,\n\tdefault: () => [],\n})\n\nexport const confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `serverConfirmedUpdateQueue`,\n\tdefault: () => [],\n})\n","import type * as AtomIO from \"atom.io\"\nimport type { Fn, Store } from \"atom.io/internal\"\nimport { subscribeToTransaction } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<F extends Fn>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.TransactionToken<F>,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = subscribeToTransaction(\n\t\tstore,\n\t\ttoken,\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: Store,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueue)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueue)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(store, k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(store, continuityKey, epoch)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = useRegisterAndAttemptConfirmedUpdate(\n\t\tstore,\n\t\tcontinuityKey,\n\t\tsocket,\n\t\toptimisticUpdates,\n\t\tconfirmedUpdates,\n\t)\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(store, continuityKey, transaction.key)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\ttoken: transaction,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tconst revealState = useRevealState(store)\n\tconst concealState = useConcealState(store)\n\tsocket.on(`reveal:${continuityKey}`, revealState)\n\tsocket.on(`conceal:${continuityKey}`, concealState)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["optimisticUpdateQueue","confirmedUpdateQueue","continuityEpoch: number | undefined","k: any","v: any","unsubscribes: Array<() => void>","unsubscribes: Array<() => void>","myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","optimisticUpdateQueue","confirmedUpdateQueue","k: any","v: any"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Fn, RootStore } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tgetEpochNumberOfContinuity,\n\tingestTransactionOutcomeEvent,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"atom.io/realtime-server\"\n\nexport const useRegisterAndAttemptConfirmedUpdate =\n\t(\n\t\tstore: RootStore,\n\t\tcontinuityKey: string,\n\t\tsocket: Socket,\n\t\toptimisticUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t\tconfirmedUpdates: AtomIO.TransactionOutcomeEvent<\n\t\t\tAtomIO.TransactionToken<Fn>\n\t\t>[],\n\t) =>\n\t(\n\t\tconfirmed: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>,\n\t): void => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionOutcomeEvent<\n\t\t\t\tAtomIO.TransactionToken<Fn>\n\t\t\t>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\tqueue.shift()\n\t\t\t\treturn queue\n\t\t\t})\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.subEvents)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.subEvents)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.token.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.token.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionOutcomeEvent(store, subsequentOptimistic, `oldValue`)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, optimisticUpdate, `oldValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionOutcomeEvent(store, confirmedUpdate, `newValue`)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.token.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(store, token, id)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑‍⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate: confirmed, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmed.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmed)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmed.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tlet continuityEpoch: number | undefined\n\t\t\tcontinuityEpoch = getEpochNumberOfContinuity(store, continuityKey)\n\n\t\t\tif (continuityEpoch === confirmed.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmed.epoch} (${confirmed.token.key} ${confirmed.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionOutcomeEvent(store, confirmed, `newValue`)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmed.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(store, continuityKey, confirmed.epoch)\n\t\t\t} else if (continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${confirmed.epoch} but still waiting for update #${\n\t\t\t\t\t\tcontinuityEpoch + 1\n\t\t\t\t\t}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmed.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmed.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmed.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmed.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, confirmedUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(confirmed)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n","import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { disposeAtom } from \"atom.io/internal\"\n\nexport function useConcealState(store: Store) {\n\treturn (concealed: AtomToken<unknown>[]): void => {\n\t\tfor (const token of concealed) {\n\t\t\tdisposeAtom(store, token)\n\t\t}\n\t}\n}\n","import { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function useRevealState(store: Store) {\n\treturn (revealed: Json.Array): void => {\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { setIntoStore, type Store } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.RegularAtomToken<J>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(store, token, data)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<T extends Transceiver<any, any, any>>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.MutableAtomToken<T>,\n): () => void {\n\tconst jsonToken = getJsonToken(store, token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tsetIntoStore(store, updateToken, data)\n\t})\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { AsJSON, SignalFrom, Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\n/* eslint-disable no-console */\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any, any, any>,\n>(store: Store, socket: Socket, token: AtomIO.MutableAtomToken<T>): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: AsJSON<T>) => {\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tsetIntoStore(store, jsonToken, data)\n\t})\n\tsocket.on(`next:${token.key}`, (data: SignalFrom<T>) => {\n\t\tconst trackerToken = getUpdateToken(token)\n\t\tsetIntoStore(store, trackerToken, data)\n\t})\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\n/* eslint-disable no-console */\n\nexport function pullSelectorFamilyMember<T>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.SelectorToken<T>,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(store, socket, atom))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type { WritableToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: WritableToken<J>,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tsubscribeToState(store, token, `push`, ({ newValue }) => {\n\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t})\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { persistSync } from \"atom.io/web\"\n\nexport const myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined> =\n\tAtomIO.atom<string | undefined>({\n\t\tkey: `mySocketId__INTERNAL`,\n\t\tdefault: undefined,\n\t})\nexport const myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined> =\n\tAtomIO.selector<string | undefined>({\n\t\tkey: `mySocketId`,\n\t\tget: ({ get }) => get(myIdState__INTERNAL),\n\t})\n\nexport const myUsernameState: AtomIO.RegularAtomToken<string | null> =\n\tAtomIO.atom<string | null>({\n\t\tkey: `myName`,\n\t\tdefault: null,\n\t\teffects:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `myUsername`)],\n\t})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `updateQueue`,\n\tdefault: () => [],\n})\n\nexport const confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n> = AtomIO.atom<AtomIO.TransactionOutcomeEvent<any>[]>({\n\tkey: `serverConfirmedUpdateQueue`,\n\tdefault: () => [],\n})\n","import type * as AtomIO from \"atom.io\"\nimport type { Fn, Store } from \"atom.io/internal\"\nimport { subscribeToTransaction } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<F extends Fn>(\n\tstore: Store,\n\tsocket: Socket,\n\ttoken: AtomIO.TransactionToken<F>,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = subscribeToTransaction(\n\t\tstore,\n\t\ttoken,\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n","import type { RootStore } from \"atom.io/internal\"\nimport {\n\tassignTransactionToContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { useRegisterAndAttemptConfirmedUpdate } from \"./continuity/register-and-attempt-confirmed-update\"\nimport { useConcealState } from \"./continuity/use-conceal-state\"\nimport { useRevealState } from \"./continuity/use-reveal-state\"\n\nexport function syncContinuity(\n\tstore: RootStore,\n\tsocket: Socket,\n\tcontinuity: ContinuityToken,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(store, optimisticUpdateQueue)\n\tconst confirmedUpdates = getFromStore(store, confirmedUpdateQueue)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any\n\t\tlet v: any\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(store, k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(store, k, v)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(store, continuityKey, epoch)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = useRegisterAndAttemptConfirmedUpdate(\n\t\tstore,\n\t\tcontinuityKey,\n\t\tsocket,\n\t\toptimisticUpdates,\n\t\tconfirmedUpdates,\n\t)\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(store, continuityKey, transaction.key)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(store, optimisticUpdateQueue, (queue) => {\n\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\treturn queue\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\ttoken: transaction,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tconst revealState = useRevealState(store)\n\tconst concealState = useConcealState(store)\n\tsocket.on(`reveal:${continuityKey}`, revealState)\n\tsocket.on(`conceal:${continuityKey}`, concealState)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Store, Subject, Transceiver } from "atom.io/internal";
1
+ import { RootStore, Subject, Transceiver } from "atom.io/internal";
2
2
  import { Canonical, Json, JsonIO, stringified } from "atom.io/json";
3
3
  import * as AtomIO from "atom.io";
4
4
  import { Hierarchy, JoinToken, Loadable, MutableAtomToken, ReadonlyPureSelectorFamilyToken, RegularAtomFamilyToken, TransactionOutcomeEvent, TransactionSubEvent, TransactionToken, WritableToken } from "atom.io";
@@ -163,7 +163,7 @@ type Socket = {
163
163
  };
164
164
  type ServerConfig = {
165
165
  socket: Socket;
166
- store?: Store;
166
+ store?: RootStore;
167
167
  };
168
168
  //#endregion
169
169
  export { ActionReceiver, ChildSocket, ContinuitySyncTransactionUpdate, CreateRoomIO, CustomSocket, EventBuffer, Events, ExposeRealtimeContinuity, FamilyProvider, JoinRoomIO, LeaveRoomIO, MutableFamilyProvider, MutableProvider, ParentSocket, RoomArguments, RoomKey, ServerConfig, Socket, SocketKey, SocketSystemHierarchy, StateProvider, StateReceiver, StringifiedEvent, SubjectSocket, UserKey, createRoomTX, destroyRoomTX, joinRoomTX, leaveRoomTX, prepareToExposeRealtimeContinuity, realtimeActionReceiver, realtimeAtomFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, redactTransactionUpdateContent, redactorAtoms, roomArgumentsAtoms, roomSelectors, socketAtoms, socketIndex, userIndex, userUnacknowledgedQueues, usersOfSockets };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketIndex: MutableAtomToken<SetRTX<SocketKey>>","userIndex: MutableAtomToken<SetRTX<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","createRoomTX: AtomIO.TransactionToken<\n\t(\n\t\troomKey: RoomKey,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n>","joinRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta\n>","leaveRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string) => void\n>","destroyRoomTX: AtomIO.TransactionToken<(roomKey: RoomKey) => void>","roomArgumentsAtoms: RegularAtomFamilyToken<RoomArguments, string>","roomSelectors: ReadonlyPureSelectorFamilyToken<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n>","redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n>","userUnacknowledgedQueues: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n>"],"sources":["../../src/realtime-server/continuity/prepare-to-sync-realtime-continuity.ts","../../src/realtime-server/ipc-sockets/custom-socket.ts","../../src/realtime-server/ipc-sockets/child-socket.ts","../../src/realtime-server/ipc-sockets/parent-socket.ts","../../src/realtime-server/realtime-action-receiver.ts","../../src/realtime-server/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-server-stores/server-room-external-actions.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-server-stores/server-sync-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts","../../src/realtime-server/index.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":["socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketIndex: MutableAtomToken<SetRTX<SocketKey>>","userIndex: MutableAtomToken<SetRTX<UserKey>>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","createRoomTX: AtomIO.TransactionToken<\n\t(\n\t\troomKey: RoomKey,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n>","joinRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta\n>","leaveRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string) => void\n>","destroyRoomTX: AtomIO.TransactionToken<(roomKey: RoomKey) => void>","roomArgumentsAtoms: RegularAtomFamilyToken<RoomArguments, string>","roomSelectors: ReadonlyPureSelectorFamilyToken<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n>","redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionSubEvent[]) => TransactionSubEvent[]\n\t},\n\tUserKey\n>","userUnacknowledgedQueues: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n>"],"sources":["../../src/realtime-server/continuity/prepare-to-sync-realtime-continuity.ts","../../src/realtime-server/ipc-sockets/custom-socket.ts","../../src/realtime-server/ipc-sockets/child-socket.ts","../../src/realtime-server/ipc-sockets/parent-socket.ts","../../src/realtime-server/realtime-action-receiver.ts","../../src/realtime-server/realtime-family-provider.ts","../../src/realtime-server/realtime-mutable-family-provider.ts","../../src/realtime-server/realtime-mutable-provider.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/realtime-server-stores/server-room-external-actions.ts","../../src/realtime-server/realtime-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-server-stores/server-sync-store.ts","../../src/realtime-server/realtime-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts","../../src/realtime-server/index.ts"],"sourcesContent":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.40.0",
3
+ "version": "0.40.2",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -70,7 +70,7 @@
70
70
  "@types/estree": "1.0.8",
71
71
  "@types/http-proxy": "1.17.16",
72
72
  "@types/npmlog": "7.0.0",
73
- "@types/react": "19.1.11",
73
+ "@types/react": "19.1.12",
74
74
  "@types/tmp": "0.2.6",
75
75
  "@typescript-eslint/parser": "8.41.0",
76
76
  "@typescript-eslint/rule-tester": "8.41.0",
@@ -22,7 +22,7 @@ export function struct<
22
22
  K & string
23
23
  >}State`]: AtomIO.RegularAtomToken<Struct[K]>
24
24
  },
25
- AtomIO.ReadonlyPureSelectorToken<Struct>,
25
+ AtomIO.ReadonlyPureSelectorToken<Struct, any, never>,
26
26
  ] {
27
27
  const atoms: {
28
28
  [K in keyof Struct as `${Key}${Capitalize<
@@ -40,7 +40,7 @@ export function struct<
40
40
  )
41
41
  return acc
42
42
  }, {} as any)
43
- const structState = createStandaloneSelector(store, {
43
+ const structState = createStandaloneSelector<Struct, never>(store, {
44
44
  key: options.key,
45
45
  get: ({ get }) => {
46
46
  return Object.keys(options.default).reduce((acc, key) => {
@@ -4,8 +4,10 @@ import type {
4
4
  RegularAtomToken,
5
5
  UpdateHandler,
6
6
  } from "atom.io"
7
+ import type { Canonical } from "atom.io/json"
7
8
 
8
- import { type RegularAtom, resetInStore, setIntoStore } from ".."
9
+ import type { RegularAtom, RootStore } from ".."
10
+ import { resetInStore, setIntoStore } from ".."
9
11
  import { newest } from "../lineage"
10
12
  import type { Store } from "../store"
11
13
  import { deposit } from "../store"
@@ -13,12 +15,12 @@ import { Subject } from "../subject"
13
15
  import { subscribeToState } from "../subscribe"
14
16
  import type { internalRole } from "./has-role"
15
17
 
16
- export function createRegularAtom<T>(
18
+ export function createRegularAtom<T, K extends Canonical, E>(
17
19
  store: Store,
18
- options: RegularAtomOptions<T>,
19
- family: FamilyMetadata | undefined,
20
+ options: RegularAtomOptions<T, E>,
21
+ family: FamilyMetadata<K> | undefined,
20
22
  internalRoles?: internalRole[],
21
- ): RegularAtomToken<T> {
23
+ ): RegularAtomToken<T, K, E> {
22
24
  const type = `atom`
23
25
  const { key } = options
24
26
  store.logger.info(`🔨`, type, key, `is being created`)
@@ -32,13 +34,13 @@ export function createRegularAtom<T>(
32
34
  key,
33
35
  `Tried to create atom, but it already exists in the store.`,
34
36
  )
35
- return deposit(existing)
37
+ return deposit(existing) as RegularAtomToken<T, K, E>
36
38
  }
37
39
  const subject = new Subject<{ newValue: T; oldValue: T }>()
38
- const newAtom: RegularAtom<T> = {
40
+ const newAtom: RegularAtom<T, E> = {
39
41
  ...options,
40
42
  type,
41
- install: (s: Store) => {
43
+ install: (s: RootStore) => {
42
44
  s.logger.info(`🛠️`, type, key, `installing in store "${s.config.name}"`)
43
45
  return createRegularAtom(s, options, family)
44
46
  },
@@ -51,7 +53,7 @@ export function createRegularAtom<T>(
51
53
  newAtom.internalRoles = internalRoles
52
54
  }
53
55
  target.atoms.set(key, newAtom)
54
- const token = deposit(newAtom)
56
+ const token = deposit(newAtom) as RegularAtomToken<T, K, E>
55
57
  if (options.effects) {
56
58
  let effectIndex = 0
57
59
  const cleanupFunctions: (() => void)[] = []
@@ -1,10 +1,13 @@
1
1
  import type { AtomDisposalEvent, AtomToken, StateLifecycleEvent } from "atom.io"
2
2
 
3
3
  import type { Store, Subject } from ".."
4
- import { getUpdateToken, isChildStore, newest, withdraw } from ".."
4
+ import { getUpdateToken, hasRole, isChildStore, newest, withdraw } from ".."
5
5
  import { getFamilyOfToken } from "../families/get-family-of-token"
6
6
 
7
- export function disposeAtom(store: Store, atomToken: AtomToken<any>): void {
7
+ export function disposeAtom(
8
+ store: Store,
9
+ atomToken: AtomToken<any, any, any>,
10
+ ): void {
8
11
  const target = newest(store)
9
12
  const { key, family } = atomToken
10
13
  const atom = withdraw(target, atomToken)
@@ -16,10 +19,10 @@ export function disposeAtom(store: Store, atomToken: AtomToken<any>): void {
16
19
  const familyToken = getFamilyOfToken(store, atomToken)
17
20
  const atomFamily = withdraw(store, familyToken)
18
21
  const subject = atomFamily.subject as Subject<
19
- StateLifecycleEvent<AtomToken<any>>
22
+ StateLifecycleEvent<AtomToken<any, any, any>>
20
23
  >
21
24
 
22
- const disposal: AtomDisposalEvent<AtomToken<any>> = {
25
+ const disposalEvent: AtomDisposalEvent<AtomToken<any, any, any>> = {
23
26
  type: `state_disposal`,
24
27
  subType: `atom`,
25
28
  token: atomToken,
@@ -27,7 +30,7 @@ export function disposeAtom(store: Store, atomToken: AtomToken<any>): void {
27
30
  timestamp: Date.now(),
28
31
  }
29
32
 
30
- subject.next(disposal)
33
+ subject.next(disposalEvent)
31
34
 
32
35
  const isChild = isChildStore(target)
33
36
 
@@ -50,9 +53,9 @@ export function disposeAtom(store: Store, atomToken: AtomToken<any>): void {
50
53
  const updateAlreadyCaptured =
51
54
  wasMoleculeDisposal &&
52
55
  mostRecentUpdate.values.some(([k]) => k === atom.family?.key)
53
-
54
- if (!updateAlreadyCaptured) {
55
- target.transactionMeta.update.subEvents.push(disposal)
56
+ const isTracker = hasRole(atom, `tracker:signal`)
57
+ if (!updateAlreadyCaptured && !isTracker) {
58
+ target.transactionMeta.update.subEvents.push(disposalEvent)
56
59
  }
57
60
  } else {
58
61
  store.on.atomDisposal.next(atomToken)
@@ -3,7 +3,7 @@ import type { Atom } from ".."
3
3
  export const INTERNAL_ROLES = [`tracker:signal`] as const
4
4
  export type internalRole = (typeof INTERNAL_ROLES)[number]
5
5
 
6
- export function hasRole(atom: Atom<any>, role: internalRole): boolean {
6
+ export function hasRole(atom: Atom<any, any>, role: internalRole): boolean {
7
7
  if (`internalRoles` in atom === false) {
8
8
  return false
9
9
  }
@@ -7,21 +7,21 @@ import {
7
7
  } from "./set-state/evict-downstream"
8
8
  import type { Store } from "./store"
9
9
 
10
- export function writeToCache<T>(
10
+ export function writeToCache<T, E>(
11
11
  target: Store,
12
- state: ReadableState<T>,
13
- value: T,
14
- ): T
15
- export function writeToCache<T extends Promise<any>>(
12
+ state: ReadableState<T, E>,
13
+ value: E | T,
14
+ ): E | T
15
+ export function writeToCache<T extends Promise<any>, E>(
16
16
  target: Store,
17
- state: ReadableState<T>,
17
+ state: ReadableState<T, E>,
18
18
  value: T,
19
- ): Future<Awaited<T>>
20
- export function writeToCache<T>(
19
+ ): Future<Awaited<E | T>>
20
+ export function writeToCache<T, E>(
21
21
  target: Store,
22
- state: ReadableState<T>,
23
- value: T,
24
- ): Future<T> | T {
22
+ state: ReadableState<T, E>,
23
+ value: E | T,
24
+ ): E | Future<E | T> | T {
25
25
  const { key, subject, type } = state
26
26
  const currentValue = target.valueMap.get(key)
27
27
  if (currentValue instanceof Future && !currentValue.done) {
@@ -74,13 +74,13 @@ export function writeToCache<T>(
74
74
  * @param mut - whether the value is intended to be mutable
75
75
  * @returns the state's current value
76
76
  */
77
- export function readFromCache<T>(
77
+ export function readFromCache<T, E>(
78
78
  target: Store,
79
- state: ReadableState<T>,
79
+ state: ReadableState<T, E>,
80
80
  mut: `mut` | undefined,
81
- ): T {
81
+ ): E | T {
82
82
  target.logger.info(`📖`, state.type, state.key, `reading cached value`)
83
- let value = target.valueMap.get(state.key) as T
83
+ let value = target.valueMap.get(state.key) as E | T
84
84
 
85
85
  const mayNeedToBeCopied =
86
86
  mut === `mut` && state.type === `mutable_atom` && isChildStore(target)
@@ -37,7 +37,7 @@ export function ingestCreationEvent(
37
37
 
38
38
  export function ingestDisposalEvent(
39
39
  store: Store,
40
- event: StateDisposalEvent<ReadableToken<any>>,
40
+ event: StateDisposalEvent<ReadableToken<any, any, any>>,
41
41
  applying: `newValue` | `oldValue`,
42
42
  ): void {
43
43
  switch (applying) {
@@ -9,17 +9,16 @@ import { PRETTY_TOKEN_TYPES } from "atom.io"
9
9
  import type { Canonical } from "atom.io/json"
10
10
  import { stringifyJson } from "atom.io/json"
11
11
 
12
- import type { ReadonlyHeldSelectorFamily } from ".."
12
+ import type { ReadonlyHeldSelectorFamily, RootStore } from ".."
13
13
  import { newest } from "../lineage"
14
14
  import { createReadonlyHeldSelector } from "../selector"
15
- import type { Store } from "../store"
16
15
  import { Subject } from "../subject"
17
16
 
18
17
  export function createReadonlyHeldSelectorFamily<
19
18
  T extends object,
20
19
  K extends Canonical,
21
20
  >(
22
- store: Store,
21
+ store: RootStore,
23
22
  options: ReadonlyHeldSelectorFamilyOptions<T, K>,
24
23
  internalRoles?: string[],
25
24
  ): ReadonlyHeldSelectorFamilyToken<T, K> {
@@ -68,7 +67,7 @@ export function createReadonlyHeldSelectorFamily<
68
67
  const readonlySelectorFamily = Object.assign(familyFunction, familyToken, {
69
68
  internalRoles,
70
69
  subject,
71
- install: (s: Store) => createReadonlyHeldSelectorFamily(s, options),
70
+ install: (s: RootStore) => createReadonlyHeldSelectorFamily(s, options),
72
71
  default: options.const,
73
72
  }) satisfies ReadonlyHeldSelectorFamily<T, K>
74
73
 
@@ -4,6 +4,7 @@ import type {
4
4
  getState,
5
5
  ReadonlyPureSelectorFamilyOptions,
6
6
  ReadonlyPureSelectorFamilyToken,
7
+ ReadonlyPureSelectorOptions,
7
8
  ReadonlyPureSelectorToken,
8
9
  StateLifecycleEvent,
9
10
  } from "atom.io"
@@ -11,29 +12,24 @@ import { PRETTY_TOKEN_TYPES } from "atom.io"
11
12
  import type { Canonical } from "atom.io/json"
12
13
  import { stringifyJson } from "atom.io/json"
13
14
 
14
- import {
15
- findInStore,
16
- getFromStore,
17
- getJsonToken,
18
- type ReadonlyPureSelectorFamily,
19
- } from ".."
15
+ import type { ReadonlyPureSelectorFamily, RootStore } from ".."
16
+ import { findInStore, getFromStore, getJsonToken } from ".."
20
17
  import { newest } from "../lineage"
21
18
  import { createReadonlyPureSelector } from "../selector"
22
- import type { Store } from "../store"
23
19
  import { Subject } from "../subject"
24
20
 
25
- export function createReadonlyPureSelectorFamily<T, K extends Canonical>(
26
- store: Store,
27
- options: ReadonlyPureSelectorFamilyOptions<T, K>,
21
+ export function createReadonlyPureSelectorFamily<T, K extends Canonical, E>(
22
+ store: RootStore,
23
+ options: ReadonlyPureSelectorFamilyOptions<T, K, E>,
28
24
  internalRoles?: string[],
29
- ): ReadonlyPureSelectorFamilyToken<T, K> {
25
+ ): ReadonlyPureSelectorFamilyToken<T, K, E> {
30
26
  const familyKey = options.key
31
27
  const type = `readonly_pure_selector_family`
32
28
 
33
29
  const familyToken = {
34
30
  key: familyKey,
35
31
  type,
36
- } as const satisfies ReadonlyPureSelectorFamilyToken<T, K>
32
+ } as const satisfies ReadonlyPureSelectorFamilyToken<T, K, E>
37
33
 
38
34
  const existing = store.families.get(familyKey)
39
35
  if (existing) {
@@ -46,32 +42,37 @@ export function createReadonlyPureSelectorFamily<T, K extends Canonical>(
46
42
  }
47
43
 
48
44
  const subject = new Subject<
49
- StateLifecycleEvent<ReadonlyPureSelectorToken<T>>
45
+ StateLifecycleEvent<ReadonlyPureSelectorToken<T, K, E>>
50
46
  >()
51
47
 
52
- const familyFunction = (key: K): ReadonlyPureSelectorToken<T> => {
48
+ const familyFunction = <Key extends K>(
49
+ key: Key,
50
+ ): ReadonlyPureSelectorToken<T, Key, E> => {
53
51
  const subKey = stringifyJson(key)
54
- const family: FamilyMetadata = { key: familyKey, subKey }
52
+ const family: FamilyMetadata<Key> = { key: familyKey, subKey }
55
53
  const fullKey = `${familyKey}(${subKey})`
56
54
  const target = newest(store)
55
+ const individualOptions: ReadonlyPureSelectorOptions<T, E> = {
56
+ key: fullKey,
57
+ get: options.get(key),
58
+ }
59
+ if (options.catch) {
60
+ individualOptions.catch = options.catch
61
+ }
57
62
 
58
- const token = createReadonlyPureSelector(
63
+ const token = createReadonlyPureSelector<T, Key, E>(
59
64
  target,
60
- {
61
- key: fullKey,
62
- get: options.get(key),
63
- },
65
+ individualOptions,
64
66
  family,
65
67
  )
66
68
 
67
- // subject.next({ type: `state_creation`, token, timestamp: Date.now() })
68
69
  return token
69
70
  }
70
71
 
71
72
  const readonlySelectorFamily = Object.assign(familyFunction, familyToken, {
72
73
  internalRoles,
73
74
  subject,
74
- install: (s: Store) => createReadonlyPureSelectorFamily(s, options),
75
+ install: (s: RootStore) => createReadonlyPureSelectorFamily(s, options),
75
76
  default: (key: K) => {
76
77
  const getFn = options.get(key)
77
78
  return getFn({
@@ -82,7 +83,8 @@ export function createReadonlyPureSelectorFamily<T, K extends Canonical>(
82
83
  json: (token) => getJsonToken(store, token),
83
84
  })
84
85
  },
85
- }) satisfies ReadonlyPureSelectorFamily<T, K>
86
+ ...(options.catch ? { catch: options.catch } : {}),
87
+ }) satisfies ReadonlyPureSelectorFamily<T, K, E>
86
88
 
87
89
  store.families.set(familyKey, readonlySelectorFamily)
88
90
  return familyToken
@@ -10,22 +10,21 @@ import { PRETTY_TOKEN_TYPES } from "atom.io"
10
10
  import type { Canonical } from "atom.io/json"
11
11
  import { stringifyJson } from "atom.io/json"
12
12
 
13
- import type { RegularAtomFamily } from ".."
13
+ import type { RegularAtomFamily, RootStore } from ".."
14
14
  import { createRegularAtom } from "../atom"
15
15
  import { isFn } from "../is-fn"
16
16
  import { newest } from "../lineage"
17
- import type { Store } from "../store"
18
17
  import { Subject } from "../subject"
19
18
 
20
- export function createRegularAtomFamily<T, K extends Canonical>(
21
- store: Store,
22
- options: RegularAtomFamilyOptions<T, K>,
19
+ export function createRegularAtomFamily<T, K extends Canonical, E>(
20
+ store: RootStore,
21
+ options: RegularAtomFamilyOptions<T, K, E>,
23
22
  internalRoles?: string[],
24
- ): RegularAtomFamilyToken<T, K> {
25
- const familyToken = {
23
+ ): RegularAtomFamilyToken<T, K, E> {
24
+ const familyToken: RegularAtomFamilyToken<T, K, E> = {
26
25
  key: options.key,
27
26
  type: `atom_family`,
28
- } as const satisfies RegularAtomFamilyToken<T, K>
27
+ }
29
28
 
30
29
  const existing = store.families.get(options.key)
31
30
  if (existing) {
@@ -37,22 +36,27 @@ export function createRegularAtomFamily<T, K extends Canonical>(
37
36
  )
38
37
  }
39
38
 
40
- const subject = new Subject<StateLifecycleEvent<RegularAtomToken<T>>>()
39
+ const subject = new Subject<StateLifecycleEvent<RegularAtomToken<T, K, E>>>()
41
40
 
42
- const familyFunction = (key: K): RegularAtomToken<any> => {
41
+ const familyFunction = <Key extends K>(
42
+ key: Key,
43
+ ): RegularAtomToken<T, Key, E> => {
43
44
  const subKey = stringifyJson(key)
44
- const family: FamilyMetadata = { key: options.key, subKey }
45
+ const family: FamilyMetadata<Key> = { key: options.key, subKey }
45
46
  const fullKey = `${options.key}(${subKey})`
46
47
  const target = newest(store)
47
48
 
48
49
  const def = options.default
49
- const individualOptions: RegularAtomOptions<T> = {
50
+ const individualOptions: RegularAtomOptions<T, E> = {
50
51
  key: fullKey,
51
52
  default: isFn(def) ? () => def(key) : def,
52
53
  }
53
54
  if (options.effects) {
54
55
  individualOptions.effects = options.effects(key)
55
56
  }
57
+ if (options.catch) {
58
+ individualOptions.catch = options.catch
59
+ }
56
60
 
57
61
  const token = createRegularAtom(target, individualOptions, family)
58
62
 
@@ -60,12 +64,14 @@ export function createRegularAtomFamily<T, K extends Canonical>(
60
64
  return token
61
65
  }
62
66
 
63
- const atomFamily = Object.assign(familyFunction, familyToken, {
67
+ const atomFamily: RegularAtomFamily<T, K, E> = Object.assign(familyFunction, {
68
+ ...familyToken,
64
69
  default: options.default,
65
70
  subject,
66
- install: (s: Store) => createRegularAtomFamily(s, options),
71
+ install: (s: RootStore) => createRegularAtomFamily(s, options),
67
72
  internalRoles,
68
- }) satisfies RegularAtomFamily<T, K>
73
+ ...(options.catch ? { catch: options.catch } : {}),
74
+ })
69
75
 
70
76
  store.families.set(options.key, atomFamily)
71
77
  if (isFn(options.default) === false) {