atom.io 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +62 -40
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.ts +8 -2
- package/data/dist/index.js +64 -42
- package/data/dist/index.js.map +1 -1
- package/data/src/dict.ts +8 -4
- package/data/src/join.ts +74 -33
- package/data/src/struct-family.ts +18 -17
- package/dist/chunk-OEVFAUPE.js +289 -0
- package/dist/chunk-OEVFAUPE.js.map +1 -0
- package/dist/index.cjs +4 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +62 -51
- package/dist/index.js +5 -11
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +163 -64
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +94 -70
- package/internal/dist/index.js +155 -59
- package/internal/dist/index.js.map +1 -1
- package/internal/src/arbitrary.ts +3 -0
- package/internal/src/caching.ts +8 -6
- package/internal/src/families/find-in-store.ts +16 -0
- package/internal/src/get-environment-data.ts +4 -7
- package/internal/src/index.ts +6 -5
- package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
- package/internal/src/selector/create-standalone-selector.ts +0 -2
- package/internal/src/set-state/set-atom.ts +14 -18
- package/internal/src/store/store.ts +14 -2
- package/internal/src/store/withdraw.ts +72 -2
- package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
- package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
- package/internal/src/timeline/create-timeline.ts +12 -1
- package/internal/src/transaction/act-upon-store.ts +19 -0
- package/internal/src/transaction/apply-transaction.ts +7 -1
- package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
- package/internal/src/transaction/build-transaction.ts +7 -6
- package/internal/src/transaction/create-transaction.ts +1 -1
- package/internal/src/transaction/get-epoch-number.ts +40 -0
- package/internal/src/transaction/index.ts +10 -1
- package/internal/src/transaction/set-epoch-number.ts +31 -0
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.ts +3 -3
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-introspection-states.ts +6 -2
- package/introspection/src/attach-timeline-family.ts +5 -2
- package/introspection/src/attach-transaction-logs.ts +2 -2
- package/json/dist/index.d.ts +3 -1
- package/json/src/index.ts +6 -2
- package/package.json +24 -13
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +1 -1
- package/react/dist/index.js.map +1 -1
- package/react/src/use-json.ts +1 -1
- package/react-devtools/dist/index.cjs +131 -134
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.css +2 -2
- package/react-devtools/dist/index.css.map +1 -1
- package/react-devtools/dist/index.d.ts +3 -3
- package/react-devtools/dist/index.js +103 -106
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/src/StateEditor.tsx +6 -6
- package/react-devtools/src/StateIndex.tsx +2 -5
- package/react-devtools/src/TimelineIndex.tsx +3 -3
- package/react-devtools/src/TransactionIndex.tsx +9 -8
- package/react-devtools/src/Updates.tsx +1 -1
- package/react-devtools/src/index.ts +4 -4
- package/realtime/dist/index.cjs +72 -0
- package/realtime/dist/index.cjs.map +1 -0
- package/realtime/dist/index.d.ts +39 -0
- package/realtime/dist/index.js +68 -0
- package/realtime/dist/index.js.map +1 -0
- package/realtime/package.json +16 -0
- package/realtime/src/index.ts +1 -0
- package/realtime/src/realtime-continuity.ts +152 -0
- package/realtime-client/dist/index.cjs +389 -48
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +16 -9
- package/realtime-client/dist/index.js +100 -37
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +8 -5
- package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +2 -2
- package/realtime-client/src/{pull-state.ts → pull-atom.ts} +2 -2
- package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +1 -1
- package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +1 -1
- package/realtime-client/src/pull-selector-family-member.ts +42 -0
- package/realtime-client/src/pull-selector.ts +38 -0
- package/realtime-client/src/realtime-client-stores/client-main-store.ts +2 -2
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
- package/realtime-client/src/sync-continuity.ts +321 -0
- package/realtime-client/src/sync-server-action.ts +18 -20
- package/realtime-react/dist/index.cjs +330 -15
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +26 -6
- package/realtime-react/dist/index.js +43 -12
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +6 -3
- package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
- package/realtime-react/src/{use-pull-family-member.ts → use-pull-atom.ts} +6 -5
- package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
- package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
- package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
- package/realtime-react/src/{use-pull.ts → use-pull-selector.ts} +7 -5
- package/realtime-react/src/use-push.ts +3 -2
- package/realtime-react/src/use-server-action.ts +3 -2
- package/realtime-react/src/use-sync-continuity.ts +12 -0
- package/realtime-react/src/use-sync-server-action.ts +3 -2
- package/realtime-server/dist/index.cjs +568 -242
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +124 -49
- package/realtime-server/dist/index.js +555 -238
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +18 -2
- package/realtime-server/src/ipc-socket.ts +230 -0
- package/realtime-server/src/realtime-action-receiver.ts +8 -5
- package/realtime-server/src/realtime-action-synchronizer.ts +40 -28
- package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
- package/realtime-server/src/realtime-family-provider.ts +30 -71
- package/realtime-server/src/realtime-mutable-family-provider.ts +24 -86
- package/realtime-server/src/realtime-server-stores/index.ts +3 -1
- package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +90 -0
- package/realtime-server/src/realtime-server-stores/server-room-store.ts +97 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +2 -72
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
- package/realtime-server/src/realtime-state-receiver.ts +0 -1
- package/realtime-testing/dist/index.cjs +28 -28
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.js +28 -27
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +38 -28
- package/src/atom.ts +49 -31
- package/src/logger.ts +10 -5
- package/src/selector.ts +44 -25
- package/src/subscribe.ts +2 -1
- package/src/timeline.ts +4 -4
- package/src/transaction.ts +13 -17
- package/src/validators.ts +15 -9
- package/dist/chunk-H4Q5FTPZ.js +0 -11
- package/dist/chunk-H4Q5FTPZ.js.map +0 -1
- package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
|
@@ -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
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
56
|
-
key: `
|
|
57
|
-
|
|
58
|
-
|
|
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 =
|
|
61
|
-
key: `
|
|
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
|
|
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(
|
|
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
|
|
335
|
+
var userUnacknowledgedQueues = AtomIO.atomFamily({
|
|
98
336
|
key: `unacknowledgedUpdates`,
|
|
99
337
|
default: () => []
|
|
100
338
|
});
|
|
101
|
-
var
|
|
102
|
-
key: `
|
|
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
|
|
134
|
-
key: `
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
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
|
|
152
|
-
|
|
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
|
|
621
|
+
function realtimeAtomFamilyProvider({
|
|
205
622
|
socket,
|
|
206
623
|
store = internal.IMPLICIT.STORE
|
|
207
624
|
}) {
|
|
208
625
|
return function familyProvider(family, index) {
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
632
|
+
unsubCallbacksByKey.delete(key);
|
|
224
633
|
}
|
|
225
634
|
};
|
|
226
635
|
const fillSubRequest = (subKey) => {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
|
280
|
-
unsub();
|
|
281
|
-
}
|
|
282
|
-
for (const [, unsub] of unsubSingleCallbacksByKey) {
|
|
660
|
+
for (const [, unsub] of unsubCallbacksByKey) {
|
|
283
661
|
unsub();
|
|
284
662
|
}
|
|
285
|
-
|
|
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
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
710
|
+
unsubCallbacksByKey.delete(key);
|
|
342
711
|
}
|
|
343
712
|
};
|
|
344
713
|
const fillSubRequest = (subKey) => {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
|
352
|
-
socket.emit(
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
424
|
-
unsub();
|
|
425
|
-
}
|
|
426
|
-
for (const [, unsub] of unsubSingleCallbacksByKey) {
|
|
740
|
+
for (const [, unsub] of unsubCallbacksByKey) {
|
|
427
741
|
unsub();
|
|
428
742
|
}
|
|
429
|
-
|
|
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
|
-
|
|
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
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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
|
|
495
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
606
|
-
exports.
|
|
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.
|
|
936
|
+
exports.userUnacknowledgedQueues = userUnacknowledgedQueues;
|
|
611
937
|
exports.usersInRooms = usersInRooms;
|
|
612
938
|
exports.usersOfSockets = usersOfSockets;
|
|
613
939
|
//# sourceMappingURL=out.js.map
|