atom.io 0.16.1 → 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +31 -14
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.js +31 -14
- package/data/dist/index.js.map +1 -1
- package/data/src/join.ts +31 -14
- package/dist/chunk-H4Q5FTPZ.js +11 -0
- package/dist/chunk-H4Q5FTPZ.js.map +1 -0
- package/dist/index.cjs +7 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +8 -14
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +240 -193
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +30 -9
- package/internal/dist/index.js +233 -194
- package/internal/dist/index.js.map +1 -1
- package/internal/src/families/find-in-store.ts +74 -0
- package/internal/src/families/index.ts +1 -0
- package/internal/src/ingest-updates/ingest-transaction-update.ts +1 -0
- package/internal/src/mutable/tracker.ts +37 -32
- package/internal/src/mutable/transceiver.ts +1 -1
- package/internal/src/not-found-error.ts +14 -3
- package/internal/src/operation.ts +2 -1
- package/internal/src/selector/create-writable-selector.ts +2 -1
- package/internal/src/selector/register-selector.ts +5 -4
- package/internal/src/set-state/set-atom.ts +23 -6
- package/internal/src/set-state/stow-update.ts +2 -4
- package/internal/src/store/store.ts +13 -4
- package/internal/src/timeline/add-atom-to-timeline.ts +5 -5
- package/internal/src/transaction/abort-transaction.ts +2 -1
- package/internal/src/transaction/apply-transaction.ts +5 -3
- package/internal/src/transaction/build-transaction.ts +17 -10
- package/internal/src/transaction/create-transaction.ts +2 -3
- package/internal/src/transaction/index.ts +3 -2
- package/internal/src/transaction/is-root-store.ts +23 -0
- package/package.json +10 -10
- package/react/dist/index.cjs +27 -21
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +8 -2
- package/react/dist/index.js +27 -21
- package/react/dist/index.js.map +1 -1
- package/react/src/index.ts +4 -1
- package/react/src/use-i.ts +36 -0
- package/react/src/use-json.ts +38 -0
- package/react/src/use-o.ts +34 -0
- package/react/src/use-tl.ts +45 -0
- package/realtime-client/dist/index.cjs +163 -62
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +10 -6
- package/realtime-client/dist/index.js +153 -60
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +2 -1
- package/realtime-client/src/pull-state.ts +4 -3
- package/realtime-client/src/{realtime-client-store.ts → realtime-client-stores/client-main-store.ts} +0 -8
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +15 -0
- package/realtime-client/src/realtime-client-stores/index.ts +2 -0
- package/realtime-client/src/sync-server-action.ts +131 -39
- package/realtime-client/src/sync-state.ts +19 -0
- package/realtime-react/dist/index.cjs +43 -26
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +3 -1
- package/realtime-react/dist/index.js +41 -25
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +1 -0
- package/realtime-react/src/on-mount.ts +3 -21
- package/realtime-react/src/use-realtime-service.ts +1 -1
- package/realtime-react/src/use-server-action.ts +1 -1
- package/realtime-react/src/use-single-effect.ts +29 -0
- package/realtime-react/src/use-sync-server-action.ts +5 -8
- package/realtime-react/src/use-sync.ts +17 -0
- package/realtime-server/dist/index.cjs +242 -48
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +147 -9
- package/realtime-server/dist/index.js +232 -51
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +2 -0
- package/realtime-server/src/realtime-action-receiver.ts +4 -3
- package/realtime-server/src/realtime-action-synchronizer.ts +100 -13
- package/realtime-server/src/realtime-family-provider.ts +10 -6
- package/realtime-server/src/realtime-mutable-family-provider.ts +15 -18
- package/realtime-server/src/realtime-mutable-provider.ts +1 -0
- package/realtime-server/src/realtime-server-stores/index.ts +2 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +115 -0
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +45 -0
- package/realtime-server/src/realtime-state-provider.ts +16 -8
- package/realtime-server/src/realtime-state-receiver.ts +1 -0
- package/realtime-server/src/realtime-state-synchronizer.ts +23 -0
- package/realtime-testing/dist/index.cjs +65 -26
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.ts +11 -7
- package/realtime-testing/dist/index.js +64 -26
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +83 -43
- package/src/find-state.ts +8 -16
- package/src/logger.ts +16 -11
- package/src/transaction.ts +4 -4
- package/react/src/store-hooks.ts +0 -87
- package/realtime-server/src/realtime-server-store.ts +0 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/realtime-state-provider.ts","../src/realtime-family-provider.ts","../src/realtime-mutable-provider.ts","../src/realtime-mutable-family-provider.ts","../src/realtime-state-receiver.ts","../src/realtime-action-receiver.ts","../src/realtime-action-synchronizer.ts","../src/realtime-server-store.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\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) | null = null\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(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttoken,\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\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\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 * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<J extends Json.Serializable>(\n\t\tfamily: AtomIO.RegularAtomFamily<J, Json.Serializable>,\n\t\tindex: AtomIO.ReadableToken<Iterable<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = AtomIO.findInStore(family, key, store)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token: AtomIO.WritableToken<J>) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\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 unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\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(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}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\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\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\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 * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport const realtimeMutableFamilyProvider = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function mutableFamilyProvider<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.ReadableToken<Iterable<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\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 unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\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) => setState(token, newValue, store)\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","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport const realtimeActionReceiver = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function actionReceiver<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\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\tAtomIO.runTransaction<ƒ>(tx, store)(...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 () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToTransaction } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\ttransactionRedactorAtoms,\n} from \"./realtime-server-store\"\n\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tif (filter) {\n\t\t\tAtomIO.setState(\n\t\t\t\tAtomIO.findState(transactionRedactorAtoms, tx.key),\n\t\t\t\t{ filter },\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tconst unsubscribe = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tconst updateState = AtomIO.findState(completeUpdateAtoms, update.id)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tAtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribe)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nexport const completeUpdateAtoms = AtomIO.atomFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = AtomIO.atomFamily<\n\t{\n\t\tfilter: (\n\t\t\tupdates: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\n\nexport const redactedUpdateSelectors = AtomIO.selectorFamily<\n\tAtomIO.TransactionUpdate<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"]}
|
|
1
|
+
{"version":3,"sources":["../src/realtime-server-stores/server-user-store.ts","../src/realtime-server-stores/server-sync-store.ts","../src/realtime-state-provider.ts","../src/realtime-state-synchronizer.ts","../src/realtime-family-provider.ts","../src/realtime-mutable-provider.ts","../src/realtime-mutable-family-provider.ts","../src/realtime-state-receiver.ts","../src/realtime-action-receiver.ts","../src/realtime-action-synchronizer.ts"],"names":["atomFamily","AtomIO","IMPLICIT","subscribeToState","_a","findInStore","getJsonToken","getUpdateToken","parseJson"],"mappings":"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","sourcesContent":["import { atom, atomFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nexport const userIndex = atom({\n\tkey: `usersIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport const usersOfSockets = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n})\n\nexport const roomIndex = atom({\n\tkey: `conclaveIndex`,\n\tdefault: () => new SetRTX<string>(),\n\tmutable: true,\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms = join(\n\t{\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t},\n\tDEFAULT_USER_IN_ROOM_META,\n)\n\n// export const roomStoreAtoms = atomFamily<\n// \t{ [key: string]: any },\n// \t{ conclave: string }\n// >({\n\n// })\n","import type { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\nimport { SyncGroup } from \"~/packages/atom.io/__unstable__/realtime-server-next/create-realtime-sync-group\"\nimport { usersOfSockets } from \"./server-user-store\"\n\nexport const completeUpdateAtoms = atomFamily<\n\tTransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = atomFamily<\n\t{\n\t\tfilter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\nexport 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 const userUnacknowledgedUpdatesAtoms = atomFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n\nexport const socketUnacknowledgedUpdatesSelectors = selectorFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `socketUnacknowledgedUpdates`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tconst unacknowledgedUpdates = get(unacknowledgedUpdatesState)\n\t\t\treturn unacknowledgedUpdates\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newUpdates) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tset(unacknowledgedUpdatesState, newUpdates)\n\t\t},\n})\n\nexport const userEpochAtoms = atomFamily<number | null, string>({\n\tkey: `clientEpoch`,\n\tdefault: null,\n})\n\nexport const socketEpochSelectors = selectorFamily<number | null, string>({\n\tkey: `socketEpoch`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tconst userEpoch = get(userEpochState)\n\t\t\treturn userEpoch\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newEpoch) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tset(userEpochState, newEpoch)\n\t\t},\n})\n","import * as AtomIO from \"atom.io\"\nimport { 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}`, AtomIO.getState(token, store))\n\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttoken,\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\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\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 * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeStateSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateSynchronizer<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tconst fillGetRequest = () => {\n\t\t\tsocket.emit(`value:${token.key}`, AtomIO.getState(token, store))\n\t\t}\n\n\t\tsocket.on(`get:${token.key}`, fillGetRequest)\n\t\treturn () => {\n\t\t\tsocket.off(`get:${token.key}`, fillGetRequest)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeFamilyProvider>\nexport function realtimeFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamily<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token: AtomIO.WritableToken<J>) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\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 unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } 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(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}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\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\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\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 * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } 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 Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamily<T, J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\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 unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport { IMPLICIT } 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) => setState(token, newValue, store)\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","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\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<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\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\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...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 () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToTransaction } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\nimport { usersOfSockets } from \"./realtime-server-stores\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\tsocketEpochSelectors,\n\tsocketUnacknowledgedUpdatesSelectors,\n\ttransactionRedactorAtoms,\n} from \"./realtime-server-stores/server-sync-store\"\n\nexport type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tconst userKeyState = findInStore(\n\t\t\tusersOfSockets.states.userKeyOfSocket,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst userKey = AtomIO.getState(userKeyState, store)\n\t\tconst socketUnacknowledgedUpdatesState = findInStore(\n\t\t\tsocketUnacknowledgedUpdatesSelectors,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst socketUnacknowledgedUpdates = AtomIO.getState(\n\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\tstore,\n\t\t)\n\t\tif (filter) {\n\t\t\tconst redactorState = findInStore(transactionRedactorAtoms, tx.key, store)\n\t\t\tAtomIO.setState(redactorState, { filter }, store)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\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\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...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.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tlet unsubscribeFromTransaction: (() => void) | undefined\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tunsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tconst updateState = findInStore(completeUpdateAtoms, update.id, store)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tfindInStore(redactedUpdateSelectors, [tx.key, update.id], store),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\n\t\t\t\t\t// the problem is that only while a socket is connected can\n\t\t\t\t\t// updates be set in the queue for that socket's client.\n\t\t\t\t\t//\n\t\t\t\t\t// we need a client session that can persist between disconnects\n\t\t\t\t\tAtomIO.setState(\n\t\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t\t(updates) => {\n\t\t\t\t\t\t\tif (toEmit) {\n\t\t\t\t\t\t\t\tupdates.push(toEmit)\n\t\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updates\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\tlet i = 1\n\t\tlet next = 1\n\t\tconst retry = setInterval(() => {\n\t\t\tconst toEmit = socketUnacknowledgedUpdates[0]\n\t\t\tconsole.log(userKey, socketUnacknowledgedUpdates)\n\t\t\tif (toEmit && i === next) {\n\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\tnext *= 2\n\t\t\t}\n\n\t\t\ti++\n\t\t}, 250)\n\n\t\tconst trackClientAcknowledgement = (epoch: number) => {\n\t\t\ti = 1\n\t\t\tnext = 1\n\t\t\tconst socketEpochState = findInStore(\n\t\t\t\tsocketEpochSelectors,\n\t\t\t\tsocket.id,\n\t\t\t\tstore,\n\t\t\t)\n\n\t\t\tAtomIO.setState(socketEpochState, epoch, store)\n\t\t\tif (socketUnacknowledgedUpdates[0]?.epoch === epoch) {\n\t\t\t\tAtomIO.setState(\n\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t(updates) => {\n\t\t\t\t\t\tupdates.shift()\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t},\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tsocket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\tif (unsubscribeFromTransaction) {\n\t\t\t\tunsubscribeFromTransaction()\n\t\t\t\tunsubscribeFromTransaction = undefined\n\t\t\t}\n\t\t\tclearInterval(retry)\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t\tsocket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Store } from "atom.io/internal"
|
|
2
2
|
import type * as SocketIO from "socket.io"
|
|
3
3
|
|
|
4
|
+
export * from "./realtime-server-stores"
|
|
4
5
|
export * from "./realtime-state-provider"
|
|
6
|
+
export * from "./realtime-state-synchronizer"
|
|
5
7
|
export * from "./realtime-family-provider"
|
|
6
8
|
export * from "./realtime-mutable-provider"
|
|
7
9
|
export * from "./realtime-mutable-family-provider"
|
|
@@ -3,10 +3,11 @@ import { IMPLICIT } from "atom.io/internal"
|
|
|
3
3
|
|
|
4
4
|
import type { ServerConfig } from "."
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type ActionReceiver = ReturnType<typeof realtimeActionReceiver>
|
|
7
|
+
export function realtimeActionReceiver({
|
|
7
8
|
socket,
|
|
8
9
|
store = IMPLICIT.STORE,
|
|
9
|
-
}: ServerConfig)
|
|
10
|
+
}: ServerConfig) {
|
|
10
11
|
return function actionReceiver<ƒ extends AtomIO.ƒn>(
|
|
11
12
|
tx: AtomIO.TransactionToken<ƒ>,
|
|
12
13
|
): () => void {
|
|
@@ -15,7 +16,7 @@ export const realtimeActionReceiver = ({
|
|
|
15
16
|
const performanceKeyStart = `${performanceKey}:start`
|
|
16
17
|
const performanceKeyEnd = `${performanceKey}:end`
|
|
17
18
|
performance.mark(performanceKeyStart)
|
|
18
|
-
AtomIO.runTransaction<ƒ>(tx, store)(...update.params)
|
|
19
|
+
AtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)
|
|
19
20
|
performance.mark(performanceKeyEnd)
|
|
20
21
|
const metric = performance.measure(
|
|
21
22
|
performanceKey,
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import * as AtomIO from "atom.io"
|
|
2
|
-
import { IMPLICIT, subscribeToTransaction } from "atom.io/internal"
|
|
2
|
+
import { IMPLICIT, findInStore, subscribeToTransaction } from "atom.io/internal"
|
|
3
3
|
|
|
4
4
|
import type { ServerConfig } from "."
|
|
5
|
+
import { usersOfSockets } from "./realtime-server-stores"
|
|
5
6
|
import {
|
|
6
7
|
completeUpdateAtoms,
|
|
7
8
|
redactedUpdateSelectors,
|
|
9
|
+
socketEpochSelectors,
|
|
10
|
+
socketUnacknowledgedUpdatesSelectors,
|
|
8
11
|
transactionRedactorAtoms,
|
|
9
|
-
} from "./realtime-server-store"
|
|
12
|
+
} from "./realtime-server-stores/server-sync-store"
|
|
10
13
|
|
|
14
|
+
export type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>
|
|
11
15
|
export function realtimeActionSynchronizer({
|
|
12
16
|
socket,
|
|
13
17
|
store = IMPLICIT.STORE,
|
|
@@ -18,42 +22,125 @@ export function realtimeActionSynchronizer({
|
|
|
18
22
|
update: AtomIO.TransactionUpdateContent[],
|
|
19
23
|
) => AtomIO.TransactionUpdateContent[],
|
|
20
24
|
): () => void {
|
|
25
|
+
const userKeyState = findInStore(
|
|
26
|
+
usersOfSockets.states.userKeyOfSocket,
|
|
27
|
+
socket.id,
|
|
28
|
+
store,
|
|
29
|
+
)
|
|
30
|
+
const userKey = AtomIO.getState(userKeyState, store)
|
|
31
|
+
const socketUnacknowledgedUpdatesState = findInStore(
|
|
32
|
+
socketUnacknowledgedUpdatesSelectors,
|
|
33
|
+
socket.id,
|
|
34
|
+
store,
|
|
35
|
+
)
|
|
36
|
+
const socketUnacknowledgedUpdates = AtomIO.getState(
|
|
37
|
+
socketUnacknowledgedUpdatesState,
|
|
38
|
+
store,
|
|
39
|
+
)
|
|
21
40
|
if (filter) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{ filter },
|
|
25
|
-
store,
|
|
26
|
-
)
|
|
41
|
+
const redactorState = findInStore(transactionRedactorAtoms, tx.key, store)
|
|
42
|
+
AtomIO.setState(redactorState, { filter }, store)
|
|
27
43
|
}
|
|
28
44
|
const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {
|
|
29
|
-
|
|
45
|
+
const performanceKey = `tx-run:${tx.key}:${update.id}`
|
|
46
|
+
const performanceKeyStart = `${performanceKey}:start`
|
|
47
|
+
const performanceKeyEnd = `${performanceKey}:end`
|
|
48
|
+
performance.mark(performanceKeyStart)
|
|
49
|
+
AtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)
|
|
50
|
+
performance.mark(performanceKeyEnd)
|
|
51
|
+
const metric = performance.measure(
|
|
52
|
+
performanceKey,
|
|
53
|
+
performanceKeyStart,
|
|
54
|
+
performanceKeyEnd,
|
|
55
|
+
)
|
|
56
|
+
store?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)
|
|
30
57
|
}
|
|
58
|
+
socket.off(`tx-run:${tx.key}`, fillTransactionRequest)
|
|
31
59
|
socket.on(`tx-run:${tx.key}`, fillTransactionRequest)
|
|
32
60
|
|
|
61
|
+
let unsubscribeFromTransaction: (() => void) | undefined
|
|
33
62
|
const fillTransactionSubscriptionRequest = () => {
|
|
34
|
-
|
|
63
|
+
unsubscribeFromTransaction = subscribeToTransaction(
|
|
35
64
|
tx,
|
|
36
65
|
(update) => {
|
|
37
|
-
|
|
38
|
-
const updateState = AtomIO.findState(completeUpdateAtoms, update.id)
|
|
66
|
+
const updateState = findInStore(completeUpdateAtoms, update.id, store)
|
|
39
67
|
AtomIO.setState(updateState, update, store)
|
|
40
68
|
const toEmit = filter
|
|
41
69
|
? AtomIO.getState(
|
|
42
|
-
|
|
70
|
+
findInStore(redactedUpdateSelectors, [tx.key, update.id], store),
|
|
43
71
|
store,
|
|
44
72
|
)
|
|
45
73
|
: update
|
|
74
|
+
|
|
75
|
+
// the problem is that only while a socket is connected can
|
|
76
|
+
// updates be set in the queue for that socket's client.
|
|
77
|
+
//
|
|
78
|
+
// we need a client session that can persist between disconnects
|
|
79
|
+
AtomIO.setState(
|
|
80
|
+
socketUnacknowledgedUpdatesState,
|
|
81
|
+
(updates) => {
|
|
82
|
+
if (toEmit) {
|
|
83
|
+
updates.push(toEmit)
|
|
84
|
+
updates.sort((a, b) => a.epoch - b.epoch)
|
|
85
|
+
}
|
|
86
|
+
return updates
|
|
87
|
+
},
|
|
88
|
+
store,
|
|
89
|
+
)
|
|
90
|
+
|
|
46
91
|
socket.emit(`tx-new:${tx.key}`, toEmit)
|
|
47
92
|
},
|
|
48
93
|
`tx-sub:${tx.key}:${socket.id}`,
|
|
49
94
|
store,
|
|
50
95
|
)
|
|
51
|
-
socket.on(`tx-unsub:${tx.key}`,
|
|
96
|
+
socket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction)
|
|
52
97
|
}
|
|
53
98
|
socket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)
|
|
54
99
|
|
|
100
|
+
let i = 1
|
|
101
|
+
let next = 1
|
|
102
|
+
const retry = setInterval(() => {
|
|
103
|
+
const toEmit = socketUnacknowledgedUpdates[0]
|
|
104
|
+
console.log(userKey, socketUnacknowledgedUpdates)
|
|
105
|
+
if (toEmit && i === next) {
|
|
106
|
+
socket.emit(`tx-new:${tx.key}`, toEmit)
|
|
107
|
+
next *= 2
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
i++
|
|
111
|
+
}, 250)
|
|
112
|
+
|
|
113
|
+
const trackClientAcknowledgement = (epoch: number) => {
|
|
114
|
+
i = 1
|
|
115
|
+
next = 1
|
|
116
|
+
const socketEpochState = findInStore(
|
|
117
|
+
socketEpochSelectors,
|
|
118
|
+
socket.id,
|
|
119
|
+
store,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
AtomIO.setState(socketEpochState, epoch, store)
|
|
123
|
+
if (socketUnacknowledgedUpdates[0]?.epoch === epoch) {
|
|
124
|
+
AtomIO.setState(
|
|
125
|
+
socketUnacknowledgedUpdatesState,
|
|
126
|
+
(updates) => {
|
|
127
|
+
updates.shift()
|
|
128
|
+
return updates
|
|
129
|
+
},
|
|
130
|
+
store,
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
socket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement)
|
|
135
|
+
|
|
55
136
|
return () => {
|
|
137
|
+
if (unsubscribeFromTransaction) {
|
|
138
|
+
unsubscribeFromTransaction()
|
|
139
|
+
unsubscribeFromTransaction = undefined
|
|
140
|
+
}
|
|
141
|
+
clearInterval(retry)
|
|
56
142
|
socket.off(`tx-run:${tx.key}`, fillTransactionRequest)
|
|
143
|
+
socket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)
|
|
57
144
|
}
|
|
58
145
|
}
|
|
59
146
|
}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import * as AtomIO from "atom.io"
|
|
2
|
-
import { IMPLICIT, subscribeToState } from "atom.io/internal"
|
|
2
|
+
import { IMPLICIT, findInStore, subscribeToState } from "atom.io/internal"
|
|
3
3
|
import type { Json } from "atom.io/json"
|
|
4
4
|
import { parseJson } from "atom.io/json"
|
|
5
5
|
|
|
6
6
|
import type { ServerConfig } from "."
|
|
7
7
|
|
|
8
|
+
export type FamilyProvider = ReturnType<typeof realtimeFamilyProvider>
|
|
8
9
|
export function realtimeFamilyProvider({
|
|
9
10
|
socket,
|
|
10
11
|
store = IMPLICIT.STORE,
|
|
11
12
|
}: ServerConfig) {
|
|
12
|
-
return function familyProvider<
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
return function familyProvider<
|
|
14
|
+
J extends Json.Serializable,
|
|
15
|
+
K extends Json.Serializable,
|
|
16
|
+
>(
|
|
17
|
+
family: AtomIO.RegularAtomFamily<J, K>,
|
|
18
|
+
index: AtomIO.ReadableToken<Iterable<K>>,
|
|
15
19
|
): () => void {
|
|
16
20
|
const unsubSingleCallbacksByKey = new Map<string, () => void>()
|
|
17
21
|
const unsubFamilyCallbacksByKey = new Map<string, () => void>()
|
|
@@ -33,11 +37,11 @@ export function realtimeFamilyProvider({
|
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
|
|
36
|
-
const fillSubRequest = (subKey?:
|
|
40
|
+
const fillSubRequest = (subKey?: K) => {
|
|
37
41
|
if (subKey === undefined) {
|
|
38
42
|
const keys = AtomIO.getState(index, store)
|
|
39
43
|
for (const key of keys) {
|
|
40
|
-
const token =
|
|
44
|
+
const token = findInStore(family, key, store)
|
|
41
45
|
socket.emit(
|
|
42
46
|
`serve:${family.key}`,
|
|
43
47
|
parseJson(token.family?.subKey || `null`),
|
|
@@ -2,6 +2,7 @@ import * as AtomIO from "atom.io"
|
|
|
2
2
|
import type { Transceiver } from "atom.io/internal"
|
|
3
3
|
import {
|
|
4
4
|
IMPLICIT,
|
|
5
|
+
findInStore,
|
|
5
6
|
getJsonToken,
|
|
6
7
|
getUpdateToken,
|
|
7
8
|
subscribeToState,
|
|
@@ -11,25 +12,21 @@ import { parseJson } from "atom.io/json"
|
|
|
11
12
|
|
|
12
13
|
import type { ServerConfig } from "."
|
|
13
14
|
|
|
14
|
-
export
|
|
15
|
+
export type MutableFamilyProvider = ReturnType<
|
|
16
|
+
typeof realtimeMutableFamilyProvider
|
|
17
|
+
>
|
|
18
|
+
export function realtimeMutableFamilyProvider({
|
|
15
19
|
socket,
|
|
16
20
|
store = IMPLICIT.STORE,
|
|
17
|
-
}: ServerConfig)
|
|
21
|
+
}: ServerConfig) {
|
|
18
22
|
return function mutableFamilyProvider<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
>,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Transceiver<any>,
|
|
27
|
-
any,
|
|
28
|
-
infer Key
|
|
29
|
-
>
|
|
30
|
-
? Key
|
|
31
|
-
: never
|
|
32
|
-
|
|
23
|
+
T extends Transceiver<any>,
|
|
24
|
+
J extends Json.Serializable,
|
|
25
|
+
K extends Json.Serializable,
|
|
26
|
+
>(
|
|
27
|
+
family: AtomIO.MutableAtomFamily<T, J, K>,
|
|
28
|
+
index: AtomIO.ReadableToken<Iterable<K>>,
|
|
29
|
+
): () => void {
|
|
33
30
|
const unsubSingleCallbacksByKey = new Map<string, () => void>()
|
|
34
31
|
const unsubFamilyCallbacksByKey = new Map<string, () => void>()
|
|
35
32
|
|
|
@@ -50,11 +47,11 @@ export const realtimeMutableFamilyProvider = ({
|
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
const fillSubRequest = (subKey?:
|
|
50
|
+
const fillSubRequest = (subKey?: K) => {
|
|
54
51
|
if (subKey === undefined) {
|
|
55
52
|
const keys = AtomIO.getState(index, store)
|
|
56
53
|
for (const key of keys) {
|
|
57
|
-
const token = family
|
|
54
|
+
const token = findInStore(family, key, store)
|
|
58
55
|
const jsonToken = getJsonToken(token)
|
|
59
56
|
const trackerToken = getUpdateToken(token)
|
|
60
57
|
socket.emit(
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { TransactionUpdate, TransactionUpdateContent } from "atom.io"
|
|
2
|
+
import { atomFamily, selectorFamily } from "atom.io"
|
|
3
|
+
import { SyncGroup } from "~/packages/atom.io/__unstable__/realtime-server-next/create-realtime-sync-group"
|
|
4
|
+
import { usersOfSockets } from "./server-user-store"
|
|
5
|
+
|
|
6
|
+
export const completeUpdateAtoms = atomFamily<
|
|
7
|
+
TransactionUpdate<any> | null,
|
|
8
|
+
string
|
|
9
|
+
>({
|
|
10
|
+
key: `completeUpdate`,
|
|
11
|
+
default: null,
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
export const transactionRedactorAtoms = atomFamily<
|
|
15
|
+
{
|
|
16
|
+
filter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]
|
|
17
|
+
},
|
|
18
|
+
string
|
|
19
|
+
>({
|
|
20
|
+
key: `transactionRedactor`,
|
|
21
|
+
default: { filter: (updates) => updates },
|
|
22
|
+
})
|
|
23
|
+
export const redactedUpdateSelectors = selectorFamily<
|
|
24
|
+
TransactionUpdate<any> | null,
|
|
25
|
+
[transactionKey: string, updateId: string]
|
|
26
|
+
>({
|
|
27
|
+
key: `redactedUpdate`,
|
|
28
|
+
get:
|
|
29
|
+
([transactionKey, updateId]) =>
|
|
30
|
+
({ get, find }) => {
|
|
31
|
+
const update = get(find(completeUpdateAtoms, updateId))
|
|
32
|
+
const { filter } = get(find(transactionRedactorAtoms, transactionKey))
|
|
33
|
+
|
|
34
|
+
if (update && filter) {
|
|
35
|
+
return { ...update, updates: filter(update.updates) }
|
|
36
|
+
}
|
|
37
|
+
return null
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export const userUnacknowledgedUpdatesAtoms = atomFamily<
|
|
42
|
+
TransactionUpdate<any>[],
|
|
43
|
+
string
|
|
44
|
+
>({
|
|
45
|
+
key: `unacknowledgedUpdates`,
|
|
46
|
+
default: () => [],
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
export const socketUnacknowledgedUpdatesSelectors = selectorFamily<
|
|
50
|
+
TransactionUpdate<any>[],
|
|
51
|
+
string
|
|
52
|
+
>({
|
|
53
|
+
key: `socketUnacknowledgedUpdates`,
|
|
54
|
+
get:
|
|
55
|
+
(socketId) =>
|
|
56
|
+
({ get, find }) => {
|
|
57
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)
|
|
58
|
+
const userKey = get(userKeyState)
|
|
59
|
+
if (!userKey) {
|
|
60
|
+
return []
|
|
61
|
+
}
|
|
62
|
+
const unacknowledgedUpdatesState = find(
|
|
63
|
+
userUnacknowledgedUpdatesAtoms,
|
|
64
|
+
userKey,
|
|
65
|
+
)
|
|
66
|
+
const unacknowledgedUpdates = get(unacknowledgedUpdatesState)
|
|
67
|
+
return unacknowledgedUpdates
|
|
68
|
+
},
|
|
69
|
+
set:
|
|
70
|
+
(socketId) =>
|
|
71
|
+
({ set, get, find }, newUpdates) => {
|
|
72
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)
|
|
73
|
+
const userKey = get(userKeyState)
|
|
74
|
+
if (!userKey) {
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
const unacknowledgedUpdatesState = find(
|
|
78
|
+
userUnacknowledgedUpdatesAtoms,
|
|
79
|
+
userKey,
|
|
80
|
+
)
|
|
81
|
+
set(unacknowledgedUpdatesState, newUpdates)
|
|
82
|
+
},
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
export const userEpochAtoms = atomFamily<number | null, string>({
|
|
86
|
+
key: `clientEpoch`,
|
|
87
|
+
default: null,
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
export const socketEpochSelectors = selectorFamily<number | null, string>({
|
|
91
|
+
key: `socketEpoch`,
|
|
92
|
+
get:
|
|
93
|
+
(socketId) =>
|
|
94
|
+
({ get, find }) => {
|
|
95
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)
|
|
96
|
+
const userKey = get(userKeyState)
|
|
97
|
+
if (!userKey) {
|
|
98
|
+
return null
|
|
99
|
+
}
|
|
100
|
+
const userEpochState = find(userEpochAtoms, userKey)
|
|
101
|
+
const userEpoch = get(userEpochState)
|
|
102
|
+
return userEpoch
|
|
103
|
+
},
|
|
104
|
+
set:
|
|
105
|
+
(socketId) =>
|
|
106
|
+
({ set, get, find }, newEpoch) => {
|
|
107
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)
|
|
108
|
+
const userKey = get(userKeyState)
|
|
109
|
+
if (!userKey) {
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
const userEpochState = find(userEpochAtoms, userKey)
|
|
113
|
+
set(userEpochState, newEpoch)
|
|
114
|
+
},
|
|
115
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { atom, atomFamily } from "atom.io"
|
|
2
|
+
import { join } from "atom.io/data"
|
|
3
|
+
import { SetRTX } from "atom.io/transceivers/set-rtx"
|
|
4
|
+
|
|
5
|
+
export const userIndex = atom({
|
|
6
|
+
key: `usersIndex`,
|
|
7
|
+
mutable: true,
|
|
8
|
+
default: () => new SetRTX<string>(),
|
|
9
|
+
toJson: (set) => set.toJSON(),
|
|
10
|
+
fromJson: (json) => SetRTX.fromJSON(json),
|
|
11
|
+
})
|
|
12
|
+
export const usersOfSockets = join({
|
|
13
|
+
key: `usersOfSockets`,
|
|
14
|
+
between: [`user`, `socket`],
|
|
15
|
+
cardinality: `1:1`,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export const roomIndex = atom({
|
|
19
|
+
key: `conclaveIndex`,
|
|
20
|
+
default: () => new SetRTX<string>(),
|
|
21
|
+
mutable: true,
|
|
22
|
+
toJson: (set) => set.toJSON(),
|
|
23
|
+
fromJson: (json) => SetRTX.fromJSON(json),
|
|
24
|
+
})
|
|
25
|
+
export type UserInRoomMeta = {
|
|
26
|
+
enteredAtEpoch: number
|
|
27
|
+
}
|
|
28
|
+
export const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {
|
|
29
|
+
enteredAtEpoch: 0,
|
|
30
|
+
}
|
|
31
|
+
export const usersInRooms = join(
|
|
32
|
+
{
|
|
33
|
+
key: `usersInRooms`,
|
|
34
|
+
between: [`room`, `user`],
|
|
35
|
+
cardinality: `1:n`,
|
|
36
|
+
},
|
|
37
|
+
DEFAULT_USER_IN_ROOM_META,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
// export const roomStoreAtoms = atomFamily<
|
|
41
|
+
// { [key: string]: any },
|
|
42
|
+
// { conclave: string }
|
|
43
|
+
// >({
|
|
44
|
+
|
|
45
|
+
// })
|