cojson 0.13.10 → 0.13.12
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +15 -0
- package/dist/CoValuesStore.d.ts +3 -1
- package/dist/CoValuesStore.d.ts.map +1 -1
- package/dist/CoValuesStore.js +7 -6
- package/dist/CoValuesStore.js.map +1 -1
- package/dist/PeerKnownStates.d.ts +5 -25
- package/dist/PeerKnownStates.d.ts.map +1 -1
- package/dist/PeerKnownStates.js +7 -20
- package/dist/PeerKnownStates.js.map +1 -1
- package/dist/PeerState.d.ts +14 -9
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +51 -8
- package/dist/PeerState.js.map +1 -1
- package/dist/SyncStateManager.js +2 -2
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueCore.js +2 -2
- package/dist/coValueCore.js.map +1 -1
- package/dist/coValueState.d.ts +21 -46
- package/dist/coValueState.d.ts.map +1 -1
- package/dist/coValueState.js +174 -246
- package/dist/coValueState.js.map +1 -1
- package/dist/coValues/coList.d.ts +13 -2
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +60 -34
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coPlainText.d.ts +45 -0
- package/dist/coValues/coPlainText.d.ts.map +1 -1
- package/dist/coValues/coPlainText.js +61 -11
- package/dist/coValues/coPlainText.js.map +1 -1
- package/dist/coValues/group.js +2 -2
- package/dist/coValues/group.js.map +1 -1
- package/dist/exports.d.ts +2 -4
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +1 -2
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +20 -16
- package/dist/localNode.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +40 -92
- package/dist/sync.js.map +1 -1
- package/dist/tests/PeerKnownStates.test.js +9 -14
- package/dist/tests/PeerKnownStates.test.js.map +1 -1
- package/dist/tests/PeerState.test.js +22 -34
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/coList.test.js +63 -0
- package/dist/tests/coList.test.js.map +1 -1
- package/dist/tests/coPlainText.test.js +66 -11
- package/dist/tests/coPlainText.test.js.map +1 -1
- package/dist/tests/coValueState.test.js +57 -104
- package/dist/tests/coValueState.test.js.map +1 -1
- package/dist/tests/group.test.js +1 -2
- package/dist/tests/group.test.js.map +1 -1
- package/dist/tests/messagesTestUtils.d.ts +4 -1
- package/dist/tests/messagesTestUtils.d.ts.map +1 -1
- package/dist/tests/messagesTestUtils.js +10 -0
- package/dist/tests/messagesTestUtils.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +65 -3
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +8 -8
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.test.js +6 -4
- package/dist/tests/sync.test.js.map +1 -1
- package/package.json +1 -1
- package/src/CoValuesStore.ts +9 -6
- package/src/PeerKnownStates.ts +19 -56
- package/src/PeerState.ts +69 -13
- package/src/SyncStateManager.ts +2 -2
- package/src/coValueCore.ts +2 -2
- package/src/coValueState.ts +197 -317
- package/src/coValues/coList.ts +84 -44
- package/src/coValues/coPlainText.ts +75 -11
- package/src/coValues/group.ts +2 -2
- package/src/exports.ts +0 -6
- package/src/localNode.ts +30 -21
- package/src/sync.ts +46 -95
- package/src/tests/PeerKnownStates.test.ts +9 -14
- package/src/tests/PeerState.test.ts +27 -40
- package/src/tests/coList.test.ts +83 -0
- package/src/tests/coPlainText.test.ts +81 -11
- package/src/tests/coValueState.test.ts +55 -106
- package/src/tests/group.test.ts +2 -2
- package/src/tests/messagesTestUtils.ts +12 -1
- package/src/tests/sync.mesh.test.ts +81 -3
- package/src/tests/sync.peerReconciliation.test.ts +8 -8
- package/src/tests/sync.test.ts +8 -23
- package/dist/storage/FileSystem.d.ts +0 -37
- package/dist/storage/FileSystem.d.ts.map +0 -1
- package/dist/storage/FileSystem.js +0 -48
- package/dist/storage/FileSystem.js.map +0 -1
- package/dist/storage/chunksAndKnownStates.d.ts +0 -7
- package/dist/storage/chunksAndKnownStates.d.ts.map +0 -1
- package/dist/storage/chunksAndKnownStates.js +0 -98
- package/dist/storage/chunksAndKnownStates.js.map +0 -1
- package/dist/storage/index.d.ts +0 -52
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -335
- package/dist/storage/index.js.map +0 -1
- package/src/storage/FileSystem.ts +0 -113
- package/src/storage/chunksAndKnownStates.ts +0 -137
- package/src/storage/index.ts +0 -531
package/dist/coValueState.js
CHANGED
|
@@ -1,69 +1,17 @@
|
|
|
1
1
|
import { ValueType } from "@opentelemetry/api";
|
|
2
2
|
import { metrics } from "@opentelemetry/api";
|
|
3
3
|
import { logger } from "./logger.js";
|
|
4
|
+
import { emptyKnownState } from "./sync.js";
|
|
4
5
|
export const CO_VALUE_LOADING_CONFIG = {
|
|
5
6
|
MAX_RETRIES: 2,
|
|
6
7
|
TIMEOUT: 30000,
|
|
7
8
|
};
|
|
8
|
-
export class CoValueUnknownState {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.type = "unknown";
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export class CoValueLoadingState {
|
|
14
|
-
constructor(peersIds) {
|
|
15
|
-
this.type = "loading";
|
|
16
|
-
this.peers = new Map();
|
|
17
|
-
this.peers = new Map();
|
|
18
|
-
for (const peerId of peersIds) {
|
|
19
|
-
this.peers.set(peerId, createResolvablePromise());
|
|
20
|
-
}
|
|
21
|
-
const { resolve, promise } = createResolvablePromise();
|
|
22
|
-
this.result = promise;
|
|
23
|
-
this.resolveResult = resolve;
|
|
24
|
-
}
|
|
25
|
-
markAsUnavailable(peerId) {
|
|
26
|
-
const entry = this.peers.get(peerId);
|
|
27
|
-
if (entry) {
|
|
28
|
-
entry.resolve();
|
|
29
|
-
}
|
|
30
|
-
this.peers.delete(peerId);
|
|
31
|
-
// If none of the peers have the coValue, we resolve to unavailable
|
|
32
|
-
if (this.peers.size === 0) {
|
|
33
|
-
this.resolve("unavailable");
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
resolve(value) {
|
|
37
|
-
this.resolveResult(value);
|
|
38
|
-
for (const entry of this.peers.values()) {
|
|
39
|
-
entry.resolve();
|
|
40
|
-
}
|
|
41
|
-
this.peers.clear();
|
|
42
|
-
}
|
|
43
|
-
// Wait for a specific peer to have a known state
|
|
44
|
-
waitForPeer(peerId) {
|
|
45
|
-
const entry = this.peers.get(peerId);
|
|
46
|
-
if (!entry) {
|
|
47
|
-
return Promise.resolve();
|
|
48
|
-
}
|
|
49
|
-
return entry.promise;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export class CoValueAvailableState {
|
|
53
|
-
constructor(coValue) {
|
|
54
|
-
this.coValue = coValue;
|
|
55
|
-
this.type = "available";
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export class CoValueUnavailableState {
|
|
59
|
-
constructor() {
|
|
60
|
-
this.type = "unavailable";
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
9
|
export class CoValueState {
|
|
64
|
-
constructor(id
|
|
10
|
+
constructor(id) {
|
|
11
|
+
this.peers = new Map();
|
|
12
|
+
this.core = null;
|
|
13
|
+
this.listeners = new Set();
|
|
65
14
|
this.id = id;
|
|
66
|
-
this.state = state;
|
|
67
15
|
this.counter = metrics
|
|
68
16
|
.getMeter("cojson")
|
|
69
17
|
.createUpDownCounter("jazz.covalues.loaded", {
|
|
@@ -71,204 +19,200 @@ export class CoValueState {
|
|
|
71
19
|
unit: "covalue",
|
|
72
20
|
valueType: ValueType.INT,
|
|
73
21
|
});
|
|
74
|
-
this.
|
|
75
|
-
state: this.state.type,
|
|
76
|
-
});
|
|
22
|
+
this.updateCounter(null);
|
|
77
23
|
}
|
|
78
|
-
|
|
79
|
-
|
|
24
|
+
get highLevelState() {
|
|
25
|
+
if (this.core) {
|
|
26
|
+
return "available";
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
if (this.peers.size === 0) {
|
|
30
|
+
return "unknown";
|
|
31
|
+
}
|
|
32
|
+
else if (this.peers
|
|
33
|
+
.values()
|
|
34
|
+
.every((p) => p.type === "unavailable" || p.type === "errored")) {
|
|
35
|
+
return "unavailable";
|
|
36
|
+
}
|
|
37
|
+
else if (this.peers.values().some((p) => p.type === "pending")) {
|
|
38
|
+
return "loading";
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
80
44
|
}
|
|
81
|
-
|
|
82
|
-
return
|
|
45
|
+
isErroredInPeer(peerId) {
|
|
46
|
+
return this.peers.get(peerId)?.type === "errored";
|
|
83
47
|
}
|
|
84
|
-
|
|
85
|
-
return
|
|
48
|
+
isAvailable() {
|
|
49
|
+
return !!this.core;
|
|
86
50
|
}
|
|
87
|
-
|
|
88
|
-
|
|
51
|
+
addListener(listener) {
|
|
52
|
+
this.listeners.add(listener);
|
|
53
|
+
listener(this);
|
|
89
54
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
55
|
+
removeListener(listener) {
|
|
56
|
+
this.listeners.delete(listener);
|
|
57
|
+
}
|
|
58
|
+
notifyListeners() {
|
|
59
|
+
for (const listener of this.listeners) {
|
|
60
|
+
listener(this);
|
|
93
61
|
}
|
|
94
|
-
|
|
62
|
+
}
|
|
63
|
+
async getCoValue() {
|
|
64
|
+
if (this.highLevelState === "unavailable") {
|
|
95
65
|
return "unavailable";
|
|
96
66
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
moveToState(value) {
|
|
107
|
-
this.counter.add(-1, {
|
|
108
|
-
state: this.state.type,
|
|
109
|
-
});
|
|
110
|
-
this.state = value;
|
|
111
|
-
this.counter.add(1, {
|
|
112
|
-
state: this.state.type,
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
const listener = (state) => {
|
|
69
|
+
if (state.core) {
|
|
70
|
+
resolve(state.core);
|
|
71
|
+
this.removeListener(listener);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
this.addListener(listener);
|
|
113
75
|
});
|
|
114
|
-
if (!this.resolve) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
// If the state is available we resolve the promise
|
|
118
|
-
// and clear it to handle the possible transition from unavailable to available
|
|
119
|
-
if (value.type === "available") {
|
|
120
|
-
this.resolve(value.coValue);
|
|
121
|
-
this.clearPromise();
|
|
122
|
-
}
|
|
123
|
-
else if (value.type === "unavailable") {
|
|
124
|
-
this.resolve("unavailable");
|
|
125
|
-
this.clearPromise();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
clearPromise() {
|
|
129
|
-
this.promise = undefined;
|
|
130
|
-
this.resolve = undefined;
|
|
131
76
|
}
|
|
132
77
|
async loadFromPeers(peers) {
|
|
133
|
-
const state = this.state;
|
|
134
|
-
if (state.type === "loading" || state.type === "available") {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
78
|
if (peers.length === 0) {
|
|
138
|
-
this.moveToState(new CoValueUnavailableState());
|
|
139
79
|
return;
|
|
140
80
|
}
|
|
141
|
-
const
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
81
|
+
const loadAttempt = async (peersToLoadFrom) => {
|
|
82
|
+
const peersToActuallyLoadFrom = [];
|
|
83
|
+
for (const peer of peersToLoadFrom) {
|
|
84
|
+
const currentState = this.peers.get(peer.id);
|
|
85
|
+
if (currentState?.type === "available") {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (currentState?.type === "errored") {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (currentState?.type === "unavailable" ||
|
|
92
|
+
currentState?.type === "pending") {
|
|
93
|
+
if (peer.shouldRetryUnavailableCoValues()) {
|
|
94
|
+
this.markPending(peer.id);
|
|
95
|
+
peersToActuallyLoadFrom.push(peer);
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!currentState || currentState?.type === "unknown") {
|
|
100
|
+
this.markPending(peer.id);
|
|
101
|
+
peersToActuallyLoadFrom.push(peer);
|
|
102
|
+
}
|
|
149
103
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
104
|
+
for (const peer of peersToActuallyLoadFrom) {
|
|
105
|
+
if (peer.closed) {
|
|
106
|
+
this.markNotFoundInPeer(peer.id);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
peer
|
|
110
|
+
.pushOutgoingMessage({
|
|
111
|
+
action: "load",
|
|
112
|
+
...(this.core ? this.core.knownState() : emptyKnownState(this.id)),
|
|
113
|
+
})
|
|
114
|
+
.catch((err) => {
|
|
115
|
+
logger.warn(`Failed to push load message to peer ${peer.id}`, {
|
|
116
|
+
err,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Use a very long timeout for storage peers, because under pressure
|
|
121
|
+
* they may take a long time to consume the messages queue
|
|
122
|
+
*
|
|
123
|
+
* TODO: Track errors on storage and do not rely on timeout
|
|
124
|
+
*/
|
|
125
|
+
const timeoutDuration = peer.role === "storage"
|
|
126
|
+
? CO_VALUE_LOADING_CONFIG.TIMEOUT * 10
|
|
127
|
+
: CO_VALUE_LOADING_CONFIG.TIMEOUT;
|
|
128
|
+
const waitingForPeer = new Promise((resolve) => {
|
|
129
|
+
const markNotFound = () => {
|
|
130
|
+
if (this.peers.get(peer.id)?.type === "pending") {
|
|
131
|
+
this.markNotFoundInPeer(peer.id);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const timeout = setTimeout(markNotFound, timeoutDuration);
|
|
135
|
+
const removeCloseListener = peer.addCloseListener(markNotFound);
|
|
136
|
+
const listener = (state) => {
|
|
137
|
+
const peerState = state.peers.get(peer.id);
|
|
138
|
+
if (state.isAvailable() || // might have become available from another peer e.g. through handleNewContent
|
|
139
|
+
peerState?.type === "available" ||
|
|
140
|
+
peerState?.type === "errored" ||
|
|
141
|
+
peerState?.type === "unavailable") {
|
|
142
|
+
state.removeListener(listener);
|
|
143
|
+
removeCloseListener();
|
|
144
|
+
clearTimeout(timeout);
|
|
145
|
+
resolve();
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
this.addListener(listener);
|
|
149
|
+
});
|
|
150
|
+
await waitingForPeer;
|
|
161
151
|
}
|
|
162
|
-
return currentState.type === "available";
|
|
163
152
|
};
|
|
164
|
-
await
|
|
153
|
+
await loadAttempt(peers);
|
|
154
|
+
if (this.isAvailable()) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
165
157
|
// Retry loading from peers that have the retry flag enabled
|
|
166
158
|
const peersWithRetry = peers.filter((p) => p.shouldRetryUnavailableCoValues());
|
|
167
159
|
if (peersWithRetry.length > 0) {
|
|
160
|
+
const waitingForCoValue = new Promise((resolve) => {
|
|
161
|
+
const listener = (state) => {
|
|
162
|
+
if (state.isAvailable()) {
|
|
163
|
+
resolve();
|
|
164
|
+
this.removeListener(listener);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
this.addListener(listener);
|
|
168
|
+
});
|
|
168
169
|
// We want to exit early if the coValue becomes available in between the retries
|
|
169
170
|
await Promise.race([
|
|
170
|
-
|
|
171
|
-
runWithRetry(() =>
|
|
171
|
+
waitingForCoValue,
|
|
172
|
+
runWithRetry(() => loadAttempt(peersWithRetry), CO_VALUE_LOADING_CONFIG.MAX_RETRIES),
|
|
172
173
|
]);
|
|
173
174
|
}
|
|
174
|
-
// If after the retries the coValue is still loading, we consider the load failed
|
|
175
|
-
if (this.state.type === "loading") {
|
|
176
|
-
this.moveToState(new CoValueUnavailableState());
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
dispatch(action) {
|
|
180
|
-
const currentState = this.state;
|
|
181
|
-
switch (action.type) {
|
|
182
|
-
case "available":
|
|
183
|
-
if (currentState.type === "loading") {
|
|
184
|
-
currentState.resolve(action.coValue);
|
|
185
|
-
}
|
|
186
|
-
// It should be always possible to move to the available state
|
|
187
|
-
this.moveToState(new CoValueAvailableState(action.coValue));
|
|
188
|
-
break;
|
|
189
|
-
case "not-found-in-peer":
|
|
190
|
-
if (currentState.type === "loading") {
|
|
191
|
-
currentState.markAsUnavailable(action.peerId);
|
|
192
|
-
}
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
175
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
logger.warn(`Failed to push load message to peer ${peer.id}`, {
|
|
237
|
-
err,
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
if (coValueEntry.state.type === "loading") {
|
|
242
|
-
const { promise, resolve } = createResolvablePromise();
|
|
243
|
-
/**
|
|
244
|
-
* Use a very long timeout for storage peers, because under pressure
|
|
245
|
-
* they may take a long time to consume the messages queue
|
|
246
|
-
*
|
|
247
|
-
* TODO: Track errors on storage and do not rely on timeout
|
|
248
|
-
*/
|
|
249
|
-
const timeoutDuration = peer.role === "storage"
|
|
250
|
-
? CO_VALUE_LOADING_CONFIG.TIMEOUT * 10
|
|
251
|
-
: CO_VALUE_LOADING_CONFIG.TIMEOUT;
|
|
252
|
-
const handleTimeoutOrClose = () => {
|
|
253
|
-
if (coValueEntry.state.type === "loading") {
|
|
254
|
-
logger.warn("Failed to load coValue from peer", {
|
|
255
|
-
coValueId: coValueEntry.id,
|
|
256
|
-
peerId: peer.id,
|
|
257
|
-
peerRole: peer.role,
|
|
258
|
-
});
|
|
259
|
-
coValueEntry.dispatch({
|
|
260
|
-
type: "not-found-in-peer",
|
|
261
|
-
peerId: peer.id,
|
|
262
|
-
});
|
|
263
|
-
resolve();
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
const timeout = setTimeout(handleTimeoutOrClose, timeoutDuration);
|
|
267
|
-
const closeListener = peer.addCloseListener(handleTimeoutOrClose);
|
|
268
|
-
await Promise.race([promise, coValueEntry.state.waitForPeer(peer.id)]);
|
|
269
|
-
clearTimeout(timeout);
|
|
270
|
-
closeListener();
|
|
271
|
-
}
|
|
176
|
+
updateCounter(previousState) {
|
|
177
|
+
const newState = this.highLevelState;
|
|
178
|
+
if (previousState !== newState) {
|
|
179
|
+
if (previousState) {
|
|
180
|
+
this.counter.add(-1, { state: previousState });
|
|
181
|
+
}
|
|
182
|
+
this.counter.add(1, { state: newState });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
markNotFoundInPeer(peerId) {
|
|
186
|
+
const previousState = this.highLevelState;
|
|
187
|
+
this.peers.set(peerId, { type: "unavailable" });
|
|
188
|
+
this.updateCounter(previousState);
|
|
189
|
+
this.notifyListeners();
|
|
190
|
+
}
|
|
191
|
+
// TODO: rename to "provided"
|
|
192
|
+
markAvailable(coValue, fromPeerId) {
|
|
193
|
+
const previousState = this.highLevelState;
|
|
194
|
+
this.core = coValue;
|
|
195
|
+
this.peers.set(fromPeerId, { type: "available" });
|
|
196
|
+
this.updateCounter(previousState);
|
|
197
|
+
this.notifyListeners();
|
|
198
|
+
}
|
|
199
|
+
internalMarkMagicallyAvailable(coValue) {
|
|
200
|
+
const previousState = this.highLevelState;
|
|
201
|
+
this.core = coValue;
|
|
202
|
+
this.updateCounter(previousState);
|
|
203
|
+
this.notifyListeners();
|
|
204
|
+
}
|
|
205
|
+
markErrored(peerId, error) {
|
|
206
|
+
const previousState = this.highLevelState;
|
|
207
|
+
this.peers.set(peerId, { type: "errored", error });
|
|
208
|
+
this.updateCounter(previousState);
|
|
209
|
+
this.notifyListeners();
|
|
210
|
+
}
|
|
211
|
+
markPending(peerId) {
|
|
212
|
+
const previousState = this.highLevelState;
|
|
213
|
+
this.peers.set(peerId, { type: "pending" });
|
|
214
|
+
this.updateCounter(previousState);
|
|
215
|
+
this.notifyListeners();
|
|
272
216
|
}
|
|
273
217
|
}
|
|
274
218
|
async function runWithRetry(fn, maxRetries) {
|
|
@@ -289,23 +233,7 @@ async function runWithRetry(fn, maxRetries) {
|
|
|
289
233
|
retries++;
|
|
290
234
|
}
|
|
291
235
|
}
|
|
292
|
-
function createResolvablePromise() {
|
|
293
|
-
let resolve;
|
|
294
|
-
const promise = new Promise((res) => {
|
|
295
|
-
resolve = res;
|
|
296
|
-
});
|
|
297
|
-
return { promise, resolve };
|
|
298
|
-
}
|
|
299
236
|
function sleep(ms) {
|
|
300
237
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
301
238
|
}
|
|
302
|
-
function getPeersWithoutErrors(peers, coValueId) {
|
|
303
|
-
return peers.filter((p) => {
|
|
304
|
-
if (p.erroredCoValues.has(coValueId)) {
|
|
305
|
-
logger.warn(`Skipping load on errored coValue ${coValueId} from peer ${p.id}`);
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
return true;
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
239
|
//# sourceMappingURL=coValueState.js.map
|
package/dist/coValueState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coValueState.js","sourceRoot":"","sources":["../src/coValueState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAiB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"coValueState.js","sourceRoot":"","sources":["../src/coValueState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAiB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAU,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,KAAM;CAChB,CAAC;AAEF,MAAM,OAAO,YAAY;IAgBvB,YAAY,EAAW;QAff,UAAK,GAAG,IAAI,GAAG,EAOpB,CAAC;QAEJ,SAAI,GAAuB,IAAI,CAAC;QAGxB,cAAS,GAAuC,IAAI,GAAG,EAAE,CAAC;QAIhE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,IAAI,CAAC,OAAO,GAAG,OAAO;aACnB,QAAQ,CAAC,QAAQ,CAAC;aAClB,mBAAmB,CAAC,sBAAsB,EAAE;YAC3C,WAAW,EAAE,sCAAsC;YACnD,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,SAAS,CAAC,GAAG;SACzB,CAAC,CAAC;QAEL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,WAAW,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;iBAAM,IACL,IAAI,CAAC,KAAK;iBACP,MAAM,EAAE;iBACR,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EACjE,CAAC;gBACD,OAAO,aAAa,CAAC;YACvB,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;gBACjE,OAAO,SAAS,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC;IACpD,CAAC;IAED,WAAW;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,QAAuC;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,QAAuC;QACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe;QACrB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,cAAc,KAAK,aAAa,EAAE,CAAC;YAC1C,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;YAC1C,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;gBACvC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAkB;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,EAAE,eAA4B,EAAE,EAAE;YACzD,MAAM,uBAAuB,GAAG,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;gBACnC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAE7C,IAAI,YAAY,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;oBACvC,SAAS;gBACX,CAAC;gBAED,IAAI,YAAY,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBACrC,SAAS;gBACX,CAAC;gBAED,IACE,YAAY,EAAE,IAAI,KAAK,aAAa;oBACpC,YAAY,EAAE,IAAI,KAAK,SAAS,EAChC,CAAC;oBACD,IAAI,IAAI,CAAC,8BAA8B,EAAE,EAAE,CAAC;wBAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC1B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrC,CAAC;oBAED,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC1B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,CAAC;gBAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjC,SAAS;gBACX,CAAC;gBAED,IAAI;qBACD,mBAAmB,CAAC;oBACnB,MAAM,EAAE,MAAM;oBACd,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;iBACnE,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,MAAM,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,EAAE,EAAE,EAAE;wBAC5D,GAAG;qBACJ,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEL;;;;;mBAKG;gBACH,MAAM,eAAe,GACnB,IAAI,CAAC,IAAI,KAAK,SAAS;oBACrB,CAAC,CAAC,uBAAuB,CAAC,OAAO,GAAG,EAAE;oBACtC,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC;gBAEtC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBACnD,MAAM,YAAY,GAAG,GAAG,EAAE;wBACxB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;4BAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACnC,CAAC;oBACH,CAAC,CAAC;oBAEF,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;oBAC1D,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;oBAEhE,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;wBACvC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC3C,IACE,KAAK,CAAC,WAAW,EAAE,IAAI,8EAA8E;4BACrG,SAAS,EAAE,IAAI,KAAK,WAAW;4BAC/B,SAAS,EAAE,IAAI,KAAK,SAAS;4BAC7B,SAAS,EAAE,IAAI,KAAK,aAAa,EACjC,CAAC;4BACD,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;4BAC/B,mBAAmB,EAAE,CAAC;4BACtB,YAAY,CAAC,OAAO,CAAC,CAAC;4BACtB,OAAO,EAAE,CAAC;wBACZ,CAAC;oBACH,CAAC,CAAC;oBAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;gBAEH,MAAM,cAAc,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,4DAA4D;QAC5D,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,CAAC,CAAC,8BAA8B,EAAE,CACnC,CAAC;QAEF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACtD,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,EAAE;oBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,OAAO,EAAE,CAAC;wBACV,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,gFAAgF;YAChF,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,iBAAiB;gBACjB,YAAY,CACV,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,EACjC,uBAAuB,CAAC,WAAW,CACpC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,aAA4B;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QAErC,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,6BAA6B;IAC7B,aAAa,CAAC,OAAoB,EAAE,UAAkB;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,8BAA8B,CAAC,OAAoB;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,MAAc,EAAE,KAA8B;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,YAAY,CAAI,EAAoB,EAAE,UAAkB;IACrE,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,OAAO,GAAG,UAAU,EAAE,CAAC;QAC5B;;;;;;WAMG;QACH,MAAM,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAE1B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { CoID, RawCoValue } from "../coValue.js";
|
|
|
2
2
|
import { CoValueCore } from "../coValueCore.js";
|
|
3
3
|
import { AgentID, SessionID, TransactionID } from "../ids.js";
|
|
4
4
|
import { JsonObject, JsonValue } from "../jsonValue.js";
|
|
5
|
+
import { CoValueKnownState } from "../sync.js";
|
|
5
6
|
import { RawAccountID } from "./account.js";
|
|
6
7
|
import { RawGroup } from "./group.js";
|
|
7
8
|
export type OpID = TransactionID & {
|
|
@@ -66,7 +67,10 @@ export declare class RawCoListView<Item extends JsonValue = JsonValue, Meta exte
|
|
|
66
67
|
opID: OpID;
|
|
67
68
|
}[];
|
|
68
69
|
/** @internal */
|
|
70
|
+
knownTransactions: CoValueKnownState["sessions"];
|
|
71
|
+
/** @internal */
|
|
69
72
|
constructor(core: CoValueCore);
|
|
73
|
+
processNewTransactions(): void;
|
|
70
74
|
/** @category 6. Meta */
|
|
71
75
|
get headerMeta(): Meta;
|
|
72
76
|
/** @category 6. Meta */
|
|
@@ -135,6 +139,15 @@ export declare class RawCoList<Item extends JsonValue = JsonValue, Meta extends
|
|
|
135
139
|
* @category 2. Editing
|
|
136
140
|
**/
|
|
137
141
|
append(item: Item, after?: number, privacy?: "private" | "trusting"): void;
|
|
142
|
+
/**
|
|
143
|
+
* Appends `items` to the list at index `after`. If `after` is negative, it is treated as `0`.
|
|
144
|
+
*
|
|
145
|
+
* If `privacy` is `"private"` **(default)**, `items` are encrypted in the transaction, only readable by other members of the group this `CoList` belongs to. Not even sync servers can see the content in plaintext.
|
|
146
|
+
*
|
|
147
|
+
* If `privacy` is `"trusting"`, `items` are stored in plaintext in the transaction, visible to everyone who gets a hold of it, including sync servers.
|
|
148
|
+
*
|
|
149
|
+
* @category 2. Editing
|
|
150
|
+
*/
|
|
138
151
|
appendItems(items: Item[], after?: number, privacy?: "private" | "trusting"): void;
|
|
139
152
|
/**
|
|
140
153
|
* Prepends `item` before the item currently at index `before`.
|
|
@@ -156,8 +169,6 @@ export declare class RawCoList<Item extends JsonValue = JsonValue, Meta extends
|
|
|
156
169
|
**/
|
|
157
170
|
delete(at: number, privacy?: "private" | "trusting"): void;
|
|
158
171
|
replace(at: number, newItem: Item, privacy?: "private" | "trusting"): void;
|
|
159
|
-
/** @internal */
|
|
160
|
-
rebuildFromCore(): void;
|
|
161
172
|
}
|
|
162
173
|
export {};
|
|
163
174
|
//# sourceMappingURL=coList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coList.d.ts","sourceRoot":"","sources":["../../src/coValues/coList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"coList.d.ts","sourceRoot":"","sources":["../../src/coValues/coList.ts"],"names":[],"mappings":"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"}
|