atom.io 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/data/dist/index.cjs +62 -40
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.d.ts +8 -2
  4. package/data/dist/index.js +64 -42
  5. package/data/dist/index.js.map +1 -1
  6. package/data/src/dict.ts +8 -4
  7. package/data/src/join.ts +74 -33
  8. package/data/src/struct-family.ts +18 -17
  9. package/dist/chunk-OEVFAUPE.js +289 -0
  10. package/dist/chunk-OEVFAUPE.js.map +1 -0
  11. package/dist/index.cjs +4 -10
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +62 -51
  14. package/dist/index.js +5 -11
  15. package/dist/index.js.map +1 -1
  16. package/internal/dist/index.cjs +163 -64
  17. package/internal/dist/index.cjs.map +1 -1
  18. package/internal/dist/index.d.ts +94 -70
  19. package/internal/dist/index.js +155 -59
  20. package/internal/dist/index.js.map +1 -1
  21. package/internal/src/arbitrary.ts +3 -0
  22. package/internal/src/caching.ts +8 -6
  23. package/internal/src/families/find-in-store.ts +16 -0
  24. package/internal/src/get-environment-data.ts +4 -7
  25. package/internal/src/index.ts +6 -5
  26. package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
  27. package/internal/src/selector/create-standalone-selector.ts +0 -2
  28. package/internal/src/set-state/set-atom.ts +14 -18
  29. package/internal/src/store/store.ts +14 -2
  30. package/internal/src/store/withdraw.ts +72 -2
  31. package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
  32. package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
  33. package/internal/src/timeline/create-timeline.ts +12 -1
  34. package/internal/src/transaction/act-upon-store.ts +19 -0
  35. package/internal/src/transaction/apply-transaction.ts +7 -1
  36. package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
  37. package/internal/src/transaction/build-transaction.ts +7 -6
  38. package/internal/src/transaction/create-transaction.ts +1 -1
  39. package/internal/src/transaction/get-epoch-number.ts +40 -0
  40. package/internal/src/transaction/index.ts +10 -1
  41. package/internal/src/transaction/set-epoch-number.ts +31 -0
  42. package/introspection/dist/index.cjs.map +1 -1
  43. package/introspection/dist/index.d.ts +3 -3
  44. package/introspection/dist/index.js.map +1 -1
  45. package/introspection/src/attach-introspection-states.ts +6 -2
  46. package/introspection/src/attach-timeline-family.ts +5 -2
  47. package/introspection/src/attach-transaction-logs.ts +2 -2
  48. package/json/dist/index.d.ts +3 -1
  49. package/json/src/index.ts +6 -2
  50. package/package.json +24 -13
  51. package/react/dist/index.cjs.map +1 -1
  52. package/react/dist/index.d.ts +1 -1
  53. package/react/dist/index.js.map +1 -1
  54. package/react/src/use-json.ts +1 -1
  55. package/react-devtools/dist/index.cjs +131 -134
  56. package/react-devtools/dist/index.cjs.map +1 -1
  57. package/react-devtools/dist/index.css +2 -2
  58. package/react-devtools/dist/index.css.map +1 -1
  59. package/react-devtools/dist/index.d.ts +3 -3
  60. package/react-devtools/dist/index.js +103 -106
  61. package/react-devtools/dist/index.js.map +1 -1
  62. package/react-devtools/src/StateEditor.tsx +6 -6
  63. package/react-devtools/src/StateIndex.tsx +2 -5
  64. package/react-devtools/src/TimelineIndex.tsx +3 -3
  65. package/react-devtools/src/TransactionIndex.tsx +9 -8
  66. package/react-devtools/src/Updates.tsx +1 -1
  67. package/react-devtools/src/index.ts +4 -4
  68. package/realtime/dist/index.cjs +72 -0
  69. package/realtime/dist/index.cjs.map +1 -0
  70. package/realtime/dist/index.d.ts +39 -0
  71. package/realtime/dist/index.js +68 -0
  72. package/realtime/dist/index.js.map +1 -0
  73. package/realtime/package.json +16 -0
  74. package/realtime/src/index.ts +1 -0
  75. package/realtime/src/realtime-continuity.ts +152 -0
  76. package/realtime-client/dist/index.cjs +389 -48
  77. package/realtime-client/dist/index.cjs.map +1 -1
  78. package/realtime-client/dist/index.d.ts +16 -9
  79. package/realtime-client/dist/index.js +100 -37
  80. package/realtime-client/dist/index.js.map +1 -1
  81. package/realtime-client/src/index.ts +8 -5
  82. package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +2 -2
  83. package/realtime-client/src/{pull-state.ts → pull-atom.ts} +2 -2
  84. package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +1 -1
  85. package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +1 -1
  86. package/realtime-client/src/pull-selector-family-member.ts +42 -0
  87. package/realtime-client/src/pull-selector.ts +38 -0
  88. package/realtime-client/src/realtime-client-stores/client-main-store.ts +2 -2
  89. package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
  90. package/realtime-client/src/sync-continuity.ts +321 -0
  91. package/realtime-client/src/sync-server-action.ts +18 -20
  92. package/realtime-react/dist/index.cjs +330 -15
  93. package/realtime-react/dist/index.cjs.map +1 -1
  94. package/realtime-react/dist/index.d.ts +26 -6
  95. package/realtime-react/dist/index.js +43 -12
  96. package/realtime-react/dist/index.js.map +1 -1
  97. package/realtime-react/src/index.ts +6 -3
  98. package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
  99. package/realtime-react/src/{use-pull-family-member.ts → use-pull-atom.ts} +6 -5
  100. package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
  101. package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
  102. package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
  103. package/realtime-react/src/{use-pull.ts → use-pull-selector.ts} +7 -5
  104. package/realtime-react/src/use-push.ts +3 -2
  105. package/realtime-react/src/use-server-action.ts +3 -2
  106. package/realtime-react/src/use-sync-continuity.ts +12 -0
  107. package/realtime-react/src/use-sync-server-action.ts +3 -2
  108. package/realtime-server/dist/index.cjs +568 -242
  109. package/realtime-server/dist/index.cjs.map +1 -1
  110. package/realtime-server/dist/index.d.ts +124 -49
  111. package/realtime-server/dist/index.js +555 -238
  112. package/realtime-server/dist/index.js.map +1 -1
  113. package/realtime-server/src/index.ts +18 -2
  114. package/realtime-server/src/ipc-socket.ts +230 -0
  115. package/realtime-server/src/realtime-action-receiver.ts +8 -5
  116. package/realtime-server/src/realtime-action-synchronizer.ts +40 -28
  117. package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
  118. package/realtime-server/src/realtime-family-provider.ts +30 -71
  119. package/realtime-server/src/realtime-mutable-family-provider.ts +24 -86
  120. package/realtime-server/src/realtime-server-stores/index.ts +3 -1
  121. package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +90 -0
  122. package/realtime-server/src/realtime-server-stores/server-room-store.ts +97 -0
  123. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +2 -72
  124. package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
  125. package/realtime-server/src/realtime-state-receiver.ts +0 -1
  126. package/realtime-testing/dist/index.cjs +28 -28
  127. package/realtime-testing/dist/index.cjs.map +1 -1
  128. package/realtime-testing/dist/index.js +28 -27
  129. package/realtime-testing/dist/index.js.map +1 -1
  130. package/realtime-testing/src/setup-realtime-test.tsx +38 -28
  131. package/src/atom.ts +49 -31
  132. package/src/logger.ts +10 -5
  133. package/src/selector.ts +44 -25
  134. package/src/subscribe.ts +2 -1
  135. package/src/timeline.ts +4 -4
  136. package/src/transaction.ts +13 -17
  137. package/src/validators.ts +15 -9
  138. package/dist/chunk-H4Q5FTPZ.js +0 -11
  139. package/dist/chunk-H4Q5FTPZ.js.map +0 -1
  140. package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
@@ -1,10 +1,13 @@
1
1
  'use strict';
2
2
 
3
+ var internal = require('atom.io/internal');
4
+ var json = require('atom.io/json');
3
5
  var AtomIO = require('atom.io');
6
+ var realtime = require('atom.io/realtime');
7
+ var realtimeServer = require('atom.io/realtime-server');
8
+ var child_process = require('child_process');
4
9
  var data = require('atom.io/data');
5
10
  var setRtx = require('atom.io/transceivers/set-rtx');
6
- var internal = require('atom.io/internal');
7
- var json = require('atom.io/json');
8
11
 
9
12
  function _interopNamespace(e) {
10
13
  if (e && e.__esModule) return e;
@@ -45,20 +48,211 @@ var __spreadValues = (a, b) => {
45
48
  return a;
46
49
  };
47
50
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
48
- var userIndex = AtomIO.atom({
49
- key: `usersIndex`,
50
- mutable: true,
51
- default: () => new setRtx.SetRTX(),
52
- toJson: (set) => set.toJSON(),
53
- fromJson: (json) => setRtx.SetRTX.fromJSON(json)
51
+ var CustomSocket = class {
52
+ constructor(emit) {
53
+ this.emit = emit;
54
+ this.id = `no_id_retrieved`;
55
+ this.listeners = /* @__PURE__ */ new Map();
56
+ this.globalListeners = /* @__PURE__ */ new Set();
57
+ }
58
+ handleEvent(event, ...args) {
59
+ for (const listener of this.globalListeners) {
60
+ listener(event, ...args);
61
+ }
62
+ const listeners = this.listeners.get(event);
63
+ if (listeners) {
64
+ for (const listener of listeners) {
65
+ listener(...args);
66
+ }
67
+ }
68
+ }
69
+ on(event, listener) {
70
+ const listeners = this.listeners.get(event);
71
+ if (listeners) {
72
+ listeners.add(listener);
73
+ } else {
74
+ this.listeners.set(event, /* @__PURE__ */ new Set([listener]));
75
+ }
76
+ return this;
77
+ }
78
+ onAny(listener) {
79
+ this.globalListeners.add(listener);
80
+ return this;
81
+ }
82
+ off(event, listener) {
83
+ const listeners = this.listeners.get(event);
84
+ if (listeners) {
85
+ listeners.delete(listener);
86
+ }
87
+ return this;
88
+ }
89
+ offAny(listener) {
90
+ this.globalListeners.delete(listener);
91
+ return this;
92
+ }
93
+ };
94
+ var ChildSocket = class extends CustomSocket {
95
+ constructor(process2) {
96
+ super((event, ...args) => {
97
+ const stringifiedEvent = JSON.stringify([event, ...args]) + `
98
+ `;
99
+ this.process.stdin.write(stringifiedEvent);
100
+ return this;
101
+ });
102
+ this.id = `no_id_retrieved`;
103
+ this.process = process2;
104
+ this.process.stdout.on(
105
+ `data`,
106
+ (buffer) => {
107
+ const stringifiedEvent = buffer.toString();
108
+ const parsedEvent = json.parseJson(stringifiedEvent);
109
+ this.handleEvent(...parsedEvent);
110
+ }
111
+ );
112
+ if (process2.pid) {
113
+ this.id = process2.pid.toString();
114
+ }
115
+ }
116
+ };
117
+ var SubjectSocket = class extends CustomSocket {
118
+ constructor(id) {
119
+ super((...args) => {
120
+ this.out.next(args);
121
+ return this;
122
+ });
123
+ this.id = `no_id_retrieved`;
124
+ this.id = id;
125
+ this.in = new internal.Subject();
126
+ this.out = new internal.Subject();
127
+ this.in.subscribe(`socket`, (event) => {
128
+ this.handleEvent(...event);
129
+ });
130
+ }
131
+ };
132
+ var ParentSocket = class extends CustomSocket {
133
+ constructor() {
134
+ var _a;
135
+ super((event, ...args) => {
136
+ const stringifiedEvent = JSON.stringify([event, ...args]);
137
+ this.process.stdout.write(stringifiedEvent);
138
+ return this;
139
+ });
140
+ this.id = `no_id_retrieved`;
141
+ this.process = process;
142
+ this.process.stdin.resume();
143
+ this.queue = [];
144
+ this.relays = /* @__PURE__ */ new Map();
145
+ this.relayServices = [];
146
+ this.process.stdin.on(
147
+ `data`,
148
+ (chunk) => {
149
+ const buffer = chunk.toString();
150
+ this.queue.push(...buffer.split(`
151
+ `));
152
+ while (this.queue.length > 0) {
153
+ try {
154
+ const event = this.queue.shift();
155
+ if (event === ``)
156
+ continue;
157
+ const parsedEvent = json.parseJson(event);
158
+ this.handleEvent(...parsedEvent);
159
+ } catch (error) {
160
+ this.process.stderr.write(`\u274C ${error}
161
+ `);
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ );
167
+ process.on(`SIGINT`, () => process.exit(0));
168
+ if (process.pid) {
169
+ this.id = (_a = process.pid) == null ? void 0 : _a.toString();
170
+ }
171
+ this.on(`setup-relay`, (id) => {
172
+ const relay = new SubjectSocket(`relay:${id}`);
173
+ this.relays.set(id, relay);
174
+ for (const attachServices of this.relayServices) {
175
+ attachServices(relay);
176
+ }
177
+ this.on(`relay:${id}`, (...data) => {
178
+ relay.in.next(data);
179
+ });
180
+ relay.out.subscribe(`socket`, (data) => {
181
+ this.emit(...data);
182
+ });
183
+ });
184
+ }
185
+ relay(attachServices) {
186
+ this.relayServices.push(attachServices);
187
+ const relays = this.relays.values();
188
+ for (const relay of relays) {
189
+ attachServices(relay);
190
+ }
191
+ }
192
+ };
193
+ var redactorAtoms = AtomIO.selectorFamily({
194
+ key: `perspectiveRedactor`,
195
+ get: ({ userId, syncGroupKey }) => ({ get, find }) => {
196
+ const syncGroup = realtime.SyncGroup.existing.get(syncGroupKey);
197
+ if (!syncGroup) {
198
+ throw new Error(
199
+ `Tried to create a synchronizer for a sync group that does not exist.`
200
+ );
201
+ }
202
+ const userPerspectiveTokens = syncGroup.perspectives.flatMap(
203
+ ({ perspectiveAtoms, resourceAtoms }) => {
204
+ const userPerspectiveToken = find(perspectiveAtoms, userId);
205
+ const userPerspective = get(userPerspectiveToken);
206
+ const visibleTokens = [...userPerspective].map((subKey) => {
207
+ const resourceToken = find(resourceAtoms, subKey);
208
+ return resourceToken.key;
209
+ });
210
+ return visibleTokens;
211
+ }
212
+ );
213
+ const filterTransactionUpdate = (visible, transactionUpdate) => {
214
+ const updates = transactionUpdate.updates.filter((update) => {
215
+ if (`newValue` in update) {
216
+ return visible.includes(update.key);
217
+ }
218
+ return true;
219
+ }).map((update) => {
220
+ if (`updates` in update) {
221
+ return filterTransactionUpdate(visible, update);
222
+ }
223
+ return update;
224
+ });
225
+ const filtered = __spreadProps(__spreadValues({}, transactionUpdate), {
226
+ updates
227
+ });
228
+ return filtered;
229
+ };
230
+ const filter = (update) => {
231
+ const visibleKeys = syncGroup.globals.map(
232
+ (atomToken) => atomToken.key
233
+ );
234
+ visibleKeys.push(...userPerspectiveTokens);
235
+ return filterTransactionUpdate(visibleKeys, update);
236
+ };
237
+ return filter;
238
+ }
54
239
  });
55
- var usersOfSockets = data.join({
56
- key: `usersOfSockets`,
57
- between: [`user`, `socket`],
58
- cardinality: `1:1`
240
+ var redactedPerspectiveUpdateSelectors = AtomIO.selectorFamily({
241
+ key: `redactedPerspectiveUpdate`,
242
+ get: ({ userId, syncGroupKey, updateId }) => ({ get, find }) => {
243
+ const updateState = find(realtimeServer.completeUpdateAtoms, updateId);
244
+ const update = get(updateState);
245
+ const redactorKey = { userId, syncGroupKey };
246
+ const redactorState = find(redactorAtoms, redactorKey);
247
+ const redact = get(redactorState);
248
+ if (update) {
249
+ return redact(update);
250
+ }
251
+ return null;
252
+ }
59
253
  });
60
- var roomIndex = AtomIO.atom({
61
- key: `conclaveIndex`,
254
+ var roomIndex = AtomIO__namespace.atom({
255
+ key: `roomIndex`,
62
256
  default: () => new setRtx.SetRTX(),
63
257
  mutable: true,
64
258
  toJson: (set) => set.toJSON(),
@@ -75,7 +269,51 @@ var usersInRooms = data.join(
75
269
  },
76
270
  DEFAULT_USER_IN_ROOM_META
77
271
  );
78
- var completeUpdateAtoms = AtomIO.atomFamily({
272
+ var roomArgumentsAtoms = AtomIO__namespace.atomFamily({
273
+ key: `roomArguments`,
274
+ default: [`echo Hello World!`]
275
+ });
276
+ var roomSelectors = AtomIO__namespace.selectorFamily({
277
+ key: `room`,
278
+ get: (roomId) => ({ get, find }) => {
279
+ const argumentsState = find(roomArgumentsAtoms, roomId);
280
+ const args = get(argumentsState);
281
+ const [script, options] = args;
282
+ return new Promise((resolve) => {
283
+ const room = child_process.spawn(script, options, { env: process.env });
284
+ const resolver = (data) => {
285
+ if (data.toString() === `\u2728`) {
286
+ room.stdout.off(`data`, resolver);
287
+ resolve(room);
288
+ }
289
+ };
290
+ room.stdout.on(`data`, resolver);
291
+ });
292
+ }
293
+ });
294
+ var createRoomTX = AtomIO__namespace.transaction({
295
+ key: `createRoom`,
296
+ do: ({ get, set, find }, roomId, script, options) => {
297
+ const args = options ? [script, options] : [script];
298
+ const roomArgumentsState = find(roomArgumentsAtoms, roomId);
299
+ set(roomArgumentsState, args);
300
+ set(roomIndex, (s) => s.add(roomId));
301
+ const roomState = find(roomSelectors, roomId);
302
+ const room = get(roomState);
303
+ return room;
304
+ }
305
+ });
306
+ var joinRoomTX = AtomIO__namespace.transaction({
307
+ key: `joinRoom`,
308
+ do: (transactors, roomId, userId, enteredAtEpoch) => {
309
+ const meta = { enteredAtEpoch };
310
+ usersInRooms.transact(transactors, ({ relations }) => {
311
+ relations.set(roomId, userId, meta);
312
+ });
313
+ return meta;
314
+ }
315
+ });
316
+ var completeUpdateAtoms2 = AtomIO.atomFamily({
79
317
  key: `completeUpdate`,
80
318
  default: null
81
319
  });
@@ -86,7 +324,7 @@ var transactionRedactorAtoms = AtomIO.atomFamily({
86
324
  var redactedUpdateSelectors = AtomIO.selectorFamily({
87
325
  key: `redactedUpdate`,
88
326
  get: ([transactionKey, updateId]) => ({ get, find }) => {
89
- const update = get(find(completeUpdateAtoms, updateId));
327
+ const update = get(find(completeUpdateAtoms2, updateId));
90
328
  const { filter } = get(find(transactionRedactorAtoms, transactionKey));
91
329
  if (update && filter) {
92
330
  return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
@@ -94,64 +332,243 @@ var redactedUpdateSelectors = AtomIO.selectorFamily({
94
332
  return null;
95
333
  }
96
334
  });
97
- var userUnacknowledgedUpdatesAtoms = AtomIO.atomFamily({
335
+ var userUnacknowledgedQueues = AtomIO.atomFamily({
98
336
  key: `unacknowledgedUpdates`,
99
337
  default: () => []
100
338
  });
101
- var socketUnacknowledgedUpdatesSelectors = AtomIO.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 = AtomIO.atomFamily({
130
- key: `clientEpoch`,
339
+ var socketAtoms = AtomIO.atomFamily({
340
+ key: `sockets`,
131
341
  default: null
132
342
  });
133
- var socketEpochSelectors = AtomIO.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);
343
+ var socketIndex = AtomIO.atom({
344
+ key: `socketsIndex`,
345
+ mutable: true,
346
+ default: () => new setRtx.SetRTX(),
347
+ toJson: (set) => set.toJSON(),
348
+ fromJson: (json) => setRtx.SetRTX.fromJSON(json)
349
+ });
350
+ var userIndex = AtomIO.atom({
351
+ key: `usersIndex`,
352
+ mutable: true,
353
+ default: () => new setRtx.SetRTX(),
354
+ toJson: (set) => set.toJSON(),
355
+ fromJson: (json) => setRtx.SetRTX.fromJSON(json)
356
+ });
357
+ var usersOfSockets = data.join({
358
+ key: `usersOfSockets`,
359
+ between: [`user`, `socket`],
360
+ cardinality: `1:1`
361
+ });
362
+
363
+ // realtime-server/src/realtime-continuity-synchronizer.ts
364
+ function realtimeContinuitySynchronizer({
365
+ socket: initialSocket,
366
+ store = internal.IMPLICIT.STORE
367
+ }) {
368
+ return function synchronizer(continuity) {
369
+ let socket = initialSocket;
370
+ const continuityKey = continuity.key;
371
+ const userKeyState = internal.findInStore(
372
+ usersOfSockets.states.userKeyOfSocket,
373
+ socket.id,
374
+ store
375
+ );
376
+ const userKey = internal.getFromStore(userKeyState, store);
148
377
  if (!userKey) {
149
- return;
378
+ store.logger.error(
379
+ `\u274C`,
380
+ `continuity`,
381
+ continuityKey,
382
+ `Tried to create a synchronizer for a socket (${socket.id}) that is not connected to a user.`
383
+ );
384
+ return () => {
385
+ };
150
386
  }
151
- const userEpochState = find(userEpochAtoms, userKey);
152
- set(userEpochState, newEpoch);
153
- }
154
- });
387
+ const socketKeyState = internal.findInStore(
388
+ usersOfSockets.states.socketKeyOfUser,
389
+ userKey,
390
+ store
391
+ );
392
+ internal.subscribeToState(
393
+ socketKeyState,
394
+ ({ newValue: newSocketKey }) => {
395
+ store.logger.info(
396
+ `\u{1F44B}`,
397
+ `continuity`,
398
+ continuityKey,
399
+ `seeing ${userKey} on new socket ${newSocketKey}`
400
+ );
401
+ if (newSocketKey === null) {
402
+ store.logger.error(
403
+ `\u274C`,
404
+ `continuity`,
405
+ continuityKey,
406
+ `Tried to create a synchronizer for a user (${userKey}) that is not connected to a socket.`
407
+ );
408
+ return;
409
+ }
410
+ const newSocketState = internal.findInStore(socketAtoms, newSocketKey, store);
411
+ const newSocket = internal.getFromStore(newSocketState, store);
412
+ socket = newSocket;
413
+ },
414
+ `sync-continuity:${continuityKey}:${userKey}`,
415
+ store
416
+ );
417
+ const userUnacknowledgedQueue = internal.findInStore(
418
+ userUnacknowledgedQueues,
419
+ userKey,
420
+ store
421
+ );
422
+ const userUnacknowledgedUpdates = internal.getFromStore(
423
+ userUnacknowledgedQueue,
424
+ store
425
+ );
426
+ const unsubscribeFunctions = [];
427
+ const sendInitialPayload = () => {
428
+ var _a;
429
+ const initialPayload = [];
430
+ for (const atom3 of continuity.globals) {
431
+ initialPayload.push(atom3, internal.getFromStore(atom3, store));
432
+ }
433
+ for (const { perspectiveAtoms } of continuity.perspectives) {
434
+ const perspectiveTokensState = internal.findInStore(
435
+ perspectiveAtoms,
436
+ userKey,
437
+ store
438
+ );
439
+ const perspectiveTokens = internal.getFromStore(perspectiveTokensState, store);
440
+ for (const perspectiveToken of perspectiveTokens) {
441
+ const resource = internal.getFromStore(perspectiveToken, store);
442
+ initialPayload.push(perspectiveToken, resource);
443
+ }
444
+ }
445
+ const epoch = internal.isRootStore(store) ? (_a = store.transactionMeta.epoch.get(continuityKey)) != null ? _a : null : null;
446
+ socket == null ? void 0 : socket.emit(`continuity-init:${continuityKey}`, epoch, initialPayload);
447
+ for (const transaction2 of continuity.actions) {
448
+ const unsubscribeFromTransaction = internal.subscribeToTransaction(
449
+ transaction2,
450
+ (update) => {
451
+ const updateState = internal.findInStore(
452
+ completeUpdateAtoms2,
453
+ update.id,
454
+ store
455
+ );
456
+ internal.setIntoStore(updateState, update, store);
457
+ const redactedUpdateKey = {
458
+ userId: userKey,
459
+ syncGroupKey: continuityKey,
460
+ updateId: update.id
461
+ };
462
+ const redactedUpdateState = internal.findInStore(
463
+ redactedPerspectiveUpdateSelectors,
464
+ redactedUpdateKey,
465
+ store
466
+ );
467
+ const redactedUpdate = internal.getFromStore(redactedUpdateState, store);
468
+ internal.setIntoStore(
469
+ userUnacknowledgedQueue,
470
+ (updates) => {
471
+ if (redactedUpdate) {
472
+ updates.push(redactedUpdate);
473
+ updates.sort((a, b) => a.epoch - b.epoch);
474
+ }
475
+ return updates;
476
+ },
477
+ store
478
+ );
479
+ socket == null ? void 0 : socket.emit(
480
+ `tx-new:${continuityKey}`,
481
+ redactedUpdate
482
+ );
483
+ },
484
+ `sync-continuity:${continuityKey}:${userKey}`,
485
+ store
486
+ );
487
+ unsubscribeFunctions.push(unsubscribeFromTransaction);
488
+ }
489
+ };
490
+ socket.off(`get:${continuityKey}`, sendInitialPayload);
491
+ socket.on(`get:${continuityKey}`, sendInitialPayload);
492
+ const fillTransactionRequest = (update) => {
493
+ const transactionKey = update.key;
494
+ const updateId = update.id;
495
+ const performanceKey = `tx-run:${transactionKey}:${updateId}`;
496
+ const performanceKeyStart = `${performanceKey}:start`;
497
+ const performanceKeyEnd = `${performanceKey}:end`;
498
+ performance.mark(performanceKeyStart);
499
+ internal.actUponStore(
500
+ { type: `transaction`, key: transactionKey },
501
+ updateId,
502
+ store
503
+ )(...update.params);
504
+ performance.mark(performanceKeyEnd);
505
+ const metric = performance.measure(
506
+ performanceKey,
507
+ performanceKeyStart,
508
+ performanceKeyEnd
509
+ );
510
+ store == null ? void 0 : store.logger.info(
511
+ `\u{1F680}`,
512
+ `transaction`,
513
+ transactionKey,
514
+ updateId,
515
+ metric.duration
516
+ );
517
+ };
518
+ socket.off(`tx-run:${continuityKey}`, fillTransactionRequest);
519
+ socket.on(`tx-run:${continuityKey}`, fillTransactionRequest);
520
+ let i = 1;
521
+ let next = 1;
522
+ const retry = setInterval(() => {
523
+ const toEmit = userUnacknowledgedUpdates[0];
524
+ store.logger.info(
525
+ `\u{1F504}`,
526
+ `continuity`,
527
+ continuityKey,
528
+ `${store.config.name} retrying ${userKey} (${i}/${next})`,
529
+ socket == null ? void 0 : socket.id,
530
+ userUnacknowledgedUpdates
531
+ );
532
+ if (toEmit && i === next) {
533
+ socket == null ? void 0 : socket.emit(`tx-new:${continuityKey}`, toEmit);
534
+ next *= 2;
535
+ }
536
+ i++;
537
+ }, 250);
538
+ const trackClientAcknowledgement = (epoch) => {
539
+ var _a;
540
+ store.logger.info(
541
+ `\u{1F44D}`,
542
+ `continuity`,
543
+ continuityKey,
544
+ `${userKey} acknowledged epoch ${epoch}`
545
+ );
546
+ i = 1;
547
+ next = 1;
548
+ const isUnacknowledged = ((_a = userUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch;
549
+ if (isUnacknowledged) {
550
+ internal.setIntoStore(
551
+ userUnacknowledgedQueue,
552
+ (updates) => {
553
+ updates.shift();
554
+ return updates;
555
+ },
556
+ store
557
+ );
558
+ }
559
+ };
560
+ socket.off(`ack:${continuityKey}`, trackClientAcknowledgement);
561
+ socket.on(`ack:${continuityKey}`, trackClientAcknowledgement);
562
+ return () => {
563
+ clearInterval(retry);
564
+ for (const unsubscribe of unsubscribeFunctions)
565
+ unsubscribe();
566
+ socket == null ? void 0 : socket.off(`ack:${continuityKey}`, trackClientAcknowledgement);
567
+ socket == null ? void 0 : socket.off(`get:${continuityKey}`, sendInitialPayload);
568
+ socket == null ? void 0 : socket.off(`tx-run:${continuityKey}`, fillTransactionRequest);
569
+ };
570
+ };
571
+ }
155
572
  function realtimeStateProvider({
156
573
  socket,
157
574
  store = internal.IMPLICIT.STORE
@@ -201,89 +618,49 @@ function realtimeStateSynchronizer({
201
618
  };
202
619
  };
203
620
  }
204
- function realtimeFamilyProvider({
621
+ function realtimeAtomFamilyProvider({
205
622
  socket,
206
623
  store = internal.IMPLICIT.STORE
207
624
  }) {
208
625
  return function familyProvider(family, index) {
209
- const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
210
- const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
211
- const fillFamilyUnsubRequest = () => {
212
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
213
- unsub();
214
- }
215
- unsubFamilyCallbacksByKey.clear();
216
- socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
217
- };
218
- const fillSingleUnsubRequest = (key) => {
219
- socket.off(`unsub:${key}`, fillSingleUnsubRequest);
220
- const unsub = unsubSingleCallbacksByKey.get(key);
626
+ const unsubCallbacksByKey = /* @__PURE__ */ new Map();
627
+ const fillUnsubRequest = (key) => {
628
+ socket.off(`unsub:${key}`, fillUnsubRequest);
629
+ const unsub = unsubCallbacksByKey.get(key);
221
630
  if (unsub) {
222
631
  unsub();
223
- unsubSingleCallbacksByKey.delete(key);
632
+ unsubCallbacksByKey.delete(key);
224
633
  }
225
634
  };
226
635
  const fillSubRequest = (subKey) => {
227
- var _a;
228
- if (subKey === void 0) {
229
- const keys = internal.getFromStore(index, store);
230
- for (const key of keys) {
231
- const token = internal.findInStore(family, key, store);
232
- socket.emit(
233
- `serve:${family.key}`,
234
- json.parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
235
- internal.getFromStore(token, store)
636
+ const exposedSubKeys = internal.getFromStore(index, store);
637
+ for (const exposedSubKey of exposedSubKeys) {
638
+ if (json.stringifyJson(exposedSubKey) === json.stringifyJson(subKey)) {
639
+ const token = internal.findInStore(family, subKey, store);
640
+ socket.emit(`serve:${token.key}`, internal.getFromStore(token, store));
641
+ const unsubscribe = internal.subscribeToState(
642
+ token,
643
+ ({ newValue }) => {
644
+ socket.emit(`serve:${token.key}`, newValue);
645
+ },
646
+ `expose-family:${family.key}:${socket.id}`,
647
+ store
236
648
  );
649
+ unsubCallbacksByKey.set(token.key, unsubscribe);
650
+ socket.on(`unsub:${token.key}`, () => {
651
+ fillUnsubRequest(token.key);
652
+ });
653
+ break;
237
654
  }
238
- const unsubscribeFromTokenCreation = family.subject.subscribe(
239
- `expose-family:${socket.id}`,
240
- (token) => {
241
- const unsub = internal.subscribeToState(
242
- token,
243
- ({ newValue }) => {
244
- var _a2;
245
- socket.emit(
246
- `serve:${family.key}`,
247
- json.parseJson(((_a2 = token.family) == null ? void 0 : _a2.subKey) || `null`),
248
- newValue
249
- );
250
- },
251
- `expose-family:${family.key}:${socket.id}`,
252
- store
253
- );
254
- unsubFamilyCallbacksByKey.set(token.key, unsub);
255
- }
256
- );
257
- unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
258
- socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
259
- } else {
260
- const token = family(subKey);
261
- socket.emit(`serve:${token.key}`, internal.getFromStore(token, store));
262
- const unsubscribe = internal.subscribeToState(
263
- token,
264
- ({ newValue }) => {
265
- socket.emit(`serve:${token.key}`, newValue);
266
- },
267
- `expose-family:${family.key}:${socket.id}`,
268
- store
269
- );
270
- unsubSingleCallbacksByKey.set(token.key, unsubscribe);
271
- socket.on(`unsub:${token.key}`, () => {
272
- fillSingleUnsubRequest(token.key);
273
- });
274
655
  }
275
656
  };
276
657
  socket.on(`sub:${family.key}`, fillSubRequest);
277
658
  return () => {
278
659
  socket.off(`sub:${family.key}`, fillSubRequest);
279
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
280
- unsub();
281
- }
282
- for (const [, unsub] of unsubSingleCallbacksByKey) {
660
+ for (const [, unsub] of unsubCallbacksByKey) {
283
661
  unsub();
284
662
  }
285
- unsubFamilyCallbacksByKey.clear();
286
- unsubSingleCallbacksByKey.clear();
663
+ unsubCallbacksByKey.clear();
287
664
  };
288
665
  };
289
666
  }
@@ -324,110 +701,46 @@ function realtimeMutableFamilyProvider({
324
701
  store = internal.IMPLICIT.STORE
325
702
  }) {
326
703
  return function mutableFamilyProvider(family, index) {
327
- const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
328
- const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
329
- const fillFamilyUnsubRequest = () => {
330
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
331
- unsub();
332
- }
333
- unsubFamilyCallbacksByKey.clear();
334
- socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
335
- };
336
- const fillSingleUnsubRequest = (key) => {
337
- socket.off(`unsub:${key}`, fillSingleUnsubRequest);
338
- const unsub = unsubSingleCallbacksByKey.get(key);
704
+ const unsubCallbacksByKey = /* @__PURE__ */ new Map();
705
+ const fillUnsubRequest = (key) => {
706
+ socket.off(`unsub:${key}`, fillUnsubRequest);
707
+ const unsub = unsubCallbacksByKey.get(key);
339
708
  if (unsub) {
340
709
  unsub();
341
- unsubSingleCallbacksByKey.delete(key);
710
+ unsubCallbacksByKey.delete(key);
342
711
  }
343
712
  };
344
713
  const fillSubRequest = (subKey) => {
345
- var _a;
346
- if (subKey === void 0) {
347
- const keys = internal.getFromStore(index, store);
348
- for (const key of keys) {
349
- const token = internal.findInStore(family, key, store);
714
+ const exposedSubKeys = internal.getFromStore(index, store);
715
+ for (const exposedSubKey of exposedSubKeys) {
716
+ if (json.stringifyJson(exposedSubKey) === json.stringifyJson(subKey)) {
717
+ const token = internal.findInStore(family, subKey, store);
350
718
  const jsonToken = internal.getJsonToken(token);
351
- const trackerToken = internal.getUpdateToken(token);
352
- socket.emit(
353
- `init:${family.key}`,
354
- json.parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
355
- internal.getFromStore(jsonToken, store)
356
- );
357
- const unsubFromUpdates = internal.subscribeToState(
358
- trackerToken,
719
+ const updateToken = internal.getUpdateToken(token);
720
+ socket.emit(`init:${token.key}`, internal.getFromStore(jsonToken, store));
721
+ const unsubscribe = internal.subscribeToState(
722
+ updateToken,
359
723
  ({ newValue }) => {
360
- var _a2;
361
- socket.emit(
362
- `next:${token.key}`,
363
- json.parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
364
- newValue
365
- );
724
+ socket.emit(`next:${token.key}`, newValue);
366
725
  },
367
726
  `expose-family:${family.key}:${socket.id}`,
368
727
  store
369
728
  );
370
- unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
729
+ unsubCallbacksByKey.set(token.key, unsubscribe);
730
+ socket.on(`unsub:${token.key}`, () => {
731
+ fillUnsubRequest(token.key);
732
+ });
733
+ break;
371
734
  }
372
- const unsubscribeFromTokenCreation = family.subject.subscribe(
373
- `expose-family:${socket.id}`,
374
- (token) => {
375
- var _a2;
376
- const jsonToken = internal.getJsonToken(token);
377
- const trackerToken = internal.getUpdateToken(token);
378
- socket.emit(
379
- `init:${family.key}`,
380
- json.parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
381
- internal.getFromStore(jsonToken, store)
382
- );
383
- const unsubFromUpdates = internal.subscribeToState(
384
- trackerToken,
385
- ({ newValue }) => {
386
- var _a3;
387
- socket.emit(
388
- `next:${token.key}`,
389
- json.parseJson(((_a3 = jsonToken.family) == null ? void 0 : _a3.subKey) || `null`),
390
- newValue
391
- );
392
- },
393
- `expose-family:${family.key}:${socket.id}`,
394
- store
395
- );
396
- unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
397
- }
398
- );
399
- unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
400
- socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
401
- } else {
402
- const token = family(subKey);
403
- const jsonToken = internal.getJsonToken(token);
404
- const updateToken = internal.getUpdateToken(token);
405
- socket.emit(`init:${token.key}`, internal.getFromStore(jsonToken, store));
406
- const unsubscribe = internal.subscribeToState(
407
- updateToken,
408
- ({ newValue }) => {
409
- socket.emit(`next:${token.key}`, newValue);
410
- },
411
- `expose-family:${family.key}:${socket.id}`,
412
- store
413
- );
414
- unsubSingleCallbacksByKey.set(token.key, unsubscribe);
415
- socket.on(`unsub:${token.key}`, () => {
416
- fillSingleUnsubRequest(token.key);
417
- });
418
735
  }
419
736
  };
420
737
  socket.on(`sub:${family.key}`, fillSubRequest);
421
738
  return () => {
422
739
  socket.off(`sub:${family.key}`, fillSubRequest);
423
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
424
- unsub();
425
- }
426
- for (const [, unsub] of unsubSingleCallbacksByKey) {
740
+ for (const [, unsub] of unsubCallbacksByKey) {
427
741
  unsub();
428
742
  }
429
- unsubFamilyCallbacksByKey.clear();
430
- unsubSingleCallbacksByKey.clear();
743
+ unsubCallbacksByKey.clear();
431
744
  };
432
745
  };
433
746
  }
@@ -462,7 +775,7 @@ function realtimeActionReceiver({
462
775
  const performanceKeyStart = `${performanceKey}:start`;
463
776
  const performanceKeyEnd = `${performanceKey}:end`;
464
777
  performance.mark(performanceKeyStart);
465
- AtomIO__namespace.runTransaction(tx, update.id, store)(...update.params);
778
+ internal.actUponStore(tx, update.id, store)(...update.params);
466
779
  performance.mark(performanceKeyEnd);
467
780
  const metric = performance.measure(
468
781
  performanceKey,
@@ -480,19 +793,30 @@ function realtimeActionSynchronizer({
480
793
  store = internal.IMPLICIT.STORE
481
794
  }) {
482
795
  return function actionSynchronizer(tx, filter) {
796
+ internal.assignTransactionToContinuity(`default`, tx.key, store);
483
797
  const userKeyState = internal.findInStore(
484
798
  usersOfSockets.states.userKeyOfSocket,
485
799
  socket.id,
486
800
  store
487
801
  );
488
802
  const userKey = internal.getFromStore(userKeyState, store);
489
- const socketUnacknowledgedUpdatesState = internal.findInStore(
490
- socketUnacknowledgedUpdatesSelectors,
491
- socket.id,
803
+ if (!userKey) {
804
+ store.logger.error(
805
+ `\u274C`,
806
+ `transaction`,
807
+ tx.key,
808
+ `Tried to create a synchronizer for a socket (${socket.id}) that is not connected to a user.`
809
+ );
810
+ return () => {
811
+ };
812
+ }
813
+ const userUnacknowledgedQueue = internal.findInStore(
814
+ userUnacknowledgedQueues,
815
+ userKey,
492
816
  store
493
817
  );
494
- const socketUnacknowledgedUpdates = internal.getFromStore(
495
- socketUnacknowledgedUpdatesState,
818
+ const userUnacknowledgedUpdates = internal.getFromStore(
819
+ userUnacknowledgedQueue,
496
820
  store
497
821
  );
498
822
  if (filter) {
@@ -504,7 +828,7 @@ function realtimeActionSynchronizer({
504
828
  const performanceKeyStart = `${performanceKey}:start`;
505
829
  const performanceKeyEnd = `${performanceKey}:end`;
506
830
  performance.mark(performanceKeyStart);
507
- AtomIO__namespace.runTransaction(tx, update.id, store)(...update.params);
831
+ internal.actUponStore(tx, update.id, store)(...update.params);
508
832
  performance.mark(performanceKeyEnd);
509
833
  const metric = performance.measure(
510
834
  performanceKey,
@@ -520,14 +844,14 @@ function realtimeActionSynchronizer({
520
844
  unsubscribeFromTransaction = internal.subscribeToTransaction(
521
845
  tx,
522
846
  (update) => {
523
- const updateState = internal.findInStore(completeUpdateAtoms, update.id, store);
847
+ const updateState = internal.findInStore(completeUpdateAtoms2, update.id, store);
524
848
  internal.setIntoStore(updateState, update, store);
525
849
  const toEmit = filter ? internal.getFromStore(
526
850
  internal.findInStore(redactedUpdateSelectors, [tx.key, update.id], store),
527
851
  store
528
852
  ) : update;
529
853
  internal.setIntoStore(
530
- socketUnacknowledgedUpdatesState,
854
+ userUnacknowledgedQueue,
531
855
  (updates) => {
532
856
  if (toEmit) {
533
857
  updates.push(toEmit);
@@ -548,8 +872,7 @@ function realtimeActionSynchronizer({
548
872
  let i = 1;
549
873
  let next = 1;
550
874
  const retry = setInterval(() => {
551
- const toEmit = socketUnacknowledgedUpdates[0];
552
- console.log(userKey, socketUnacknowledgedUpdates);
875
+ const toEmit = userUnacknowledgedUpdates[0];
553
876
  if (toEmit && i === next) {
554
877
  socket.emit(`tx-new:${tx.key}`, toEmit);
555
878
  next *= 2;
@@ -560,15 +883,9 @@ function realtimeActionSynchronizer({
560
883
  var _a;
561
884
  i = 1;
562
885
  next = 1;
563
- const socketEpochState = internal.findInStore(
564
- socketEpochSelectors,
565
- socket.id,
566
- store
567
- );
568
- internal.setIntoStore(socketEpochState, epoch, store);
569
- if (((_a = socketUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch) {
886
+ if (((_a = userUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch) {
570
887
  internal.setIntoStore(
571
- socketUnacknowledgedUpdatesState,
888
+ userUnacknowledgedQueue,
572
889
  (updates) => {
573
890
  updates.shift();
574
891
  return updates;
@@ -590,24 +907,33 @@ function realtimeActionSynchronizer({
590
907
  };
591
908
  }
592
909
 
910
+ exports.ChildSocket = ChildSocket;
911
+ exports.CustomSocket = CustomSocket;
593
912
  exports.DEFAULT_USER_IN_ROOM_META = DEFAULT_USER_IN_ROOM_META;
594
- exports.completeUpdateAtoms = completeUpdateAtoms;
913
+ exports.ParentSocket = ParentSocket;
914
+ exports.SubjectSocket = SubjectSocket;
915
+ exports.completeUpdateAtoms = completeUpdateAtoms2;
916
+ exports.createRoomTX = createRoomTX;
917
+ exports.joinRoomTX = joinRoomTX;
595
918
  exports.realtimeActionReceiver = realtimeActionReceiver;
596
919
  exports.realtimeActionSynchronizer = realtimeActionSynchronizer;
597
- exports.realtimeFamilyProvider = realtimeFamilyProvider;
920
+ exports.realtimeAtomFamilyProvider = realtimeAtomFamilyProvider;
921
+ exports.realtimeContinuitySynchronizer = realtimeContinuitySynchronizer;
598
922
  exports.realtimeMutableFamilyProvider = realtimeMutableFamilyProvider;
599
923
  exports.realtimeMutableProvider = realtimeMutableProvider;
600
924
  exports.realtimeStateProvider = realtimeStateProvider;
601
925
  exports.realtimeStateReceiver = realtimeStateReceiver;
602
926
  exports.realtimeStateSynchronizer = realtimeStateSynchronizer;
927
+ exports.redactedPerspectiveUpdateSelectors = redactedPerspectiveUpdateSelectors;
603
928
  exports.redactedUpdateSelectors = redactedUpdateSelectors;
929
+ exports.roomArgumentsAtoms = roomArgumentsAtoms;
604
930
  exports.roomIndex = roomIndex;
605
- exports.socketEpochSelectors = socketEpochSelectors;
606
- exports.socketUnacknowledgedUpdatesSelectors = socketUnacknowledgedUpdatesSelectors;
931
+ exports.roomSelectors = roomSelectors;
932
+ exports.socketAtoms = socketAtoms;
933
+ exports.socketIndex = socketIndex;
607
934
  exports.transactionRedactorAtoms = transactionRedactorAtoms;
608
- exports.userEpochAtoms = userEpochAtoms;
609
935
  exports.userIndex = userIndex;
610
- exports.userUnacknowledgedUpdatesAtoms = userUnacknowledgedUpdatesAtoms;
936
+ exports.userUnacknowledgedQueues = userUnacknowledgedQueues;
611
937
  exports.usersInRooms = usersInRooms;
612
938
  exports.usersOfSockets = usersOfSockets;
613
939
  //# sourceMappingURL=out.js.map