atom.io 0.17.0 → 0.18.0
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 +62 -40
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.ts +8 -2
- package/data/dist/index.js +64 -42
- package/data/dist/index.js.map +1 -1
- package/data/src/dict.ts +8 -4
- package/data/src/join.ts +74 -33
- package/data/src/struct-family.ts +18 -17
- package/dist/chunk-OEVFAUPE.js +289 -0
- package/dist/chunk-OEVFAUPE.js.map +1 -0
- package/dist/index.cjs +4 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +62 -51
- package/dist/index.js +5 -11
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +163 -64
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +94 -70
- package/internal/dist/index.js +155 -59
- package/internal/dist/index.js.map +1 -1
- package/internal/src/arbitrary.ts +3 -0
- package/internal/src/caching.ts +8 -6
- package/internal/src/families/find-in-store.ts +16 -0
- package/internal/src/get-environment-data.ts +4 -7
- package/internal/src/index.ts +6 -5
- package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
- package/internal/src/selector/create-standalone-selector.ts +0 -2
- package/internal/src/set-state/set-atom.ts +14 -18
- package/internal/src/store/store.ts +14 -2
- package/internal/src/store/withdraw.ts +72 -2
- package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
- package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
- package/internal/src/timeline/create-timeline.ts +12 -1
- package/internal/src/transaction/act-upon-store.ts +19 -0
- package/internal/src/transaction/apply-transaction.ts +7 -1
- package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
- package/internal/src/transaction/build-transaction.ts +7 -6
- package/internal/src/transaction/create-transaction.ts +1 -1
- package/internal/src/transaction/get-epoch-number.ts +40 -0
- package/internal/src/transaction/index.ts +10 -1
- package/internal/src/transaction/set-epoch-number.ts +31 -0
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.ts +3 -3
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-introspection-states.ts +6 -2
- package/introspection/src/attach-timeline-family.ts +5 -2
- package/introspection/src/attach-transaction-logs.ts +2 -2
- package/json/dist/index.d.ts +3 -1
- package/json/src/index.ts +6 -2
- package/package.json +24 -13
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +1 -1
- package/react/dist/index.js.map +1 -1
- package/react/src/use-json.ts +1 -1
- package/react-devtools/dist/index.cjs +131 -134
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.css +2 -2
- package/react-devtools/dist/index.css.map +1 -1
- package/react-devtools/dist/index.d.ts +3 -3
- package/react-devtools/dist/index.js +103 -106
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/src/StateEditor.tsx +6 -6
- package/react-devtools/src/StateIndex.tsx +2 -5
- package/react-devtools/src/TimelineIndex.tsx +3 -3
- package/react-devtools/src/TransactionIndex.tsx +9 -8
- package/react-devtools/src/Updates.tsx +1 -1
- package/react-devtools/src/index.ts +4 -4
- package/realtime/dist/index.cjs +72 -0
- package/realtime/dist/index.cjs.map +1 -0
- package/realtime/dist/index.d.ts +39 -0
- package/realtime/dist/index.js +68 -0
- package/realtime/dist/index.js.map +1 -0
- package/realtime/package.json +16 -0
- package/realtime/src/index.ts +1 -0
- package/realtime/src/realtime-continuity.ts +152 -0
- package/realtime-client/dist/index.cjs +389 -48
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +16 -9
- package/realtime-client/dist/index.js +100 -37
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +8 -5
- package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +2 -2
- package/realtime-client/src/{pull-state.ts → pull-atom.ts} +2 -2
- package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +1 -1
- package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +1 -1
- package/realtime-client/src/pull-selector-family-member.ts +42 -0
- package/realtime-client/src/pull-selector.ts +38 -0
- package/realtime-client/src/realtime-client-stores/client-main-store.ts +2 -2
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
- package/realtime-client/src/sync-continuity.ts +321 -0
- package/realtime-client/src/sync-server-action.ts +18 -20
- package/realtime-react/dist/index.cjs +330 -15
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +26 -6
- package/realtime-react/dist/index.js +43 -12
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +6 -3
- package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
- package/realtime-react/src/{use-pull-family-member.ts → use-pull-atom.ts} +6 -5
- package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
- package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
- package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
- package/realtime-react/src/{use-pull.ts → use-pull-selector.ts} +7 -5
- package/realtime-react/src/use-push.ts +3 -2
- package/realtime-react/src/use-server-action.ts +3 -2
- package/realtime-react/src/use-sync-continuity.ts +12 -0
- package/realtime-react/src/use-sync-server-action.ts +3 -2
- package/realtime-server/dist/index.cjs +568 -242
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +124 -49
- package/realtime-server/dist/index.js +555 -238
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +18 -2
- package/realtime-server/src/ipc-socket.ts +230 -0
- package/realtime-server/src/realtime-action-receiver.ts +8 -5
- package/realtime-server/src/realtime-action-synchronizer.ts +40 -28
- package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
- package/realtime-server/src/realtime-family-provider.ts +30 -71
- package/realtime-server/src/realtime-mutable-family-provider.ts +24 -86
- package/realtime-server/src/realtime-server-stores/index.ts +3 -1
- package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +90 -0
- package/realtime-server/src/realtime-server-stores/server-room-store.ts +97 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +2 -72
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
- package/realtime-server/src/realtime-state-receiver.ts +0 -1
- package/realtime-testing/dist/index.cjs +28 -28
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.js +28 -27
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +38 -28
- package/src/atom.ts +49 -31
- package/src/logger.ts +10 -5
- package/src/selector.ts +44 -25
- package/src/subscribe.ts +2 -1
- package/src/timeline.ts +4 -4
- package/src/transaction.ts +13 -17
- package/src/validators.ts +15 -9
- package/dist/chunk-H4Q5FTPZ.js +0 -11
- package/dist/chunk-H4Q5FTPZ.js.map +0 -1
- package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
|
@@ -4,7 +4,7 @@ var react = require('atom.io/react');
|
|
|
4
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 internal = require('atom.io/internal');
|
|
8
8
|
|
|
9
9
|
function _interopNamespace(e) {
|
|
10
10
|
if (e && e.__esModule) return e;
|
|
@@ -26,7 +26,6 @@ function _interopNamespace(e) {
|
|
|
26
26
|
|
|
27
27
|
var RTC__namespace = /*#__PURE__*/_interopNamespace(RTC);
|
|
28
28
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
29
|
-
var AtomIO__namespace = /*#__PURE__*/_interopNamespace(AtomIO);
|
|
30
29
|
|
|
31
30
|
// realtime-react/src/realtime-context.tsx
|
|
32
31
|
var RealtimeContext = React__namespace.createContext({
|
|
@@ -102,34 +101,57 @@ function useRealtimeService(key, create) {
|
|
|
102
101
|
});
|
|
103
102
|
}
|
|
104
103
|
|
|
105
|
-
// realtime-react/src/use-pull.ts
|
|
106
|
-
function
|
|
104
|
+
// realtime-react/src/use-pull-atom.ts
|
|
105
|
+
function usePullAtom(token) {
|
|
107
106
|
const store = React__namespace.useContext(react.StoreContext);
|
|
108
107
|
useRealtimeService(
|
|
109
108
|
`pull:${token.key}`,
|
|
110
|
-
(socket) => RTC__namespace.
|
|
109
|
+
(socket) => RTC__namespace.pullAtom(token, socket, store)
|
|
111
110
|
);
|
|
111
|
+
return react.useO(token);
|
|
112
112
|
}
|
|
113
|
-
function
|
|
113
|
+
function usePullAtomFamilyMember(family, subKey) {
|
|
114
114
|
const store = React__namespace.useContext(react.StoreContext);
|
|
115
|
+
const token = internal.findInStore(family, subKey, store);
|
|
115
116
|
useRealtimeService(
|
|
116
117
|
`pull:${token.key}`,
|
|
117
|
-
(socket) => RTC__namespace.
|
|
118
|
+
(socket) => RTC__namespace.pullAtomFamilyMember(token, socket, store)
|
|
118
119
|
);
|
|
120
|
+
return react.useO(token);
|
|
119
121
|
}
|
|
120
122
|
function usePullMutable(token) {
|
|
121
123
|
const store = React__namespace.useContext(react.StoreContext);
|
|
122
124
|
useRealtimeService(
|
|
123
125
|
`pull:${token.key}`,
|
|
124
|
-
(socket) => RTC__namespace.
|
|
126
|
+
(socket) => RTC__namespace.pullMutableAtom(token, socket, store)
|
|
125
127
|
);
|
|
128
|
+
return react.useO(token);
|
|
126
129
|
}
|
|
127
|
-
function
|
|
130
|
+
function usePullMutableAtomFamilyMember(familyToken, key) {
|
|
128
131
|
const store = React__namespace.useContext(react.StoreContext);
|
|
132
|
+
const token = internal.findInStore(familyToken, key, store);
|
|
129
133
|
useRealtimeService(
|
|
130
134
|
`pull:${token.key}`,
|
|
131
|
-
(socket) => RTC__namespace.
|
|
135
|
+
(socket) => RTC__namespace.pullMutableAtomFamilyMember(token, socket, store)
|
|
132
136
|
);
|
|
137
|
+
return react.useO(token);
|
|
138
|
+
}
|
|
139
|
+
function usePullSelector(token) {
|
|
140
|
+
const store = React__namespace.useContext(react.StoreContext);
|
|
141
|
+
useRealtimeService(
|
|
142
|
+
`pull:${token.key}`,
|
|
143
|
+
(socket) => RTC__namespace.pullSelector(token, socket, store)
|
|
144
|
+
);
|
|
145
|
+
return react.useO(token);
|
|
146
|
+
}
|
|
147
|
+
function usePullSelectorFamilyMember(familyToken, key) {
|
|
148
|
+
const store = React__namespace.useContext(react.StoreContext);
|
|
149
|
+
const token = internal.findInStore(familyToken, key, store);
|
|
150
|
+
useRealtimeService(
|
|
151
|
+
`pull:${token.key}`,
|
|
152
|
+
(socket) => RTC__namespace.pullSelectorFamilyMember(token, socket, store)
|
|
153
|
+
);
|
|
154
|
+
return react.useO(token);
|
|
133
155
|
}
|
|
134
156
|
function usePush(token) {
|
|
135
157
|
const store = React__namespace.useContext(react.StoreContext);
|
|
@@ -137,6 +159,7 @@ function usePush(token) {
|
|
|
137
159
|
`push:${token.key}`,
|
|
138
160
|
(socket) => RTC__namespace.pushState(token, socket, store)
|
|
139
161
|
);
|
|
162
|
+
return react.useI(token);
|
|
140
163
|
}
|
|
141
164
|
function useServerAction(token) {
|
|
142
165
|
const store = React__namespace.useContext(react.StoreContext);
|
|
@@ -144,14 +167,303 @@ function useServerAction(token) {
|
|
|
144
167
|
`tx:${token.key}`,
|
|
145
168
|
(socket) => RTC__namespace.serverAction(token, socket, store)
|
|
146
169
|
);
|
|
147
|
-
return
|
|
170
|
+
return internal.actUponStore(token, internal.arbitrary(), store);
|
|
171
|
+
}
|
|
172
|
+
function syncContinuity(continuity, socket, store) {
|
|
173
|
+
const continuityKey = continuity.key;
|
|
174
|
+
const optimisticUpdates = internal.getFromStore(RTC.optimisticUpdateQueue, store);
|
|
175
|
+
const confirmedUpdates = internal.getFromStore(RTC.confirmedUpdateQueue, store);
|
|
176
|
+
const initializeContinuity = (epoch, payload) => {
|
|
177
|
+
let i = 0;
|
|
178
|
+
let k = ``;
|
|
179
|
+
let v = null;
|
|
180
|
+
for (const x of payload) {
|
|
181
|
+
if (i % 2 === 0) {
|
|
182
|
+
k = x;
|
|
183
|
+
} else {
|
|
184
|
+
v = x;
|
|
185
|
+
internal.setIntoStore(k, v, store);
|
|
186
|
+
}
|
|
187
|
+
i++;
|
|
188
|
+
}
|
|
189
|
+
internal.setEpochNumberOfContinuity(continuityKey, epoch, store);
|
|
190
|
+
};
|
|
191
|
+
socket.off(`continuity-init:${continuityKey}`);
|
|
192
|
+
socket.on(`continuity-init:${continuityKey}`, initializeContinuity);
|
|
193
|
+
const registerAndAttemptConfirmedUpdate = (confirmedUpdate) => {
|
|
194
|
+
function reconcileEpoch(optimisticUpdate, confirmedUpdate2) {
|
|
195
|
+
store.logger.info(`\u2696\uFE0F`, `continuity`, continuityKey, `reconciling updates`);
|
|
196
|
+
internal.setIntoStore(
|
|
197
|
+
RTC.optimisticUpdateQueue,
|
|
198
|
+
(queue) => {
|
|
199
|
+
queue.shift();
|
|
200
|
+
return queue;
|
|
201
|
+
},
|
|
202
|
+
store
|
|
203
|
+
);
|
|
204
|
+
if (optimisticUpdate.id === confirmedUpdate2.id) {
|
|
205
|
+
const clientResult = JSON.stringify(optimisticUpdate.updates);
|
|
206
|
+
const serverResult = JSON.stringify(confirmedUpdate2.updates);
|
|
207
|
+
if (clientResult === serverResult) {
|
|
208
|
+
store.logger.info(
|
|
209
|
+
`\u2705`,
|
|
210
|
+
`continuity`,
|
|
211
|
+
continuityKey,
|
|
212
|
+
`results for ${optimisticUpdate.id} match between client and server`
|
|
213
|
+
);
|
|
214
|
+
socket.emit(`ack:${continuityKey}`, confirmedUpdate2.epoch);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
} else {
|
|
218
|
+
store.logger.info(
|
|
219
|
+
`\u274C`,
|
|
220
|
+
`continuity`,
|
|
221
|
+
continuityKey,
|
|
222
|
+
`thought update #${confirmedUpdate2.epoch} was ${optimisticUpdate.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate2.key}:${confirmedUpdate2.id}`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
const reversedOptimisticUpdates = optimisticUpdates.toReversed();
|
|
226
|
+
for (const subsequentOptimistic of reversedOptimisticUpdates) {
|
|
227
|
+
internal.ingestTransactionUpdate(`oldValue`, subsequentOptimistic, store);
|
|
228
|
+
}
|
|
229
|
+
store.logger.info(
|
|
230
|
+
`\u23EA`,
|
|
231
|
+
`continuity`,
|
|
232
|
+
continuityKey,
|
|
233
|
+
`undid optimistic updates:`,
|
|
234
|
+
reversedOptimisticUpdates
|
|
235
|
+
);
|
|
236
|
+
internal.ingestTransactionUpdate(`oldValue`, optimisticUpdate, store);
|
|
237
|
+
store.logger.info(
|
|
238
|
+
`\u23EA`,
|
|
239
|
+
`continuity`,
|
|
240
|
+
continuityKey,
|
|
241
|
+
`undid zeroth optimistic update`,
|
|
242
|
+
optimisticUpdate
|
|
243
|
+
);
|
|
244
|
+
internal.ingestTransactionUpdate(`newValue`, confirmedUpdate2, store);
|
|
245
|
+
store.logger.info(
|
|
246
|
+
`\u23E9`,
|
|
247
|
+
`continuity`,
|
|
248
|
+
continuityKey,
|
|
249
|
+
`applied confirmed update`,
|
|
250
|
+
confirmedUpdate2
|
|
251
|
+
);
|
|
252
|
+
socket.emit(`ack:${continuityKey}`, confirmedUpdate2.epoch);
|
|
253
|
+
for (const subsequentOptimistic of optimisticUpdates) {
|
|
254
|
+
const token = {
|
|
255
|
+
type: `transaction`,
|
|
256
|
+
key: subsequentOptimistic.key
|
|
257
|
+
};
|
|
258
|
+
const { id, params } = subsequentOptimistic;
|
|
259
|
+
internal.actUponStore(token, id, store)(...params);
|
|
260
|
+
}
|
|
261
|
+
store.logger.info(
|
|
262
|
+
`\u23E9`,
|
|
263
|
+
`continuity`,
|
|
264
|
+
continuityKey,
|
|
265
|
+
`reapplied subsequent optimistic updates:`,
|
|
266
|
+
optimisticUpdates
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
store.logger.info(
|
|
270
|
+
`\u2696\uFE0F`,
|
|
271
|
+
`continuity`,
|
|
272
|
+
continuityKey,
|
|
273
|
+
`integrating confirmed update`,
|
|
274
|
+
{ confirmedUpdate, confirmedUpdates, optimisticUpdates }
|
|
275
|
+
);
|
|
276
|
+
const zerothOptimisticUpdate = optimisticUpdates[0];
|
|
277
|
+
if (zerothOptimisticUpdate) {
|
|
278
|
+
store.logger.info(
|
|
279
|
+
`\u2696\uFE0F`,
|
|
280
|
+
`continuity`,
|
|
281
|
+
continuityKey,
|
|
282
|
+
`has optimistic updates to reconcile`
|
|
283
|
+
);
|
|
284
|
+
if (confirmedUpdate.epoch === zerothOptimisticUpdate.epoch) {
|
|
285
|
+
store.logger.info(
|
|
286
|
+
`\u2696\uFE0F`,
|
|
287
|
+
`continuity`,
|
|
288
|
+
continuityKey,
|
|
289
|
+
`epoch of confirmed update #${confirmedUpdate.epoch} matches zeroth optimistic update`
|
|
290
|
+
);
|
|
291
|
+
reconcileEpoch(zerothOptimisticUpdate, confirmedUpdate);
|
|
292
|
+
for (const nextConfirmed of confirmedUpdates) {
|
|
293
|
+
const nextOptimistic = optimisticUpdates[0];
|
|
294
|
+
if (nextConfirmed.epoch === (nextOptimistic == null ? void 0 : nextOptimistic.epoch)) {
|
|
295
|
+
reconcileEpoch(nextOptimistic, nextConfirmed);
|
|
296
|
+
} else {
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
} else {
|
|
301
|
+
store.logger.info(
|
|
302
|
+
`\u2696\uFE0F`,
|
|
303
|
+
`continuity`,
|
|
304
|
+
continuityKey,
|
|
305
|
+
`epoch of confirmed update #${confirmedUpdate.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`
|
|
306
|
+
);
|
|
307
|
+
const confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(
|
|
308
|
+
(update) => update.epoch === confirmedUpdate.epoch
|
|
309
|
+
);
|
|
310
|
+
if (!confirmedUpdateIsAlreadyEnqueued) {
|
|
311
|
+
store.logger.info(
|
|
312
|
+
`\u{1F448}`,
|
|
313
|
+
`continuity`,
|
|
314
|
+
continuityKey,
|
|
315
|
+
`pushing confirmed update to queue`,
|
|
316
|
+
confirmedUpdate
|
|
317
|
+
);
|
|
318
|
+
internal.setIntoStore(
|
|
319
|
+
RTC.confirmedUpdateQueue,
|
|
320
|
+
(queue) => {
|
|
321
|
+
queue.push(confirmedUpdate);
|
|
322
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
323
|
+
return queue;
|
|
324
|
+
},
|
|
325
|
+
store
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
} else {
|
|
330
|
+
store.logger.info(
|
|
331
|
+
`\u2696\uFE0F`,
|
|
332
|
+
`continuity`,
|
|
333
|
+
continuityKey,
|
|
334
|
+
`has no optimistic updates to deal with`
|
|
335
|
+
);
|
|
336
|
+
const continuityEpoch = internal.getEpochNumberOfContinuity(continuityKey, store);
|
|
337
|
+
const isRoot = internal.isRootStore(store);
|
|
338
|
+
if (isRoot && continuityEpoch === confirmedUpdate.epoch - 1) {
|
|
339
|
+
store.logger.info(
|
|
340
|
+
`\u2705`,
|
|
341
|
+
`continuity`,
|
|
342
|
+
continuityKey,
|
|
343
|
+
`integrating update #${confirmedUpdate.epoch} (${confirmedUpdate.key} ${confirmedUpdate.id})`
|
|
344
|
+
);
|
|
345
|
+
internal.ingestTransactionUpdate(`newValue`, confirmedUpdate, store);
|
|
346
|
+
socket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch);
|
|
347
|
+
internal.setEpochNumberOfContinuity(continuityKey, confirmedUpdate.epoch, store);
|
|
348
|
+
} else if (isRoot && continuityEpoch !== void 0) {
|
|
349
|
+
store.logger.info(
|
|
350
|
+
`\u2696\uFE0F`,
|
|
351
|
+
`continuity`,
|
|
352
|
+
continuityKey,
|
|
353
|
+
`received update #${confirmedUpdate.epoch} but still waiting for update #${continuityEpoch + 1}`,
|
|
354
|
+
{
|
|
355
|
+
clientEpoch: continuityEpoch,
|
|
356
|
+
serverEpoch: confirmedUpdate.epoch
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
const confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(
|
|
360
|
+
(update) => update.epoch === confirmedUpdate.epoch
|
|
361
|
+
);
|
|
362
|
+
if (confirmedUpdateIsAlreadyEnqueued) {
|
|
363
|
+
store.logger.info(
|
|
364
|
+
`\u{1F44D}`,
|
|
365
|
+
`continuity`,
|
|
366
|
+
continuityKey,
|
|
367
|
+
`confirmed update #${confirmedUpdate.epoch} is already enqueued`
|
|
368
|
+
);
|
|
369
|
+
} else {
|
|
370
|
+
store.logger.info(
|
|
371
|
+
`\u{1F448}`,
|
|
372
|
+
`continuity`,
|
|
373
|
+
continuityKey,
|
|
374
|
+
`pushing confirmed update #${confirmedUpdate.epoch} to queue`
|
|
375
|
+
);
|
|
376
|
+
internal.setIntoStore(
|
|
377
|
+
RTC.confirmedUpdateQueue,
|
|
378
|
+
(queue) => {
|
|
379
|
+
queue.push(confirmedUpdate);
|
|
380
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
381
|
+
return queue;
|
|
382
|
+
},
|
|
383
|
+
store
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
socket.off(`tx-new:${continuityKey}`);
|
|
390
|
+
socket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate);
|
|
391
|
+
const unsubscribeFunctions = continuity.actions.map((transaction) => {
|
|
392
|
+
internal.assignTransactionToContinuity(continuityKey, transaction.key, store);
|
|
393
|
+
const unsubscribeFromTransactionUpdates = internal.subscribeToTransaction(
|
|
394
|
+
transaction,
|
|
395
|
+
(clientUpdate) => {
|
|
396
|
+
store.logger.info(
|
|
397
|
+
`\u{1F91E}`,
|
|
398
|
+
`continuity`,
|
|
399
|
+
continuityKey,
|
|
400
|
+
`enqueuing optimistic update`
|
|
401
|
+
);
|
|
402
|
+
const optimisticUpdateIndex = optimisticUpdates.findIndex(
|
|
403
|
+
(update) => update.id === clientUpdate.id
|
|
404
|
+
);
|
|
405
|
+
if (optimisticUpdateIndex === -1) {
|
|
406
|
+
store.logger.info(
|
|
407
|
+
`\u{1F91E}`,
|
|
408
|
+
`continuity`,
|
|
409
|
+
continuityKey,
|
|
410
|
+
`enqueuing new optimistic update`
|
|
411
|
+
);
|
|
412
|
+
internal.setIntoStore(
|
|
413
|
+
RTC.optimisticUpdateQueue,
|
|
414
|
+
(queue) => {
|
|
415
|
+
queue.push(clientUpdate);
|
|
416
|
+
queue.sort((a, b) => a.epoch - b.epoch);
|
|
417
|
+
return queue;
|
|
418
|
+
},
|
|
419
|
+
store
|
|
420
|
+
);
|
|
421
|
+
} else {
|
|
422
|
+
store.logger.info(
|
|
423
|
+
`\u{1F91E}`,
|
|
424
|
+
`continuity`,
|
|
425
|
+
continuityKey,
|
|
426
|
+
`replacing existing optimistic update at index ${optimisticUpdateIndex}`
|
|
427
|
+
);
|
|
428
|
+
internal.setIntoStore(
|
|
429
|
+
RTC.optimisticUpdateQueue,
|
|
430
|
+
(queue) => {
|
|
431
|
+
queue[optimisticUpdateIndex] = clientUpdate;
|
|
432
|
+
return queue;
|
|
433
|
+
},
|
|
434
|
+
store
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
socket.emit(`tx-run:${continuityKey}`, clientUpdate);
|
|
438
|
+
},
|
|
439
|
+
`tx-run:${continuityKey}`,
|
|
440
|
+
store
|
|
441
|
+
);
|
|
442
|
+
return unsubscribeFromTransactionUpdates;
|
|
443
|
+
});
|
|
444
|
+
socket.emit(`get:${continuityKey}`);
|
|
445
|
+
return () => {
|
|
446
|
+
socket.off(`continuity-init:${continuityKey}`);
|
|
447
|
+
socket.off(`tx-new:${continuityKey}`);
|
|
448
|
+
for (const unsubscribe of unsubscribeFunctions)
|
|
449
|
+
unsubscribe();
|
|
450
|
+
socket.emit(`unsub:${continuityKey}`);
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// realtime-react/src/use-sync-continuity.ts
|
|
455
|
+
function useSyncContinuity(token) {
|
|
456
|
+
const store = React__namespace.useContext(react.StoreContext);
|
|
457
|
+
useRealtimeService(`tx-sync:${token.key}`, (socket) => {
|
|
458
|
+
return syncContinuity(token, socket, store);
|
|
459
|
+
});
|
|
148
460
|
}
|
|
149
461
|
function useSyncAction(token) {
|
|
150
462
|
const store = React__namespace.useContext(react.StoreContext);
|
|
151
463
|
useRealtimeService(`tx-sync:${token.key}`, (socket) => {
|
|
152
464
|
return RTC__namespace.syncAction(token, socket, store);
|
|
153
465
|
});
|
|
154
|
-
return
|
|
466
|
+
return internal.actUponStore(token, internal.arbitrary(), store);
|
|
155
467
|
}
|
|
156
468
|
function useSync(token) {
|
|
157
469
|
const store = React__namespace.useContext(react.StoreContext);
|
|
@@ -164,13 +476,16 @@ function useSync(token) {
|
|
|
164
476
|
|
|
165
477
|
exports.RealtimeContext = RealtimeContext;
|
|
166
478
|
exports.RealtimeProvider = RealtimeProvider;
|
|
167
|
-
exports.
|
|
168
|
-
exports.
|
|
479
|
+
exports.usePullAtom = usePullAtom;
|
|
480
|
+
exports.usePullAtomFamilyMember = usePullAtomFamilyMember;
|
|
169
481
|
exports.usePullMutable = usePullMutable;
|
|
170
|
-
exports.
|
|
482
|
+
exports.usePullMutableAtomFamilyMember = usePullMutableAtomFamilyMember;
|
|
483
|
+
exports.usePullSelector = usePullSelector;
|
|
484
|
+
exports.usePullSelectorFamilyMember = usePullSelectorFamilyMember;
|
|
171
485
|
exports.usePush = usePush;
|
|
172
486
|
exports.useServerAction = useServerAction;
|
|
173
487
|
exports.useSync = useSync;
|
|
174
488
|
exports.useSyncAction = useSyncAction;
|
|
489
|
+
exports.useSyncContinuity = useSyncContinuity;
|
|
175
490
|
//# sourceMappingURL=out.js.map
|
|
176
491
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"sources":["../src/realtime-context.tsx","../src/use-pull-atom.ts","../src/use-realtime-service.ts","../src/use-single-effect.ts","../src/on-mount.ts","../src/use-pull-atom-family-member.ts","../src/use-pull-mutable-atom.ts","../src/use-pull-mutable-family-member.ts","../src/use-pull-selector.ts","../src/use-pull-selector-family-member.ts","../src/use-push.ts","../src/use-server-action.ts","../src/use-sync-continuity.ts","../../realtime-client/src/sync-continuity.ts","../src/use-sync-server-action.ts","../src/use-sync.ts"],"names":["RTC","React","StoreContext","useO","findInStore","useI","actUponStore","confirmedUpdate","arbitrary"],"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, 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 usePullAtom<J extends Json.Serializable>(\n\ttoken: AtomIO.RegularAtomToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtom(token, socket, store),\n\t)\n\treturn useO(token)\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 { findInStore } from \"atom.io/internal\"\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 usePullAtomFamilyMember<\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(family, subKey, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\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, 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 usePullMutable<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(token: AtomIO.MutableAtomToken<T, J>): T {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtom(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { findInStore } from \"atom.io/internal\"\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 usePullMutableAtomFamilyMember<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullMutableAtomFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\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 usePullSelector<J extends Json.Serializable>(\n\ttoken: AtomIO.SelectorToken<J>,\n): J {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelector(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\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 usePullSelectorFamilyMember<\n\tT,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T {\n\tconst store = React.useContext(StoreContext)\n\tconst token = findInStore(familyToken, key, store)\n\tuseRealtimeService(`pull:${token.key}`, (socket) =>\n\t\tRTC.pullSelectorFamilyMember(token, socket, store),\n\t)\n\treturn useO(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext, useI } 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): <New extends J>(next: New | ((old: J) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`push:${token.key}`, (socket) =>\n\t\tRTC.pushState(token, socket, store),\n\t)\n\treturn useI(token)\n}\n","import type * as AtomIO from \"atom.io\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\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 actUponStore(token, arbitrary(), store)\n}\n","import { StoreContext } from \"atom.io/react\"\nimport * as React from \"react\"\nimport { syncContinuity } from \"../../realtime-client/src/sync-continuity\"\nimport type { ContinuityToken } from \"../../realtime/src/realtime-continuity\"\nimport { useRealtimeService } from \"./use-realtime-service\"\n\nexport function useSyncContinuity(token: ContinuityToken): void {\n\tconst store = React.useContext(StoreContext)\n\tuseRealtimeService(`tx-sync:${token.key}`, (socket) => {\n\t\treturn syncContinuity(token, socket, store)\n\t})\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tassignTransactionToContinuity,\n\tgetEpochNumberOfContinuity,\n\tgetFromStore,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function syncContinuity<ƒ extends AtomIO.ƒn>(\n\tcontinuity: ContinuityToken,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(optimisticUpdateQueue, store)\n\tconst confirmedUpdates = getFromStore(confirmedUpdateQueue, store)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(continuityKey, epoch, store)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = (\n\t\tconfirmedUpdate: AtomIO.TransactionUpdate<ƒ>,\n\t) => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\n\t\t): void {\n\t\t\tstore.logger.info(`⚖️`, `continuity`, continuityKey, `reconciling updates`)\n\t\t\tsetIntoStore(\n\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t(queue) => {\n\t\t\t\t\tqueue.shift()\n\t\t\t\t\treturn queue\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(token, id, store)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmedUpdate.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmedUpdate)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmedUpdate,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tconst continuityEpoch = getEpochNumberOfContinuity(continuityKey, store)\n\t\t\tconst isRoot = isRootStore(store)\n\n\t\t\tif (isRoot && continuityEpoch === confirmedUpdate.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmedUpdate.epoch} (${confirmedUpdate.key} ${confirmedUpdate.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(continuityKey, confirmedUpdate.epoch, store)\n\t\t\t} else if (isRoot && continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${\n\t\t\t\t\t\tconfirmedUpdate.epoch\n\t\t\t\t\t} but still waiting for update #${continuityEpoch + 1}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmedUpdate.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmedUpdate.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmedUpdate.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(continuityKey, transaction.key, store)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\ttransaction,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, clientUpdate)\n\t\t\t},\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\tstore,\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\tsocket.emit(`unsub:${continuityKey}`)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport { actUponStore, arbitrary } from \"atom.io/internal\"\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 actUponStore(token, arbitrary(), 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,6 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { Socket } from 'socket.io-client';
|
|
3
3
|
import * as AtomIO from 'atom.io';
|
|
4
|
+
import { AtomToken, TransactionToken, AtomFamilyToken, ReadableFamilyToken, ReadableToken } from 'atom.io';
|
|
4
5
|
import { Json } from 'atom.io/json';
|
|
5
6
|
import { Transceiver } from 'atom.io/internal';
|
|
6
7
|
|
|
@@ -17,20 +18,39 @@ declare const RealtimeProvider: React.FC<{
|
|
|
17
18
|
socket: Socket | null;
|
|
18
19
|
}>;
|
|
19
20
|
|
|
20
|
-
declare function
|
|
21
|
+
declare function usePullAtom<J extends Json.Serializable>(token: AtomIO.RegularAtomToken<J>): J;
|
|
21
22
|
|
|
22
|
-
declare function
|
|
23
|
+
declare function usePullAtomFamilyMember<J extends Json.Serializable, K extends Json.Serializable, Key extends K>(family: AtomIO.RegularAtomFamilyToken<J, K>, subKey: Key): J;
|
|
23
24
|
|
|
24
|
-
declare function usePullMutable<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>):
|
|
25
|
+
declare function usePullMutable<T extends Transceiver<any>, J extends Json.Serializable>(token: AtomIO.MutableAtomToken<T, J>): T;
|
|
25
26
|
|
|
26
|
-
declare function
|
|
27
|
+
declare function usePullMutableAtomFamilyMember<T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable, Key extends K>(familyToken: AtomIO.MutableAtomFamilyToken<T, J, K>, key: Key): T;
|
|
27
28
|
|
|
28
|
-
declare function
|
|
29
|
+
declare function usePullSelector<J extends Json.Serializable>(token: AtomIO.SelectorToken<J>): J;
|
|
30
|
+
|
|
31
|
+
declare function usePullSelectorFamilyMember<T, K extends Json.Serializable, Key extends K>(familyToken: AtomIO.SelectorFamilyToken<T, K>, key: Key): T;
|
|
32
|
+
|
|
33
|
+
declare function usePush<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): <New extends J>(next: New | ((old: J) => New)) => void;
|
|
29
34
|
|
|
30
35
|
declare function useServerAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
|
|
31
36
|
|
|
37
|
+
type PerspectiveToken<F extends AtomFamilyToken<any>, T extends F extends AtomFamilyToken<infer T, any> ? T : never> = {
|
|
38
|
+
type: `realtime_perspective`;
|
|
39
|
+
resourceAtoms: F;
|
|
40
|
+
perspectiveAtoms: ReadableFamilyToken<Iterable<ReadableToken<T>>, string>;
|
|
41
|
+
};
|
|
42
|
+
type ContinuityToken = {
|
|
43
|
+
readonly type: `continuity`;
|
|
44
|
+
readonly key: string;
|
|
45
|
+
readonly globals: AtomToken<any>[];
|
|
46
|
+
readonly actions: TransactionToken<any>[];
|
|
47
|
+
readonly perspectives: PerspectiveToken<AtomFamilyToken<any, Json.Serializable>, Json.Serializable>[];
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
declare function useSyncContinuity(token: ContinuityToken): void;
|
|
51
|
+
|
|
32
52
|
declare function useSyncAction<ƒ extends AtomIO.ƒn>(token: AtomIO.TransactionToken<ƒ>): (...parameters: Parameters<ƒ>) => ReturnType<ƒ>;
|
|
33
53
|
|
|
34
54
|
declare function useSync<J extends Json.Serializable>(token: AtomIO.WritableToken<J>): J;
|
|
35
55
|
|
|
36
|
-
export { RealtimeContext, RealtimeProvider, type RealtimeReactStore,
|
|
56
|
+
export { RealtimeContext, RealtimeProvider, type RealtimeReactStore, usePullAtom, usePullAtomFamilyMember, usePullMutable, usePullMutableAtomFamilyMember, usePullSelector, usePullSelectorFamilyMember, usePush, useServerAction, useSync, useSyncAction, useSyncContinuity };
|