atom.io 0.15.4 → 0.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +20 -16
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.js +21 -17
- package/data/dist/index.js.map +1 -1
- package/data/src/join.ts +6 -2
- package/dist/index.cjs +21 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +69 -18
- package/dist/index.js +157 -1
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +88 -146
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +29 -17
- package/internal/dist/index.js +79 -92
- package/internal/dist/index.js.map +1 -1
- package/internal/src/get-environment-data.ts +18 -0
- package/internal/src/index.ts +2 -0
- package/internal/src/ingest-updates/index.ts +3 -0
- package/internal/src/ingest-updates/ingest-atom-update.ts +14 -0
- package/internal/src/ingest-updates/ingest-selector-update.ts +17 -0
- package/internal/src/ingest-updates/ingest-transaction-update.ts +22 -0
- package/internal/src/mutable/tracker.ts +1 -1
- package/internal/src/not-found-error.ts +3 -8
- package/internal/src/operation.ts +3 -3
- package/internal/src/selector/create-read-write-selector.ts +5 -3
- package/internal/src/selector/create-readonly-selector.ts +2 -2
- package/internal/src/selector/register-selector.ts +6 -4
- package/internal/src/selector/update-selector-atoms.ts +2 -2
- package/internal/src/set-state/set-atom.ts +8 -3
- package/internal/src/store/deposit.ts +5 -5
- package/internal/src/store/withdraw-new-family-member.ts +8 -11
- package/internal/src/store/withdraw.ts +4 -3
- package/internal/src/subscribe/subscribe-to-state.ts +2 -2
- package/internal/src/timeline/time-travel.ts +18 -44
- package/internal/src/transaction/apply-transaction.ts +3 -49
- package/internal/src/transaction/build-transaction.ts +8 -1
- package/internal/src/transaction/create-transaction.ts +3 -3
- package/internal/src/transaction/index.ts +2 -2
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.ts +4 -4
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-atom-index.ts +2 -2
- package/introspection/src/attach-selector-index.ts +2 -2
- package/introspection/src/index.ts +1 -1
- package/package.json +8 -8
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +3 -3
- package/react/dist/index.js.map +1 -1
- package/react/src/store-hooks.ts +4 -4
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.d.ts +3 -3
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/src/StateEditor.tsx +3 -3
- package/react-devtools/src/StateIndex.tsx +3 -3
- package/realtime-client/dist/index.cjs +67 -65
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +6 -5
- package/realtime-client/dist/index.js +62 -61
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/pull-family-member.ts +1 -1
- package/realtime-client/src/pull.ts +1 -1
- package/realtime-client/src/push.ts +2 -3
- package/realtime-client/src/realtime-state.ts +8 -0
- package/realtime-client/src/server-action.ts +65 -65
- package/realtime-react/dist/index.cjs +88 -52
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +11 -6
- package/realtime-react/dist/index.js +87 -51
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/on-mount.ts +23 -0
- package/realtime-react/src/realtime-context.tsx +12 -2
- package/realtime-react/src/use-pull-family-member.ts +5 -8
- package/realtime-react/src/use-pull-mutable-family-member.ts +4 -7
- package/realtime-react/src/use-pull-mutable.ts +4 -7
- package/realtime-react/src/use-pull.ts +5 -8
- package/realtime-react/src/use-push.ts +5 -9
- package/realtime-react/src/use-realtime-service.ts +30 -0
- package/realtime-react/src/use-server-action.ts +8 -8
- package/realtime-server/dist/index.cjs +109 -40
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +7 -6
- package/realtime-server/dist/index.js +90 -39
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/hook-composition/expose-family.ts +2 -2
- package/realtime-server/src/hook-composition/expose-mutable-family.ts +1 -1
- package/realtime-server/src/hook-composition/expose-single.ts +1 -1
- package/realtime-server/src/hook-composition/index.ts +2 -1
- package/realtime-server/src/hook-composition/receive-state.ts +2 -2
- package/realtime-server/src/hook-composition/receive-transaction.ts +13 -32
- package/realtime-server/src/hook-composition/sync-transaction.ts +92 -0
- package/realtime-testing/dist/index.cjs +3 -3
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.js +2 -2
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +4 -3
- package/src/atom.ts +30 -7
- package/src/dispose.ts +2 -2
- package/src/find-state.ts +64 -0
- package/src/get-state.ts +2 -2
- package/src/index.ts +15 -2
- package/src/logger.ts +1 -0
- package/src/selector.ts +16 -0
- package/src/set-state.ts +2 -2
- package/src/silo.ts +2 -2
- package/src/timeline.ts +2 -2
- package/src/transaction.ts +31 -12
- package/dist/chunk-RLZQ6IIY.js +0 -147
- package/dist/chunk-RLZQ6IIY.js.map +0 -1
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
|
5
|
-
var
|
|
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
|
|
28
|
-
var
|
|
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 =
|
|
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
|
|
37
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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 =
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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":";AAAA,SAAS,YAAY;AACrB,YAAY,SAAS;AACrB,YAAY,WAAW;
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
4
|
-
import * as
|
|
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 =
|
|
9
|
-
socket: null
|
|
8
|
+
var RealtimeContext = React.createContext({
|
|
9
|
+
socket: null,
|
|
10
|
+
services: null
|
|
10
11
|
});
|
|
11
12
|
var RealtimeProvider = ({ children, socket }) => {
|
|
12
|
-
const
|
|
13
|
-
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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 =
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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":";;;AAAA,SAAS,YAAY;AACrB,YAAY,SAAS;AACrB,YAAY,WAAW;
|
|
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"]}
|
|
@@ -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
|
+
}
|