atom.io 0.32.4 → 0.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-Cl8Af3a2.js +11 -0
- package/dist/data/index.d.ts +28 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +66 -0
- package/dist/data/index.js.map +1 -0
- package/dist/devtools-CAg2k57t.js +0 -0
- package/dist/devtools-Jyn42mZm.css +311 -0
- package/dist/devtools-Jyn42mZm.css.map +1 -0
- package/dist/eslint-plugin/index.d.ts +36 -0
- package/dist/eslint-plugin/index.d.ts.map +1 -0
- package/dist/eslint-plugin/index.js +196 -0
- package/dist/eslint-plugin/index.js.map +1 -0
- package/{internal/dist → dist/internal}/index.d.ts +495 -378
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +3213 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/introspection/index.d.ts +153 -0
- package/dist/introspection/index.d.ts.map +1 -0
- package/dist/introspection/index.js +520 -0
- package/dist/introspection/index.js.map +1 -0
- package/{json/dist → dist/json}/index.d.ts +38 -32
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +75 -0
- package/dist/json/index.js.map +1 -0
- package/dist/main/index.d.ts +691 -0
- package/dist/main/index.d.ts.map +1 -0
- package/dist/main/index.js +237 -0
- package/dist/main/index.js.map +1 -0
- package/{react/dist → dist/react}/index.d.ts +22 -11
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +91 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react-devtools/index.d.ts +194 -0
- package/dist/react-devtools/index.d.ts.map +1 -0
- package/dist/react-devtools/index.js +1274 -0
- package/dist/react-devtools/index.js.map +1 -0
- package/dist/realtime/index.d.ts +55 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +113 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime-client/index.d.ts +81 -0
- package/dist/realtime-client/index.d.ts.map +1 -0
- package/dist/realtime-client/index.js +376 -0
- package/dist/realtime-client/index.js.map +1 -0
- package/dist/realtime-react/index.d.ts +68 -0
- package/dist/realtime-react/index.d.ts.map +1 -0
- package/dist/realtime-react/index.js +182 -0
- package/dist/realtime-react/index.js.map +1 -0
- package/dist/realtime-server/index.d.ts +190 -0
- package/dist/realtime-server/index.d.ts.map +1 -0
- package/dist/realtime-server/index.js +795 -0
- package/dist/realtime-server/index.js.map +1 -0
- package/dist/realtime-testing/index.d.ts +60 -0
- package/dist/realtime-testing/index.d.ts.map +1 -0
- package/dist/realtime-testing/index.js +181 -0
- package/dist/realtime-testing/index.js.map +1 -0
- package/dist/transceivers/set-rtx/index.d.ts +44 -0
- package/dist/transceivers/set-rtx/index.d.ts.map +1 -0
- package/dist/transceivers/set-rtx/index.js +204 -0
- package/dist/transceivers/set-rtx/index.js.map +1 -0
- package/dist/web/index.d.ts +15 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +16 -0
- package/dist/web/index.js.map +1 -0
- package/package.json +66 -117
- package/{eslint-plugin/src → src/eslint-plugin}/index.ts +3 -1
- package/{eslint-plugin/src → src/eslint-plugin}/rules/explicit-state-types.ts +6 -1
- package/{eslint-plugin/src → src/eslint-plugin}/rules/synchronous-selector-dependencies.ts +14 -1
- package/{internal/src → src/internal}/families/index.ts +2 -0
- package/{internal/src → src/internal}/index.ts +1 -0
- package/{internal/src → src/internal}/junction.ts +3 -2
- package/{internal/src → src/internal}/lazy-map.ts +1 -1
- package/{internal/src → src/internal}/mutable/tracker-family.ts +2 -5
- package/{internal/src → src/internal}/mutable/tracker.ts +15 -9
- package/{internal/src → src/internal}/store/store.ts +60 -47
- package/{internal/src → src/internal}/subject.ts +1 -1
- package/{introspection/src → src/introspection}/auditor.ts +1 -1
- package/{introspection/src → src/introspection}/differ.ts +12 -1
- package/{introspection/src → src/introspection}/refinery.ts +18 -3
- package/{json/src → src/json}/entries.ts +1 -1
- package/{json/src → src/json}/select-json-family.ts +1 -1
- package/src/{realm.ts → main/realm.ts} +1 -1
- package/src/{silo.ts → main/silo.ts} +1 -1
- package/src/{transaction.ts → main/transaction.ts} +1 -1
- package/{react/src → src/react}/store-context.tsx +3 -1
- package/{react-devtools/src → src/react-devtools}/AtomIODevtools.tsx +1 -1
- package/{react-devtools/src → src/react-devtools}/Button.tsx +3 -1
- package/{react-devtools/src → src/react-devtools}/Updates.tsx +5 -1
- package/src/react-devtools/devtools.css +308 -0
- package/{react-devtools/src → src/react-devtools}/json-editor/index.ts +5 -2
- package/{react-devtools/src → src/react-devtools}/store.ts +3 -2
- package/{realtime/src → src/realtime}/shared-room-store.ts +28 -5
- package/src/realtime-client/realtime-client-stores/client-main-store.ts +23 -0
- package/src/realtime-client/realtime-client-stores/client-sync-store.ts +15 -0
- package/{realtime-react/src → src/realtime-react}/index.ts +1 -0
- package/{realtime-react/src → src/realtime-react}/on-mount.ts +1 -1
- package/{realtime-react/src → src/realtime-react}/realtime-context.tsx +5 -4
- package/{realtime-react/src → src/realtime-react}/use-single-effect.ts +1 -1
- package/{realtime-server/src → src/realtime-server}/realtime-server-stores/server-room-external-actions.ts +20 -19
- package/{realtime-server/src → src/realtime-server}/realtime-server-stores/server-room-external-store.ts +12 -7
- package/{realtime-server/src → src/realtime-server}/realtime-server-stores/server-sync-store.ts +13 -4
- package/{realtime-server/src → src/realtime-server}/realtime-server-stores/server-user-store.ts +26 -8
- package/{transceivers/set-rtx/src → src/transceivers/set-rtx}/set-rtx.ts +2 -2
- package/data/dist/index.d.ts +0 -31
- package/data/dist/index.js +0 -69
- package/data/package.json +0 -13
- package/dist/chunk-4LWKCEW3.js +0 -14
- package/dist/chunk-7SJVR7FZ.js +0 -4499
- package/dist/chunk-IR77IXS7.js +0 -526
- package/dist/chunk-PG57JXN4.js +0 -1035
- package/dist/chunk-PXB4YZDI.js +0 -153
- package/dist/chunk-Q6OOJWM4.js +0 -634
- package/dist/chunk-TJPLOX7Z.js +0 -81
- package/dist/chunk-U4K63VLA.js +0 -109
- package/dist/chunk-XWL6SNVU.js +0 -7
- package/dist/index.d.ts +0 -701
- package/dist/index.js +0 -2
- package/eslint-plugin/dist/index.d.ts +0 -51
- package/eslint-plugin/dist/index.js +0 -238
- package/eslint-plugin/package.json +0 -13
- package/internal/dist/index.js +0 -2
- package/internal/package.json +0 -13
- package/introspection/dist/index.d.ts +0 -149
- package/introspection/dist/index.js +0 -3
- package/introspection/package.json +0 -13
- package/json/dist/index.js +0 -2
- package/json/package.json +0 -13
- package/react/dist/index.js +0 -3
- package/react/package.json +0 -13
- package/react-devtools/dist/index.css +0 -309
- package/react-devtools/dist/index.d.ts +0 -169
- package/react-devtools/dist/index.js +0 -1481
- package/react-devtools/package.json +0 -13
- package/react-devtools/src/devtools.scss +0 -309
- package/realtime/dist/index.d.ts +0 -51
- package/realtime/dist/index.js +0 -3
- package/realtime/package.json +0 -13
- package/realtime-client/dist/index.d.ts +0 -41
- package/realtime-client/dist/index.js +0 -4
- package/realtime-client/package.json +0 -13
- package/realtime-client/src/realtime-client-stores/client-main-store.ts +0 -20
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +0 -15
- package/realtime-react/dist/index.d.ts +0 -39
- package/realtime-react/dist/index.js +0 -6
- package/realtime-react/package.json +0 -13
- package/realtime-server/dist/index.d.ts +0 -139
- package/realtime-server/dist/index.js +0 -4
- package/realtime-server/package.json +0 -13
- package/realtime-testing/dist/index.d.ts +0 -59
- package/realtime-testing/dist/index.js +0 -198
- package/realtime-testing/package.json +0 -13
- package/transceivers/set-rtx/dist/index.d.ts +0 -41
- package/transceivers/set-rtx/dist/index.js +0 -2
- package/transceivers/set-rtx/package.json +0 -13
- package/web/dist/index.d.ts +0 -9
- package/web/dist/index.js +0 -2
- package/web/package.json +0 -13
- /package/{data/src → src/data}/dict.ts +0 -0
- /package/{data/src → src/data}/index.ts +0 -0
- /package/{data/src → src/data}/struct-family.ts +0 -0
- /package/{data/src → src/data}/struct.ts +0 -0
- /package/{eslint-plugin/src → src/eslint-plugin}/rules/index.ts +0 -0
- /package/{eslint-plugin/src → src/eslint-plugin}/walk.ts +0 -0
- /package/{internal/src → src/internal}/arbitrary.ts +0 -0
- /package/{internal/src → src/internal}/atom/create-regular-atom.ts +0 -0
- /package/{internal/src → src/internal}/atom/create-standalone-atom.ts +0 -0
- /package/{internal/src → src/internal}/atom/dispose-atom.ts +0 -0
- /package/{internal/src → src/internal}/atom/index.ts +0 -0
- /package/{internal/src → src/internal}/atom/is-default.ts +0 -0
- /package/{internal/src → src/internal}/caching.ts +0 -0
- /package/{internal/src → src/internal}/capitalize.ts +0 -0
- /package/{internal/src → src/internal}/families/create-atom-family.ts +0 -0
- /package/{internal/src → src/internal}/families/create-readonly-selector-family.ts +0 -0
- /package/{internal/src → src/internal}/families/create-regular-atom-family.ts +0 -0
- /package/{internal/src → src/internal}/families/create-selector-family.ts +0 -0
- /package/{internal/src → src/internal}/families/create-writable-selector-family.ts +0 -0
- /package/{internal/src → src/internal}/families/dispose-from-store.ts +0 -0
- /package/{internal/src → src/internal}/families/find-in-store.ts +0 -0
- /package/{internal/src → src/internal}/families/get-family-of-token.ts +0 -0
- /package/{internal/src → src/internal}/families/init-family-member.ts +0 -0
- /package/{internal/src → src/internal}/families/seek-in-store.ts +0 -0
- /package/{internal/src → src/internal}/future.ts +0 -0
- /package/{internal/src → src/internal}/get-environment-data.ts +0 -0
- /package/{internal/src → src/internal}/get-state/get-from-store.ts +0 -0
- /package/{internal/src → src/internal}/get-state/index.ts +0 -0
- /package/{internal/src → src/internal}/get-state/read-or-compute-value.ts +0 -0
- /package/{internal/src → src/internal}/get-trace.ts +0 -0
- /package/{internal/src → src/internal}/ingest-updates/index.ts +0 -0
- /package/{internal/src → src/internal}/ingest-updates/ingest-atom-update.ts +0 -0
- /package/{internal/src → src/internal}/ingest-updates/ingest-creation-disposal.ts +0 -0
- /package/{internal/src → src/internal}/ingest-updates/ingest-selector-update.ts +0 -0
- /package/{internal/src → src/internal}/ingest-updates/ingest-transaction-update.ts +0 -0
- /package/{internal/src → src/internal}/install-into-store.ts +0 -0
- /package/{internal/src → src/internal}/join/edit-relations-in-store.ts +0 -0
- /package/{internal/src → src/internal}/join/find-relations-in-store.ts +0 -0
- /package/{internal/src → src/internal}/join/get-internal-relations-from-store.ts +0 -0
- /package/{internal/src → src/internal}/join/get-join.ts +0 -0
- /package/{internal/src → src/internal}/join/index.ts +0 -0
- /package/{internal/src → src/internal}/join/join-internal.ts +0 -0
- /package/{internal/src → src/internal}/keys.ts +0 -0
- /package/{internal/src → src/internal}/lineage.ts +0 -0
- /package/{internal/src → src/internal}/molecule.ts +0 -0
- /package/{internal/src → src/internal}/mutable/create-mutable-atom-family.ts +0 -0
- /package/{internal/src → src/internal}/mutable/create-mutable-atom.ts +0 -0
- /package/{internal/src → src/internal}/mutable/get-json-family.ts +0 -0
- /package/{internal/src → src/internal}/mutable/get-json-token.ts +0 -0
- /package/{internal/src → src/internal}/mutable/get-update-family.ts +0 -0
- /package/{internal/src → src/internal}/mutable/get-update-token.ts +0 -0
- /package/{internal/src → src/internal}/mutable/index.ts +0 -0
- /package/{internal/src → src/internal}/mutable/transceiver.ts +0 -0
- /package/{internal/src → src/internal}/not-found-error.ts +0 -0
- /package/{internal/src → src/internal}/operation.ts +0 -0
- /package/{internal/src → src/internal}/pretty-print.ts +0 -0
- /package/{internal/src → src/internal}/reserved-keys.ts +0 -0
- /package/{internal/src → src/internal}/selector/create-readonly-selector.ts +0 -0
- /package/{internal/src → src/internal}/selector/create-standalone-selector.ts +0 -0
- /package/{internal/src → src/internal}/selector/create-writable-selector.ts +0 -0
- /package/{internal/src → src/internal}/selector/dispose-selector.ts +0 -0
- /package/{internal/src → src/internal}/selector/get-selector-dependency-keys.ts +0 -0
- /package/{internal/src → src/internal}/selector/index.ts +0 -0
- /package/{internal/src → src/internal}/selector/register-selector.ts +0 -0
- /package/{internal/src → src/internal}/selector/trace-selector-atoms.ts +0 -0
- /package/{internal/src → src/internal}/selector/update-selector-atoms.ts +0 -0
- /package/{internal/src → src/internal}/set-state/become.ts +0 -0
- /package/{internal/src → src/internal}/set-state/copy-mutable-if-needed.ts +0 -0
- /package/{internal/src → src/internal}/set-state/emit-update.ts +0 -0
- /package/{internal/src → src/internal}/set-state/evict-downstream.ts +0 -0
- /package/{internal/src → src/internal}/set-state/index.ts +0 -0
- /package/{internal/src → src/internal}/set-state/set-atom-or-selector.ts +0 -0
- /package/{internal/src → src/internal}/set-state/set-atom.ts +0 -0
- /package/{internal/src → src/internal}/set-state/set-into-store.ts +0 -0
- /package/{internal/src → src/internal}/store/circular-buffer.ts +0 -0
- /package/{internal/src → src/internal}/store/counterfeit.ts +0 -0
- /package/{internal/src → src/internal}/store/deposit.ts +0 -0
- /package/{internal/src → src/internal}/store/index.ts +0 -0
- /package/{internal/src → src/internal}/store/withdraw.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/index.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/recall-state.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/subscribe-in-store.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/subscribe-to-root-atoms.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/subscribe-to-state.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/subscribe-to-timeline.ts +0 -0
- /package/{internal/src → src/internal}/subscribe/subscribe-to-transaction.ts +0 -0
- /package/{internal/src → src/internal}/timeline/create-timeline.ts +0 -0
- /package/{internal/src → src/internal}/timeline/index.ts +0 -0
- /package/{internal/src → src/internal}/timeline/time-travel.ts +0 -0
- /package/{internal/src → src/internal}/transaction/abort-transaction.ts +0 -0
- /package/{internal/src → src/internal}/transaction/act-upon-store.ts +0 -0
- /package/{internal/src → src/internal}/transaction/apply-transaction.ts +0 -0
- /package/{internal/src → src/internal}/transaction/assign-transaction-to-continuity.ts +0 -0
- /package/{internal/src → src/internal}/transaction/build-transaction.ts +0 -0
- /package/{internal/src → src/internal}/transaction/create-transaction.ts +0 -0
- /package/{internal/src → src/internal}/transaction/get-epoch-number.ts +0 -0
- /package/{internal/src → src/internal}/transaction/index.ts +0 -0
- /package/{internal/src → src/internal}/transaction/is-root-store.ts +0 -0
- /package/{internal/src → src/internal}/transaction/set-epoch-number.ts +0 -0
- /package/{internal/src → src/internal}/utility-types.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-atom-index.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-introspection-states.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-selector-index.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-timeline-family.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-timeline-index.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-transaction-index.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-transaction-logs.ts +0 -0
- /package/{introspection/src → src/introspection}/attach-type-selectors.ts +0 -0
- /package/{introspection/src → src/introspection}/index.ts +0 -0
- /package/{introspection/src → src/introspection}/sprawl.ts +0 -0
- /package/{json/src → src/json}/index.ts +0 -0
- /package/{json/src → src/json}/select-json.ts +0 -0
- /package/src/{atom.ts → main/atom.ts} +0 -0
- /package/src/{dispose-state.ts → main/dispose-state.ts} +0 -0
- /package/src/{find-state.ts → main/find-state.ts} +0 -0
- /package/src/{get-state.ts → main/get-state.ts} +0 -0
- /package/src/{index.ts → main/index.ts} +0 -0
- /package/src/{join.ts → main/join.ts} +0 -0
- /package/src/{logger.ts → main/logger.ts} +0 -0
- /package/src/{selector.ts → main/selector.ts} +0 -0
- /package/src/{set-state.ts → main/set-state.ts} +0 -0
- /package/src/{subscribe.ts → main/subscribe.ts} +0 -0
- /package/src/{timeline.ts → main/timeline.ts} +0 -0
- /package/src/{validators.ts → main/validators.ts} +0 -0
- /package/{react/src → src/react}/index.ts +0 -0
- /package/{react/src → src/react}/parse-state-overloads.ts +0 -0
- /package/{react/src → src/react}/use-i.ts +0 -0
- /package/{react/src → src/react}/use-json.ts +0 -0
- /package/{react/src → src/react}/use-o.ts +0 -0
- /package/{react/src → src/react}/use-tl.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/StateEditor.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/StateIndex.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/TimelineIndex.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/TransactionIndex.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/elastic-input/ElasticInput.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/elastic-input/NumberInput.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/elastic-input/TextInput.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/elastic-input/index.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/error-boundary/DefaultFallback.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/error-boundary/ReactErrorBoundary.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/error-boundary/index.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/index.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/default-components.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/developer-interface.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/array-editor.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/non-json.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/object-editor.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/primitive-editors.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/utilities/array-elements.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/utilities/cast-json.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/utilities/cast-to-json.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/editors-by-type/utilities/object-properties.ts +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/json-editor-internal.tsx +0 -0
- /package/{react-devtools/src → src/react-devtools}/json-editor/todo.md +0 -0
- /package/{realtime/src → src/realtime}/index.ts +0 -0
- /package/{realtime/src → src/realtime}/realtime-continuity.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/continuity/index.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/continuity/register-and-attempt-confirmed-update.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/continuity/use-conceal-state.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/continuity/use-reveal-state.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/index.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-atom-family-member.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-atom.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-mutable-atom-family-member.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-mutable-atom.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-selector-family-member.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/pull-selector.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/push-state.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/realtime-client-stores/index.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/server-action.ts +0 -0
- /package/{realtime-client/src → src/realtime-client}/sync-continuity.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-atom-family-member.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-atom.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-mutable-atom.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-mutable-family-member.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-selector-family-member.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-pull-selector.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-push.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-realtime-service.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-server-action.ts +0 -0
- /package/{realtime-react/src → src/realtime-react}/use-sync-continuity.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/README.md +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/prepare-to-send-initial-payload.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/prepare-to-serve-transaction-request.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/prepare-to-sync-realtime-continuity.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/prepare-to-track-client-acknowledgement.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/subscribe-to-continuity-actions.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/continuity/subscribe-to-continuity-perpectives.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/index.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/ipc-sockets/child-socket.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/ipc-sockets/custom-socket.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/ipc-sockets/index.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/ipc-sockets/parent-socket.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-action-receiver.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-family-provider.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-mutable-family-provider.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-mutable-provider.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-server-stores/index.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-state-provider.ts +0 -0
- /package/{realtime-server/src → src/realtime-server}/realtime-state-receiver.ts +0 -0
- /package/{realtime-testing/src → src/realtime-testing}/index.ts +0 -0
- /package/{realtime-testing/src → src/realtime-testing}/setup-realtime-test.tsx +0 -0
- /package/{transceivers/set-rtx/src → src/transceivers/set-rtx}/index.ts +0 -0
- /package/{web/src → src/web}/index.ts +0 -0
- /package/{web/src → src/web}/persist-sync.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["event: string","emit: <Event extends keyof I>(\n\t\t\tevent: Event,\n\t\t\t...args: I[Event]\n\t\t) => CustomSocket<I, O>","event: Event","listener: (...args: O[Event]) => void","listener: (event: string, ...args: Json.Array) => void","listener?: (...args: O[Event]) => void","arg: Json.Serializable","process: ChildProcessWithoutNullStreams","key: string","logger?: Pick<Console, `error` | `info` | `warn`>","err: { code: string }","process","buffer: EventBuffer<string, I[Event]>","id: string","buffer: EventBuffer<string, I[Event]>","attachServices: (socket: SubjectSocket<any, any>) => (() => void) | void","roomArgumentsAtoms: RegularAtomFamilyToken<RoomArguments, string>","roomSelectors: ReadonlySelectorFamilyToken<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n>","data: Buffer","createRoomTX: AtomIO.TransactionToken<\n\t(\n\t\troomId: string,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n>","args: RoomArguments","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<(roomId: string) => void>","visibleStateKeys: string[]","updates: TransactionUpdateContent[]","redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tUserKey\n>","userUnacknowledgedQueues: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n>","socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey>","socketIndex: MutableAtomToken<\n\tSetRTX<SocketKey>,\n\tSetRTXJson<SocketKey>\n>","userIndex: MutableAtomToken<\n\tSetRTX<UserKey>,\n\tSetRTXJson<UserKey>\n>","usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n>","store: Store","continuity: ContinuityToken","userKey: UserKey","socket: Socket | null","initialPayload: Json.Serializable[]","atom","store: Store","continuity: ContinuityToken","userKey: string","store: Store","continuity: ContinuityToken","userKey: string","userUnacknowledgedUpdates: ContinuitySyncTransactionUpdate[]","store: Store","continuity: ContinuityToken","userKey: UserKey","socket: Socket | null","unsubscribeFunctions: (() => void)[]","atom","store: Store","continuity: ContinuityToken","userKey: UserKey","socket: Socket | null","unsubFns: (() => void)[]","socket: Socket | null","unsubscribeFunctions: (() => void)[]","tx: AtomIO.TransactionToken<F>","update: Pick<AtomIO.TransactionUpdate<F>, `id` | `params`>","family: AtomIO.RegularAtomFamilyToken<J, K>","index: AtomIO.ReadableToken<Iterable<K>>","key: string","subKey: K","family: AtomIO.MutableAtomFamilyToken<T, J, K>","index: AtomIO.ReadableToken<Iterable<K>>","key: string","subKey: K","token: AtomIO.MutableAtomToken<Core, SerializableCore>","unsubscribeFromStateUpdates: (() => void) | null","token: AtomIO.WritableToken<J>","unsubscribeFromStateUpdates: (() => void) | undefined","token: WritableToken<J>","newValue: J"],"sources":["../../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-server-stores/server-room-external-store.ts","../../src/realtime-server/realtime-server-stores/server-room-external-actions.ts","../../src/realtime-server/realtime-server-stores/server-sync-store.ts","../../src/realtime-server/realtime-server-stores/server-user-store.ts","../../src/realtime-server/continuity/prepare-to-send-initial-payload.ts","../../src/realtime-server/continuity/prepare-to-serve-transaction-request.ts","../../src/realtime-server/continuity/prepare-to-track-client-acknowledgement.ts","../../src/realtime-server/continuity/subscribe-to-continuity-actions.ts","../../src/realtime-server/continuity/subscribe-to-continuity-perpectives.ts","../../src/realtime-server/continuity/prepare-to-sync-realtime-continuity.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-state-provider.ts","../../src/realtime-server/realtime-state-receiver.ts"],"sourcesContent":["import type { Json, stringified } from \"atom.io/json\"\n\nimport type { Socket } from \"..\"\n\nexport type Events = Json.Object<string, Json.Serializable[]>\n\nexport type StringifiedEvent<\n\tKey extends string,\n\tParams extends Json.Serializable[],\n> = stringified<[Key, ...Params]>\n\nexport interface EventBuffer<\n\tKey extends string,\n\tParams extends Json.Serializable[],\n> extends Buffer {\n\ttoString(): StringifiedEvent<Key, Params>\n}\n\nexport class CustomSocket<I extends Events, O extends Events> implements Socket {\n\tprotected listeners: Map<keyof O, Set<(...args: Json.Array) => void>>\n\tprotected globalListeners: Set<(event: string, ...args: Json.Array) => void>\n\tprotected handleEvent<Event extends keyof I>(\n\t\tevent: string,\n\t\t...args: I[Event]\n\t): void {\n\t\tfor (const listener of this.globalListeners) {\n\t\t\tlistener(event, ...args)\n\t\t}\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...args)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic id = `no_id_retrieved`\n\tpublic emit: <Event extends keyof I>(\n\t\tevent: Event,\n\t\t...args: I[Event]\n\t) => CustomSocket<I, O>\n\n\tpublic constructor(\n\t\temit: <Event extends keyof I>(\n\t\t\tevent: Event,\n\t\t\t...args: I[Event]\n\t\t) => CustomSocket<I, O>,\n\t) {\n\t\tthis.emit = emit\n\t\tthis.listeners = new Map()\n\t\tthis.globalListeners = new Set()\n\t}\n\n\tpublic on<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tlisteners.add(listener)\n\t\t} else {\n\t\t\tthis.listeners.set(event, new Set([listener]))\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic onAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.add(listener)\n\t\treturn this\n\t}\n\n\tpublic off<Event extends keyof O>(\n\t\tevent: Event,\n\t\tlistener?: (...args: O[Event]) => void,\n\t): this {\n\t\tconst listeners = this.listeners.get(event)\n\t\tif (listeners) {\n\t\t\tif (listener) {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t} else {\n\t\t\t\tthis.listeners.delete(event)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic offAny(listener: (event: string, ...args: Json.Array) => void): this {\n\t\tthis.globalListeners.delete(listener)\n\t\treturn this\n\t}\n}\n","import type { ChildProcessWithoutNullStreams } from \"node:child_process\"\n\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { EventBuffer, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\n/* eslint-disable no-console */\n\nexport class ChildSocket<\n\tI extends Events,\n\tO extends Events,\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected incompleteLog = ``\n\tprotected unprocessedLogs: string[] = []\n\n\tpublic id = `#####`\n\n\tpublic process: ChildProcessWithoutNullStreams\n\tpublic key: string\n\tpublic logger: Pick<Console, `error` | `info` | `warn`>\n\n\tprotected handleLog(arg: Json.Serializable): void {\n\t\tif (Array.isArray(arg)) {\n\t\t\tconst [level, ...rest] = arg\n\t\t\tswitch (level) {\n\t\t\t\tcase `i`:\n\t\t\t\t\tthis.logger.info(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `w`:\n\t\t\t\t\tthis.logger.warn(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `e`:\n\t\t\t\t\tthis.logger.error(...rest)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tprocess: ChildProcessWithoutNullStreams,\n\t\tkey: string,\n\t\tlogger?: Pick<Console, `error` | `info` | `warn`>,\n\t) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\x03`\n\t\t\tconst errorHandler = (err: { code: string }) => {\n\t\t\t\tif (err.code === `EPIPE`) {\n\t\t\t\t\tconsole.error(`EPIPE error during write`, this.process.stdin)\n\t\t\t\t}\n\t\t\t\tthis.process.stdin.removeListener(`error`, errorHandler)\n\t\t\t}\n\n\t\t\tthis.process.stdin.once(`error`, errorHandler)\n\t\t\tthis.process.stdin.write(stringifiedEvent)\n\n\t\t\treturn this\n\t\t})\n\t\tthis.process = process\n\t\tthis.key = key\n\t\tthis.logger = logger ?? {\n\t\t\tinfo: (...args: unknown[]) => {\n\t\t\t\tconsole.info(this.id, this.key, ...args)\n\t\t\t},\n\t\t\twarn: (...args: unknown[]) => {\n\t\t\t\tconsole.warn(this.id, this.key, ...args)\n\t\t\t},\n\t\t\terror: (...args: unknown[]) => {\n\t\t\t\tconsole.error(this.id, this.key, ...args)\n\t\t\t},\n\t\t}\n\t\tthis.process.stdout.on(\n\t\t\t`data`,\n\t\t\t<Event extends keyof I>(buffer: EventBuffer<string, I[Event]>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\n\t\t\t\tif (chunk === `ALIVE`) {\n\t\t\t\t\t// console.log(chunk)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.unprocessedEvents.push(...chunk.split(`\\x03`))\n\t\t\t\t// console.log(`🤓`, chunk.length)\n\t\t\t\t// console.log(`🤓`, this.unprocessedEvents.length)\n\t\t\t\t// console.log(`🤓`, ...this.unprocessedEvents.map((x) => x.length))\n\t\t\t\tconst newInput = this.unprocessedEvents.shift()\n\t\t\t\tthis.incompleteData += newInput ?? ``\n\t\t\t\ttry {\n\t\t\t\t\tif (this.incompleteData.startsWith(`error`)) {\n\t\t\t\t\t\tconsole.log(`❗`, this.incompleteData)\n\t\t\t\t\t}\n\t\t\t\t\tlet parsedEvent = parseJson(this.incompleteData)\n\t\t\t\t\tthis.handleEvent(...(parsedEvent as [string, ...I[keyof I]]))\n\t\t\t\t\twhile (this.unprocessedEvents.length > 0) {\n\t\t\t\t\t\tconst event = this.unprocessedEvents.shift()\n\t\t\t\t\t\tif (event) {\n\t\t\t\t\t\t\tif (this.unprocessedEvents.length === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = event\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tparsedEvent = parseJson(event)\n\t\t\t\t\t\t\tthis.handleEvent(...(parsedEvent as [string, ...I[keyof I]]))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(`⚠️----------------⚠️`)\n\t\t\t\t\tconsole.warn(this.incompleteData)\n\t\t\t\t\tconsole.warn(`⚠️----------------⚠️`)\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.process.stderr.on(`data`, (buf) => {\n\t\t\tconst chunk = buf.toString()\n\t\t\tthis.unprocessedLogs.push(...chunk.split(`\\x03`))\n\t\t\t// console.log(`🤫`, chunk.length)\n\t\t\t// console.log(`🤫`, this.unprocessedLogs.length)\n\t\t\t// console.log(`🤫`, ...this.unprocessedLogs.map((x) => x.length))\n\t\t\tconst newInput = this.unprocessedLogs.shift()\n\t\t\tthis.incompleteLog += newInput ?? ``\n\t\t\ttry {\n\t\t\t\tlet parsedLog = parseJson(this.incompleteLog)\n\t\t\t\t// console.log(`🤫`, parsedLog)\n\t\t\t\tthis.handleLog(parsedLog)\n\t\t\t\twhile (this.unprocessedLogs.length > 0) {\n\t\t\t\t\tthis.incompleteLog = this.unprocessedLogs.shift() ?? ``\n\t\t\t\t\tif (this.incompleteLog) {\n\t\t\t\t\t\tparsedLog = parseJson(this.incompleteLog)\n\t\t\t\t\t\tthis.handleLog(parsedLog)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`❌❌❌`)\n\t\t\t\tconsole.error(this.incompleteLog)\n\t\t\t\tconsole.error(error)\n\t\t\t\tconsole.error(`❌❌❌️`)\n\t\t\t}\n\t\t})\n\t\tif (process.pid) {\n\t\t\tthis.id = process.pid.toString()\n\t\t}\n\t}\n}\n","import { IMPLICIT, Subject } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type { EventBuffer, Events } from \"./custom-socket\"\nimport { CustomSocket } from \"./custom-socket\"\n\nexport class SubjectSocket<\n\tI extends Events,\n\tO extends Events,\n> extends CustomSocket<I, O> {\n\tpublic in: Subject<[string, ...Json.Serializable[]]>\n\tpublic out: Subject<[string, ...Json.Serializable[]]>\n\tpublic id = `no_id_retrieved`\n\tpublic disposalFunctions: (() => void)[] = []\n\n\tpublic constructor(id: string) {\n\t\tsuper((...args) => {\n\t\t\tthis.out.next(args as any)\n\t\t\treturn this\n\t\t})\n\t\tthis.id = id\n\t\tthis.in = new Subject()\n\t\tthis.out = new Subject()\n\t\tthis.in.subscribe(`socket`, (event) => {\n\t\t\tthis.handleEvent(...(event as [string, ...I[keyof I]]))\n\t\t})\n\t}\n\n\tpublic dispose(): void {\n\t\tfor (const dispose of this.disposalFunctions) {\n\t\t\tdispose()\n\t\t}\n\t}\n}\n\nexport class ParentSocket<\n\tI extends Events & {\n\t\t[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]\n\t},\n\tO extends Events & {\n\t\t[id in string as `user:${id}`]: [string, ...Json.Serializable[]]\n\t} & {\n\t\t/* eslint-disable quotes */\n\t\t\"user-joins\": [string]\n\t\t\"user-leaves\": [string]\n\t\t/* eslint-enable quotes */\n\t},\n> extends CustomSocket<I, O> {\n\tprotected incompleteData = ``\n\tprotected unprocessedEvents: string[] = []\n\tprotected relays: Map<string, SubjectSocket<any, any>>\n\tprotected relayServices: ((\n\t\tsocket: SubjectSocket<any, any>,\n\t) => (() => void) | void)[]\n\tprotected process: NodeJS.Process\n\n\tpublic id = `#####`\n\n\tprotected log(...args: any[]): void {\n\t\tthis.process.stderr.write(\n\t\t\tstringifyJson(\n\t\t\t\targs.map((arg) =>\n\t\t\t\t\targ instanceof SetRTX\n\t\t\t\t\t\t? `{ ${arg.toJSON().members.join(` | `)} }`\n\t\t\t\t\t\t: arg,\n\t\t\t\t),\n\t\t\t) + `\\x03`,\n\t\t)\n\t}\n\tpublic logger = {\n\t\tinfo: (...args: any[]): void => {\n\t\t\tthis.log(`i`, ...args)\n\t\t},\n\t\twarn: (...args: any[]): void => {\n\t\t\tthis.log(`w`, ...args)\n\t\t},\n\t\terror: (...args: any[]): void => {\n\t\t\tthis.log(`e`, ...args)\n\t\t},\n\t}\n\n\tpublic constructor() {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args])\n\t\t\tthis.process.stdout.write(stringifiedEvent + `\\x03`)\n\t\t\treturn this\n\t\t})\n\t\tthis.process = process\n\t\tthis.process.stdin.resume()\n\t\tthis.relays = new Map()\n\t\tthis.relayServices = []\n\t\t// this.logger.info(`🔗`, `uplink`, process.pid)\n\n\t\tthis.process.stdin.on(\n\t\t\t`data`,\n\t\t\t<Event extends keyof I>(buffer: EventBuffer<string, I[Event]>) => {\n\t\t\t\tconst chunk = buffer.toString()\n\t\t\t\tthis.unprocessedEvents.push(...chunk.split(`\\x03`))\n\t\t\t\tconst newInput = this.unprocessedEvents.shift()\n\t\t\t\tthis.incompleteData += newInput ?? ``\n\n\t\t\t\ttry {\n\t\t\t\t\tconst parsedData = parseJson(this.incompleteData)\n\t\t\t\t\tthis.logger.info(`🎰`, `received`, parsedData)\n\t\t\t\t\tthis.handleEvent(...(parsedData as [string, ...I[keyof I]]))\n\t\t\t\t\twhile (this.unprocessedEvents.length > 0) {\n\t\t\t\t\t\tconst event = this.unprocessedEvents.shift()\n\t\t\t\t\t\tif (event) {\n\t\t\t\t\t\t\tif (this.unprocessedEvents.length === 0) {\n\t\t\t\t\t\t\t\tthis.incompleteData = event\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedEvent = parseJson(event)\n\t\t\t\t\t\t\tthis.handleEvent(...(parsedEvent as [string, ...I[keyof I]]))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.incompleteData = ``\n\t\t\t\t} catch (thrown) {\n\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\tthis.logger.error(`❗`, thrown.message, thrown.cause, thrown.stack)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\tthis.on(`exit`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `received \"exit\"`)\n\t\t\tprocess.exit(0)\n\t\t})\n\t\tprocess.on(`exit`, (code) => {\n\t\t\tthis.logger.info(`🔥`, this.id, `exited with code ${code}`)\n\t\t})\n\t\tprocess.on(`end`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `ended`)\n\t\t\tprocess.exit(0)\n\t\t})\n\t\tprocess.on(`SIGTERM`, () => {\n\t\t\tthis.logger.error(`🔥`, this.id, `terminated`)\n\t\t\tprocess.exit(0)\n\t\t})\n\t\tprocess.on(`SIGINT`, () => {\n\t\t\tthis.logger.error(`🔥`, this.id, `interrupted`)\n\t\t\tprocess.exit(0)\n\t\t})\n\n\t\tif (process.pid) {\n\t\t\tthis.id = process.pid?.toString()\n\t\t}\n\n\t\tthis.on(`user-joins`, (username) => {\n\t\t\tthis.logger.info(`👤`, `user`, username, `joined`)\n\t\t\tconst relay = new SubjectSocket(`user:${username}`)\n\t\t\tthis.relays.set(username, relay)\n\t\t\tthis.logger.info(\n\t\t\t\t`🔗`,\n\t\t\t\t`attaching services:`,\n\t\t\t\t`[${[...this.relayServices.keys()].join(`, `)}]`,\n\t\t\t)\n\t\t\tfor (const attachServices of this.relayServices) {\n\t\t\t\tconst cleanup = attachServices(relay)\n\t\t\t\tif (cleanup) {\n\t\t\t\t\trelay.disposalFunctions.push(cleanup)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.on(`user:${username}`, (...data) => {\n\t\t\t\trelay.in.next(data)\n\t\t\t})\n\t\t\trelay.out.subscribe(`socket`, (data) => {\n\t\t\t\tthis.emit(...(data as [string, ...I[keyof I]]))\n\t\t\t})\n\t\t})\n\n\t\tthis.on(`user-leaves`, (username) => {\n\t\t\tconst relay = this.relays.get(username)\n\t\t\tthis.off(`relay:${username}`)\n\t\t\tif (relay) {\n\t\t\t\trelay.dispose()\n\t\t\t\tthis.relays.delete(username)\n\t\t\t}\n\t\t})\n\n\t\tprocess.stdout.write(`ALIVE`)\n\t}\n\n\tpublic relay(\n\t\tattachServices: (socket: SubjectSocket<any, any>) => (() => void) | void,\n\t): void {\n\t\tthis.logger.info(`🔗`, `running relay method`)\n\t\tthis.relayServices.push(attachServices)\n\t}\n}\n","import type { ChildProcessWithoutNullStreams } from \"node:child_process\"\nimport { spawn } from \"node:child_process\"\n\nimport type {\n\tLoadable,\n\tReadonlySelectorFamilyToken,\n\tRegularAtomFamilyToken,\n} from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\n\nimport { ChildSocket } from \"../ipc-sockets\"\n\nexport type RoomArguments =\n\t| [script: string, options: string[]]\n\t| [script: string]\n\nexport const roomArgumentsAtoms: RegularAtomFamilyToken<RoomArguments, string> =\n\tatomFamily<RoomArguments, string>({\n\t\tkey: `roomArguments`,\n\t\tdefault: [`echo`, [`Hello World!`]],\n\t})\n\nexport const roomSelectors: ReadonlySelectorFamilyToken<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n> = selectorFamily<Loadable<ChildSocket<any, any>>, string>({\n\tkey: `room`,\n\tget:\n\t\t(roomId) =>\n\t\tasync ({ get, find }) => {\n\t\t\tconst argumentsState = find(roomArgumentsAtoms, roomId)\n\t\t\tconst args = get(argumentsState)\n\t\t\tconst [script, options] = args\n\t\t\tconst child = await new Promise<ChildProcessWithoutNullStreams>(\n\t\t\t\t(resolve) => {\n\t\t\t\t\tconst room = spawn(script, options, { env: process.env })\n\t\t\t\t\tconst resolver = (data: Buffer) => {\n\t\t\t\t\t\tif (data.toString() === `ALIVE`) {\n\t\t\t\t\t\t\troom.stdout.off(`data`, resolver)\n\t\t\t\t\t\t\tresolve(room)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\troom.stdout.on(`data`, resolver)\n\t\t\t\t},\n\t\t\t)\n\t\t\treturn new ChildSocket(child, roomId)\n\t\t},\n})\n","import type { Loadable } from \"atom.io\"\nimport * as AtomIO from \"atom.io\"\nimport { editRelationsInStore } from \"atom.io/internal\"\nimport type { UserInRoomMeta } from \"atom.io/realtime\"\nimport { roomIndex, usersInRooms } from \"atom.io/realtime\"\n\nimport type { ChildSocket } from \"../ipc-sockets\"\nimport type { RoomArguments } from \"./server-room-external-store\"\nimport { roomArgumentsAtoms, roomSelectors } from \"./server-room-external-store\"\n\nexport const createRoomTX: AtomIO.TransactionToken<\n\t(\n\t\troomId: string,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n> = AtomIO.transaction({\n\tkey: `createRoom`,\n\tdo: ({ get, set, find }, roomId, script, options) => {\n\t\tconst args: RoomArguments = options ? [script, options] : [script]\n\t\tconst roomArgumentsState = find(roomArgumentsAtoms, roomId)\n\t\tset(roomArgumentsState, args)\n\t\tset(roomIndex, (s) => s.add(roomId))\n\t\tconst roomState = find(roomSelectors, roomId)\n\t\tconst room = get(roomState)\n\t\treturn room\n\t},\n})\nexport type CreateRoomIO = AtomIO.TransactionIO<typeof createRoomTX>\n\nexport const joinRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta\n> = AtomIO.transaction({\n\tkey: `joinRoom`,\n\tdo: (tools, roomId, userId, enteredAtEpoch) => {\n\t\tconst meta = { enteredAtEpoch }\n\t\teditRelationsInStore(\n\t\t\tusersInRooms,\n\t\t\t(relations) => {\n\t\t\t\trelations.set({ room: roomId, user: userId }, meta)\n\t\t\t},\n\t\t\ttools.env().store,\n\t\t)\n\t\treturn meta\n\t},\n})\nexport type JoinRoomIO = AtomIO.TransactionIO<typeof joinRoomTX>\n\nexport const leaveRoomTX: AtomIO.TransactionToken<\n\t(roomId: string, userId: string) => void\n> = AtomIO.transaction({\n\tkey: `leaveRoom`,\n\tdo: (tools, roomId, userId) => {\n\t\teditRelationsInStore(\n\t\t\tusersInRooms,\n\t\t\t(relations) => {\n\t\t\t\trelations.delete({ room: roomId, user: userId })\n\t\t\t},\n\t\t\ttools.env().store,\n\t\t)\n\t},\n})\nexport type LeaveRoomIO = AtomIO.TransactionIO<typeof leaveRoomTX>\n\nexport const destroyRoomTX: AtomIO.TransactionToken<(roomId: string) => void> =\n\tAtomIO.transaction({\n\t\tkey: `destroyRoom`,\n\t\tdo: (tools, roomId) => {\n\t\t\teditRelationsInStore(\n\t\t\t\tusersInRooms,\n\t\t\t\t(relations) => {\n\t\t\t\t\trelations.delete({ room: roomId })\n\t\t\t\t},\n\t\t\t\ttools.env().store,\n\t\t\t)\n\t\t\ttools.set(roomIndex, (s) => (s.delete(roomId), s))\n\t\t},\n\t})\n","import type {\n\tRegularAtomFamilyToken,\n\tTransactionUpdate,\n\tTransactionUpdateContent,\n} from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\n\nimport type { UserKey } from \"./server-user-store\"\n\n// export const completeUpdateAtoms = atomFamily<\n// \tTransactionUpdate<any> | null,\n// \tstring\n// >({\n// \tkey: `completeUpdate`,\n// \tdefault: null,\n// })\n\nexport function redactTransactionUpdateContent(\n\tvisibleStateKeys: string[],\n\tupdates: TransactionUpdateContent[],\n): TransactionUpdateContent[] {\n\treturn updates\n\t\t.map((update): TransactionUpdateContent => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `transaction_update`: {\n\t\t\t\t\tconst redacted = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleStateKeys,\n\t\t\t\t\t\tupdate.updates,\n\t\t\t\t\t)\n\t\t\t\t\treturn { ...update, updates: redacted }\n\t\t\t\t}\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `selector_update`:\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn update\n\t\t\t}\n\t\t})\n\t\t.filter((update) => {\n\t\t\tswitch (update.type) {\n\t\t\t\tcase `atom_update`:\n\t\t\t\tcase `selector_update`:\n\t\t\t\t\treturn visibleStateKeys.includes(update.key)\n\t\t\t\tcase `state_creation`:\n\t\t\t\tcase `state_disposal`:\n\t\t\t\t\treturn visibleStateKeys.includes(update.token.key)\n\t\t\t\tcase `molecule_creation`:\n\t\t\t\tcase `transaction_update`:\n\t\t\t\tcase `molecule_disposal`:\n\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\treturn true\n\t\t\t}\n\t\t})\n}\n\nexport const redactorAtoms: RegularAtomFamilyToken<\n\t{\n\t\tocclude: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tUserKey\n> = atomFamily<\n\t{\n\t\tocclude: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tUserKey\n>({\n\tkey: `redactor`,\n\tdefault: { occlude: (updates) => updates },\n})\n// export const redactedUpdateSelectors = selectorFamily<\n// \tTransactionUpdate<any> | null,\n// \t[transactionKey: string, updateId: string]\n// >({\n// \tkey: `redactedUpdate`,\n// \tget:\n// \t\t([transactionKey, updateId]) =>\n// \t\t({ get, find }) => {\n// \t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n// \t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n// \t\t\tif (update && filter) {\n// \t\t\t\treturn { ...update, updates: filter(update.updates) }\n// \t\t\t}\n// \t\t\treturn null\n// \t\t},\n// })\n\nexport type ContinuitySyncTransactionUpdate = Pick<\n\tTransactionUpdate<any>,\n\t`epoch` | `id` | `key` | `output` | `updates`\n>\nexport const userUnacknowledgedQueues: RegularAtomFamilyToken<\n\tContinuitySyncTransactionUpdate[],\n\tUserKey\n> = atomFamily<ContinuitySyncTransactionUpdate[], UserKey>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n","import type {\n\tHierarchy,\n\tJoinToken,\n\tMutableAtomToken,\n\tRegularAtomFamilyToken,\n} from \"atom.io\"\nimport { atom, atomFamily, join } from \"atom.io\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type { Socket } from \"..\"\n\nexport type SocketKey = `socket::${string}`\nexport type UserKey = `user::${string}`\nexport type RoomKey = `room::${string}`\n\nexport type SocketSystemHierarchy = Hierarchy<\n\t[\n\t\t{\n\t\t\tabove: `root`\n\t\t\tbelow: [UserKey, SocketKey, RoomKey]\n\t\t},\n\t]\n>\n\nexport const socketAtoms: RegularAtomFamilyToken<Socket | null, SocketKey> =\n\tatomFamily<Socket | null, SocketKey>({\n\t\tkey: `sockets`,\n\t\tdefault: null,\n\t})\n\nexport const socketIndex: MutableAtomToken<\n\tSetRTX<SocketKey>,\n\tSetRTXJson<SocketKey>\n> = atom<SetRTX<SocketKey>, SetRTXJson<SocketKey>>({\n\tkey: `socketsIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport const userIndex: MutableAtomToken<\n\tSetRTX<UserKey>,\n\tSetRTXJson<UserKey>\n> = atom<SetRTX<UserKey>, SetRTXJson<UserKey>>({\n\tkey: `usersIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport const usersOfSockets: JoinToken<\n\t`user`,\n\tUserKey,\n\t`socket`,\n\tSocketKey,\n\t`1:1`\n> = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n\tisAType: (s): s is UserKey => s.startsWith(`user::`),\n\tisBType: (s): s is SocketKey => s.startsWith(`socket::`),\n})\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tisRootStore,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { Socket, UserKey } from \"..\"\n\nexport function prepareToSendInitialPayload(\n\tstore: Store,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n\tsocket: Socket | null,\n): () => void {\n\tconst continuityKey = continuity.key\n\treturn function sendInitialPayload(): void {\n\t\tconst initialPayload: Json.Serializable[] = []\n\t\tfor (const atom of continuity.globals) {\n\t\t\tconst resourceToken =\n\t\t\t\tatom.type === `mutable_atom` ? getJsonToken(store, atom) : atom\n\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t}\n\t\tfor (const perspective of continuity.perspectives) {\n\t\t\tconst { viewAtoms, resourceAtoms } = perspective\n\t\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\t\tconst userView = getFromStore(store, userViewState)\n\t\t\tstore.logger.info(`👁`, `atom`, resourceAtoms.key, `${userKey} can see`, {\n\t\t\t\tviewAtoms,\n\t\t\t\tresourceAtoms,\n\t\t\t\tuserView,\n\t\t\t})\n\t\t\tfor (const visibleToken of userView) {\n\t\t\t\tconst resourceToken =\n\t\t\t\t\tvisibleToken.type === `mutable_atom`\n\t\t\t\t\t\t? getJsonToken(store, visibleToken)\n\t\t\t\t\t\t: visibleToken\n\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\n\t\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t\t}\n\t\t}\n\n\t\tconst epoch = isRootStore(store)\n\t\t\t? (store.transactionMeta.epoch.get(continuityKey) ?? null)\n\t\t\t: null\n\n\t\tsocket?.emit(`continuity-init:${continuityKey}`, epoch, initialPayload)\n\t}\n}\n","import type { TransactionUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { actUponStore } from \"atom.io/internal\"\nimport type { JsonIO } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nexport function prepareToServeTransactionRequest(\n\tstore: Store,\n\tcontinuity: ContinuityToken,\n\tuserKey: string,\n): (update: Pick<TransactionUpdate<JsonIO>, `id` | `key` | `params`>) => void {\n\tconst continuityKey = continuity.key\n\treturn function serveTransactionRequest(update) {\n\t\tstore.logger.info(`🛎️`, `continuity`, continuityKey, `received`, update)\n\t\tconst transactionKey = update.key\n\t\tconst updateId = update.id\n\t\tconst performanceKey = `tx-run:${transactionKey}:${updateId}`\n\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\tperformance.mark(performanceKeyStart)\n\t\ttry {\n\t\t\tactUponStore(\n\t\t\t\tstore,\n\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\tupdateId,\n\t\t\t)(...update.params)\n\t\t} catch (thrown) {\n\t\t\tif (thrown instanceof Error) {\n\t\t\t\tstore.logger.error(\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`failed to run transaction ${transactionKey} from ${userKey} with update ${updateId}`,\n\t\t\t\t\tthrown.message,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tperformance.mark(performanceKeyEnd)\n\t\tconst metric = performance.measure(\n\t\t\tperformanceKey,\n\t\t\tperformanceKeyStart,\n\t\t\tperformanceKeyEnd,\n\t\t)\n\t\tstore?.logger.info(\n\t\t\t`🚀`,\n\t\t\t`transaction`,\n\t\t\ttransactionKey,\n\t\t\tupdateId,\n\t\t\tuserKey,\n\t\t\tmetric.duration,\n\t\t)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { setIntoStore } from \"atom.io/internal\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { ContinuitySyncTransactionUpdate } from \"../realtime-server-stores\"\nimport { userUnacknowledgedQueues } from \"../realtime-server-stores\"\n\nexport function prepareToTrackClientAcknowledgement(\n\tstore: Store,\n\tcontinuity: ContinuityToken,\n\tuserKey: string,\n\tuserUnacknowledgedUpdates: ContinuitySyncTransactionUpdate[],\n): (epoch: number) => void {\n\tconst continuityKey = continuity.key\n\treturn function trackClientAcknowledgement(epoch) {\n\t\tstore.logger.info(\n\t\t\t`👍`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`${userKey} acknowledged epoch ${epoch}`,\n\t\t)\n\t\tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\t\tif (isUnacknowledged) {\n\t\t\tsetIntoStore(store, userUnacknowledgedQueues, userKey, (updates) => {\n\t\t\t\tupdates.shift()\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`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\tupdates.length,\n\t\t\t\t\t`items`,\n\t\t\t\t)\n\t\t\t\treturn updates\n\t\t\t})\n\t\t}\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tisRootStore,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { Socket, UserKey } from \"..\"\nimport {\n\tredactTransactionUpdateContent,\n\tuserUnacknowledgedQueues,\n} from \"../realtime-server-stores\"\n\nexport function subscribeToContinuityActions(\n\tstore: Store,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n\tsocket: Socket | null,\n): (() => void)[] {\n\tconst continuityKey = continuity.key\n\tconst unsubscribeFunctions: (() => void)[] = []\n\n\tfor (const transaction of continuity.actions) {\n\t\tconst unsubscribeFromTransaction = subscribeToTransaction(\n\t\t\tstore,\n\t\t\ttransaction,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t(update) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst visibleKeys = continuity.globals\n\t\t\t\t\t\t.map((atom) => {\n\t\t\t\t\t\t\tif (atom.type === `atom`) {\n\t\t\t\t\t\t\t\treturn atom.key\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn getUpdateToken(atom).key\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\tcontinuity.perspectives.flatMap((perspective) => {\n\t\t\t\t\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\t\t\t\t\tconst userPerspectiveTokenState = findInStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tviewAtoms,\n\t\t\t\t\t\t\t\t\tuserKey,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tconst visibleTokens = getFromStore(\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\tuserPerspectiveTokenState,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn visibleTokens.map((token) => {\n\t\t\t\t\t\t\t\t\tconst key =\n\t\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? `*` + token.key : token.key\n\t\t\t\t\t\t\t\t\treturn key\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdates = redactTransactionUpdateContent(\n\t\t\t\t\t\tvisibleKeys,\n\t\t\t\t\t\tupdate.updates,\n\t\t\t\t\t)\n\t\t\t\t\tconst redactedUpdate = {\n\t\t\t\t\t\t...update,\n\t\t\t\t\t\tupdates: redactedUpdates,\n\t\t\t\t\t}\n\t\t\t\t\tsetIntoStore(store, userUnacknowledgedQueues, userKey, (updates) => {\n\t\t\t\t\t\tif (redactedUpdate) {\n\t\t\t\t\t\t\tupdates.push(redactedUpdate)\n\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t\t`${userKey} unacknowledged update queue now has`,\n\t\t\t\t\t\t\t\tupdates.length,\n\t\t\t\t\t\t\t\t`items`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t})\n\n\t\t\t\t\tsocket?.emit(\n\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\tredactedUpdate as Json.Serializable,\n\t\t\t\t\t)\n\t\t\t\t} catch (thrown) {\n\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t`${userKey} failed to send update from transaction ${transaction.key} to ${userKey}`,\n\t\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubscribeFunctions.push(unsubscribeFromTransaction)\n\t}\n\treturn unsubscribeFunctions\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { Socket } from \"..\"\nimport type { UserKey } from \"../realtime-server-stores\"\n\nexport function subscribeToContinuityPerspectives(\n\tstore: Store,\n\tcontinuity: ContinuityToken,\n\tuserKey: UserKey,\n\tsocket: Socket | null,\n): (() => void)[] {\n\tconst continuityKey = continuity.key\n\tconst unsubFns: (() => void)[] = []\n\tfor (const perspective of continuity.perspectives) {\n\t\tconst { viewAtoms } = perspective\n\t\tconst userViewState = findInStore(store, viewAtoms, userKey)\n\t\tconst unsubscribeFromUserView = subscribeToState(\n\t\t\tstore,\n\t\t\tuserViewState,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,\n\t\t\t({ oldValue, newValue }) => {\n\t\t\t\tconst oldKeys = oldValue.map((token) => token.key)\n\t\t\t\tconst newKeys = newValue.map((token) => token.key)\n\t\t\t\tconst concealed = oldValue.filter(\n\t\t\t\t\t(token) => !newKeys.includes(token.key),\n\t\t\t\t)\n\t\t\t\tconst revealed = newValue\n\t\t\t\t\t.filter((token) => !oldKeys.includes(token.key))\n\t\t\t\t\t.flatMap((token) => {\n\t\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? getJsonToken(store, token) : token\n\t\t\t\t\t\tconst resource = getFromStore(store, resourceToken)\n\t\t\t\t\t\treturn [resourceToken, resource]\n\t\t\t\t\t})\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`👁`,\n\t\t\t\t\t`atom`,\n\t\t\t\t\tperspective.resourceAtoms.key,\n\t\t\t\t\t`${userKey} has a new perspective`,\n\t\t\t\t\t{ oldKeys, newKeys, revealed, concealed },\n\t\t\t\t)\n\t\t\t\tif (revealed.length > 0) {\n\t\t\t\t\tsocket?.emit(`reveal:${continuityKey}`, revealed)\n\t\t\t\t}\n\t\t\t\tif (concealed.length > 0) {\n\t\t\t\t\tsocket?.emit(`conceal:${continuityKey}`, concealed)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tunsubFns.push(unsubscribeFromUserView)\n\t}\n\treturn unsubFns\n}\n","import {\n\tfindInStore,\n\tfindRelationsInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { ServerConfig, Socket } from \"..\"\nimport { socketAtoms, usersOfSockets } from \"..\"\nimport { userUnacknowledgedQueues } from \"../realtime-server-stores\"\nimport { prepareToSendInitialPayload } from \"./prepare-to-send-initial-payload\"\nimport { prepareToServeTransactionRequest } from \"./prepare-to-serve-transaction-request\"\nimport { prepareToTrackClientAcknowledgement } from \"./prepare-to-track-client-acknowledgement\"\nimport { subscribeToContinuityActions } from \"./subscribe-to-continuity-actions\"\nimport { subscribeToContinuityPerspectives } from \"./subscribe-to-continuity-perpectives\"\n\nexport type ExposeRealtimeContinuity = (\n\tcontinuity: ContinuityToken,\n) => () => void\nexport function prepareToExposeRealtimeContinuity({\n\tsocket: initialSocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig): ExposeRealtimeContinuity {\n\treturn function syncRealtimeContinuity(continuity) {\n\t\tlet socket: Socket | null = initialSocket\n\n\t\tconst continuityKey = continuity.key\n\t\tconst userKeyState = findRelationsInStore(\n\t\t\tusersOfSockets,\n\t\t\t`socket::${socket.id}`,\n\t\t\tstore,\n\t\t).userKeyOfSocket\n\t\tconst userKey = getFromStore(store, userKeyState)\n\t\tif (!userKey) {\n\t\t\tstore.logger.error(\n\t\t\t\t`❌`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`Tried to create a synchronizer for a socket (${socket.id}) that is not connected to a user.`,\n\t\t\t)\n\t\t\treturn () => {}\n\t\t}\n\n\t\tconst socketKeyState = findRelationsInStore(\n\t\t\tusersOfSockets,\n\t\t\tuserKey,\n\t\t\tstore,\n\t\t).socketKeyOfUser\n\t\tconst unsubscribeFromSocketTracking = subscribeToState(\n\t\t\tstore,\n\t\t\tsocketKeyState,\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t({ newValue: newSocketKey }) => {\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`seeing ${userKey} on new socket ${newSocketKey}`,\n\t\t\t\t)\n\t\t\t\tif (newSocketKey === null) {\n\t\t\t\t\tstore.logger.warn(\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`User (${userKey}) is not connected to a socket, waiting for them to reappear.`,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst newSocketState = findInStore(store, socketAtoms, newSocketKey)\n\t\t\t\tconst newSocket = getFromStore(store, newSocketState)\n\t\t\t\tsocket = newSocket\n\t\t\t\tfor (const unacknowledgedUpdate of userUnacknowledgedUpdates) {\n\t\t\t\t\tsocket?.emit(\n\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\tunacknowledgedUpdate as Json.Serializable,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\tconst userUnacknowledgedUpdates = getFromStore(\n\t\t\tstore,\n\t\t\tuserUnacknowledgedQueues,\n\t\t\tuserKey,\n\t\t)\n\n\t\tconst unsubscribeFunctions: (() => void)[] = []\n\n\t\tconst unsubscribeFromPerspectives = subscribeToContinuityPerspectives(\n\t\t\tstore,\n\t\t\tcontinuity,\n\t\t\tuserKey,\n\t\t\tsocket,\n\t\t)\n\t\tconst unsubscribeFromTransactions = subscribeToContinuityActions(\n\t\t\tstore,\n\t\t\tcontinuity,\n\t\t\tuserKey,\n\t\t\tsocket,\n\t\t)\n\t\tunsubscribeFunctions.push(\n\t\t\t...unsubscribeFromPerspectives,\n\t\t\t...unsubscribeFromTransactions,\n\t\t)\n\n\t\tconst sendInitialPayload = prepareToSendInitialPayload(\n\t\t\tstore,\n\t\t\tcontinuity,\n\t\t\tuserKey,\n\t\t\tinitialSocket,\n\t\t)\n\n\t\tsocket.off(`get:${continuityKey}`, sendInitialPayload)\n\t\tsocket.on(`get:${continuityKey}`, sendInitialPayload)\n\n\t\tconst fillTransactionRequest = prepareToServeTransactionRequest(\n\t\t\tstore,\n\t\t\tcontinuity,\n\t\t\tuserKey,\n\t\t)\n\n\t\tsocket.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${continuityKey}`, fillTransactionRequest)\n\n\t\tconst trackClientAcknowledgement = prepareToTrackClientAcknowledgement(\n\t\t\tstore,\n\t\t\tcontinuity,\n\t\t\tuserKey,\n\t\t\tuserUnacknowledgedUpdates,\n\t\t)\n\n\t\tsocket?.on(`ack:${continuityKey}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\t// clearInterval(retryTimeout)\n\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\tsocket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t\tsocket?.off(`get:${continuityKey}`, sendInitialPayload)\n\t\t\tsocket?.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { actUponStore, IMPLICIT } from \"atom.io/internal\"\nimport type { JsonIO } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type ActionReceiver = ReturnType<typeof realtimeActionReceiver>\nexport function realtimeActionReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionReceiver<F extends JsonIO>(\n\t\ttx: AtomIO.TransactionToken<F>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: Pick<AtomIO.TransactionUpdate<F>, `id` | `params`>,\n\t\t) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tactUponStore<F>(store, tx, update.id)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeAtomFamilyProvider>\nexport function realtimeAtomFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamilyToken<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillUnsubRequest)\n\t\t\tconst unsub = unsubCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey: K) => {\n\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\tfor (const exposedSubKey of exposedSubKeys) {\n\t\t\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\tstore,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tunsubCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\n\t\t\tfor (const [, unsub] of unsubCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableFamilyProvider = ReturnType<\n\ttypeof realtimeMutableFamilyProvider\n>\nexport function realtimeMutableFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableFamilyProvider<\n\t\tT extends Transceiver<any>,\n\t\tJ extends Json.Serializable,\n\t\tK extends Canonical,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamilyToken<T, J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillUnsubRequest)\n\t\t\tconst unsub = unsubCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey: K) => {\n\t\t\tconst exposedSubKeys = getFromStore(store, index)\n\t\t\tfor (const exposedSubKey of exposedSubKeys) {\n\t\t\t\tif (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {\n\t\t\t\t\tconst token = findInStore(store, family, subKey)\n\t\t\t\t\tgetFromStore(store, token)\n\t\t\t\t\tconst jsonToken = getJsonToken(store, token)\n\t\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\tstore,\n\t\t\t\t\t\tupdateToken,\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tunsubCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\t\tfillUnsubRequest(token.key)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tIMPLICIT,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableProvider = ReturnType<typeof realtimeMutableProvider>\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(store, token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, getFromStore(store, jsonToken))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\tstore,\n\t\t\t\ttrackerToken,\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { getFromStore, IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateProvider = ReturnType<typeof realtimeStateProvider>\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | undefined\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(store, token))\n\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\tstore,\n\t\t\t\ttoken,\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst fillUnsubRequest = () => {\n\t\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\t\tif (unsubscribeFromStateUpdates) {\n\t\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tif (unsubscribeFromStateUpdates) {\n\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { WritableToken } from \"atom.io\"\nimport { IMPLICIT, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateReceiver = ReturnType<typeof realtimeStateReceiver>\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<J extends Json.Serializable>(\n\t\ttoken: WritableToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => {\n\t\t\tsetIntoStore(store, token, newValue)\n\t\t}\n\n\t\tconst fillPubUnclaim = () => {\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t\tsocket.off(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\t\tconst fillPubClaim = () => {\n\t\t\tsocket.on(`pub:${token.key}`, publish)\n\t\t\tsocket.on(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\n\t\tsocket.on(`claim:${token.key}`, fillPubClaim)\n\n\t\treturn () => {\n\t\t\tsocket.off(`claim:${token.key}`, fillPubClaim)\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as AtomIO from "atom.io";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { RenderResult } from "@testing-library/react";
|
|
4
|
+
import * as SocketIO from "socket.io";
|
|
5
|
+
import { Socket } from "socket.io-client";
|
|
6
|
+
|
|
7
|
+
//#region src/realtime-testing/setup-realtime-test.d.ts
|
|
8
|
+
type TestSetupOptions = {
|
|
9
|
+
port: number;
|
|
10
|
+
immortal?: {
|
|
11
|
+
server?: boolean;
|
|
12
|
+
};
|
|
13
|
+
server: (tools: {
|
|
14
|
+
socket: SocketIO.Socket;
|
|
15
|
+
silo: AtomIO.Silo;
|
|
16
|
+
enableLogging: () => void;
|
|
17
|
+
}) => void;
|
|
18
|
+
};
|
|
19
|
+
type TestSetupOptions__SingleClient = TestSetupOptions & {
|
|
20
|
+
client: React.FC;
|
|
21
|
+
};
|
|
22
|
+
type TestSetupOptions__MultiClient<ClientNames extends string> = TestSetupOptions & {
|
|
23
|
+
clients: { [K in ClientNames]: React.FC };
|
|
24
|
+
};
|
|
25
|
+
type RealtimeTestTools = {
|
|
26
|
+
name: string;
|
|
27
|
+
silo: AtomIO.Silo;
|
|
28
|
+
};
|
|
29
|
+
type RealtimeTestClient = RealtimeTestTools & {
|
|
30
|
+
renderResult: RenderResult;
|
|
31
|
+
prettyPrint: () => void;
|
|
32
|
+
enableLogging: () => void;
|
|
33
|
+
socket: Socket;
|
|
34
|
+
};
|
|
35
|
+
type RealtimeTestClientBuilder = {
|
|
36
|
+
dispose: () => void;
|
|
37
|
+
init: () => RealtimeTestClient;
|
|
38
|
+
};
|
|
39
|
+
type RealtimeTestServer = RealtimeTestTools & {
|
|
40
|
+
dispose: () => Promise<void>;
|
|
41
|
+
port: number;
|
|
42
|
+
};
|
|
43
|
+
type RealtimeTestAPI = {
|
|
44
|
+
server: RealtimeTestServer;
|
|
45
|
+
teardown: () => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
type RealtimeTestAPI__SingleClient = RealtimeTestAPI & {
|
|
48
|
+
client: RealtimeTestClientBuilder;
|
|
49
|
+
};
|
|
50
|
+
type RealtimeTestAPI__MultiClient<ClientNames extends string> = RealtimeTestAPI & {
|
|
51
|
+
clients: Record<ClientNames, RealtimeTestClientBuilder>;
|
|
52
|
+
};
|
|
53
|
+
declare const setupRealtimeTestServer: (options: TestSetupOptions) => RealtimeTestServer;
|
|
54
|
+
declare const setupRealtimeTestClient: (options: TestSetupOptions__SingleClient, name: string, port: number) => RealtimeTestClientBuilder;
|
|
55
|
+
declare const singleClient: (options: TestSetupOptions__SingleClient) => RealtimeTestAPI__SingleClient;
|
|
56
|
+
declare const multiClient: <ClientNames extends string>(options: TestSetupOptions__MultiClient<ClientNames>) => RealtimeTestAPI__MultiClient<ClientNames>;
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { RealtimeTestAPI, RealtimeTestAPI__MultiClient, RealtimeTestAPI__SingleClient, RealtimeTestClient, RealtimeTestClientBuilder, RealtimeTestServer, RealtimeTestTools, TestSetupOptions, TestSetupOptions__MultiClient, TestSetupOptions__SingleClient, multiClient, setupRealtimeTestClient, setupRealtimeTestServer, singleClient };
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["tools: {\n\t\tsocket: SocketIO.Socket\n\t\tsilo: AtomIO.Silo\n\t\tenableLogging: () => void\n\t}","options: TestSetupOptions","options: TestSetupOptions__SingleClient","name: string","port: number","options: TestSetupOptions__MultiClient<ClientNames>"],"sources":["../../src/realtime-testing/setup-realtime-test.tsx"],"sourcesContent":null,"mappings":";;;;;;;KA6CY,gBAAA;;EAAZ,QAAY,CAAA,EAAA;IAAA,MAAA,CAAA,EAAA,OAAA;EAAA,CAAA;EAIO,MACX,EAAA,CAAA,KAAO,EAAA;IAAA,MAAA,EADL,QAAA,CAAS,MACJ;IAIf,IAAY,EAJJ,MAAA,CAAO,IAIH;IAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAAA,CAAA,EAAA,GAAiC,IAAA;CAAA;AAC9B,KADH,8BAAA,GAAiC,gBAC9B,GAAA;EAEf,MAAY,EAFH,KAAA,CAAM,EAEH;CAAA;AACX,KADW,6BACX,CAAA,oBAAA,MAAA,CAAA,GAAA,gBAAA,GAAA;EAAA,OAEQ,EAAA,QAAA,WAAA,GAAc,KAAA,CAAM,EAApB,EAAA;CAAA;AAAoB,KAIjB,iBAAA,GAJiB;EAI7B,IAAY,EAAA,MAAA;EAIZ,IAAY,EAFL,MAAA,CAAO,IAEF;CAAA;AAAqB,KAArB,kBAAA,GAAqB,iBAAA,GAAA;EAAA,YAClB,EAAA,YAAA;EAAA,WAGN,EAAA,GAAA,GAAA,IAAA;EAAA,aAAA,EAAA,GAAA,GAAA,IAAA;EAET,MAAY,EAFH,MAEG;AAKZ,CAAA;AAAY,KALA,yBAAA,GAKA;EAAA,OAAqB,EAAA,GAAA,GAAA,IAAA;EAAA,IAAA,EACjB,GAAA,GAJH,kBAIG;AAAA,CAAA;AAIJ,KALA,kBAAA,GAAqB,iBAKrB,GAAA;EAAA,OAAA,EAAA,GAAA,GAJI,OAIJ,CAAA,IAAA,CAAA;EAAA,IAAA,EACH,MAAA;CAAA;AACQ,KAFL,eAAA,GAEK;EAEjB,MAAY,EAHH,kBAGG;EAAA,QAAA,EAAA,GAAA,GAFK,OAEL,CAAA,IAAA,CAAA;CAAA;AACH,KADG,6BAAA,GAAgC,eACnC,GAAA;EAAA,MAAA,EAAA,yBAAA;AAET,CAAA;AAAY,KAAA,4BAAA,CAAA,oBAAA,MAAA,CAAA,GACX,eADW,GAAA;EAAA,OACX,EACU,MADV,CACiB,WADjB,EAC8B,yBAD9B,CAAA;CAAA;AAC8B,cAGlB,uBAHkB,EAAA,CAAA,OAAA,EAIrB,gBAJqB,EAAA,GAK5B,kBAL4B;AAApB,cA0FE,uBA1FF,EAAA,CAAA,OAAA,EA2FD,8BA3FC,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GA8FR,yBA9FQ;AAAA,cA0JE,YA1JF,EAAA,CAAA,OAAA,EA2JD,8BA3JC,EAAA,GA4JR,6BA5JQ;AAGE,cAuKA,WArKV,EAAA,CAAA,oBAAA,MAAA,CAAA,CAAA,OAAA,EAsKO,6BAtKP,CAsKqC,WAtKrC,CAAA,EAAA,GAuKA,4BAvKA,CAuK6B,WAvK7B,CAAA"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { IMPLICIT, clearStore, editRelationsInStore, findInStore, findRelationsInStore, getFromStore, setIntoStore } from "atom.io/internal";
|
|
2
|
+
import { toEntries } from "atom.io/json";
|
|
3
|
+
import * as AtomIO from "atom.io";
|
|
4
|
+
import "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
import * as AR from "atom.io/react";
|
|
7
|
+
import * as RTC from "atom.io/realtime-client";
|
|
8
|
+
import * as RT from "atom.io/realtime";
|
|
9
|
+
import * as http from "node:http";
|
|
10
|
+
import { prettyDOM, render } from "@testing-library/react";
|
|
11
|
+
import * as RTR from "atom.io/realtime-react";
|
|
12
|
+
import * as RTS from "atom.io/realtime-server";
|
|
13
|
+
import * as Happy from "happy-dom";
|
|
14
|
+
import * as SocketIO from "socket.io";
|
|
15
|
+
import { io } from "socket.io-client";
|
|
16
|
+
|
|
17
|
+
//#region src/realtime-testing/setup-realtime-test.tsx
|
|
18
|
+
let testNumber = 0;
|
|
19
|
+
function prefixLogger(store, prefix) {
|
|
20
|
+
store.loggers[0] = new AtomIO.AtomIOLogger(`info`, void 0, {
|
|
21
|
+
info: (...args) => {
|
|
22
|
+
console.info(prefix, ...args);
|
|
23
|
+
},
|
|
24
|
+
warn: (...args) => {
|
|
25
|
+
console.warn(prefix, ...args);
|
|
26
|
+
},
|
|
27
|
+
error: (...args) => {
|
|
28
|
+
console.error(prefix, ...args);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const setupRealtimeTestServer = (options) => {
|
|
33
|
+
++testNumber;
|
|
34
|
+
const silo = new AtomIO.Silo({
|
|
35
|
+
name: `SERVER-${testNumber}`,
|
|
36
|
+
lifespan: options.immortal?.server ? `immortal` : `ephemeral`
|
|
37
|
+
}, IMPLICIT.STORE);
|
|
38
|
+
const socketRealm = new AtomIO.Realm(silo.store);
|
|
39
|
+
const httpServer = http.createServer((_, res) => res.end(`Hello World!`));
|
|
40
|
+
const address = httpServer.listen(options.port).address();
|
|
41
|
+
const port = typeof address === `string` ? null : address === null ? null : address.port;
|
|
42
|
+
if (port === null) throw new Error(`Could not determine port for test server`);
|
|
43
|
+
const server = new SocketIO.Server(httpServer).use((socket, next) => {
|
|
44
|
+
const { token, username } = socket.handshake.auth;
|
|
45
|
+
if (token === `test` && socket.id) {
|
|
46
|
+
const userClaim = socketRealm.allocate(`root`, `user::${username}`);
|
|
47
|
+
const socketClaim = socketRealm.allocate(`root`, `socket::${socket.id}`);
|
|
48
|
+
const socketState = findInStore(silo.store, RTS.socketAtoms, socketClaim);
|
|
49
|
+
setIntoStore(silo.store, socketState, socket);
|
|
50
|
+
editRelationsInStore(RTS.usersOfSockets, (relations) => {
|
|
51
|
+
relations.set(userClaim, socketClaim);
|
|
52
|
+
}, silo.store);
|
|
53
|
+
setIntoStore(silo.store, RTS.userIndex, (index) => index.add(userClaim));
|
|
54
|
+
setIntoStore(silo.store, RTS.socketIndex, (index) => index.add(socketClaim));
|
|
55
|
+
next();
|
|
56
|
+
} else next(new Error(`Authentication error`));
|
|
57
|
+
});
|
|
58
|
+
server.on(`connection`, (socket) => {
|
|
59
|
+
let userKey = null;
|
|
60
|
+
function enableLogging() {
|
|
61
|
+
const userKeyState = findRelationsInStore(RTS.usersOfSockets, `socket::${socket.id}`, silo.store).userKeyOfSocket;
|
|
62
|
+
userKey = getFromStore(silo.store, userKeyState);
|
|
63
|
+
prefixLogger(silo.store, `server`);
|
|
64
|
+
socket.onAny((event, ...args) => {
|
|
65
|
+
console.log(`🛰 `, userKey, event, ...args);
|
|
66
|
+
});
|
|
67
|
+
socket.onAnyOutgoing((event, ...args) => {
|
|
68
|
+
console.log(`🛰 >>`, userKey, event, ...args);
|
|
69
|
+
});
|
|
70
|
+
socket.on(`disconnect`, () => {
|
|
71
|
+
console.log(`${userKey} disconnected`);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
options.server({
|
|
75
|
+
socket,
|
|
76
|
+
enableLogging,
|
|
77
|
+
silo
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
const dispose = async () => {
|
|
81
|
+
await server.close();
|
|
82
|
+
const roomKeys = getFromStore(silo.store, RT.roomIndex);
|
|
83
|
+
for (const roomKey of roomKeys) {
|
|
84
|
+
const roomState = findInStore(silo.store, RTS.roomSelectors, roomKey);
|
|
85
|
+
const room = getFromStore(silo.store, roomState);
|
|
86
|
+
if (room && !(room instanceof Promise)) room.process.kill();
|
|
87
|
+
}
|
|
88
|
+
silo.store.valueMap.clear();
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
name: `SERVER`,
|
|
92
|
+
silo,
|
|
93
|
+
dispose,
|
|
94
|
+
port
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const setupRealtimeTestClient = (options, name, port) => {
|
|
98
|
+
const testClient = { dispose: () => {} };
|
|
99
|
+
const init = () => {
|
|
100
|
+
const socket = io(`http://localhost:${port}/`, { auth: {
|
|
101
|
+
token: `test`,
|
|
102
|
+
username: `${name}-${testNumber}`
|
|
103
|
+
} });
|
|
104
|
+
const silo = new AtomIO.Silo({
|
|
105
|
+
name,
|
|
106
|
+
lifespan: `ephemeral`
|
|
107
|
+
}, IMPLICIT.STORE);
|
|
108
|
+
for (const [key, value] of silo.store.valueMap.entries()) if (Array.isArray(value)) silo.store.valueMap.set(key, [...value]);
|
|
109
|
+
silo.setState(RTC.myUsernameState, `${name}-${testNumber}`);
|
|
110
|
+
const { document } = new Happy.Window();
|
|
111
|
+
document.body.innerHTML = `<div id="app"></div>`;
|
|
112
|
+
const renderResult = render(/* @__PURE__ */ jsx(AR.StoreProvider, {
|
|
113
|
+
store: silo.store,
|
|
114
|
+
children: /* @__PURE__ */ jsx(RTR.RealtimeProvider, {
|
|
115
|
+
socket,
|
|
116
|
+
children: /* @__PURE__ */ jsx(options.client, {})
|
|
117
|
+
})
|
|
118
|
+
}), { container: document.querySelector(`#app`) });
|
|
119
|
+
const prettyPrint = () => {
|
|
120
|
+
console.log(prettyDOM(renderResult.container));
|
|
121
|
+
};
|
|
122
|
+
const enableLogging = () => {
|
|
123
|
+
prefixLogger(silo.store, name);
|
|
124
|
+
socket.onAny((event, ...args) => {
|
|
125
|
+
console.log(`📡 `, name, event, ...args);
|
|
126
|
+
});
|
|
127
|
+
socket.onAnyOutgoing((event, ...args) => {
|
|
128
|
+
console.log(`📡 >>`, name, event, ...args);
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const dispose = () => {
|
|
132
|
+
renderResult.unmount();
|
|
133
|
+
socket.disconnect();
|
|
134
|
+
clearStore(silo.store);
|
|
135
|
+
};
|
|
136
|
+
testClient.dispose = dispose;
|
|
137
|
+
return {
|
|
138
|
+
name,
|
|
139
|
+
silo,
|
|
140
|
+
socket,
|
|
141
|
+
renderResult,
|
|
142
|
+
prettyPrint,
|
|
143
|
+
enableLogging
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
return Object.assign(testClient, { init });
|
|
147
|
+
};
|
|
148
|
+
const singleClient = (options) => {
|
|
149
|
+
const server = setupRealtimeTestServer(options);
|
|
150
|
+
const client = setupRealtimeTestClient(options, `CLIENT`, server.port);
|
|
151
|
+
return {
|
|
152
|
+
client,
|
|
153
|
+
server,
|
|
154
|
+
teardown: async () => {
|
|
155
|
+
await server.dispose();
|
|
156
|
+
client.dispose();
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
const multiClient = (options) => {
|
|
161
|
+
const server = setupRealtimeTestServer(options);
|
|
162
|
+
const clients = toEntries(options.clients).reduce((clientRecord, [name, client]) => {
|
|
163
|
+
clientRecord[name] = setupRealtimeTestClient({
|
|
164
|
+
...options,
|
|
165
|
+
client
|
|
166
|
+
}, name, server.port);
|
|
167
|
+
return clientRecord;
|
|
168
|
+
}, {});
|
|
169
|
+
return {
|
|
170
|
+
clients,
|
|
171
|
+
server,
|
|
172
|
+
teardown: async () => {
|
|
173
|
+
await server.dispose();
|
|
174
|
+
for (const [, client] of toEntries(clients)) client.dispose();
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
//#endregion
|
|
180
|
+
export { multiClient, setupRealtimeTestClient, setupRealtimeTestServer, singleClient };
|
|
181
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["store: Store","prefix: string","options: TestSetupOptions","socket: SocketIO.Socket","userKey: string | null","options: TestSetupOptions__SingleClient","name: string","port: number","socket: ClientSocket","options: TestSetupOptions__MultiClient<ClientNames>"],"sources":["../../src/realtime-testing/setup-realtime-test.tsx"],"sourcesContent":["import * as http from \"node:http\"\n\nimport type { RenderResult } from \"@testing-library/react\"\nimport { prettyDOM, render } from \"@testing-library/react\"\nimport * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tclearStore,\n\teditRelationsInStore,\n\tfindInStore,\n\tfindRelationsInStore,\n\tgetFromStore,\n\tIMPLICIT,\n\tsetIntoStore,\n} from \"atom.io/internal\"\nimport { toEntries } from \"atom.io/json\"\nimport * as AR from \"atom.io/react\"\nimport * as RT from \"atom.io/realtime\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as RTR from \"atom.io/realtime-react\"\nimport * as RTS from \"atom.io/realtime-server\"\nimport * as Happy from \"happy-dom\"\nimport * as React from \"react\"\nimport * as SocketIO from \"socket.io\"\nimport type { Socket as ClientSocket } from \"socket.io-client\"\nimport { io } from \"socket.io-client\"\n\nlet testNumber = 0\n\n/* eslint-disable no-console */\n\nfunction prefixLogger(store: Store, prefix: string) {\n\tstore.loggers[0] = new AtomIO.AtomIOLogger(`info`, undefined, {\n\t\tinfo: (...args) => {\n\t\t\tconsole.info(prefix, ...args)\n\t\t},\n\t\twarn: (...args) => {\n\t\t\tconsole.warn(prefix, ...args)\n\t\t},\n\t\terror: (...args) => {\n\t\t\tconsole.error(prefix, ...args)\n\t\t},\n\t})\n}\n\nexport type TestSetupOptions = {\n\tport: number\n\timmortal?: { server?: boolean }\n\tserver: (tools: {\n\t\tsocket: SocketIO.Socket\n\t\tsilo: AtomIO.Silo\n\t\tenableLogging: () => void\n\t}) => void\n}\nexport type TestSetupOptions__SingleClient = TestSetupOptions & {\n\tclient: React.FC\n}\nexport type TestSetupOptions__MultiClient<ClientNames extends string> =\n\tTestSetupOptions & {\n\t\tclients: {\n\t\t\t[K in ClientNames]: React.FC\n\t\t}\n\t}\n\nexport type RealtimeTestTools = {\n\tname: string\n\tsilo: AtomIO.Silo\n}\nexport type RealtimeTestClient = RealtimeTestTools & {\n\trenderResult: RenderResult\n\tprettyPrint: () => void\n\tenableLogging: () => void\n\tsocket: ClientSocket\n}\nexport type RealtimeTestClientBuilder = {\n\tdispose: () => void\n\tinit: () => RealtimeTestClient\n}\n\nexport type RealtimeTestServer = RealtimeTestTools & {\n\tdispose: () => Promise<void>\n\tport: number\n}\n\nexport type RealtimeTestAPI = {\n\tserver: RealtimeTestServer\n\tteardown: () => Promise<void>\n}\nexport type RealtimeTestAPI__SingleClient = RealtimeTestAPI & {\n\tclient: RealtimeTestClientBuilder\n}\nexport type RealtimeTestAPI__MultiClient<ClientNames extends string> =\n\tRealtimeTestAPI & {\n\t\tclients: Record<ClientNames, RealtimeTestClientBuilder>\n\t}\n\nexport const setupRealtimeTestServer = (\n\toptions: TestSetupOptions,\n): RealtimeTestServer => {\n\t++testNumber\n\tconst silo = new AtomIO.Silo(\n\t\t{\n\t\t\tname: `SERVER-${testNumber}`,\n\t\t\tlifespan: options.immortal?.server ? `immortal` : `ephemeral`,\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\tconst socketRealm = new AtomIO.Realm<RTS.SocketSystemHierarchy>(silo.store)\n\n\tconst httpServer = http.createServer((_, res) => res.end(`Hello World!`))\n\tconst address = httpServer.listen(options.port).address()\n\tconst port =\n\t\ttypeof address === `string` ? null : address === null ? null : address.port\n\tif (port === null) throw new Error(`Could not determine port for test server`)\n\n\tconst server = new SocketIO.Server(httpServer).use((socket, next) => {\n\t\tconst { token, username } = socket.handshake.auth\n\t\tif (token === `test` && socket.id) {\n\t\t\tconst userClaim = socketRealm.allocate(`root`, `user::${username}`)\n\t\t\tconst socketClaim = socketRealm.allocate(`root`, `socket::${socket.id}`)\n\t\t\tconst socketState = findInStore(silo.store, RTS.socketAtoms, socketClaim)\n\t\t\tsetIntoStore(silo.store, socketState, socket)\n\t\t\teditRelationsInStore(\n\t\t\t\tRTS.usersOfSockets,\n\t\t\t\t(relations) => {\n\t\t\t\t\trelations.set(userClaim, socketClaim)\n\t\t\t\t},\n\t\t\t\tsilo.store,\n\t\t\t)\n\t\t\tsetIntoStore(silo.store, RTS.userIndex, (index) => index.add(userClaim))\n\t\t\tsetIntoStore(silo.store, RTS.socketIndex, (index) =>\n\t\t\t\tindex.add(socketClaim),\n\t\t\t)\n\t\t\t// console.log(`${username} connected on ${socket.id}`)\n\t\t\tnext()\n\t\t} else {\n\t\t\tnext(new Error(`Authentication error`))\n\t\t}\n\t})\n\n\tserver.on(`connection`, (socket: SocketIO.Socket) => {\n\t\tlet userKey: string | null = null\n\t\tfunction enableLogging() {\n\t\t\tconst userKeyState = findRelationsInStore(\n\t\t\t\tRTS.usersOfSockets,\n\t\t\t\t`socket::${socket.id}`,\n\t\t\t\tsilo.store,\n\t\t\t).userKeyOfSocket\n\t\t\tuserKey = getFromStore(silo.store, userKeyState)\n\t\t\tprefixLogger(silo.store, `server`)\n\t\t\tsocket.onAny((event, ...args) => {\n\t\t\t\tconsole.log(`🛰 `, userKey, event, ...args)\n\t\t\t})\n\t\t\tsocket.onAnyOutgoing((event, ...args) => {\n\t\t\t\tconsole.log(`🛰 >>`, userKey, event, ...args)\n\t\t\t})\n\t\t\tsocket.on(`disconnect`, () => {\n\t\t\t\tconsole.log(`${userKey} disconnected`)\n\t\t\t})\n\t\t}\n\t\toptions.server({ socket, enableLogging, silo })\n\t})\n\n\tconst dispose = async () => {\n\t\tawait server.close()\n\t\tconst roomKeys = getFromStore(silo.store, RT.roomIndex)\n\t\tfor (const roomKey of roomKeys) {\n\t\t\tconst roomState = findInStore(silo.store, RTS.roomSelectors, roomKey)\n\t\t\tconst room = getFromStore(silo.store, roomState)\n\t\t\tif (room && !(room instanceof Promise)) {\n\t\t\t\troom.process.kill()\n\t\t\t}\n\t\t}\n\t\tsilo.store.valueMap.clear()\n\t}\n\n\treturn {\n\t\tname: `SERVER`,\n\t\tsilo,\n\t\tdispose,\n\t\tport,\n\t}\n}\nexport const setupRealtimeTestClient = (\n\toptions: TestSetupOptions__SingleClient,\n\tname: string,\n\tport: number,\n): RealtimeTestClientBuilder => {\n\tconst testClient = { dispose: () => {} }\n\tconst init = () => {\n\t\tconst socket: ClientSocket = io(`http://localhost:${port}/`, {\n\t\t\tauth: { token: `test`, username: `${name}-${testNumber}` },\n\t\t})\n\t\tconst silo = new AtomIO.Silo({ name, lifespan: `ephemeral` }, IMPLICIT.STORE)\n\t\tfor (const [key, value] of silo.store.valueMap.entries()) {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tsilo.store.valueMap.set(key, [...value])\n\t\t\t}\n\t\t}\n\t\tsilo.setState(RTC.myUsernameState, `${name}-${testNumber}`)\n\n\t\tconst { document } = new Happy.Window()\n\t\tdocument.body.innerHTML = `<div id=\"app\"></div>`\n\t\tconst renderResult = render(\n\t\t\t<AR.StoreProvider store={silo.store}>\n\t\t\t\t<RTR.RealtimeProvider socket={socket}>\n\t\t\t\t\t<options.client />\n\t\t\t\t</RTR.RealtimeProvider>\n\t\t\t</AR.StoreProvider>,\n\t\t\t{\n\t\t\t\tcontainer: document.querySelector(`#app`) as unknown as HTMLElement,\n\t\t\t},\n\t\t)\n\n\t\tconst prettyPrint = () => {\n\t\t\tconsole.log(prettyDOM(renderResult.container))\n\t\t}\n\n\t\tconst enableLogging = () => {\n\t\t\tprefixLogger(silo.store, name)\n\t\t\tsocket.onAny((event, ...args) => {\n\t\t\t\tconsole.log(`📡 `, name, event, ...args)\n\t\t\t})\n\t\t\tsocket.onAnyOutgoing((event, ...args) => {\n\t\t\t\tconsole.log(`📡 >>`, name, event, ...args)\n\t\t\t})\n\t\t}\n\n\t\tconst dispose = () => {\n\t\t\trenderResult.unmount()\n\t\t\tsocket.disconnect()\n\t\t\tclearStore(silo.store)\n\t\t}\n\t\ttestClient.dispose = dispose\n\n\t\treturn {\n\t\t\tname,\n\t\t\tsilo,\n\t\t\tsocket,\n\t\t\trenderResult,\n\t\t\tprettyPrint,\n\t\t\tenableLogging,\n\t\t}\n\t}\n\treturn Object.assign(testClient, { init })\n}\n\nexport const singleClient = (\n\toptions: TestSetupOptions__SingleClient,\n): RealtimeTestAPI__SingleClient => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst client = setupRealtimeTestClient(options, `CLIENT`, server.port)\n\n\treturn {\n\t\tclient,\n\t\tserver,\n\t\tteardown: async () => {\n\t\t\tawait server.dispose()\n\t\t\tclient.dispose()\n\t\t},\n\t}\n}\n\nexport const multiClient = <ClientNames extends string>(\n\toptions: TestSetupOptions__MultiClient<ClientNames>,\n): RealtimeTestAPI__MultiClient<ClientNames> => {\n\tconst server = setupRealtimeTestServer(options)\n\tconst clients = toEntries(options.clients).reduce(\n\t\t(clientRecord, [name, client]) => {\n\t\t\tclientRecord[name] = setupRealtimeTestClient(\n\t\t\t\t{ ...options, client },\n\t\t\t\tname,\n\t\t\t\tserver.port,\n\t\t\t)\n\t\t\treturn clientRecord\n\t\t},\n\t\t{} as Record<ClientNames, RealtimeTestClientBuilder>,\n\t)\n\n\treturn {\n\t\tclients,\n\t\tserver,\n\t\tteardown: async () => {\n\t\t\tawait server.dispose()\n\t\t\tfor (const [, client] of toEntries(clients)) {\n\t\t\t\tclient.dispose()\n\t\t\t}\n\t\t},\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Lineage, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
|
+
import { Json, primitive } from "atom.io/json";
|
|
3
|
+
|
|
4
|
+
//#region src/transceivers/set-rtx/set-rtx.d.ts
|
|
5
|
+
type SetUpdateType = `add` | `clear` | `del` | `tx`;
|
|
6
|
+
type SetUpdate = `${SetUpdateType}:${string}`;
|
|
7
|
+
type NumberedSetUpdate = `${number}=${SetUpdate}`;
|
|
8
|
+
interface SetRTXJson<P extends primitive> extends Json.Object {
|
|
9
|
+
members: P[];
|
|
10
|
+
cache: (NumberedSetUpdate | null)[];
|
|
11
|
+
cacheLimit: number;
|
|
12
|
+
cacheIdx: number;
|
|
13
|
+
cacheUpdateNumber: number;
|
|
14
|
+
}
|
|
15
|
+
declare class SetRTX<P extends primitive> extends Set<P> implements Transceiver<NumberedSetUpdate>, Lineage {
|
|
16
|
+
mode: TransceiverMode;
|
|
17
|
+
readonly subject: Subject<SetUpdate>;
|
|
18
|
+
cacheLimit: number;
|
|
19
|
+
cache: (NumberedSetUpdate | null)[];
|
|
20
|
+
cacheIdx: number;
|
|
21
|
+
cacheUpdateNumber: number;
|
|
22
|
+
constructor(values?: Iterable<P>, cacheLimit?: number);
|
|
23
|
+
toJSON(): SetRTXJson<P>;
|
|
24
|
+
static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P>;
|
|
25
|
+
add(value: P): this;
|
|
26
|
+
clear(): void;
|
|
27
|
+
delete(value: P): boolean;
|
|
28
|
+
readonly parent: SetRTX<P> | null;
|
|
29
|
+
child: SetRTX<P> | null;
|
|
30
|
+
transactionUpdates: SetUpdate[] | null;
|
|
31
|
+
transaction(run: (child: SetRTX<P>) => boolean): void;
|
|
32
|
+
protected _subscribe(key: string, fn: (update: SetUpdate) => void): () => void;
|
|
33
|
+
subscribe(key: string, fn: (update: NumberedSetUpdate) => void): () => void;
|
|
34
|
+
emit(update: SetUpdate): void;
|
|
35
|
+
private doStep;
|
|
36
|
+
getUpdateNumber(update: NumberedSetUpdate): number;
|
|
37
|
+
do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null;
|
|
38
|
+
undoStep(update: SetUpdate): void;
|
|
39
|
+
undo(update: NumberedSetUpdate): number | null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { NumberedSetUpdate, SetRTX, SetRTXJson, SetUpdate, SetUpdateType };
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["values?: Iterable<P>","json: SetRTXJson<P>","value: P","run: (child: SetRTX<P>) => boolean","child: SetRTX<P>","key: string","fn: (update: SetUpdate) => void","update: SetUpdate","fn: (update: NumberedSetUpdate) => void","update: NumberedSetUpdate"],"sources":["../../../src/transceivers/set-rtx/set-rtx.ts"],"sourcesContent":null,"mappings":";;;;KAKY,aAAA;AAAA,KACA,SAAA,GADA,GACe,aADf,IAAA,MAAA,EAAA;AACA,KACA,iBAAA,GADe,GAAA,MAAA,IACkB,SADlB,EAAA;AACf,UAEK,UAFL,CAAA,UAE0B,SAFO,CAAA,SAEY,IAAA,CAAK,MAFjB,CAAA;EAE7C,OAAiB,EACP,CADO,EAAA;EAAA,KAAA,EAAA,CAER,iBAFQ,GAAA,IAAA,CAAA,EAAA;EAAA,UAAqB,EAAA,MAAA;EAAA,QAC5B,EAAA,MAAA;EAAA,iBACD,EAAA,MAAA;;AAFqD,cAOjD,MAPiD,CAAA,UAOhC,SAPgC,CAAA,SAQrD,GARqD,CAQjD,CARiD,CAAA,YASlD,WATkD,CAStC,iBATsC,CAAA,EASlB,OATkB,CAAA;EAO9D,IAAa,EAIC,eAJD;EAAA,SAAA,OAAA,EAKa,OALb,CAKqB,SALrB,CAAA;EAAA,UAAiB,EAAA,MAAA;EAAA,KAAA,EACjB,CAMG,iBANH,GAAA,IAAA,CAAA,EAAA;EAAA,QACW,EAAA,MAAA;EAAA,iBAEV,EAAA,MAAA;EAAA,WACoB,CAAA,MAAA,CAAA,EAML,QANK,CAMI,CANJ,CAAA,EAAA,UAAA,CAAA,EAAA,MAAA;EAAA,MAAR,CAAA,CAAA,EAuBR,UAvBQ,CAuBG,CAvBH,CAAA;EAAA,OAEV,QAAA,CAAA,UA+BkB,SA/BlB,CAAA,CAAA,IAAA,EA+BmC,UA/BnC,CA+B8C,CA/B9C,CAAA,CAAA,EA+BmD,MA/BnD,CA+B0D,CA/B1D,CAAA;EAAA,GAAA,CAAA,KAIsB,EAmCnB,CAnCmB,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,CAAT,EAAA,IAAA;EAAA,MAiBA,CAAA,KAAA,EAoCP,CApCO,CAAA,EAAA,OAAA;EAAA,SAAX,MAAA,EA6CO,MA7CP,CA6Cc,CA7Cd,CAAA,GAAA,IAAA;EAAA,KAAA,EA8CH,MApCmB,CAoCZ,CApCY,CAAA,GAAA,IAAA;EAAA,kBAA4B,EAqClC,SArCkC,EAAA,GAAA,IAAA;EAAA,WAAX,CAAA,GAAA,EAAA,CAAA,KAAA,EAsClB,MAtCkB,CAsCX,CAtCW,CAAA,EAAA,GAAA,OAAA,CAAA,EAAA,IAAA;EAAA,UAAuB,UAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAuE3D,SAvE2D,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAA,SAAP,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EA6EpD,iBA7EoD,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAA,IAAA,CAAA,MAQhD,EA4EE,SA5EF,CAAA,EAAA,IAAA;EAAA,QAkBG,MAAA;EAAA,eASU,CAAA,MAAA,EA0EA,iBA1EA,CAAA,EAAA,MAAA;EAAA,EAAA,CAAA,MAAP,EA+EN,iBA/EM,CAAA,EAAA,MAAA,GAAA,cAAA,GAAA,IAAA;EAAA,QACH,CAAA,MAAA,EAyHG,SAzHH,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,MAAP,EAkJM,iBAlJN,CAAA,EAAA,MAAA,GAAA,IAAA"}
|