atom.io 0.15.4 → 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 (107) hide show
  1. package/data/dist/index.cjs +20 -16
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.js +21 -17
  4. package/data/dist/index.js.map +1 -1
  5. package/data/src/join.ts +6 -2
  6. package/dist/index.cjs +21 -6
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +69 -18
  9. package/dist/index.js +157 -1
  10. package/dist/index.js.map +1 -1
  11. package/internal/dist/index.cjs +82 -143
  12. package/internal/dist/index.cjs.map +1 -1
  13. package/internal/dist/index.d.ts +29 -17
  14. package/internal/dist/index.js +73 -89
  15. package/internal/dist/index.js.map +1 -1
  16. package/internal/src/get-environment-data.ts +18 -0
  17. package/internal/src/index.ts +2 -0
  18. package/internal/src/ingest-updates/index.ts +3 -0
  19. package/internal/src/ingest-updates/ingest-atom-update.ts +14 -0
  20. package/internal/src/ingest-updates/ingest-selector-update.ts +17 -0
  21. package/internal/src/ingest-updates/ingest-transaction-update.ts +22 -0
  22. package/internal/src/mutable/tracker.ts +1 -1
  23. package/internal/src/not-found-error.ts +3 -8
  24. package/internal/src/operation.ts +3 -3
  25. package/internal/src/selector/create-read-write-selector.ts +5 -3
  26. package/internal/src/selector/create-readonly-selector.ts +2 -2
  27. package/internal/src/selector/register-selector.ts +6 -4
  28. package/internal/src/selector/update-selector-atoms.ts +2 -2
  29. package/internal/src/store/deposit.ts +5 -5
  30. package/internal/src/store/withdraw-new-family-member.ts +8 -11
  31. package/internal/src/store/withdraw.ts +4 -3
  32. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  33. package/internal/src/timeline/time-travel.ts +18 -44
  34. package/internal/src/transaction/apply-transaction.ts +3 -49
  35. package/internal/src/transaction/build-transaction.ts +8 -1
  36. package/internal/src/transaction/create-transaction.ts +3 -3
  37. package/internal/src/transaction/index.ts +2 -2
  38. package/introspection/dist/index.cjs.map +1 -1
  39. package/introspection/dist/index.d.ts +4 -4
  40. package/introspection/dist/index.js.map +1 -1
  41. package/introspection/src/attach-atom-index.ts +2 -2
  42. package/introspection/src/attach-selector-index.ts +2 -2
  43. package/introspection/src/index.ts +1 -1
  44. package/package.json +8 -8
  45. package/react/dist/index.cjs.map +1 -1
  46. package/react/dist/index.d.ts +3 -3
  47. package/react/dist/index.js.map +1 -1
  48. package/react/src/store-hooks.ts +4 -4
  49. package/react-devtools/dist/index.cjs.map +1 -1
  50. package/react-devtools/dist/index.d.ts +3 -3
  51. package/react-devtools/dist/index.js.map +1 -1
  52. package/react-devtools/src/StateEditor.tsx +3 -3
  53. package/react-devtools/src/StateIndex.tsx +3 -3
  54. package/realtime-client/dist/index.cjs +67 -65
  55. package/realtime-client/dist/index.cjs.map +1 -1
  56. package/realtime-client/dist/index.d.ts +6 -5
  57. package/realtime-client/dist/index.js +62 -61
  58. package/realtime-client/dist/index.js.map +1 -1
  59. package/realtime-client/src/pull-family-member.ts +1 -1
  60. package/realtime-client/src/pull.ts +1 -1
  61. package/realtime-client/src/push.ts +2 -3
  62. package/realtime-client/src/realtime-state.ts +8 -0
  63. package/realtime-client/src/server-action.ts +65 -65
  64. package/realtime-react/dist/index.cjs +88 -52
  65. package/realtime-react/dist/index.cjs.map +1 -1
  66. package/realtime-react/dist/index.d.ts +11 -6
  67. package/realtime-react/dist/index.js +87 -51
  68. package/realtime-react/dist/index.js.map +1 -1
  69. package/realtime-react/src/on-mount.ts +23 -0
  70. package/realtime-react/src/realtime-context.tsx +12 -2
  71. package/realtime-react/src/use-pull-family-member.ts +5 -8
  72. package/realtime-react/src/use-pull-mutable-family-member.ts +4 -7
  73. package/realtime-react/src/use-pull-mutable.ts +4 -7
  74. package/realtime-react/src/use-pull.ts +5 -8
  75. package/realtime-react/src/use-push.ts +5 -9
  76. package/realtime-react/src/use-realtime-service.ts +30 -0
  77. package/realtime-react/src/use-server-action.ts +8 -8
  78. package/realtime-server/dist/index.cjs +109 -40
  79. package/realtime-server/dist/index.cjs.map +1 -1
  80. package/realtime-server/dist/index.d.ts +7 -6
  81. package/realtime-server/dist/index.js +90 -39
  82. package/realtime-server/dist/index.js.map +1 -1
  83. package/realtime-server/src/hook-composition/expose-family.ts +2 -2
  84. package/realtime-server/src/hook-composition/expose-mutable-family.ts +1 -1
  85. package/realtime-server/src/hook-composition/expose-single.ts +1 -1
  86. package/realtime-server/src/hook-composition/index.ts +2 -1
  87. package/realtime-server/src/hook-composition/receive-state.ts +2 -2
  88. package/realtime-server/src/hook-composition/receive-transaction.ts +13 -32
  89. package/realtime-server/src/hook-composition/sync-transaction.ts +92 -0
  90. package/realtime-testing/dist/index.cjs +3 -3
  91. package/realtime-testing/dist/index.cjs.map +1 -1
  92. package/realtime-testing/dist/index.js +2 -2
  93. package/realtime-testing/dist/index.js.map +1 -1
  94. package/realtime-testing/src/setup-realtime-test.tsx +4 -3
  95. package/src/atom.ts +30 -7
  96. package/src/dispose.ts +2 -2
  97. package/src/find-state.ts +64 -0
  98. package/src/get-state.ts +2 -2
  99. package/src/index.ts +15 -2
  100. package/src/logger.ts +1 -0
  101. package/src/selector.ts +16 -0
  102. package/src/set-state.ts +2 -2
  103. package/src/silo.ts +2 -2
  104. package/src/timeline.ts +2 -2
  105. package/src/transaction.ts +31 -12
  106. package/dist/chunk-RLZQ6IIY.js +0 -147
  107. package/dist/chunk-RLZQ6IIY.js.map +0 -1
@@ -1,75 +1,75 @@
1
- import type * as AtomIO from "atom.io"
1
+ import * as AtomIO from "atom.io"
2
2
  import * as Internal from "atom.io/internal"
3
3
  import type { Socket } from "socket.io-client"
4
+ import { updateQueueAtoms } from "./realtime-state"
4
5
 
5
- const TX_SUBS = new Map<string, number>()
6
- export function synchronizeTransactionResults(
7
- token: AtomIO.TransactionToken<any>,
6
+ export function synchronizeTransactionResults<ƒ extends AtomIO.ƒn>(
7
+ token: AtomIO.TransactionToken<ƒ>,
8
8
  socket: Socket,
9
+ updateQueue: AtomIO.TransactionUpdate<any>[],
9
10
  store: Internal.Store,
10
11
  ): () => void {
11
- if (!socket) {
12
- return () => null
12
+ const updateQueueState = AtomIO.findState(updateQueueAtoms, token)
13
+
14
+ const unsubscribeFromLocalUpdates = Internal.subscribeToTransaction(
15
+ token,
16
+ (clientUpdate) => {
17
+ AtomIO.setState(updateQueueState, (queue) => {
18
+ queue.push(clientUpdate)
19
+ return queue
20
+ })
21
+ socket.emit(`tx-run:${token.key}`, clientUpdate)
22
+ },
23
+ `tx-run:${token.key}:${socket.id}`,
24
+ store,
25
+ )
26
+
27
+ const applyIncomingUpdate = (serverUpdate: AtomIO.TransactionUpdate<ƒ>) => {
28
+ const clientUpdate = updateQueue[0]
29
+ if (clientUpdate) {
30
+ if (clientUpdate.id !== serverUpdate.id) {
31
+ store.logger.error(
32
+ `❌`,
33
+ `transaction`,
34
+ serverUpdate.key,
35
+ `did not match position 0 in queue of updates awaiting sync:`,
36
+ updateQueue,
37
+ )
38
+ }
39
+ const clientResult = JSON.stringify(clientUpdate)
40
+ const serverResult = JSON.stringify(serverUpdate)
41
+ if (clientResult !== serverResult) {
42
+ store.logger.error(
43
+ `❌`,
44
+ `transaction`,
45
+ token.key,
46
+ `results do not match between client and server:`,
47
+ { clientResult, serverResult },
48
+ )
49
+ Internal.ingestTransactionUpdate(`oldValue`, clientUpdate, store)
50
+ } else {
51
+ store.logger.info(
52
+ `✅`,
53
+ `transaction`,
54
+ token.key,
55
+ `results match between client and server`,
56
+ )
57
+ }
58
+ AtomIO.setState(updateQueueState, (queue) => {
59
+ queue.shift()
60
+ return queue
61
+ })
62
+ }
63
+ Internal.ingestTransactionUpdate(`newValue`, serverUpdate, store)
64
+ }
65
+ socket.on(`tx-new:${token.key}`, applyIncomingUpdate)
66
+ socket.emit(`tx-sub:${token.key}`)
67
+ const unsubscribeFromIncomingUpdates = () => {
68
+ socket.off(`tx-new:${token.key}`, applyIncomingUpdate)
69
+ socket.emit(`tx-unsub:${token.key}`)
13
70
  }
14
- const count = TX_SUBS.get(token.key) ?? 0
15
- TX_SUBS.set(token.key, count + 1)
16
- const unsubscribe =
17
- count === 0
18
- ? Internal.subscribeToTransaction(
19
- token,
20
- (clientUpdate) => {
21
- const transactionId = Math.random().toString(36).slice(2)
22
- const clientResult = JSON.stringify(clientUpdate)
23
- const topic = `tx:sync:${transactionId}`
24
- const sync = (serverUpdate: typeof clientUpdate) => {
25
- store.logger.info(
26
- `🔄`,
27
- `transaction`,
28
- token.key,
29
- `syncing client and server`,
30
- )
31
- socket.off(topic, sync)
32
- const serverResult = JSON.stringify(serverUpdate)
33
- if (clientResult !== serverResult) {
34
- store.logger.error(
35
- `❌`,
36
- `transaction`,
37
- token.key,
38
- `results do not match between client and server`,
39
- )
40
- store.logger.error(
41
- `❌`,
42
- `transaction`,
43
- token.key,
44
- `client:`,
45
- clientResult,
46
- )
47
- store.logger.error(
48
- `❌`,
49
- `transaction`,
50
- token.key,
51
- `server:`,
52
- serverResult,
53
- )
54
- } else {
55
- store.logger.info(
56
- `✅`,
57
- `transaction`,
58
- token.key,
59
- `results match between client and server`,
60
- )
61
- }
62
- }
63
- socket.on(topic, sync)
64
- socket.emit(`tx:${token.key}`, clientUpdate, transactionId)
65
- },
66
- `use-server-action`,
67
- store,
68
- )
69
- : () => null
70
71
  return () => {
71
- const newCount = TX_SUBS.get(token.key) ?? 0
72
- TX_SUBS.set(token.key, newCount - 1)
73
- unsubscribe()
72
+ unsubscribeFromLocalUpdates()
73
+ unsubscribeFromIncomingUpdates()
74
74
  }
75
75
  }
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var react = require('atom.io/react');
4
- var RTC = require('atom.io/realtime-client');
5
- var React6 = require('react');
4
+ var RTC7 = require('atom.io/realtime-client');
5
+ var React = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var AtomIO = require('atom.io');
8
8
 
@@ -24,17 +24,19 @@ function _interopNamespace(e) {
24
24
  return Object.freeze(n);
25
25
  }
26
26
 
27
- var RTC__namespace = /*#__PURE__*/_interopNamespace(RTC);
28
- var React6__namespace = /*#__PURE__*/_interopNamespace(React6);
27
+ var RTC7__namespace = /*#__PURE__*/_interopNamespace(RTC7);
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
29
  var AtomIO__namespace = /*#__PURE__*/_interopNamespace(AtomIO);
30
30
 
31
31
  // realtime-react/src/realtime-context.tsx
32
- var RealtimeContext = React6__namespace.createContext({
33
- socket: null
32
+ var RealtimeContext = React__namespace.createContext({
33
+ socket: null,
34
+ services: null
34
35
  });
35
36
  var RealtimeProvider = ({ children, socket }) => {
36
- const setMyId = react.useI(RTC__namespace.myIdState__INTERNAL);
37
- React6__namespace.useEffect(() => {
37
+ const services = React__namespace.useRef(/* @__PURE__ */ new Map()).current;
38
+ const setMyId = react.useI(RTC7__namespace.myIdState__INTERNAL);
39
+ React__namespace.useEffect(() => {
38
40
  setMyId(socket == null ? void 0 : socket.id);
39
41
  socket == null ? void 0 : socket.on(`connect`, () => {
40
42
  setMyId(socket.id);
@@ -43,62 +45,96 @@ var RealtimeProvider = ({ children, socket }) => {
43
45
  setMyId(void 0);
44
46
  });
45
47
  }, [socket, setMyId]);
46
- return /* @__PURE__ */ jsxRuntime.jsx(RealtimeContext.Provider, { value: { socket }, children });
48
+ return /* @__PURE__ */ jsxRuntime.jsx(RealtimeContext.Provider, { value: { socket, services }, children });
47
49
  };
48
- function usePull(token) {
49
- const { socket } = React6__namespace.useContext(RealtimeContext);
50
- const store = React6__namespace.useContext(react.StoreContext);
51
- React6__namespace.useEffect(() => {
52
- if (socket) {
53
- return RTC__namespace.pullState(token, socket, store);
50
+ function onMount(effect, deps) {
51
+ if (process.env.NODE_ENV === `development`) {
52
+ const cleanup = React__namespace.useRef();
53
+ React__namespace.useEffect(() => {
54
+ let dispose = cleanup.current;
55
+ if (dispose) {
56
+ return () => {
57
+ dispose == null ? void 0 : dispose();
58
+ cleanup.current = void 0;
59
+ };
60
+ }
61
+ dispose = effect();
62
+ cleanup.current = dispose;
63
+ }, deps);
64
+ } else {
65
+ React__namespace.useEffect(effect, deps);
66
+ }
67
+ }
68
+
69
+ // realtime-react/src/use-realtime-service.ts
70
+ function useRealtimeService(key, create) {
71
+ const { socket, services } = React__namespace.useContext(RealtimeContext);
72
+ onMount(() => {
73
+ let service = services == null ? void 0 : services.get(key);
74
+ if (service) {
75
+ service[0]++;
76
+ } else {
77
+ const dispose = socket ? create(socket) : void 0;
78
+ service = [1, dispose];
79
+ services == null ? void 0 : services.set(key, service);
54
80
  }
55
- }, [token.key, socket]);
81
+ return () => {
82
+ var _a;
83
+ if (service) {
84
+ service[0]--;
85
+ if (service[0] === 0) {
86
+ (_a = service[1]) == null ? void 0 : _a.call(service);
87
+ services == null ? void 0 : services.delete(key);
88
+ }
89
+ }
90
+ };
91
+ }, [socket == null ? void 0 : socket.id]);
92
+ }
93
+
94
+ // realtime-react/src/use-pull.ts
95
+ function usePull(token) {
96
+ const store = React__namespace.useContext(react.StoreContext);
97
+ useRealtimeService(
98
+ `pull:${token.key}`,
99
+ (socket) => RTC7__namespace.pullState(token, socket, store)
100
+ );
56
101
  }
57
102
  function usePullFamilyMember(token) {
58
- const { socket } = React6__namespace.useContext(RealtimeContext);
59
- const store = React6__namespace.useContext(react.StoreContext);
60
- React6__namespace.useEffect(() => {
61
- if (socket) {
62
- return RTC__namespace.pullFamilyMember(token, socket, store);
63
- }
64
- }, [token.key, socket]);
103
+ const store = React__namespace.useContext(react.StoreContext);
104
+ useRealtimeService(
105
+ `pull:${token.key}`,
106
+ (socket) => RTC7__namespace.pullFamilyMember(token, socket, store)
107
+ );
65
108
  }
66
109
  function usePullMutable(token) {
67
- const { socket } = React6__namespace.useContext(RealtimeContext);
68
- const store = React6__namespace.useContext(react.StoreContext);
69
- React6__namespace.useEffect(() => {
70
- if (socket) {
71
- return RTC__namespace.pullMutableState(token, socket, store);
72
- }
73
- }, [token.key, socket]);
110
+ const store = React__namespace.useContext(react.StoreContext);
111
+ useRealtimeService(
112
+ `pull:${token.key}`,
113
+ (socket) => RTC7__namespace.pullMutableState(token, socket, store)
114
+ );
74
115
  }
75
116
  function usePullMutableFamilyMember(token) {
76
- const { socket } = React6__namespace.useContext(RealtimeContext);
77
- const store = React6__namespace.useContext(react.StoreContext);
78
- React6__namespace.useEffect(() => {
79
- if (socket) {
80
- return RTC__namespace.pullMutableFamilyMember(token, socket, store);
81
- }
82
- }, [token.key, socket]);
117
+ const store = React__namespace.useContext(react.StoreContext);
118
+ useRealtimeService(
119
+ `pull:${token.key}`,
120
+ (socket) => RTC7__namespace.pullMutableFamilyMember(token, socket, store)
121
+ );
83
122
  }
84
123
  function usePush(token) {
85
- const { socket } = React6__namespace.useContext(RealtimeContext);
86
- const store = React6__namespace.useContext(react.StoreContext);
87
- const id = React6__namespace.useId();
88
- React6__namespace.useEffect(() => {
89
- if (socket) {
90
- return RTC__namespace.pushState(token, socket, `use-push:${id}`, store);
91
- }
92
- }, [token.key, socket]);
124
+ const store = React__namespace.useContext(react.StoreContext);
125
+ useRealtimeService(
126
+ `push:${token.key}`,
127
+ (socket) => RTC7__namespace.pushState(token, socket, store)
128
+ );
93
129
  }
94
130
  function useServerAction(token) {
95
- const store = React6__namespace.useContext(react.StoreContext);
96
- const { socket } = React6__namespace.useContext(RealtimeContext);
97
- React6__namespace.useEffect(() => {
98
- if (socket) {
99
- return RTC__namespace.synchronizeTransactionResults(token, socket, store);
100
- }
101
- }, [token.key, socket]);
131
+ const store = React__namespace.useContext(react.StoreContext);
132
+ const updateQueueState = AtomIO__namespace.findState(RTC7__namespace.updateQueueAtoms, token);
133
+ const updateQueue = react.useO(updateQueueState);
134
+ useRealtimeService(
135
+ `tx:${token.key}`,
136
+ (socket) => RTC7__namespace.synchronizeTransactionResults(token, socket, updateQueue, store)
137
+ );
102
138
  return AtomIO__namespace.runTransaction(token, store);
103
139
  }
104
140
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["RTC","React","StoreContext"],"mappings":"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","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport const RealtimeContext = React.createContext<{ socket: Socket | null }>({\n\tsocket: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullState(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullFamilyMember(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullMutableState(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutableFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullMutableFamilyMember(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pushState(token, socket, `use-push:${id}`, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.synchronizeTransactionResults(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n\treturn AtomIO.runTransaction(token, store)\n}\n"]}
1
+ {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull.ts","../src/use-realtime-service.ts","../src/on-mount.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["RTC","React","StoreContext"],"mappings":"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","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext = React.createContext<RealtimeReactStore>({\n\tsocket: null,\n\tservices: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullState(token, socket, store),\n\t)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [socket?.id])\n}\n","import * as React from \"react\"\n\nexport function onMount(\n\teffect: () => (() => void) | undefined,\n\tdeps?: any[],\n): void {\n\tif (process.env.NODE_ENV === `development`) {\n\t\tconst cleanup = React.useRef<(() => void) | undefined>()\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose) {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose?.()\n\t\t\t\t\tcleanup.current = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\tdispose = effect()\n\t\t\tcleanup.current = dispose\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullFamilyMember(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableState(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableFamilyMember(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(token, socket, store),\n\t)\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst updateQueueState = AtomIO.findState(RTC.updateQueueAtoms, token)\n\tconst updateQueue = useO(updateQueueState)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.synchronizeTransactionResults(token, socket, updateQueue, store),\n\t)\n\treturn AtomIO.runTransaction(token, store)\n}\n"]}
@@ -4,24 +4,29 @@ import * as AtomIO from 'atom.io';
4
4
  import { Json } from 'atom.io/json';
5
5
  import { Transceiver } from 'atom.io/internal';
6
6
 
7
- declare const RealtimeContext: React.Context<{
7
+ type RealtimeReactStore = {
8
8
  socket: Socket | null;
9
- }>;
9
+ services: Map<string, [
10
+ consumerCount: number,
11
+ dispose: (() => void) | undefined
12
+ ]> | null;
13
+ };
14
+ declare const RealtimeContext: React.Context<RealtimeReactStore>;
10
15
  declare const RealtimeProvider: React.FC<{
11
16
  children: React.ReactNode;
12
17
  socket: Socket | null;
13
18
  }>;
14
19
 
15
- declare function usePull<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
20
+ declare function usePull<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): void;
16
21
 
17
- declare function usePullFamilyMember<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
22
+ declare function usePullFamilyMember<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): void;
18
23
 
19
24
  declare function usePullMutable<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
20
25
 
21
26
  declare function usePullMutableFamilyMember<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): void;
22
27
 
23
- declare function usePush<J extends Json.Serializable>(token: AtomIO.StateToken<J>): void;
28
+ declare function usePush<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): void;
24
29
 
25
30
  declare function useServerAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
26
31
 
27
- export { RealtimeContext, RealtimeProvider, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction };
32
+ export { RealtimeContext, RealtimeProvider, type RealtimeReactStore, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction };
@@ -1,16 +1,18 @@
1
1
  import '../../dist/chunk-PZLG2HP3.js';
2
- import { useI, StoreContext } from 'atom.io/react';
3
- import * as RTC from 'atom.io/realtime-client';
4
- import * as React6 from 'react';
2
+ import { useI, StoreContext, useO } from 'atom.io/react';
3
+ import * as RTC7 from 'atom.io/realtime-client';
4
+ import * as React from 'react';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
  import * as AtomIO from 'atom.io';
7
7
 
8
- var RealtimeContext = React6.createContext({
9
- socket: null
8
+ var RealtimeContext = React.createContext({
9
+ socket: null,
10
+ services: null
10
11
  });
11
12
  var RealtimeProvider = ({ children, socket }) => {
12
- const setMyId = useI(RTC.myIdState__INTERNAL);
13
- React6.useEffect(() => {
13
+ const services = React.useRef(/* @__PURE__ */ new Map()).current;
14
+ const setMyId = useI(RTC7.myIdState__INTERNAL);
15
+ React.useEffect(() => {
14
16
  setMyId(socket == null ? void 0 : socket.id);
15
17
  socket == null ? void 0 : socket.on(`connect`, () => {
16
18
  setMyId(socket.id);
@@ -19,62 +21,96 @@ var RealtimeProvider = ({ children, socket }) => {
19
21
  setMyId(void 0);
20
22
  });
21
23
  }, [socket, setMyId]);
22
- return /* @__PURE__ */ jsx(RealtimeContext.Provider, { value: { socket }, children });
24
+ return /* @__PURE__ */ jsx(RealtimeContext.Provider, { value: { socket, services }, children });
23
25
  };
24
- function usePull(token) {
25
- const { socket } = React6.useContext(RealtimeContext);
26
- const store = React6.useContext(StoreContext);
27
- React6.useEffect(() => {
28
- if (socket) {
29
- return RTC.pullState(token, socket, store);
26
+ function onMount(effect, deps) {
27
+ if (process.env.NODE_ENV === `development`) {
28
+ const cleanup = React.useRef();
29
+ React.useEffect(() => {
30
+ let dispose = cleanup.current;
31
+ if (dispose) {
32
+ return () => {
33
+ dispose == null ? void 0 : dispose();
34
+ cleanup.current = void 0;
35
+ };
36
+ }
37
+ dispose = effect();
38
+ cleanup.current = dispose;
39
+ }, deps);
40
+ } else {
41
+ React.useEffect(effect, deps);
42
+ }
43
+ }
44
+
45
+ // realtime-react/src/use-realtime-service.ts
46
+ function useRealtimeService(key, create) {
47
+ const { socket, services } = React.useContext(RealtimeContext);
48
+ onMount(() => {
49
+ let service = services == null ? void 0 : services.get(key);
50
+ if (service) {
51
+ service[0]++;
52
+ } else {
53
+ const dispose = socket ? create(socket) : void 0;
54
+ service = [1, dispose];
55
+ services == null ? void 0 : services.set(key, service);
30
56
  }
31
- }, [token.key, socket]);
57
+ return () => {
58
+ var _a;
59
+ if (service) {
60
+ service[0]--;
61
+ if (service[0] === 0) {
62
+ (_a = service[1]) == null ? void 0 : _a.call(service);
63
+ services == null ? void 0 : services.delete(key);
64
+ }
65
+ }
66
+ };
67
+ }, [socket == null ? void 0 : socket.id]);
68
+ }
69
+
70
+ // realtime-react/src/use-pull.ts
71
+ function usePull(token) {
72
+ const store = React.useContext(StoreContext);
73
+ useRealtimeService(
74
+ `pull:${token.key}`,
75
+ (socket) => RTC7.pullState(token, socket, store)
76
+ );
32
77
  }
33
78
  function usePullFamilyMember(token) {
34
- const { socket } = React6.useContext(RealtimeContext);
35
- const store = React6.useContext(StoreContext);
36
- React6.useEffect(() => {
37
- if (socket) {
38
- return RTC.pullFamilyMember(token, socket, store);
39
- }
40
- }, [token.key, socket]);
79
+ const store = React.useContext(StoreContext);
80
+ useRealtimeService(
81
+ `pull:${token.key}`,
82
+ (socket) => RTC7.pullFamilyMember(token, socket, store)
83
+ );
41
84
  }
42
85
  function usePullMutable(token) {
43
- const { socket } = React6.useContext(RealtimeContext);
44
- const store = React6.useContext(StoreContext);
45
- React6.useEffect(() => {
46
- if (socket) {
47
- return RTC.pullMutableState(token, socket, store);
48
- }
49
- }, [token.key, socket]);
86
+ const store = React.useContext(StoreContext);
87
+ useRealtimeService(
88
+ `pull:${token.key}`,
89
+ (socket) => RTC7.pullMutableState(token, socket, store)
90
+ );
50
91
  }
51
92
  function usePullMutableFamilyMember(token) {
52
- const { socket } = React6.useContext(RealtimeContext);
53
- const store = React6.useContext(StoreContext);
54
- React6.useEffect(() => {
55
- if (socket) {
56
- return RTC.pullMutableFamilyMember(token, socket, store);
57
- }
58
- }, [token.key, socket]);
93
+ const store = React.useContext(StoreContext);
94
+ useRealtimeService(
95
+ `pull:${token.key}`,
96
+ (socket) => RTC7.pullMutableFamilyMember(token, socket, store)
97
+ );
59
98
  }
60
99
  function usePush(token) {
61
- const { socket } = React6.useContext(RealtimeContext);
62
- const store = React6.useContext(StoreContext);
63
- const id = React6.useId();
64
- React6.useEffect(() => {
65
- if (socket) {
66
- return RTC.pushState(token, socket, `use-push:${id}`, store);
67
- }
68
- }, [token.key, socket]);
100
+ const store = React.useContext(StoreContext);
101
+ useRealtimeService(
102
+ `push:${token.key}`,
103
+ (socket) => RTC7.pushState(token, socket, store)
104
+ );
69
105
  }
70
106
  function useServerAction(token) {
71
- const store = React6.useContext(StoreContext);
72
- const { socket } = React6.useContext(RealtimeContext);
73
- React6.useEffect(() => {
74
- if (socket) {
75
- return RTC.synchronizeTransactionResults(token, socket, store);
76
- }
77
- }, [token.key, socket]);
107
+ const store = React.useContext(StoreContext);
108
+ const updateQueueState = AtomIO.findState(RTC7.updateQueueAtoms, token);
109
+ const updateQueue = useO(updateQueueState);
110
+ useRealtimeService(
111
+ `tx:${token.key}`,
112
+ (socket) => RTC7.synchronizeTransactionResults(token, socket, updateQueue, store)
113
+ );
78
114
  return AtomIO.runTransaction(token, store);
79
115
  }
80
116
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["RTC","React","StoreContext"],"mappings":"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","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport const RealtimeContext = React.createContext<{ socket: Socket | null }>({\n\tsocket: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullState(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullFamilyMember(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullMutableState(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePullMutableFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pullMutableFamilyMember(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.StateToken<J>,\n): void {\n\tconst { socket } = React.useContext(RealtimeContext)\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.pushState(token, socket, `use-push:${id}`, store)\n\t\t}\n\t}, [token.key, socket])\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst { socket } = React.useContext(RealtimeContext)\n\tReact.useEffect(() => {\n\t\tif (socket) {\n\t\t\treturn RTC.synchronizeTransactionResults(token, socket, store)\n\t\t}\n\t}, [token.key, socket])\n\treturn AtomIO.runTransaction(token, store)\n}\n"]}
1
+ {"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull.ts","../src/use-realtime-service.ts","../src/on-mount.ts","../src/use-pull-family-member.ts","../src/use-pull-mutable.ts","../src/use-pull-mutable-family-member.ts","../src/use-push.ts","../src/use-server-action.ts"],"names":["RTC","React","StoreContext"],"mappings":";;;AAAA,SAAS,YAAY;AACrB,YAAY,SAAS;AACrB,YAAY,WAAW;AAgCrB;AArBK,IAAM,kBAAwB,oBAAkC;AAAA,EACtE,QAAQ;AAAA,EACR,UAAU;AACX,CAAC;AAEM,IAAM,mBAGR,CAAC,EAAE,UAAU,OAAO,MAAM;AAC9B,QAAM,WAAiB,aAAO,oBAAI,IAAkC,CAAC,EAAE;AACvE,QAAM,UAAU,KAAS,uBAAmB;AAC5C,EAAM,gBAAU,MAAM;AACrB,YAAQ,iCAAQ,EAAE;AAClB,qCAAQ,GAAG,WAAW,MAAM;AAC3B,cAAQ,OAAO,EAAE;AAAA,IAClB;AACA,qCAAQ,GAAG,cAAc,MAAM;AAC9B,cAAQ,MAAS;AAAA,IAClB;AAAA,EACD,GAAG,CAAC,QAAQ,OAAO,CAAC;AACpB,SACC,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,QAAQ,SAAS,GAClD,UACF;AAEF;;;ACpCA,SAAS,oBAAoB;AAC7B,YAAYA,UAAS;AACrB,YAAYC,YAAW;;;ACJvB,YAAYA,YAAW;;;ACAvB,YAAYA,YAAW;AAEhB,SAAS,QACf,QACA,MACO;AACP,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC3C,UAAM,UAAgB,cAAiC;AACvD,IAAM,iBAAU,MAAM;AACrB,UAAI,UAAU,QAAQ;AACtB,UAAI,SAAS;AACZ,eAAO,MAAM;AACZ;AACA,kBAAQ,UAAU;AAAA,QACnB;AAAA,MACD;AACA,gBAAU,OAAO;AACjB,cAAQ,UAAU;AAAA,IACnB,GAAG,IAAI;AAAA,EACR,OAAO;AACN,IAAM,iBAAU,QAAQ,IAAI;AAAA,EAC7B;AACD;;;ADjBO,SAAS,mBACf,KACA,QACO;AACP,QAAM,EAAE,QAAQ,SAAS,IAAU,kBAAW,eAAe;AAC7D,UAAQ,MAAM;AACb,QAAI,UAAU,qCAAU,IAAI;AAC5B,QAAI,SAAS;AACZ,cAAQ,CAAC;AAAA,IACV,OAAO;AACN,YAAM,UAAU,SAAS,OAAO,MAAM,IAAI;AAC1C,gBAAU,CAAC,GAAG,OAAO;AACrB,2CAAU,IAAI,KAAK;AAAA,IACpB;AACA,WAAO,MAAM;AAnBf;AAoBG,UAAI,SAAS;AACZ,gBAAQ,CAAC;AACT,YAAI,QAAQ,CAAC,MAAM,GAAG;AACrB,wBAAQ,OAAR;AACA,+CAAU,OAAO;AAAA,QAClB;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAC,iCAAQ,EAAE,CAAC;AAChB;;;ADrBO,SAAS,QACf,OACO;AACP,QAAM,QAAc,kBAAW,YAAY;AAC3C;AAAA,IAAmB,QAAQ,MAAM,GAAG;AAAA,IAAI,CAAC,WACpC,eAAU,OAAO,QAAQ,KAAK;AAAA,EACnC;AACD;;;AGbA,SAAS,gBAAAC,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,oBACf,OACO;AACP,QAAM,QAAc,kBAAWC,aAAY;AAC3C;AAAA,IAAmB,QAAQ,MAAM,GAAG;AAAA,IAAI,CAAC,WACpC,sBAAiB,OAAO,QAAQ,KAAK;AAAA,EAC1C;AACD;;;ACZA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,eAGd,OAA4C;AAC7C,QAAM,QAAc,kBAAWC,aAAY;AAC3C;AAAA,IAAmB,QAAQ,MAAM,GAAG;AAAA,IAAI,CAAC,WACpC,sBAAiB,OAAO,QAAQ,KAAK;AAAA,EAC1C;AACD;;;ACdA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,2BAGd,OAA4C;AAC7C,QAAM,QAAc,kBAAWC,aAAY;AAC3C;AAAA,IAAmB,QAAQ,MAAM,GAAG;AAAA,IAAI,CAAC,WACpC,6BAAwB,OAAO,QAAQ,KAAK;AAAA,EACjD;AACD;;;ACfA,SAAS,gBAAAA,qBAAoB;AAC7B,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,QACf,OACO;AACP,QAAM,QAAc,kBAAWC,aAAY;AAC3C;AAAA,IAAmB,QAAQ,MAAM,GAAG;AAAA,IAAI,CAAC,WACpC,eAAU,OAAO,QAAQ,KAAK;AAAA,EACnC;AACD;;;ACfA,YAAY,YAAY;AACxB,SAAS,gBAAAA,eAAc,YAAY;AACnC,YAAYF,UAAS;AACrB,YAAYC,YAAW;AAIhB,SAAS,gBACf,OACkD;AAClD,QAAM,QAAc,kBAAWC,aAAY;AAC3C,QAAM,mBAA0B,iBAAc,uBAAkB,KAAK;AACrE,QAAM,cAAc,KAAK,gBAAgB;AAEzC;AAAA,IAAmB,MAAM,MAAM,GAAG;AAAA,IAAI,CAAC,WAClC,mCAA8B,OAAO,QAAQ,aAAa,KAAK;AAAA,EACpE;AACA,SAAc,sBAAe,OAAO,KAAK;AAC1C","sourcesContent":["import { useI } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\n\nexport type RealtimeReactStore = {\n\tsocket: Socket | null\n\tservices: Map<\n\t\tstring,\n\t\t[consumerCount: number, dispose: (() => void) | undefined]\n\t> | null\n}\n\nexport const RealtimeContext = React.createContext<RealtimeReactStore>({\n\tsocket: null,\n\tservices: null,\n})\n\nexport const RealtimeProvider: React.FC<{\n\tchildren: React.ReactNode\n\tsocket: Socket | null\n}> = ({ children, socket }) => {\n\tconst services = React.useRef(new Map<string, [number, () => void]>()).current\n\tconst setMyId = useI(RTC.myIdState__INTERNAL)\n\tReact.useEffect(() => {\n\t\tsetMyId(socket?.id)\n\t\tsocket?.on(`connect`, () => {\n\t\t\tsetMyId(socket.id)\n\t\t})\n\t\tsocket?.on(`disconnect`, () => {\n\t\t\tsetMyId(undefined)\n\t\t})\n\t}, [socket, setMyId])\n\treturn (\n\t\t<RealtimeContext.Provider value={{ socket, services }}>\n\t\t\t{children}\n\t\t</RealtimeContext.Provider>\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePull<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullState(token, socket, store),\n\t)\n}\n","import * as React from \"react\"\nimport type { Socket } from \"socket.io-client\"\nimport { onMount } from \"./on-mount\"\nimport { RealtimeContext } from \"./realtime-context\"\n\nexport function useRealtimeService(\n\tkey: string,\n\tcreate: (socket: Socket) => (() => void) | undefined,\n): void {\n\tconst { socket, services } = React.useContext(RealtimeContext)\n\tonMount(() => {\n\t\tlet service = services?.get(key)\n\t\tif (service) {\n\t\t\tservice[0]++\n\t\t} else {\n\t\t\tconst dispose = socket ? create(socket) : undefined\n\t\t\tservice = [1, dispose]\n\t\t\tservices?.set(key, service)\n\t\t}\n\t\treturn () => {\n\t\t\tif (service) {\n\t\t\t\tservice[0]--\n\t\t\t\tif (service[0] === 0) {\n\t\t\t\t\tservice[1]?.()\n\t\t\t\t\tservices?.delete(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [socket?.id])\n}\n","import * as React from \"react\"\n\nexport function onMount(\n\teffect: () => (() => void) | undefined,\n\tdeps?: any[],\n): void {\n\tif (process.env.NODE_ENV === `development`) {\n\t\tconst cleanup = React.useRef<(() => void) | undefined>()\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose) {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose?.()\n\t\t\t\t\tcleanup.current = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\tdispose = effect()\n\t\t\tcleanup.current = dispose\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullFamilyMember<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullFamilyMember(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableState(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePullMutableFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableFamilyMember(token, socket, store),\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function usePush<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(token, socket, store),\n\t)\n}\n","import * as AtomIO from \"atom.io\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tconst updateQueueState = AtomIO.findState(RTC.updateQueueAtoms, token)\n\tconst updateQueue = useO(updateQueueState)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.synchronizeTransactionResults(token, socket, updateQueue, store),\n\t)\n\treturn AtomIO.runTransaction(token, store)\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import * as React from "react"
2
+
3
+ export function onMount(
4
+ effect: () => (() => void) | undefined,
5
+ deps?: any[],
6
+ ): void {
7
+ if (process.env.NODE_ENV === `development`) {
8
+ const cleanup = React.useRef<(() => void) | undefined>()
9
+ React.useEffect(() => {
10
+ let dispose = cleanup.current
11
+ if (dispose) {
12
+ return () => {
13
+ dispose?.()
14
+ cleanup.current = undefined
15
+ }
16
+ }
17
+ dispose = effect()
18
+ cleanup.current = dispose
19
+ }, deps)
20
+ } else {
21
+ React.useEffect(effect, deps)
22
+ }
23
+ }