atom.io 0.18.1 → 0.18.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.
Files changed (84) hide show
  1. package/data/dist/index.cjs +0 -2
  2. package/data/dist/index.js +2 -4
  3. package/dist/{chunk-JDUNWJFB.js → chunk-BWWVY5O5.js} +1 -3
  4. package/dist/{chunk-NYCVSXQB.js → chunk-CVBEVTM5.js} +0 -2
  5. package/dist/chunk-O47EQUM6.js +29 -0
  6. package/dist/{chunk-PZLG2HP3.js → chunk-U2IICNHQ.js} +0 -2
  7. package/dist/{chunk-XACXFU3B.js → chunk-VAE5OCKN.js} +0 -2
  8. package/dist/{chunk-NYTGCPHB.js → chunk-WX2NCOZR.js} +0 -2
  9. package/dist/{chunk-IZHOMSXA.js → chunk-YDOGCZ53.js} +0 -2
  10. package/dist/index.cjs +0 -2
  11. package/dist/index.js +1 -3
  12. package/internal/dist/index.cjs +46 -102
  13. package/internal/dist/index.d.ts +23 -23
  14. package/internal/dist/index.js +48 -104
  15. package/internal/src/families/create-regular-atom-family.ts +4 -4
  16. package/internal/src/get-state/get-from-store.ts +2 -5
  17. package/internal/src/mutable/create-mutable-atom-family.ts +4 -4
  18. package/internal/src/selector/register-selector.ts +3 -14
  19. package/internal/src/set-state/set-into-store.ts +2 -5
  20. package/internal/src/store/withdraw-new-family-member.ts +38 -28
  21. package/internal/src/store/withdraw.ts +20 -23
  22. package/internal/src/subscribe/subscribe-to-state.ts +2 -3
  23. package/internal/src/subscribe/subscribe-to-timeline.ts +0 -5
  24. package/internal/src/subscribe/subscribe-to-transaction.ts +0 -5
  25. package/internal/src/timeline/add-atom-to-timeline.ts +6 -15
  26. package/internal/src/timeline/create-timeline.ts +0 -27
  27. package/introspection/dist/index.cjs +0 -2
  28. package/introspection/dist/index.js +1 -3
  29. package/json/dist/index.cjs +0 -2
  30. package/json/dist/index.js +3 -5
  31. package/package.json +6 -5
  32. package/react/dist/index.cjs +2 -5
  33. package/react/dist/index.js +3 -6
  34. package/react/src/use-tl.ts +2 -2
  35. package/react-devtools/dist/index.cjs +1 -3
  36. package/react-devtools/dist/index.css +0 -1
  37. package/react-devtools/dist/index.js +4 -6
  38. package/realtime/dist/index.cjs +0 -2
  39. package/realtime/dist/index.js +1 -3
  40. package/realtime-client/dist/index.cjs +1 -3
  41. package/realtime-client/dist/index.js +15 -41
  42. package/realtime-react/dist/index.cjs +0 -2
  43. package/realtime-react/dist/index.js +2 -4
  44. package/realtime-server/dist/index.cjs +3 -5
  45. package/realtime-server/dist/index.js +4 -6
  46. package/realtime-server/src/ipc-sockets/parent-socket.ts +4 -3
  47. package/realtime-testing/dist/index.cjs +43 -7
  48. package/realtime-testing/dist/index.js +6 -9
  49. package/realtime-testing/src/setup-realtime-test.tsx +3 -5
  50. package/transceivers/set-rtx/dist/index.cjs +0 -2
  51. package/transceivers/set-rtx/dist/index.js +1 -3
  52. package/data/dist/index.cjs.map +0 -1
  53. package/data/dist/index.js.map +0 -1
  54. package/dist/chunk-IZHOMSXA.js.map +0 -1
  55. package/dist/chunk-JDUNWJFB.js.map +0 -1
  56. package/dist/chunk-NYCVSXQB.js.map +0 -1
  57. package/dist/chunk-NYTGCPHB.js.map +0 -1
  58. package/dist/chunk-PZLG2HP3.js.map +0 -1
  59. package/dist/chunk-XACXFU3B.js.map +0 -1
  60. package/dist/index.cjs.map +0 -1
  61. package/dist/index.js.map +0 -1
  62. package/internal/dist/index.cjs.map +0 -1
  63. package/internal/dist/index.js.map +0 -1
  64. package/introspection/dist/index.cjs.map +0 -1
  65. package/introspection/dist/index.js.map +0 -1
  66. package/json/dist/index.cjs.map +0 -1
  67. package/json/dist/index.js.map +0 -1
  68. package/react/dist/index.cjs.map +0 -1
  69. package/react/dist/index.js.map +0 -1
  70. package/react-devtools/dist/index.cjs.map +0 -1
  71. package/react-devtools/dist/index.css.map +0 -1
  72. package/react-devtools/dist/index.js.map +0 -1
  73. package/realtime/dist/index.cjs.map +0 -1
  74. package/realtime/dist/index.js.map +0 -1
  75. package/realtime-client/dist/index.cjs.map +0 -1
  76. package/realtime-client/dist/index.js.map +0 -1
  77. package/realtime-react/dist/index.cjs.map +0 -1
  78. package/realtime-react/dist/index.js.map +0 -1
  79. package/realtime-server/dist/index.cjs.map +0 -1
  80. package/realtime-server/dist/index.js.map +0 -1
  81. package/realtime-testing/dist/index.cjs.map +0 -1
  82. package/realtime-testing/dist/index.js.map +0 -1
  83. package/transceivers/set-rtx/dist/index.cjs.map +0 -1
  84. package/transceivers/set-rtx/dist/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/realtime-continuity.ts","../src/shared-room-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tassignTransactionToContinuity,\n\tgetUpdateToken,\n\tsetEpochNumberOfContinuity,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport class InvariantMap<K, V> extends Map<K, V> {\n\tpublic set(key: K, value: V): this {\n\t\tif (this.has(key)) {\n\t\t\tconsole.warn(`Tried to set a key that already exists in an InvariantMap`, {\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t})\n\t\t\treturn this\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n\n\tpublic clear(): void {\n\t\tthrow new Error(`Cannot clear an InvariantMap`)\n\t}\n}\n\nexport type PerspectiveToken<\n\tF extends AtomFamilyToken<any>,\n\tT extends F extends AtomFamilyToken<infer T, any> ? T : never,\n> = {\n\ttype: `realtime_perspective`\n\tresourceAtoms: F\n\tviewAtoms: ReadableFamilyToken<ReadableToken<T>[], string>\n}\n\nexport type ContinuityToken = {\n\treadonly type: `continuity`\n\treadonly key: string\n\treadonly globals: AtomToken<any>[]\n\treadonly actions: TransactionToken<any>[]\n\treadonly perspectives: PerspectiveToken<\n\t\tAtomFamilyToken<any, Json.Serializable>,\n\t\tJson.Serializable\n\t>[]\n}\n\nexport class SyncGroup {\n\tprotected type = `continuity` as const\n\n\tprotected globals: AtomToken<any>[] = []\n\tprotected actions: TransactionToken<any>[] = []\n\tprotected perspectives: PerspectiveToken<any, any>[] = []\n\n\tprotected constructor(protected readonly key: string) {}\n\n\tpublic static existing: InvariantMap<string, ContinuityToken> =\n\t\tnew InvariantMap()\n\tpublic static create(\n\t\tkey: string,\n\t\tbuilder: (group: SyncGroup) => SyncGroup,\n\t): ContinuityToken {\n\t\tconst group = new SyncGroup(key)\n\t\tconst { type, globals, actions, perspectives } = builder(group)\n\t\tconst token = { type, key, globals, actions, perspectives }\n\t\tSyncGroup.existing.set(key, token)\n\t\treturn token\n\t}\n\n\tpublic add(...atoms: AtomToken<any>[]): SyncGroup\n\tpublic add(...args: TransactionToken<any>[]): SyncGroup\n\tpublic add<\n\t\tF extends AtomFamilyToken<any>,\n\t\tT extends F extends AtomFamilyToken<infer T> ? T : never,\n\t>(\n\t\tfamily: AtomFamilyToken<T, any>,\n\t\tindex: ReadableFamilyToken<Iterable<AtomToken<T>>, string>,\n\t): SyncGroup\n\tpublic add(\n\t\t...args:\n\t\t\t| readonly AtomToken<any>[]\n\t\t\t| readonly TransactionToken<any>[]\n\t\t\t| [AtomFamilyToken<any, any>, ReadableFamilyToken<Iterable<any>, string>]\n\t): SyncGroup {\n\t\tconst zeroth = args[0]\n\t\tif (zeroth.type === `atom` || zeroth.type === `mutable_atom`) {\n\t\t\tconst globals = args as AtomToken<any>[]\n\t\t\tfor (const global of globals) {\n\t\t\t\tswitch (global.type) {\n\t\t\t\t\tcase `atom`:\n\t\t\t\t\t\tthis.globals.push(global)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase `mutable_atom`:\n\t\t\t\t\t\tthis.globals.push(getUpdateToken(global))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (zeroth.type === `transaction`) {\n\t\t\tconst actions = args as TransactionToken<any>[]\n\t\t\tthis.actions.push(...actions)\n\t\t} else {\n\t\t\tconst [family, index] = args as [\n\t\t\t\tAtomFamilyToken<any, any>,\n\t\t\t\tReadableFamilyToken<ReadableToken<any>[], string>,\n\t\t\t]\n\t\t\tthis.perspectives.push({\n\t\t\t\ttype: `realtime_perspective`,\n\t\t\t\tresourceAtoms: family,\n\t\t\t\tviewAtoms: index,\n\t\t\t})\n\t\t}\n\t\treturn this\n\t}\n}\n\nexport type ContinuityOptions = {\n\tkey: string\n\tconfig: (group: SyncGroup) => SyncGroup\n}\n\nexport function continuity(options: ContinuityOptions): ContinuityToken {\n\tconst { key, config } = options\n\tconst token = SyncGroup.create(key, config)\n\tconst { actions } = token\n\tfor (const action of actions) {\n\t\tassignTransactionToContinuity(key, action.key, IMPLICIT.STORE)\n\t}\n\tsetEpochNumberOfContinuity(key, -1, IMPLICIT.STORE)\n\treturn token\n}\n\n// const counterStates = atomFamily<number, { c: string }>({\n// \tkey: `counter`,\n// \tdefault: 0,\n// })\n// const counterIndices = atomFamily<{ c: string }[], string>({\n// \tkey: `counterIndex`,\n// \tdefault: [],\n// })\n// const nameStates = atomFamily<number, { n: string }>({\n// \tkey: `name`,\n// \tdefault: 0,\n// })\n// const nameIndices = atomFamily<{ n: string }[], string>({\n// \tkey: `nameIndex`,\n// \tdefault: [],\n// })\n\n// const counterContinuity = continuity({\n// \tkey: `counter`,\n// \tconfig: (group) =>\n// \t\tgroup\n// \t\t\t.add(counterStates, counterIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices),\n// })\n","import type { MutableAtomToken } from \"atom.io\"\nimport { atom, selectorFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nexport const usersInThisRoomIndex = atom<SetRTX<string>, SetRTXJson<string>>({\n\tkey: `usersInRoomIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\n\nexport const roomIndex = atom({\n\tkey: `roomIndex`,\n\tdefault: () => new SetRTX<string>(),\n\tmutable: true,\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\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\nexport const usersInMyRoomView = selectorFamily<\n\tMutableAtomToken<SetRTX<string>, SetRTXJson<string>>[],\n\tstring\n>({\n\tkey: `usersInMyRoomView`,\n\tget:\n\t\t(username) =>\n\t\t({ find }) => {\n\t\t\treturn [find(usersInRooms.core.findRelatedKeysState, username)]\n\t\t},\n})\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pull-atom.ts","../src/pull-atom-family-member.ts","../src/pull-mutable-atom.ts","../src/pull-mutable-atom-family-member.ts","../src/pull-selector.ts","../src/pull-selector-family-member.ts","../src/push-state.ts","../src/realtime-client-stores/client-main-store.ts","../../__unstable__/web-effects/src/storage.ts","../src/realtime-client-stores/client-sync-store.ts","../src/server-action.ts","../src/sync-continuity.ts"],"names":["setIntoStore","getJsonToken","getUpdateToken","parseJson","atom","AtomIO","Internal","subscribeToTransaction","confirmedUpdateQueue","optimisticUpdateQueue","confirmedUpdate"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport { type Store, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(token, data, store)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { type Store, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(token, data, store)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst jsonToken = getJsonToken(token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tsetIntoStore(jsonToken, data, store)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Update> ? Update : never) => {\n\t\t\tsetIntoStore(updateToken, data, store)\n\t\t},\n\t)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tconst jsonToken = getJsonToken(token)\n\t\tsetIntoStore(jsonToken, data, store)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Signal> ? Signal : never) => {\n\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\tsetIntoStore(trackerToken, data, store)\n\t\t},\n\t)\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\ttoken: AtomIO.SelectorToken<T>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\nexport function pullSelectorFamilyMember<T>(\n\ttoken: AtomIO.SelectorToken<T>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n\tsocket: Socket,\n\tstore: Internal.Store,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tInternal.subscribeToState(\n\t\ttoken,\n\t\t({ newValue }) => {\n\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t},\n\t\t`push`,\n\t\tstore,\n\t)\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nimport { lazyLocalStorageEffect } from \"~/packages/atom.io/__unstable__/web-effects/src/storage\"\n\nexport const myIdState__INTERNAL = AtomIO.atom<string | undefined>({\n\tkey: `mySocketId__INTERNAL`,\n\tdefault: undefined,\n})\nexport const myIdState = AtomIO.selector<string | undefined>({\n\tkey: `mySocketId`,\n\tget: ({ get }) => get(myIdState__INTERNAL),\n})\n\nconst usernameEffects =\n\ttypeof window === `undefined` ? [] : [lazyLocalStorageEffect(`myUsername`)]\nexport const myUsernameState = AtomIO.atom<string | null>({\n\tkey: `myUsername`,\n\tdefault: null,\n\teffects: usernameEffects,\n})\n","import type { AtomEffect } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nexport type StringInterface<T> = {\n\tstringify: (t: T) => string\n\tparse: (s: string) => T\n}\n\nexport const persistAtom =\n\t<T>(storage: Storage) =>\n\t({ stringify, parse }: StringInterface<T>) =>\n\t(key: string): AtomEffect<T> =>\n\t({ setSelf, onSet }) => {\n\t\tconst savedValue = storage.getItem(key)\n\n\t\tif (savedValue != null) setSelf(parse(savedValue))\n\n\t\tonSet(({ newValue }) => {\n\t\t\tif (newValue == null) {\n\t\t\t\tstorage.removeItem(key)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstorage.setItem(key, stringify(newValue))\n\t\t})\n\t}\n\nexport const lazyLocalStorageEffect: <J extends Json.Serializable>(\n\tkey: string,\n) => AtomEffect<J> = persistAtom(localStorage)(JSON)\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue = AtomIO.atom<\n\tAtomIO.TransactionUpdate<any>[]\n>({\n\tkey: `updateQueue`,\n\tdefault: [],\n})\n\nexport const confirmedUpdateQueue = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>(\n\t{\n\t\tkey: `serverConfirmedUpdateQueue`,\n\t\tdefault: [],\n\t},\n)\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n\tsocket: Socket,\n\tstore: Internal.Store,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = Internal.subscribeToTransaction(\n\t\ttoken,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\tstore,\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { deleteAtom } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tassignTransactionToContinuity,\n\tgetEpochNumberOfContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function syncContinuity<ƒ extends AtomIO.ƒn>(\n\tcontinuity: ContinuityToken,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(optimisticUpdateQueue, store)\n\tconst confirmedUpdates = getFromStore(confirmedUpdateQueue, store)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\t// console.log(`❗❗❗❗❗`, k, v)\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(continuityKey, epoch, store)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = (\n\t\tconfirmedUpdate: AtomIO.TransactionUpdate<ƒ>,\n\t) => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(\n\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t(queue) => {\n\t\t\t\t\tqueue.shift()\n\t\t\t\t\treturn queue\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(token, id, store)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑‍⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmedUpdate.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmedUpdate)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmedUpdate,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tconst continuityEpoch = getEpochNumberOfContinuity(continuityKey, store)\n\t\t\tconst isRoot = isRootStore(store)\n\n\t\t\tif (isRoot && continuityEpoch === confirmedUpdate.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmedUpdate.epoch} (${confirmedUpdate.key} ${confirmedUpdate.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(continuityKey, confirmedUpdate.epoch, store)\n\t\t\t} else if (isRoot && continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${\n\t\t\t\t\t\tconfirmedUpdate.epoch\n\t\t\t\t\t} but still waiting for update #${continuityEpoch + 1}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmedUpdate.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmedUpdate.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmedUpdate.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(continuityKey, transaction.key, store)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\ttransaction,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\tkey: transaction.key,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\tstore,\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tsocket.on(`reveal:${continuityKey}`, (revealed: Json.Array) => {\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t})\n\tsocket.on(\n\t\t`conceal:${continuityKey}`,\n\t\t(concealed: AtomIO.AtomToken<unknown>[]) => {\n\t\t\tfor (const token of concealed) {\n\t\t\t\tdeleteAtom(token, store)\n\t\t\t}\n\t\t},\n\t)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pull-atom.ts","../src/pull-atom-family-member.ts","../src/pull-mutable-atom.ts","../src/pull-mutable-atom-family-member.ts","../src/pull-selector.ts","../src/pull-selector-family-member.ts","../src/push-state.ts","../src/realtime-client-stores/client-main-store.ts","../src/realtime-client-stores/client-sync-store.ts","../src/server-action.ts"],"names":["setIntoStore","getJsonToken","getUpdateToken","parseJson","atom","AtomIO","Internal"],"mappings":";;;;;;;;;AACA,SAAqB,oBAAoB;AAIlC,SAAS,SACf,OACA,QACA,OACa;AACb,QAAM,iBAAiB,CAAC,SAAY;AACnC,iBAAa,OAAO,MAAM,KAAK;AAAA,EAChC;AACA,SAAO,GAAG,SAAS,MAAM,GAAG,IAAI,cAAc;AAC9C,SAAO,KAAK,OAAO,MAAM,GAAG,EAAE;AAC9B,SAAO,MAAM;AACZ,WAAO,IAAI,SAAS,MAAM,GAAG,IAAI,cAAc;AAC/C,WAAO,KAAK,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AACD;;;AClBA,SAAqB,gBAAAA,qBAAoB;AAEzC,SAAS,iBAAiB;AAGnB,SAAS,qBACf,OACA,QACA,OACa;AACb,MAAI,EAAE,YAAY,QAAQ;AACzB,YAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAO,MAAM;AAAA,IAAC;AAAA,EACf;AACA,QAAM,EAAE,KAAK,WAAW,QAAQ,iBAAiB,IAAI,MAAM;AAC3D,QAAM,SAAS,UAAU,gBAAgB;AACzC,mCAAQ,GAAG,SAAS,MAAM,GAAG,IAAI,CAAC,SAAY;AAC7C,IAAAA,cAAa,OAAO,MAAM,KAAK;AAAA,EAChC;AACA,mCAAQ,KAAK,OAAO,SAAS,IAAI;AACjC,SAAO,MAAM;AACZ,qCAAQ,IAAI,SAAS,MAAM,GAAG;AAC9B,qCAAQ,KAAK,SAAS,MAAM,GAAG;AAAA,EAChC;AACD;;;ACvBA,SAAS,cAAc,gBAAgB,gBAAAA,qBAAoB;AAIpD,SAAS,gBAIf,OACA,QACA,OACa;AACb,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,cAAc,eAAe,KAAK;AACxC,SAAO,GAAG,QAAQ,MAAM,GAAG,IAAI,CAAC,SAAY;AAC3C,IAAAA,cAAa,WAAW,MAAM,KAAK;AAAA,EACpC,CAAC;AACD,SAAO;AAAA,IACN,QAAQ,MAAM,GAAG;AAAA,IACjB,CAAC,SAA+D;AAC/D,MAAAA,cAAa,aAAa,MAAM,KAAK;AAAA,IACtC;AAAA,EACD;AACA,SAAO,KAAK,OAAO,MAAM,GAAG,EAAE;AAC9B,SAAO,MAAM;AACZ,WAAO,IAAI,QAAQ,MAAM,GAAG,EAAE;AAC9B,WAAO,IAAI,QAAQ,MAAM,GAAG,EAAE;AAC9B,WAAO,KAAK,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AACD;;;AC9BA,SAAS,gBAAAC,eAAc,kBAAAC,iBAAgB,gBAAAF,qBAAoB;AAE3D,SAAS,aAAAG,kBAAiB;AAInB,SAAS,4BAIf,OACA,QACA,OACa;AACb,MAAI,EAAE,YAAY,QAAQ;AACzB,YAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAO,MAAM;AAAA,IAAC;AAAA,EACf;AACA,QAAM,EAAE,KAAK,WAAW,QAAQ,iBAAiB,IAAI,MAAM;AAC3D,QAAM,SAASA,WAAU,gBAAgB;AACzC,SAAO,GAAG,QAAQ,MAAM,GAAG,IAAI,CAAC,SAAY;AAC3C,UAAM,YAAYF,cAAa,KAAK;AACpC,IAAAD,cAAa,WAAW,MAAM,KAAK;AAAA,EACpC,CAAC;AACD,SAAO;AAAA,IACN,QAAQ,MAAM,GAAG;AAAA,IACjB,CAAC,SAA+D;AAC/D,YAAM,eAAeE,gBAAe,KAAK;AACzC,MAAAF,cAAa,cAAc,MAAM,KAAK;AAAA,IACvC;AAAA,EACD;AACA,SAAO,KAAK,OAAO,SAAS,IAAI,MAAM;AACtC,SAAO,MAAM;AACZ,WAAO,IAAI,SAAS,MAAM,GAAG,EAAE;AAC/B,WAAO,KAAK,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AACD;;;AC9BO,SAAS,aACf,OACA,QACA,OACa;AACb,QAAM,WAAW,MAAM,cAAc,eAAe,MAAM,GAAG;AAC7D,QAAM,eAAkC,CAAC;AACzC,MAAI,UAAU;AACb,eAAW,WAAW,UAAU;AAC/B,YAAMI,QAAO,MAAM,MAAM,IAAI,OAAO;AACpC,UAAI,CAACA,OAAM;AACV;AAAA,MACD;AACA,cAAQA,MAAK,MAAM;AAAA,QAClB,KAAK,QAAQ;AACZ,uBAAa,KAAK,SAASA,OAAM,QAAQ,KAAK,CAAC;AAC/C;AAAA,QACD;AAAA,QACA,KAAK,gBAAgB;AACpB,uBAAa,KAAK,gBAAgBA,OAAM,QAAQ,KAAK,CAAC;AACtD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO,MAAM;AACZ,eAAW,eAAe,cAAc;AACvC,kBAAY;AAAA,IACb;AAAA,EACD;AACD;;;AC9BO,SAAS,yBACf,OACA,QACA,OACa;AACb,MAAI,EAAE,YAAY,QAAQ;AACzB,YAAQ,MAAM,iCAAiC,KAAK;AACpD,WAAO,MAAM;AAAA,IAAC;AAAA,EACf;AACA,QAAM,WAAW,MAAM,cAAc,eAAe,MAAM,GAAG;AAC7D,QAAM,eAAkC,CAAC;AACzC,MAAI,UAAU;AACb,eAAW,WAAW,UAAU;AAC/B,YAAMA,QAAO,MAAM,MAAM,IAAI,OAAO;AACpC,UAAI,CAACA,OAAM;AACV;AAAA,MACD;AACA,cAAQA,MAAK,MAAM;AAAA,QAClB,KAAK,QAAQ;AACZ,uBAAa,KAAK,qBAAqBA,OAAM,QAAQ,KAAK,CAAC;AAC3D;AAAA,QACD;AAAA,QACA,KAAK,gBAAgB;AACpB,uBAAa,KAAK,4BAA4BA,OAAM,QAAQ,KAAK,CAAC;AAClE;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO,MAAM;AACZ,eAAW,eAAe,cAAc;AACvC,kBAAY;AAAA,IACb;AAAA,EACD;AACD;;;ACxCA,YAAY,cAAc;AAInB,SAAS,UACf,OACA,QACA,OACa;AACb,SAAO,KAAK,SAAS,MAAM,GAAG,EAAE;AAChC,EAAS;AAAA,IACR;AAAA,IACA,CAAC,EAAE,SAAS,MAAM;AACjB,aAAO,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,SAAO,MAAM;AACZ,WAAO,IAAI,OAAO,MAAM,GAAG,EAAE;AAC7B,WAAO,KAAK,WAAW,MAAM,GAAG,EAAE;AAAA,EACnC;AACD;;;ACvBA,YAAY,YAAY;AAIjB,IAAM,sBAA6B,YAAyB;AAAA,EAClE,KAAK;AAAA,EACL,SAAS;AACV,CAAC;AACM,IAAM,YAAmB,gBAA6B;AAAA,EAC5D,KAAK;AAAA,EACL,KAAK,CAAC,EAAE,IAAI,MAAM,IAAI,mBAAmB;AAC1C,CAAC;AAED,IAAM,kBACL,OAAO,WAAW,cAAc,CAAC,IAAI,CAAC,uBAAuB,YAAY,CAAC;AACpE,IAAM,kBAAyB,YAAoB;AAAA,EACzD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AACV,CAAC;;;ACnBD,YAAYC,aAAY;AAEjB,IAAM,wBAA+B,aAE1C;AAAA,EACD,KAAK;AAAA,EACL,SAAS,CAAC;AACX,CAAC;AAEM,IAAM,uBAA8B;AAAA,EAC1C;AAAA,IACC,KAAK;AAAA,IACL,SAAS,CAAC;AAAA,EACX;AACD;;;ACbA,YAAYC,eAAc;AAGnB,SAAS,aACf,OACA,QACA,OACa;AACb,QAAM,8BAAuC;AAAA,IAC5C;AAAA,IACA,CAAC,iBAAiB;AACjB,aAAO,KAAK,UAAU,MAAM,GAAG,IAAI,YAAY;AAAA,IAChD;AAAA,IACA,UAAU,MAAM,GAAG,IAAI,OAAO,EAAE;AAAA,IAChC;AAAA,EACD;AAEA,SAAO,MAAM;AACZ,gCAA4B;AAAA,EAC7B;AACD","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport { type Store, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst setServedValue = (data: J) => {\n\t\tsetIntoStore(token, data, store)\n\t}\n\tsocket.on(`serve:${token.key}`, setServedValue)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`, setServedValue)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { type Store, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullAtomFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket?.on(`serve:${token.key}`, (data: J) => {\n\t\tsetIntoStore(token, data, store)\n\t})\n\tsocket?.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket?.off(`serve:${token.key}`)\n\t\tsocket?.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst jsonToken = getJsonToken(token)\n\tconst updateToken = getUpdateToken(token)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tsetIntoStore(jsonToken, data, store)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Update> ? Update : never) => {\n\t\t\tsetIntoStore(updateToken, data, store)\n\t\t},\n\t)\n\tsocket.emit(`sub:${token.key}`)\n\treturn () => {\n\t\tsocket.off(`init:${token.key}`)\n\t\tsocket.off(`next:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { getJsonToken, getUpdateToken, setIntoStore } from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\ttoken: AtomIO.MutableAtomToken<T, J>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst { key: familyKey, subKey: serializedSubKey } = token.family\n\tconst subKey = parseJson(serializedSubKey)\n\tsocket.on(`init:${token.key}`, (data: J) => {\n\t\tconst jsonToken = getJsonToken(token)\n\t\tsetIntoStore(jsonToken, data, store)\n\t})\n\tsocket.on(\n\t\t`next:${token.key}`,\n\t\t(data: T extends Transceiver<infer Signal> ? Signal : never) => {\n\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\tsetIntoStore(trackerToken, data, store)\n\t\t},\n\t)\n\tsocket.emit(`sub:${familyKey}`, subKey)\n\treturn () => {\n\t\tsocket.off(`serve:${token.key}`)\n\t\tsocket.emit(`unsub:${token.key}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtom } from \"./pull-atom\"\nimport { pullMutableAtom } from \"./pull-mutable-atom\"\n\nexport function pullSelector<T>(\n\ttoken: AtomIO.SelectorToken<T>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtom(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtom(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nimport { pullAtomFamilyMember } from \"./pull-atom-family-member\"\nimport { pullMutableAtomFamilyMember } from \"./pull-mutable-atom-family-member\"\n\nexport function pullSelectorFamilyMember<T>(\n\ttoken: AtomIO.SelectorToken<T>,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tif (!(`family` in token)) {\n\t\tconsole.error(`Token is not a family member:`, token)\n\t\treturn () => {}\n\t}\n\tconst atomKeys = store.selectorAtoms.getRelatedKeys(token.key)\n\tconst unsubscribes: Array<() => void> = []\n\tif (atomKeys) {\n\t\tfor (const atomKey of atomKeys) {\n\t\t\tconst atom = store.atoms.get(atomKey)\n\t\t\tif (!atom) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tswitch (atom.type) {\n\t\t\t\tcase `atom`: {\n\t\t\t\t\tunsubscribes.push(pullAtomFamilyMember(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase `mutable_atom`: {\n\t\t\t\t\tunsubscribes.push(pullMutableAtomFamilyMember(atom, socket, store))\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn () => {\n\t\tfor (const unsubscribe of unsubscribes) {\n\t\t\tunsubscribe()\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function pushState<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n\tsocket: Socket,\n\tstore: Internal.Store,\n): () => void {\n\tsocket.emit(`claim:${token.key}`)\n\tInternal.subscribeToState(\n\t\ttoken,\n\t\t({ newValue }) => {\n\t\t\tsocket.emit(`pub:${token.key}`, newValue)\n\t\t},\n\t\t`push`,\n\t\tstore,\n\t)\n\treturn () => {\n\t\tsocket.off(`pub:${token.key}`)\n\t\tsocket.emit(`unclaim:${token.key}`)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nimport { lazyLocalStorageEffect } from \"~/packages/atom.io/__unstable__/web-effects/src/storage\"\n\nexport const myIdState__INTERNAL = AtomIO.atom<string | undefined>({\n\tkey: `mySocketId__INTERNAL`,\n\tdefault: undefined,\n})\nexport const myIdState = AtomIO.selector<string | undefined>({\n\tkey: `mySocketId`,\n\tget: ({ get }) => get(myIdState__INTERNAL),\n})\n\nconst usernameEffects =\n\ttypeof window === `undefined` ? [] : [lazyLocalStorageEffect(`myUsername`)]\nexport const myUsernameState = AtomIO.atom<string | null>({\n\tkey: `myUsername`,\n\tdefault: null,\n\teffects: usernameEffects,\n})\n","import * as AtomIO from \"atom.io\"\n\nexport const optimisticUpdateQueue = AtomIO.atom<\n\tAtomIO.TransactionUpdate<any>[]\n>({\n\tkey: `updateQueue`,\n\tdefault: [],\n})\n\nexport const confirmedUpdateQueue = AtomIO.atom<AtomIO.TransactionUpdate<any>[]>(\n\t{\n\t\tkey: `serverConfirmedUpdateQueue`,\n\t\tdefault: [],\n\t},\n)\n","import type * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function serverAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n\tsocket: Socket,\n\tstore: Internal.Store,\n): () => void {\n\tconst unsubscribeFromLocalUpdates = Internal.subscribeToTransaction(\n\t\ttoken,\n\t\t(clientUpdate) => {\n\t\t\tsocket.emit(`tx-run:${token.key}`, clientUpdate)\n\t\t},\n\t\t`tx-run:${token.key}:${socket.id}`,\n\t\tstore,\n\t)\n\n\treturn () => {\n\t\tunsubscribeFromLocalUpdates()\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull-atom.ts","../src/use-realtime-service.ts","../src/use-single-effect.ts","../src/on-mount.ts","../src/use-pull-atom-family-member.ts","../src/use-pull-mutable-atom.ts","../src/use-pull-mutable-family-member.ts","../src/use-pull-selector.ts","../src/use-pull-selector-family-member.ts","../src/use-push.ts","../src/use-server-action.ts","../src/use-sync-continuity.ts","../../realtime-client/src/sync-continuity.ts"],"names":["RTC","React","StoreContext","useO","findInStore","useI","actUponStore","confirmedUpdate"],"mappings":"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","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext = React.createContext<RealtimeReactStore>({\n\tsocket: null,\n\tservices: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import * as React from \"react\"\n\nconst { NODE_ENV } = process.env\nconst IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined): void {\n\tuseSingleEffect(effect, [])\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(family, subKey, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<\n\tT,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(token, socket, store),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn actUponStore(token, arbitrary(), store)\n}\n","import { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\nimport { syncContinuity } from \"../../realtime-client/src/sync-continuity\"\nimport type { ContinuityToken } from \"../../realtime/src/realtime-continuity\"\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(token, socket, store)\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { deleteAtom } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tassignTransactionToContinuity,\n\tgetEpochNumberOfContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function syncContinuity<ƒ extends AtomIO.ƒn>(\n\tcontinuity: ContinuityToken,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(optimisticUpdateQueue, store)\n\tconst confirmedUpdates = getFromStore(confirmedUpdateQueue, store)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\t// console.log(`❗❗❗❗❗`, k, v)\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(continuityKey, epoch, store)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = (\n\t\tconfirmedUpdate: AtomIO.TransactionUpdate<ƒ>,\n\t) => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(\n\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t(queue) => {\n\t\t\t\t\tqueue.shift()\n\t\t\t\t\treturn queue\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(token, id, store)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑‍⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmedUpdate.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmedUpdate)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmedUpdate,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tconst continuityEpoch = getEpochNumberOfContinuity(continuityKey, store)\n\t\t\tconst isRoot = isRootStore(store)\n\n\t\t\tif (isRoot && continuityEpoch === confirmedUpdate.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmedUpdate.epoch} (${confirmedUpdate.key} ${confirmedUpdate.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(continuityKey, confirmedUpdate.epoch, store)\n\t\t\t} else if (isRoot && continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑‍⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${\n\t\t\t\t\t\tconfirmedUpdate.epoch\n\t\t\t\t\t} but still waiting for update #${continuityEpoch + 1}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmedUpdate.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmedUpdate.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmedUpdate.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(continuityKey, transaction.key, store)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\ttransaction,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\tkey: transaction.key,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\tstore,\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tsocket.on(`reveal:${continuityKey}`, (revealed: Json.Array) => {\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t})\n\tsocket.on(\n\t\t`conceal:${continuityKey}`,\n\t\t(concealed: AtomIO.AtomToken<unknown>[]) => {\n\t\t\tfor (const token of concealed) {\n\t\t\t\tdeleteAtom(token, store)\n\t\t\t}\n\t\t},\n\t)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull-atom.ts","../src/use-realtime-service.ts","../src/use-single-effect.ts","../src/on-mount.ts","../src/use-pull-atom-family-member.ts","../src/use-pull-mutable-atom.ts","../src/use-pull-mutable-family-member.ts","../src/use-pull-selector.ts","../src/use-pull-selector-family-member.ts","../src/use-push.ts","../src/use-server-action.ts","../src/use-sync-continuity.ts"],"names":["RTC","React","StoreContext","useO","findInStore","useI"],"mappings":"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","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext = React.createContext<RealtimeReactStore>({\n\tsocket: null,\n\tservices: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import * as React from \"react\"\n\nconst { NODE_ENV } = process.env\nconst IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined): void {\n\tuseSingleEffect(effect, [])\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(family, subKey, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullSelectorFamilyMember<\n\tT,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(token, socket, store),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn actUponStore(token, arbitrary(), store)\n}\n","import { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\nimport { syncContinuity } from \"../../realtime-client/src/sync-continuity\"\nimport type { ContinuityToken } from \"../../realtime/src/realtime-continuity\"\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(token, socket, store)\n\t})\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ipc-sockets/child-socket.ts","../src/ipc-sockets/custom-socket.ts","../src/ipc-sockets/parent-socket.ts","../src/realtime-continuity-synchronizer.ts","../src/realtime-server-stores/realtime-continuity-store.ts","../src/realtime-server-stores/server-room-external-actions.ts","../src/realtime-server-stores/server-room-external-store.ts","../src/realtime-server-stores/server-sync-store.ts","../src/realtime-server-stores/server-user-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"],"names":["process","parsedEvent","parsedLog","parseJson","IMPLICIT","getJsonToken","selectorFamily","atomFamily","SetRTX","unsubscribeFunctions","atom","transaction","getFromStore","subscribeToState","findInStore","stringifyJson","getUpdateToken","actUponStore"],"mappings":"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","sourcesContent":["import type { ChildProcessWithoutNullStreams } from \"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\nexport class ChildSocket<\n\tI extends Events,\n\tO extends Events & {\n\t\t/* eslint-disable quotes */\n\t\t\"setup-relay\": [string]\n\t\t/* eslint-enable quotes */\n\t},\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\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(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `w`:\n\t\t\t\t\tthis.logger.warn(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `e`:\n\t\t\t\t\tthis.logger.error(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tpublic process: ChildProcessWithoutNullStreams,\n\t\tpublic key: string,\n\t\tpublic logger: {\n\t\t\tinfo: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t\twarn: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t\terror: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t} = console,\n\t) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\x03`\n\t\t\tconst errorHandler = (err) => {\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.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 === `✨`) {\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\tconst 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\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 (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\tconst 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\tconst parsedLog = 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 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 I, 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\n\tpublic constructor(\n\t\tpublic emit: <Event extends keyof O>(\n\t\t\tevent: Event,\n\t\t\t...args: O[Event]\n\t\t) => CustomSocket<I, O>,\n\t) {\n\t\tthis.listeners = new Map()\n\t\tthis.globalListeners = new Set()\n\t}\n\n\tpublic on<Event extends keyof I>(\n\t\tevent: Event,\n\t\tlistener: (...args: I[Event]) => void,\n\t): CustomSocket<I, O> {\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(\n\t\tlistener: (event: string, ...args: Json.Array) => void,\n\t): CustomSocket<I, O> {\n\t\tthis.globalListeners.add(listener)\n\t\treturn this\n\t}\n\n\tpublic off<Event extends keyof I>(\n\t\tevent: Event,\n\t\tlistener?: (...args: I[Event]) => void,\n\t): CustomSocket<I, O> {\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(\n\t\tlistener: (event: string, ...args: Json.Array) => void,\n\t): CustomSocket<I, O> {\n\t\tthis.globalListeners.delete(listener)\n\t\treturn this\n\t}\n}\n","import { IMPLICIT, Subject } from \"atom.io/internal\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\nimport type { Json } from \"atom.io/json\"\n\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\nimport { CustomSocket } from \"./custom-socket\"\nimport type { EventBuffer, Events } 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 `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\tO extends Events & {\n\t\t[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]\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 => this.log(`i`, ...args),\n\t\twarn: (...args: any[]): void => this.log(`w`, ...args),\n\t\terror: (...args: any[]): void => this.log(`e`, ...args),\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\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 parsedEvent = parseJson(this.incompleteData)\n\t\t\t\t\tthis.logger.info(`🎰`, `received`, parsedEvent)\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\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\tprocess.exit(0)\n\t\t})\n\t\tprocess.on(`exit`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `exited`)\n\t\t\tprocess.exit(0)\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, ...O[keyof O]]))\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(`✨`)\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 * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tisRootStore,\n\tsubscribeToState,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json, JsonIO } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { ServerConfig, Socket } from \".\"\nimport { socketAtoms, usersOfSockets } from \".\"\n\nimport {\n\tredactTransactionUpdateContent,\n\tuserUnacknowledgedQueues,\n} from \"./realtime-server-stores\"\n\nexport type RealtimeContinuitySynchronizer = ReturnType<\n\ttypeof realtimeContinuitySynchronizer\n>\nexport function realtimeContinuitySynchronizer({\n\tsocket: initialSocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function synchronizer(continuity: ContinuityToken): () => void {\n\t\tlet socket: Socket | null = initialSocket\n\n\t\tconst continuityKey = continuity.key\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 = getFromStore(userKeyState, store)\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\t\tconst socketKeyState = findInStore(\n\t\t\tusersOfSockets.states.socketKeyOfUser,\n\t\t\tuserKey,\n\t\t\tstore,\n\t\t)\n\t\tsubscribeToState(\n\t\t\tsocketKeyState,\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.error(\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`Tried to create a synchronizer for a user (${userKey}) that is not connected to a socket.`,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst newSocketState = findInStore(socketAtoms, newSocketKey, store)\n\t\t\t\tconst newSocket = getFromStore(newSocketState, store)\n\t\t\t\tsocket = newSocket\n\t\t\t},\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\tstore,\n\t\t)\n\n\t\tconst userUnacknowledgedQueue = findInStore(\n\t\t\tuserUnacknowledgedQueues,\n\t\t\tuserKey,\n\t\t\tstore,\n\t\t)\n\t\tconst userUnacknowledgedUpdates = getFromStore(\n\t\t\tuserUnacknowledgedQueue,\n\t\t\tstore,\n\t\t)\n\t\tconst unsubscribeFunctions: (() => void)[] = []\n\n\t\tconst revealPerspectives = (): (() => void) => {\n\t\t\tconst unsubscribeFunctions: (() => void)[] = []\n\t\t\tfor (const perspective of continuity.perspectives) {\n\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\tconst userViewState = findInStore(viewAtoms, userKey, store)\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tuserViewState,\n\t\t\t\t\t({ oldValue, newValue }) => {\n\t\t\t\t\t\tconst oldKeys = oldValue.map((token) => token.key)\n\t\t\t\t\t\tconst newKeys = newValue.map((token) => token.key)\n\t\t\t\t\t\tconst concealed = oldValue.filter(\n\t\t\t\t\t\t\t(token) => !newKeys.includes(token.key),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst revealed = newValue\n\t\t\t\t\t\t\t.filter((token) => !oldKeys.includes(token.key))\n\t\t\t\t\t\t\t.flatMap((token) => {\n\t\t\t\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? getJsonToken(token) : token\n\t\t\t\t\t\t\t\tconst resource = getFromStore(resourceToken, store)\n\t\t\t\t\t\t\t\treturn [resourceToken, resource]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t`👁`,\n\t\t\t\t\t\t\t`atom`,\n\t\t\t\t\t\t\tperspective.resourceAtoms.key,\n\t\t\t\t\t\t\t`${userKey} has a new perspective`,\n\t\t\t\t\t\t\t{ oldKeys, newKeys, revealed, concealed },\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (revealed.length > 0) {\n\t\t\t\t\t\t\tsocket?.emit(`reveal:${continuityKey}`, revealed)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (concealed.length > 0) {\n\t\t\t\t\t\t\tsocket?.emit(`conceal:${continuityKey}`, concealed)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t`sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubscribeFunctions.push(unsubscribe)\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\t}\n\t\t}\n\t\tconst unsubscribeFromPerspectives = revealPerspectives()\n\n\t\tconst sendInitialPayload = () => {\n\t\t\tconst initialPayload: Json.Serializable[] = []\n\t\t\tfor (const atom of continuity.globals) {\n\t\t\t\tconst resourceToken =\n\t\t\t\t\tatom.type === `mutable_atom` ? getJsonToken(atom) : atom\n\t\t\t\tinitialPayload.push(resourceToken, getFromStore(atom, store))\n\t\t\t}\n\t\t\tfor (const perspective of continuity.perspectives) {\n\t\t\t\tconst { viewAtoms, resourceAtoms } = perspective\n\t\t\t\tconst userViewState = findInStore(viewAtoms, userKey, store)\n\t\t\t\tconst userView = getFromStore(userViewState, store)\n\t\t\t\tstore.logger.info(`👁`, `atom`, resourceAtoms.key, `${userKey} can see`, {\n\t\t\t\t\tviewAtoms,\n\t\t\t\t\tresourceAtoms,\n\t\t\t\t\tuserView,\n\t\t\t\t})\n\t\t\t\tfor (const visibleToken of userView) {\n\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\tvisibleToken.type === `mutable_atom`\n\t\t\t\t\t\t\t? getJsonToken(visibleToken)\n\t\t\t\t\t\t\t: visibleToken\n\t\t\t\t\tconst resource = getFromStore(resourceToken, store)\n\n\t\t\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst epoch = isRootStore(store)\n\t\t\t\t? store.transactionMeta.epoch.get(continuityKey) ?? null\n\t\t\t\t: null\n\n\t\t\tsocket?.emit(`continuity-init:${continuityKey}`, epoch, initialPayload)\n\n\t\t\tfor (const transaction of continuity.actions) {\n\t\t\t\tconst unsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\t\ttransaction,\n\t\t\t\t\t(update) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst visibleKeys = continuity.globals\n\t\t\t\t\t\t\t\t.map((atom) => atom.key)\n\t\t\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\t\t\tcontinuity.perspectives.flatMap((perspective) => {\n\t\t\t\t\t\t\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\t\t\t\t\t\t\tconst userPerspectiveTokenState = findInStore(\n\t\t\t\t\t\t\t\t\t\t\tviewAtoms,\n\t\t\t\t\t\t\t\t\t\t\tuserKey,\n\t\t\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tconst visibleTokens = getFromStore(\n\t\t\t\t\t\t\t\t\t\t\tuserPerspectiveTokenState,\n\t\t\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\treturn visibleTokens.map((token) => {\n\t\t\t\t\t\t\t\t\t\t\tconst key =\n\t\t\t\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom`\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `*` + token.key\n\t\t\t\t\t\t\t\t\t\t\t\t\t: token.key\n\t\t\t\t\t\t\t\t\t\t\treturn key\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst redactedUpdates = redactTransactionUpdateContent(\n\t\t\t\t\t\t\t\tvisibleKeys,\n\t\t\t\t\t\t\t\tupdate.updates,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst redactedUpdate = {\n\t\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t\t\tupdates: redactedUpdates,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// setIntoStore(\n\t\t\t\t\t\t\t// \tuserUnacknowledgedQueue,\n\t\t\t\t\t\t\t// \t(updates) => {\n\t\t\t\t\t\t\t// \t\tif (redactedUpdate) {\n\t\t\t\t\t\t\t// \t\t\tupdates.push(redactedUpdate)\n\t\t\t\t\t\t\t// \t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t// \t\t}\n\t\t\t\t\t\t\t// \t\treturn updates\n\t\t\t\t\t\t\t// \t},\n\t\t\t\t\t\t\t// \tstore,\n\t\t\t\t\t\t\t// )\n\n\t\t\t\t\t\t\tsocket?.emit(\n\t\t\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\t\t\tredactedUpdate as Json.Serializable,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} catch (thrown) {\n\t\t\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t\t\t`failed to send update from transaction ${transaction.key} to ${userKey}`,\n\t\t\t\t\t\t\t\t\tthrown.message,\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\t},\n\t\t\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubscribeFunctions.push(unsubscribeFromTransaction)\n\t\t\t}\n\t\t}\n\t\tsocket.off(`get:${continuityKey}`, sendInitialPayload)\n\t\tsocket.on(`get:${continuityKey}`, sendInitialPayload)\n\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: Pick<AtomIO.TransactionUpdate<JsonIO>, `id` | `key` | `params`>,\n\t\t) => {\n\t\t\tstore.logger.info(`🛎️`, `continuity`, continuityKey, `received`, update)\n\t\t\tconst transactionKey = update.key\n\t\t\tconst updateId = update.id\n\t\t\tconst performanceKey = `tx-run:${transactionKey}:${updateId}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\ttry {\n\t\t\t\tactUponStore(\n\t\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\t\tupdateId,\n\t\t\t\t\tstore,\n\t\t\t\t)(...update.params)\n\t\t\t} catch (thrown) {\n\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\tstore.logger.error(\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`failed to run transaction ${transactionKey} with update ${updateId}`,\n\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\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(\n\t\t\t\t`🚀`,\n\t\t\t\t`transaction`,\n\t\t\t\ttransactionKey,\n\t\t\t\tupdateId,\n\t\t\t\tmetric.duration,\n\t\t\t)\n\n\t\t\tconst valuesOfCardsViewKey = `valuesOfCardsView(\"${userKey}\")`\n\t\t\tconst rootsOfCardValueView =\n\t\t\t\tstore.selectorAtoms.getRelatedKeys(valuesOfCardsViewKey)\n\t\t\tconst myCardValueView = store.valueMap.get(valuesOfCardsViewKey)\n\n\t\t\tstore.logger.info(\n\t\t\t\t`👁`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`seeing ${userKey} card values`,\n\t\t\t\t{\n\t\t\t\t\tvaluesOfCardsViewKey,\n\t\t\t\t\trootsOfCardValueView,\n\t\t\t\t\tmyCardValueView,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tsocket.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${continuityKey}`, fillTransactionRequest)\n\n\t\t// let i = 0\n\t\t// let n = 1\n\t\t// let retryTimeout: NodeJS.Timeout | undefined\n\t\t// const trackClientAcknowledgement = (epoch: number) => {\n\t\t// \tstore.logger.info(\n\t\t// \t\t`👍`,\n\t\t// \t\t`continuity`,\n\t\t// \t\tcontinuityKey,\n\t\t// \t\t`${userKey} acknowledged epoch ${epoch}`,\n\t\t// \t)\n\t\t// \tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\t\t// \tif (isUnacknowledged) {\n\t\t// \t\tsetIntoStore(\n\t\t// \t\t\tuserUnacknowledgedQueue,\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\t// subscribeToState(\n\t\t// \tuserUnacknowledgedQueue,\n\t\t// \t({ newValue }) => {\n\t\t// \t\tif (newValue.length === 0) {\n\t\t// \t\t\tclearInterval(retryTimeout)\n\t\t// \t\t\tsocket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t// \t\t\tretryTimeout = undefined\n\t\t// \t\t}\n\t\t// \t\tif (newValue.length > 0) {\n\t\t// \t\t\tif (retryTimeout) {\n\t\t// \t\t\t\treturn\n\t\t// \t\t\t}\n\n\t\t// \t\t\tsocket?.on(`ack:${continuityKey}`, trackClientAcknowledgement)\n\n\t\t// \t\t\tretryTimeout = setInterval(() => {\n\t\t// \t\t\t\ti++\n\t\t// \t\t\t\tif (i === n) {\n\t\t// \t\t\t\t\tn += i\n\t\t// \t\t\t\t\tconst toEmit = newValue[0]\n\t\t// \t\t\t\t\tif (!toEmit) return\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`${store.config.name} retrying ${userKey}`,\n\t\t// \t\t\t\t\t\tsocket?.id,\n\t\t// \t\t\t\t\t\tnewValue,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t\tsocket?.emit(\n\t\t// \t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t// \t\t\t\t\t\ttoEmit as Json.Serializable,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t}\n\t\t// \t\t\t}, 250)\n\t\t// \t\t}\n\t\t// \t},\n\t\t// \t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t// \tstore,\n\t\t// )\n\n\t\treturn () => {\n\t\t\t// clearInterval(retryTimeout)\n\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\t// socket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t\tunsubscribeFromPerspectives()\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 { selectorFamily } from \"atom.io\"\nimport type { TransactionUpdate } from \"atom.io\"\nimport { IMPLICIT, getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { JsonIO } from \"atom.io/json\"\nimport { SyncGroup } from \"atom.io/realtime\"\n// import { completeUpdateAtoms } from \"atom.io/realtime-server\"\n\nconst redactorAtoms = selectorFamily<\n\t(update: TransactionUpdate<any>) => TransactionUpdate<any>,\n\t{ userId: string; syncGroupKey: string }\n>({\n\tkey: `perspectiveRedactor`,\n\tget:\n\t\t({ userId, syncGroupKey }) =>\n\t\t({ get, find }) => {\n\t\t\tconst syncGroup = SyncGroup.existing.get(syncGroupKey)\n\t\t\tif (!syncGroup) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Tried to create a synchronizer for a sync group that does not exist.`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst userPerspectiveTokens = syncGroup.perspectives.flatMap(\n\t\t\t\t({ viewAtoms }) => {\n\t\t\t\t\tconst userPerspectiveToken = find(viewAtoms, userId)\n\t\t\t\t\tconst userPerspective = get(userPerspectiveToken)\n\t\t\t\t\tconst visibleTokens = [...userPerspective].map((token) => {\n\t\t\t\t\t\treturn token.type === `mutable_atom`\n\t\t\t\t\t\t\t? getUpdateToken(token).key\n\t\t\t\t\t\t\t: token.key\n\t\t\t\t\t})\n\t\t\t\t\tIMPLICIT.STORE.logger.info(\n\t\t\t\t\t\t`🔭`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tsyncGroupKey,\n\t\t\t\t\t\t`${userId} can see ${visibleTokens.length} tokens in ${viewAtoms.key}`,\n\t\t\t\t\t\tvisibleTokens,\n\t\t\t\t\t)\n\t\t\t\t\treturn visibleTokens\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst filterTransactionUpdate = (\n\t\t\t\tvisible: string[],\n\t\t\t\ttransactionUpdate: TransactionUpdate<any>,\n\t\t\t): TransactionUpdate<any> => {\n\t\t\t\tIMPLICIT.STORE.logger.info(\n\t\t\t\t\t`🖌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tsyncGroupKey,\n\t\t\t\t\t`redacting updates from ${transactionUpdate.epoch}:${transactionUpdate.key}:${transactionUpdate.id}`,\n\t\t\t\t\tvisible,\n\t\t\t\t\ttransactionUpdate.updates,\n\t\t\t\t)\n\t\t\t\tconst updates = transactionUpdate.updates\n\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\tif (`newValue` in update) {\n\t\t\t\t\t\t\treturn visible.includes(update.key)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true\n\t\t\t\t\t})\n\t\t\t\t\t.map((update) => {\n\t\t\t\t\t\tif (`updates` in update) {\n\t\t\t\t\t\t\treturn filterTransactionUpdate(visible, update)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn update\n\t\t\t\t\t})\n\t\t\t\tconst filtered: TransactionUpdate<any> = {\n\t\t\t\t\t...transactionUpdate,\n\t\t\t\t\tupdates,\n\t\t\t\t}\n\t\t\t\treturn filtered\n\t\t\t}\n\t\t\tconst filter: (updates: TransactionUpdate<any>) => TransactionUpdate<any> =\n\t\t\t\t(update) => {\n\t\t\t\t\tconst visibleKeys: string[] = syncGroup.globals.map((atomToken) =>\n\t\t\t\t\t\tatomToken.type === `mutable_atom`\n\t\t\t\t\t\t\t? getUpdateToken(atomToken).key\n\t\t\t\t\t\t\t: atomToken.key,\n\t\t\t\t\t)\n\t\t\t\t\tvisibleKeys.push(...userPerspectiveTokens)\n\t\t\t\t\treturn filterTransactionUpdate(visibleKeys, update)\n\t\t\t\t}\n\t\t\treturn filter\n\t\t},\n})\n// export const occludedUpdateSelectors = selectorFamily<\n// \tPick<\n// \t\tTransactionUpdate<JsonIO>,\n// \t\t`epoch` | `id` | `key` | `output` | `updates`\n// \t> | null,\n// \t{ userId: string; syncGroupKey: string; updateId: string }\n// >({\n// \tkey: `occludedUpdate`,\n// \tget:\n// \t\t({ userId, syncGroupKey, updateId }) =>\n// \t\t({ get, find }) => {\n// \t\t\tconst updateState = find(completeUpdateAtoms, updateId)\n// \t\t\tconst update = get(updateState)\n// \t\t\tconst redactorKey = { userId, syncGroupKey }\n// \t\t\tconst redactorState = find(redactorAtoms, redactorKey)\n// \t\t\tconst redact = get(redactorState)\n// \t\t\tif (update) {\n// \t\t\t\t// return redact(update)\n// \t\t\t\treturn update\n// \t\t\t}\n// \t\t\treturn null\n// \t\t},\n// })\n","import * as AtomIO from \"atom.io\"\nimport type { Loadable } from \"atom.io/data\"\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.transaction<\n\t(\n\t\troomId: string,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n>({\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.transaction<\n\t(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta\n>({\n\tkey: `joinRoom`,\n\tdo: (transactors, roomId, userId, enteredAtEpoch) => {\n\t\tconst meta = { enteredAtEpoch }\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.set(roomId, userId, meta)\n\t\t})\n\t\treturn meta\n\t},\n})\nexport type JoinRoomIO = AtomIO.TransactionIO<typeof joinRoomTX>\n\nexport const leaveRoomTX = AtomIO.transaction<\n\t(roomId: string, userId: string) => void\n>({\n\tkey: `leaveRoom`,\n\tdo: (transactors, roomId, userId) => {\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.delete({ room: roomId, user: userId })\n\t\t})\n\t},\n})\nexport type LeaveRoomIO = AtomIO.TransactionIO<typeof leaveRoomTX>\n\nexport const destroyRoomTX = AtomIO.transaction<(roomId: string) => void>({\n\tkey: `destroyRoom`,\n\tdo: (transactors, roomId) => {\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.delete({ room: roomId })\n\t\t})\n\t\ttransactors.set(roomIndex, (s) => (s.delete(roomId), s))\n\t},\n})\n","import type { ChildProcessWithoutNullStreams } from \"child_process\"\nimport { spawn } from \"child_process\"\n\nimport { atomFamily, selectorFamily } from \"atom.io\"\nimport type { Loadable } from \"atom.io/data\"\nimport { ChildSocket } from \"../ipc-sockets\"\n\nexport type RoomArguments =\n\t| [script: string, options: string[]]\n\t| [script: string]\n\nexport const roomArgumentsAtoms = atomFamily<RoomArguments, string>({\n\tkey: `roomArguments`,\n\tdefault: [`echo`, [`Hello World!`]],\n})\n\nexport const roomSelectors = selectorFamily<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n>({\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() === `✨`) {\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 { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\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\tif (`newValue` in update) {\n\t\t\t\treturn update\n\t\t\t}\n\t\t\tconst redacted = redactTransactionUpdateContent(\n\t\t\t\tvisibleStateKeys,\n\t\t\t\tupdate.updates,\n\t\t\t)\n\t\t\treturn { ...update, updates: redacted }\n\t\t})\n\t\t.filter((update) => {\n\t\t\tif (`newValue` in update) {\n\t\t\t\treturn visibleStateKeys.includes(update.key)\n\t\t\t}\n\t\t\treturn true\n\t\t})\n}\n\nexport const actionOcclusionAtoms = atomFamily<\n\t{\n\t\tocclude: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\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 const userUnacknowledgedQueues = atomFamily<\n\tPick<TransactionUpdate<any>, `epoch` | `id` | `key` | `output` | `updates`>[],\n\tstring\n>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n","import { atom, atomFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type { Socket } from \"..\"\n\nexport const socketAtoms = atomFamily<Socket | null, string>({\n\tkey: `sockets`,\n\tdefault: null,\n})\n\nexport const socketIndex = atom({\n\tkey: `socketsIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\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","import type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, getFromStore, 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(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 type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, getFromStore } 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}`, getFromStore(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 type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetFromStore,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport { type Json, 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 Json.Serializable,\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(index, store)\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(family, subKey, store)\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(token, store))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\ttoken,\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\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\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 {\n\tIMPLICIT,\n\tgetFromStore,\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}`, getFromStore(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 type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { 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 Json.Serializable,\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(index, store)\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(family, subKey, store)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(`init:${token.key}`, getFromStore(jsonToken, store))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\tupdateToken,\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\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\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 { 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) => setIntoStore(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 type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, actUponStore } 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<ƒ extends JsonIO>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: Pick<AtomIO.TransactionUpdate<ƒ>, `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<ƒ>(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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ipc-sockets/child-socket.ts","../src/ipc-sockets/custom-socket.ts","../src/ipc-sockets/parent-socket.ts","../src/realtime-continuity-synchronizer.ts","../src/realtime-server-stores/realtime-continuity-store.ts","../src/realtime-server-stores/server-room-external-actions.ts","../src/realtime-server-stores/server-room-external-store.ts","../src/realtime-server-stores/server-sync-store.ts","../src/realtime-server-stores/server-user-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"],"names":["process","parsedEvent","parsedLog","parseJson","IMPLICIT","getJsonToken","selectorFamily","atomFamily","SetRTX","unsubscribeFunctions","atom","transaction","getFromStore","subscribeToState","findInStore","stringifyJson","getUpdateToken","actUponStore"],"mappings":"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","sourcesContent":["import type { ChildProcessWithoutNullStreams } from \"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\nexport class ChildSocket<\n\tI extends Events,\n\tO extends Events & {\n\t\t/* eslint-disable quotes */\n\t\t\"setup-relay\": [string]\n\t\t/* eslint-enable quotes */\n\t},\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\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(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `w`:\n\t\t\t\t\tthis.logger.warn(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t\tcase `e`:\n\t\t\t\t\tthis.logger.error(this.id, this.key, ...rest)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic constructor(\n\t\tpublic process: ChildProcessWithoutNullStreams,\n\t\tpublic key: string,\n\t\tpublic logger: {\n\t\t\tinfo: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t\twarn: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t\terror: (prefix: string, message: string, ...args: unknown[]) => void\n\t\t} = console,\n\t) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\x03`\n\t\t\tconst errorHandler = (err) => {\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.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 === `✨`) {\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\tconst 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\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 (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\tconst 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\tconst parsedLog = 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 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 I, 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\n\tpublic constructor(\n\t\tpublic emit: <Event extends keyof O>(\n\t\t\tevent: Event,\n\t\t\t...args: O[Event]\n\t\t) => CustomSocket<I, O>,\n\t) {\n\t\tthis.listeners = new Map()\n\t\tthis.globalListeners = new Set()\n\t}\n\n\tpublic on<Event extends keyof I>(\n\t\tevent: Event,\n\t\tlistener: (...args: I[Event]) => void,\n\t): CustomSocket<I, O> {\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(\n\t\tlistener: (event: string, ...args: Json.Array) => void,\n\t): CustomSocket<I, O> {\n\t\tthis.globalListeners.add(listener)\n\t\treturn this\n\t}\n\n\tpublic off<Event extends keyof I>(\n\t\tevent: Event,\n\t\tlistener?: (...args: I[Event]) => void,\n\t): CustomSocket<I, O> {\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(\n\t\tlistener: (event: string, ...args: Json.Array) => void,\n\t): CustomSocket<I, O> {\n\t\tthis.globalListeners.delete(listener)\n\t\treturn this\n\t}\n}\n","import { IMPLICIT, Subject } from \"atom.io/internal\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\nimport type { Json } from \"atom.io/json\"\n\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\nimport { CustomSocket } from \"./custom-socket\"\nimport type { EventBuffer, Events } 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 `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\tO extends Events & {\n\t\t[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]\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 => this.log(`i`, ...args),\n\t\twarn: (...args: any[]): void => this.log(`w`, ...args),\n\t\terror: (...args: any[]): void => this.log(`e`, ...args),\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\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 parsedEvent = parseJson(this.incompleteData)\n\t\t\t\t\tthis.logger.info(`🎰`, `received`, parsedEvent)\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\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\tprocess.exit(0)\n\t\t})\n\t\tprocess.on(`exit`, () => {\n\t\t\tthis.logger.info(`🔥`, this.id, `exited`)\n\t\t\tprocess.exit(0)\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, ...O[keyof O]]))\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(`✨`)\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 * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tisRootStore,\n\tsubscribeToState,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json, JsonIO } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\n\nimport type { ServerConfig, Socket } from \".\"\nimport { socketAtoms, usersOfSockets } from \".\"\n\nimport {\n\tredactTransactionUpdateContent,\n\tuserUnacknowledgedQueues,\n} from \"./realtime-server-stores\"\n\nexport type RealtimeContinuitySynchronizer = ReturnType<\n\ttypeof realtimeContinuitySynchronizer\n>\nexport function realtimeContinuitySynchronizer({\n\tsocket: initialSocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function synchronizer(continuity: ContinuityToken): () => void {\n\t\tlet socket: Socket | null = initialSocket\n\n\t\tconst continuityKey = continuity.key\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 = getFromStore(userKeyState, store)\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\t\tconst socketKeyState = findInStore(\n\t\t\tusersOfSockets.states.socketKeyOfUser,\n\t\t\tuserKey,\n\t\t\tstore,\n\t\t)\n\t\tsubscribeToState(\n\t\t\tsocketKeyState,\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.error(\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`Tried to create a synchronizer for a user (${userKey}) that is not connected to a socket.`,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst newSocketState = findInStore(socketAtoms, newSocketKey, store)\n\t\t\t\tconst newSocket = getFromStore(newSocketState, store)\n\t\t\t\tsocket = newSocket\n\t\t\t},\n\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\tstore,\n\t\t)\n\n\t\tconst userUnacknowledgedQueue = findInStore(\n\t\t\tuserUnacknowledgedQueues,\n\t\t\tuserKey,\n\t\t\tstore,\n\t\t)\n\t\tconst userUnacknowledgedUpdates = getFromStore(\n\t\t\tuserUnacknowledgedQueue,\n\t\t\tstore,\n\t\t)\n\t\tconst unsubscribeFunctions: (() => void)[] = []\n\n\t\tconst revealPerspectives = (): (() => void) => {\n\t\t\tconst unsubscribeFunctions: (() => void)[] = []\n\t\t\tfor (const perspective of continuity.perspectives) {\n\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\tconst userViewState = findInStore(viewAtoms, userKey, store)\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tuserViewState,\n\t\t\t\t\t({ oldValue, newValue }) => {\n\t\t\t\t\t\tconst oldKeys = oldValue.map((token) => token.key)\n\t\t\t\t\t\tconst newKeys = newValue.map((token) => token.key)\n\t\t\t\t\t\tconst concealed = oldValue.filter(\n\t\t\t\t\t\t\t(token) => !newKeys.includes(token.key),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst revealed = newValue\n\t\t\t\t\t\t\t.filter((token) => !oldKeys.includes(token.key))\n\t\t\t\t\t\t\t.flatMap((token) => {\n\t\t\t\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom` ? getJsonToken(token) : token\n\t\t\t\t\t\t\t\tconst resource = getFromStore(resourceToken, store)\n\t\t\t\t\t\t\t\treturn [resourceToken, resource]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t`👁`,\n\t\t\t\t\t\t\t`atom`,\n\t\t\t\t\t\t\tperspective.resourceAtoms.key,\n\t\t\t\t\t\t\t`${userKey} has a new perspective`,\n\t\t\t\t\t\t\t{ oldKeys, newKeys, revealed, concealed },\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (revealed.length > 0) {\n\t\t\t\t\t\t\tsocket?.emit(`reveal:${continuityKey}`, revealed)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (concealed.length > 0) {\n\t\t\t\t\t\t\tsocket?.emit(`conceal:${continuityKey}`, concealed)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t`sync-continuity:${continuityKey}:${userKey}:perspective:${perspective.resourceAtoms.key}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubscribeFunctions.push(unsubscribe)\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\t}\n\t\t}\n\t\tconst unsubscribeFromPerspectives = revealPerspectives()\n\n\t\tconst sendInitialPayload = () => {\n\t\t\tconst initialPayload: Json.Serializable[] = []\n\t\t\tfor (const atom of continuity.globals) {\n\t\t\t\tconst resourceToken =\n\t\t\t\t\tatom.type === `mutable_atom` ? getJsonToken(atom) : atom\n\t\t\t\tinitialPayload.push(resourceToken, getFromStore(atom, store))\n\t\t\t}\n\t\t\tfor (const perspective of continuity.perspectives) {\n\t\t\t\tconst { viewAtoms, resourceAtoms } = perspective\n\t\t\t\tconst userViewState = findInStore(viewAtoms, userKey, store)\n\t\t\t\tconst userView = getFromStore(userViewState, store)\n\t\t\t\tstore.logger.info(`👁`, `atom`, resourceAtoms.key, `${userKey} can see`, {\n\t\t\t\t\tviewAtoms,\n\t\t\t\t\tresourceAtoms,\n\t\t\t\t\tuserView,\n\t\t\t\t})\n\t\t\t\tfor (const visibleToken of userView) {\n\t\t\t\t\tconst resourceToken =\n\t\t\t\t\t\tvisibleToken.type === `mutable_atom`\n\t\t\t\t\t\t\t? getJsonToken(visibleToken)\n\t\t\t\t\t\t\t: visibleToken\n\t\t\t\t\tconst resource = getFromStore(resourceToken, store)\n\n\t\t\t\t\tinitialPayload.push(resourceToken, resource)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst epoch = isRootStore(store)\n\t\t\t\t? store.transactionMeta.epoch.get(continuityKey) ?? null\n\t\t\t\t: null\n\n\t\t\tsocket?.emit(`continuity-init:${continuityKey}`, epoch, initialPayload)\n\n\t\t\tfor (const transaction of continuity.actions) {\n\t\t\t\tconst unsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\t\ttransaction,\n\t\t\t\t\t(update) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst visibleKeys = continuity.globals\n\t\t\t\t\t\t\t\t.map((atom) => atom.key)\n\t\t\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\t\t\tcontinuity.perspectives.flatMap((perspective) => {\n\t\t\t\t\t\t\t\t\t\tconst { viewAtoms } = perspective\n\t\t\t\t\t\t\t\t\t\tconst userPerspectiveTokenState = findInStore(\n\t\t\t\t\t\t\t\t\t\t\tviewAtoms,\n\t\t\t\t\t\t\t\t\t\t\tuserKey,\n\t\t\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tconst visibleTokens = getFromStore(\n\t\t\t\t\t\t\t\t\t\t\tuserPerspectiveTokenState,\n\t\t\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\treturn visibleTokens.map((token) => {\n\t\t\t\t\t\t\t\t\t\t\tconst key =\n\t\t\t\t\t\t\t\t\t\t\t\ttoken.type === `mutable_atom`\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `*` + token.key\n\t\t\t\t\t\t\t\t\t\t\t\t\t: token.key\n\t\t\t\t\t\t\t\t\t\t\treturn key\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst redactedUpdates = redactTransactionUpdateContent(\n\t\t\t\t\t\t\t\tvisibleKeys,\n\t\t\t\t\t\t\t\tupdate.updates,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst redactedUpdate = {\n\t\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t\t\tupdates: redactedUpdates,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// setIntoStore(\n\t\t\t\t\t\t\t// \tuserUnacknowledgedQueue,\n\t\t\t\t\t\t\t// \t(updates) => {\n\t\t\t\t\t\t\t// \t\tif (redactedUpdate) {\n\t\t\t\t\t\t\t// \t\t\tupdates.push(redactedUpdate)\n\t\t\t\t\t\t\t// \t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t// \t\t}\n\t\t\t\t\t\t\t// \t\treturn updates\n\t\t\t\t\t\t\t// \t},\n\t\t\t\t\t\t\t// \tstore,\n\t\t\t\t\t\t\t// )\n\n\t\t\t\t\t\t\tsocket?.emit(\n\t\t\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\t\t\tredactedUpdate as Json.Serializable,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} catch (thrown) {\n\t\t\t\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t\t\t\t`failed to send update from transaction ${transaction.key} to ${userKey}`,\n\t\t\t\t\t\t\t\t\tthrown.message,\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\t},\n\t\t\t\t\t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubscribeFunctions.push(unsubscribeFromTransaction)\n\t\t\t}\n\t\t}\n\t\tsocket.off(`get:${continuityKey}`, sendInitialPayload)\n\t\tsocket.on(`get:${continuityKey}`, sendInitialPayload)\n\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: Pick<AtomIO.TransactionUpdate<JsonIO>, `id` | `key` | `params`>,\n\t\t) => {\n\t\t\tstore.logger.info(`🛎️`, `continuity`, continuityKey, `received`, update)\n\t\t\tconst transactionKey = update.key\n\t\t\tconst updateId = update.id\n\t\t\tconst performanceKey = `tx-run:${transactionKey}:${updateId}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\ttry {\n\t\t\t\tactUponStore(\n\t\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\t\tupdateId,\n\t\t\t\t\tstore,\n\t\t\t\t)(...update.params)\n\t\t\t} catch (thrown) {\n\t\t\t\tif (thrown instanceof Error) {\n\t\t\t\t\tstore.logger.error(\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`failed to run transaction ${transactionKey} with update ${updateId}`,\n\t\t\t\t\t\tthrown.message,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\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(\n\t\t\t\t`🚀`,\n\t\t\t\t`transaction`,\n\t\t\t\ttransactionKey,\n\t\t\t\tupdateId,\n\t\t\t\tmetric.duration,\n\t\t\t)\n\n\t\t\tconst valuesOfCardsViewKey = `valuesOfCardsView(\"${userKey}\")`\n\t\t\tconst rootsOfCardValueView =\n\t\t\t\tstore.selectorAtoms.getRelatedKeys(valuesOfCardsViewKey)\n\t\t\tconst myCardValueView = store.valueMap.get(valuesOfCardsViewKey)\n\n\t\t\tstore.logger.info(\n\t\t\t\t`👁`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`seeing ${userKey} card values`,\n\t\t\t\t{\n\t\t\t\t\tvaluesOfCardsViewKey,\n\t\t\t\t\trootsOfCardValueView,\n\t\t\t\t\tmyCardValueView,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tsocket.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${continuityKey}`, fillTransactionRequest)\n\n\t\t// let i = 0\n\t\t// let n = 1\n\t\t// let retryTimeout: NodeJS.Timeout | undefined\n\t\t// const trackClientAcknowledgement = (epoch: number) => {\n\t\t// \tstore.logger.info(\n\t\t// \t\t`👍`,\n\t\t// \t\t`continuity`,\n\t\t// \t\tcontinuityKey,\n\t\t// \t\t`${userKey} acknowledged epoch ${epoch}`,\n\t\t// \t)\n\t\t// \tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\t\t// \tif (isUnacknowledged) {\n\t\t// \t\tsetIntoStore(\n\t\t// \t\t\tuserUnacknowledgedQueue,\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\t// subscribeToState(\n\t\t// \tuserUnacknowledgedQueue,\n\t\t// \t({ newValue }) => {\n\t\t// \t\tif (newValue.length === 0) {\n\t\t// \t\t\tclearInterval(retryTimeout)\n\t\t// \t\t\tsocket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t// \t\t\tretryTimeout = undefined\n\t\t// \t\t}\n\t\t// \t\tif (newValue.length > 0) {\n\t\t// \t\t\tif (retryTimeout) {\n\t\t// \t\t\t\treturn\n\t\t// \t\t\t}\n\n\t\t// \t\t\tsocket?.on(`ack:${continuityKey}`, trackClientAcknowledgement)\n\n\t\t// \t\t\tretryTimeout = setInterval(() => {\n\t\t// \t\t\t\ti++\n\t\t// \t\t\t\tif (i === n) {\n\t\t// \t\t\t\t\tn += i\n\t\t// \t\t\t\t\tconst toEmit = newValue[0]\n\t\t// \t\t\t\t\tif (!toEmit) return\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`${store.config.name} retrying ${userKey}`,\n\t\t// \t\t\t\t\t\tsocket?.id,\n\t\t// \t\t\t\t\t\tnewValue,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t\tsocket?.emit(\n\t\t// \t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t// \t\t\t\t\t\ttoEmit as Json.Serializable,\n\t\t// \t\t\t\t\t)\n\t\t// \t\t\t\t}\n\t\t// \t\t\t}, 250)\n\t\t// \t\t}\n\t\t// \t},\n\t\t// \t`sync-continuity:${continuityKey}:${userKey}`,\n\t\t// \tstore,\n\t\t// )\n\n\t\treturn () => {\n\t\t\t// clearInterval(retryTimeout)\n\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\t// socket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t\tunsubscribeFromPerspectives()\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 { selectorFamily } from \"atom.io\"\nimport type { TransactionUpdate } from \"atom.io\"\nimport { IMPLICIT, getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { JsonIO } from \"atom.io/json\"\nimport { SyncGroup } from \"atom.io/realtime\"\n// import { completeUpdateAtoms } from \"atom.io/realtime-server\"\n\nconst redactorAtoms = selectorFamily<\n\t(update: TransactionUpdate<any>) => TransactionUpdate<any>,\n\t{ userId: string; syncGroupKey: string }\n>({\n\tkey: `perspectiveRedactor`,\n\tget:\n\t\t({ userId, syncGroupKey }) =>\n\t\t({ get, find }) => {\n\t\t\tconst syncGroup = SyncGroup.existing.get(syncGroupKey)\n\t\t\tif (!syncGroup) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Tried to create a synchronizer for a sync group that does not exist.`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tconst userPerspectiveTokens = syncGroup.perspectives.flatMap(\n\t\t\t\t({ viewAtoms }) => {\n\t\t\t\t\tconst userPerspectiveToken = find(viewAtoms, userId)\n\t\t\t\t\tconst userPerspective = get(userPerspectiveToken)\n\t\t\t\t\tconst visibleTokens = [...userPerspective].map((token) => {\n\t\t\t\t\t\treturn token.type === `mutable_atom`\n\t\t\t\t\t\t\t? getUpdateToken(token).key\n\t\t\t\t\t\t\t: token.key\n\t\t\t\t\t})\n\t\t\t\t\tIMPLICIT.STORE.logger.info(\n\t\t\t\t\t\t`🔭`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tsyncGroupKey,\n\t\t\t\t\t\t`${userId} can see ${visibleTokens.length} tokens in ${viewAtoms.key}`,\n\t\t\t\t\t\tvisibleTokens,\n\t\t\t\t\t)\n\t\t\t\t\treturn visibleTokens\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst filterTransactionUpdate = (\n\t\t\t\tvisible: string[],\n\t\t\t\ttransactionUpdate: TransactionUpdate<any>,\n\t\t\t): TransactionUpdate<any> => {\n\t\t\t\tIMPLICIT.STORE.logger.info(\n\t\t\t\t\t`🖌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tsyncGroupKey,\n\t\t\t\t\t`redacting updates from ${transactionUpdate.epoch}:${transactionUpdate.key}:${transactionUpdate.id}`,\n\t\t\t\t\tvisible,\n\t\t\t\t\ttransactionUpdate.updates,\n\t\t\t\t)\n\t\t\t\tconst updates = transactionUpdate.updates\n\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\tif (`newValue` in update) {\n\t\t\t\t\t\t\treturn visible.includes(update.key)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true\n\t\t\t\t\t})\n\t\t\t\t\t.map((update) => {\n\t\t\t\t\t\tif (`updates` in update) {\n\t\t\t\t\t\t\treturn filterTransactionUpdate(visible, update)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn update\n\t\t\t\t\t})\n\t\t\t\tconst filtered: TransactionUpdate<any> = {\n\t\t\t\t\t...transactionUpdate,\n\t\t\t\t\tupdates,\n\t\t\t\t}\n\t\t\t\treturn filtered\n\t\t\t}\n\t\t\tconst filter: (updates: TransactionUpdate<any>) => TransactionUpdate<any> =\n\t\t\t\t(update) => {\n\t\t\t\t\tconst visibleKeys: string[] = syncGroup.globals.map((atomToken) =>\n\t\t\t\t\t\tatomToken.type === `mutable_atom`\n\t\t\t\t\t\t\t? getUpdateToken(atomToken).key\n\t\t\t\t\t\t\t: atomToken.key,\n\t\t\t\t\t)\n\t\t\t\t\tvisibleKeys.push(...userPerspectiveTokens)\n\t\t\t\t\treturn filterTransactionUpdate(visibleKeys, update)\n\t\t\t\t}\n\t\t\treturn filter\n\t\t},\n})\n// export const occludedUpdateSelectors = selectorFamily<\n// \tPick<\n// \t\tTransactionUpdate<JsonIO>,\n// \t\t`epoch` | `id` | `key` | `output` | `updates`\n// \t> | null,\n// \t{ userId: string; syncGroupKey: string; updateId: string }\n// >({\n// \tkey: `occludedUpdate`,\n// \tget:\n// \t\t({ userId, syncGroupKey, updateId }) =>\n// \t\t({ get, find }) => {\n// \t\t\tconst updateState = find(completeUpdateAtoms, updateId)\n// \t\t\tconst update = get(updateState)\n// \t\t\tconst redactorKey = { userId, syncGroupKey }\n// \t\t\tconst redactorState = find(redactorAtoms, redactorKey)\n// \t\t\tconst redact = get(redactorState)\n// \t\t\tif (update) {\n// \t\t\t\t// return redact(update)\n// \t\t\t\treturn update\n// \t\t\t}\n// \t\t\treturn null\n// \t\t},\n// })\n","import * as AtomIO from \"atom.io\"\nimport type { Loadable } from \"atom.io/data\"\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.transaction<\n\t(\n\t\troomId: string,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildSocket<any, any>>\n>({\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.transaction<\n\t(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta\n>({\n\tkey: `joinRoom`,\n\tdo: (transactors, roomId, userId, enteredAtEpoch) => {\n\t\tconst meta = { enteredAtEpoch }\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.set(roomId, userId, meta)\n\t\t})\n\t\treturn meta\n\t},\n})\nexport type JoinRoomIO = AtomIO.TransactionIO<typeof joinRoomTX>\n\nexport const leaveRoomTX = AtomIO.transaction<\n\t(roomId: string, userId: string) => void\n>({\n\tkey: `leaveRoom`,\n\tdo: (transactors, roomId, userId) => {\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.delete({ room: roomId, user: userId })\n\t\t})\n\t},\n})\nexport type LeaveRoomIO = AtomIO.TransactionIO<typeof leaveRoomTX>\n\nexport const destroyRoomTX = AtomIO.transaction<(roomId: string) => void>({\n\tkey: `destroyRoom`,\n\tdo: (transactors, roomId) => {\n\t\tusersInRooms.transact(transactors, ({ relations }) => {\n\t\t\trelations.delete({ room: roomId })\n\t\t})\n\t\ttransactors.set(roomIndex, (s) => (s.delete(roomId), s))\n\t},\n})\n","import type { ChildProcessWithoutNullStreams } from \"child_process\"\nimport { spawn } from \"child_process\"\n\nimport { atomFamily, selectorFamily } from \"atom.io\"\nimport type { Loadable } from \"atom.io/data\"\nimport { ChildSocket } from \"../ipc-sockets\"\n\nexport type RoomArguments =\n\t| [script: string, options: string[]]\n\t| [script: string]\n\nexport const roomArgumentsAtoms = atomFamily<RoomArguments, string>({\n\tkey: `roomArguments`,\n\tdefault: [`echo`, [`Hello World!`]],\n})\n\nexport const roomSelectors = selectorFamily<\n\tLoadable<ChildSocket<any, any>>,\n\tstring\n>({\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() === `✨`) {\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 { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\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\tif (`newValue` in update) {\n\t\t\t\treturn update\n\t\t\t}\n\t\t\tconst redacted = redactTransactionUpdateContent(\n\t\t\t\tvisibleStateKeys,\n\t\t\t\tupdate.updates,\n\t\t\t)\n\t\t\treturn { ...update, updates: redacted }\n\t\t})\n\t\t.filter((update) => {\n\t\t\tif (`newValue` in update) {\n\t\t\t\treturn visibleStateKeys.includes(update.key)\n\t\t\t}\n\t\t\treturn true\n\t\t})\n}\n\nexport const actionOcclusionAtoms = atomFamily<\n\t{\n\t\tocclude: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\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 const userUnacknowledgedQueues = atomFamily<\n\tPick<TransactionUpdate<any>, `epoch` | `id` | `key` | `output` | `updates`>[],\n\tstring\n>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n","import { atom, atomFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type { Socket } from \"..\"\n\nexport const socketAtoms = atomFamily<Socket | null, string>({\n\tkey: `sockets`,\n\tdefault: null,\n})\n\nexport const socketIndex = atom({\n\tkey: `socketsIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\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","import type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, getFromStore, 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(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 type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, getFromStore } 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}`, getFromStore(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 type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetFromStore,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport { type Json, 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 Json.Serializable,\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(index, store)\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(family, subKey, store)\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, getFromStore(token, store))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\ttoken,\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\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\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 {\n\tIMPLICIT,\n\tgetFromStore,\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}`, getFromStore(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 type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { 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 Json.Serializable,\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(index, store)\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(family, subKey, store)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(`init:${token.key}`, getFromStore(jsonToken, store))\n\t\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\t\tupdateToken,\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\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\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 { 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) => setIntoStore(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 type * as AtomIO from \"atom.io\"\nimport { IMPLICIT, actUponStore } 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<ƒ extends JsonIO>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: Pick<AtomIO.TransactionUpdate<ƒ>, `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<ƒ>(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"]}