atom.io 0.16.1 → 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +31 -14
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.js +31 -14
- package/data/dist/index.js.map +1 -1
- package/data/src/join.ts +31 -14
- package/dist/chunk-H4Q5FTPZ.js +11 -0
- package/dist/chunk-H4Q5FTPZ.js.map +1 -0
- package/dist/index.cjs +7 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +8 -14
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +240 -193
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +30 -9
- package/internal/dist/index.js +233 -194
- package/internal/dist/index.js.map +1 -1
- package/internal/src/families/find-in-store.ts +74 -0
- package/internal/src/families/index.ts +1 -0
- package/internal/src/ingest-updates/ingest-transaction-update.ts +1 -0
- package/internal/src/mutable/tracker.ts +37 -32
- package/internal/src/mutable/transceiver.ts +1 -1
- package/internal/src/not-found-error.ts +14 -3
- package/internal/src/operation.ts +2 -1
- package/internal/src/selector/create-writable-selector.ts +2 -1
- package/internal/src/selector/register-selector.ts +5 -4
- package/internal/src/set-state/set-atom.ts +23 -6
- package/internal/src/set-state/stow-update.ts +2 -4
- package/internal/src/store/store.ts +13 -4
- package/internal/src/timeline/add-atom-to-timeline.ts +5 -5
- package/internal/src/transaction/abort-transaction.ts +2 -1
- package/internal/src/transaction/apply-transaction.ts +5 -3
- package/internal/src/transaction/build-transaction.ts +17 -10
- package/internal/src/transaction/create-transaction.ts +2 -3
- package/internal/src/transaction/index.ts +3 -2
- package/internal/src/transaction/is-root-store.ts +23 -0
- package/package.json +10 -10
- package/react/dist/index.cjs +27 -21
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +8 -2
- package/react/dist/index.js +27 -21
- package/react/dist/index.js.map +1 -1
- package/react/src/index.ts +4 -1
- package/react/src/use-i.ts +36 -0
- package/react/src/use-json.ts +38 -0
- package/react/src/use-o.ts +34 -0
- package/react/src/use-tl.ts +45 -0
- package/realtime-client/dist/index.cjs +163 -62
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +10 -6
- package/realtime-client/dist/index.js +153 -60
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +2 -1
- package/realtime-client/src/pull-state.ts +4 -3
- package/realtime-client/src/{realtime-client-store.ts → realtime-client-stores/client-main-store.ts} +0 -8
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +15 -0
- package/realtime-client/src/realtime-client-stores/index.ts +2 -0
- package/realtime-client/src/sync-server-action.ts +131 -39
- package/realtime-client/src/sync-state.ts +19 -0
- package/realtime-react/dist/index.cjs +43 -26
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +3 -1
- package/realtime-react/dist/index.js +41 -25
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +1 -0
- package/realtime-react/src/on-mount.ts +3 -21
- package/realtime-react/src/use-realtime-service.ts +1 -1
- package/realtime-react/src/use-server-action.ts +1 -1
- package/realtime-react/src/use-single-effect.ts +29 -0
- package/realtime-react/src/use-sync-server-action.ts +5 -8
- package/realtime-react/src/use-sync.ts +17 -0
- package/realtime-server/dist/index.cjs +242 -48
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +147 -9
- package/realtime-server/dist/index.js +232 -51
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +2 -0
- package/realtime-server/src/realtime-action-receiver.ts +4 -3
- package/realtime-server/src/realtime-action-synchronizer.ts +100 -13
- package/realtime-server/src/realtime-family-provider.ts +10 -6
- package/realtime-server/src/realtime-mutable-family-provider.ts +15 -18
- package/realtime-server/src/realtime-mutable-provider.ts +1 -0
- package/realtime-server/src/realtime-server-stores/index.ts +2 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +115 -0
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +45 -0
- package/realtime-server/src/realtime-state-provider.ts +16 -8
- package/realtime-server/src/realtime-state-receiver.ts +1 -0
- package/realtime-server/src/realtime-state-synchronizer.ts +23 -0
- package/realtime-testing/dist/index.cjs +65 -26
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.ts +11 -7
- package/realtime-testing/dist/index.js +64 -26
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +83 -43
- package/src/find-state.ts +8 -16
- package/src/logger.ts +16 -11
- package/src/transaction.ts +4 -4
- package/react/src/store-hooks.ts +0 -87
- package/realtime-server/src/realtime-server-store.ts +0 -39
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var react = require('atom.io/react');
|
|
4
|
-
var
|
|
4
|
+
var RTC = require('atom.io/realtime-client');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
var
|
|
7
|
+
var AtomIO = require('atom.io');
|
|
8
8
|
|
|
9
9
|
function _interopNamespace(e) {
|
|
10
10
|
if (e && e.__esModule) return e;
|
|
@@ -24,9 +24,9 @@ function _interopNamespace(e) {
|
|
|
24
24
|
return Object.freeze(n);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var RTC__namespace = /*#__PURE__*/_interopNamespace(RTC);
|
|
28
28
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
29
|
-
var
|
|
29
|
+
var AtomIO__namespace = /*#__PURE__*/_interopNamespace(AtomIO);
|
|
30
30
|
|
|
31
31
|
// realtime-react/src/realtime-context.tsx
|
|
32
32
|
var RealtimeContext = React__namespace.createContext({
|
|
@@ -35,7 +35,7 @@ var RealtimeContext = React__namespace.createContext({
|
|
|
35
35
|
});
|
|
36
36
|
var RealtimeProvider = ({ children, socket }) => {
|
|
37
37
|
const services = React__namespace.useRef(/* @__PURE__ */ new Map()).current;
|
|
38
|
-
const setMyId = react.useI(
|
|
38
|
+
const setMyId = react.useI(RTC__namespace.myIdState__INTERNAL);
|
|
39
39
|
React__namespace.useEffect(() => {
|
|
40
40
|
setMyId(socket == null ? void 0 : socket.id);
|
|
41
41
|
socket == null ? void 0 : socket.on(`connect`, () => {
|
|
@@ -47,25 +47,36 @@ var RealtimeProvider = ({ children, socket }) => {
|
|
|
47
47
|
}, [socket, setMyId]);
|
|
48
48
|
return /* @__PURE__ */ jsxRuntime.jsx(RealtimeContext.Provider, { value: { socket, services }, children });
|
|
49
49
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
var { NODE_ENV } = process.env;
|
|
51
|
+
var IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`;
|
|
52
|
+
function noop() {
|
|
53
|
+
}
|
|
54
|
+
function useSingleEffect(effect, deps) {
|
|
55
|
+
if (IN_DEV) {
|
|
56
|
+
const cleanup = React__namespace.useRef(noop);
|
|
53
57
|
React__namespace.useEffect(() => {
|
|
58
|
+
var _a;
|
|
54
59
|
let dispose = cleanup.current;
|
|
55
|
-
if (dispose) {
|
|
60
|
+
if (dispose === noop) {
|
|
61
|
+
dispose = (_a = effect()) != null ? _a : noop;
|
|
62
|
+
cleanup.current = dispose;
|
|
63
|
+
} else {
|
|
56
64
|
return () => {
|
|
57
|
-
dispose
|
|
58
|
-
cleanup.current =
|
|
65
|
+
dispose();
|
|
66
|
+
cleanup.current = noop;
|
|
59
67
|
};
|
|
60
68
|
}
|
|
61
|
-
dispose = effect();
|
|
62
|
-
cleanup.current = dispose;
|
|
63
69
|
}, deps);
|
|
64
70
|
} else {
|
|
65
71
|
React__namespace.useEffect(effect, deps);
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
|
|
75
|
+
// realtime-react/src/on-mount.ts
|
|
76
|
+
function onMount(effect) {
|
|
77
|
+
useSingleEffect(effect, []);
|
|
78
|
+
}
|
|
79
|
+
|
|
69
80
|
// realtime-react/src/use-realtime-service.ts
|
|
70
81
|
function useRealtimeService(key, create) {
|
|
71
82
|
const { socket, services } = React__namespace.useContext(RealtimeContext);
|
|
@@ -88,7 +99,7 @@ function useRealtimeService(key, create) {
|
|
|
88
99
|
}
|
|
89
100
|
}
|
|
90
101
|
};
|
|
91
|
-
}
|
|
102
|
+
});
|
|
92
103
|
}
|
|
93
104
|
|
|
94
105
|
// realtime-react/src/use-pull.ts
|
|
@@ -96,54 +107,59 @@ function usePull(token) {
|
|
|
96
107
|
const store = React__namespace.useContext(react.StoreContext);
|
|
97
108
|
useRealtimeService(
|
|
98
109
|
`pull:${token.key}`,
|
|
99
|
-
(socket) =>
|
|
110
|
+
(socket) => RTC__namespace.pullState(token, socket, store)
|
|
100
111
|
);
|
|
101
112
|
}
|
|
102
113
|
function usePullFamilyMember(token) {
|
|
103
114
|
const store = React__namespace.useContext(react.StoreContext);
|
|
104
115
|
useRealtimeService(
|
|
105
116
|
`pull:${token.key}`,
|
|
106
|
-
(socket) =>
|
|
117
|
+
(socket) => RTC__namespace.pullFamilyMember(token, socket, store)
|
|
107
118
|
);
|
|
108
119
|
}
|
|
109
120
|
function usePullMutable(token) {
|
|
110
121
|
const store = React__namespace.useContext(react.StoreContext);
|
|
111
122
|
useRealtimeService(
|
|
112
123
|
`pull:${token.key}`,
|
|
113
|
-
(socket) =>
|
|
124
|
+
(socket) => RTC__namespace.pullMutableState(token, socket, store)
|
|
114
125
|
);
|
|
115
126
|
}
|
|
116
127
|
function usePullMutableFamilyMember(token) {
|
|
117
128
|
const store = React__namespace.useContext(react.StoreContext);
|
|
118
129
|
useRealtimeService(
|
|
119
130
|
`pull:${token.key}`,
|
|
120
|
-
(socket) =>
|
|
131
|
+
(socket) => RTC__namespace.pullMutableFamilyMember(token, socket, store)
|
|
121
132
|
);
|
|
122
133
|
}
|
|
123
134
|
function usePush(token) {
|
|
124
135
|
const store = React__namespace.useContext(react.StoreContext);
|
|
125
136
|
useRealtimeService(
|
|
126
137
|
`push:${token.key}`,
|
|
127
|
-
(socket) =>
|
|
138
|
+
(socket) => RTC__namespace.pushState(token, socket, store)
|
|
128
139
|
);
|
|
129
140
|
}
|
|
130
141
|
function useServerAction(token) {
|
|
131
142
|
const store = React__namespace.useContext(react.StoreContext);
|
|
132
143
|
useRealtimeService(
|
|
133
144
|
`tx:${token.key}`,
|
|
134
|
-
(socket) =>
|
|
145
|
+
(socket) => RTC__namespace.serverAction(token, socket, store)
|
|
135
146
|
);
|
|
136
|
-
return
|
|
147
|
+
return AtomIO__namespace.runTransaction(token, void 0, store);
|
|
137
148
|
}
|
|
138
149
|
function useSyncAction(token) {
|
|
139
150
|
const store = React__namespace.useContext(react.StoreContext);
|
|
140
|
-
|
|
141
|
-
|
|
151
|
+
useRealtimeService(`tx-sync:${token.key}`, (socket) => {
|
|
152
|
+
return RTC__namespace.syncAction(token, socket, store);
|
|
153
|
+
});
|
|
154
|
+
return AtomIO__namespace.runTransaction(token, void 0, store);
|
|
155
|
+
}
|
|
156
|
+
function useSync(token) {
|
|
157
|
+
const store = React__namespace.useContext(react.StoreContext);
|
|
142
158
|
useRealtimeService(
|
|
143
|
-
`
|
|
144
|
-
(socket) =>
|
|
159
|
+
`sync:${token.key}`,
|
|
160
|
+
(socket) => RTC__namespace.syncState(token, socket, store)
|
|
145
161
|
);
|
|
146
|
-
return
|
|
162
|
+
return react.useO(token);
|
|
147
163
|
}
|
|
148
164
|
|
|
149
165
|
exports.RealtimeContext = RealtimeContext;
|
|
@@ -154,6 +170,7 @@ exports.usePullMutable = usePullMutable;
|
|
|
154
170
|
exports.usePullMutableFamilyMember = usePullMutableFamilyMember;
|
|
155
171
|
exports.usePush = usePush;
|
|
156
172
|
exports.useServerAction = useServerAction;
|
|
173
|
+
exports.useSync = useSync;
|
|
157
174
|
exports.useSyncAction = useSyncAction;
|
|
158
175
|
//# sourceMappingURL=out.js.map
|
|
159
176
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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","../src/use-sync-server-action.ts"],"names":["RTC","React","StoreContext","AtomIO"],"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 } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn AtomIO.runTransaction(token, store)\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 useSyncAction<ƒ 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.syncAction(token, socket, updateQueue, store),\n\t)\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/use-single-effect.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","../src/use-sync-server-action.ts","../src/use-sync.ts"],"names":["RTC","React","StoreContext","AtomIO"],"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})\n}\n","import * as React from \"react\"\n\nconst { NODE_ENV } = process.env\nconst IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined): void {\n\tuseSingleEffect(effect, [])\n}\n","import type * as AtomIO from \"atom.io\"\nimport 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 } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn AtomIO.runTransaction(token, undefined, store)\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 { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn RTC.syncAction(token, socket, store)\n\t})\n\treturn AtomIO.runTransaction(token, undefined, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSync<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`sync:${token.key}`, (socket) =>\n\t\tRTC.syncState(token, socket, store),\n\t)\n\treturn useO(token)\n}\n"]}
|
|
@@ -31,4 +31,6 @@ declare function useServerAction<ƒ extends AtomIO.ƒn>(token: AtomIO.Transactio
|
|
|
31
31
|
|
|
32
32
|
declare function useSyncAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
declare function useSync<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): J;
|
|
35
|
+
|
|
36
|
+
export { RealtimeContext, RealtimeProvider, type RealtimeReactStore, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction, useSync, useSyncAction };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import '../../dist/chunk-PZLG2HP3.js';
|
|
2
2
|
import { useI, StoreContext, useO } from 'atom.io/react';
|
|
3
|
-
import * as
|
|
3
|
+
import * as RTC from 'atom.io/realtime-client';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { jsx } from 'react/jsx-runtime';
|
|
6
|
-
import * as
|
|
6
|
+
import * as AtomIO from 'atom.io';
|
|
7
7
|
|
|
8
8
|
var RealtimeContext = React.createContext({
|
|
9
9
|
socket: null,
|
|
@@ -11,7 +11,7 @@ var RealtimeContext = React.createContext({
|
|
|
11
11
|
});
|
|
12
12
|
var RealtimeProvider = ({ children, socket }) => {
|
|
13
13
|
const services = React.useRef(/* @__PURE__ */ new Map()).current;
|
|
14
|
-
const setMyId = useI(
|
|
14
|
+
const setMyId = useI(RTC.myIdState__INTERNAL);
|
|
15
15
|
React.useEffect(() => {
|
|
16
16
|
setMyId(socket == null ? void 0 : socket.id);
|
|
17
17
|
socket == null ? void 0 : socket.on(`connect`, () => {
|
|
@@ -23,25 +23,36 @@ var RealtimeProvider = ({ children, socket }) => {
|
|
|
23
23
|
}, [socket, setMyId]);
|
|
24
24
|
return /* @__PURE__ */ jsx(RealtimeContext.Provider, { value: { socket, services }, children });
|
|
25
25
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
var { NODE_ENV } = process.env;
|
|
27
|
+
var IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`;
|
|
28
|
+
function noop() {
|
|
29
|
+
}
|
|
30
|
+
function useSingleEffect(effect, deps) {
|
|
31
|
+
if (IN_DEV) {
|
|
32
|
+
const cleanup = React.useRef(noop);
|
|
29
33
|
React.useEffect(() => {
|
|
34
|
+
var _a;
|
|
30
35
|
let dispose = cleanup.current;
|
|
31
|
-
if (dispose) {
|
|
36
|
+
if (dispose === noop) {
|
|
37
|
+
dispose = (_a = effect()) != null ? _a : noop;
|
|
38
|
+
cleanup.current = dispose;
|
|
39
|
+
} else {
|
|
32
40
|
return () => {
|
|
33
|
-
dispose
|
|
34
|
-
cleanup.current =
|
|
41
|
+
dispose();
|
|
42
|
+
cleanup.current = noop;
|
|
35
43
|
};
|
|
36
44
|
}
|
|
37
|
-
dispose = effect();
|
|
38
|
-
cleanup.current = dispose;
|
|
39
45
|
}, deps);
|
|
40
46
|
} else {
|
|
41
47
|
React.useEffect(effect, deps);
|
|
42
48
|
}
|
|
43
49
|
}
|
|
44
50
|
|
|
51
|
+
// realtime-react/src/on-mount.ts
|
|
52
|
+
function onMount(effect) {
|
|
53
|
+
useSingleEffect(effect, []);
|
|
54
|
+
}
|
|
55
|
+
|
|
45
56
|
// realtime-react/src/use-realtime-service.ts
|
|
46
57
|
function useRealtimeService(key, create) {
|
|
47
58
|
const { socket, services } = React.useContext(RealtimeContext);
|
|
@@ -64,7 +75,7 @@ function useRealtimeService(key, create) {
|
|
|
64
75
|
}
|
|
65
76
|
}
|
|
66
77
|
};
|
|
67
|
-
}
|
|
78
|
+
});
|
|
68
79
|
}
|
|
69
80
|
|
|
70
81
|
// realtime-react/src/use-pull.ts
|
|
@@ -72,56 +83,61 @@ function usePull(token) {
|
|
|
72
83
|
const store = React.useContext(StoreContext);
|
|
73
84
|
useRealtimeService(
|
|
74
85
|
`pull:${token.key}`,
|
|
75
|
-
(socket) =>
|
|
86
|
+
(socket) => RTC.pullState(token, socket, store)
|
|
76
87
|
);
|
|
77
88
|
}
|
|
78
89
|
function usePullFamilyMember(token) {
|
|
79
90
|
const store = React.useContext(StoreContext);
|
|
80
91
|
useRealtimeService(
|
|
81
92
|
`pull:${token.key}`,
|
|
82
|
-
(socket) =>
|
|
93
|
+
(socket) => RTC.pullFamilyMember(token, socket, store)
|
|
83
94
|
);
|
|
84
95
|
}
|
|
85
96
|
function usePullMutable(token) {
|
|
86
97
|
const store = React.useContext(StoreContext);
|
|
87
98
|
useRealtimeService(
|
|
88
99
|
`pull:${token.key}`,
|
|
89
|
-
(socket) =>
|
|
100
|
+
(socket) => RTC.pullMutableState(token, socket, store)
|
|
90
101
|
);
|
|
91
102
|
}
|
|
92
103
|
function usePullMutableFamilyMember(token) {
|
|
93
104
|
const store = React.useContext(StoreContext);
|
|
94
105
|
useRealtimeService(
|
|
95
106
|
`pull:${token.key}`,
|
|
96
|
-
(socket) =>
|
|
107
|
+
(socket) => RTC.pullMutableFamilyMember(token, socket, store)
|
|
97
108
|
);
|
|
98
109
|
}
|
|
99
110
|
function usePush(token) {
|
|
100
111
|
const store = React.useContext(StoreContext);
|
|
101
112
|
useRealtimeService(
|
|
102
113
|
`push:${token.key}`,
|
|
103
|
-
(socket) =>
|
|
114
|
+
(socket) => RTC.pushState(token, socket, store)
|
|
104
115
|
);
|
|
105
116
|
}
|
|
106
117
|
function useServerAction(token) {
|
|
107
118
|
const store = React.useContext(StoreContext);
|
|
108
119
|
useRealtimeService(
|
|
109
120
|
`tx:${token.key}`,
|
|
110
|
-
(socket) =>
|
|
121
|
+
(socket) => RTC.serverAction(token, socket, store)
|
|
111
122
|
);
|
|
112
|
-
return
|
|
123
|
+
return AtomIO.runTransaction(token, void 0, store);
|
|
113
124
|
}
|
|
114
125
|
function useSyncAction(token) {
|
|
115
126
|
const store = React.useContext(StoreContext);
|
|
116
|
-
|
|
117
|
-
|
|
127
|
+
useRealtimeService(`tx-sync:${token.key}`, (socket) => {
|
|
128
|
+
return RTC.syncAction(token, socket, store);
|
|
129
|
+
});
|
|
130
|
+
return AtomIO.runTransaction(token, void 0, store);
|
|
131
|
+
}
|
|
132
|
+
function useSync(token) {
|
|
133
|
+
const store = React.useContext(StoreContext);
|
|
118
134
|
useRealtimeService(
|
|
119
|
-
`
|
|
120
|
-
(socket) =>
|
|
135
|
+
`sync:${token.key}`,
|
|
136
|
+
(socket) => RTC.syncState(token, socket, store)
|
|
121
137
|
);
|
|
122
|
-
return
|
|
138
|
+
return useO(token);
|
|
123
139
|
}
|
|
124
140
|
|
|
125
|
-
export { RealtimeContext, RealtimeProvider, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction, useSyncAction };
|
|
141
|
+
export { RealtimeContext, RealtimeProvider, usePull, usePullFamilyMember, usePullMutable, usePullMutableFamilyMember, usePush, useServerAction, useSync, useSyncAction };
|
|
126
142
|
//# sourceMappingURL=out.js.map
|
|
127
143
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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","../src/use-sync-server-action.ts"],"names":["RTC","React","StoreContext","AtomIO"],"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 } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn AtomIO.runTransaction(token, store)\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 useSyncAction<ƒ 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.syncAction(token, socket, updateQueue, store),\n\t)\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/use-single-effect.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","../src/use-sync-server-action.ts","../src/use-sync.ts"],"names":["RTC","React","StoreContext","AtomIO"],"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})\n}\n","import * as React from \"react\"\n\nconst { NODE_ENV } = process.env\nconst IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`\n\nfunction noop() {}\n\nexport function useSingleEffect(\n\teffect: () => (() => void) | undefined,\n\tdeps: unknown[],\n): void {\n\tif (IN_DEV) {\n\t\tconst cleanup = React.useRef<() => void>(noop)\n\t\tReact.useEffect(() => {\n\t\t\tlet dispose = cleanup.current\n\t\t\tif (dispose === noop) {\n\t\t\t\tdispose = effect() ?? noop\n\t\t\t\tcleanup.current = dispose\n\t\t\t} else {\n\t\t\t\treturn () => {\n\t\t\t\t\tdispose()\n\t\t\t\t\tcleanup.current = noop\n\t\t\t\t}\n\t\t\t}\n\t\t}, deps)\n\t} else {\n\t\tReact.useEffect(effect, deps)\n\t}\n}\n","import { useSingleEffect } from \"./use-single-effect\"\n\nexport function onMount(effect: () => (() => void) | undefined): void {\n\tuseSingleEffect(effect, [])\n}\n","import type * as AtomIO from \"atom.io\"\nimport 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 } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useServerAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\n\tuseRealtimeService(`tx:${token.key}`, (socket) =>\n\t\tRTC.serverAction(token, socket, store),\n\t)\n\treturn AtomIO.runTransaction(token, undefined, store)\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 { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncAction<ƒ extends AtomIO.ƒn>(\n\ttoken: AtomIO.TransactionToken<ƒ>,\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn RTC.syncAction(token, socket, store)\n\t})\n\treturn AtomIO.runTransaction(token, undefined, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useO } from \"atom.io/react\"\nimport * as RTC from \"atom.io/realtime-client\"\nimport * as React from \"react\"\n\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSync<J extends Json.Serializable>(\n\ttoken: AtomIO.WritableToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`sync:${token.key}`, (socket) =>\n\t\tRTC.syncState(token, socket, store),\n\t)\n\treturn useO(token)\n}\n"]}
|
|
@@ -1,23 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useSingleEffect } from "./use-single-effect"
|
|
2
2
|
|
|
3
|
-
export function onMount(
|
|
4
|
-
effect
|
|
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
|
-
}
|
|
3
|
+
export function onMount(effect: () => (() => void) | undefined): void {
|
|
4
|
+
useSingleEffect(effect, [])
|
|
23
5
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
const { NODE_ENV } = process.env
|
|
4
|
+
const IN_DEV = NODE_ENV === `development` || NODE_ENV === `test`
|
|
5
|
+
|
|
6
|
+
function noop() {}
|
|
7
|
+
|
|
8
|
+
export function useSingleEffect(
|
|
9
|
+
effect: () => (() => void) | undefined,
|
|
10
|
+
deps: unknown[],
|
|
11
|
+
): void {
|
|
12
|
+
if (IN_DEV) {
|
|
13
|
+
const cleanup = React.useRef<() => void>(noop)
|
|
14
|
+
React.useEffect(() => {
|
|
15
|
+
let dispose = cleanup.current
|
|
16
|
+
if (dispose === noop) {
|
|
17
|
+
dispose = effect() ?? noop
|
|
18
|
+
cleanup.current = dispose
|
|
19
|
+
} else {
|
|
20
|
+
return () => {
|
|
21
|
+
dispose()
|
|
22
|
+
cleanup.current = noop
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}, deps)
|
|
26
|
+
} else {
|
|
27
|
+
React.useEffect(effect, deps)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as AtomIO from "atom.io"
|
|
2
|
-
import { StoreContext
|
|
2
|
+
import { StoreContext } from "atom.io/react"
|
|
3
3
|
import * as RTC from "atom.io/realtime-client"
|
|
4
4
|
import * as React from "react"
|
|
5
5
|
|
|
@@ -9,11 +9,8 @@ export function useSyncAction<ƒ extends AtomIO.ƒn>(
|
|
|
9
9
|
token: AtomIO.TransactionToken<ƒ>,
|
|
10
10
|
): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {
|
|
11
11
|
const store = React.useContext(StoreContext)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
RTC.syncAction(token, socket, updateQueue, store),
|
|
17
|
-
)
|
|
18
|
-
return AtomIO.runTransaction(token, store)
|
|
12
|
+
useRealtimeService(`tx-sync:${token.key}`, (socket) => {
|
|
13
|
+
return RTC.syncAction(token, socket, store)
|
|
14
|
+
})
|
|
15
|
+
return AtomIO.runTransaction(token, undefined, store)
|
|
19
16
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type * as AtomIO from "atom.io"
|
|
2
|
+
import type { Json } from "atom.io/json"
|
|
3
|
+
import { StoreContext, useO } from "atom.io/react"
|
|
4
|
+
import * as RTC from "atom.io/realtime-client"
|
|
5
|
+
import * as React from "react"
|
|
6
|
+
|
|
7
|
+
import { useRealtimeService } from "./use-realtime-service"
|
|
8
|
+
|
|
9
|
+
export function useSync<J extends Json.Serializable>(
|
|
10
|
+
token: AtomIO.WritableToken<J>,
|
|
11
|
+
): J {
|
|
12
|
+
const store = React.useContext(StoreContext)
|
|
13
|
+
useRealtimeService(`sync:${token.key}`, (socket) =>
|
|
14
|
+
RTC.syncState(token, socket, store),
|
|
15
|
+
)
|
|
16
|
+
return useO(token)
|
|
17
|
+
}
|