atom.io 0.16.3 → 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 (162) 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 +36 -57
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +64 -53
  14. package/dist/index.js +15 -36
  15. package/dist/index.js.map +1 -1
  16. package/internal/dist/index.cjs +211 -81
  17. package/internal/dist/index.cjs.map +1 -1
  18. package/internal/dist/index.d.ts +100 -72
  19. package/internal/dist/index.js +200 -75
  20. package/internal/dist/index.js.map +1 -1
  21. package/internal/src/arbitrary.ts +3 -0
  22. package/internal/src/atom/create-regular-atom.ts +2 -3
  23. package/internal/src/caching.ts +8 -6
  24. package/internal/src/families/find-in-store.ts +16 -0
  25. package/internal/src/get-environment-data.ts +4 -7
  26. package/internal/src/get-state/get-from-store.ts +14 -0
  27. package/internal/src/get-state/index.ts +2 -0
  28. package/internal/src/{read-or-compute-value.ts → get-state/read-or-compute-value.ts} +3 -3
  29. package/internal/src/index.ts +7 -6
  30. package/internal/src/ingest-updates/ingest-atom-update.ts +2 -2
  31. package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
  32. package/internal/src/mutable/create-mutable-atom.ts +3 -4
  33. package/internal/src/mutable/tracker.ts +18 -13
  34. package/internal/src/selector/create-standalone-selector.ts +0 -2
  35. package/internal/src/selector/register-selector.ts +1 -1
  36. package/internal/src/set-state/index.ts +1 -0
  37. package/internal/src/set-state/set-atom.ts +15 -19
  38. package/internal/src/set-state/set-into-store.ts +24 -0
  39. package/internal/src/store/store.ts +14 -2
  40. package/internal/src/store/withdraw.ts +72 -2
  41. package/internal/src/subscribe/subscribe-to-root-atoms.ts +1 -1
  42. package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
  43. package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
  44. package/internal/src/timeline/create-timeline.ts +12 -1
  45. package/internal/src/transaction/act-upon-store.ts +19 -0
  46. package/internal/src/transaction/apply-transaction.ts +7 -1
  47. package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
  48. package/internal/src/transaction/build-transaction.ts +11 -8
  49. package/internal/src/transaction/create-transaction.ts +1 -1
  50. package/internal/src/transaction/get-epoch-number.ts +40 -0
  51. package/internal/src/transaction/index.ts +10 -1
  52. package/internal/src/transaction/set-epoch-number.ts +31 -0
  53. package/introspection/dist/index.cjs.map +1 -1
  54. package/introspection/dist/index.d.ts +3 -3
  55. package/introspection/dist/index.js.map +1 -1
  56. package/introspection/src/attach-introspection-states.ts +6 -2
  57. package/introspection/src/attach-timeline-family.ts +5 -2
  58. package/introspection/src/attach-transaction-logs.ts +2 -2
  59. package/json/dist/index.d.ts +3 -1
  60. package/json/src/index.ts +6 -2
  61. package/package.json +24 -13
  62. package/react/dist/index.cjs +3 -3
  63. package/react/dist/index.cjs.map +1 -1
  64. package/react/dist/index.d.ts +1 -1
  65. package/react/dist/index.js +5 -5
  66. package/react/dist/index.js.map +1 -1
  67. package/react/src/use-i.ts +2 -3
  68. package/react/src/use-json.ts +1 -1
  69. package/react/src/use-o.ts +3 -4
  70. package/react-devtools/dist/index.cjs +131 -134
  71. package/react-devtools/dist/index.cjs.map +1 -1
  72. package/react-devtools/dist/index.css +2 -2
  73. package/react-devtools/dist/index.css.map +1 -1
  74. package/react-devtools/dist/index.d.ts +3 -3
  75. package/react-devtools/dist/index.js +103 -106
  76. package/react-devtools/dist/index.js.map +1 -1
  77. package/react-devtools/src/StateEditor.tsx +6 -6
  78. package/react-devtools/src/StateIndex.tsx +2 -5
  79. package/react-devtools/src/TimelineIndex.tsx +3 -3
  80. package/react-devtools/src/TransactionIndex.tsx +9 -8
  81. package/react-devtools/src/Updates.tsx +1 -1
  82. package/react-devtools/src/index.ts +4 -4
  83. package/realtime/dist/index.cjs +72 -0
  84. package/realtime/dist/index.cjs.map +1 -0
  85. package/realtime/dist/index.d.ts +39 -0
  86. package/realtime/dist/index.js +68 -0
  87. package/realtime/dist/index.js.map +1 -0
  88. package/realtime/package.json +16 -0
  89. package/realtime/src/index.ts +1 -0
  90. package/realtime/src/realtime-continuity.ts +152 -0
  91. package/realtime-client/dist/index.cjs +403 -59
  92. package/realtime-client/dist/index.cjs.map +1 -1
  93. package/realtime-client/dist/index.d.ts +16 -9
  94. package/realtime-client/dist/index.js +114 -48
  95. package/realtime-client/dist/index.js.map +1 -1
  96. package/realtime-client/src/index.ts +8 -5
  97. package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +5 -5
  98. package/realtime-client/src/{pull-state.ts → pull-atom.ts} +5 -5
  99. package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +5 -5
  100. package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +5 -5
  101. package/realtime-client/src/pull-selector-family-member.ts +42 -0
  102. package/realtime-client/src/pull-selector.ts +38 -0
  103. package/realtime-client/src/realtime-client-stores/client-main-store.ts +2 -2
  104. package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
  105. package/realtime-client/src/sync-continuity.ts +321 -0
  106. package/realtime-client/src/sync-server-action.ts +22 -21
  107. package/realtime-client/src/sync-state.ts +3 -3
  108. package/realtime-react/dist/index.cjs +330 -15
  109. package/realtime-react/dist/index.cjs.map +1 -1
  110. package/realtime-react/dist/index.d.ts +26 -6
  111. package/realtime-react/dist/index.js +43 -12
  112. package/realtime-react/dist/index.js.map +1 -1
  113. package/realtime-react/src/index.ts +6 -3
  114. package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
  115. package/realtime-react/src/{use-pull.ts → use-pull-atom.ts} +6 -5
  116. package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
  117. package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
  118. package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
  119. package/realtime-react/src/{use-pull-family-member.ts → use-pull-selector.ts} +7 -5
  120. package/realtime-react/src/use-push.ts +3 -2
  121. package/realtime-react/src/use-server-action.ts +3 -2
  122. package/realtime-react/src/use-sync-continuity.ts +12 -0
  123. package/realtime-react/src/use-sync-server-action.ts +3 -2
  124. package/realtime-server/dist/index.cjs +582 -256
  125. package/realtime-server/dist/index.cjs.map +1 -1
  126. package/realtime-server/dist/index.d.ts +124 -49
  127. package/realtime-server/dist/index.js +566 -249
  128. package/realtime-server/dist/index.js.map +1 -1
  129. package/realtime-server/src/index.ts +18 -2
  130. package/realtime-server/src/ipc-socket.ts +230 -0
  131. package/realtime-server/src/realtime-action-receiver.ts +8 -5
  132. package/realtime-server/src/realtime-action-synchronizer.ts +53 -35
  133. package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
  134. package/realtime-server/src/realtime-family-provider.ts +37 -73
  135. package/realtime-server/src/realtime-mutable-family-provider.ts +26 -87
  136. package/realtime-server/src/realtime-mutable-provider.ts +3 -2
  137. package/realtime-server/src/realtime-server-stores/index.ts +3 -1
  138. package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +90 -0
  139. package/realtime-server/src/realtime-server-stores/server-room-store.ts +97 -0
  140. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +2 -72
  141. package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
  142. package/realtime-server/src/realtime-state-provider.ts +3 -3
  143. package/realtime-server/src/realtime-state-receiver.ts +2 -3
  144. package/realtime-server/src/realtime-state-synchronizer.ts +3 -3
  145. package/realtime-testing/dist/index.cjs +28 -28
  146. package/realtime-testing/dist/index.cjs.map +1 -1
  147. package/realtime-testing/dist/index.js +28 -27
  148. package/realtime-testing/dist/index.js.map +1 -1
  149. package/realtime-testing/src/setup-realtime-test.tsx +38 -28
  150. package/src/atom.ts +49 -31
  151. package/src/get-state.ts +2 -11
  152. package/src/logger.ts +10 -5
  153. package/src/selector.ts +44 -25
  154. package/src/set-state.ts +1 -13
  155. package/src/silo.ts +7 -3
  156. package/src/subscribe.ts +2 -1
  157. package/src/timeline.ts +4 -4
  158. package/src/transaction.ts +13 -17
  159. package/src/validators.ts +15 -9
  160. package/dist/chunk-H4Q5FTPZ.js +0 -11
  161. package/dist/chunk-H4Q5FTPZ.js.map +0 -1
  162. package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
@@ -1,25 +1,219 @@
1
1
  import { __spreadProps, __spreadValues } from '../../dist/chunk-PZLG2HP3.js';
2
- import * as AtomIO7 from 'atom.io';
3
- import { atom, atomFamily, selectorFamily, setState } from 'atom.io';
2
+ import { Subject, findInStore, getFromStore, subscribeToState, IMPLICIT, getJsonToken, getUpdateToken, assignTransactionToContinuity, setIntoStore, isRootStore, subscribeToTransaction, actUponStore } from 'atom.io/internal';
3
+ import { parseJson, stringifyJson } from 'atom.io/json';
4
+ import * as AtomIO from 'atom.io';
5
+ import { selectorFamily, atomFamily, atom } from 'atom.io';
6
+ import { SyncGroup } from 'atom.io/realtime';
7
+ import { completeUpdateAtoms } from 'atom.io/realtime-server';
8
+ import { spawn } from 'child_process';
4
9
  import { join } from 'atom.io/data';
5
10
  import { SetRTX } from 'atom.io/transceivers/set-rtx';
6
- import { IMPLICIT, getJsonToken, getUpdateToken, findInStore, subscribeToState, subscribeToTransaction } from 'atom.io/internal';
7
- import { parseJson } from 'atom.io/json';
8
11
 
9
- var userIndex = atom({
10
- key: `usersIndex`,
11
- mutable: true,
12
- default: () => new SetRTX(),
13
- toJson: (set) => set.toJSON(),
14
- fromJson: (json) => SetRTX.fromJSON(json)
12
+ var CustomSocket = class {
13
+ constructor(emit) {
14
+ this.emit = emit;
15
+ this.id = `no_id_retrieved`;
16
+ this.listeners = /* @__PURE__ */ new Map();
17
+ this.globalListeners = /* @__PURE__ */ new Set();
18
+ }
19
+ handleEvent(event, ...args) {
20
+ for (const listener of this.globalListeners) {
21
+ listener(event, ...args);
22
+ }
23
+ const listeners = this.listeners.get(event);
24
+ if (listeners) {
25
+ for (const listener of listeners) {
26
+ listener(...args);
27
+ }
28
+ }
29
+ }
30
+ on(event, listener) {
31
+ const listeners = this.listeners.get(event);
32
+ if (listeners) {
33
+ listeners.add(listener);
34
+ } else {
35
+ this.listeners.set(event, /* @__PURE__ */ new Set([listener]));
36
+ }
37
+ return this;
38
+ }
39
+ onAny(listener) {
40
+ this.globalListeners.add(listener);
41
+ return this;
42
+ }
43
+ off(event, listener) {
44
+ const listeners = this.listeners.get(event);
45
+ if (listeners) {
46
+ listeners.delete(listener);
47
+ }
48
+ return this;
49
+ }
50
+ offAny(listener) {
51
+ this.globalListeners.delete(listener);
52
+ return this;
53
+ }
54
+ };
55
+ var ChildSocket = class extends CustomSocket {
56
+ constructor(process2) {
57
+ super((event, ...args) => {
58
+ const stringifiedEvent = JSON.stringify([event, ...args]) + `
59
+ `;
60
+ this.process.stdin.write(stringifiedEvent);
61
+ return this;
62
+ });
63
+ this.id = `no_id_retrieved`;
64
+ this.process = process2;
65
+ this.process.stdout.on(
66
+ `data`,
67
+ (buffer) => {
68
+ const stringifiedEvent = buffer.toString();
69
+ const parsedEvent = parseJson(stringifiedEvent);
70
+ this.handleEvent(...parsedEvent);
71
+ }
72
+ );
73
+ if (process2.pid) {
74
+ this.id = process2.pid.toString();
75
+ }
76
+ }
77
+ };
78
+ var SubjectSocket = class extends CustomSocket {
79
+ constructor(id) {
80
+ super((...args) => {
81
+ this.out.next(args);
82
+ return this;
83
+ });
84
+ this.id = `no_id_retrieved`;
85
+ this.id = id;
86
+ this.in = new Subject();
87
+ this.out = new Subject();
88
+ this.in.subscribe(`socket`, (event) => {
89
+ this.handleEvent(...event);
90
+ });
91
+ }
92
+ };
93
+ var ParentSocket = class extends CustomSocket {
94
+ constructor() {
95
+ var _a;
96
+ super((event, ...args) => {
97
+ const stringifiedEvent = JSON.stringify([event, ...args]);
98
+ this.process.stdout.write(stringifiedEvent);
99
+ return this;
100
+ });
101
+ this.id = `no_id_retrieved`;
102
+ this.process = process;
103
+ this.process.stdin.resume();
104
+ this.queue = [];
105
+ this.relays = /* @__PURE__ */ new Map();
106
+ this.relayServices = [];
107
+ this.process.stdin.on(
108
+ `data`,
109
+ (chunk) => {
110
+ const buffer = chunk.toString();
111
+ this.queue.push(...buffer.split(`
112
+ `));
113
+ while (this.queue.length > 0) {
114
+ try {
115
+ const event = this.queue.shift();
116
+ if (event === ``)
117
+ continue;
118
+ const parsedEvent = parseJson(event);
119
+ this.handleEvent(...parsedEvent);
120
+ } catch (error) {
121
+ this.process.stderr.write(`\u274C ${error}
122
+ `);
123
+ break;
124
+ }
125
+ }
126
+ }
127
+ );
128
+ process.on(`SIGINT`, () => process.exit(0));
129
+ if (process.pid) {
130
+ this.id = (_a = process.pid) == null ? void 0 : _a.toString();
131
+ }
132
+ this.on(`setup-relay`, (id) => {
133
+ const relay = new SubjectSocket(`relay:${id}`);
134
+ this.relays.set(id, relay);
135
+ for (const attachServices of this.relayServices) {
136
+ attachServices(relay);
137
+ }
138
+ this.on(`relay:${id}`, (...data) => {
139
+ relay.in.next(data);
140
+ });
141
+ relay.out.subscribe(`socket`, (data) => {
142
+ this.emit(...data);
143
+ });
144
+ });
145
+ }
146
+ relay(attachServices) {
147
+ this.relayServices.push(attachServices);
148
+ const relays = this.relays.values();
149
+ for (const relay of relays) {
150
+ attachServices(relay);
151
+ }
152
+ }
153
+ };
154
+ var redactorAtoms = selectorFamily({
155
+ key: `perspectiveRedactor`,
156
+ get: ({ userId, syncGroupKey }) => ({ get, find }) => {
157
+ const syncGroup = SyncGroup.existing.get(syncGroupKey);
158
+ if (!syncGroup) {
159
+ throw new Error(
160
+ `Tried to create a synchronizer for a sync group that does not exist.`
161
+ );
162
+ }
163
+ const userPerspectiveTokens = syncGroup.perspectives.flatMap(
164
+ ({ perspectiveAtoms, resourceAtoms }) => {
165
+ const userPerspectiveToken = find(perspectiveAtoms, userId);
166
+ const userPerspective = get(userPerspectiveToken);
167
+ const visibleTokens = [...userPerspective].map((subKey) => {
168
+ const resourceToken = find(resourceAtoms, subKey);
169
+ return resourceToken.key;
170
+ });
171
+ return visibleTokens;
172
+ }
173
+ );
174
+ const filterTransactionUpdate = (visible, transactionUpdate) => {
175
+ const updates = transactionUpdate.updates.filter((update) => {
176
+ if (`newValue` in update) {
177
+ return visible.includes(update.key);
178
+ }
179
+ return true;
180
+ }).map((update) => {
181
+ if (`updates` in update) {
182
+ return filterTransactionUpdate(visible, update);
183
+ }
184
+ return update;
185
+ });
186
+ const filtered = __spreadProps(__spreadValues({}, transactionUpdate), {
187
+ updates
188
+ });
189
+ return filtered;
190
+ };
191
+ const filter = (update) => {
192
+ const visibleKeys = syncGroup.globals.map(
193
+ (atomToken) => atomToken.key
194
+ );
195
+ visibleKeys.push(...userPerspectiveTokens);
196
+ return filterTransactionUpdate(visibleKeys, update);
197
+ };
198
+ return filter;
199
+ }
15
200
  });
16
- var usersOfSockets = join({
17
- key: `usersOfSockets`,
18
- between: [`user`, `socket`],
19
- cardinality: `1:1`
201
+ var redactedPerspectiveUpdateSelectors = selectorFamily({
202
+ key: `redactedPerspectiveUpdate`,
203
+ get: ({ userId, syncGroupKey, updateId }) => ({ get, find }) => {
204
+ const updateState = find(completeUpdateAtoms, updateId);
205
+ const update = get(updateState);
206
+ const redactorKey = { userId, syncGroupKey };
207
+ const redactorState = find(redactorAtoms, redactorKey);
208
+ const redact = get(redactorState);
209
+ if (update) {
210
+ return redact(update);
211
+ }
212
+ return null;
213
+ }
20
214
  });
21
- var roomIndex = atom({
22
- key: `conclaveIndex`,
215
+ var roomIndex = AtomIO.atom({
216
+ key: `roomIndex`,
23
217
  default: () => new SetRTX(),
24
218
  mutable: true,
25
219
  toJson: (set) => set.toJSON(),
@@ -36,7 +230,51 @@ var usersInRooms = join(
36
230
  },
37
231
  DEFAULT_USER_IN_ROOM_META
38
232
  );
39
- var completeUpdateAtoms = atomFamily({
233
+ var roomArgumentsAtoms = AtomIO.atomFamily({
234
+ key: `roomArguments`,
235
+ default: [`echo Hello World!`]
236
+ });
237
+ var roomSelectors = AtomIO.selectorFamily({
238
+ key: `room`,
239
+ get: (roomId) => ({ get, find }) => {
240
+ const argumentsState = find(roomArgumentsAtoms, roomId);
241
+ const args = get(argumentsState);
242
+ const [script, options] = args;
243
+ return new Promise((resolve) => {
244
+ const room = spawn(script, options, { env: process.env });
245
+ const resolver = (data) => {
246
+ if (data.toString() === `\u2728`) {
247
+ room.stdout.off(`data`, resolver);
248
+ resolve(room);
249
+ }
250
+ };
251
+ room.stdout.on(`data`, resolver);
252
+ });
253
+ }
254
+ });
255
+ var createRoomTX = AtomIO.transaction({
256
+ key: `createRoom`,
257
+ do: ({ get, set, find }, roomId, script, options) => {
258
+ const args = options ? [script, options] : [script];
259
+ const roomArgumentsState = find(roomArgumentsAtoms, roomId);
260
+ set(roomArgumentsState, args);
261
+ set(roomIndex, (s) => s.add(roomId));
262
+ const roomState = find(roomSelectors, roomId);
263
+ const room = get(roomState);
264
+ return room;
265
+ }
266
+ });
267
+ var joinRoomTX = AtomIO.transaction({
268
+ key: `joinRoom`,
269
+ do: (transactors, roomId, userId, enteredAtEpoch) => {
270
+ const meta = { enteredAtEpoch };
271
+ usersInRooms.transact(transactors, ({ relations }) => {
272
+ relations.set(roomId, userId, meta);
273
+ });
274
+ return meta;
275
+ }
276
+ });
277
+ var completeUpdateAtoms2 = atomFamily({
40
278
  key: `completeUpdate`,
41
279
  default: null
42
280
  });
@@ -47,7 +285,7 @@ var transactionRedactorAtoms = atomFamily({
47
285
  var redactedUpdateSelectors = selectorFamily({
48
286
  key: `redactedUpdate`,
49
287
  get: ([transactionKey, updateId]) => ({ get, find }) => {
50
- const update = get(find(completeUpdateAtoms, updateId));
288
+ const update = get(find(completeUpdateAtoms2, updateId));
51
289
  const { filter } = get(find(transactionRedactorAtoms, transactionKey));
52
290
  if (update && filter) {
53
291
  return __spreadProps(__spreadValues({}, update), { updates: filter(update.updates) });
@@ -55,64 +293,243 @@ var redactedUpdateSelectors = selectorFamily({
55
293
  return null;
56
294
  }
57
295
  });
58
- var userUnacknowledgedUpdatesAtoms = atomFamily({
296
+ var userUnacknowledgedQueues = atomFamily({
59
297
  key: `unacknowledgedUpdates`,
60
298
  default: () => []
61
299
  });
62
- var socketUnacknowledgedUpdatesSelectors = selectorFamily({
63
- key: `socketUnacknowledgedUpdates`,
64
- get: (socketId) => ({ get, find }) => {
65
- const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
66
- const userKey = get(userKeyState);
67
- if (!userKey) {
68
- return [];
69
- }
70
- const unacknowledgedUpdatesState = find(
71
- userUnacknowledgedUpdatesAtoms,
72
- userKey
73
- );
74
- const unacknowledgedUpdates = get(unacknowledgedUpdatesState);
75
- return unacknowledgedUpdates;
76
- },
77
- set: (socketId) => ({ set, get, find }, newUpdates) => {
78
- const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
79
- const userKey = get(userKeyState);
80
- if (!userKey) {
81
- return;
82
- }
83
- const unacknowledgedUpdatesState = find(
84
- userUnacknowledgedUpdatesAtoms,
85
- userKey
86
- );
87
- set(unacknowledgedUpdatesState, newUpdates);
88
- }
89
- });
90
- var userEpochAtoms = atomFamily({
91
- key: `clientEpoch`,
300
+ var socketAtoms = atomFamily({
301
+ key: `sockets`,
92
302
  default: null
93
303
  });
94
- var socketEpochSelectors = selectorFamily({
95
- key: `socketEpoch`,
96
- get: (socketId) => ({ get, find }) => {
97
- const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
98
- const userKey = get(userKeyState);
99
- if (!userKey) {
100
- return null;
101
- }
102
- const userEpochState = find(userEpochAtoms, userKey);
103
- const userEpoch = get(userEpochState);
104
- return userEpoch;
105
- },
106
- set: (socketId) => ({ set, get, find }, newEpoch) => {
107
- const userKeyState = find(usersOfSockets.states.userKeyOfSocket, socketId);
108
- const userKey = get(userKeyState);
304
+ var socketIndex = atom({
305
+ key: `socketsIndex`,
306
+ mutable: true,
307
+ default: () => new SetRTX(),
308
+ toJson: (set) => set.toJSON(),
309
+ fromJson: (json) => SetRTX.fromJSON(json)
310
+ });
311
+ var userIndex = atom({
312
+ key: `usersIndex`,
313
+ mutable: true,
314
+ default: () => new SetRTX(),
315
+ toJson: (set) => set.toJSON(),
316
+ fromJson: (json) => SetRTX.fromJSON(json)
317
+ });
318
+ var usersOfSockets = join({
319
+ key: `usersOfSockets`,
320
+ between: [`user`, `socket`],
321
+ cardinality: `1:1`
322
+ });
323
+
324
+ // realtime-server/src/realtime-continuity-synchronizer.ts
325
+ function realtimeContinuitySynchronizer({
326
+ socket: initialSocket,
327
+ store = IMPLICIT.STORE
328
+ }) {
329
+ return function synchronizer(continuity) {
330
+ let socket = initialSocket;
331
+ const continuityKey = continuity.key;
332
+ const userKeyState = findInStore(
333
+ usersOfSockets.states.userKeyOfSocket,
334
+ socket.id,
335
+ store
336
+ );
337
+ const userKey = getFromStore(userKeyState, store);
109
338
  if (!userKey) {
110
- return;
339
+ store.logger.error(
340
+ `\u274C`,
341
+ `continuity`,
342
+ continuityKey,
343
+ `Tried to create a synchronizer for a socket (${socket.id}) that is not connected to a user.`
344
+ );
345
+ return () => {
346
+ };
111
347
  }
112
- const userEpochState = find(userEpochAtoms, userKey);
113
- set(userEpochState, newEpoch);
114
- }
115
- });
348
+ const socketKeyState = findInStore(
349
+ usersOfSockets.states.socketKeyOfUser,
350
+ userKey,
351
+ store
352
+ );
353
+ subscribeToState(
354
+ socketKeyState,
355
+ ({ newValue: newSocketKey }) => {
356
+ store.logger.info(
357
+ `\u{1F44B}`,
358
+ `continuity`,
359
+ continuityKey,
360
+ `seeing ${userKey} on new socket ${newSocketKey}`
361
+ );
362
+ if (newSocketKey === null) {
363
+ store.logger.error(
364
+ `\u274C`,
365
+ `continuity`,
366
+ continuityKey,
367
+ `Tried to create a synchronizer for a user (${userKey}) that is not connected to a socket.`
368
+ );
369
+ return;
370
+ }
371
+ const newSocketState = findInStore(socketAtoms, newSocketKey, store);
372
+ const newSocket = getFromStore(newSocketState, store);
373
+ socket = newSocket;
374
+ },
375
+ `sync-continuity:${continuityKey}:${userKey}`,
376
+ store
377
+ );
378
+ const userUnacknowledgedQueue = findInStore(
379
+ userUnacknowledgedQueues,
380
+ userKey,
381
+ store
382
+ );
383
+ const userUnacknowledgedUpdates = getFromStore(
384
+ userUnacknowledgedQueue,
385
+ store
386
+ );
387
+ const unsubscribeFunctions = [];
388
+ const sendInitialPayload = () => {
389
+ var _a;
390
+ const initialPayload = [];
391
+ for (const atom3 of continuity.globals) {
392
+ initialPayload.push(atom3, getFromStore(atom3, store));
393
+ }
394
+ for (const { perspectiveAtoms } of continuity.perspectives) {
395
+ const perspectiveTokensState = findInStore(
396
+ perspectiveAtoms,
397
+ userKey,
398
+ store
399
+ );
400
+ const perspectiveTokens = getFromStore(perspectiveTokensState, store);
401
+ for (const perspectiveToken of perspectiveTokens) {
402
+ const resource = getFromStore(perspectiveToken, store);
403
+ initialPayload.push(perspectiveToken, resource);
404
+ }
405
+ }
406
+ const epoch = isRootStore(store) ? (_a = store.transactionMeta.epoch.get(continuityKey)) != null ? _a : null : null;
407
+ socket == null ? void 0 : socket.emit(`continuity-init:${continuityKey}`, epoch, initialPayload);
408
+ for (const transaction2 of continuity.actions) {
409
+ const unsubscribeFromTransaction = subscribeToTransaction(
410
+ transaction2,
411
+ (update) => {
412
+ const updateState = findInStore(
413
+ completeUpdateAtoms2,
414
+ update.id,
415
+ store
416
+ );
417
+ setIntoStore(updateState, update, store);
418
+ const redactedUpdateKey = {
419
+ userId: userKey,
420
+ syncGroupKey: continuityKey,
421
+ updateId: update.id
422
+ };
423
+ const redactedUpdateState = findInStore(
424
+ redactedPerspectiveUpdateSelectors,
425
+ redactedUpdateKey,
426
+ store
427
+ );
428
+ const redactedUpdate = getFromStore(redactedUpdateState, store);
429
+ setIntoStore(
430
+ userUnacknowledgedQueue,
431
+ (updates) => {
432
+ if (redactedUpdate) {
433
+ updates.push(redactedUpdate);
434
+ updates.sort((a, b) => a.epoch - b.epoch);
435
+ }
436
+ return updates;
437
+ },
438
+ store
439
+ );
440
+ socket == null ? void 0 : socket.emit(
441
+ `tx-new:${continuityKey}`,
442
+ redactedUpdate
443
+ );
444
+ },
445
+ `sync-continuity:${continuityKey}:${userKey}`,
446
+ store
447
+ );
448
+ unsubscribeFunctions.push(unsubscribeFromTransaction);
449
+ }
450
+ };
451
+ socket.off(`get:${continuityKey}`, sendInitialPayload);
452
+ socket.on(`get:${continuityKey}`, sendInitialPayload);
453
+ const fillTransactionRequest = (update) => {
454
+ const transactionKey = update.key;
455
+ const updateId = update.id;
456
+ const performanceKey = `tx-run:${transactionKey}:${updateId}`;
457
+ const performanceKeyStart = `${performanceKey}:start`;
458
+ const performanceKeyEnd = `${performanceKey}:end`;
459
+ performance.mark(performanceKeyStart);
460
+ actUponStore(
461
+ { type: `transaction`, key: transactionKey },
462
+ updateId,
463
+ store
464
+ )(...update.params);
465
+ performance.mark(performanceKeyEnd);
466
+ const metric = performance.measure(
467
+ performanceKey,
468
+ performanceKeyStart,
469
+ performanceKeyEnd
470
+ );
471
+ store == null ? void 0 : store.logger.info(
472
+ `\u{1F680}`,
473
+ `transaction`,
474
+ transactionKey,
475
+ updateId,
476
+ metric.duration
477
+ );
478
+ };
479
+ socket.off(`tx-run:${continuityKey}`, fillTransactionRequest);
480
+ socket.on(`tx-run:${continuityKey}`, fillTransactionRequest);
481
+ let i = 1;
482
+ let next = 1;
483
+ const retry = setInterval(() => {
484
+ const toEmit = userUnacknowledgedUpdates[0];
485
+ store.logger.info(
486
+ `\u{1F504}`,
487
+ `continuity`,
488
+ continuityKey,
489
+ `${store.config.name} retrying ${userKey} (${i}/${next})`,
490
+ socket == null ? void 0 : socket.id,
491
+ userUnacknowledgedUpdates
492
+ );
493
+ if (toEmit && i === next) {
494
+ socket == null ? void 0 : socket.emit(`tx-new:${continuityKey}`, toEmit);
495
+ next *= 2;
496
+ }
497
+ i++;
498
+ }, 250);
499
+ const trackClientAcknowledgement = (epoch) => {
500
+ var _a;
501
+ store.logger.info(
502
+ `\u{1F44D}`,
503
+ `continuity`,
504
+ continuityKey,
505
+ `${userKey} acknowledged epoch ${epoch}`
506
+ );
507
+ i = 1;
508
+ next = 1;
509
+ const isUnacknowledged = ((_a = userUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch;
510
+ if (isUnacknowledged) {
511
+ setIntoStore(
512
+ userUnacknowledgedQueue,
513
+ (updates) => {
514
+ updates.shift();
515
+ return updates;
516
+ },
517
+ store
518
+ );
519
+ }
520
+ };
521
+ socket.off(`ack:${continuityKey}`, trackClientAcknowledgement);
522
+ socket.on(`ack:${continuityKey}`, trackClientAcknowledgement);
523
+ return () => {
524
+ clearInterval(retry);
525
+ for (const unsubscribe of unsubscribeFunctions)
526
+ unsubscribe();
527
+ socket == null ? void 0 : socket.off(`ack:${continuityKey}`, trackClientAcknowledgement);
528
+ socket == null ? void 0 : socket.off(`get:${continuityKey}`, sendInitialPayload);
529
+ socket == null ? void 0 : socket.off(`tx-run:${continuityKey}`, fillTransactionRequest);
530
+ };
531
+ };
532
+ }
116
533
  function realtimeStateProvider({
117
534
  socket,
118
535
  store = IMPLICIT.STORE
@@ -120,7 +537,7 @@ function realtimeStateProvider({
120
537
  return function stateProvider(token) {
121
538
  let unsubscribeFromStateUpdates;
122
539
  const fillSubRequest = () => {
123
- socket.emit(`serve:${token.key}`, AtomIO7.getState(token, store));
540
+ socket.emit(`serve:${token.key}`, getFromStore(token, store));
124
541
  unsubscribeFromStateUpdates = subscribeToState(
125
542
  token,
126
543
  ({ newValue }) => {
@@ -154,7 +571,7 @@ function realtimeStateSynchronizer({
154
571
  }) {
155
572
  return function stateSynchronizer(token) {
156
573
  const fillGetRequest = () => {
157
- socket.emit(`value:${token.key}`, AtomIO7.getState(token, store));
574
+ socket.emit(`value:${token.key}`, getFromStore(token, store));
158
575
  };
159
576
  socket.on(`get:${token.key}`, fillGetRequest);
160
577
  return () => {
@@ -162,89 +579,49 @@ function realtimeStateSynchronizer({
162
579
  };
163
580
  };
164
581
  }
165
- function realtimeFamilyProvider({
582
+ function realtimeAtomFamilyProvider({
166
583
  socket,
167
584
  store = IMPLICIT.STORE
168
585
  }) {
169
586
  return function familyProvider(family, index) {
170
- const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
171
- const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
172
- const fillFamilyUnsubRequest = () => {
173
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
174
- unsub();
175
- }
176
- unsubFamilyCallbacksByKey.clear();
177
- socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
178
- };
179
- const fillSingleUnsubRequest = (key) => {
180
- socket.off(`unsub:${key}`, fillSingleUnsubRequest);
181
- const unsub = unsubSingleCallbacksByKey.get(key);
587
+ const unsubCallbacksByKey = /* @__PURE__ */ new Map();
588
+ const fillUnsubRequest = (key) => {
589
+ socket.off(`unsub:${key}`, fillUnsubRequest);
590
+ const unsub = unsubCallbacksByKey.get(key);
182
591
  if (unsub) {
183
592
  unsub();
184
- unsubSingleCallbacksByKey.delete(key);
593
+ unsubCallbacksByKey.delete(key);
185
594
  }
186
595
  };
187
596
  const fillSubRequest = (subKey) => {
188
- var _a;
189
- if (subKey === void 0) {
190
- const keys = AtomIO7.getState(index, store);
191
- for (const key of keys) {
192
- const token = findInStore(family, key, store);
193
- socket.emit(
194
- `serve:${family.key}`,
195
- parseJson(((_a = token.family) == null ? void 0 : _a.subKey) || `null`),
196
- AtomIO7.getState(token, store)
597
+ const exposedSubKeys = getFromStore(index, store);
598
+ for (const exposedSubKey of exposedSubKeys) {
599
+ if (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {
600
+ const token = findInStore(family, subKey, store);
601
+ socket.emit(`serve:${token.key}`, getFromStore(token, store));
602
+ const unsubscribe = subscribeToState(
603
+ token,
604
+ ({ newValue }) => {
605
+ socket.emit(`serve:${token.key}`, newValue);
606
+ },
607
+ `expose-family:${family.key}:${socket.id}`,
608
+ store
197
609
  );
610
+ unsubCallbacksByKey.set(token.key, unsubscribe);
611
+ socket.on(`unsub:${token.key}`, () => {
612
+ fillUnsubRequest(token.key);
613
+ });
614
+ break;
198
615
  }
199
- const unsubscribeFromTokenCreation = family.subject.subscribe(
200
- `expose-family:${socket.id}`,
201
- (token) => {
202
- const unsub = subscribeToState(
203
- token,
204
- ({ newValue }) => {
205
- var _a2;
206
- socket.emit(
207
- `serve:${family.key}`,
208
- parseJson(((_a2 = token.family) == null ? void 0 : _a2.subKey) || `null`),
209
- newValue
210
- );
211
- },
212
- `expose-family:${family.key}:${socket.id}`,
213
- store
214
- );
215
- unsubFamilyCallbacksByKey.set(token.key, unsub);
216
- }
217
- );
218
- unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
219
- socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
220
- } else {
221
- const token = family(subKey);
222
- socket.emit(`serve:${token.key}`, AtomIO7.getState(token, store));
223
- const unsubscribe = subscribeToState(
224
- token,
225
- ({ newValue }) => {
226
- socket.emit(`serve:${token.key}`, newValue);
227
- },
228
- `expose-family:${family.key}:${socket.id}`,
229
- store
230
- );
231
- unsubSingleCallbacksByKey.set(token.key, unsubscribe);
232
- socket.on(`unsub:${token.key}`, () => {
233
- fillSingleUnsubRequest(token.key);
234
- });
235
616
  }
236
617
  };
237
618
  socket.on(`sub:${family.key}`, fillSubRequest);
238
619
  return () => {
239
620
  socket.off(`sub:${family.key}`, fillSubRequest);
240
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
241
- unsub();
242
- }
243
- for (const [, unsub] of unsubSingleCallbacksByKey) {
621
+ for (const [, unsub] of unsubCallbacksByKey) {
244
622
  unsub();
245
623
  }
246
- unsubFamilyCallbacksByKey.clear();
247
- unsubSingleCallbacksByKey.clear();
624
+ unsubCallbacksByKey.clear();
248
625
  };
249
626
  };
250
627
  }
@@ -262,7 +639,7 @@ function realtimeMutableProvider({
262
639
  unsubscribeFromStateUpdates = null;
263
640
  };
264
641
  const fillSubRequest = () => {
265
- socket.emit(`init:${token.key}`, AtomIO7.getState(jsonToken, store));
642
+ socket.emit(`init:${token.key}`, getFromStore(jsonToken, store));
266
643
  unsubscribeFromStateUpdates = subscribeToState(
267
644
  trackerToken,
268
645
  ({ newValue }) => {
@@ -285,110 +662,46 @@ function realtimeMutableFamilyProvider({
285
662
  store = IMPLICIT.STORE
286
663
  }) {
287
664
  return function mutableFamilyProvider(family, index) {
288
- const unsubSingleCallbacksByKey = /* @__PURE__ */ new Map();
289
- const unsubFamilyCallbacksByKey = /* @__PURE__ */ new Map();
290
- const fillFamilyUnsubRequest = () => {
291
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
292
- unsub();
293
- }
294
- unsubFamilyCallbacksByKey.clear();
295
- socket.off(`unsub:${family.key}`, fillFamilyUnsubRequest);
296
- };
297
- const fillSingleUnsubRequest = (key) => {
298
- socket.off(`unsub:${key}`, fillSingleUnsubRequest);
299
- const unsub = unsubSingleCallbacksByKey.get(key);
665
+ const unsubCallbacksByKey = /* @__PURE__ */ new Map();
666
+ const fillUnsubRequest = (key) => {
667
+ socket.off(`unsub:${key}`, fillUnsubRequest);
668
+ const unsub = unsubCallbacksByKey.get(key);
300
669
  if (unsub) {
301
670
  unsub();
302
- unsubSingleCallbacksByKey.delete(key);
671
+ unsubCallbacksByKey.delete(key);
303
672
  }
304
673
  };
305
674
  const fillSubRequest = (subKey) => {
306
- var _a;
307
- if (subKey === void 0) {
308
- const keys = AtomIO7.getState(index, store);
309
- for (const key of keys) {
310
- const token = findInStore(family, key, store);
675
+ const exposedSubKeys = getFromStore(index, store);
676
+ for (const exposedSubKey of exposedSubKeys) {
677
+ if (stringifyJson(exposedSubKey) === stringifyJson(subKey)) {
678
+ const token = findInStore(family, subKey, store);
311
679
  const jsonToken = getJsonToken(token);
312
- const trackerToken = getUpdateToken(token);
313
- socket.emit(
314
- `init:${family.key}`,
315
- parseJson(((_a = jsonToken.family) == null ? void 0 : _a.subKey) || `null`),
316
- AtomIO7.getState(jsonToken, store)
317
- );
318
- const unsubFromUpdates = subscribeToState(
319
- trackerToken,
680
+ const updateToken = getUpdateToken(token);
681
+ socket.emit(`init:${token.key}`, getFromStore(jsonToken, store));
682
+ const unsubscribe = subscribeToState(
683
+ updateToken,
320
684
  ({ newValue }) => {
321
- var _a2;
322
- socket.emit(
323
- `next:${token.key}`,
324
- parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
325
- newValue
326
- );
685
+ socket.emit(`next:${token.key}`, newValue);
327
686
  },
328
687
  `expose-family:${family.key}:${socket.id}`,
329
688
  store
330
689
  );
331
- unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
690
+ unsubCallbacksByKey.set(token.key, unsubscribe);
691
+ socket.on(`unsub:${token.key}`, () => {
692
+ fillUnsubRequest(token.key);
693
+ });
694
+ break;
332
695
  }
333
- const unsubscribeFromTokenCreation = family.subject.subscribe(
334
- `expose-family:${socket.id}`,
335
- (token) => {
336
- var _a2;
337
- const jsonToken = getJsonToken(token);
338
- const trackerToken = getUpdateToken(token);
339
- socket.emit(
340
- `init:${family.key}`,
341
- parseJson(((_a2 = jsonToken.family) == null ? void 0 : _a2.subKey) || `null`),
342
- AtomIO7.getState(jsonToken, store)
343
- );
344
- const unsubFromUpdates = subscribeToState(
345
- trackerToken,
346
- ({ newValue }) => {
347
- var _a3;
348
- socket.emit(
349
- `next:${token.key}`,
350
- parseJson(((_a3 = jsonToken.family) == null ? void 0 : _a3.subKey) || `null`),
351
- newValue
352
- );
353
- },
354
- `expose-family:${family.key}:${socket.id}`,
355
- store
356
- );
357
- unsubFamilyCallbacksByKey.set(token.key, unsubFromUpdates);
358
- }
359
- );
360
- unsubFamilyCallbacksByKey.set(family.key, unsubscribeFromTokenCreation);
361
- socket.on(`unsub:${family.key}`, fillFamilyUnsubRequest);
362
- } else {
363
- const token = family(subKey);
364
- const jsonToken = getJsonToken(token);
365
- const updateToken = getUpdateToken(token);
366
- socket.emit(`init:${token.key}`, AtomIO7.getState(jsonToken, store));
367
- const unsubscribe = subscribeToState(
368
- updateToken,
369
- ({ newValue }) => {
370
- socket.emit(`next:${token.key}`, newValue);
371
- },
372
- `expose-family:${family.key}:${socket.id}`,
373
- store
374
- );
375
- unsubSingleCallbacksByKey.set(token.key, unsubscribe);
376
- socket.on(`unsub:${token.key}`, () => {
377
- fillSingleUnsubRequest(token.key);
378
- });
379
696
  }
380
697
  };
381
698
  socket.on(`sub:${family.key}`, fillSubRequest);
382
699
  return () => {
383
700
  socket.off(`sub:${family.key}`, fillSubRequest);
384
- for (const [, unsub] of unsubFamilyCallbacksByKey) {
701
+ for (const [, unsub] of unsubCallbacksByKey) {
385
702
  unsub();
386
703
  }
387
- for (const [, unsub] of unsubSingleCallbacksByKey) {
388
- unsub();
389
- }
390
- unsubFamilyCallbacksByKey.clear();
391
- unsubSingleCallbacksByKey.clear();
704
+ unsubCallbacksByKey.clear();
392
705
  };
393
706
  };
394
707
  }
@@ -397,7 +710,7 @@ function realtimeStateReceiver({
397
710
  store = IMPLICIT.STORE
398
711
  }) {
399
712
  return function stateReceiver(token) {
400
- const publish = (newValue) => setState(token, newValue, store);
713
+ const publish = (newValue) => setIntoStore(token, newValue, store);
401
714
  const fillPubUnclaim = () => {
402
715
  socket.off(`pub:${token.key}`, publish);
403
716
  socket.off(`unclaim:${token.key}`, fillPubUnclaim);
@@ -423,7 +736,7 @@ function realtimeActionReceiver({
423
736
  const performanceKeyStart = `${performanceKey}:start`;
424
737
  const performanceKeyEnd = `${performanceKey}:end`;
425
738
  performance.mark(performanceKeyStart);
426
- AtomIO7.runTransaction(tx, update.id, store)(...update.params);
739
+ actUponStore(tx, update.id, store)(...update.params);
427
740
  performance.mark(performanceKeyEnd);
428
741
  const metric = performance.measure(
429
742
  performanceKey,
@@ -441,31 +754,42 @@ function realtimeActionSynchronizer({
441
754
  store = IMPLICIT.STORE
442
755
  }) {
443
756
  return function actionSynchronizer(tx, filter) {
757
+ assignTransactionToContinuity(`default`, tx.key, store);
444
758
  const userKeyState = findInStore(
445
759
  usersOfSockets.states.userKeyOfSocket,
446
760
  socket.id,
447
761
  store
448
762
  );
449
- const userKey = AtomIO7.getState(userKeyState, store);
450
- const socketUnacknowledgedUpdatesState = findInStore(
451
- socketUnacknowledgedUpdatesSelectors,
452
- socket.id,
763
+ const userKey = getFromStore(userKeyState, store);
764
+ if (!userKey) {
765
+ store.logger.error(
766
+ `\u274C`,
767
+ `transaction`,
768
+ tx.key,
769
+ `Tried to create a synchronizer for a socket (${socket.id}) that is not connected to a user.`
770
+ );
771
+ return () => {
772
+ };
773
+ }
774
+ const userUnacknowledgedQueue = findInStore(
775
+ userUnacknowledgedQueues,
776
+ userKey,
453
777
  store
454
778
  );
455
- const socketUnacknowledgedUpdates = AtomIO7.getState(
456
- socketUnacknowledgedUpdatesState,
779
+ const userUnacknowledgedUpdates = getFromStore(
780
+ userUnacknowledgedQueue,
457
781
  store
458
782
  );
459
783
  if (filter) {
460
784
  const redactorState = findInStore(transactionRedactorAtoms, tx.key, store);
461
- AtomIO7.setState(redactorState, { filter }, store);
785
+ setIntoStore(redactorState, { filter }, store);
462
786
  }
463
787
  const fillTransactionRequest = (update) => {
464
788
  const performanceKey = `tx-run:${tx.key}:${update.id}`;
465
789
  const performanceKeyStart = `${performanceKey}:start`;
466
790
  const performanceKeyEnd = `${performanceKey}:end`;
467
791
  performance.mark(performanceKeyStart);
468
- AtomIO7.runTransaction(tx, update.id, store)(...update.params);
792
+ actUponStore(tx, update.id, store)(...update.params);
469
793
  performance.mark(performanceKeyEnd);
470
794
  const metric = performance.measure(
471
795
  performanceKey,
@@ -481,14 +805,14 @@ function realtimeActionSynchronizer({
481
805
  unsubscribeFromTransaction = subscribeToTransaction(
482
806
  tx,
483
807
  (update) => {
484
- const updateState = findInStore(completeUpdateAtoms, update.id, store);
485
- AtomIO7.setState(updateState, update, store);
486
- const toEmit = filter ? AtomIO7.getState(
808
+ const updateState = findInStore(completeUpdateAtoms2, update.id, store);
809
+ setIntoStore(updateState, update, store);
810
+ const toEmit = filter ? getFromStore(
487
811
  findInStore(redactedUpdateSelectors, [tx.key, update.id], store),
488
812
  store
489
813
  ) : update;
490
- AtomIO7.setState(
491
- socketUnacknowledgedUpdatesState,
814
+ setIntoStore(
815
+ userUnacknowledgedQueue,
492
816
  (updates) => {
493
817
  if (toEmit) {
494
818
  updates.push(toEmit);
@@ -509,8 +833,7 @@ function realtimeActionSynchronizer({
509
833
  let i = 1;
510
834
  let next = 1;
511
835
  const retry = setInterval(() => {
512
- const toEmit = socketUnacknowledgedUpdates[0];
513
- console.log(userKey, socketUnacknowledgedUpdates);
836
+ const toEmit = userUnacknowledgedUpdates[0];
514
837
  if (toEmit && i === next) {
515
838
  socket.emit(`tx-new:${tx.key}`, toEmit);
516
839
  next *= 2;
@@ -521,15 +844,9 @@ function realtimeActionSynchronizer({
521
844
  var _a;
522
845
  i = 1;
523
846
  next = 1;
524
- const socketEpochState = findInStore(
525
- socketEpochSelectors,
526
- socket.id,
527
- store
528
- );
529
- AtomIO7.setState(socketEpochState, epoch, store);
530
- if (((_a = socketUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch) {
531
- AtomIO7.setState(
532
- socketUnacknowledgedUpdatesState,
847
+ if (((_a = userUnacknowledgedUpdates[0]) == null ? void 0 : _a.epoch) === epoch) {
848
+ setIntoStore(
849
+ userUnacknowledgedQueue,
533
850
  (updates) => {
534
851
  updates.shift();
535
852
  return updates;
@@ -551,6 +868,6 @@ function realtimeActionSynchronizer({
551
868
  };
552
869
  }
553
870
 
554
- export { DEFAULT_USER_IN_ROOM_META, completeUpdateAtoms, realtimeActionReceiver, realtimeActionSynchronizer, realtimeFamilyProvider, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, realtimeStateSynchronizer, redactedUpdateSelectors, roomIndex, socketEpochSelectors, socketUnacknowledgedUpdatesSelectors, transactionRedactorAtoms, userEpochAtoms, userIndex, userUnacknowledgedUpdatesAtoms, usersInRooms, usersOfSockets };
871
+ export { ChildSocket, CustomSocket, DEFAULT_USER_IN_ROOM_META, ParentSocket, SubjectSocket, completeUpdateAtoms2 as completeUpdateAtoms, createRoomTX, joinRoomTX, realtimeActionReceiver, realtimeActionSynchronizer, realtimeAtomFamilyProvider, realtimeContinuitySynchronizer, realtimeMutableFamilyProvider, realtimeMutableProvider, realtimeStateProvider, realtimeStateReceiver, realtimeStateSynchronizer, redactedPerspectiveUpdateSelectors, redactedUpdateSelectors, roomArgumentsAtoms, roomIndex, roomSelectors, socketAtoms, socketIndex, transactionRedactorAtoms, userIndex, userUnacknowledgedQueues, usersInRooms, usersOfSockets };
555
872
  //# sourceMappingURL=out.js.map
556
873
  //# sourceMappingURL=index.js.map