cojson 0.20.0 → 0.20.2
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 +21 -0
- package/dist/GarbageCollector.d.ts +3 -3
- package/dist/GarbageCollector.d.ts.map +1 -1
- package/dist/GarbageCollector.js +4 -4
- package/dist/GarbageCollector.js.map +1 -1
- package/dist/PeerState.d.ts +6 -1
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +18 -3
- package/dist/PeerState.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +26 -5
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +115 -50
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValues/coList.d.ts +1 -0
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +3 -0
- package/dist/coValues/coList.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/exports.d.ts +3 -3
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +2 -2
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts +12 -0
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +51 -3
- package/dist/localNode.js.map +1 -1
- package/dist/queue/LinkedList.d.ts +9 -3
- package/dist/queue/LinkedList.d.ts.map +1 -1
- package/dist/queue/LinkedList.js +30 -1
- package/dist/queue/LinkedList.js.map +1 -1
- package/dist/queue/OutgoingLoadQueue.d.ts +95 -0
- package/dist/queue/OutgoingLoadQueue.d.ts.map +1 -0
- package/dist/queue/OutgoingLoadQueue.js +240 -0
- package/dist/queue/OutgoingLoadQueue.js.map +1 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +34 -41
- package/dist/sync.js.map +1 -1
- package/dist/tests/LinkedList.test.js +90 -0
- package/dist/tests/LinkedList.test.js.map +1 -1
- package/dist/tests/OutgoingLoadQueue.test.d.ts +2 -0
- package/dist/tests/OutgoingLoadQueue.test.d.ts.map +1 -0
- package/dist/tests/OutgoingLoadQueue.test.js +814 -0
- package/dist/tests/OutgoingLoadQueue.test.js.map +1 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js +87 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
- package/dist/tests/knownState.lazyLoading.test.js +44 -0
- package/dist/tests/knownState.lazyLoading.test.js.map +1 -1
- package/dist/tests/sync.concurrentLoad.test.d.ts +2 -0
- package/dist/tests/sync.concurrentLoad.test.d.ts.map +1 -0
- package/dist/tests/sync.concurrentLoad.test.js +481 -0
- package/dist/tests/sync.concurrentLoad.test.js.map +1 -0
- package/dist/tests/sync.garbageCollection.test.js +87 -3
- package/dist/tests/sync.garbageCollection.test.js.map +1 -1
- package/dist/tests/sync.multipleServers.test.js +0 -62
- package/dist/tests/sync.multipleServers.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +156 -0
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +1 -1
- package/dist/tests/testStorage.d.ts.map +1 -1
- package/dist/tests/testStorage.js +3 -1
- package/dist/tests/testStorage.js.map +1 -1
- package/dist/tests/testUtils.d.ts +1 -0
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +2 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +4 -4
- package/src/GarbageCollector.ts +4 -3
- package/src/PeerState.ts +26 -3
- package/src/coValueCore/coValueCore.ts +129 -53
- package/src/coValues/coList.ts +4 -0
- package/src/config.ts +4 -4
- package/src/exports.ts +2 -2
- package/src/localNode.ts +65 -4
- package/src/queue/LinkedList.ts +34 -4
- package/src/queue/OutgoingLoadQueue.ts +307 -0
- package/src/sync.ts +37 -43
- package/src/tests/LinkedList.test.ts +111 -0
- package/src/tests/OutgoingLoadQueue.test.ts +1129 -0
- package/src/tests/coValueCore.loadFromStorage.test.ts +108 -0
- package/src/tests/knownState.lazyLoading.test.ts +52 -0
- package/src/tests/sync.concurrentLoad.test.ts +650 -0
- package/src/tests/sync.garbageCollection.test.ts +115 -3
- package/src/tests/sync.multipleServers.test.ts +0 -65
- package/src/tests/sync.peerReconciliation.test.ts +199 -0
- package/src/tests/sync.storage.test.ts +1 -1
- package/src/tests/testStorage.ts +3 -1
- package/src/tests/testUtils.ts +3 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# cojson
|
|
2
2
|
|
|
3
|
+
## 0.20.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 251a89e: Optimized peer reconciliation to prevent unnecessary data transfer on reconnect.
|
|
8
|
+
- cojson-core-wasm@0.20.2
|
|
9
|
+
- cojson-core-rn@0.20.2
|
|
10
|
+
- cojson-core-napi@0.20.2
|
|
11
|
+
|
|
12
|
+
## 0.20.1
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 03195eb: Added client-side load request throttling to improve the loading experience when loading a lot of data concurrently.
|
|
17
|
+
|
|
18
|
+
When a client requests more than 1k CoValues concurrently, load requests are now queued locally and sent as capacity becomes available.
|
|
19
|
+
|
|
20
|
+
- cojson-core-wasm@0.20.1
|
|
21
|
+
- cojson-core-rn@0.20.1
|
|
22
|
+
- cojson-core-napi@0.20.1
|
|
23
|
+
|
|
3
24
|
## 0.20.0
|
|
4
25
|
|
|
5
26
|
### Minor Changes
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { CoValueCore } from "./coValueCore/coValueCore.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { LocalNode } from "./localNode.js";
|
|
3
3
|
/**
|
|
4
4
|
* TTL-based garbage collector for removing unused CoValues from memory.
|
|
5
5
|
*/
|
|
6
6
|
export declare class GarbageCollector {
|
|
7
|
-
private readonly
|
|
7
|
+
private readonly node;
|
|
8
8
|
private readonly interval;
|
|
9
|
-
constructor(
|
|
9
|
+
constructor(node: LocalNode);
|
|
10
10
|
getCurrentTime(): number;
|
|
11
11
|
trackCoValueAccess({ verified }: CoValueCore): void;
|
|
12
12
|
collect(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GarbageCollector.d.ts","sourceRoot":"","sources":["../src/GarbageCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"GarbageCollector.d.ts","sourceRoot":"","sources":["../src/GarbageCollector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;gBAE7B,IAAI,EAAE,SAAS;IAM5C,cAAc;IAId,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW;IAM5C,OAAO;IAiBP,IAAI;CAGL"}
|
package/dist/GarbageCollector.js
CHANGED
|
@@ -3,8 +3,8 @@ import { GARBAGE_COLLECTOR_CONFIG } from "./config.js";
|
|
|
3
3
|
* TTL-based garbage collector for removing unused CoValues from memory.
|
|
4
4
|
*/
|
|
5
5
|
export class GarbageCollector {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
6
|
+
constructor(node) {
|
|
7
|
+
this.node = node;
|
|
8
8
|
this.interval = setInterval(() => {
|
|
9
9
|
this.collect();
|
|
10
10
|
}, GARBAGE_COLLECTOR_CONFIG.INTERVAL);
|
|
@@ -19,14 +19,14 @@ export class GarbageCollector {
|
|
|
19
19
|
}
|
|
20
20
|
collect() {
|
|
21
21
|
const currentTime = this.getCurrentTime();
|
|
22
|
-
for (const coValue of this.
|
|
22
|
+
for (const coValue of this.node.allCoValues()) {
|
|
23
23
|
const { verified } = coValue;
|
|
24
24
|
if (!verified?.lastAccessed) {
|
|
25
25
|
continue;
|
|
26
26
|
}
|
|
27
27
|
const timeSinceLastAccessed = currentTime - verified.lastAccessed;
|
|
28
28
|
if (timeSinceLastAccessed > GARBAGE_COLLECTOR_CONFIG.MAX_AGE) {
|
|
29
|
-
coValue.
|
|
29
|
+
this.node.internalUnmountCoValue(coValue.id);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GarbageCollector.js","sourceRoot":"","sources":["../src/GarbageCollector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"GarbageCollector.js","sourceRoot":"","sources":["../src/GarbageCollector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAIvD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAG3B,YAA6B,IAAe;QAAf,SAAI,GAAJ,IAAI,CAAW;QAC1C,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,cAAc;QACZ,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,kBAAkB,CAAC,EAAE,QAAQ,EAAe;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;YAE7B,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,MAAM,qBAAqB,GAAG,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;YAElE,IAAI,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,EAAE,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QACF,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
package/dist/PeerState.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PeerKnownState } from "./coValueCore/PeerKnownState.js";
|
|
2
|
+
import { CoValueCore } from "./exports.js";
|
|
2
3
|
import { RawCoID } from "./ids.js";
|
|
3
4
|
import { CoValueKnownState } from "./knownState.js";
|
|
5
|
+
import { type LoadMode } from "./queue/OutgoingLoadQueue.js";
|
|
4
6
|
import { Peer, SyncMessage } from "./sync.js";
|
|
5
7
|
export declare class PeerState {
|
|
6
8
|
private peer;
|
|
@@ -23,7 +25,10 @@ export declare class PeerState {
|
|
|
23
25
|
newPeerStateFrom(peer: Peer): PeerState;
|
|
24
26
|
readonly toldKnownState: Set<RawCoID>;
|
|
25
27
|
readonly loadRequestSent: Set<RawCoID>;
|
|
26
|
-
|
|
28
|
+
private loadQueue;
|
|
29
|
+
sendLoadRequest(coValue: CoValueCore, mode?: LoadMode): void;
|
|
30
|
+
trackLoadRequestUpdate(coValue: CoValueCore): void;
|
|
31
|
+
trackLoadRequestComplete(coValue: CoValueCore): void;
|
|
27
32
|
trackToldKnownState(id: RawCoID): void;
|
|
28
33
|
private getOrCreateKnownState;
|
|
29
34
|
updateHeader(id: RawCoID, header: boolean): void;
|
package/dist/PeerState.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeerState.d.ts","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,SAAS;IASlB,OAAO,CAAC,IAAI;IARd;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;gBAGlD,IAAI,EAAE,IAAI,EAClB,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"PeerState.d.ts","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9C,qBAAa,SAAS;IASlB,OAAO,CAAC,IAAI;IARd;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;gBAGlD,IAAI,EAAE,IAAI,EAClB,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,SAAS;IAMvD,aAAa,CAAC,EAAE,EAAE,OAAO;IAIzB,uBAAuB,CAAC,EAAE,EAAE,OAAO;IAInC,yBAAyB,CAAC,EAAE,EAAE,OAAO;IAIrC;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,IAAI;IAe3B,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,CAAa;IAClD,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAa;IACnD,OAAO,CAAC,SAAS,CAAoB;IAErC,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI;IAe5D,sBAAsB,CAAC,OAAO,EAAE,WAAW;IAI3C,wBAAwB,CAAC,OAAO,EAAE,WAAW;IAI7C,mBAAmB,CAAC,EAAE,EAAE,OAAO;IAI/B,OAAO,CAAC,qBAAqB;IAW7B,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IAMzC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB;IAMjD,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB;IAM3D,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO;IAM/D;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,EAAE,OAAO;IAS7B,OAAO,CAAC,SAAS,CAA2D;IAE5E,OAAO,CAAC,aAAa;IAMrB,6BAA6B,CAC3B,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI;IASxD,IAAI,EAAE,WAEL;IAED,IAAI,IAAI,wBAEP;IAED,IAAI,QAAQ,uBAEX;IAEM,MAAM,UAAS;IAEtB,IAAI,QAAQ,4CAEX;IAED,IAAI,UAAU,wBAEb;IAED,mBAAmB,CAAC,GAAG,EAAE,WAAW;IAIpC,cAAc,YAAiB,IAAI,EAAI;IAEvC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI;IAarC,SAAS;IAQT,gBAAgB,IAAI,IAAI;CAiBzB"}
|
package/dist/PeerState.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PeerKnownState } from "./coValueCore/PeerKnownState.js";
|
|
2
2
|
import { logger } from "./logger.js";
|
|
3
|
+
import { OutgoingLoadQueue } from "./queue/OutgoingLoadQueue.js";
|
|
3
4
|
export class PeerState {
|
|
4
5
|
constructor(peer, knownStates) {
|
|
5
6
|
this.peer = peer;
|
|
@@ -9,6 +10,7 @@ export class PeerState {
|
|
|
9
10
|
this.closed = false;
|
|
10
11
|
this.closeListeners = new Set();
|
|
11
12
|
this._knownStates = knownStates ?? new Map();
|
|
13
|
+
this.loadQueue = new OutgoingLoadQueue(peer.id);
|
|
12
14
|
}
|
|
13
15
|
getKnownState(id) {
|
|
14
16
|
return this._knownStates.get(id)?.value();
|
|
@@ -37,9 +39,21 @@ export class PeerState {
|
|
|
37
39
|
}
|
|
38
40
|
return new PeerState(peer, knownStates);
|
|
39
41
|
}
|
|
40
|
-
|
|
41
|
-
this.toldKnownState.add(id);
|
|
42
|
-
this.loadRequestSent.add(id);
|
|
42
|
+
sendLoadRequest(coValue, mode) {
|
|
43
|
+
this.toldKnownState.add(coValue.id);
|
|
44
|
+
this.loadRequestSent.add(coValue.id);
|
|
45
|
+
this.loadQueue.enqueue(coValue, () => {
|
|
46
|
+
this.pushOutgoingMessage({
|
|
47
|
+
action: "load",
|
|
48
|
+
...coValue.knownStateWithStreaming(),
|
|
49
|
+
});
|
|
50
|
+
}, mode);
|
|
51
|
+
}
|
|
52
|
+
trackLoadRequestUpdate(coValue) {
|
|
53
|
+
this.loadQueue.trackUpdate(coValue);
|
|
54
|
+
}
|
|
55
|
+
trackLoadRequestComplete(coValue) {
|
|
56
|
+
this.loadQueue.trackComplete(coValue);
|
|
43
57
|
}
|
|
44
58
|
trackToldKnownState(id) {
|
|
45
59
|
this.toldKnownState.add(id);
|
|
@@ -139,6 +153,7 @@ export class PeerState {
|
|
|
139
153
|
peerRole: this.role,
|
|
140
154
|
});
|
|
141
155
|
this.closed = true;
|
|
156
|
+
this.loadQueue.clear();
|
|
142
157
|
this.peer.outgoing.push("Disconnected");
|
|
143
158
|
this.peer.outgoing.close();
|
|
144
159
|
this.peer.incoming.close();
|
package/dist/PeerState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeerState.js","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"PeerState.js","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PeerState } from "../PeerState.js";
|
|
2
2
|
import type { RawCoValue } from "../coValue.js";
|
|
3
|
+
import type { LoadMode } from "../queue/OutgoingLoadQueue.js";
|
|
3
4
|
import { type ControlledAccountOrAgent } from "../coValues/account.js";
|
|
4
5
|
import type { RawGroup } from "../coValues/group.js";
|
|
5
6
|
import { CryptoProvider, Hash, KeyID, KeySecret, Signature, SignerID } from "../crypto/crypto.js";
|
|
@@ -77,7 +78,7 @@ export declare class CoValueCore {
|
|
|
77
78
|
readonly listeners: Set<(core: CoValueCore, unsub: () => void) => void>;
|
|
78
79
|
private counter;
|
|
79
80
|
constructor(id: RawCoID, node: LocalNode);
|
|
80
|
-
get loadingState(): "available" | "
|
|
81
|
+
get loadingState(): "available" | "loading" | "garbageCollected" | "onlyKnownState" | "unknown" | "unavailable";
|
|
81
82
|
hasMissingDependencies(): boolean;
|
|
82
83
|
isAvailable(): this is AvailableCoValueCore;
|
|
83
84
|
isCompletelyDownloaded(): boolean;
|
|
@@ -102,13 +103,30 @@ export declare class CoValueCore {
|
|
|
102
103
|
getLoadingStateForPeer(peerId: PeerID): "available" | "unknown" | "unavailable" | "pending" | "errored";
|
|
103
104
|
private updateCounter;
|
|
104
105
|
/**
|
|
105
|
-
* Removes the CoValue from memory.
|
|
106
|
+
* Removes the CoValue content from memory but keeps a shell with cached knownState.
|
|
107
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
106
108
|
*
|
|
107
109
|
* @returns true if the coValue was successfully unmounted, false otherwise
|
|
108
110
|
*/
|
|
109
111
|
unmount(): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Decrements the counter for the current loading state.
|
|
114
|
+
* Used during unmount to properly track state transitions.
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
decrementLoadingStateCounter(): void;
|
|
110
118
|
markNotFoundInPeer(peerId: PeerID): void;
|
|
111
119
|
markFoundInPeer(peerId: PeerID, previousState: string): void;
|
|
120
|
+
/**
|
|
121
|
+
* Clean up cached state when CoValue becomes available.
|
|
122
|
+
* Called after the CoValue transitions from garbageCollected/onlyKnownState to available.
|
|
123
|
+
*/
|
|
124
|
+
private cleanupLastKnownState;
|
|
125
|
+
/**
|
|
126
|
+
* Initialize this CoValueCore as a garbageCollected shell.
|
|
127
|
+
* Called when creating a replacement CoValueCore after unmounting.
|
|
128
|
+
*/
|
|
129
|
+
setGarbageCollectedState(knownState: CoValueKnownState): void;
|
|
112
130
|
missingDependencies: Set<`co_z${string}`>;
|
|
113
131
|
isCircularDependency(dependency: CoValueCore): boolean;
|
|
114
132
|
newContentQueue: {
|
|
@@ -136,6 +154,8 @@ export declare class CoValueCore {
|
|
|
136
154
|
* The return value identity is going to be stable as long as the CoValue is not modified.
|
|
137
155
|
*
|
|
138
156
|
* On change the knownState is invalidated and a new object is returned.
|
|
157
|
+
*
|
|
158
|
+
* For garbageCollected/onlyKnownState CoValues, returns the cached knownState.
|
|
139
159
|
*/
|
|
140
160
|
knownState(): CoValueKnownState;
|
|
141
161
|
/**
|
|
@@ -317,18 +337,19 @@ export declare class CoValueCore {
|
|
|
317
337
|
waitForSync(options?: {
|
|
318
338
|
timeout?: number;
|
|
319
339
|
}): Promise<unknown[]>;
|
|
320
|
-
load(peers: PeerState[]): void;
|
|
340
|
+
load(peers: PeerState[], mode?: LoadMode): void;
|
|
321
341
|
loadFromStorage(done?: (found: boolean) => void): void;
|
|
322
342
|
/**
|
|
323
343
|
* Lazily load only the knownState from storage without loading full transaction data.
|
|
324
344
|
* This is useful for checking if a peer needs new content before committing to a full load.
|
|
325
345
|
*
|
|
326
|
-
*
|
|
346
|
+
* If found in storage, marks the CoValue as onlyKnownState and caches the knownState.
|
|
347
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
327
348
|
*
|
|
328
349
|
* @param done - Callback with the storage knownState, or undefined if not found in storage
|
|
329
350
|
*/
|
|
330
351
|
getKnownStateFromStorage(done: (knownState: CoValueKnownState | undefined) => void): void;
|
|
331
|
-
loadFromPeers(peers: PeerState[]): void;
|
|
352
|
+
loadFromPeers(peers: PeerState[], mode?: LoadMode): void;
|
|
332
353
|
private internalLoadFromPeer;
|
|
333
354
|
}
|
|
334
355
|
export type InvalidHashError = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coValueCore.d.ts","sourceRoot":"","sources":["../../src/coValueCore/coValueCore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"coValueCore.d.ts","sourceRoot":"","sources":["../../src/coValueCore/coValueCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,9 +9,8 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
var _CoValueCore_instances, _CoValueCore_isDeleteTransaction, _CoValueCore_markAsDeleted, _CoValueCore_getDeleteMarker, _CoValueCore_canAuthorDeleteCoValueAtTime, _CoValueCore_isNotificationScheduled, _CoValueCore_batchedUpdates, _CoValueCore_isNotifyUpdatePaused;
|
|
12
|
+
var _CoValueCore_instances, _CoValueCore_lastKnownStateSource, _CoValueCore_lastKnownState, _CoValueCore_isDeleteTransaction, _CoValueCore_markAsDeleted, _CoValueCore_getDeleteMarker, _CoValueCore_canAuthorDeleteCoValueAtTime, _CoValueCore_isNotificationScheduled, _CoValueCore_batchedUpdates, _CoValueCore_isNotifyUpdatePaused;
|
|
13
13
|
import { ValueType, metrics } from "@opentelemetry/api";
|
|
14
|
-
import { CO_VALUE_LOADING_CONFIG } from "../config.js";
|
|
15
14
|
import { coreToCoValue } from "../coreToCoValue.js";
|
|
16
15
|
import { isDeleteSessionID, } from "../ids.js";
|
|
17
16
|
import { logger } from "../logger.js";
|
|
@@ -156,6 +155,13 @@ export class CoValueCore {
|
|
|
156
155
|
// Whether the coValue is deleted
|
|
157
156
|
this.isDeleted = false;
|
|
158
157
|
this.loadingStatuses = new Map();
|
|
158
|
+
// Tracks why we have lastKnownState (separate from loadingStatuses)
|
|
159
|
+
// - "garbageCollected": was in memory, got GC'd
|
|
160
|
+
// - "onlyKnownState": checked storage, found knownState, but didn't load full content
|
|
161
|
+
_CoValueCore_lastKnownStateSource.set(this, void 0);
|
|
162
|
+
// Cache the knownState when transitioning to garbageCollected/onlyKnownState
|
|
163
|
+
// Used during peer reconciliation to send accurate LOAD requests
|
|
164
|
+
_CoValueCore_lastKnownState.set(this, void 0);
|
|
159
165
|
this.listeners = new Set();
|
|
160
166
|
this.missingDependencies = new Set();
|
|
161
167
|
this.newContentQueue = [];
|
|
@@ -224,14 +230,21 @@ export class CoValueCore {
|
|
|
224
230
|
if (this.verified) {
|
|
225
231
|
return "available";
|
|
226
232
|
}
|
|
227
|
-
|
|
228
|
-
return "unknown";
|
|
229
|
-
}
|
|
233
|
+
// Check for pending peers FIRST - loading takes priority over other states
|
|
230
234
|
for (const peer of this.loadingStatuses.values()) {
|
|
231
235
|
if (peer.type === "pending") {
|
|
232
236
|
return "loading";
|
|
233
237
|
}
|
|
234
|
-
|
|
238
|
+
}
|
|
239
|
+
// Check for lastKnownStateSource (garbageCollected or onlyKnownState)
|
|
240
|
+
if (__classPrivateFieldGet(this, _CoValueCore_lastKnownStateSource, "f")) {
|
|
241
|
+
return __classPrivateFieldGet(this, _CoValueCore_lastKnownStateSource, "f");
|
|
242
|
+
}
|
|
243
|
+
if (this.loadingStatuses.size === 0) {
|
|
244
|
+
return "unknown";
|
|
245
|
+
}
|
|
246
|
+
for (const peer of this.loadingStatuses.values()) {
|
|
247
|
+
if (peer.type === "unknown") {
|
|
235
248
|
return "unknown";
|
|
236
249
|
}
|
|
237
250
|
}
|
|
@@ -315,27 +328,21 @@ export class CoValueCore {
|
|
|
315
328
|
}
|
|
316
329
|
}
|
|
317
330
|
/**
|
|
318
|
-
* Removes the CoValue from memory.
|
|
331
|
+
* Removes the CoValue content from memory but keeps a shell with cached knownState.
|
|
332
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
319
333
|
*
|
|
320
334
|
* @returns true if the coValue was successfully unmounted, false otherwise
|
|
321
335
|
*/
|
|
322
336
|
unmount() {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
if (!this.node.syncManager.isSyncedToServerPeers(this.id)) {
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
337
|
+
return this.node.internalUnmountCoValue(this.id);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Decrements the counter for the current loading state.
|
|
341
|
+
* Used during unmount to properly track state transitions.
|
|
342
|
+
* @internal
|
|
343
|
+
*/
|
|
344
|
+
decrementLoadingStateCounter() {
|
|
336
345
|
this.counter.add(-1, { state: this.loadingState });
|
|
337
|
-
this.node.internalDeleteCoValue(this.id);
|
|
338
|
-
return true;
|
|
339
346
|
}
|
|
340
347
|
markNotFoundInPeer(peerId) {
|
|
341
348
|
const previousState = this.loadingState;
|
|
@@ -348,6 +355,32 @@ export class CoValueCore {
|
|
|
348
355
|
this.updateCounter(previousState);
|
|
349
356
|
this.scheduleNotifyUpdate();
|
|
350
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Clean up cached state when CoValue becomes available.
|
|
360
|
+
* Called after the CoValue transitions from garbageCollected/onlyKnownState to available.
|
|
361
|
+
*/
|
|
362
|
+
cleanupLastKnownState() {
|
|
363
|
+
// Clear both fields - in-memory verified state is now authoritative
|
|
364
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownStateSource, undefined, "f");
|
|
365
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownState, undefined, "f");
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Initialize this CoValueCore as a garbageCollected shell.
|
|
369
|
+
* Called when creating a replacement CoValueCore after unmounting.
|
|
370
|
+
*/
|
|
371
|
+
setGarbageCollectedState(knownState) {
|
|
372
|
+
// Only set garbageCollected state if storage is active
|
|
373
|
+
// Without storage, we can't reload the CoValue anyway
|
|
374
|
+
if (!this.node.storage) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// Transition counter from 'unknown' (set by constructor) to 'garbageCollected'
|
|
378
|
+
// previousState will be 'unknown', newState will be 'garbageCollected'
|
|
379
|
+
const previousState = this.loadingState;
|
|
380
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownStateSource, "garbageCollected", "f");
|
|
381
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownState, knownState, "f");
|
|
382
|
+
this.updateCounter(previousState);
|
|
383
|
+
}
|
|
351
384
|
isCircularDependency(dependency) {
|
|
352
385
|
if (dependency.id === this.id) {
|
|
353
386
|
return true;
|
|
@@ -416,6 +449,10 @@ export class CoValueCore {
|
|
|
416
449
|
throw new Error("CoValueCore: provideHeader called on coValue with verified sessions present!");
|
|
417
450
|
}
|
|
418
451
|
this._verified = new VerifiedState(this.id, this.node.crypto, header, new SessionMap(this.id, this.node.crypto, streamingKnownState));
|
|
452
|
+
// Clean up if transitioning from garbageCollected/onlyKnownState
|
|
453
|
+
if (this.isAvailable()) {
|
|
454
|
+
this.cleanupLastKnownState();
|
|
455
|
+
}
|
|
419
456
|
return true;
|
|
420
457
|
}
|
|
421
458
|
markErrored(peerId, error) {
|
|
@@ -441,8 +478,10 @@ export class CoValueCore {
|
|
|
441
478
|
* Used to correctly manage the content & subscriptions during the content streaming process
|
|
442
479
|
*/
|
|
443
480
|
knownStateWithStreaming() {
|
|
444
|
-
|
|
445
|
-
|
|
481
|
+
if (this.verified) {
|
|
482
|
+
return this.verified.immutableKnownStateWithStreaming();
|
|
483
|
+
}
|
|
484
|
+
return this.knownState();
|
|
446
485
|
}
|
|
447
486
|
/**
|
|
448
487
|
* Returns the known state of the CoValue
|
|
@@ -450,9 +489,20 @@ export class CoValueCore {
|
|
|
450
489
|
* The return value identity is going to be stable as long as the CoValue is not modified.
|
|
451
490
|
*
|
|
452
491
|
* On change the knownState is invalidated and a new object is returned.
|
|
492
|
+
*
|
|
493
|
+
* For garbageCollected/onlyKnownState CoValues, returns the cached knownState.
|
|
453
494
|
*/
|
|
454
495
|
knownState() {
|
|
455
|
-
|
|
496
|
+
// 1. If we have verified content in memory, use that (authoritative)
|
|
497
|
+
if (this.verified) {
|
|
498
|
+
return this.verified.immutableKnownState();
|
|
499
|
+
}
|
|
500
|
+
// 2. If we have last known state (GC'd or onlyKnownState), use that
|
|
501
|
+
if (__classPrivateFieldGet(this, _CoValueCore_lastKnownState, "f")) {
|
|
502
|
+
return __classPrivateFieldGet(this, _CoValueCore_lastKnownState, "f");
|
|
503
|
+
}
|
|
504
|
+
// 3. Fallback to empty state (truly unknown CoValue)
|
|
505
|
+
return emptyKnownState(this.id);
|
|
456
506
|
}
|
|
457
507
|
/**
|
|
458
508
|
* Returns a known state message to signal to the peer that the coValue doesn't need to be synced anymore
|
|
@@ -1152,11 +1202,11 @@ export class CoValueCore {
|
|
|
1152
1202
|
waitForSync(options) {
|
|
1153
1203
|
return this.node.syncManager.waitForSync(this.id, options?.timeout);
|
|
1154
1204
|
}
|
|
1155
|
-
load(peers) {
|
|
1205
|
+
load(peers, mode) {
|
|
1156
1206
|
this.loadFromStorage((found) => {
|
|
1157
1207
|
// When found the load is triggered by handleNewContent
|
|
1158
1208
|
if (!found) {
|
|
1159
|
-
this.loadFromPeers(peers);
|
|
1209
|
+
this.loadFromPeers(peers, mode);
|
|
1160
1210
|
}
|
|
1161
1211
|
});
|
|
1162
1212
|
}
|
|
@@ -1187,7 +1237,14 @@ export class CoValueCore {
|
|
|
1187
1237
|
});
|
|
1188
1238
|
return;
|
|
1189
1239
|
}
|
|
1190
|
-
if
|
|
1240
|
+
// Check if we need to load from storage:
|
|
1241
|
+
// - If storage state is not unknown (already tried), AND
|
|
1242
|
+
// - Overall state is not garbageCollected/onlyKnownState (which need full content)
|
|
1243
|
+
// Then return early
|
|
1244
|
+
const overallState = this.loadingState;
|
|
1245
|
+
if (currentState !== "unknown" &&
|
|
1246
|
+
overallState !== "garbageCollected" &&
|
|
1247
|
+
overallState !== "onlyKnownState") {
|
|
1191
1248
|
done?.(currentState === "available");
|
|
1192
1249
|
return;
|
|
1193
1250
|
}
|
|
@@ -1205,7 +1262,8 @@ export class CoValueCore {
|
|
|
1205
1262
|
* Lazily load only the knownState from storage without loading full transaction data.
|
|
1206
1263
|
* This is useful for checking if a peer needs new content before committing to a full load.
|
|
1207
1264
|
*
|
|
1208
|
-
*
|
|
1265
|
+
* If found in storage, marks the CoValue as onlyKnownState and caches the knownState.
|
|
1266
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
1209
1267
|
*
|
|
1210
1268
|
* @param done - Callback with the storage knownState, or undefined if not found in storage
|
|
1211
1269
|
*/
|
|
@@ -1214,15 +1272,27 @@ export class CoValueCore {
|
|
|
1214
1272
|
done(undefined);
|
|
1215
1273
|
return;
|
|
1216
1274
|
}
|
|
1217
|
-
// If already
|
|
1218
|
-
|
|
1219
|
-
|
|
1275
|
+
// If we already have knowledge about this CoValue (in memory or cached), return it
|
|
1276
|
+
// knownState() returns verified state, lastKnownState, or empty state
|
|
1277
|
+
const knownState = this.knownState();
|
|
1278
|
+
if (knownState.header) {
|
|
1279
|
+
done(knownState);
|
|
1220
1280
|
return;
|
|
1221
1281
|
}
|
|
1222
1282
|
// Delegate to storage - caching is handled at storage level
|
|
1223
|
-
this.node.storage.loadKnownState(this.id,
|
|
1283
|
+
this.node.storage.loadKnownState(this.id, (knownState) => {
|
|
1284
|
+
// The coValue could become available in the meantime.
|
|
1285
|
+
if (knownState && !this.isAvailable()) {
|
|
1286
|
+
// Cache the knownState and mark as onlyKnownState
|
|
1287
|
+
const previousState = this.loadingState;
|
|
1288
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownStateSource, "onlyKnownState", "f");
|
|
1289
|
+
__classPrivateFieldSet(this, _CoValueCore_lastKnownState, knownState, "f");
|
|
1290
|
+
this.updateCounter(previousState);
|
|
1291
|
+
}
|
|
1292
|
+
done(knownState);
|
|
1293
|
+
});
|
|
1224
1294
|
}
|
|
1225
|
-
loadFromPeers(peers) {
|
|
1295
|
+
loadFromPeers(peers, mode) {
|
|
1226
1296
|
if (peers.length === 0) {
|
|
1227
1297
|
return;
|
|
1228
1298
|
}
|
|
@@ -1230,26 +1300,15 @@ export class CoValueCore {
|
|
|
1230
1300
|
const currentState = this.getLoadingStateForPeer(peer.id);
|
|
1231
1301
|
if (currentState === "unknown" || currentState === "unavailable") {
|
|
1232
1302
|
this.markPending(peer.id);
|
|
1233
|
-
this.internalLoadFromPeer(peer);
|
|
1303
|
+
this.internalLoadFromPeer(peer, mode);
|
|
1234
1304
|
}
|
|
1235
1305
|
}
|
|
1236
1306
|
}
|
|
1237
|
-
internalLoadFromPeer(peer) {
|
|
1307
|
+
internalLoadFromPeer(peer, mode) {
|
|
1238
1308
|
if (peer.closed && !peer.persistent) {
|
|
1239
1309
|
this.markNotFoundInPeer(peer.id);
|
|
1240
1310
|
return;
|
|
1241
1311
|
}
|
|
1242
|
-
/**
|
|
1243
|
-
* On reconnection persistent peers will automatically fire the load request
|
|
1244
|
-
* as part of the reconnection process.
|
|
1245
|
-
*/
|
|
1246
|
-
if (!peer.closed) {
|
|
1247
|
-
peer.pushOutgoingMessage({
|
|
1248
|
-
action: "load",
|
|
1249
|
-
...this.knownState(),
|
|
1250
|
-
});
|
|
1251
|
-
peer.trackLoadRequestSent(this.id);
|
|
1252
|
-
}
|
|
1253
1312
|
const markNotFound = () => {
|
|
1254
1313
|
if (this.getLoadingStateForPeer(peer.id) === "pending") {
|
|
1255
1314
|
logger.warn("Timeout waiting for peer to load coValue", {
|
|
@@ -1259,10 +1318,17 @@ export class CoValueCore {
|
|
|
1259
1318
|
this.markNotFoundInPeer(peer.id);
|
|
1260
1319
|
}
|
|
1261
1320
|
};
|
|
1262
|
-
|
|
1321
|
+
// Close listener for non-persistent peers
|
|
1263
1322
|
const removeCloseListener = peer.persistent
|
|
1264
1323
|
? undefined
|
|
1265
1324
|
: peer.addCloseListener(markNotFound);
|
|
1325
|
+
/**
|
|
1326
|
+
* On reconnection persistent peers will automatically fire the load request
|
|
1327
|
+
* as part of the reconnection process.
|
|
1328
|
+
*/
|
|
1329
|
+
if (!peer.closed) {
|
|
1330
|
+
peer.sendLoadRequest(this, mode);
|
|
1331
|
+
}
|
|
1266
1332
|
this.subscribe((state, unsubscribe) => {
|
|
1267
1333
|
const peerState = state.getLoadingStateForPeer(peer.id);
|
|
1268
1334
|
if (state.isAvailable() || // might have become available from another peer e.g. through handleNewContent
|
|
@@ -1271,12 +1337,11 @@ export class CoValueCore {
|
|
|
1271
1337
|
peerState === "unavailable") {
|
|
1272
1338
|
unsubscribe();
|
|
1273
1339
|
removeCloseListener?.();
|
|
1274
|
-
clearTimeout(timeout);
|
|
1275
1340
|
}
|
|
1276
1341
|
}, true);
|
|
1277
1342
|
}
|
|
1278
1343
|
}
|
|
1279
|
-
_CoValueCore_isNotificationScheduled = new WeakMap(), _CoValueCore_batchedUpdates = new WeakMap(), _CoValueCore_isNotifyUpdatePaused = new WeakMap(), _CoValueCore_instances = new WeakSet(), _CoValueCore_isDeleteTransaction = function _CoValueCore_isDeleteTransaction(sessionID, newTransactions, skipVerify) {
|
|
1344
|
+
_CoValueCore_lastKnownStateSource = new WeakMap(), _CoValueCore_lastKnownState = new WeakMap(), _CoValueCore_isNotificationScheduled = new WeakMap(), _CoValueCore_batchedUpdates = new WeakMap(), _CoValueCore_isNotifyUpdatePaused = new WeakMap(), _CoValueCore_instances = new WeakSet(), _CoValueCore_isDeleteTransaction = function _CoValueCore_isDeleteTransaction(sessionID, newTransactions, skipVerify) {
|
|
1280
1345
|
if (!this.verified) {
|
|
1281
1346
|
return {
|
|
1282
1347
|
value: false,
|