atom.io 0.8.0 → 0.8.2

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 (73) hide show
  1. package/dist/index.d.mts +8 -5
  2. package/dist/index.d.ts +8 -5
  3. package/dist/index.js +67 -72
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +34 -38
  6. package/dist/index.mjs.map +1 -1
  7. package/internal/dist/index.d.mts +27 -33
  8. package/internal/dist/index.d.ts +27 -33
  9. package/internal/dist/index.js +45 -69
  10. package/internal/dist/index.js.map +1 -1
  11. package/internal/dist/index.mjs +34 -39
  12. package/internal/dist/index.mjs.map +1 -1
  13. package/internal/src/caching.ts +12 -5
  14. package/internal/src/future.ts +2 -4
  15. package/internal/src/mutable/create-mutable-atom-family.ts +4 -4
  16. package/internal/src/mutable/create-mutable-atom.ts +6 -5
  17. package/internal/src/mutable/is-atom-token-mutable.ts +3 -3
  18. package/internal/src/mutable/tracker-family.ts +4 -4
  19. package/internal/src/mutable/tracker.ts +20 -19
  20. package/internal/src/operation.ts +5 -2
  21. package/internal/src/selector/create-read-write-selector.ts +2 -2
  22. package/internal/src/selector/register-selector.ts +2 -2
  23. package/internal/src/set-state/{set-atom-state.ts → set-atom.ts} +1 -1
  24. package/internal/src/set-state/set-selector-state.ts +1 -12
  25. package/internal/src/set-state/set-state-internal.ts +4 -5
  26. package/internal/src/store/withdraw-new-family-member.ts +7 -7
  27. package/internal/src/store/withdraw.ts +15 -9
  28. package/internal/src/subscribe/subscribe-to-root-atoms.ts +1 -1
  29. package/internal/src/timeline/add-atom-to-timeline.ts +2 -2
  30. package/internal/src/transaction/apply-transaction.ts +1 -1
  31. package/internal/src/transaction/redo-transaction.ts +1 -1
  32. package/internal/src/transaction/undo-transaction.ts +1 -1
  33. package/package.json +11 -8
  34. package/react-devtools/dist/index.d.mts +4 -4
  35. package/react-devtools/dist/index.d.ts +4 -4
  36. package/react-devtools/dist/index.js +3 -3
  37. package/react-devtools/dist/index.js.map +1 -1
  38. package/react-devtools/dist/index.mjs +3 -3
  39. package/react-devtools/dist/index.mjs.map +1 -1
  40. package/realtime-client/dist/index.d.mts +21 -0
  41. package/realtime-client/dist/index.d.ts +21 -0
  42. package/realtime-client/dist/index.js +173 -0
  43. package/realtime-client/dist/index.js.map +1 -0
  44. package/realtime-client/dist/index.mjs +144 -0
  45. package/realtime-client/dist/index.mjs.map +1 -0
  46. package/realtime-client/package.json +15 -0
  47. package/realtime-client/src/index.ts +7 -0
  48. package/realtime-client/src/realtime-state.ts +10 -0
  49. package/realtime-client/src/use-pull-family-member.ts +26 -0
  50. package/realtime-client/src/use-pull-mutable-family-member.ts +38 -0
  51. package/realtime-client/src/use-pull-mutable.ts +32 -0
  52. package/realtime-client/src/use-pull.ts +19 -0
  53. package/realtime-client/src/use-push.ts +25 -0
  54. package/realtime-client/src/use-server-action.ts +49 -0
  55. package/realtime-server/dist/index.d.mts +25 -0
  56. package/realtime-server/dist/index.d.ts +25 -0
  57. package/realtime-server/dist/index.js +316 -0
  58. package/realtime-server/dist/index.js.map +1 -0
  59. package/realtime-server/dist/index.mjs +289 -0
  60. package/realtime-server/dist/index.mjs.map +1 -0
  61. package/realtime-server/package.json +15 -0
  62. package/realtime-server/src/README.md +33 -0
  63. package/realtime-server/src/hook-composition/expose-family.ts +105 -0
  64. package/realtime-server/src/hook-composition/expose-mutable-family.ts +127 -0
  65. package/realtime-server/src/hook-composition/expose-mutable.ts +45 -0
  66. package/realtime-server/src/hook-composition/expose-single.ts +39 -0
  67. package/realtime-server/src/hook-composition/index.ts +14 -0
  68. package/realtime-server/src/hook-composition/receive-state.ts +30 -0
  69. package/realtime-server/src/hook-composition/receive-transaction.ts +37 -0
  70. package/realtime-server/src/index.ts +1 -0
  71. package/src/get-set.ts +48 -0
  72. package/src/index.ts +3 -60
  73. package/src/subscribe.ts +3 -3
@@ -0,0 +1,25 @@
1
+ import { Transceiver, Store } from 'atom.io/internal';
2
+ import * as SocketIO from 'socket.io';
3
+ import * as AtomIO from 'atom.io';
4
+ import { StateToken } from 'atom.io';
5
+ import { Json } from 'atom.io/json';
6
+
7
+ declare const useExposeSingle: ({ socket, store }: ServerConfig) => <J extends Json.Serializable>(token: AtomIO.StateToken<J>) => () => void;
8
+
9
+ declare const useExposeFamily: ({ socket, store }: ServerConfig) => <J extends Json.Serializable>(family: AtomIO.AtomFamily<J, Json.Serializable> | AtomIO.SelectorFamily<J, Json.Serializable>, index: AtomIO.StateToken<Set<string>>) => () => void;
10
+
11
+ declare const useExposeMutable: ({ socket, store }: ServerConfig) => <Core extends Transceiver<Json.Serializable>, SerializableCore extends Json.Serializable>(token: AtomIO.MutableAtomToken<Core, SerializableCore>) => () => void;
12
+
13
+ declare const useExposeMutableFamily: ({ socket, store }: ServerConfig) => <Family extends AtomIO.MutableAtomFamily<Transceiver<Json.Serializable>, Json.Serializable, Json.Serializable>>(family: Family, index: AtomIO.StateToken<Set<string>>) => () => void;
14
+
15
+ declare const useReceiveTransaction: ({ socket, store }: ServerConfig) => <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
16
+ declare function useSyncTransaction({ socket, store }: ServerConfig): <ƒ extends AtomIO.ƒn>(tx: AtomIO.TransactionToken<ƒ>) => () => void;
17
+
18
+ declare const useReceiveState: ({ socket, store }: ServerConfig) => <J extends Json.Serializable>(token: StateToken<J>) => () => void;
19
+
20
+ type ServerConfig = {
21
+ socket: SocketIO.Socket;
22
+ store?: Store;
23
+ };
24
+
25
+ export { ServerConfig, useExposeFamily, useExposeMutable, useExposeMutableFamily, useExposeSingle, useReceiveState, useReceiveTransaction, useSyncTransaction };
@@ -0,0 +1,316 @@
1
+ 'use strict';
2
+
3
+ var AtomIO4 = require('atom.io');
4
+ var json = require('atom.io/json');
5
+ var internal = require('atom.io/internal');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var AtomIO4__namespace = /*#__PURE__*/_interopNamespace(AtomIO4);
26
+
27
+ // src/hook-composition/expose-single.ts
28
+ var useExposeSingle = ({ socket, store }) => {
29
+ return function exposeSingle(token) {
30
+ let unsubscribeFromStateUpdates = null;
31
+ const fillUnsubRequest = () => {
32
+ socket.off(`unsub:${token.key}`, fillUnsubRequest);
33
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
34
+ unsubscribeFromStateUpdates = null;
35
+ };
36
+ const fillSubRequest = () => {
37
+ socket.emit(`serve:${token.key}`, AtomIO4__namespace.getState(token, store));
38
+ unsubscribeFromStateUpdates = AtomIO4__namespace.subscribe(
39
+ token,
40
+ ({ newValue }) => {
41
+ socket.emit(`serve:${token.key}`, newValue);
42
+ },
43
+ `expose-single:${socket.id}`,
44
+ store
45
+ );
46
+ socket.on(`unsub:${token.key}`, fillUnsubRequest);
47
+ };
48
+ socket.on(`sub:${token.key}`, fillSubRequest);
49
+ return () => {
50
+ socket.off(`sub:${token.key}`, fillSubRequest);
51
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
52
+ };
53
+ };
54
+ };
55
+ var subscribeToTokenCreation = (family, key, handleTokenCreation) => {
56
+ const unsubscribe = family.type === `atom_family` ? family.subject.subscribe(key, handleTokenCreation) : family.subject.subscribe(key, handleTokenCreation);
57
+ return unsubscribe;
58
+ };
59
+ var useExposeFamily = ({ socket, store }) => {
60
+ return function exposeFamily(family, index) {
61
+ const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
62
+ const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
63
+ const fillFamilyUnsubRequest = () => {
64
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
65
+ unsubFamilyCallbacksByKey.clear();
66
+ socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
67
+ };
68
+ const fillSingleUnsubRequest = (key) => {
69
+ socket.off(`unsub:${key}`, fillSingleUnsubRequest);
70
+ const unsub = unsubSingleCallbacksByKey.get(key);
71
+ if (unsub) {
72
+ unsub();
73
+ unsubSingleCallbacksByKey.delete(key);
74
+ }
75
+ };
76
+ const fillSubRequest = (subKey) => {
77
+ if (subKey === void 0) {
78
+ const keys = AtomIO4__namespace.getState(index, store);
79
+ keys.forEach((key) => {
80
+ var _a;
81
+ const token = family(key);
82
+ socket.emit(
83
+ `serve:${family.key}`,
84
+ json.parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
85
+ AtomIO4__namespace.getState(token, store)
86
+ );
87
+ });
88
+ const unsubscribeFromTokenCreation = subscribeToTokenCreation(
89
+ family,
90
+ `expose-family:${socket.id}`,
91
+ (token) => {
92
+ const unsub = AtomIO4__namespace.subscribe(
93
+ token,
94
+ ({ newValue }) => {
95
+ var _a;
96
+ socket.emit(
97
+ `serve:${family.key}`,
98
+ json.parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
99
+ newValue
100
+ );
101
+ },
102
+ `expose-family:${family.key}:${socket.id}`,
103
+ store
104
+ );
105
+ unsubFamilyCallbacksByKey.set(token.key, unsub);
106
+ }
107
+ );
108
+ unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
109
+ socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
110
+ } else {
111
+ const token = family(subKey);
112
+ socket.emit(`serve:${token.key}`, AtomIO4__namespace.getState(token, store));
113
+ const unsubscribe = AtomIO4__namespace.subscribe(
114
+ token,
115
+ ({ newValue }) => {
116
+ socket.emit(`serve:${token.key}`, newValue);
117
+ },
118
+ `expose-family:${family.key}:${socket.id}`,
119
+ store
120
+ );
121
+ unsubSingleCallbacksByKey.set(token.key, unsubscribe);
122
+ socket.on(`unsub:${token.key}`, () => {
123
+ fillSingleUnsubRequest(token.key);
124
+ });
125
+ }
126
+ };
127
+ socket.on(`sub:${family.key}`, fillSubRequest);
128
+ return () => {
129
+ socket.off(`sub:${family.key}`, fillSubRequest);
130
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
131
+ unsubSingleCallbacksByKey.forEach((unsub) => unsub());
132
+ unsubFamilyCallbacksByKey.clear();
133
+ unsubSingleCallbacksByKey.clear();
134
+ };
135
+ };
136
+ };
137
+ var useExposeMutable = ({ socket, store }) => {
138
+ return function exposeMutable(token) {
139
+ let unsubscribeFromStateUpdates = null;
140
+ const jsonToken = internal.getJsonToken(token);
141
+ const trackerToken = internal.getUpdateToken(token);
142
+ const fillUnsubRequest = () => {
143
+ socket.off(`unsub:${token.key}`, fillUnsubRequest);
144
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
145
+ unsubscribeFromStateUpdates = null;
146
+ };
147
+ const fillSubRequest = () => {
148
+ socket.emit(`init:${token.key}`, AtomIO4__namespace.getState(jsonToken, store));
149
+ unsubscribeFromStateUpdates = AtomIO4__namespace.subscribe(
150
+ trackerToken,
151
+ ({ newValue }) => {
152
+ socket.emit(`next:${token.key}`, newValue);
153
+ },
154
+ `expose-single:${socket.id}`,
155
+ store
156
+ );
157
+ socket.on(`unsub:${token.key}`, fillUnsubRequest);
158
+ };
159
+ socket.on(`sub:${token.key}`, fillSubRequest);
160
+ return () => {
161
+ socket.off(`sub:${token.key}`, fillSubRequest);
162
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
163
+ };
164
+ };
165
+ };
166
+ var useExposeMutableFamily = ({ socket, store }) => {
167
+ return function exposeMutableFamily(family, index) {
168
+ const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
169
+ const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
170
+ const fillFamilyUnsubRequest = () => {
171
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
172
+ unsubFamilyCallbacksByKey.clear();
173
+ socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
174
+ };
175
+ const fillSingleUnsubRequest = (key) => {
176
+ socket.off(`unsub:${key}`, fillSingleUnsubRequest);
177
+ const unsub = unsubSingleCallbacksByKey.get(key);
178
+ if (unsub) {
179
+ unsub();
180
+ unsubSingleCallbacksByKey.delete(key);
181
+ }
182
+ };
183
+ const fillSubRequest = (subKey) => {
184
+ if (subKey === void 0) {
185
+ const keys = AtomIO4__namespace.getState(index, store);
186
+ keys.forEach((key) => {
187
+ var _a;
188
+ const token = family(key);
189
+ const jsonToken = internal.getJsonToken(token);
190
+ const trackerToken = internal.getUpdateToken(token);
191
+ socket.emit(
192
+ `init:${family.key}`,
193
+ json.parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
194
+ AtomIO4__namespace.getState(jsonToken, store)
195
+ );
196
+ const unsubFromUpdates = AtomIO4__namespace.subscribe(
197
+ trackerToken,
198
+ ({ newValue }) => {
199
+ var _a2;
200
+ socket.emit(
201
+ `next:${token.key}`,
202
+ json.parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
203
+ newValue
204
+ );
205
+ },
206
+ `expose-family:${family.key}:${socket.id}`,
207
+ store
208
+ );
209
+ unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
210
+ });
211
+ const unsubscribeFromTokenCreation = family.subject.subscribe(
212
+ `expose-family:${socket.id}`,
213
+ (token) => {
214
+ var _a;
215
+ const jsonToken = internal.getJsonToken(token);
216
+ const trackerToken = internal.getUpdateToken(token);
217
+ socket.emit(
218
+ `init:${family.key}`,
219
+ json.parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
220
+ AtomIO4__namespace.getState(jsonToken, store)
221
+ );
222
+ const unsubFromUpdates = AtomIO4__namespace.subscribe(
223
+ trackerToken,
224
+ ({ newValue }) => {
225
+ var _a2;
226
+ socket.emit(
227
+ `next:${token.key}`,
228
+ json.parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
229
+ newValue
230
+ );
231
+ },
232
+ `expose-family:${family.key}:${socket.id}`,
233
+ store
234
+ );
235
+ unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
236
+ }
237
+ );
238
+ unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
239
+ socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
240
+ } else {
241
+ const token = family(subKey);
242
+ const jsonToken = internal.getJsonToken(token);
243
+ const updateToken = internal.getUpdateToken(token);
244
+ socket.emit(`init:${token.key}`, AtomIO4__namespace.getState(jsonToken, store));
245
+ const unsubscribe = AtomIO4__namespace.subscribe(
246
+ updateToken,
247
+ ({ newValue }) => {
248
+ socket.emit(`next:${token.key}`, newValue);
249
+ },
250
+ `expose-family:${family.key}:${socket.id}`,
251
+ store
252
+ );
253
+ unsubSingleCallbacksByKey.set(token.key, unsubscribe);
254
+ socket.on(`unsub:${token.key}`, () => {
255
+ fillSingleUnsubRequest(token.key);
256
+ });
257
+ }
258
+ };
259
+ socket.on(`sub:${family.key}`, fillSubRequest);
260
+ return () => {
261
+ socket.off(`sub:${family.key}`, fillSubRequest);
262
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
263
+ unsubSingleCallbacksByKey.forEach((unsub) => unsub());
264
+ unsubFamilyCallbacksByKey.clear();
265
+ unsubSingleCallbacksByKey.clear();
266
+ };
267
+ };
268
+ };
269
+ var useReceiveTransaction = ({ socket, store }) => {
270
+ return function receiveTransaction(tx) {
271
+ const fillTransactionRequest = (update) => AtomIO4__namespace.runTransaction(tx, store)(...update.params);
272
+ socket.on(`tx:${tx.key}`, fillTransactionRequest);
273
+ return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
274
+ };
275
+ };
276
+ function useSyncTransaction({ socket, store }) {
277
+ return function receiveTransaction(tx) {
278
+ const fillTransactionRequest = (update, transactionId) => {
279
+ const unsubscribe = AtomIO4__namespace.subscribeToTransaction(tx, (update2) => {
280
+ unsubscribe();
281
+ socket.emit(`tx:sync:${transactionId}`, update2);
282
+ });
283
+ AtomIO4__namespace.runTransaction(tx, store)(...update.params);
284
+ };
285
+ socket.on(`tx:${tx.key}`, fillTransactionRequest);
286
+ return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
287
+ };
288
+ }
289
+ var useReceiveState = ({ socket, store }) => {
290
+ return function receiveState(token) {
291
+ const publish = (newValue) => AtomIO4.setState(token, newValue, store);
292
+ const fillPubUnclaim = () => {
293
+ socket.off(`pub:${token.key}`, publish);
294
+ socket.off(`unclaim:${token.key}`, fillPubUnclaim);
295
+ };
296
+ const fillPubClaim = () => {
297
+ socket.on(`pub:${token.key}`, publish);
298
+ socket.on(`unclaim:${token.key}`, fillPubUnclaim);
299
+ };
300
+ socket.on(`claim:${token.key}`, fillPubClaim);
301
+ return () => {
302
+ socket.off(`claim:${token.key}`, fillPubClaim);
303
+ socket.off(`pub:${token.key}`, publish);
304
+ };
305
+ };
306
+ };
307
+
308
+ exports.useExposeFamily = useExposeFamily;
309
+ exports.useExposeMutable = useExposeMutable;
310
+ exports.useExposeMutableFamily = useExposeMutableFamily;
311
+ exports.useExposeSingle = useExposeSingle;
312
+ exports.useReceiveState = useReceiveState;
313
+ exports.useReceiveTransaction = useReceiveTransaction;
314
+ exports.useSyncTransaction = useSyncTransaction;
315
+ //# sourceMappingURL=out.js.map
316
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hook-composition/expose-single.ts","../src/hook-composition/expose-family.ts","../src/hook-composition/expose-mutable.ts","../src/hook-composition/expose-mutable-family.ts","../src/hook-composition/receive-transaction.ts","../src/hook-composition/receive-state.ts"],"names":["AtomIO","getJsonToken","getUpdateToken","parseJson","_a","update"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeSingle = ({ socket, store }: ServerConfig) => {\n\treturn function exposeSingle<J extends Json.Serializable>(\n\t\ttoken: AtomIO.StateToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\tunsubscribeFromStateUpdates = AtomIO.subscribe(\n\t\t\t\ttoken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nconst subscribeToTokenCreation = <T>(\n\tfamily: AtomIO.AtomFamily<T> | AtomIO.SelectorFamily<T>,\n\tkey: string,\n\thandleTokenCreation: (token: AtomIO.StateToken<T>) => void,\n): (() => void) => {\n\tconst unsubscribe =\n\t\tfamily.type === `atom_family`\n\t\t\t? family.subject.subscribe(key, handleTokenCreation)\n\t\t\t: family.subject.subscribe(key, handleTokenCreation)\n\treturn unsubscribe\n}\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeFamily = ({ socket, store }: ServerConfig) => {\n\treturn function exposeFamily<J extends Json.Serializable>(\n\t\tfamily: AtomIO.AtomFamily<J> | AtomIO.SelectorFamily<J>,\n\t\tindex: AtomIO.StateToken<Set<string>>,\n\t): () => void {\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: Json.Serializable) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(token, store),\n\t\t\t\t\t)\n\t\t\t\t})\n\n\t\t\t\tconst unsubscribeFromTokenCreation = subscribeToTokenCreation(\n\t\t\t\t\tfamily,\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst unsub = AtomIO.subscribe(\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`serve:${family.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(token.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsub)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\t\t\t\tconst unsubscribe = AtomIO.subscribe(\n\t\t\t\t\ttoken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`serve:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubSingleCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useExposeMutable = ({ socket, store }: ServerConfig) => {\n\treturn function exposeMutable<\n\t\tCore extends Transceiver<Json.Serializable>,\n\t\tSerializableCore extends Json.Serializable,\n\t>(token: AtomIO.MutableAtomToken<Core, SerializableCore>): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | null = null\n\n\t\tconst jsonToken = getJsonToken(token)\n\t\tconst trackerToken = getUpdateToken(token)\n\n\t\tconst fillUnsubRequest = () => {\n\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t\tunsubscribeFromStateUpdates = null\n\t\t}\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\tunsubscribeFromStateUpdates = AtomIO.subscribe(\n\t\t\t\ttrackerToken,\n\t\t\t\t({ newValue }) => {\n\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t},\n\t\t\t\t`expose-single:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`unsub:${token.key}`, fillUnsubRequest)\n\t\t}\n\n\t\tsocket.on(`sub:${token.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${token.key}`, fillSubRequest)\n\t\t\tunsubscribeFromStateUpdates?.()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { getJsonToken, getUpdateToken } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\nexport const useExposeMutableFamily = ({ socket, store }: ServerConfig) => {\n\treturn function exposeMutableFamily<\n\t\tFamily extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<Json.Serializable>,\n\t\t\tJson.Serializable,\n\t\t\tJson.Serializable\n\t\t>,\n\t>(family: Family, index: AtomIO.StateToken<Set<string>>): () => void {\n\t\ttype FamilyKey = Family extends AtomIO.MutableAtomFamily<\n\t\t\tTransceiver<any>,\n\t\t\tany,\n\t\t\tinfer Key\n\t\t>\n\t\t\t? Key\n\t\t\t: never\n\n\t\tconst unsubSingleCallbacksByKey = new Map<string, () => void>()\n\t\tconst unsubFamilyCallbacksByKey = new Map<string, () => void>()\n\n\t\tconst fillFamilyUnsubRequest = () => {\n\t\t\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tsocket.off(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t}\n\n\t\tconst fillSingleUnsubRequest = (key: string) => {\n\t\t\tsocket.off(`unsub:${key}`, fillSingleUnsubRequest)\n\t\t\tconst unsub = unsubSingleCallbacksByKey.get(key)\n\t\t\tif (unsub) {\n\t\t\t\tunsub()\n\t\t\t\tunsubSingleCallbacksByKey.delete(key)\n\t\t\t}\n\t\t}\n\n\t\tconst fillSubRequest = (subKey?: FamilyKey) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tkeys.forEach((key) => {\n\t\t\t\t\tconst token = family(key)\n\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t)\n\t\t\t\t\tconst unsubFromUpdates = AtomIO.subscribe(\n\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t})\n\t\t\t\tconst unsubscribeFromTokenCreation = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token) => {\n\t\t\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\t\t\tconst trackerToken = getUpdateToken(token)\n\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t`init:${family.key}`,\n\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\tAtomIO.getState(jsonToken, store),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst unsubFromUpdates = AtomIO.subscribe(\n\t\t\t\t\t\t\ttrackerToken,\n\t\t\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\t\t\tsocket.emit(\n\t\t\t\t\t\t\t\t\t`next:${token.key}`,\n\t\t\t\t\t\t\t\t\tparseJson(jsonToken.family?.subKey || `null`),\n\t\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tunsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tunsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation)\n\n\t\t\t\tsocket.on(`unsub:${family.key}`, fillFamilyUnsubRequest)\n\t\t\t} else {\n\t\t\t\tconst token = family(subKey)\n\t\t\t\tconst jsonToken = getJsonToken(token)\n\t\t\t\tconst updateToken = getUpdateToken(token)\n\t\t\t\tsocket.emit(`init:${token.key}`, AtomIO.getState(jsonToken, store))\n\t\t\t\tconst unsubscribe = AtomIO.subscribe(\n\t\t\t\t\tupdateToken,\n\t\t\t\t\t({ newValue }) => {\n\t\t\t\t\t\tsocket.emit(`next:${token.key}`, newValue)\n\t\t\t\t\t},\n\t\t\t\t\t`expose-family:${family.key}:${socket.id}`,\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tunsubSingleCallbacksByKey.set(token.key, unsubscribe)\n\t\t\t\tsocket.on(`unsub:${token.key}`, () => {\n\t\t\t\t\tfillSingleUnsubRequest(token.key)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tsocket.on(`sub:${family.key}`, fillSubRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`sub:${family.key}`, fillSubRequest)\n\t\t\tunsubFamilyCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubSingleCallbacksByKey.forEach((unsub) => unsub())\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nimport type { ServerConfig } from \".\"\n\nexport const useReceiveTransaction = ({ socket, store }: ServerConfig) => {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) =>\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n\nexport function useSyncTransaction({ socket, store }: ServerConfig) {\n\treturn function receiveTransaction<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (\n\t\t\tupdate: AtomIO.TransactionUpdate<ƒ>,\n\t\t\ttransactionId: string,\n\t\t) => {\n\t\t\tconst unsubscribe = AtomIO.subscribeToTransaction(tx, (update) => {\n\t\t\t\tunsubscribe()\n\t\t\t\tsocket.emit(`tx:sync:${transactionId}`, update)\n\t\t\t})\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t}\n\n\t\tsocket.on(`tx:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { StateToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \"..\"\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nexport const useReceiveState = ({ socket, store }: ServerConfig) => {\n\treturn function receiveState<J extends Json.Serializable>(\n\t\ttoken: StateToken<J>,\n\t): () => void {\n\t\tconst publish = (newValue: J) => setState(token, newValue, store)\n\n\t\tconst fillPubUnclaim = () => {\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t\tsocket.off(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\t\tconst fillPubClaim = () => {\n\t\t\tsocket.on(`pub:${token.key}`, publish)\n\t\t\tsocket.on(`unclaim:${token.key}`, fillPubUnclaim)\n\t\t}\n\n\t\tsocket.on(`claim:${token.key}`, fillPubClaim)\n\n\t\treturn () => {\n\t\t\tsocket.off(`claim:${token.key}`, fillPubClaim)\n\t\t\tsocket.off(`pub:${token.key}`, publish)\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,289 @@
1
+ import * as AtomIO4 from 'atom.io';
2
+ import { setState } from 'atom.io';
3
+ import { parseJson } from 'atom.io/json';
4
+ import { getJsonToken, getUpdateToken } from 'atom.io/internal';
5
+
6
+ // src/hook-composition/expose-single.ts
7
+ var useExposeSingle = ({ socket, store }) => {
8
+ return function exposeSingle(token) {
9
+ let unsubscribeFromStateUpdates = null;
10
+ const fillUnsubRequest = () => {
11
+ socket.off(`unsub:${token.key}`, fillUnsubRequest);
12
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
13
+ unsubscribeFromStateUpdates = null;
14
+ };
15
+ const fillSubRequest = () => {
16
+ socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
17
+ unsubscribeFromStateUpdates = AtomIO4.subscribe(
18
+ token,
19
+ ({ newValue }) => {
20
+ socket.emit(`serve:${token.key}`, newValue);
21
+ },
22
+ `expose-single:${socket.id}`,
23
+ store
24
+ );
25
+ socket.on(`unsub:${token.key}`, fillUnsubRequest);
26
+ };
27
+ socket.on(`sub:${token.key}`, fillSubRequest);
28
+ return () => {
29
+ socket.off(`sub:${token.key}`, fillSubRequest);
30
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
31
+ };
32
+ };
33
+ };
34
+ var subscribeToTokenCreation = (family, key, handleTokenCreation) => {
35
+ const unsubscribe = family.type === `atom_family` ? family.subject.subscribe(key, handleTokenCreation) : family.subject.subscribe(key, handleTokenCreation);
36
+ return unsubscribe;
37
+ };
38
+ var useExposeFamily = ({ socket, store }) => {
39
+ return function exposeFamily(family, index) {
40
+ const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
41
+ const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
42
+ const fillFamilyUnsubRequest = () => {
43
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
44
+ unsubFamilyCallbacksByKey.clear();
45
+ socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
46
+ };
47
+ const fillSingleUnsubRequest = (key) => {
48
+ socket.off(`unsub:${key}`, fillSingleUnsubRequest);
49
+ const unsub = unsubSingleCallbacksByKey.get(key);
50
+ if (unsub) {
51
+ unsub();
52
+ unsubSingleCallbacksByKey.delete(key);
53
+ }
54
+ };
55
+ const fillSubRequest = (subKey) => {
56
+ if (subKey === void 0) {
57
+ const keys = AtomIO4.getState(index, store);
58
+ keys.forEach((key) => {
59
+ var _a;
60
+ const token = family(key);
61
+ socket.emit(
62
+ `serve:${family.key}`,
63
+ parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
64
+ AtomIO4.getState(token, store)
65
+ );
66
+ });
67
+ const unsubscribeFromTokenCreation = subscribeToTokenCreation(
68
+ family,
69
+ `expose-family:${socket.id}`,
70
+ (token) => {
71
+ const unsub = AtomIO4.subscribe(
72
+ token,
73
+ ({ newValue }) => {
74
+ var _a;
75
+ socket.emit(
76
+ `serve:${family.key}`,
77
+ parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
78
+ newValue
79
+ );
80
+ },
81
+ `expose-family:${family.key}:${socket.id}`,
82
+ store
83
+ );
84
+ unsubFamilyCallbacksByKey.set(token.key, unsub);
85
+ }
86
+ );
87
+ unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
88
+ socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
89
+ } else {
90
+ const token = family(subKey);
91
+ socket.emit(`serve:${token.key}`, AtomIO4.getState(token, store));
92
+ const unsubscribe = AtomIO4.subscribe(
93
+ token,
94
+ ({ newValue }) => {
95
+ socket.emit(`serve:${token.key}`, newValue);
96
+ },
97
+ `expose-family:${family.key}:${socket.id}`,
98
+ store
99
+ );
100
+ unsubSingleCallbacksByKey.set(token.key, unsubscribe);
101
+ socket.on(`unsub:${token.key}`, () => {
102
+ fillSingleUnsubRequest(token.key);
103
+ });
104
+ }
105
+ };
106
+ socket.on(`sub:${family.key}`, fillSubRequest);
107
+ return () => {
108
+ socket.off(`sub:${family.key}`, fillSubRequest);
109
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
110
+ unsubSingleCallbacksByKey.forEach((unsub) => unsub());
111
+ unsubFamilyCallbacksByKey.clear();
112
+ unsubSingleCallbacksByKey.clear();
113
+ };
114
+ };
115
+ };
116
+ var useExposeMutable = ({ socket, store }) => {
117
+ return function exposeMutable(token) {
118
+ let unsubscribeFromStateUpdates = null;
119
+ const jsonToken = getJsonToken(token);
120
+ const trackerToken = getUpdateToken(token);
121
+ const fillUnsubRequest = () => {
122
+ socket.off(`unsub:${token.key}`, fillUnsubRequest);
123
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
124
+ unsubscribeFromStateUpdates = null;
125
+ };
126
+ const fillSubRequest = () => {
127
+ socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
128
+ unsubscribeFromStateUpdates = AtomIO4.subscribe(
129
+ trackerToken,
130
+ ({ newValue }) => {
131
+ socket.emit(`next:${token.key}`, newValue);
132
+ },
133
+ `expose-single:${socket.id}`,
134
+ store
135
+ );
136
+ socket.on(`unsub:${token.key}`, fillUnsubRequest);
137
+ };
138
+ socket.on(`sub:${token.key}`, fillSubRequest);
139
+ return () => {
140
+ socket.off(`sub:${token.key}`, fillSubRequest);
141
+ unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
142
+ };
143
+ };
144
+ };
145
+ var useExposeMutableFamily = ({ socket, store }) => {
146
+ return function exposeMutableFamily(family, index) {
147
+ const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
148
+ const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
149
+ const fillFamilyUnsubRequest = () => {
150
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
151
+ unsubFamilyCallbacksByKey.clear();
152
+ socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
153
+ };
154
+ const fillSingleUnsubRequest = (key) => {
155
+ socket.off(`unsub:${key}`, fillSingleUnsubRequest);
156
+ const unsub = unsubSingleCallbacksByKey.get(key);
157
+ if (unsub) {
158
+ unsub();
159
+ unsubSingleCallbacksByKey.delete(key);
160
+ }
161
+ };
162
+ const fillSubRequest = (subKey) => {
163
+ if (subKey === void 0) {
164
+ const keys = AtomIO4.getState(index, store);
165
+ keys.forEach((key) => {
166
+ var _a;
167
+ const token = family(key);
168
+ const jsonToken = getJsonToken(token);
169
+ const trackerToken = getUpdateToken(token);
170
+ socket.emit(
171
+ `init:${family.key}`,
172
+ parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
173
+ AtomIO4.getState(jsonToken, store)
174
+ );
175
+ const unsubFromUpdates = AtomIO4.subscribe(
176
+ trackerToken,
177
+ ({ newValue }) => {
178
+ var _a2;
179
+ socket.emit(
180
+ `next:${token.key}`,
181
+ parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
182
+ newValue
183
+ );
184
+ },
185
+ `expose-family:${family.key}:${socket.id}`,
186
+ store
187
+ );
188
+ unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
189
+ });
190
+ const unsubscribeFromTokenCreation = family.subject.subscribe(
191
+ `expose-family:${socket.id}`,
192
+ (token) => {
193
+ var _a;
194
+ const jsonToken = getJsonToken(token);
195
+ const trackerToken = getUpdateToken(token);
196
+ socket.emit(
197
+ `init:${family.key}`,
198
+ parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
199
+ AtomIO4.getState(jsonToken, store)
200
+ );
201
+ const unsubFromUpdates = AtomIO4.subscribe(
202
+ trackerToken,
203
+ ({ newValue }) => {
204
+ var _a2;
205
+ socket.emit(
206
+ `next:${token.key}`,
207
+ parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
208
+ newValue
209
+ );
210
+ },
211
+ `expose-family:${family.key}:${socket.id}`,
212
+ store
213
+ );
214
+ unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
215
+ }
216
+ );
217
+ unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
218
+ socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
219
+ } else {
220
+ const token = family(subKey);
221
+ const jsonToken = getJsonToken(token);
222
+ const updateToken = getUpdateToken(token);
223
+ socket.emit(`init:${token.key}`, AtomIO4.getState(jsonToken, store));
224
+ const unsubscribe = AtomIO4.subscribe(
225
+ updateToken,
226
+ ({ newValue }) => {
227
+ socket.emit(`next:${token.key}`, newValue);
228
+ },
229
+ `expose-family:${family.key}:${socket.id}`,
230
+ store
231
+ );
232
+ unsubSingleCallbacksByKey.set(token.key, unsubscribe);
233
+ socket.on(`unsub:${token.key}`, () => {
234
+ fillSingleUnsubRequest(token.key);
235
+ });
236
+ }
237
+ };
238
+ socket.on(`sub:${family.key}`, fillSubRequest);
239
+ return () => {
240
+ socket.off(`sub:${family.key}`, fillSubRequest);
241
+ unsubFamilyCallbacksByKey.forEach((unsub) => unsub());
242
+ unsubSingleCallbacksByKey.forEach((unsub) => unsub());
243
+ unsubFamilyCallbacksByKey.clear();
244
+ unsubSingleCallbacksByKey.clear();
245
+ };
246
+ };
247
+ };
248
+ var useReceiveTransaction = ({ socket, store }) => {
249
+ return function receiveTransaction(tx) {
250
+ const fillTransactionRequest = (update) => AtomIO4.runTransaction(tx, store)(...update.params);
251
+ socket.on(`tx:${tx.key}`, fillTransactionRequest);
252
+ return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
253
+ };
254
+ };
255
+ function useSyncTransaction({ socket, store }) {
256
+ return function receiveTransaction(tx) {
257
+ const fillTransactionRequest = (update, transactionId) => {
258
+ const unsubscribe = AtomIO4.subscribeToTransaction(tx, (update2) => {
259
+ unsubscribe();
260
+ socket.emit(`tx:sync:${transactionId}`, update2);
261
+ });
262
+ AtomIO4.runTransaction(tx, store)(...update.params);
263
+ };
264
+ socket.on(`tx:${tx.key}`, fillTransactionRequest);
265
+ return () => socket.off(`tx:${tx.key}`, fillTransactionRequest);
266
+ };
267
+ }
268
+ var useReceiveState = ({ socket, store }) => {
269
+ return function receiveState(token) {
270
+ const publish = (newValue) => setState(token, newValue, store);
271
+ const fillPubUnclaim = () => {
272
+ socket.off(`pub:${token.key}`, publish);
273
+ socket.off(`unclaim:${token.key}`, fillPubUnclaim);
274
+ };
275
+ const fillPubClaim = () => {
276
+ socket.on(`pub:${token.key}`, publish);
277
+ socket.on(`unclaim:${token.key}`, fillPubUnclaim);
278
+ };
279
+ socket.on(`claim:${token.key}`, fillPubClaim);
280
+ return () => {
281
+ socket.off(`claim:${token.key}`, fillPubClaim);
282
+ socket.off(`pub:${token.key}`, publish);
283
+ };
284
+ };
285
+ };
286
+
287
+ export { useExposeFamily, useExposeMutable, useExposeMutableFamily, useExposeSingle, useReceiveState, useReceiveTransaction, useSyncTransaction };
288
+ //# sourceMappingURL=out.js.map
289
+ //# sourceMappingURL=index.mjs.map