cojson 0.0.6 → 0.0.8
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/.eslintrc.cjs +11 -8
- package/dist/coValue.d.ts +97 -0
- package/dist/coValue.js +341 -401
- package/dist/coValue.js.map +1 -0
- package/dist/coValue.test.d.ts +1 -0
- package/dist/coValue.test.js +69 -113
- package/dist/coValue.test.js.map +1 -0
- package/dist/contentType.d.ts +15 -0
- package/dist/contentType.js +5 -5
- package/dist/contentType.js.map +1 -0
- package/dist/contentType.test.d.ts +1 -0
- package/dist/contentType.test.js +138 -168
- package/dist/contentType.test.js.map +1 -0
- package/dist/contentTypes/coList.d.ts +11 -0
- package/dist/contentTypes/coList.js +14 -16
- package/dist/contentTypes/coList.js.map +1 -0
- package/dist/contentTypes/coMap.d.ts +56 -0
- package/dist/contentTypes/coMap.js +112 -112
- package/dist/contentTypes/coMap.js.map +1 -0
- package/dist/contentTypes/coStream.d.ts +11 -0
- package/dist/contentTypes/coStream.js +14 -16
- package/dist/contentTypes/coStream.js.map +1 -0
- package/dist/contentTypes/static.d.ts +11 -0
- package/dist/contentTypes/static.js +12 -14
- package/dist/contentTypes/static.js.map +1 -0
- package/dist/crypto.d.ts +97 -0
- package/dist/crypto.js +100 -151
- package/dist/crypto.js.map +1 -0
- package/dist/crypto.test.d.ts +1 -0
- package/dist/crypto.test.js +94 -134
- package/dist/crypto.test.js.map +1 -0
- package/dist/ids.d.ts +7 -0
- package/dist/ids.js +2 -1
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +10 -18
- package/dist/index.js.map +1 -0
- package/dist/jsonValue.d.ts +7 -0
- package/dist/jsonValue.js +2 -1
- package/dist/jsonValue.js.map +1 -0
- package/dist/node.d.ts +33 -0
- package/dist/node.js +102 -133
- package/dist/node.js.map +1 -0
- package/dist/permissions.d.ts +54 -0
- package/dist/permissions.js +202 -228
- package/dist/permissions.js.map +1 -0
- package/dist/permissions.test.d.ts +1 -0
- package/dist/permissions.test.js +724 -915
- package/dist/permissions.test.js.map +1 -0
- package/dist/sync.d.ts +80 -0
- package/dist/sync.js +247 -294
- package/dist/sync.js.map +1 -0
- package/dist/sync.test.d.ts +1 -0
- package/dist/sync.test.js +763 -798
- package/dist/sync.test.js.map +1 -0
- package/package.json +7 -4
- package/src/coValue.test.ts +3 -4
- package/src/coValue.ts +11 -17
- package/src/contentType.test.ts +3 -3
- package/src/contentType.ts +6 -6
- package/src/contentTypes/coList.ts +4 -4
- package/src/contentTypes/coMap.ts +6 -6
- package/src/contentTypes/coStream.ts +4 -4
- package/src/contentTypes/static.ts +5 -5
- package/src/crypto.test.ts +1 -1
- package/src/crypto.ts +2 -2
- package/src/index.ts +9 -7
- package/src/jsonValue.ts +1 -1
- package/src/node.ts +6 -7
- package/src/permissions.test.ts +5 -5
- package/src/permissions.ts +7 -7
- package/src/sync.test.ts +7 -7
- package/src/sync.ts +6 -6
- package/tsconfig.json +1 -7
package/dist/sync.js
CHANGED
|
@@ -1,318 +1,271 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { newLoadingState } from "./node";
|
|
1
|
+
import { CoValue } from './coValue.js';
|
|
2
|
+
import { newLoadingState } from './node.js';
|
|
4
3
|
export function emptyKnownState(coValueID) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
return {
|
|
5
|
+
coValueID,
|
|
6
|
+
header: false,
|
|
7
|
+
sessions: {},
|
|
8
|
+
};
|
|
10
9
|
}
|
|
11
10
|
export function combinedKnownStates(stateA, stateB) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
11
|
+
const sessionStates = {};
|
|
12
|
+
const allSessions = new Set([
|
|
13
|
+
...Object.keys(stateA.sessions),
|
|
14
|
+
...Object.keys(stateB.sessions),
|
|
15
|
+
]);
|
|
16
|
+
for (const sessionID of allSessions) {
|
|
17
|
+
const stateAValue = stateA.sessions[sessionID];
|
|
18
|
+
const stateBValue = stateB.sessions[sessionID];
|
|
19
|
+
sessionStates[sessionID] = Math.max(stateAValue || 0, stateBValue || 0);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
coValueID: stateA.coValueID,
|
|
23
|
+
header: stateA.header || stateB.header,
|
|
24
|
+
sessions: sessionStates,
|
|
25
|
+
};
|
|
27
26
|
}
|
|
28
27
|
export class SyncManager {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.local = local;
|
|
33
|
-
}
|
|
34
|
-
loadFromPeers(id) {
|
|
35
|
-
for (const peer of Object.values(this.peers)) {
|
|
36
|
-
peer.outgoing.write({
|
|
37
|
-
action: "subscribe",
|
|
38
|
-
coValueID: id,
|
|
39
|
-
header: false,
|
|
40
|
-
sessions: {}
|
|
41
|
-
}).catch((e) => {
|
|
42
|
-
console.error("Error writing to peer", e);
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async handleSyncMessage(msg, peer) {
|
|
47
|
-
switch (msg.action) {
|
|
48
|
-
case "subscribe":
|
|
49
|
-
return await this.handleSubscribe(msg, peer);
|
|
50
|
-
case "tellKnownState":
|
|
51
|
-
return await this.handleTellKnownState(msg, peer);
|
|
52
|
-
case "newContent":
|
|
53
|
-
return await this.handleNewContent(msg, peer);
|
|
54
|
-
case "wrongAssumedKnownState":
|
|
55
|
-
return await this.handleWrongAssumedKnownState(msg, peer);
|
|
56
|
-
case "unsubscribe":
|
|
57
|
-
return await this.handleUnsubscribe(msg);
|
|
58
|
-
default:
|
|
59
|
-
throw new Error(
|
|
60
|
-
`Unknown message type ${msg.action}`
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async subscribeToIncludingDependencies(coValueID, peer) {
|
|
65
|
-
const coValue = this.local.expectCoValueLoaded(coValueID);
|
|
66
|
-
for (const coValueID2 of coValue.getDependedOnCoValues()) {
|
|
67
|
-
await this.subscribeToIncludingDependencies(coValueID2, peer);
|
|
68
|
-
}
|
|
69
|
-
if (!peer.toldKnownState.has(coValueID)) {
|
|
70
|
-
peer.toldKnownState.add(coValueID);
|
|
71
|
-
await peer.outgoing.write({
|
|
72
|
-
action: "subscribe",
|
|
73
|
-
...coValue.knownState()
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
async tellUntoldKnownStateIncludingDependencies(coValueID, peer, asDependencyOf) {
|
|
78
|
-
const coValue = this.local.expectCoValueLoaded(coValueID);
|
|
79
|
-
for (const dependentCoValueID of coValue.getDependedOnCoValues()) {
|
|
80
|
-
await this.tellUntoldKnownStateIncludingDependencies(
|
|
81
|
-
dependentCoValueID,
|
|
82
|
-
peer,
|
|
83
|
-
asDependencyOf || coValueID
|
|
84
|
-
);
|
|
28
|
+
constructor(local) {
|
|
29
|
+
this.peers = {};
|
|
30
|
+
this.local = local;
|
|
85
31
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
await this.sendNewContentIncludingDependencies(coValueID2, peer);
|
|
99
|
-
}
|
|
100
|
-
const newContent = coValue.newContentSince(
|
|
101
|
-
peer.optimisticKnownStates[coValueID]
|
|
102
|
-
);
|
|
103
|
-
if (newContent) {
|
|
104
|
-
await peer.outgoing.write(newContent);
|
|
105
|
-
peer.optimisticKnownStates[coValueID] = combinedKnownStates(
|
|
106
|
-
peer.optimisticKnownStates[coValueID] || emptyKnownState(coValueID),
|
|
107
|
-
coValue.knownState()
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
addPeer(peer) {
|
|
112
|
-
const peerState = {
|
|
113
|
-
id: peer.id,
|
|
114
|
-
optimisticKnownStates: {},
|
|
115
|
-
incoming: peer.incoming,
|
|
116
|
-
outgoing: peer.outgoing.getWriter(),
|
|
117
|
-
toldKnownState: /* @__PURE__ */ new Set(),
|
|
118
|
-
role: peer.role
|
|
119
|
-
};
|
|
120
|
-
this.peers[peer.id] = peerState;
|
|
121
|
-
if (peer.role === "server") {
|
|
122
|
-
const initialSync = async () => {
|
|
123
|
-
for (const entry of Object.values(this.local.coValues)) {
|
|
124
|
-
if (entry.state === "loading") {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
await this.subscribeToIncludingDependencies(
|
|
128
|
-
entry.coValue.id,
|
|
129
|
-
peerState
|
|
130
|
-
);
|
|
131
|
-
peerState.optimisticKnownStates[entry.coValue.id] = {
|
|
132
|
-
coValueID: entry.coValue.id,
|
|
133
|
-
header: false,
|
|
134
|
-
sessions: {}
|
|
135
|
-
};
|
|
32
|
+
loadFromPeers(id) {
|
|
33
|
+
for (const peer of Object.values(this.peers)) {
|
|
34
|
+
peer.outgoing
|
|
35
|
+
.write({
|
|
36
|
+
action: "subscribe",
|
|
37
|
+
coValueID: id,
|
|
38
|
+
header: false,
|
|
39
|
+
sessions: {},
|
|
40
|
+
})
|
|
41
|
+
.catch((e) => {
|
|
42
|
+
console.error("Error writing to peer", e);
|
|
43
|
+
});
|
|
136
44
|
}
|
|
137
|
-
};
|
|
138
|
-
void initialSync();
|
|
139
45
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
46
|
+
async handleSyncMessage(msg, peer) {
|
|
47
|
+
// TODO: validate
|
|
48
|
+
switch (msg.action) {
|
|
49
|
+
case "subscribe":
|
|
50
|
+
return await this.handleSubscribe(msg, peer);
|
|
51
|
+
case "tellKnownState":
|
|
52
|
+
return await this.handleTellKnownState(msg, peer);
|
|
53
|
+
case "newContent":
|
|
54
|
+
return await this.handleNewContent(msg, peer);
|
|
55
|
+
case "wrongAssumedKnownState":
|
|
56
|
+
return await this.handleWrongAssumedKnownState(msg, peer);
|
|
57
|
+
case "unsubscribe":
|
|
58
|
+
return await this.handleUnsubscribe(msg);
|
|
59
|
+
default:
|
|
60
|
+
throw new Error(`Unknown message type ${msg.action}`);
|
|
150
61
|
}
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
void readIncoming();
|
|
154
|
-
}
|
|
155
|
-
async handleSubscribe(msg, peer) {
|
|
156
|
-
const entry = this.local.coValues[msg.coValueID];
|
|
157
|
-
if (!entry || entry.state === "loading") {
|
|
158
|
-
if (!entry) {
|
|
159
|
-
this.local.coValues[msg.coValueID] = newLoadingState();
|
|
160
|
-
}
|
|
161
|
-
peer.optimisticKnownStates[msg.coValueID] = knownStateIn(msg);
|
|
162
|
-
peer.toldKnownState.add(msg.coValueID);
|
|
163
|
-
await peer.outgoing.write({
|
|
164
|
-
action: "tellKnownState",
|
|
165
|
-
coValueID: msg.coValueID,
|
|
166
|
-
header: false,
|
|
167
|
-
sessions: {}
|
|
168
|
-
});
|
|
169
|
-
return;
|
|
170
62
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
knownStateIn(msg)
|
|
183
|
-
);
|
|
184
|
-
if (!entry) {
|
|
185
|
-
if (msg.asDependencyOf) {
|
|
186
|
-
if (this.local.coValues[msg.asDependencyOf]) {
|
|
187
|
-
entry = newLoadingState();
|
|
188
|
-
this.local.coValues[msg.coValueID] = entry;
|
|
189
|
-
} else {
|
|
190
|
-
throw new Error(
|
|
191
|
-
"Expected coValue dependency entry to be created, missing subscribe?"
|
|
192
|
-
);
|
|
63
|
+
async subscribeToIncludingDependencies(coValueID, peer) {
|
|
64
|
+
const coValue = this.local.expectCoValueLoaded(coValueID);
|
|
65
|
+
for (const coValueID of coValue.getDependedOnCoValues()) {
|
|
66
|
+
await this.subscribeToIncludingDependencies(coValueID, peer);
|
|
67
|
+
}
|
|
68
|
+
if (!peer.toldKnownState.has(coValueID)) {
|
|
69
|
+
peer.toldKnownState.add(coValueID);
|
|
70
|
+
await peer.outgoing.write({
|
|
71
|
+
action: "subscribe",
|
|
72
|
+
...coValue.knownState(),
|
|
73
|
+
});
|
|
193
74
|
}
|
|
194
|
-
} else {
|
|
195
|
-
throw new Error(
|
|
196
|
-
"Expected coValue entry to be created, missing subscribe?"
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
75
|
}
|
|
200
|
-
|
|
201
|
-
|
|
76
|
+
async tellUntoldKnownStateIncludingDependencies(coValueID, peer, asDependencyOf) {
|
|
77
|
+
const coValue = this.local.expectCoValueLoaded(coValueID);
|
|
78
|
+
for (const dependentCoValueID of coValue.getDependedOnCoValues()) {
|
|
79
|
+
await this.tellUntoldKnownStateIncludingDependencies(dependentCoValueID, peer, asDependencyOf || coValueID);
|
|
80
|
+
}
|
|
81
|
+
if (!peer.toldKnownState.has(coValueID)) {
|
|
82
|
+
await peer.outgoing.write({
|
|
83
|
+
action: "tellKnownState",
|
|
84
|
+
asDependencyOf,
|
|
85
|
+
...coValue.knownState(),
|
|
86
|
+
});
|
|
87
|
+
peer.toldKnownState.add(coValueID);
|
|
88
|
+
}
|
|
202
89
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
"Expected coValue entry to be created, missing subscribe?"
|
|
215
|
-
);
|
|
90
|
+
async sendNewContentIncludingDependencies(coValueID, peer) {
|
|
91
|
+
const coValue = this.local.expectCoValueLoaded(coValueID);
|
|
92
|
+
for (const coValueID of coValue.getDependedOnCoValues()) {
|
|
93
|
+
await this.sendNewContentIncludingDependencies(coValueID, peer);
|
|
94
|
+
}
|
|
95
|
+
const newContent = coValue.newContentSince(peer.optimisticKnownStates[coValueID]);
|
|
96
|
+
if (newContent) {
|
|
97
|
+
await peer.outgoing.write(newContent);
|
|
98
|
+
peer.optimisticKnownStates[coValueID] = combinedKnownStates(peer.optimisticKnownStates[coValueID] ||
|
|
99
|
+
emptyKnownState(coValueID), coValue.knownState());
|
|
100
|
+
}
|
|
216
101
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
102
|
+
addPeer(peer) {
|
|
103
|
+
const peerState = {
|
|
104
|
+
id: peer.id,
|
|
105
|
+
optimisticKnownStates: {},
|
|
106
|
+
incoming: peer.incoming,
|
|
107
|
+
outgoing: peer.outgoing.getWriter(),
|
|
108
|
+
toldKnownState: new Set(),
|
|
109
|
+
role: peer.role,
|
|
110
|
+
};
|
|
111
|
+
this.peers[peer.id] = peerState;
|
|
112
|
+
if (peer.role === "server") {
|
|
113
|
+
const initialSync = async () => {
|
|
114
|
+
for (const entry of Object.values(this.local.coValues)) {
|
|
115
|
+
if (entry.state === "loading") {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
await this.subscribeToIncludingDependencies(entry.coValue.id, peerState);
|
|
119
|
+
peerState.optimisticKnownStates[entry.coValue.id] = {
|
|
120
|
+
coValueID: entry.coValue.id,
|
|
121
|
+
header: false,
|
|
122
|
+
sessions: {},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
void initialSync();
|
|
127
|
+
}
|
|
128
|
+
const readIncoming = async () => {
|
|
129
|
+
for await (const msg of peerState.incoming) {
|
|
130
|
+
try {
|
|
131
|
+
await this.handleSyncMessage(msg, peerState);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
console.error(`Error reading from peer ${peer.id}`, JSON.stringify(msg), e);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
void readIncoming();
|
|
223
139
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
140
|
+
async handleSubscribe(msg, peer) {
|
|
141
|
+
const entry = this.local.coValues[msg.coValueID];
|
|
142
|
+
if (!entry || entry.state === "loading") {
|
|
143
|
+
if (!entry) {
|
|
144
|
+
this.local.coValues[msg.coValueID] = newLoadingState();
|
|
145
|
+
}
|
|
146
|
+
peer.optimisticKnownStates[msg.coValueID] = knownStateIn(msg);
|
|
147
|
+
peer.toldKnownState.add(msg.coValueID);
|
|
148
|
+
await peer.outgoing.write({
|
|
149
|
+
action: "tellKnownState",
|
|
150
|
+
coValueID: msg.coValueID,
|
|
151
|
+
header: false,
|
|
152
|
+
sessions: {},
|
|
153
|
+
});
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
peer.optimisticKnownStates[msg.coValueID] = knownStateIn(msg);
|
|
157
|
+
await this.tellUntoldKnownStateIncludingDependencies(msg.coValueID, peer);
|
|
158
|
+
await this.sendNewContentIncludingDependencies(msg.coValueID, peer);
|
|
236
159
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
peerOptimisticKnownState.sessions[sessionID] = newContentForSession.after + newContentForSession.newTransactions.length;
|
|
160
|
+
async handleTellKnownState(msg, peer) {
|
|
161
|
+
let entry = this.local.coValues[msg.coValueID];
|
|
162
|
+
peer.optimisticKnownStates[msg.coValueID] = combinedKnownStates(peer.optimisticKnownStates[msg.coValueID] || emptyKnownState(msg.coValueID), knownStateIn(msg));
|
|
163
|
+
if (!entry) {
|
|
164
|
+
if (msg.asDependencyOf) {
|
|
165
|
+
if (this.local.coValues[msg.asDependencyOf]) {
|
|
166
|
+
entry = newLoadingState();
|
|
167
|
+
this.local.coValues[msg.coValueID] = entry;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
throw new Error("Expected coValue dependency entry to be created, missing subscribe?");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
throw new Error("Expected coValue entry to be created, missing subscribe?");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (entry.state === "loading") {
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
await this.tellUntoldKnownStateIncludingDependencies(msg.coValueID, peer);
|
|
181
|
+
await this.sendNewContentIncludingDependencies(msg.coValueID, peer);
|
|
261
182
|
}
|
|
262
|
-
|
|
263
|
-
|
|
183
|
+
async handleNewContent(msg, peer) {
|
|
184
|
+
let entry = this.local.coValues[msg.coValueID];
|
|
185
|
+
if (!entry) {
|
|
186
|
+
throw new Error("Expected coValue entry to be created, missing subscribe?");
|
|
187
|
+
}
|
|
188
|
+
let resolveAfterDone;
|
|
189
|
+
const peerOptimisticKnownState = peer.optimisticKnownStates[msg.coValueID];
|
|
190
|
+
if (!peerOptimisticKnownState) {
|
|
191
|
+
throw new Error("Expected optimisticKnownState to be set for coValue we receive new content for");
|
|
192
|
+
}
|
|
193
|
+
if (entry.state === "loading") {
|
|
194
|
+
if (!msg.header) {
|
|
195
|
+
throw new Error("Expected header to be sent in first message");
|
|
196
|
+
}
|
|
197
|
+
peerOptimisticKnownState.header = true;
|
|
198
|
+
const coValue = new CoValue(msg.header, this.local);
|
|
199
|
+
resolveAfterDone = entry.resolve;
|
|
200
|
+
entry = {
|
|
201
|
+
state: "loaded",
|
|
202
|
+
coValue: coValue,
|
|
203
|
+
};
|
|
204
|
+
this.local.coValues[msg.coValueID] = entry;
|
|
205
|
+
}
|
|
206
|
+
const coValue = entry.coValue;
|
|
207
|
+
let invalidStateAssumed = false;
|
|
208
|
+
for (const [sessionID, newContentForSession] of Object.entries(msg.newContent)) {
|
|
209
|
+
const ourKnownTxIdx = coValue.sessions[sessionID]?.transactions.length;
|
|
210
|
+
const theirFirstNewTxIdx = newContentForSession.after;
|
|
211
|
+
if ((ourKnownTxIdx || 0) < theirFirstNewTxIdx) {
|
|
212
|
+
invalidStateAssumed = true;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const alreadyKnownOffset = ourKnownTxIdx
|
|
216
|
+
? ourKnownTxIdx - theirFirstNewTxIdx
|
|
217
|
+
: 0;
|
|
218
|
+
const newTransactions = newContentForSession.newTransactions.slice(alreadyKnownOffset);
|
|
219
|
+
const success = coValue.tryAddTransactions(sessionID, newTransactions, newContentForSession.lastHash, newContentForSession.lastSignature);
|
|
220
|
+
if (!success) {
|
|
221
|
+
console.error("Failed to add transactions", newTransactions);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
peerOptimisticKnownState.sessions[sessionID] =
|
|
225
|
+
newContentForSession.after +
|
|
226
|
+
newContentForSession.newTransactions.length;
|
|
227
|
+
}
|
|
228
|
+
if (resolveAfterDone) {
|
|
229
|
+
resolveAfterDone(coValue);
|
|
230
|
+
}
|
|
231
|
+
await this.syncCoValue(coValue);
|
|
232
|
+
if (invalidStateAssumed) {
|
|
233
|
+
await peer.outgoing.write({
|
|
234
|
+
action: "wrongAssumedKnownState",
|
|
235
|
+
...coValue.knownState(),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
264
238
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
239
|
+
async handleWrongAssumedKnownState(msg, peer) {
|
|
240
|
+
const coValue = this.local.expectCoValueLoaded(msg.coValueID);
|
|
241
|
+
peer.optimisticKnownStates[msg.coValueID] = combinedKnownStates(msg, coValue.knownState());
|
|
242
|
+
const newContent = coValue.newContentSince(msg);
|
|
243
|
+
if (newContent) {
|
|
244
|
+
await peer.outgoing.write(newContent);
|
|
245
|
+
}
|
|
271
246
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
const coValue = this.local.expectCoValueLoaded(msg.coValueID);
|
|
275
|
-
peer.optimisticKnownStates[msg.coValueID] = combinedKnownStates(
|
|
276
|
-
msg,
|
|
277
|
-
coValue.knownState()
|
|
278
|
-
);
|
|
279
|
-
const newContent = coValue.newContentSince(msg);
|
|
280
|
-
if (newContent) {
|
|
281
|
-
await peer.outgoing.write(newContent);
|
|
247
|
+
handleUnsubscribe(_msg) {
|
|
248
|
+
throw new Error("Method not implemented.");
|
|
282
249
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
await this.sendNewContentIncludingDependencies(
|
|
296
|
-
coValue.id,
|
|
297
|
-
peer
|
|
298
|
-
);
|
|
299
|
-
} else if (peer.role === "server") {
|
|
300
|
-
await this.subscribeToIncludingDependencies(
|
|
301
|
-
coValue.id,
|
|
302
|
-
peer
|
|
303
|
-
);
|
|
304
|
-
await this.sendNewContentIncludingDependencies(
|
|
305
|
-
coValue.id,
|
|
306
|
-
peer
|
|
307
|
-
);
|
|
308
|
-
}
|
|
250
|
+
async syncCoValue(coValue) {
|
|
251
|
+
for (const peer of Object.values(this.peers)) {
|
|
252
|
+
const optimisticKnownState = peer.optimisticKnownStates[coValue.id];
|
|
253
|
+
if (optimisticKnownState) {
|
|
254
|
+
await this.tellUntoldKnownStateIncludingDependencies(coValue.id, peer);
|
|
255
|
+
await this.sendNewContentIncludingDependencies(coValue.id, peer);
|
|
256
|
+
}
|
|
257
|
+
else if (peer.role === "server") {
|
|
258
|
+
await this.subscribeToIncludingDependencies(coValue.id, peer);
|
|
259
|
+
await this.sendNewContentIncludingDependencies(coValue.id, peer);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
309
262
|
}
|
|
310
|
-
}
|
|
311
263
|
}
|
|
312
264
|
function knownStateIn(msg) {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
265
|
+
return {
|
|
266
|
+
coValueID: msg.coValueID,
|
|
267
|
+
header: msg.header,
|
|
268
|
+
sessions: msg.sessions,
|
|
269
|
+
};
|
|
318
270
|
}
|
|
271
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|