atom.io 0.16.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/data/dist/index.cjs +62 -40
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.d.ts +8 -2
  4. package/data/dist/index.js +64 -42
  5. package/data/dist/index.js.map +1 -1
  6. package/data/src/dict.ts +8 -4
  7. package/data/src/join.ts +74 -33
  8. package/data/src/struct-family.ts +18 -17
  9. package/dist/chunk-OEVFAUPE.js +289 -0
  10. package/dist/chunk-OEVFAUPE.js.map +1 -0
  11. package/dist/index.cjs +36 -57
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +64 -53
  14. package/dist/index.js +15 -36
  15. package/dist/index.js.map +1 -1
  16. package/internal/dist/index.cjs +211 -81
  17. package/internal/dist/index.cjs.map +1 -1
  18. package/internal/dist/index.d.ts +100 -72
  19. package/internal/dist/index.js +200 -75
  20. package/internal/dist/index.js.map +1 -1
  21. package/internal/src/arbitrary.ts +3 -0
  22. package/internal/src/atom/create-regular-atom.ts +2 -3
  23. package/internal/src/caching.ts +8 -6
  24. package/internal/src/families/find-in-store.ts +16 -0
  25. package/internal/src/get-environment-data.ts +4 -7
  26. package/internal/src/get-state/get-from-store.ts +14 -0
  27. package/internal/src/get-state/index.ts +2 -0
  28. package/internal/src/{read-or-compute-value.ts → get-state/read-or-compute-value.ts} +3 -3
  29. package/internal/src/index.ts +7 -6
  30. package/internal/src/ingest-updates/ingest-atom-update.ts +2 -2
  31. package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
  32. package/internal/src/mutable/create-mutable-atom.ts +3 -4
  33. package/internal/src/mutable/tracker.ts +18 -13
  34. package/internal/src/selector/create-standalone-selector.ts +0 -2
  35. package/internal/src/selector/register-selector.ts +1 -1
  36. package/internal/src/set-state/index.ts +1 -0
  37. package/internal/src/set-state/set-atom.ts +15 -19
  38. package/internal/src/set-state/set-into-store.ts +24 -0
  39. package/internal/src/store/store.ts +14 -2
  40. package/internal/src/store/withdraw.ts +72 -2
  41. package/internal/src/subscribe/subscribe-to-root-atoms.ts +1 -1
  42. package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
  43. package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
  44. package/internal/src/timeline/create-timeline.ts +12 -1
  45. package/internal/src/transaction/act-upon-store.ts +19 -0
  46. package/internal/src/transaction/apply-transaction.ts +7 -1
  47. package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
  48. package/internal/src/transaction/build-transaction.ts +11 -8
  49. package/internal/src/transaction/create-transaction.ts +1 -1
  50. package/internal/src/transaction/get-epoch-number.ts +40 -0
  51. package/internal/src/transaction/index.ts +10 -1
  52. package/internal/src/transaction/set-epoch-number.ts +31 -0
  53. package/introspection/dist/index.cjs.map +1 -1
  54. package/introspection/dist/index.d.ts +3 -3
  55. package/introspection/dist/index.js.map +1 -1
  56. package/introspection/src/attach-introspection-states.ts +6 -2
  57. package/introspection/src/attach-timeline-family.ts +5 -2
  58. package/introspection/src/attach-transaction-logs.ts +2 -2
  59. package/json/dist/index.d.ts +3 -1
  60. package/json/src/index.ts +6 -2
  61. package/package.json +24 -13
  62. package/react/dist/index.cjs +3 -3
  63. package/react/dist/index.cjs.map +1 -1
  64. package/react/dist/index.d.ts +1 -1
  65. package/react/dist/index.js +5 -5
  66. package/react/dist/index.js.map +1 -1
  67. package/react/src/use-i.ts +2 -3
  68. package/react/src/use-json.ts +1 -1
  69. package/react/src/use-o.ts +3 -4
  70. package/react-devtools/dist/index.cjs +131 -134
  71. package/react-devtools/dist/index.cjs.map +1 -1
  72. package/react-devtools/dist/index.css +2 -2
  73. package/react-devtools/dist/index.css.map +1 -1
  74. package/react-devtools/dist/index.d.ts +3 -3
  75. package/react-devtools/dist/index.js +103 -106
  76. package/react-devtools/dist/index.js.map +1 -1
  77. package/react-devtools/src/StateEditor.tsx +6 -6
  78. package/react-devtools/src/StateIndex.tsx +2 -5
  79. package/react-devtools/src/TimelineIndex.tsx +3 -3
  80. package/react-devtools/src/TransactionIndex.tsx +9 -8
  81. package/react-devtools/src/Updates.tsx +1 -1
  82. package/react-devtools/src/index.ts +4 -4
  83. package/realtime/dist/index.cjs +72 -0
  84. package/realtime/dist/index.cjs.map +1 -0
  85. package/realtime/dist/index.d.ts +39 -0
  86. package/realtime/dist/index.js +68 -0
  87. package/realtime/dist/index.js.map +1 -0
  88. package/realtime/package.json +16 -0
  89. package/realtime/src/index.ts +1 -0
  90. package/realtime/src/realtime-continuity.ts +152 -0
  91. package/realtime-client/dist/index.cjs +403 -59
  92. package/realtime-client/dist/index.cjs.map +1 -1
  93. package/realtime-client/dist/index.d.ts +16 -9
  94. package/realtime-client/dist/index.js +114 -48
  95. package/realtime-client/dist/index.js.map +1 -1
  96. package/realtime-client/src/index.ts +8 -5
  97. package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +5 -5
  98. package/realtime-client/src/{pull-state.ts → pull-atom.ts} +5 -5
  99. package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +5 -5
  100. package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +5 -5
  101. package/realtime-client/src/pull-selector-family-member.ts +42 -0
  102. package/realtime-client/src/pull-selector.ts +38 -0
  103. package/realtime-client/src/realtime-client-stores/client-main-store.ts +2 -2
  104. package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
  105. package/realtime-client/src/sync-continuity.ts +321 -0
  106. package/realtime-client/src/sync-server-action.ts +22 -21
  107. package/realtime-client/src/sync-state.ts +3 -3
  108. package/realtime-react/dist/index.cjs +330 -15
  109. package/realtime-react/dist/index.cjs.map +1 -1
  110. package/realtime-react/dist/index.d.ts +26 -6
  111. package/realtime-react/dist/index.js +43 -12
  112. package/realtime-react/dist/index.js.map +1 -1
  113. package/realtime-react/src/index.ts +6 -3
  114. package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
  115. package/realtime-react/src/{use-pull.ts → use-pull-atom.ts} +6 -5
  116. package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
  117. package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
  118. package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
  119. package/realtime-react/src/{use-pull-family-member.ts → use-pull-selector.ts} +7 -5
  120. package/realtime-react/src/use-push.ts +3 -2
  121. package/realtime-react/src/use-server-action.ts +3 -2
  122. package/realtime-react/src/use-sync-continuity.ts +12 -0
  123. package/realtime-react/src/use-sync-server-action.ts +3 -2
  124. package/realtime-server/dist/index.cjs +582 -256
  125. package/realtime-server/dist/index.cjs.map +1 -1
  126. package/realtime-server/dist/index.d.ts +124 -49
  127. package/realtime-server/dist/index.js +566 -249
  128. package/realtime-server/dist/index.js.map +1 -1
  129. package/realtime-server/src/index.ts +18 -2
  130. package/realtime-server/src/ipc-socket.ts +230 -0
  131. package/realtime-server/src/realtime-action-receiver.ts +8 -5
  132. package/realtime-server/src/realtime-action-synchronizer.ts +53 -35
  133. package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
  134. package/realtime-server/src/realtime-family-provider.ts +37 -73
  135. package/realtime-server/src/realtime-mutable-family-provider.ts +26 -87
  136. package/realtime-server/src/realtime-mutable-provider.ts +3 -2
  137. package/realtime-server/src/realtime-server-stores/index.ts +3 -1
  138. package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +90 -0
  139. package/realtime-server/src/realtime-server-stores/server-room-store.ts +97 -0
  140. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +2 -72
  141. package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
  142. package/realtime-server/src/realtime-state-provider.ts +3 -3
  143. package/realtime-server/src/realtime-state-receiver.ts +2 -3
  144. package/realtime-server/src/realtime-state-synchronizer.ts +3 -3
  145. package/realtime-testing/dist/index.cjs +28 -28
  146. package/realtime-testing/dist/index.cjs.map +1 -1
  147. package/realtime-testing/dist/index.js +28 -27
  148. package/realtime-testing/dist/index.js.map +1 -1
  149. package/realtime-testing/src/setup-realtime-test.tsx +38 -28
  150. package/src/atom.ts +49 -31
  151. package/src/get-state.ts +2 -11
  152. package/src/logger.ts +10 -5
  153. package/src/selector.ts +44 -25
  154. package/src/set-state.ts +1 -13
  155. package/src/silo.ts +7 -3
  156. package/src/subscribe.ts +2 -1
  157. package/src/timeline.ts +4 -4
  158. package/src/transaction.ts +13 -17
  159. package/src/validators.ts +15 -9
  160. package/dist/chunk-H4Q5FTPZ.js +0 -11
  161. package/dist/chunk-H4Q5FTPZ.js.map +0 -1
  162. package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime-server-stores/server-user-store.ts","../src/realtime-server-stores/server-sync-store.ts","../src/realtime-state-provider.ts","../src/realtime-state-synchronizer.ts","../src/realtime-family-provider.ts","../src/realtime-mutable-provider.ts","../src/realtime-mutable-family-provider.ts","../src/realtime-state-receiver.ts","../src/realtime-action-receiver.ts","../src/realtime-action-synchronizer.ts"],"names":["atomFamily","AtomIO","IMPLICIT","subscribeToState","_a","findInStore","getJsonToken","getUpdateToken","parseJson"],"mappings":"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","sourcesContent":["import { atom, atomFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nexport const userIndex = atom({\n\tkey: `usersIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport const usersOfSockets = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n})\n\nexport const roomIndex = atom({\n\tkey: `conclaveIndex`,\n\tdefault: () => new SetRTX<string>(),\n\tmutable: true,\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms = join(\n\t{\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t},\n\tDEFAULT_USER_IN_ROOM_META,\n)\n\n// export const roomStoreAtoms = atomFamily<\n// \t{ [key: string]: any },\n// \t{ conclave: string }\n// >({\n\n// })\n","import type { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\nimport { SyncGroup } from \"~/packages/atom.io/__unstable__/realtime-server-next/create-realtime-sync-group\"\nimport { usersOfSockets } from \"./server-user-store\"\n\nexport const completeUpdateAtoms = atomFamily<\n\tTransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = atomFamily<\n\t{\n\t\tfilter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\nexport const redactedUpdateSelectors = selectorFamily<\n\tTransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport const userUnacknowledgedUpdatesAtoms = atomFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n\nexport const socketUnacknowledgedUpdatesSelectors = selectorFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `socketUnacknowledgedUpdates`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tconst unacknowledgedUpdates = get(unacknowledgedUpdatesState)\n\t\t\treturn unacknowledgedUpdates\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newUpdates) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tset(unacknowledgedUpdatesState, newUpdates)\n\t\t},\n})\n\nexport const userEpochAtoms = atomFamily<number | null, string>({\n\tkey: `clientEpoch`,\n\tdefault: null,\n})\n\nexport const socketEpochSelectors = selectorFamily<number | null, string>({\n\tkey: `socketEpoch`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tconst userEpoch = get(userEpochState)\n\t\t\treturn userEpoch\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newEpoch) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tset(userEpochState, newEpoch)\n\t\t},\n})\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateProvider = ReturnType<typeof realtimeStateProvider>\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | undefined\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\n\t\t\tconst fillUnsubRequest = () => {\n\t\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\t\tif (unsubscribeFromStateUpdates) {\n\t\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tif (unsubscribeFromStateUpdates) {\n\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t}\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeStateSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateSynchronizer<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tconst fillGetRequest = () => {\n\t\t\tsocket.emit(`value:${token.key}`, AtomIO.getState(token, store))\n\t\t}\n\n\t\tsocket.on(`get:${token.key}`, fillGetRequest)\n\t\treturn () => {\n\t\t\tsocket.off(`get:${token.key}`, fillGetRequest)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeFamilyProvider>\nexport function realtimeFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamily<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token: AtomIO.WritableToken<J>) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableProvider = ReturnType<typeof realtimeMutableProvider>\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tfindInStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableFamilyProvider = ReturnType<\n\ttypeof realtimeMutableFamilyProvider\n>\nexport function realtimeMutableFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableFamilyProvider<\n\t\tT extends Transceiver<any>,\n\t\tJ extends Json.Serializable,\n\t\tK extends Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamily<T, J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateReceiver = ReturnType<typeof realtimeStateReceiver>\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<J extends Json.Serializable>(\n\t\ttoken: WritableToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => setState(token, newValue, store)\n\n\t\tconst fillPubUnclaim = () => {\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t\tsocket.off(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\t\tconst fillPubClaim = () => {\n\t\t\tsocket.on(`pub:${token.key}`, publish)\n\t\t\tsocket.on(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\n\t\tsocket.on(`claim:${token.key}`, fillPubClaim)\n\n\t\treturn () => {\n\t\t\tsocket.off(`claim:${token.key}`, fillPubClaim)\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport type ActionReceiver = ReturnType<typeof realtimeActionReceiver>\nexport function realtimeActionReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionReceiver<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToTransaction } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\nimport { usersOfSockets } from \"./realtime-server-stores\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\tsocketEpochSelectors,\n\tsocketUnacknowledgedUpdatesSelectors,\n\ttransactionRedactorAtoms,\n} from \"./realtime-server-stores/server-sync-store\"\n\nexport type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tconst userKeyState = findInStore(\n\t\t\tusersOfSockets.states.userKeyOfSocket,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst userKey = AtomIO.getState(userKeyState, store)\n\t\tconst socketUnacknowledgedUpdatesState = findInStore(\n\t\t\tsocketUnacknowledgedUpdatesSelectors,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst socketUnacknowledgedUpdates = AtomIO.getState(\n\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\tstore,\n\t\t)\n\t\tif (filter) {\n\t\t\tconst redactorState = findInStore(transactionRedactorAtoms, tx.key, store)\n\t\t\tAtomIO.setState(redactorState, { filter }, store)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tlet unsubscribeFromTransaction: (() => void) | undefined\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tunsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tconst updateState = findInStore(completeUpdateAtoms, update.id, store)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tfindInStore(redactedUpdateSelectors, [tx.key, update.id], store),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\n\t\t\t\t\t// the problem is that only while a socket is connected can\n\t\t\t\t\t// updates be set in the queue for that socket's client.\n\t\t\t\t\t//\n\t\t\t\t\t// we need a client session that can persist between disconnects\n\t\t\t\t\tAtomIO.setState(\n\t\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t\t(updates) => {\n\t\t\t\t\t\t\tif (toEmit) {\n\t\t\t\t\t\t\t\tupdates.push(toEmit)\n\t\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updates\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\tlet i = 1\n\t\tlet next = 1\n\t\tconst retry = setInterval(() => {\n\t\t\tconst toEmit = socketUnacknowledgedUpdates[0]\n\t\t\tconsole.log(userKey, socketUnacknowledgedUpdates)\n\t\t\tif (toEmit && i === next) {\n\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\tnext *= 2\n\t\t\t}\n\n\t\t\ti++\n\t\t}, 250)\n\n\t\tconst trackClientAcknowledgement = (epoch: number) => {\n\t\t\ti = 1\n\t\t\tnext = 1\n\t\t\tconst socketEpochState = findInStore(\n\t\t\t\tsocketEpochSelectors,\n\t\t\t\tsocket.id,\n\t\t\t\tstore,\n\t\t\t)\n\n\t\t\tAtomIO.setState(socketEpochState, epoch, store)\n\t\t\tif (socketUnacknowledgedUpdates[0]?.epoch === epoch) {\n\t\t\t\tAtomIO.setState(\n\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t(updates) => {\n\t\t\t\t\t\tupdates.shift()\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t},\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tsocket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\tif (unsubscribeFromTransaction) {\n\t\t\t\tunsubscribeFromTransaction()\n\t\t\t\tunsubscribeFromTransaction = undefined\n\t\t\t}\n\t\t\tclearInterval(retry)\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t\tsocket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../src/ipc-socket.ts","../src/realtime-continuity-synchronizer.ts","../src/realtime-server-stores/realtime-continuity-store.ts","../src/realtime-server-stores/server-room-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","../src/realtime-action-synchronizer.ts"],"names":["process","atomFamily","selectorFamily","completeUpdateAtoms","atom","join","SetRTX","transaction","IMPLICIT","getFromStore","subscribeToState","findInStore","getJsonToken","getUpdateToken","stringifyJson","setIntoStore","actUponStore","subscribeToTransaction"],"mappings":"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","sourcesContent":["import type { ChildProcessWithoutNullStreams } from \"child_process\"\n\nimport { Subject } from \"atom.io/internal\"\nimport { parseJson } from \"atom.io/json\"\nimport 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\tlisteners.delete(listener)\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\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 process: ChildProcessWithoutNullStreams\n\n\tpublic id = `no_id_retrieved`\n\n\tpublic constructor(process: ChildProcessWithoutNullStreams) {\n\t\tsuper((event, ...args) => {\n\t\t\tconst stringifiedEvent = JSON.stringify([event, ...args]) + `\\n`\n\t\t\tthis.process.stdin.write(stringifiedEvent)\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 stringifiedEvent = buffer.toString()\n\t\t\t\tconst parsedEvent = parseJson(stringifiedEvent)\n\t\t\t\tthis.handleEvent(...parsedEvent)\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\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\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\nexport class ParentSocket<\n\tI extends Events & {\n\t\t[id in string as `relay:${id}`]: [string, ...Json.Serializable[]]\n\t} & {\n\t\t/* eslint-disable quotes */\n\t\t\"setup-relay\": [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 queue: 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 = `no_id_retrieved`\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)\n\t\t\treturn this\n\t\t})\n\t\tthis.process = process\n\t\tthis.process.stdin.resume()\n\t\tthis.queue = []\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>(chunk: EventBuffer<string, I[Event]>) => {\n\t\t\t\tconst buffer = chunk.toString()\n\t\t\t\tthis.queue.push(...buffer.split(`\\n`))\n\n\t\t\t\twhile (this.queue.length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst event = this.queue.shift() as StringifiedEvent<any, any>\n\t\t\t\t\t\tif (event === ``) continue\n\t\t\t\t\t\tconst parsedEvent = parseJson(event)\n\t\t\t\t\t\tthis.handleEvent(...(parsedEvent as [string, ...I[keyof I]]))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.process.stderr.write(`❌ ${error}\\n`)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\t// process.stdin.on(`end`, () => process.exit(0))\n\t\tprocess.on(`SIGINT`, () => process.exit(0))\n\t\tif (process.pid) {\n\t\t\tthis.id = process.pid?.toString()\n\t\t}\n\n\t\tthis.on(`setup-relay`, (id: string) => {\n\t\t\tconst relay = new SubjectSocket(`relay:${id}`)\n\t\t\tthis.relays.set(id, relay)\n\t\t\tfor (const attachServices of this.relayServices) {\n\t\t\t\tattachServices(relay)\n\t\t\t}\n\t\t\tthis.on(`relay:${id}`, (...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\t}\n\n\tpublic relay(\n\t\tattachServices: (socket: SubjectSocket<any, any>) => (() => void) | void,\n\t): void {\n\t\tthis.relayServices.push(attachServices)\n\t\tconst relays = this.relays.values()\n\t\tfor (const relay of relays) {\n\t\t\tattachServices(relay)\n\t\t}\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tfindInStore,\n\tgetFromStore,\n\tisRootStore,\n\tsetIntoStore,\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 \".\"\nimport { redactedPerspectiveUpdateSelectors } from \"./realtime-server-stores\"\nimport {\n\tcompleteUpdateAtoms,\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 sendInitialPayload = () => {\n\t\t\tconst initialPayload: Json.Serializable[] = []\n\t\t\tfor (const atom of continuity.globals) {\n\t\t\t\tinitialPayload.push(atom, getFromStore(atom, store))\n\t\t\t}\n\t\t\tfor (const { perspectiveAtoms } of continuity.perspectives) {\n\t\t\t\tconst perspectiveTokensState = findInStore(\n\t\t\t\t\tperspectiveAtoms,\n\t\t\t\t\tuserKey,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tconst perspectiveTokens = getFromStore(perspectiveTokensState, store)\n\t\t\t\tfor (const perspectiveToken of perspectiveTokens) {\n\t\t\t\t\tconst resource = getFromStore(perspectiveToken, store)\n\t\t\t\t\tinitialPayload.push(perspectiveToken, 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\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\t// store.logger.info(`userId`, userKey)\n\t\t\t\t\t\tconst updateState = findInStore(\n\t\t\t\t\t\t\tcompleteUpdateAtoms,\n\t\t\t\t\t\t\tupdate.id,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tsetIntoStore(updateState, update, store)\n\t\t\t\t\t\tconst redactedUpdateKey = {\n\t\t\t\t\t\t\tuserId: userKey,\n\t\t\t\t\t\t\tsyncGroupKey: continuityKey,\n\t\t\t\t\t\t\tupdateId: update.id,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst redactedUpdateState = findInStore(\n\t\t\t\t\t\t\tredactedPerspectiveUpdateSelectors,\n\t\t\t\t\t\t\tredactedUpdateKey,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tconst redactedUpdate = getFromStore(redactedUpdateState, store)\n\n\t\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\t\tuserUnacknowledgedQueue,\n\t\t\t\t\t\t\t(updates) => {\n\t\t\t\t\t\t\t\tif (redactedUpdate) {\n\t\t\t\t\t\t\t\t\tupdates.push(redactedUpdate)\n\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}\n\t\t\t\t\t\t\t\treturn updates\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tsocket?.emit(\n\t\t\t\t\t\t\t`tx-new:${continuityKey}`,\n\t\t\t\t\t\t\tredactedUpdate as Json.Serializable,\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\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\tactUponStore(\n\t\t\t\t{ type: `transaction`, key: transactionKey },\n\t\t\t\tupdateId,\n\t\t\t\tstore,\n\t\t\t)(...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(\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\t\t}\n\t\tsocket.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${continuityKey}`, fillTransactionRequest)\n\n\t\tlet i = 1\n\t\tlet next = 1\n\t\tconst retry = setInterval(() => {\n\t\t\tconst toEmit = userUnacknowledgedUpdates[0]\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`${store.config.name} retrying ${userKey} (${i}/${next})`,\n\t\t\t\tsocket?.id,\n\t\t\t\tuserUnacknowledgedUpdates,\n\t\t\t)\n\t\t\tif (toEmit && i === next) {\n\t\t\t\tsocket?.emit(`tx-new:${continuityKey}`, toEmit as Json.Serializable)\n\t\t\t\tnext *= 2\n\t\t\t}\n\n\t\t\ti++\n\t\t}, 250)\n\t\tconst 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\ti = 1\n\t\t\tnext = 1\n\t\t\tconst isUnacknowledged = userUnacknowledgedUpdates[0]?.epoch === epoch\n\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\tsocket.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\tsocket.on(`ack:${continuityKey}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\tclearInterval(retry)\n\t\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t\tsocket?.off(`ack:${continuityKey}`, trackClientAcknowledgement)\n\t\t\tsocket?.off(`get:${continuityKey}`, sendInitialPayload)\n\t\t\tsocket?.off(`tx-run:${continuityKey}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n","import { selectorFamily } from \"atom.io\"\nimport type { TransactionUpdate } from \"atom.io\"\nimport type { JsonIO } from \"atom.io/json\"\nimport { SyncGroup } from \"atom.io/realtime\"\nimport { 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({ perspectiveAtoms, resourceAtoms }) => {\n\t\t\t\t\tconst userPerspectiveToken = find(perspectiveAtoms, userId)\n\t\t\t\t\tconst userPerspective = get(userPerspectiveToken)\n\t\t\t\t\tconst visibleTokens = [...userPerspective].map((subKey) => {\n\t\t\t\t\t\tconst resourceToken = find(resourceAtoms, subKey)\n\t\t\t\t\t\treturn resourceToken.key\n\t\t\t\t\t})\n\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\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(\n\t\t\t\t\t\t(atomToken) => 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})\nexport const redactedPerspectiveUpdateSelectors = 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: `redactedPerspectiveUpdate`,\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\treturn redact(update)\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n","import type { ChildProcessWithoutNullStreams } from \"child_process\"\nimport { spawn } from \"child_process\"\n\nimport * as AtomIO from \"atom.io\"\nimport type { Loadable } from \"atom.io/data\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nexport type RoomArguments =\n\t| [script: string, options: string[]]\n\t| [script: string]\n\nexport const roomIndex = AtomIO.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 roomArgumentsAtoms = AtomIO.atomFamily<RoomArguments, string>({\n\tkey: `roomArguments`,\n\tdefault: [`echo Hello World!`],\n})\n\nexport const roomSelectors = AtomIO.selectorFamily<\n\tLoadable<ChildProcessWithoutNullStreams>,\n\tstring\n>({\n\tkey: `room`,\n\tget:\n\t\t(roomId) =>\n\t\t({ 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\treturn new Promise((resolve) => {\n\t\t\t\tconst room = spawn(script, options, { env: process.env })\n\t\t\t\tconst resolver = (data: Buffer) => {\n\t\t\t\t\tif (data.toString() === `✨`) {\n\t\t\t\t\t\troom.stdout.off(`data`, resolver)\n\t\t\t\t\t\tresolve(room)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\troom.stdout.on(`data`, resolver)\n\t\t\t})\n\t\t},\n})\n\nexport const createRoomTX = AtomIO.transaction<\n\t(\n\t\troomId: string,\n\t\tscript: string,\n\t\toptions?: string[],\n\t) => Loadable<ChildProcessWithoutNullStreams>\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","import type { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\n\nexport const completeUpdateAtoms = atomFamily<\n\tTransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = atomFamily<\n\t{\n\t\tfilter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\nexport const redactedUpdateSelectors = selectorFamily<\n\tTransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport const 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","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tassignTransactionToContinuity,\n\tfindInStore,\n\tgetFromStore,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json, JsonIO } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\ttransactionRedactorAtoms,\n\tuserUnacknowledgedQueues,\n\tusersOfSockets,\n} from \"./realtime-server-stores\"\n\nexport type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends JsonIO>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tassignTransactionToContinuity(`default`, tx.key, store)\n\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`transaction`,\n\t\t\t\ttx.key,\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 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\tif (filter) {\n\t\t\tconst redactorState = findInStore(transactionRedactorAtoms, tx.key, store)\n\t\t\tsetIntoStore(redactorState, { filter }, store)\n\t\t}\n\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.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tlet unsubscribeFromTransaction: (() => void) | undefined\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tunsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tconst updateState = findInStore(completeUpdateAtoms, update.id, store)\n\t\t\t\t\tsetIntoStore(updateState, update, store)\n\t\t\t\t\tconst toEmit: Pick<\n\t\t\t\t\t\tAtomIO.TransactionUpdate<ƒ>,\n\t\t\t\t\t\t`epoch` | `id` | `key` | `output` | `updates`\n\t\t\t\t\t> | null = filter\n\t\t\t\t\t\t? getFromStore(\n\t\t\t\t\t\t\t\tfindInStore(redactedUpdateSelectors, [tx.key, update.id], store),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\n\t\t\t\t\t// the problem is that only while a socket is connected can\n\t\t\t\t\t// updates be set in the queue for that socket's client.\n\t\t\t\t\t//\n\t\t\t\t\t// we need a client session that can persist between disconnects\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tuserUnacknowledgedQueue,\n\t\t\t\t\t\t(updates) => {\n\t\t\t\t\t\t\tif (toEmit) {\n\t\t\t\t\t\t\t\tupdates.push(toEmit)\n\t\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updates\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit as Json.Serializable)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\tlet i = 1\n\t\tlet next = 1\n\t\tconst retry = setInterval(() => {\n\t\t\tconst toEmit = userUnacknowledgedUpdates[0]\n\t\t\tif (toEmit && i === next) {\n\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit as Json.Serializable)\n\t\t\t\tnext *= 2\n\t\t\t}\n\n\t\t\ti++\n\t\t}, 250)\n\n\t\tconst trackClientAcknowledgement = (epoch: number) => {\n\t\t\ti = 1\n\t\t\tnext = 1\n\t\t\t8\n\t\t\tif (userUnacknowledgedUpdates[0]?.epoch === epoch) {\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\tsocket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\tif (unsubscribeFromTransaction) {\n\t\t\t\tunsubscribeFromTransaction()\n\t\t\t\tunsubscribeFromTransaction = undefined\n\t\t\t}\n\t\t\tclearInterval(retry)\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t\tsocket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\t\t}\n\t}\n}\n"]}
@@ -1,11 +1,63 @@
1
- import { Transceiver, Store } from 'atom.io/internal';
2
- import * as SocketIO from 'socket.io';
1
+ import * as atom_io_internal from 'atom.io/internal';
2
+ import { Subject, Transceiver, Store } from 'atom.io/internal';
3
+ import { Json, Stringified, JsonIO } from 'atom.io/json';
4
+ import { ChildProcessWithoutNullStreams } from 'child_process';
5
+ import { ContinuityToken } from 'atom.io/realtime';
3
6
  import * as atom_io_data from 'atom.io/data';
4
- import * as atom_io from 'atom.io';
5
- import { TransactionUpdate, TransactionUpdateContent, WritableToken } from 'atom.io';
7
+ import { Loadable } from 'atom.io/data';
6
8
  import * as atom_io_transceivers_set_rtx from 'atom.io/transceivers/set-rtx';
7
9
  import { SetRTX } from 'atom.io/transceivers/set-rtx';
8
- import { Json } from 'atom.io/json';
10
+ import * as AtomIO from 'atom.io';
11
+ import { TransactionUpdate, TransactionUpdateContent, WritableToken } from 'atom.io';
12
+
13
+ type Events = Json.Object<string, Json.Serializable[]>;
14
+ type StringifiedEvent<Key extends string, Params extends Json.Serializable[]> = Stringified<[Key, ...Params]>;
15
+ interface EventBuffer<Key extends string, Params extends Json.Serializable[]> extends Buffer {
16
+ toString(): StringifiedEvent<Key, Params>;
17
+ }
18
+ declare class CustomSocket<I extends Events, O extends Events> implements Socket {
19
+ emit: <Event extends keyof O>(event: Event, ...args: O[Event]) => CustomSocket<I, O>;
20
+ protected listeners: Map<keyof I, Set<(...args: Json.Array) => void>>;
21
+ protected globalListeners: Set<(event: string, ...args: Json.Array) => void>;
22
+ protected handleEvent<Event extends keyof I>(event: string, ...args: I[Event]): void;
23
+ id: string;
24
+ constructor(emit: <Event extends keyof O>(event: Event, ...args: O[Event]) => CustomSocket<I, O>);
25
+ on<Event extends keyof I>(event: Event, listener: (...args: I[Event]) => void): CustomSocket<I, O>;
26
+ onAny(listener: (event: string, ...args: Json.Array) => void): CustomSocket<I, O>;
27
+ off<Event extends keyof I>(event: Event, listener: (...args: I[Event]) => void): CustomSocket<I, O>;
28
+ offAny(listener: (event: string, ...args: Json.Array) => void): CustomSocket<I, O>;
29
+ }
30
+ declare class ChildSocket<I extends Events, O extends Events & {
31
+ "setup-relay": [string];
32
+ }> extends CustomSocket<I, O> {
33
+ protected process: ChildProcessWithoutNullStreams;
34
+ id: string;
35
+ constructor(process: ChildProcessWithoutNullStreams);
36
+ }
37
+ declare class SubjectSocket<I extends Events, O extends Events> extends CustomSocket<I, O> {
38
+ in: Subject<[string, ...Json.Serializable[]]>;
39
+ out: Subject<[string, ...Json.Serializable[]]>;
40
+ id: string;
41
+ constructor(id: string);
42
+ }
43
+ declare class ParentSocket<I extends Events & {
44
+ [id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
45
+ } & {
46
+ "setup-relay": [string];
47
+ }, O extends Events & {
48
+ [id in string as `relay:${id}`]: [string, ...Json.Serializable[]];
49
+ }> extends CustomSocket<I, O> {
50
+ protected queue: string[];
51
+ protected relays: Map<string, SubjectSocket<any, any>>;
52
+ protected relayServices: ((socket: SubjectSocket<any, any>) => (() => void) | void)[];
53
+ protected process: NodeJS.Process;
54
+ id: string;
55
+ constructor();
56
+ relay(attachServices: (socket: SubjectSocket<any, any>) => (() => void) | void): void;
57
+ }
58
+
59
+ type RealtimeContinuitySynchronizer = ReturnType<typeof realtimeContinuitySynchronizer>;
60
+ declare function realtimeContinuitySynchronizer({ socket: initialSocket, store, }: ServerConfig): (continuity: ContinuityToken) => () => void;
9
61
 
10
62
  type primitive = boolean | number | string | null;
11
63
 
@@ -81,23 +133,8 @@ declare class Junction<const ASide extends string, const BSide extends string, c
81
133
  has(a: string, b?: string): boolean;
82
134
  }
83
135
 
84
- declare const userIndex: atom_io.MutableAtomToken<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>>;
85
- declare const usersOfSockets: {
86
- readonly relations: Junction<"user", "socket", null>;
87
- readonly states: {
88
- readonly userKeyOfSocket: atom_io.ReadonlySelectorFamily<string | null, string>;
89
- readonly socketKeyOfUser: atom_io.ReadonlySelectorFamily<string | null, string>;
90
- };
91
- readonly transact: (transactors: Readonly<{
92
- get: <S>(state: atom_io.ReadonlySelectorToken<S> | atom_io.WritableToken<S>) => S;
93
- set: <S_1, New extends S_1>(state: atom_io.WritableToken<S_1>, newValue: New | ((oldValue: S_1) => New)) => void;
94
- find: typeof atom_io.findState;
95
- }>, run: (join: atom_io_data.Join<"user", "socket", "1:1", null>) => void) => void;
96
- readonly core: {
97
- readonly findRelatedKeysState: atom_io.MutableAtomFamily<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>, string>;
98
- };
99
- };
100
- declare const roomIndex: atom_io.MutableAtomToken<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>>;
136
+ type RoomArguments = [script: string, options: string[]] | [script: string];
137
+ declare const roomIndex: AtomIO.MutableAtomToken<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>>;
101
138
  type UserInRoomMeta = {
102
139
  enteredAtEpoch: number;
103
140
  };
@@ -105,60 +142,98 @@ declare const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta;
105
142
  declare const usersInRooms: {
106
143
  readonly relations: Junction<"room", "user", UserInRoomMeta>;
107
144
  readonly states: {
108
- readonly roomEntryOfUser: atom_io.ReadonlySelectorFamily<[string, UserInRoomMeta] | null, string>;
145
+ readonly roomEntryOfUser: AtomIO.ReadonlySelectorFamily<[string, UserInRoomMeta] | null, string>;
109
146
  } & {
110
- readonly userEntriesOfRoom: atom_io.ReadonlySelectorFamily<[string, UserInRoomMeta][], string>;
147
+ readonly userEntriesOfRoom: AtomIO.ReadonlySelectorFamily<[string, UserInRoomMeta][], string>;
111
148
  } & {
112
- readonly roomKeyOfUser: atom_io.ReadonlySelectorFamily<string | null, string>;
149
+ readonly roomKeyOfUser: AtomIO.ReadonlySelectorFamily<string | null, string>;
113
150
  } & {
114
- readonly userKeysOfRoom: atom_io.ReadonlySelectorFamily<string[], string>;
151
+ readonly userKeysOfRoom: AtomIO.ReadonlySelectorFamily<string[], string>;
115
152
  };
153
+ readonly in: (store: atom_io_internal.Store) => atom_io_data.Join<"room", "user", "1:n", UserInRoomMeta>;
116
154
  readonly transact: (transactors: Readonly<{
117
- get: <S>(state: atom_io.ReadonlySelectorToken<S> | atom_io.WritableToken<S>) => S;
118
- set: <S_1, New extends S_1>(state: atom_io.WritableToken<S_1>, newValue: New | ((oldValue: S_1) => New)) => void;
119
- find: typeof atom_io.findState;
155
+ get: <S>(state: AtomIO.ReadonlySelectorToken<S> | AtomIO.WritableToken<S>) => S;
156
+ set: <S_1, New extends S_1>(state: AtomIO.WritableToken<S_1>, newValue: New | ((oldValue: S_1) => New)) => void;
157
+ find: typeof AtomIO.findState;
120
158
  }>, run: (join: atom_io_data.Join<"room", "user", "1:n", UserInRoomMeta>) => void) => void;
121
159
  readonly core: {
122
- readonly findRelatedKeysState: atom_io.MutableAtomFamily<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>, string>;
160
+ readonly findRelatedKeysState: AtomIO.MutableAtomFamily<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>, string>;
123
161
  };
124
162
  };
125
-
126
- declare const completeUpdateAtoms: atom_io.RegularAtomFamily<TransactionUpdate<any> | null, string>;
127
- declare const transactionRedactorAtoms: atom_io.RegularAtomFamily<{
163
+ declare const roomArgumentsAtoms: AtomIO.RegularAtomFamilyTokenWithCall<RoomArguments, string>;
164
+ declare const roomSelectors: AtomIO.ReadonlySelectorFamilyTokenWithCall<Loadable<ChildProcessWithoutNullStreams>, string>;
165
+ declare const createRoomTX: AtomIO.TransactionToken<(roomId: string, script: string, options?: string[]) => Loadable<ChildProcessWithoutNullStreams>>;
166
+ type CreateRoomIO = AtomIO.TransactionIO<typeof createRoomTX>;
167
+ declare const joinRoomTX: AtomIO.TransactionToken<(roomId: string, userId: string, enteredAtEpoch: number) => UserInRoomMeta>;
168
+ type JoinRoomIO = AtomIO.TransactionIO<typeof joinRoomTX>;
169
+
170
+ declare const redactedPerspectiveUpdateSelectors: AtomIO.ReadonlySelectorFamilyTokenWithCall<Pick<TransactionUpdate<JsonIO>, "key" | "epoch" | "id" | "updates" | "output"> | null, {
171
+ userId: string;
172
+ syncGroupKey: string;
173
+ updateId: string;
174
+ }>;
175
+
176
+ declare const completeUpdateAtoms: AtomIO.RegularAtomFamilyTokenWithCall<TransactionUpdate<any> | null, string>;
177
+ declare const transactionRedactorAtoms: AtomIO.RegularAtomFamilyTokenWithCall<{
128
178
  filter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[];
129
179
  }, string>;
130
- declare const redactedUpdateSelectors: atom_io.ReadonlySelectorFamily<TransactionUpdate<any> | null, [transactionKey: string, updateId: string]>;
131
- declare const userUnacknowledgedUpdatesAtoms: atom_io.RegularAtomFamily<TransactionUpdate<any>[], string>;
132
- declare const socketUnacknowledgedUpdatesSelectors: atom_io.WritableSelectorFamily<TransactionUpdate<any>[], string>;
133
- declare const userEpochAtoms: atom_io.RegularAtomFamily<number | null, string>;
134
- declare const socketEpochSelectors: atom_io.WritableSelectorFamily<number | null, string>;
180
+ declare const redactedUpdateSelectors: AtomIO.ReadonlySelectorFamilyTokenWithCall<TransactionUpdate<any> | null, [transactionKey: string, updateId: string]>;
181
+ declare const userUnacknowledgedQueues: AtomIO.RegularAtomFamilyTokenWithCall<Pick<TransactionUpdate<any>, "key" | "epoch" | "id" | "updates" | "output">[], string>;
182
+
183
+ declare const socketAtoms: AtomIO.RegularAtomFamilyTokenWithCall<Socket | null, string>;
184
+ declare const socketIndex: AtomIO.MutableAtomToken<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>>;
185
+ declare const userIndex: AtomIO.MutableAtomToken<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>>;
186
+ declare const usersOfSockets: {
187
+ readonly relations: Junction<"user", "socket", null>;
188
+ readonly states: {
189
+ readonly socketKeyOfUser: AtomIO.ReadonlySelectorFamily<string | null, string>;
190
+ readonly userKeyOfSocket: AtomIO.ReadonlySelectorFamily<string | null, string>;
191
+ };
192
+ readonly in: (store: atom_io_internal.Store) => atom_io_data.Join<"user", "socket", "1:1", null>;
193
+ readonly transact: (transactors: Readonly<{
194
+ get: <S>(state: AtomIO.ReadonlySelectorToken<S> | AtomIO.WritableToken<S>) => S;
195
+ set: <S_1, New extends S_1>(state: AtomIO.WritableToken<S_1>, newValue: New | ((oldValue: S_1) => New)) => void;
196
+ find: typeof AtomIO.findState;
197
+ }>, run: (join: atom_io_data.Join<"user", "socket", "1:1", null>) => void) => void;
198
+ readonly core: {
199
+ readonly findRelatedKeysState: AtomIO.MutableAtomFamily<SetRTX<string>, atom_io_transceivers_set_rtx.SetRTXJson<string>, string>;
200
+ };
201
+ };
135
202
 
136
203
  type StateProvider = ReturnType<typeof realtimeStateProvider>;
137
- declare function realtimeStateProvider({ socket, store, }: ServerConfig): <J extends Json.Serializable>(token: atom_io.WritableToken<J>) => () => void;
204
+ declare function realtimeStateProvider({ socket, store, }: ServerConfig): <J extends Json.Serializable>(token: AtomIO.WritableToken<J>) => () => void;
138
205
 
139
- declare function realtimeStateSynchronizer({ socket, store, }: ServerConfig): <J extends Json.Serializable>(token: atom_io.WritableToken<J>) => () => void;
206
+ declare function realtimeStateSynchronizer({ socket, store, }: ServerConfig): <J extends Json.Serializable>(token: AtomIO.WritableToken<J>) => () => void;
140
207
 
141
- type FamilyProvider = ReturnType<typeof realtimeFamilyProvider>;
142
- declare function realtimeFamilyProvider({ socket, store, }: ServerConfig): <J extends Json.Serializable, K extends Json.Serializable>(family: atom_io.RegularAtomFamily<J, K>, index: atom_io.ReadableToken<Iterable<K>>) => () => void;
208
+ type FamilyProvider = ReturnType<typeof realtimeAtomFamilyProvider>;
209
+ declare function realtimeAtomFamilyProvider({ socket, store, }: ServerConfig): <J extends Json.Serializable, K extends Json.Serializable>(family: AtomIO.RegularAtomFamilyToken<J, K>, index: AtomIO.ReadableToken<Iterable<K>>) => () => void;
143
210
 
144
211
  type MutableProvider = ReturnType<typeof realtimeMutableProvider>;
145
- declare function realtimeMutableProvider({ socket, store, }: ServerConfig): <Core extends Transceiver<Json.Serializable>, SerializableCore extends Json.Serializable>(token: atom_io.MutableAtomToken<Core, SerializableCore>) => () => void;
212
+ declare function realtimeMutableProvider({ socket, store, }: ServerConfig): <Core extends Transceiver<Json.Serializable>, SerializableCore extends Json.Serializable>(token: AtomIO.MutableAtomToken<Core, SerializableCore>) => () => void;
146
213
 
147
214
  type MutableFamilyProvider = ReturnType<typeof realtimeMutableFamilyProvider>;
148
- declare function realtimeMutableFamilyProvider({ socket, store, }: ServerConfig): <T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable>(family: atom_io.MutableAtomFamily<T, J, K>, index: atom_io.ReadableToken<Iterable<K>>) => () => void;
215
+ declare function realtimeMutableFamilyProvider({ socket, store, }: ServerConfig): <T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable>(family: AtomIO.MutableAtomFamilyToken<T, J, K>, index: AtomIO.ReadableToken<Iterable<K>>) => () => void;
149
216
 
150
217
  type StateReceiver = ReturnType<typeof realtimeStateReceiver>;
151
218
  declare function realtimeStateReceiver({ socket, store, }: ServerConfig): <J extends Json.Serializable>(token: WritableToken<J>) => () => void;
152
219
 
153
220
  type ActionReceiver = ReturnType<typeof realtimeActionReceiver>;
154
- declare function realtimeActionReceiver({ socket, store, }: ServerConfig): <ƒ extends atom_io.ƒn>(tx: atom_io.TransactionToken<ƒ>) => () => void;
221
+ declare function realtimeActionReceiver({ socket, store, }: ServerConfig): <ƒ extends JsonIO>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
155
222
 
156
223
  type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>;
157
- declare function realtimeActionSynchronizer({ socket, store, }: ServerConfig): <ƒ extends atom_io.ƒn>(tx: atom_io.TransactionToken<ƒ>, filter?: ((update: atom_io.TransactionUpdateContent[]) => atom_io.TransactionUpdateContent[]) | undefined) => () => void;
158
-
224
+ declare function realtimeActionSynchronizer({ socket, store, }: ServerConfig): <ƒ extends JsonIO>(tx: AtomIO.TransactionToken<ƒ>, filter?: ((update: AtomIO.TransactionUpdateContent[]) => AtomIO.TransactionUpdateContent[]) | undefined) => () => void;
225
+
226
+ type Socket = {
227
+ id: string;
228
+ on: (event: string, listener: (...args: Json.Serializable[]) => void) => void;
229
+ onAny: (listener: (event: string, ...args: Json.Serializable[]) => void) => void;
230
+ off: (event: string, listener: (...args: Json.Serializable[]) => void) => void;
231
+ offAny: (listener: (event: string, ...args: Json.Serializable[]) => void) => void;
232
+ emit: (event: string, ...args: Json.Serializable[]) => void;
233
+ };
159
234
  type ServerConfig = {
160
- socket: SocketIO.Socket;
235
+ socket: Socket;
161
236
  store?: Store;
162
237
  };
163
238
 
164
- export { type ActionReceiver, type ActionSynchronizer, DEFAULT_USER_IN_ROOM_META, type FamilyProvider, type MutableFamilyProvider, type MutableProvider, type ServerConfig, type StateProvider, type StateReceiver, type UserInRoomMeta, completeUpdateAtoms, realtimeActionReceiver, realtimeActionSynchronizer, realtimeFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, realtimeStateSynchronizer, redactedUpdateSelectors, roomIndex, socketEpochSelectors, socketUnacknowledgedUpdatesSelectors, transactionRedactorAtoms, userEpochAtoms, userIndex, userUnacknowledgedUpdatesAtoms, usersInRooms, usersOfSockets };
239
+ export { type ActionReceiver, type ActionSynchronizer, ChildSocket, type CreateRoomIO, CustomSocket, DEFAULT_USER_IN_ROOM_META, type EventBuffer, type Events, type FamilyProvider, type JoinRoomIO, type MutableFamilyProvider, type MutableProvider, ParentSocket, type RealtimeContinuitySynchronizer, type RoomArguments, type ServerConfig, type Socket, type StateProvider, type StateReceiver, type StringifiedEvent, SubjectSocket, type UserInRoomMeta, completeUpdateAtoms, createRoomTX, joinRoomTX, realtimeActionReceiver, realtimeActionSynchronizer, realtimeAtomFamilyProvider, realtimeContinuitySynchronizer, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, realtimeStateSynchronizer, redactedPerspectiveUpdateSelectors, redactedUpdateSelectors, roomArgumentsAtoms, roomIndex, roomSelectors, socketAtoms, socketIndex, transactionRedactorAtoms, userIndex, userUnacknowledgedQueues, usersInRooms, usersOfSockets };