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.
Files changed (99) hide show
  1. package/data/dist/index.cjs +31 -14
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.js +31 -14
  4. package/data/dist/index.js.map +1 -1
  5. package/data/src/join.ts +31 -14
  6. package/dist/chunk-H4Q5FTPZ.js +11 -0
  7. package/dist/chunk-H4Q5FTPZ.js.map +1 -0
  8. package/dist/index.cjs +7 -14
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.ts +8 -7
  11. package/dist/index.js +8 -14
  12. package/dist/index.js.map +1 -1
  13. package/internal/dist/index.cjs +240 -193
  14. package/internal/dist/index.cjs.map +1 -1
  15. package/internal/dist/index.d.ts +30 -9
  16. package/internal/dist/index.js +233 -194
  17. package/internal/dist/index.js.map +1 -1
  18. package/internal/src/families/find-in-store.ts +74 -0
  19. package/internal/src/families/index.ts +1 -0
  20. package/internal/src/ingest-updates/ingest-transaction-update.ts +1 -0
  21. package/internal/src/mutable/tracker.ts +37 -32
  22. package/internal/src/mutable/transceiver.ts +1 -1
  23. package/internal/src/not-found-error.ts +14 -3
  24. package/internal/src/operation.ts +2 -1
  25. package/internal/src/selector/create-writable-selector.ts +2 -1
  26. package/internal/src/selector/register-selector.ts +5 -4
  27. package/internal/src/set-state/set-atom.ts +23 -6
  28. package/internal/src/set-state/stow-update.ts +2 -4
  29. package/internal/src/store/store.ts +13 -4
  30. package/internal/src/timeline/add-atom-to-timeline.ts +5 -5
  31. package/internal/src/transaction/abort-transaction.ts +2 -1
  32. package/internal/src/transaction/apply-transaction.ts +5 -3
  33. package/internal/src/transaction/build-transaction.ts +17 -10
  34. package/internal/src/transaction/create-transaction.ts +2 -3
  35. package/internal/src/transaction/index.ts +3 -2
  36. package/internal/src/transaction/is-root-store.ts +23 -0
  37. package/package.json +10 -10
  38. package/react/dist/index.cjs +27 -21
  39. package/react/dist/index.cjs.map +1 -1
  40. package/react/dist/index.d.ts +8 -2
  41. package/react/dist/index.js +27 -21
  42. package/react/dist/index.js.map +1 -1
  43. package/react/src/index.ts +4 -1
  44. package/react/src/use-i.ts +36 -0
  45. package/react/src/use-json.ts +38 -0
  46. package/react/src/use-o.ts +34 -0
  47. package/react/src/use-tl.ts +45 -0
  48. package/realtime-client/dist/index.cjs +163 -62
  49. package/realtime-client/dist/index.cjs.map +1 -1
  50. package/realtime-client/dist/index.d.ts +10 -6
  51. package/realtime-client/dist/index.js +153 -60
  52. package/realtime-client/dist/index.js.map +1 -1
  53. package/realtime-client/src/index.ts +2 -1
  54. package/realtime-client/src/pull-state.ts +4 -3
  55. package/realtime-client/src/{realtime-client-store.ts → realtime-client-stores/client-main-store.ts} +0 -8
  56. package/realtime-client/src/realtime-client-stores/client-sync-store.ts +15 -0
  57. package/realtime-client/src/realtime-client-stores/index.ts +2 -0
  58. package/realtime-client/src/sync-server-action.ts +131 -39
  59. package/realtime-client/src/sync-state.ts +19 -0
  60. package/realtime-react/dist/index.cjs +43 -26
  61. package/realtime-react/dist/index.cjs.map +1 -1
  62. package/realtime-react/dist/index.d.ts +3 -1
  63. package/realtime-react/dist/index.js +41 -25
  64. package/realtime-react/dist/index.js.map +1 -1
  65. package/realtime-react/src/index.ts +1 -0
  66. package/realtime-react/src/on-mount.ts +3 -21
  67. package/realtime-react/src/use-realtime-service.ts +1 -1
  68. package/realtime-react/src/use-server-action.ts +1 -1
  69. package/realtime-react/src/use-single-effect.ts +29 -0
  70. package/realtime-react/src/use-sync-server-action.ts +5 -8
  71. package/realtime-react/src/use-sync.ts +17 -0
  72. package/realtime-server/dist/index.cjs +242 -48
  73. package/realtime-server/dist/index.cjs.map +1 -1
  74. package/realtime-server/dist/index.d.ts +147 -9
  75. package/realtime-server/dist/index.js +232 -51
  76. package/realtime-server/dist/index.js.map +1 -1
  77. package/realtime-server/src/index.ts +2 -0
  78. package/realtime-server/src/realtime-action-receiver.ts +4 -3
  79. package/realtime-server/src/realtime-action-synchronizer.ts +100 -13
  80. package/realtime-server/src/realtime-family-provider.ts +10 -6
  81. package/realtime-server/src/realtime-mutable-family-provider.ts +15 -18
  82. package/realtime-server/src/realtime-mutable-provider.ts +1 -0
  83. package/realtime-server/src/realtime-server-stores/index.ts +2 -0
  84. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +115 -0
  85. package/realtime-server/src/realtime-server-stores/server-user-store.ts +45 -0
  86. package/realtime-server/src/realtime-state-provider.ts +16 -8
  87. package/realtime-server/src/realtime-state-receiver.ts +1 -0
  88. package/realtime-server/src/realtime-state-synchronizer.ts +23 -0
  89. package/realtime-testing/dist/index.cjs +65 -26
  90. package/realtime-testing/dist/index.cjs.map +1 -1
  91. package/realtime-testing/dist/index.d.ts +11 -7
  92. package/realtime-testing/dist/index.js +64 -26
  93. package/realtime-testing/dist/index.js.map +1 -1
  94. package/realtime-testing/src/setup-realtime-test.tsx +83 -43
  95. package/src/find-state.ts +8 -16
  96. package/src/logger.ts +16 -11
  97. package/src/transaction.ts +4 -4
  98. package/react/src/store-hooks.ts +0 -87
  99. 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 = null;
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
- unsubscribeFromStateUpdates == null ? void 0 : unsubscribeFromStateUpdates();
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 = AtomIO7__namespace.findInStore(family, key, store);
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
- var realtimeMutableFamilyProvider = ({
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(key);
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
- var realtimeActionReceiver = ({
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
- AtomIO7__namespace.setState(
378
- AtomIO7__namespace.findState(transactionRedactorAtoms, tx.key),
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
- AtomIO7__namespace.runTransaction(tx, store, update.id)(...update.params);
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
- const unsubscribe = internal.subscribeToTransaction(
520
+ unsubscribeFromTransaction = internal.subscribeToTransaction(
389
521
  tx,
390
522
  (update) => {
391
- unsubscribe();
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
- AtomIO7__namespace.findState(redactedUpdateSelectors, [tx.key, update.id]),
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}`, unsubscribe);
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"]}