atom.io 0.16.1 → 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +31 -14
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.js +31 -14
- package/data/dist/index.js.map +1 -1
- package/data/src/join.ts +31 -14
- package/dist/chunk-H4Q5FTPZ.js +11 -0
- package/dist/chunk-H4Q5FTPZ.js.map +1 -0
- package/dist/index.cjs +7 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +8 -14
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +240 -193
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +30 -9
- package/internal/dist/index.js +233 -194
- package/internal/dist/index.js.map +1 -1
- package/internal/src/families/find-in-store.ts +74 -0
- package/internal/src/families/index.ts +1 -0
- package/internal/src/ingest-updates/ingest-transaction-update.ts +1 -0
- package/internal/src/mutable/tracker.ts +37 -32
- package/internal/src/mutable/transceiver.ts +1 -1
- package/internal/src/not-found-error.ts +14 -3
- package/internal/src/operation.ts +2 -1
- package/internal/src/selector/create-writable-selector.ts +2 -1
- package/internal/src/selector/register-selector.ts +5 -4
- package/internal/src/set-state/set-atom.ts +23 -6
- package/internal/src/set-state/stow-update.ts +2 -4
- package/internal/src/store/store.ts +13 -4
- package/internal/src/timeline/add-atom-to-timeline.ts +5 -5
- package/internal/src/transaction/abort-transaction.ts +2 -1
- package/internal/src/transaction/apply-transaction.ts +5 -3
- package/internal/src/transaction/build-transaction.ts +17 -10
- package/internal/src/transaction/create-transaction.ts +2 -3
- package/internal/src/transaction/index.ts +3 -2
- package/internal/src/transaction/is-root-store.ts +23 -0
- package/package.json +10 -10
- package/react/dist/index.cjs +27 -21
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +8 -2
- package/react/dist/index.js +27 -21
- package/react/dist/index.js.map +1 -1
- package/react/src/index.ts +4 -1
- package/react/src/use-i.ts +36 -0
- package/react/src/use-json.ts +38 -0
- package/react/src/use-o.ts +34 -0
- package/react/src/use-tl.ts +45 -0
- package/realtime-client/dist/index.cjs +163 -62
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +10 -6
- package/realtime-client/dist/index.js +153 -60
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +2 -1
- package/realtime-client/src/pull-state.ts +4 -3
- package/realtime-client/src/{realtime-client-store.ts → realtime-client-stores/client-main-store.ts} +0 -8
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +15 -0
- package/realtime-client/src/realtime-client-stores/index.ts +2 -0
- package/realtime-client/src/sync-server-action.ts +131 -39
- package/realtime-client/src/sync-state.ts +19 -0
- package/realtime-react/dist/index.cjs +43 -26
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +3 -1
- package/realtime-react/dist/index.js +41 -25
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +1 -0
- package/realtime-react/src/on-mount.ts +3 -21
- package/realtime-react/src/use-realtime-service.ts +1 -1
- package/realtime-react/src/use-server-action.ts +1 -1
- package/realtime-react/src/use-single-effect.ts +29 -0
- package/realtime-react/src/use-sync-server-action.ts +5 -8
- package/realtime-react/src/use-sync.ts +17 -0
- package/realtime-server/dist/index.cjs +242 -48
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +147 -9
- package/realtime-server/dist/index.js +232 -51
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +2 -0
- package/realtime-server/src/realtime-action-receiver.ts +4 -3
- package/realtime-server/src/realtime-action-synchronizer.ts +100 -13
- package/realtime-server/src/realtime-family-provider.ts +10 -6
- package/realtime-server/src/realtime-mutable-family-provider.ts +15 -18
- package/realtime-server/src/realtime-mutable-provider.ts +1 -0
- package/realtime-server/src/realtime-server-stores/index.ts +2 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +115 -0
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +45 -0
- package/realtime-server/src/realtime-state-provider.ts +16 -8
- package/realtime-server/src/realtime-state-receiver.ts +1 -0
- package/realtime-server/src/realtime-state-synchronizer.ts +23 -0
- package/realtime-testing/dist/index.cjs +65 -26
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.ts +11 -7
- package/realtime-testing/dist/index.js +64 -26
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +83 -43
- package/src/find-state.ts +8 -16
- package/src/logger.ts +16 -11
- package/src/transaction.ts +4 -4
- package/react/src/store-hooks.ts +0 -87
- package/realtime-server/src/realtime-server-store.ts +0 -39
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var AtomIO7 = require('atom.io');
|
|
4
|
+
var data = require('atom.io/data');
|
|
5
|
+
var setRtx = require('atom.io/transceivers/set-rtx');
|
|
4
6
|
var internal = require('atom.io/internal');
|
|
5
7
|
var json = require('atom.io/json');
|
|
6
8
|
|
|
@@ -43,17 +45,119 @@ var __spreadValues = (a, b) => {
|
|
|
43
45
|
return a;
|
|
44
46
|
};
|
|
45
47
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
48
|
+
var userIndex = AtomIO7.atom({
|
|
49
|
+
key: `usersIndex`,
|
|
50
|
+
mutable: true,
|
|
51
|
+
default: () => new setRtx.SetRTX(),
|
|
52
|
+
toJson: (set) => set.toJSON(),
|
|
53
|
+
fromJson: (json) => setRtx.SetRTX.fromJSON(json)
|
|
54
|
+
});
|
|
55
|
+
var usersOfSockets = data.join({
|
|
56
|
+
key: `usersOfSockets`,
|
|
57
|
+
between: [`user`, `socket`],
|
|
58
|
+
cardinality: `1:1`
|
|
59
|
+
});
|
|
60
|
+
var roomIndex = AtomIO7.atom({
|
|
61
|
+
key: `conclaveIndex`,
|
|
62
|
+
default: () => new setRtx.SetRTX(),
|
|
63
|
+
mutable: true,
|
|
64
|
+
toJson: (set) => set.toJSON(),
|
|
65
|
+
fromJson: (json) => setRtx.SetRTX.fromJSON(json)
|
|
66
|
+
});
|
|
67
|
+
var DEFAULT_USER_IN_ROOM_META = {
|
|
68
|
+
enteredAtEpoch: 0
|
|
69
|
+
};
|
|
70
|
+
var usersInRooms = data.join(
|
|
71
|
+
{
|
|
72
|
+
key: `usersInRooms`,
|
|
73
|
+
between: [`room`, `user`],
|
|
74
|
+
cardinality: `1:n`
|
|
75
|
+
},
|
|
76
|
+
DEFAULT_USER_IN_ROOM_META
|
|
77
|
+
);
|
|
78
|
+
var completeUpdateAtoms = AtomIO7.atomFamily({
|
|
79
|
+
key: `completeUpdate`,
|
|
80
|
+
default: null
|
|
81
|
+
});
|
|
82
|
+
var transactionRedactorAtoms = AtomIO7.atomFamily({
|
|
83
|
+
key: `transactionRedactor`,
|
|
84
|
+
default: { filter: (updates) => updates }
|
|
85
|
+
});
|
|
86
|
+
var redactedUpdateSelectors = AtomIO7.selectorFamily({
|
|
87
|
+
key: `redactedUpdate`,
|
|
88
|
+
get: ([transactionKey, updateId]) => ({ get, find }) => {
|
|
89
|
+
const update = get(find(completeUpdateAtoms, updateId));
|
|
90
|
+
const { filter } = get(find(transactionRedactorAtoms, transactionKey));
|
|
91
|
+
if (update && filter) {
|
|
92
|
+
return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
var userUnacknowledgedUpdatesAtoms = AtomIO7.atomFamily({
|
|
98
|
+
key: `unacknowledgedUpdates`,
|
|
99
|
+
default: () => []
|
|
100
|
+
});
|
|
101
|
+
var socketUnacknowledgedUpdatesSelectors = AtomIO7.selectorFamily({
|
|
102
|
+
key: `socketUnacknowledgedUpdates`,
|
|
103
|
+
get: (socketId) => ({ get, find }) => {
|
|
104
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
|
|
105
|
+
const userKey = get(userKeyState);
|
|
106
|
+
if (!userKey) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
const unacknowledgedUpdatesState = find(
|
|
110
|
+
userUnacknowledgedUpdatesAtoms,
|
|
111
|
+
userKey
|
|
112
|
+
);
|
|
113
|
+
const unacknowledgedUpdates = get(unacknowledgedUpdatesState);
|
|
114
|
+
return unacknowledgedUpdates;
|
|
115
|
+
},
|
|
116
|
+
set: (socketId) => ({ set, get, find }, newUpdates) => {
|
|
117
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
|
|
118
|
+
const userKey = get(userKeyState);
|
|
119
|
+
if (!userKey) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const unacknowledgedUpdatesState = find(
|
|
123
|
+
userUnacknowledgedUpdatesAtoms,
|
|
124
|
+
userKey
|
|
125
|
+
);
|
|
126
|
+
set(unacknowledgedUpdatesState, newUpdates);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
var userEpochAtoms = AtomIO7.atomFamily({
|
|
130
|
+
key: `clientEpoch`,
|
|
131
|
+
default: null
|
|
132
|
+
});
|
|
133
|
+
var socketEpochSelectors = AtomIO7.selectorFamily({
|
|
134
|
+
key: `socketEpoch`,
|
|
135
|
+
get: (socketId) => ({ get, find }) => {
|
|
136
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
|
|
137
|
+
const userKey = get(userKeyState);
|
|
138
|
+
if (!userKey) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const userEpochState = find(userEpochAtoms, userKey);
|
|
142
|
+
const userEpoch = get(userEpochState);
|
|
143
|
+
return userEpoch;
|
|
144
|
+
},
|
|
145
|
+
set: (socketId) => ({ set, get, find }, newEpoch) => {
|
|
146
|
+
const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
|
|
147
|
+
const userKey = get(userKeyState);
|
|
148
|
+
if (!userKey) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const userEpochState = find(userEpochAtoms, userKey);
|
|
152
|
+
set(userEpochState, newEpoch);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
46
155
|
function realtimeStateProvider({
|
|
47
156
|
socket,
|
|
48
157
|
store = internal.IMPLICIT.STORE
|
|
49
158
|
}) {
|
|
50
159
|
return function stateProvider(token) {
|
|
51
|
-
let unsubscribeFromStateUpdates
|
|
52
|
-
const fillUnsubRequest = () => {
|
|
53
|
-
socket.off(`unsub:${token.key}`, fillUnsubRequest);
|
|
54
|
-
unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
|
|
55
|
-
unsubscribeFromStateUpdates = null;
|
|
56
|
-
};
|
|
160
|
+
let unsubscribeFromStateUpdates;
|
|
57
161
|
const fillSubRequest = () => {
|
|
58
162
|
socket.emit(`serve:${token.key}`, AtomIO7__namespace.getState(token, store));
|
|
59
163
|
unsubscribeFromStateUpdates = internal.subscribeToState(
|
|
@@ -64,12 +168,36 @@ function realtimeStateProvider({
|
|
|
64
168
|
`expose-single:${socket.id}`,
|
|
65
169
|
store
|
|
66
170
|
);
|
|
171
|
+
const fillUnsubRequest = () => {
|
|
172
|
+
socket.off(`unsub:${token.key}`, fillUnsubRequest);
|
|
173
|
+
if (unsubscribeFromStateUpdates) {
|
|
174
|
+
unsubscribeFromStateUpdates();
|
|
175
|
+
unsubscribeFromStateUpdates = void 0;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
67
178
|
socket.on(`unsub:${token.key}`, fillUnsubRequest);
|
|
68
179
|
};
|
|
69
180
|
socket.on(`sub:${token.key}`, fillSubRequest);
|
|
70
181
|
return () => {
|
|
71
182
|
socket.off(`sub:${token.key}`, fillSubRequest);
|
|
72
|
-
|
|
183
|
+
if (unsubscribeFromStateUpdates) {
|
|
184
|
+
unsubscribeFromStateUpdates();
|
|
185
|
+
unsubscribeFromStateUpdates = void 0;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function realtimeStateSynchronizer({
|
|
191
|
+
socket,
|
|
192
|
+
store = internal.IMPLICIT.STORE
|
|
193
|
+
}) {
|
|
194
|
+
return function stateSynchronizer(token) {
|
|
195
|
+
const fillGetRequest = () => {
|
|
196
|
+
socket.emit(`value:${token.key}`, AtomIO7__namespace.getState(token, store));
|
|
197
|
+
};
|
|
198
|
+
socket.on(`get:${token.key}`, fillGetRequest);
|
|
199
|
+
return () => {
|
|
200
|
+
socket.off(`get:${token.key}`, fillGetRequest);
|
|
73
201
|
};
|
|
74
202
|
};
|
|
75
203
|
}
|
|
@@ -100,7 +228,7 @@ function realtimeFamilyProvider({
|
|
|
100
228
|
if (subKey === void 0) {
|
|
101
229
|
const keys = AtomIO7__namespace.getState(index, store);
|
|
102
230
|
for (const key of keys) {
|
|
103
|
-
const token =
|
|
231
|
+
const token = internal.findInStore(family, key, store);
|
|
104
232
|
socket.emit(
|
|
105
233
|
`serve:${family.key}`,
|
|
106
234
|
json.parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
|
|
@@ -191,10 +319,10 @@ function realtimeMutableProvider({
|
|
|
191
319
|
};
|
|
192
320
|
};
|
|
193
321
|
}
|
|
194
|
-
|
|
322
|
+
function realtimeMutableFamilyProvider({
|
|
195
323
|
socket,
|
|
196
324
|
store = internal.IMPLICIT.STORE
|
|
197
|
-
})
|
|
325
|
+
}) {
|
|
198
326
|
return function mutableFamilyProvider(family, index) {
|
|
199
327
|
const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
|
|
200
328
|
const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
|
|
@@ -218,7 +346,7 @@ var realtimeMutableFamilyProvider = ({
|
|
|
218
346
|
if (subKey === void 0) {
|
|
219
347
|
const keys = AtomIO7__namespace.getState(index, store);
|
|
220
348
|
for (const key of keys) {
|
|
221
|
-
const token = family
|
|
349
|
+
const token = internal.findInStore(family, key, store);
|
|
222
350
|
const jsonToken = internal.getJsonToken(token);
|
|
223
351
|
const trackerToken = internal.getUpdateToken(token);
|
|
224
352
|
socket.emit(
|
|
@@ -302,7 +430,7 @@ var realtimeMutableFamilyProvider = ({
|
|
|
302
430
|
unsubSingleCallbacksByKey.clear();
|
|
303
431
|
};
|
|
304
432
|
};
|
|
305
|
-
}
|
|
433
|
+
}
|
|
306
434
|
function realtimeStateReceiver({
|
|
307
435
|
socket,
|
|
308
436
|
store = internal.IMPLICIT.STORE
|
|
@@ -324,17 +452,17 @@ function realtimeStateReceiver({
|
|
|
324
452
|
};
|
|
325
453
|
};
|
|
326
454
|
}
|
|
327
|
-
|
|
455
|
+
function realtimeActionReceiver({
|
|
328
456
|
socket,
|
|
329
457
|
store = internal.IMPLICIT.STORE
|
|
330
|
-
})
|
|
458
|
+
}) {
|
|
331
459
|
return function actionReceiver(tx) {
|
|
332
460
|
const fillTransactionRequest = (update) => {
|
|
333
461
|
const performanceKey = `tx-run:${tx.key}:${update.id}`;
|
|
334
462
|
const performanceKeyStart = `${performanceKey}:start`;
|
|
335
463
|
const performanceKeyEnd = `${performanceKey}:end`;
|
|
336
464
|
performance.mark(performanceKeyStart);
|
|
337
|
-
AtomIO7__namespace.runTransaction(tx, store)(...update.params);
|
|
465
|
+
AtomIO7__namespace.runTransaction(tx, update.id, store)(...update.params);
|
|
338
466
|
performance.mark(performanceKeyEnd);
|
|
339
467
|
const metric = performance.measure(
|
|
340
468
|
performanceKey,
|
|
@@ -346,69 +474,124 @@ var realtimeActionReceiver = ({
|
|
|
346
474
|
socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
|
|
347
475
|
return () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
|
|
348
476
|
};
|
|
349
|
-
}
|
|
350
|
-
var completeUpdateAtoms = AtomIO7__namespace.atomFamily({
|
|
351
|
-
key: `completeUpdate`,
|
|
352
|
-
default: null
|
|
353
|
-
});
|
|
354
|
-
var transactionRedactorAtoms = AtomIO7__namespace.atomFamily({
|
|
355
|
-
key: `transactionRedactor`,
|
|
356
|
-
default: { filter: (updates) => updates }
|
|
357
|
-
});
|
|
358
|
-
var redactedUpdateSelectors = AtomIO7__namespace.selectorFamily({
|
|
359
|
-
key: `redactedUpdate`,
|
|
360
|
-
get: ([transactionKey, updateId]) => ({ get, find }) => {
|
|
361
|
-
const update = get(find(completeUpdateAtoms, updateId));
|
|
362
|
-
const { filter } = get(find(transactionRedactorAtoms, transactionKey));
|
|
363
|
-
if (update && filter) {
|
|
364
|
-
return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
|
|
365
|
-
}
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
// realtime-server/src/realtime-action-synchronizer.ts
|
|
477
|
+
}
|
|
371
478
|
function realtimeActionSynchronizer({
|
|
372
479
|
socket,
|
|
373
480
|
store = internal.IMPLICIT.STORE
|
|
374
481
|
}) {
|
|
375
482
|
return function actionSynchronizer(tx, filter) {
|
|
483
|
+
const userKeyState = internal.findInStore(
|
|
484
|
+
usersOfSockets.states.userKeyOfSocket,
|
|
485
|
+
socket.id,
|
|
486
|
+
store
|
|
487
|
+
);
|
|
488
|
+
const userKey = AtomIO7__namespace.getState(userKeyState, store);
|
|
489
|
+
const socketUnacknowledgedUpdatesState = internal.findInStore(
|
|
490
|
+
socketUnacknowledgedUpdatesSelectors,
|
|
491
|
+
socket.id,
|
|
492
|
+
store
|
|
493
|
+
);
|
|
494
|
+
const socketUnacknowledgedUpdates = AtomIO7__namespace.getState(
|
|
495
|
+
socketUnacknowledgedUpdatesState,
|
|
496
|
+
store
|
|
497
|
+
);
|
|
376
498
|
if (filter) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
{ filter },
|
|
380
|
-
store
|
|
381
|
-
);
|
|
499
|
+
const redactorState = internal.findInStore(transactionRedactorAtoms, tx.key, store);
|
|
500
|
+
AtomIO7__namespace.setState(redactorState, { filter }, store);
|
|
382
501
|
}
|
|
383
502
|
const fillTransactionRequest = (update) => {
|
|
384
|
-
|
|
503
|
+
const performanceKey = `tx-run:${tx.key}:${update.id}`;
|
|
504
|
+
const performanceKeyStart = `${performanceKey}:start`;
|
|
505
|
+
const performanceKeyEnd = `${performanceKey}:end`;
|
|
506
|
+
performance.mark(performanceKeyStart);
|
|
507
|
+
AtomIO7__namespace.runTransaction(tx, update.id, store)(...update.params);
|
|
508
|
+
performance.mark(performanceKeyEnd);
|
|
509
|
+
const metric = performance.measure(
|
|
510
|
+
performanceKey,
|
|
511
|
+
performanceKeyStart,
|
|
512
|
+
performanceKeyEnd
|
|
513
|
+
);
|
|
514
|
+
store == null ? void 0 : store.logger.info(`\u{1F680}`, `transaction`, tx.key, update.id, metric.duration);
|
|
385
515
|
};
|
|
516
|
+
socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
|
|
386
517
|
socket.on(`tx-run:${tx.key}`, fillTransactionRequest);
|
|
518
|
+
let unsubscribeFromTransaction;
|
|
387
519
|
const fillTransactionSubscriptionRequest = () => {
|
|
388
|
-
|
|
520
|
+
unsubscribeFromTransaction = internal.subscribeToTransaction(
|
|
389
521
|
tx,
|
|
390
522
|
(update) => {
|
|
391
|
-
|
|
392
|
-
const updateState = AtomIO7__namespace.findState(completeUpdateAtoms, update.id);
|
|
523
|
+
const updateState = internal.findInStore(completeUpdateAtoms, update.id, store);
|
|
393
524
|
AtomIO7__namespace.setState(updateState, update, store);
|
|
394
525
|
const toEmit = filter ? AtomIO7__namespace.getState(
|
|
395
|
-
|
|
526
|
+
internal.findInStore(redactedUpdateSelectors, [tx.key, update.id], store),
|
|
396
527
|
store
|
|
397
528
|
) : update;
|
|
529
|
+
AtomIO7__namespace.setState(
|
|
530
|
+
socketUnacknowledgedUpdatesState,
|
|
531
|
+
(updates) => {
|
|
532
|
+
if (toEmit) {
|
|
533
|
+
updates.push(toEmit);
|
|
534
|
+
updates.sort((a, b) => a.epoch - b.epoch);
|
|
535
|
+
}
|
|
536
|
+
return updates;
|
|
537
|
+
},
|
|
538
|
+
store
|
|
539
|
+
);
|
|
398
540
|
socket.emit(`tx-new:${tx.key}`, toEmit);
|
|
399
541
|
},
|
|
400
542
|
`tx-sub:${tx.key}:${socket.id}`,
|
|
401
543
|
store
|
|
402
544
|
);
|
|
403
|
-
socket.on(`tx-unsub:${tx.key}`,
|
|
545
|
+
socket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction);
|
|
404
546
|
};
|
|
405
547
|
socket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest);
|
|
548
|
+
let i = 1;
|
|
549
|
+
let next = 1;
|
|
550
|
+
const retry = setInterval(() => {
|
|
551
|
+
const toEmit = socketUnacknowledgedUpdates[0];
|
|
552
|
+
console.log(userKey, socketUnacknowledgedUpdates);
|
|
553
|
+
if (toEmit && i === next) {
|
|
554
|
+
socket.emit(`tx-new:${tx.key}`, toEmit);
|
|
555
|
+
next *= 2;
|
|
556
|
+
}
|
|
557
|
+
i++;
|
|
558
|
+
}, 250);
|
|
559
|
+
const trackClientAcknowledgement = (epoch) => {
|
|
560
|
+
var _a;
|
|
561
|
+
i = 1;
|
|
562
|
+
next = 1;
|
|
563
|
+
const socketEpochState = internal.findInStore(
|
|
564
|
+
socketEpochSelectors,
|
|
565
|
+
socket.id,
|
|
566
|
+
store
|
|
567
|
+
);
|
|
568
|
+
AtomIO7__namespace.setState(socketEpochState, epoch, store);
|
|
569
|
+
if (((_a = socketUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch) {
|
|
570
|
+
AtomIO7__namespace.setState(
|
|
571
|
+
socketUnacknowledgedUpdatesState,
|
|
572
|
+
(updates) => {
|
|
573
|
+
updates.shift();
|
|
574
|
+
return updates;
|
|
575
|
+
},
|
|
576
|
+
store
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
socket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement);
|
|
406
581
|
return () => {
|
|
582
|
+
if (unsubscribeFromTransaction) {
|
|
583
|
+
unsubscribeFromTransaction();
|
|
584
|
+
unsubscribeFromTransaction = void 0;
|
|
585
|
+
}
|
|
586
|
+
clearInterval(retry);
|
|
407
587
|
socket.off(`tx-run:${tx.key}`, fillTransactionRequest);
|
|
588
|
+
socket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest);
|
|
408
589
|
};
|
|
409
590
|
};
|
|
410
591
|
}
|
|
411
592
|
|
|
593
|
+
exports.DEFAULT_USER_IN_ROOM_META = DEFAULT_USER_IN_ROOM_META;
|
|
594
|
+
exports.completeUpdateAtoms = completeUpdateAtoms;
|
|
412
595
|
exports.realtimeActionReceiver = realtimeActionReceiver;
|
|
413
596
|
exports.realtimeActionSynchronizer = realtimeActionSynchronizer;
|
|
414
597
|
exports.realtimeFamilyProvider = realtimeFamilyProvider;
|
|
@@ -416,5 +599,16 @@ exports.realtimeMutableFamilyProvider = realtimeMutableFamilyProvider;
|
|
|
416
599
|
exports.realtimeMutableProvider = realtimeMutableProvider;
|
|
417
600
|
exports.realtimeStateProvider = realtimeStateProvider;
|
|
418
601
|
exports.realtimeStateReceiver = realtimeStateReceiver;
|
|
602
|
+
exports.realtimeStateSynchronizer = realtimeStateSynchronizer;
|
|
603
|
+
exports.redactedUpdateSelectors = redactedUpdateSelectors;
|
|
604
|
+
exports.roomIndex = roomIndex;
|
|
605
|
+
exports.socketEpochSelectors = socketEpochSelectors;
|
|
606
|
+
exports.socketUnacknowledgedUpdatesSelectors = socketUnacknowledgedUpdatesSelectors;
|
|
607
|
+
exports.transactionRedactorAtoms = transactionRedactorAtoms;
|
|
608
|
+
exports.userEpochAtoms = userEpochAtoms;
|
|
609
|
+
exports.userIndex = userIndex;
|
|
610
|
+
exports.userUnacknowledgedUpdatesAtoms = userUnacknowledgedUpdatesAtoms;
|
|
611
|
+
exports.usersInRooms = usersInRooms;
|
|
612
|
+
exports.usersOfSockets = usersOfSockets;
|
|
419
613
|
//# sourceMappingURL=out.js.map
|
|
420
614
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/realtime-state-provider.ts","../src/realtime-family-provider.ts","../src/realtime-mutable-provider.ts","../src/realtime-mutable-family-provider.ts","../src/realtime-state-receiver.ts","../src/realtime-action-receiver.ts","../src/realtime-action-synchronizer.ts","../src/realtime-server-store.ts"],"names":["AtomIO","IMPLICIT","subscribeToState","_a","getJsonToken","getUpdateToken","parseJson"],"mappings":"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","sourcesContent":["import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<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 = subscribeToState(\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 { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<J extends Json.Serializable>(\n\t\tfamily: AtomIO.RegularAtomFamily<J, Json.Serializable>,\n\t\tindex: AtomIO.ReadableToken<Iterable<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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\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\tfor (const key of keys) {\n\t\t\t\t\tconst token = AtomIO.findInStore(family, key, store)\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 = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token: AtomIO.WritableToken<J>) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\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 = subscribeToState(\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\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 = subscribeToState(\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 {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} 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 realtimeMutableFamilyProvider = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function mutableFamilyProvider<\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.ReadableToken<Iterable<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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\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\tfor (const key of keys) {\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 = subscribeToState(\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 = subscribeToState(\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 = subscribeToState(\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<J extends Json.Serializable>(\n\t\ttoken: WritableToken<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","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport const realtimeActionReceiver = ({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) => {\n\treturn function actionReceiver<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToTransaction } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\ttransactionRedactorAtoms,\n} from \"./realtime-server-store\"\n\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tif (filter) {\n\t\t\tAtomIO.setState(\n\t\t\t\tAtomIO.findState(transactionRedactorAtoms, tx.key),\n\t\t\t\t{ filter },\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tAtomIO.runTransaction<ƒ>(tx, store, update.id)(...update.params)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tconst unsubscribe = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tunsubscribe()\n\t\t\t\t\tconst updateState = AtomIO.findState(completeUpdateAtoms, update.id)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tAtomIO.findState(redactedUpdateSelectors, [tx.key, update.id]),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribe)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\treturn () => {\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\n\nexport const completeUpdateAtoms = AtomIO.atomFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = AtomIO.atomFamily<\n\t{\n\t\tfilter: (\n\t\t\tupdates: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\n\nexport const redactedUpdateSelectors = AtomIO.selectorFamily<\n\tAtomIO.TransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/realtime-server-stores/server-user-store.ts","../src/realtime-server-stores/server-sync-store.ts","../src/realtime-state-provider.ts","../src/realtime-state-synchronizer.ts","../src/realtime-family-provider.ts","../src/realtime-mutable-provider.ts","../src/realtime-mutable-family-provider.ts","../src/realtime-state-receiver.ts","../src/realtime-action-receiver.ts","../src/realtime-action-synchronizer.ts"],"names":["atomFamily","AtomIO","IMPLICIT","subscribeToState","_a","findInStore","getJsonToken","getUpdateToken","parseJson"],"mappings":"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","sourcesContent":["import { atom, atomFamily } from \"atom.io\"\nimport { join } from \"atom.io/data\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nexport const userIndex = atom({\n\tkey: `usersIndex`,\n\tmutable: true,\n\tdefault: () => new SetRTX<string>(),\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport const usersOfSockets = join({\n\tkey: `usersOfSockets`,\n\tbetween: [`user`, `socket`],\n\tcardinality: `1:1`,\n})\n\nexport const roomIndex = atom({\n\tkey: `conclaveIndex`,\n\tdefault: () => new SetRTX<string>(),\n\tmutable: true,\n\ttoJson: (set) => set.toJSON(),\n\tfromJson: (json) => SetRTX.fromJSON(json),\n})\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms = join(\n\t{\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t},\n\tDEFAULT_USER_IN_ROOM_META,\n)\n\n// export const roomStoreAtoms = atomFamily<\n// \t{ [key: string]: any },\n// \t{ conclave: string }\n// >({\n\n// })\n","import type { TransactionUpdate, TransactionUpdateContent } from \"atom.io\"\nimport { atomFamily, selectorFamily } from \"atom.io\"\nimport { SyncGroup } from \"~/packages/atom.io/__unstable__/realtime-server-next/create-realtime-sync-group\"\nimport { usersOfSockets } from \"./server-user-store\"\n\nexport const completeUpdateAtoms = atomFamily<\n\tTransactionUpdate<any> | null,\n\tstring\n>({\n\tkey: `completeUpdate`,\n\tdefault: null,\n})\n\nexport const transactionRedactorAtoms = atomFamily<\n\t{\n\t\tfilter: (updates: TransactionUpdateContent[]) => TransactionUpdateContent[]\n\t},\n\tstring\n>({\n\tkey: `transactionRedactor`,\n\tdefault: { filter: (updates) => updates },\n})\nexport const redactedUpdateSelectors = selectorFamily<\n\tTransactionUpdate<any> | null,\n\t[transactionKey: string, updateId: string]\n>({\n\tkey: `redactedUpdate`,\n\tget:\n\t\t([transactionKey, updateId]) =>\n\t\t({ get, find }) => {\n\t\t\tconst update = get(find(completeUpdateAtoms, updateId))\n\t\t\tconst { filter } = get(find(transactionRedactorAtoms, transactionKey))\n\n\t\t\tif (update && filter) {\n\t\t\t\treturn { ...update, updates: filter(update.updates) }\n\t\t\t}\n\t\t\treturn null\n\t\t},\n})\n\nexport const userUnacknowledgedUpdatesAtoms = atomFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `unacknowledgedUpdates`,\n\tdefault: () => [],\n})\n\nexport const socketUnacknowledgedUpdatesSelectors = selectorFamily<\n\tTransactionUpdate<any>[],\n\tstring\n>({\n\tkey: `socketUnacknowledgedUpdates`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tconst unacknowledgedUpdates = get(unacknowledgedUpdatesState)\n\t\t\treturn unacknowledgedUpdates\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newUpdates) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unacknowledgedUpdatesState = find(\n\t\t\t\tuserUnacknowledgedUpdatesAtoms,\n\t\t\t\tuserKey,\n\t\t\t)\n\t\t\tset(unacknowledgedUpdatesState, newUpdates)\n\t\t},\n})\n\nexport const userEpochAtoms = atomFamily<number | null, string>({\n\tkey: `clientEpoch`,\n\tdefault: null,\n})\n\nexport const socketEpochSelectors = selectorFamily<number | null, string>({\n\tkey: `socketEpoch`,\n\tget:\n\t\t(socketId) =>\n\t\t({ get, find }) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tconst userEpoch = get(userEpochState)\n\t\t\treturn userEpoch\n\t\t},\n\tset:\n\t\t(socketId) =>\n\t\t({ set, get, find }, newEpoch) => {\n\t\t\tconst userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId)\n\t\t\tconst userKey = get(userKeyState)\n\t\t\tif (!userKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst userEpochState = find(userEpochAtoms, userKey)\n\t\t\tset(userEpochState, newEpoch)\n\t\t},\n})\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateProvider = ReturnType<typeof realtimeStateProvider>\nexport function realtimeStateProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateProvider<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tlet unsubscribeFromStateUpdates: (() => void) | undefined\n\n\t\tconst fillSubRequest = () => {\n\t\t\tsocket.emit(`serve:${token.key}`, AtomIO.getState(token, store))\n\n\t\t\tunsubscribeFromStateUpdates = subscribeToState(\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\n\t\t\tconst fillUnsubRequest = () => {\n\t\t\t\tsocket.off(`unsub:${token.key}`, fillUnsubRequest)\n\t\t\t\tif (unsubscribeFromStateUpdates) {\n\t\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t\t}\n\t\t\t}\n\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\tif (unsubscribeFromStateUpdates) {\n\t\t\t\tunsubscribeFromStateUpdates()\n\t\t\t\tunsubscribeFromStateUpdates = undefined\n\t\t\t}\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport function realtimeStateSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateSynchronizer<J extends Json.Serializable>(\n\t\ttoken: AtomIO.WritableToken<J>,\n\t): () => void {\n\t\tconst fillGetRequest = () => {\n\t\t\tsocket.emit(`value:${token.key}`, AtomIO.getState(token, store))\n\t\t}\n\n\t\tsocket.on(`get:${token.key}`, fillGetRequest)\n\t\treturn () => {\n\t\t\tsocket.off(`get:${token.key}`, fillGetRequest)\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToState } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type FamilyProvider = ReturnType<typeof realtimeFamilyProvider>\nexport function realtimeFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function familyProvider<\n\t\tJ extends Json.Serializable,\n\t\tK extends Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.RegularAtomFamily<J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\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?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\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 = family.subject.subscribe(\n\t\t\t\t\t`expose-family:${socket.id}`,\n\t\t\t\t\t(token: AtomIO.WritableToken<J>) => {\n\t\t\t\t\t\tconst unsub = subscribeToState(\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 = subscribeToState(\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableProvider = ReturnType<typeof realtimeMutableProvider>\nexport function realtimeMutableProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableProvider<\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 = subscribeToState(\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 {\n\tIMPLICIT,\n\tfindInStore,\n\tgetJsonToken,\n\tgetUpdateToken,\n\tsubscribeToState,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type MutableFamilyProvider = ReturnType<\n\ttypeof realtimeMutableFamilyProvider\n>\nexport function realtimeMutableFamilyProvider({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function mutableFamilyProvider<\n\t\tT extends Transceiver<any>,\n\t\tJ extends Json.Serializable,\n\t\tK extends Json.Serializable,\n\t>(\n\t\tfamily: AtomIO.MutableAtomFamily<T, J, K>,\n\t\tindex: AtomIO.ReadableToken<Iterable<K>>,\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\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?: K) => {\n\t\t\tif (subKey === undefined) {\n\t\t\t\tconst keys = AtomIO.getState(index, store)\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tconst token = findInStore(family, key, store)\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 = subscribeToState(\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 = subscribeToState(\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 = subscribeToState(\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\tfor (const [, unsub] of unsubFamilyCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tfor (const [, unsub] of unsubSingleCallbacksByKey) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubFamilyCallbacksByKey.clear()\n\t\t\tunsubSingleCallbacksByKey.clear()\n\t\t}\n\t}\n}\n","import { setState } from \"atom.io\"\nimport type { WritableToken } from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ServerConfig } from \".\"\n\nexport type StateReceiver = ReturnType<typeof realtimeStateReceiver>\nexport function realtimeStateReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function stateReceiver<J extends Json.Serializable>(\n\t\ttoken: WritableToken<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","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\n\nexport type ActionReceiver = ReturnType<typeof realtimeActionReceiver>\nexport function realtimeActionReceiver({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionReceiver<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t): () => void {\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\treturn () => socket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t}\n}\n","import * as AtomIO from \"atom.io\"\nimport { IMPLICIT, findInStore, subscribeToTransaction } from \"atom.io/internal\"\n\nimport type { ServerConfig } from \".\"\nimport { usersOfSockets } from \"./realtime-server-stores\"\nimport {\n\tcompleteUpdateAtoms,\n\tredactedUpdateSelectors,\n\tsocketEpochSelectors,\n\tsocketUnacknowledgedUpdatesSelectors,\n\ttransactionRedactorAtoms,\n} from \"./realtime-server-stores/server-sync-store\"\n\nexport type ActionSynchronizer = ReturnType<typeof realtimeActionSynchronizer>\nexport function realtimeActionSynchronizer({\n\tsocket,\n\tstore = IMPLICIT.STORE,\n}: ServerConfig) {\n\treturn function actionSynchronizer<ƒ extends AtomIO.ƒn>(\n\t\ttx: AtomIO.TransactionToken<ƒ>,\n\t\tfilter?: (\n\t\t\tupdate: AtomIO.TransactionUpdateContent[],\n\t\t) => AtomIO.TransactionUpdateContent[],\n\t): () => void {\n\t\tconst userKeyState = findInStore(\n\t\t\tusersOfSockets.states.userKeyOfSocket,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst userKey = AtomIO.getState(userKeyState, store)\n\t\tconst socketUnacknowledgedUpdatesState = findInStore(\n\t\t\tsocketUnacknowledgedUpdatesSelectors,\n\t\t\tsocket.id,\n\t\t\tstore,\n\t\t)\n\t\tconst socketUnacknowledgedUpdates = AtomIO.getState(\n\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\tstore,\n\t\t)\n\t\tif (filter) {\n\t\t\tconst redactorState = findInStore(transactionRedactorAtoms, tx.key, store)\n\t\t\tAtomIO.setState(redactorState, { filter }, store)\n\t\t}\n\t\tconst fillTransactionRequest = (update: AtomIO.TransactionUpdate<ƒ>) => {\n\t\t\tconst performanceKey = `tx-run:${tx.key}:${update.id}`\n\t\t\tconst performanceKeyStart = `${performanceKey}:start`\n\t\t\tconst performanceKeyEnd = `${performanceKey}:end`\n\t\t\tperformance.mark(performanceKeyStart)\n\t\t\tAtomIO.runTransaction<ƒ>(tx, update.id, store)(...update.params)\n\t\t\tperformance.mark(performanceKeyEnd)\n\t\t\tconst metric = performance.measure(\n\t\t\t\tperformanceKey,\n\t\t\t\tperformanceKeyStart,\n\t\t\t\tperformanceKeyEnd,\n\t\t\t)\n\t\t\tstore?.logger.info(`🚀`, `transaction`, tx.key, update.id, metric.duration)\n\t\t}\n\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\tsocket.on(`tx-run:${tx.key}`, fillTransactionRequest)\n\n\t\tlet unsubscribeFromTransaction: (() => void) | undefined\n\t\tconst fillTransactionSubscriptionRequest = () => {\n\t\t\tunsubscribeFromTransaction = subscribeToTransaction(\n\t\t\t\ttx,\n\t\t\t\t(update) => {\n\t\t\t\t\tconst updateState = findInStore(completeUpdateAtoms, update.id, store)\n\t\t\t\t\tAtomIO.setState(updateState, update, store)\n\t\t\t\t\tconst toEmit = filter\n\t\t\t\t\t\t? AtomIO.getState(\n\t\t\t\t\t\t\t\tfindInStore(redactedUpdateSelectors, [tx.key, update.id], store),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: update\n\n\t\t\t\t\t// the problem is that only while a socket is connected can\n\t\t\t\t\t// updates be set in the queue for that socket's client.\n\t\t\t\t\t//\n\t\t\t\t\t// we need a client session that can persist between disconnects\n\t\t\t\t\tAtomIO.setState(\n\t\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t\t(updates) => {\n\t\t\t\t\t\t\tif (toEmit) {\n\t\t\t\t\t\t\t\tupdates.push(toEmit)\n\t\t\t\t\t\t\t\tupdates.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updates\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\n\t\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\t},\n\t\t\t\t`tx-sub:${tx.key}:${socket.id}`,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsocket.on(`tx-unsub:${tx.key}`, unsubscribeFromTransaction)\n\t\t}\n\t\tsocket.on(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\n\t\tlet i = 1\n\t\tlet next = 1\n\t\tconst retry = setInterval(() => {\n\t\t\tconst toEmit = socketUnacknowledgedUpdates[0]\n\t\t\tconsole.log(userKey, socketUnacknowledgedUpdates)\n\t\t\tif (toEmit && i === next) {\n\t\t\t\tsocket.emit(`tx-new:${tx.key}`, toEmit)\n\t\t\t\tnext *= 2\n\t\t\t}\n\n\t\t\ti++\n\t\t}, 250)\n\n\t\tconst trackClientAcknowledgement = (epoch: number) => {\n\t\t\ti = 1\n\t\t\tnext = 1\n\t\t\tconst socketEpochState = findInStore(\n\t\t\t\tsocketEpochSelectors,\n\t\t\t\tsocket.id,\n\t\t\t\tstore,\n\t\t\t)\n\n\t\t\tAtomIO.setState(socketEpochState, epoch, store)\n\t\t\tif (socketUnacknowledgedUpdates[0]?.epoch === epoch) {\n\t\t\t\tAtomIO.setState(\n\t\t\t\t\tsocketUnacknowledgedUpdatesState,\n\t\t\t\t\t(updates) => {\n\t\t\t\t\t\tupdates.shift()\n\t\t\t\t\t\treturn updates\n\t\t\t\t\t},\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tsocket.on(`tx-ack:${tx.key}`, trackClientAcknowledgement)\n\n\t\treturn () => {\n\t\t\tif (unsubscribeFromTransaction) {\n\t\t\t\tunsubscribeFromTransaction()\n\t\t\t\tunsubscribeFromTransaction = undefined\n\t\t\t}\n\t\t\tclearInterval(retry)\n\t\t\tsocket.off(`tx-run:${tx.key}`, fillTransactionRequest)\n\t\t\tsocket.off(`tx-sub:${tx.key}`, fillTransactionSubscriptionRequest)\n\t\t}\n\t}\n}\n"]}
|