atom.io 0.15.3 → 0.15.5

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 (125) hide show
  1. package/data/dist/index.cjs +29 -16
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.js +30 -17
  4. package/data/dist/index.js.map +1 -1
  5. package/data/src/join.ts +15 -2
  6. package/dist/index.cjs +32 -6
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +153 -85
  9. package/dist/index.js +157 -1
  10. package/dist/index.js.map +1 -1
  11. package/internal/dist/index.cjs +98 -159
  12. package/internal/dist/index.cjs.map +1 -1
  13. package/internal/dist/index.d.ts +44 -32
  14. package/internal/dist/index.js +89 -105
  15. package/internal/dist/index.js.map +1 -1
  16. package/internal/src/atom/create-regular-atom.ts +1 -1
  17. package/internal/src/get-environment-data.ts +18 -0
  18. package/internal/src/index.ts +2 -0
  19. package/internal/src/ingest-updates/index.ts +3 -0
  20. package/internal/src/ingest-updates/ingest-atom-update.ts +14 -0
  21. package/internal/src/ingest-updates/ingest-selector-update.ts +17 -0
  22. package/internal/src/ingest-updates/ingest-transaction-update.ts +22 -0
  23. package/internal/src/mutable/tracker.ts +4 -4
  24. package/internal/src/not-found-error.ts +3 -8
  25. package/internal/src/operation.ts +4 -4
  26. package/internal/src/selector/create-read-write-selector.ts +6 -4
  27. package/internal/src/selector/create-readonly-selector.ts +3 -3
  28. package/internal/src/selector/register-selector.ts +6 -4
  29. package/internal/src/selector/update-selector-atoms.ts +2 -2
  30. package/internal/src/store/deposit.ts +5 -5
  31. package/internal/src/store/store.ts +4 -4
  32. package/internal/src/store/withdraw-new-family-member.ts +8 -11
  33. package/internal/src/store/withdraw.ts +11 -12
  34. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  35. package/internal/src/subscribe/subscribe-to-timeline.ts +4 -4
  36. package/internal/src/timeline/add-atom-to-timeline.ts +7 -7
  37. package/internal/src/timeline/create-timeline.ts +29 -21
  38. package/internal/src/timeline/time-travel.ts +19 -45
  39. package/internal/src/transaction/apply-transaction.ts +5 -51
  40. package/internal/src/transaction/build-transaction.ts +9 -2
  41. package/internal/src/transaction/create-transaction.ts +4 -4
  42. package/internal/src/transaction/index.ts +2 -2
  43. package/introspection/dist/index.cjs +9 -9
  44. package/introspection/dist/index.cjs.map +1 -1
  45. package/introspection/dist/index.d.ts +6 -6
  46. package/introspection/dist/index.js +9 -9
  47. package/introspection/dist/index.js.map +1 -1
  48. package/introspection/src/attach-atom-index.ts +4 -4
  49. package/introspection/src/attach-introspection-states.ts +2 -2
  50. package/introspection/src/attach-selector-index.ts +4 -4
  51. package/introspection/src/attach-timeline-family.ts +6 -6
  52. package/introspection/src/attach-timeline-index.ts +6 -4
  53. package/introspection/src/attach-transaction-index.ts +1 -1
  54. package/introspection/src/index.ts +1 -1
  55. package/package.json +11 -12
  56. package/react/dist/index.cjs.map +1 -1
  57. package/react/dist/index.d.ts +4 -4
  58. package/react/dist/index.js.map +1 -1
  59. package/react/src/store-hooks.ts +5 -5
  60. package/react-devtools/dist/index.cjs +7 -9
  61. package/react-devtools/dist/index.cjs.map +1 -1
  62. package/react-devtools/dist/index.d.ts +10 -265
  63. package/react-devtools/dist/index.js +7 -9
  64. package/react-devtools/dist/index.js.map +1 -1
  65. package/react-devtools/src/StateEditor.tsx +3 -3
  66. package/react-devtools/src/StateIndex.tsx +3 -3
  67. package/react-devtools/src/TimelineIndex.tsx +2 -2
  68. package/react-devtools/src/Updates.tsx +1 -1
  69. package/realtime-client/dist/index.cjs +68 -66
  70. package/realtime-client/dist/index.cjs.map +1 -1
  71. package/realtime-client/dist/index.d.ts +8 -7
  72. package/realtime-client/dist/index.js +63 -62
  73. package/realtime-client/dist/index.js.map +1 -1
  74. package/realtime-client/src/pull-family-member.ts +1 -1
  75. package/realtime-client/src/pull.ts +1 -1
  76. package/realtime-client/src/push.ts +2 -3
  77. package/realtime-client/src/realtime-state.ts +11 -3
  78. package/realtime-client/src/server-action.ts +65 -65
  79. package/realtime-react/dist/index.cjs +90 -56
  80. package/realtime-react/dist/index.cjs.map +1 -1
  81. package/realtime-react/dist/index.d.ts +11 -6
  82. package/realtime-react/dist/index.js +89 -55
  83. package/realtime-react/dist/index.js.map +1 -1
  84. package/realtime-react/src/on-mount.ts +23 -0
  85. package/realtime-react/src/realtime-context.tsx +14 -6
  86. package/realtime-react/src/use-pull-family-member.ts +5 -8
  87. package/realtime-react/src/use-pull-mutable-family-member.ts +4 -7
  88. package/realtime-react/src/use-pull-mutable.ts +4 -7
  89. package/realtime-react/src/use-pull.ts +5 -8
  90. package/realtime-react/src/use-push.ts +5 -9
  91. package/realtime-react/src/use-realtime-service.ts +30 -0
  92. package/realtime-react/src/use-server-action.ts +8 -8
  93. package/realtime-server/dist/index.cjs +109 -40
  94. package/realtime-server/dist/index.cjs.map +1 -1
  95. package/realtime-server/dist/index.d.ts +7 -6
  96. package/realtime-server/dist/index.js +90 -39
  97. package/realtime-server/dist/index.js.map +1 -1
  98. package/realtime-server/src/hook-composition/expose-family.ts +2 -2
  99. package/realtime-server/src/hook-composition/expose-mutable-family.ts +1 -1
  100. package/realtime-server/src/hook-composition/expose-single.ts +1 -1
  101. package/realtime-server/src/hook-composition/index.ts +2 -1
  102. package/realtime-server/src/hook-composition/receive-state.ts +2 -2
  103. package/realtime-server/src/hook-composition/receive-transaction.ts +13 -32
  104. package/realtime-server/src/hook-composition/sync-transaction.ts +92 -0
  105. package/realtime-testing/dist/index.cjs +3 -3
  106. package/realtime-testing/dist/index.cjs.map +1 -1
  107. package/realtime-testing/dist/index.js +2 -2
  108. package/realtime-testing/dist/index.js.map +1 -1
  109. package/realtime-testing/src/setup-realtime-test.tsx +4 -3
  110. package/src/atom.ts +30 -7
  111. package/src/dispose.ts +2 -2
  112. package/src/find-state.ts +64 -0
  113. package/src/get-state.ts +2 -2
  114. package/src/index.ts +23 -0
  115. package/src/logger.ts +1 -0
  116. package/src/selector.ts +16 -0
  117. package/src/set-state.ts +2 -2
  118. package/src/silo.ts +2 -2
  119. package/src/subscribe.ts +7 -11
  120. package/src/timeline.ts +20 -12
  121. package/src/transaction.ts +31 -12
  122. package/src/validators.ts +74 -0
  123. package/dist/chunk-K22LR3V6.js +0 -138
  124. package/dist/chunk-K22LR3V6.js.map +0 -1
  125. package/internal/src/set-state/copy-mutable-into-new-store.ts +0 -34
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal","update"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.StateToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.StateToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\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 = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\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\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: AtomIO.TransactionUpdate<ƒ>,\n\t\t\ttransactionId: string,\n\t\t) => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tsocket.emit(`tx:sync:${transactionId}`, update)\n\t\t\t\t},\n\t\t\t\t`sync:${transactionId}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t}\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { StateToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<J extends Json.Serializable>(\n\t\ttoken: StateToken<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"]}
1
+ {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-state.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/sync-transaction.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.WritableToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.WritableToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\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 = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\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\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.WritableToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<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\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nconst completeUpdateAtoms = AtomIO.atomFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nconst transactionRedactorAtoms = AtomIO.atomFamily<\n\t{\n\t\tfilter: (\n\t\t\tupdates: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\n\nconst redactedUpdateSelectors = AtomIO.selectorFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function syncTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tif (filter) {\n\t\t\tAtomIO.setState(\n\t\t\t\tAtomIO.findState(transactionRedactorAtoms, tx.key),\n\t\t\t\t{ filter },\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tconst updateState = AtomIO.findState(completeUpdateAtoms, update.id)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tAtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribe)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n"]}
@@ -1,21 +1,22 @@
1
1
  import { Transceiver, Store } from 'atom.io/internal';
2
2
  import * as SocketIO from 'socket.io';
3
3
  import * as AtomIO from 'atom.io';
4
- import { StateToken } from 'atom.io';
4
+ import { WritableToken } from 'atom.io';
5
5
  import { Json } from 'atom.io/json';
6
6
 
7
- declare const useExposeSingle: ({ socket, store, }: ServerConfig) => <J extends Json.Serializable>(token: AtomIO.StateToken<J>) => () => void;
7
+ declare const useExposeSingle: ({ socket, store, }: ServerConfig) => <J extends Json.Serializable>(token: AtomIO.WritableToken<J>) => () => void;
8
8
 
9
- declare const useExposeFamily: ({ socket, store, }: ServerConfig) => <J extends Json.Serializable>(family: AtomIO.AtomFamily<J, Json.Serializable> | AtomIO.SelectorFamily<J, Json.Serializable>, index: AtomIO.StateToken<Set<string>>) => () => void;
9
+ declare const useExposeFamily: ({ socket, store, }: ServerConfig) => <J extends Json.Serializable>(family: AtomIO.AtomFamily<J, Json.Serializable> | AtomIO.SelectorFamily<J, Json.Serializable>, index: AtomIO.WritableToken<Set<string>>) => () => void;
10
10
 
11
11
  declare const useExposeMutable: ({ socket, store, }: ServerConfig) => <Core extends Transceiver<Json.Serializable>, SerializableCore extends Json.Serializable>(token: AtomIO.MutableAtomToken<Core, SerializableCore>) => () => void;
12
12
 
13
- declare const useExposeMutableFamily: ({ socket, store, }: ServerConfig) => <Family extends AtomIO.MutableAtomFamily<Transceiver<Json.Serializable>, Json.Serializable, Json.Serializable>>(family: Family, index: AtomIO.StateToken<Set<string>>) => () => void;
13
+ declare const useExposeMutableFamily: ({ socket, store, }: ServerConfig) => <Family extends AtomIO.MutableAtomFamily<Transceiver<Json.Serializable>, Json.Serializable, Json.Serializable>>(family: Family, index: AtomIO.WritableToken<Set<string>>) => () => void;
14
+
15
+ declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Json.Serializable>(token: WritableToken<J>) => () => void;
14
16
 
15
17
  declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
16
- declare function useSyncTransaction({ socket, store, }: ServerConfig): <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
17
18
 
18
- declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Json.Serializable>(token: StateToken<J>) => () => void;
19
+ declare function useSyncTransaction({ socket, store, }: ServerConfig): extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>, filter?: ((update: AtomIO.TransactionUpdateContent[]) => AtomIO.TransactionUpdateContent[]) | undefined) => () => void;
19
20
 
20
21
  type ServerConfig = {
21
22
  socket: SocketIO.Socket;
@@ -1,5 +1,5 @@
1
- import '../../dist/chunk-PZLG2HP3.js';
2
- import * as AtomIO4 from 'atom.io';
1
+ import { __spreadProps, __spreadValues } from '../../dist/chunk-PZLG2HP3.js';
2
+ import * as AtomIO6 from 'atom.io';
3
3
  import { setState } from 'atom.io';
4
4
  import * as Internal from 'atom.io/internal';
5
5
  import { IMPLICIT, getJsonToken, getUpdateToken, subscribeToState } from 'atom.io/internal';
@@ -17,7 +17,7 @@ var useExposeSingle = ({
17
17
  unsubscribeFromStateUpdates = null;
18
18
  };
19
19
  const fillSubRequest = () => {
20
- socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
20
+ socket.emit(`serve:${token.key}`, AtomIO6.getState(token, store));
21
21
  unsubscribeFromStateUpdates = Internal.subscribeToState(
22
22
  token,
23
23
  ({ newValue }) => {
@@ -64,13 +64,13 @@ var useExposeFamily = ({
64
64
  const fillSubRequest = (subKey) => {
65
65
  var _a;
66
66
  if (subKey === void 0) {
67
- const keys = AtomIO4.getState(index, store);
67
+ const keys = AtomIO6.getState(index, store);
68
68
  for (const key of keys) {
69
69
  const token = family(key);
70
70
  socket.emit(
71
71
  `serve:${family.key}`,
72
72
  parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
73
- AtomIO4.getState(token, store)
73
+ AtomIO6.getState(token, store)
74
74
  );
75
75
  }
76
76
  const unsubscribeFromTokenCreation = subscribeToTokenCreation(
@@ -97,7 +97,7 @@ var useExposeFamily = ({
97
97
  socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
98
98
  } else {
99
99
  const token = family(subKey);
100
- socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
100
+ socket.emit(`serve:${token.key}`, AtomIO6.getState(token, store));
101
101
  const unsubscribe = subscribeToState(
102
102
  token,
103
103
  ({ newValue }) => {
@@ -140,7 +140,7 @@ var useExposeMutable = ({
140
140
  unsubscribeFromStateUpdates = null;
141
141
  };
142
142
  const fillSubRequest = () => {
143
- socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
143
+ socket.emit(`init:${token.key}`, AtomIO6.getState(jsonToken, store));
144
144
  unsubscribeFromStateUpdates = subscribeToState(
145
145
  trackerToken,
146
146
  ({ newValue }) => {
@@ -183,7 +183,7 @@ var useExposeMutableFamily = ({
183
183
  const fillSubRequest = (subKey) => {
184
184
  var _a;
185
185
  if (subKey === void 0) {
186
- const keys = AtomIO4.getState(index, store);
186
+ const keys = AtomIO6.getState(index, store);
187
187
  for (const key of keys) {
188
188
  const token = family(key);
189
189
  const jsonToken = getJsonToken(token);
@@ -191,7 +191,7 @@ var useExposeMutableFamily = ({
191
191
  socket.emit(
192
192
  `init:${family.key}`,
193
193
  parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
194
- AtomIO4.getState(jsonToken, store)
194
+ AtomIO6.getState(jsonToken, store)
195
195
  );
196
196
  const unsubFromUpdates = subscribeToState(
197
197
  trackerToken,
@@ -217,7 +217,7 @@ var useExposeMutableFamily = ({
217
217
  socket.emit(
218
218
  `init:${family.key}`,
219
219
  parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
220
- AtomIO4.getState(jsonToken, store)
220
+ AtomIO6.getState(jsonToken, store)
221
221
  );
222
222
  const unsubFromUpdates = subscribeToState(
223
223
  trackerToken,
@@ -241,7 +241,7 @@ var useExposeMutableFamily = ({
241
241
  const token = family(subKey);
242
242
  const jsonToken = getJsonToken(token);
243
243
  const updateToken = getUpdateToken(token);
244
- socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
244
+ socket.emit(`init:${token.key}`, AtomIO6.getState(jsonToken, store));
245
245
  const unsubscribe = subscribeToState(
246
246
  updateToken,
247
247
  ({ newValue }) => {
@@ -270,34 +270,6 @@ var useExposeMutableFamily = ({
270
270
  };
271
271
  };
272
272
  };
273
- var useReceiveTransaction = ({ socket, store }) => {
274
- return function receiveTransaction(tx) {
275
- const fillTransactionRequest = (update) => AtomIO4.runTransaction(tx, store)(...update.params);
276
- socket.on(`tx:${tx.key}`, fillTransactionRequest);
277
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
278
- };
279
- };
280
- function useSyncTransaction({
281
- socket,
282
- store = Internal.IMPLICIT.STORE
283
- }) {
284
- return function receiveTransaction(tx) {
285
- const fillTransactionRequest = (update, transactionId) => {
286
- const unsubscribe = Internal.subscribeToTransaction(
287
- tx,
288
- (update2) => {
289
- unsubscribe();
290
- socket.emit(`tx:sync:${transactionId}`, update2);
291
- },
292
- `sync:${transactionId}`,
293
- store
294
- );
295
- AtomIO4.runTransaction(tx, store)(...update.params);
296
- };
297
- socket.on(`tx:${tx.key}`, fillTransactionRequest);
298
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
299
- };
300
- }
301
273
  var useReceiveState = ({ socket, store }) => {
302
274
  return function receiveState(token) {
303
275
  const publish = (newValue) => setState(token, newValue, store);
@@ -316,6 +288,85 @@ var useReceiveState = ({ socket, store }) => {
316
288
  };
317
289
  };
318
290
  };
291
+ var useReceiveTransaction = ({ socket, store }) => {
292
+ return function receiveTransaction(tx) {
293
+ const fillTransactionRequest = (update) => {
294
+ const performanceKey = `tx-run:${tx.key}:${update.id}`;
295
+ const performanceKeyStart = `${performanceKey}:start`;
296
+ const performanceKeyEnd = `${performanceKey}:end`;
297
+ performance.mark(performanceKeyStart);
298
+ AtomIO6.runTransaction(tx, store)(...update.params);
299
+ performance.mark(performanceKeyEnd);
300
+ const metric = performance.measure(
301
+ performanceKey,
302
+ performanceKeyStart,
303
+ performanceKeyEnd
304
+ );
305
+ store == null ? void 0 : store.logger.info(`\u{1F680}`, `transaction`, tx.key, update.id, metric.duration);
306
+ };
307
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
308
+ return () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
309
+ };
310
+ };
311
+ var completeUpdateAtoms = AtomIO6.atomFamily({
312
+ key: `completeUpdate`,
313
+ default: null
314
+ });
315
+ var transactionRedactorAtoms = AtomIO6.atomFamily({
316
+ key: `transactionRedactor`,
317
+ default: { filter: (updates) => updates }
318
+ });
319
+ var redactedUpdateSelectors = AtomIO6.selectorFamily({
320
+ key: `redactedUpdate`,
321
+ get: ([transactionKey, updateId]) => ({ get, find }) => {
322
+ const update = get(find(completeUpdateAtoms, updateId));
323
+ const { filter } = get(find(transactionRedactorAtoms, transactionKey));
324
+ if (update && filter) {
325
+ return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
326
+ }
327
+ return null;
328
+ }
329
+ });
330
+ function useSyncTransaction({
331
+ socket,
332
+ store = Internal.IMPLICIT.STORE
333
+ }) {
334
+ return function syncTransaction(tx, filter) {
335
+ if (filter) {
336
+ AtomIO6.setState(
337
+ AtomIO6.findState(transactionRedactorAtoms, tx.key),
338
+ { filter },
339
+ store
340
+ );
341
+ }
342
+ const fillTransactionRequest = (update) => {
343
+ AtomIO6.runTransaction(tx, store, update.id)(...update.params);
344
+ };
345
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
346
+ const fillTransactionSubscriptionRequest = () => {
347
+ const unsubscribe = Internal.subscribeToTransaction(
348
+ tx,
349
+ (update) => {
350
+ unsubscribe();
351
+ const updateState = AtomIO6.findState(completeUpdateAtoms, update.id);
352
+ AtomIO6.setState(updateState, update, store);
353
+ const toEmit = filter ? AtomIO6.getState(
354
+ AtomIO6.findState(redactedUpdateSelectors, [tx.key, update.id]),
355
+ store
356
+ ) : update;
357
+ socket.emit(`tx-new:${tx.key}`, toEmit);
358
+ },
359
+ `tx-sub:${tx.key}:${socket.id}`,
360
+ store
361
+ );
362
+ socket.on(`tx-unsub:${tx.key}`, unsubscribe);
363
+ };
364
+ socket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest);
365
+ return () => {
366
+ socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
367
+ };
368
+ };
369
+ }
319
370
 
320
371
  export { useExposeFamily, useExposeMutable, useExposeMutableFamily, useExposeSingle, useReceiveState, useReceiveTransaction, useSyncTransaction };
321
372
  //# sourceMappingURL=out.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal","update"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.StateToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.StateToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\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 = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\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\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: AtomIO.TransactionUpdate<ƒ>,\n\t\t\ttransactionId: string,\n\t\t) => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tsocket.emit(`tx:sync:${transactionId}`, update)\n\t\t\t\t},\n\t\t\t\t`sync:${transactionId}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t}\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { StateToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<J extends Json.Serializable>(\n\t\ttoken: StateToken<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"]}
1
+ {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-state.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/sync-transaction.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson","Internal"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = Internal.subscribeToState(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.WritableToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.WritableToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\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 = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\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\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.WritableToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t}\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = subscribeToState(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = subscribeToState(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<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\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport * as Internal from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nconst completeUpdateAtoms = AtomIO.atomFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nconst transactionRedactorAtoms = AtomIO.atomFamily<\n\t{\n\t\tfilter: (\n\t\t\tupdates: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\n\nconst redactedUpdateSelectors = AtomIO.selectorFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport function useSyncTransaction({\n\tsocket,\n\tstore = Internal.IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function syncTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tif (filter) {\n\t\t\tAtomIO.setState(\n\t\t\t\tAtomIO.findState(transactionRedactorAtoms, tx.key),\n\t\t\t\t{ filter },\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tconst unsubscribe = Internal.subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tconst updateState = AtomIO.findState(completeUpdateAtoms, update.id)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tAtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribe)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n"]}
@@ -8,7 +8,7 @@ import type { ServerConfig } from ".."
8
8
  const subscribeToTokenCreation = <T>(
9
9
  family: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,
10
10
  key: string,
11
- handleTokenCreation: (token: AtomIO.StateToken<T>) => void,
11
+ handleTokenCreation: (token: AtomIO.WritableToken<T>) => void,
12
12
  ): (() => void) => {
13
13
  const unsubscribe =
14
14
  family.type === `atom_family`
@@ -24,7 +24,7 @@ export const useExposeFamily = ({
24
24
  }: ServerConfig) => {
25
25
  return function exposeFamily<J extends Json.Serializable>(
26
26
  family: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,
27
- index: AtomIO.StateToken<Set<string>>,
27
+ index: AtomIO.WritableToken<Set<string>>,
28
28
  ): () => void {
29
29
  const unsubSingleCallbacksByKey = new Map<string, () => void>()
30
30
  const unsubFamilyCallbacksByKey = new Map<string, () => void>()
@@ -21,7 +21,7 @@ export const useExposeMutableFamily = ({
21
21
  Json.Serializable,
22
22
  Json.Serializable
23
23
  >,
24
- >(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {
24
+ >(family: Family, index: AtomIO.WritableToken<Set<string>>): () => void {
25
25
  type FamilyKey = Family extends AtomIO.MutableAtomFamily<
26
26
  Transceiver<any>,
27
27
  any,
@@ -10,7 +10,7 @@ export const useExposeSingle = ({
10
10
  store = Internal.IMPLICIT.STORE,
11
11
  }: ServerConfig) => {
12
12
  return function exposeSingle<J extends Json.Serializable>(
13
- token: AtomIO.StateToken<J>,
13
+ token: AtomIO.WritableToken<J>,
14
14
  ): () => void {
15
15
  let unsubscribeFromStateUpdates: (() => void) | null = null
16
16
 
@@ -5,8 +5,9 @@ export * from "./expose-single"
5
5
  export * from "./expose-family"
6
6
  export * from "./expose-mutable"
7
7
  export * from "./expose-mutable-family"
8
- export * from "./receive-transaction"
9
8
  export * from "./receive-state"
9
+ export * from "./receive-transaction"
10
+ export * from "./sync-transaction"
10
11
 
11
12
  export type ServerConfig = {
12
13
  socket: SocketIO.Socket
@@ -1,5 +1,5 @@
1
1
  import { setState } from "atom.io"
2
- import type { StateToken } from "atom.io"
2
+ import type { WritableToken } from "atom.io"
3
3
  import type { Json } from "atom.io/json"
4
4
 
5
5
  import type { ServerConfig } from ".."
@@ -7,7 +7,7 @@ import type { ServerConfig } from ".."
7
7
  /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
8
8
  export const useReceiveState = ({ socket, store }: ServerConfig) => {
9
9
  return function receiveState<J extends Json.Serializable>(
10
- token: StateToken<J>,
10
+ token: WritableToken<J>,
11
11
  ): () => void {
12
12
  const publish = (newValue: J) => setState(token, newValue, store)
13
13
 
@@ -1,5 +1,4 @@
1
1
  import * as AtomIO from "atom.io"
2
- import * as Internal from "atom.io/internal"
3
2
 
4
3
  import type { ServerConfig } from "."
5
4
 
@@ -7,40 +6,22 @@ export const useReceiveTransaction = ({ socket, store }: ServerConfig) => {
7
6
  return function receiveTransaction<ƒ extends AtomIO.ƒn>(
8
7
  tx: AtomIO.TransactionToken<ƒ>,
9
8
  ): () => void {
10
- const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>
9
+ const fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {
10
+ const performanceKey = `tx-run:${tx.key}:${update.id}`
11
+ const performanceKeyStart = `${performanceKey}:start`
12
+ const performanceKeyEnd = `${performanceKey}:end`
13
+ performance.mark(performanceKeyStart)
11
14
  AtomIO.runTransaction<ƒ>(tx, store)(...update.params)
12
-
13
- socket.on(`tx:${tx.key}`, fillTransactionRequest)
14
-
15
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest)
16
- }
17
- }
18
-
19
- export function useSyncTransaction({
20
- socket,
21
- store = Internal.IMPLICIT.STORE,
22
- }: ServerConfig) {
23
- return function receiveTransaction<ƒ extends AtomIO.ƒn>(
24
- tx: AtomIO.TransactionToken<ƒ>,
25
- ): () => void {
26
- const fillTransactionRequest = (
27
- update: AtomIO.TransactionUpdate<ƒ>,
28
- transactionId: string,
29
- ) => {
30
- const unsubscribe = Internal.subscribeToTransaction(
31
- tx,
32
- (update) => {
33
- unsubscribe()
34
- socket.emit(`tx:sync:${transactionId}`, update)
35
- },
36
- `sync:${transactionId}`,
37
- store,
15
+ performance.mark(performanceKeyEnd)
16
+ const metric = performance.measure(
17
+ performanceKey,
18
+ performanceKeyStart,
19
+ performanceKeyEnd,
38
20
  )
39
- AtomIO.runTransaction<ƒ>(tx, store)(...update.params)
21
+ store?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)
40
22
  }
23
+ socket.on(`tx-run:${tx.key}`, fillTransactionRequest)
41
24
 
42
- socket.on(`tx:${tx.key}`, fillTransactionRequest)
43
-
44
- return () => socket.off(`tx:${tx.key}`, fillTransactionRequest)
25
+ return () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)
45
26
  }
46
27
  }