atom.io 0.8.1 → 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.
- package/package.json +11 -8
- package/react-devtools/dist/index.js +3 -3
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/dist/index.mjs +3 -3
- package/react-devtools/dist/index.mjs.map +1 -1
- package/realtime-client/dist/index.d.mts +21 -0
- package/realtime-client/dist/index.d.ts +21 -0
- package/realtime-client/dist/index.js +173 -0
- package/realtime-client/dist/index.js.map +1 -0
- package/realtime-client/dist/index.mjs +144 -0
- package/realtime-client/dist/index.mjs.map +1 -0
- package/realtime-client/package.json +15 -0
- package/realtime-client/src/index.ts +7 -0
- package/realtime-client/src/realtime-state.ts +10 -0
- package/realtime-client/src/use-pull-family-member.ts +26 -0
- package/realtime-client/src/use-pull-mutable-family-member.ts +38 -0
- package/realtime-client/src/use-pull-mutable.ts +32 -0
- package/realtime-client/src/use-pull.ts +19 -0
- package/realtime-client/src/use-push.ts +25 -0
- package/realtime-client/src/use-server-action.ts +49 -0
- package/realtime-server/dist/index.d.mts +25 -0
- package/realtime-server/dist/index.d.ts +25 -0
- package/realtime-server/dist/index.js +316 -0
- package/realtime-server/dist/index.js.map +1 -0
- package/realtime-server/dist/index.mjs +289 -0
- package/realtime-server/dist/index.mjs.map +1 -0
- package/realtime-server/package.json +15 -0
- package/realtime-server/src/README.md +33 -0
- package/realtime-server/src/hook-composition/expose-family.ts +105 -0
- package/realtime-server/src/hook-composition/expose-mutable-family.ts +127 -0
- package/realtime-server/src/hook-composition/expose-mutable.ts +45 -0
- package/realtime-server/src/hook-composition/expose-single.ts +39 -0
- package/realtime-server/src/hook-composition/index.ts +14 -0
- package/realtime-server/src/hook-composition/receive-state.ts +30 -0
- package/realtime-server/src/hook-composition/receive-transaction.ts +37 -0
- package/realtime-server/src/index.ts +1 -0
|
@@ -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
|