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.
- 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 +36 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +64 -53
- package/dist/index.js +15 -36
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +211 -81
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +100 -72
- package/internal/dist/index.js +200 -75
- package/internal/dist/index.js.map +1 -1
- package/internal/src/arbitrary.ts +3 -0
- package/internal/src/atom/create-regular-atom.ts +2 -3
- 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/get-state/get-from-store.ts +14 -0
- package/internal/src/get-state/index.ts +2 -0
- package/internal/src/{read-or-compute-value.ts → get-state/read-or-compute-value.ts} +3 -3
- package/internal/src/index.ts +7 -6
- package/internal/src/ingest-updates/ingest-atom-update.ts +2 -2
- package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
- package/internal/src/mutable/create-mutable-atom.ts +3 -4
- package/internal/src/mutable/tracker.ts +18 -13
- package/internal/src/selector/create-standalone-selector.ts +0 -2
- package/internal/src/selector/register-selector.ts +1 -1
- package/internal/src/set-state/index.ts +1 -0
- package/internal/src/set-state/set-atom.ts +15 -19
- package/internal/src/set-state/set-into-store.ts +24 -0
- package/internal/src/store/store.ts +14 -2
- package/internal/src/store/withdraw.ts +72 -2
- package/internal/src/subscribe/subscribe-to-root-atoms.ts +1 -1
- 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 +11 -8
- 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 +3 -3
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +1 -1
- package/react/dist/index.js +5 -5
- package/react/dist/index.js.map +1 -1
- package/react/src/use-i.ts +2 -3
- package/react/src/use-json.ts +1 -1
- package/react/src/use-o.ts +3 -4
- 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 +403 -59
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +16 -9
- package/realtime-client/dist/index.js +114 -48
- 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} +5 -5
- package/realtime-client/src/{pull-state.ts → pull-atom.ts} +5 -5
- package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +5 -5
- package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +5 -5
- 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 +22 -21
- package/realtime-client/src/sync-state.ts +3 -3
- 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.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-family-member.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 +582 -256
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +124 -49
- package/realtime-server/dist/index.js +566 -249
- 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 +53 -35
- package/realtime-server/src/realtime-continuity-synchronizer.ts +247 -0
- package/realtime-server/src/realtime-family-provider.ts +37 -73
- package/realtime-server/src/realtime-mutable-family-provider.ts +26 -87
- package/realtime-server/src/realtime-mutable-provider.ts +3 -2
- 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-provider.ts +3 -3
- package/realtime-server/src/realtime-state-receiver.ts +2 -3
- package/realtime-server/src/realtime-state-synchronizer.ts +3 -3
- 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/get-state.ts +2 -11
- package/src/logger.ts +10 -5
- package/src/selector.ts +44 -25
- package/src/set-state.ts +1 -13
- package/src/silo.ts +7 -3
- 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,25 +1,219 @@
|
|
|
1
1
|
import { __spreadProps, __spreadValues } from '../../dist/chunk-PZLG2HP3.js';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
17
|
-
key: `
|
|
18
|
-
|
|
19
|
-
|
|
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: `
|
|
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
|
|
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(
|
|
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
|
|
296
|
+
var userUnacknowledgedQueues = atomFamily({
|
|
59
297
|
key: `unacknowledgedUpdates`,
|
|
60
298
|
default: () => []
|
|
61
299
|
});
|
|
62
|
-
var
|
|
63
|
-
key: `
|
|
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
|
|
95
|
-
key: `
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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
|
|
113
|
-
|
|
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}`,
|
|
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}`,
|
|
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
|
|
582
|
+
function realtimeAtomFamilyProvider({
|
|
166
583
|
socket,
|
|
167
584
|
store = IMPLICIT.STORE
|
|
168
585
|
}) {
|
|
169
586
|
return function familyProvider(family, index) {
|
|
170
|
-
const
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
593
|
+
unsubCallbacksByKey.delete(key);
|
|
185
594
|
}
|
|
186
595
|
};
|
|
187
596
|
const fillSubRequest = (subKey) => {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
|
241
|
-
unsub();
|
|
242
|
-
}
|
|
243
|
-
for (const [, unsub] of unsubSingleCallbacksByKey) {
|
|
621
|
+
for (const [, unsub] of unsubCallbacksByKey) {
|
|
244
622
|
unsub();
|
|
245
623
|
}
|
|
246
|
-
|
|
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}`,
|
|
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
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
|
|
671
|
+
unsubCallbacksByKey.delete(key);
|
|
303
672
|
}
|
|
304
673
|
};
|
|
305
674
|
const fillSubRequest = (subKey) => {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
|
313
|
-
socket.emit(
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
701
|
+
for (const [, unsub] of unsubCallbacksByKey) {
|
|
385
702
|
unsub();
|
|
386
703
|
}
|
|
387
|
-
|
|
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) =>
|
|
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
|
-
|
|
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 =
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
|
456
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
485
|
-
|
|
486
|
-
const toEmit = filter ?
|
|
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
|
-
|
|
491
|
-
|
|
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 =
|
|
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
|
-
|
|
525
|
-
|
|
526
|
-
|
|
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,
|
|
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
|