cojson 0.20.1 → 0.20.3
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 +19 -7
- 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/coValueCore/coValueCore.d.ts +23 -3
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +116 -36
- package/dist/coValueCore/coValueCore.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/permissions.d.ts.map +1 -1
- package/dist/permissions.js +5 -0
- package/dist/permissions.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +13 -10
- package/dist/sync.js.map +1 -1
- package/dist/tests/coValueCore.loadFromStorage.test.js +87 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
- package/dist/tests/group.parentGroupCache.test.js +2 -2
- package/dist/tests/group.parentGroupCache.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/permissions.test.js +83 -2
- package/dist/tests/permissions.test.js.map +1 -1
- 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/package.json +4 -4
- package/src/GarbageCollector.ts +4 -3
- package/src/coValueCore/coValueCore.ts +129 -39
- package/src/localNode.ts +65 -4
- package/src/permissions.ts +6 -0
- package/src/sync.ts +11 -9
- package/src/tests/coValueCore.loadFromStorage.test.ts +108 -0
- package/src/tests/group.parentGroupCache.test.ts +2 -2
- package/src/tests/knownState.lazyLoading.test.ts +52 -0
- package/src/tests/permissions.test.ts +118 -1
- 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
|
@@ -68,68 +68,6 @@ describe("multiple servers peers", () => {
|
|
|
68
68
|
expect(map.get("count")).toEqual(4);
|
|
69
69
|
expect(mapOnSession2.get("count")).toEqual(4);
|
|
70
70
|
});
|
|
71
|
-
expect(SyncMessagesLog.getMessages({
|
|
72
|
-
Group: group.core,
|
|
73
|
-
Map: map.core,
|
|
74
|
-
})).toMatchInlineSnapshot(`
|
|
75
|
-
[
|
|
76
|
-
"client -> server1 | LOAD Map sessions: empty",
|
|
77
|
-
"client -> server2 | LOAD Map sessions: empty",
|
|
78
|
-
"client -> server1 | CONTENT Group header: true new: After: 0 New: 3",
|
|
79
|
-
"client -> server2 | CONTENT Group header: true new: After: 0 New: 3",
|
|
80
|
-
"client -> server1 | CONTENT Map header: true new: After: 0 New: 1",
|
|
81
|
-
"client -> server2 | CONTENT Map header: true new: After: 0 New: 1",
|
|
82
|
-
"server1 -> client | KNOWN Map sessions: empty",
|
|
83
|
-
"server2 -> client | KNOWN Map sessions: empty",
|
|
84
|
-
"server1 -> client | KNOWN Group sessions: header/3",
|
|
85
|
-
"server2 -> client | KNOWN Group sessions: header/3",
|
|
86
|
-
"server1 -> client | KNOWN Map sessions: header/1",
|
|
87
|
-
"server1 -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
88
|
-
"server1 -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
89
|
-
"server2 -> client | KNOWN Map sessions: header/1",
|
|
90
|
-
"server2 -> client | CONTENT Group header: true new: After: 0 New: 3",
|
|
91
|
-
"server2 -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
92
|
-
"client -> server1 | KNOWN Group sessions: header/3",
|
|
93
|
-
"client -> server2 | LOAD Group sessions: header/3",
|
|
94
|
-
"client -> server1 | KNOWN Map sessions: header/1",
|
|
95
|
-
"client -> server2 | CONTENT Map header: true new: After: 0 New: 1",
|
|
96
|
-
"client -> server1 | CONTENT Map header: false new: After: 0 New: 1",
|
|
97
|
-
"client -> server2 | CONTENT Map header: false new: After: 0 New: 1",
|
|
98
|
-
"client -> server1 | CONTENT Map header: false new: After: 1 New: 1",
|
|
99
|
-
"client -> server2 | CONTENT Map header: false new: After: 1 New: 1",
|
|
100
|
-
"client -> server2 | KNOWN Group sessions: header/3",
|
|
101
|
-
"client -> server2 | CONTENT Group header: false new: After: 0 New: 3",
|
|
102
|
-
"client -> server2 | KNOWN Map sessions: header/2",
|
|
103
|
-
"server2 -> client | KNOWN Map sessions: header/1",
|
|
104
|
-
"server1 -> client | KNOWN Map sessions: header/2",
|
|
105
|
-
"server1 -> client | CONTENT Map header: false new: After: 0 New: 1",
|
|
106
|
-
"server2 -> client | KNOWN Map sessions: header/2",
|
|
107
|
-
"server2 -> client | CONTENT Map header: false new: After: 0 New: 1",
|
|
108
|
-
"server1 -> client | KNOWN Map sessions: header/3",
|
|
109
|
-
"server1 -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
110
|
-
"server2 -> client | KNOWN Map sessions: header/3",
|
|
111
|
-
"server2 -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
112
|
-
"server2 -> client | KNOWN Group sessions: header/3",
|
|
113
|
-
"client -> server1 | KNOWN Map sessions: header/3",
|
|
114
|
-
"client -> server2 | CONTENT Map header: false new: After: 0 New: 1",
|
|
115
|
-
"client -> server2 | KNOWN Map sessions: header/3",
|
|
116
|
-
"client -> server1 | KNOWN Map sessions: header/3",
|
|
117
|
-
"client -> server2 | CONTENT Map header: false new: After: 1 New: 1",
|
|
118
|
-
"client -> server2 | KNOWN Map sessions: header/3",
|
|
119
|
-
"server2 -> client | KNOWN Map sessions: header/3",
|
|
120
|
-
"server2 -> client | KNOWN Map sessions: header/3",
|
|
121
|
-
"client -> server1 | CONTENT Map header: false new: After: 1 New: 1",
|
|
122
|
-
"client -> server2 | CONTENT Map header: false new: After: 1 New: 1",
|
|
123
|
-
"server1 -> client | KNOWN Map sessions: header/4",
|
|
124
|
-
"server1 -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
125
|
-
"server2 -> client | KNOWN Map sessions: header/4",
|
|
126
|
-
"server2 -> client | CONTENT Map header: false new: After: 1 New: 1",
|
|
127
|
-
"client -> server1 | KNOWN Map sessions: header/4",
|
|
128
|
-
"client -> server2 | CONTENT Map header: false new: After: 1 New: 1",
|
|
129
|
-
"client -> server2 | KNOWN Map sessions: header/4",
|
|
130
|
-
"server2 -> client | KNOWN Map sessions: header/4",
|
|
131
|
-
]
|
|
132
|
-
`);
|
|
133
71
|
const mapOnServer1 = server1.node.getCoValue(map.id);
|
|
134
72
|
const mapOnServer2 = server2.node.getCoValue(map.id);
|
|
135
73
|
expect(mapOnServer1.knownState()).toEqual(map.core.knownState());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.multipleServers.test.js","sourceRoot":"","sources":["../../src/tests/sync.multipleServers.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sync.multipleServers.test.js","sourceRoot":"","sources":["../../src/tests/sync.multipleServers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { assert, beforeEach, describe, expect, test } from "vitest";
|
|
2
2
|
import { expectMap } from "../coValue";
|
|
3
|
+
import { setGarbageCollectorMaxAge } from "../config";
|
|
3
4
|
import { SyncMessagesLog, TEST_NODE_CONFIG, setupTestAccount, setupTestNode, waitFor, } from "./testUtils";
|
|
4
5
|
// We want to simulate a real world communication that happens asynchronously
|
|
5
6
|
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
@@ -7,6 +8,8 @@ let jazzCloud;
|
|
|
7
8
|
beforeEach(async () => {
|
|
8
9
|
SyncMessagesLog.clear();
|
|
9
10
|
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
11
|
+
// Set GC max age to -1 so items are collected immediately when needed
|
|
12
|
+
setGarbageCollectorMaxAge(-1);
|
|
10
13
|
});
|
|
11
14
|
describe("peer reconciliation", () => {
|
|
12
15
|
test("handle new peer connections", async () => {
|
|
@@ -240,4 +243,157 @@ describe("peer reconciliation", () => {
|
|
|
240
243
|
expect(expectMap(mapOnSyncServer.getCurrentContent()).get("hello")).toEqual("updated");
|
|
241
244
|
});
|
|
242
245
|
});
|
|
246
|
+
describe("peer reconciliation with garbageCollected CoValues", () => {
|
|
247
|
+
test("sends cached known state for garbageCollected CoValues during reconciliation", async () => {
|
|
248
|
+
const client = setupTestNode();
|
|
249
|
+
client.addStorage({ ourName: "client" });
|
|
250
|
+
client.node.enableGarbageCollector();
|
|
251
|
+
const group = client.node.createGroup();
|
|
252
|
+
const map = group.createMap();
|
|
253
|
+
map.set("hello", "world", "trusting");
|
|
254
|
+
// Sync to server first
|
|
255
|
+
client.connectToSyncServer();
|
|
256
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
257
|
+
// Capture the known state before GC
|
|
258
|
+
const mapKnownState = map.core.knownState();
|
|
259
|
+
const groupKnownState = group.core.knownState();
|
|
260
|
+
// Disconnect first to avoid server reloading CoValues after GC
|
|
261
|
+
client.disconnect();
|
|
262
|
+
// Run GC to unmount the CoValues (creates garbageCollected shells)
|
|
263
|
+
// GC works because there are no persistent server peers (disconnected)
|
|
264
|
+
client.node.garbageCollector?.collect();
|
|
265
|
+
client.node.garbageCollector?.collect(); // Second pass for dependencies
|
|
266
|
+
// Verify CoValues are now garbageCollected
|
|
267
|
+
const gcMap = client.node.getCoValue(map.id);
|
|
268
|
+
const gcGroup = client.node.getCoValue(group.id);
|
|
269
|
+
expect(gcMap.loadingState).toBe("garbageCollected");
|
|
270
|
+
expect(gcGroup.loadingState).toBe("garbageCollected");
|
|
271
|
+
// Verify knownState() returns the cached state (not empty)
|
|
272
|
+
expect(gcMap.knownState()).toEqual(mapKnownState);
|
|
273
|
+
expect(gcGroup.knownState()).toEqual(groupKnownState);
|
|
274
|
+
// Reconnect to trigger peer reconciliation
|
|
275
|
+
SyncMessagesLog.clear();
|
|
276
|
+
client.connectToSyncServer();
|
|
277
|
+
// Wait for messages to be exchanged
|
|
278
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
279
|
+
// LOAD is sent with cached known state (no storage lookup needed)
|
|
280
|
+
expect(SyncMessagesLog.getMessages({
|
|
281
|
+
Group: gcGroup,
|
|
282
|
+
Map: gcMap,
|
|
283
|
+
})).toMatchInlineSnapshot(`
|
|
284
|
+
[
|
|
285
|
+
"client -> server | LOAD Group sessions: header/3",
|
|
286
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
287
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
288
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
289
|
+
]
|
|
290
|
+
`);
|
|
291
|
+
});
|
|
292
|
+
test("garbageCollected CoValues restore subscription with minimal data transfer", async () => {
|
|
293
|
+
// Setup: both client and server have the same data
|
|
294
|
+
const client = setupTestNode();
|
|
295
|
+
client.addStorage({ ourName: "client" });
|
|
296
|
+
client.node.enableGarbageCollector();
|
|
297
|
+
const group = client.node.createGroup();
|
|
298
|
+
const map = group.createMap();
|
|
299
|
+
map.set("hello", "world", "trusting");
|
|
300
|
+
// Sync to server
|
|
301
|
+
client.connectToSyncServer();
|
|
302
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
303
|
+
// Verify server has the data
|
|
304
|
+
const serverMap = jazzCloud.node.getCoValue(map.id);
|
|
305
|
+
expect(serverMap.isAvailable()).toBe(true);
|
|
306
|
+
// Capture known states before GC
|
|
307
|
+
const clientMapKnownState = map.core.knownState();
|
|
308
|
+
const clientGroupKnownState = group.core.knownState();
|
|
309
|
+
// Disconnect before GC to avoid server reloading CoValues
|
|
310
|
+
client.disconnect();
|
|
311
|
+
// Run GC
|
|
312
|
+
client.node.garbageCollector?.collect();
|
|
313
|
+
client.node.garbageCollector?.collect();
|
|
314
|
+
const gcMap = client.node.getCoValue(map.id);
|
|
315
|
+
const gcGroup = client.node.getCoValue(group.id);
|
|
316
|
+
// Verify garbageCollected state
|
|
317
|
+
expect(gcMap.loadingState).toBe("garbageCollected");
|
|
318
|
+
expect(gcGroup.loadingState).toBe("garbageCollected");
|
|
319
|
+
// Reconnect to trigger peer reconciliation
|
|
320
|
+
SyncMessagesLog.clear();
|
|
321
|
+
client.connectToSyncServer();
|
|
322
|
+
// Wait for messages to be exchanged
|
|
323
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
324
|
+
// LOAD is sent with cached known state
|
|
325
|
+
// Server responds with KNOWN since client and server have the same data
|
|
326
|
+
expect(SyncMessagesLog.getMessages({
|
|
327
|
+
Group: gcGroup,
|
|
328
|
+
Map: gcMap,
|
|
329
|
+
})).toMatchInlineSnapshot(`
|
|
330
|
+
[
|
|
331
|
+
"client -> server | LOAD Group sessions: header/3",
|
|
332
|
+
"client -> server | LOAD Map sessions: header/1",
|
|
333
|
+
"server -> client | KNOWN Group sessions: header/3",
|
|
334
|
+
"server -> client | KNOWN Map sessions: header/1",
|
|
335
|
+
]
|
|
336
|
+
`);
|
|
337
|
+
});
|
|
338
|
+
test("unknown CoValues return empty knownState during reconciliation", async () => {
|
|
339
|
+
const client = setupTestNode();
|
|
340
|
+
// Create a CoValue on another node that we'll hear about but not load
|
|
341
|
+
const otherClient = setupTestNode();
|
|
342
|
+
const group = otherClient.node.createGroup();
|
|
343
|
+
const map = group.createMap();
|
|
344
|
+
map.set("hello", "world", "trusting");
|
|
345
|
+
// Sync other client to server
|
|
346
|
+
otherClient.connectToSyncServer();
|
|
347
|
+
await otherClient.node.syncManager.waitForAllCoValuesSync();
|
|
348
|
+
// Now client connects - it will hear about the CoValue IDs but not load them
|
|
349
|
+
// Create a reference to the CoValue without loading it
|
|
350
|
+
const unknownCoValue = client.node.getCoValue(map.id);
|
|
351
|
+
// Verify it's in unknown state
|
|
352
|
+
expect(unknownCoValue.loadingState).toBe("unknown");
|
|
353
|
+
// Verify knownState() returns empty state for unknown CoValues
|
|
354
|
+
const knownState = unknownCoValue.knownState();
|
|
355
|
+
expect(knownState.header).toBe(false);
|
|
356
|
+
expect(knownState.sessions).toEqual({});
|
|
357
|
+
});
|
|
358
|
+
test("unknown CoValues are skipped during peer reconciliation (no LOAD sent)", async () => {
|
|
359
|
+
const client = setupTestNode();
|
|
360
|
+
// Create a CoValue on another node
|
|
361
|
+
const otherClient = setupTestNode();
|
|
362
|
+
const group = otherClient.node.createGroup();
|
|
363
|
+
const map = group.createMap();
|
|
364
|
+
map.set("hello", "world", "trusting");
|
|
365
|
+
// Sync other client to server so the server knows about the CoValue
|
|
366
|
+
otherClient.connectToSyncServer();
|
|
367
|
+
await otherClient.node.syncManager.waitForAllCoValuesSync();
|
|
368
|
+
// Client creates its own group (so we have something to compare against)
|
|
369
|
+
const clientGroup = client.node.createGroup();
|
|
370
|
+
const clientMap = clientGroup.createMap();
|
|
371
|
+
clientMap.set("foo", "bar", "trusting");
|
|
372
|
+
// Create a reference to the other client's CoValue WITHOUT loading it
|
|
373
|
+
// This simulates "hearing about" a CoValue ID (e.g., from a reference)
|
|
374
|
+
const unknownCoValue = client.node.getCoValue(map.id);
|
|
375
|
+
expect(unknownCoValue.loadingState).toBe("unknown");
|
|
376
|
+
// Connect client to server - this triggers peer reconciliation
|
|
377
|
+
SyncMessagesLog.clear();
|
|
378
|
+
client.connectToSyncServer();
|
|
379
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
380
|
+
// Verify: LOAD sent for client's own CoValues, but NOT for the unknown CoValue
|
|
381
|
+
expect(SyncMessagesLog.getMessages({
|
|
382
|
+
ClientGroup: clientGroup.core,
|
|
383
|
+
ClientMap: clientMap.core,
|
|
384
|
+
UnknownMap: unknownCoValue,
|
|
385
|
+
})).toMatchInlineSnapshot(`
|
|
386
|
+
[
|
|
387
|
+
"client -> server | LOAD ClientGroup sessions: header/3",
|
|
388
|
+
"client -> server | LOAD ClientMap sessions: header/1",
|
|
389
|
+
"client -> server | CONTENT ClientGroup header: true new: After: 0 New: 3",
|
|
390
|
+
"client -> server | CONTENT ClientMap header: true new: After: 0 New: 1",
|
|
391
|
+
"server -> client | KNOWN ClientGroup sessions: empty",
|
|
392
|
+
"server -> client | KNOWN ClientMap sessions: empty",
|
|
393
|
+
"server -> client | KNOWN ClientGroup sessions: header/3",
|
|
394
|
+
"server -> client | KNOWN ClientMap sessions: header/1",
|
|
395
|
+
]
|
|
396
|
+
`);
|
|
397
|
+
});
|
|
398
|
+
});
|
|
243
399
|
//# sourceMappingURL=sync.peerReconciliation.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.peerReconciliation.test.js","sourceRoot":"","sources":["../../src/tests/sync.peerReconciliation.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.peerReconciliation.test.js","sourceRoot":"","sources":["../../src/tests/sync.peerReconciliation.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"type": "module",
|
|
31
31
|
"license": "MIT",
|
|
32
|
-
"version": "0.20.
|
|
32
|
+
"version": "0.20.3",
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@opentelemetry/sdk-metrics": "^2.0.0",
|
|
35
35
|
"libsql": "^0.5.13",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"@opentelemetry/api": "^1.9.0",
|
|
43
43
|
"@scure/base": "1.2.1",
|
|
44
44
|
"unicode-segmenter": "^0.12.0",
|
|
45
|
-
"cojson-core-wasm": "0.20.
|
|
46
|
-
"cojson-core-napi": "0.20.
|
|
47
|
-
"cojson-core-rn": "0.20.
|
|
45
|
+
"cojson-core-wasm": "0.20.3",
|
|
46
|
+
"cojson-core-napi": "0.20.3",
|
|
47
|
+
"cojson-core-rn": "0.20.3"
|
|
48
48
|
},
|
|
49
49
|
"gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
|
|
50
50
|
"scripts": {
|
package/src/GarbageCollector.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CoValueCore } from "./coValueCore/coValueCore.js";
|
|
2
2
|
import { GARBAGE_COLLECTOR_CONFIG } from "./config.js";
|
|
3
3
|
import { RawCoID } from "./ids.js";
|
|
4
|
+
import type { LocalNode } from "./localNode.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* TTL-based garbage collector for removing unused CoValues from memory.
|
|
@@ -8,7 +9,7 @@ import { RawCoID } from "./ids.js";
|
|
|
8
9
|
export class GarbageCollector {
|
|
9
10
|
private readonly interval: ReturnType<typeof setInterval>;
|
|
10
11
|
|
|
11
|
-
constructor(private readonly
|
|
12
|
+
constructor(private readonly node: LocalNode) {
|
|
12
13
|
this.interval = setInterval(() => {
|
|
13
14
|
this.collect();
|
|
14
15
|
}, GARBAGE_COLLECTOR_CONFIG.INTERVAL);
|
|
@@ -26,7 +27,7 @@ export class GarbageCollector {
|
|
|
26
27
|
|
|
27
28
|
collect() {
|
|
28
29
|
const currentTime = this.getCurrentTime();
|
|
29
|
-
for (const coValue of this.
|
|
30
|
+
for (const coValue of this.node.allCoValues()) {
|
|
30
31
|
const { verified } = coValue;
|
|
31
32
|
|
|
32
33
|
if (!verified?.lastAccessed) {
|
|
@@ -36,7 +37,7 @@ export class GarbageCollector {
|
|
|
36
37
|
const timeSinceLastAccessed = currentTime - verified.lastAccessed;
|
|
37
38
|
|
|
38
39
|
if (timeSinceLastAccessed > GARBAGE_COLLECTOR_CONFIG.MAX_AGE) {
|
|
39
|
-
coValue.
|
|
40
|
+
this.node.internalUnmountCoValue(coValue.id);
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -282,6 +282,15 @@ export class CoValueCore {
|
|
|
282
282
|
}
|
|
283
283
|
>();
|
|
284
284
|
|
|
285
|
+
// Tracks why we have lastKnownState (separate from loadingStatuses)
|
|
286
|
+
// - "garbageCollected": was in memory, got GC'd
|
|
287
|
+
// - "onlyKnownState": checked storage, found knownState, but didn't load full content
|
|
288
|
+
#lastKnownStateSource?: "garbageCollected" | "onlyKnownState";
|
|
289
|
+
|
|
290
|
+
// Cache the knownState when transitioning to garbageCollected/onlyKnownState
|
|
291
|
+
// Used during peer reconciliation to send accurate LOAD requests
|
|
292
|
+
#lastKnownState?: CoValueKnownState;
|
|
293
|
+
|
|
285
294
|
// cached state and listeners
|
|
286
295
|
private _cachedContent?: RawCoValue;
|
|
287
296
|
readonly listeners: Set<(core: CoValueCore, unsub: () => void) => void> =
|
|
@@ -308,14 +317,26 @@ export class CoValueCore {
|
|
|
308
317
|
get loadingState() {
|
|
309
318
|
if (this.verified) {
|
|
310
319
|
return "available";
|
|
311
|
-
} else if (this.loadingStatuses.size === 0) {
|
|
312
|
-
return "unknown";
|
|
313
320
|
}
|
|
314
321
|
|
|
322
|
+
// Check for pending peers FIRST - loading takes priority over other states
|
|
315
323
|
for (const peer of this.loadingStatuses.values()) {
|
|
316
324
|
if (peer.type === "pending") {
|
|
317
325
|
return "loading";
|
|
318
|
-
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Check for lastKnownStateSource (garbageCollected or onlyKnownState)
|
|
330
|
+
if (this.#lastKnownStateSource) {
|
|
331
|
+
return this.#lastKnownStateSource;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (this.loadingStatuses.size === 0) {
|
|
335
|
+
return "unknown";
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
for (const peer of this.loadingStatuses.values()) {
|
|
339
|
+
if (peer.type === "unknown") {
|
|
319
340
|
return "unknown";
|
|
320
341
|
}
|
|
321
342
|
}
|
|
@@ -429,32 +450,22 @@ export class CoValueCore {
|
|
|
429
450
|
}
|
|
430
451
|
|
|
431
452
|
/**
|
|
432
|
-
* Removes the CoValue from memory.
|
|
453
|
+
* Removes the CoValue content from memory but keeps a shell with cached knownState.
|
|
454
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
433
455
|
*
|
|
434
456
|
* @returns true if the coValue was successfully unmounted, false otherwise
|
|
435
457
|
*/
|
|
436
458
|
unmount(): boolean {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
return false;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
for (const dependant of this.dependant) {
|
|
443
|
-
if (this.node.hasCoValue(dependant)) {
|
|
444
|
-
// Another in-memory coValue depends on this coValue
|
|
445
|
-
return false;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
if (!this.node.syncManager.isSyncedToServerPeers(this.id)) {
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
459
|
+
return this.node.internalUnmountCoValue(this.id);
|
|
460
|
+
}
|
|
452
461
|
|
|
462
|
+
/**
|
|
463
|
+
* Decrements the counter for the current loading state.
|
|
464
|
+
* Used during unmount to properly track state transitions.
|
|
465
|
+
* @internal
|
|
466
|
+
*/
|
|
467
|
+
decrementLoadingStateCounter() {
|
|
453
468
|
this.counter.add(-1, { state: this.loadingState });
|
|
454
|
-
|
|
455
|
-
this.node.internalDeleteCoValue(this.id);
|
|
456
|
-
|
|
457
|
-
return true;
|
|
458
469
|
}
|
|
459
470
|
|
|
460
471
|
markNotFoundInPeer(peerId: PeerID) {
|
|
@@ -470,6 +481,35 @@ export class CoValueCore {
|
|
|
470
481
|
this.scheduleNotifyUpdate();
|
|
471
482
|
}
|
|
472
483
|
|
|
484
|
+
/**
|
|
485
|
+
* Clean up cached state when CoValue becomes available.
|
|
486
|
+
* Called after the CoValue transitions from garbageCollected/onlyKnownState to available.
|
|
487
|
+
*/
|
|
488
|
+
private cleanupLastKnownState() {
|
|
489
|
+
// Clear both fields - in-memory verified state is now authoritative
|
|
490
|
+
this.#lastKnownStateSource = undefined;
|
|
491
|
+
this.#lastKnownState = undefined;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Initialize this CoValueCore as a garbageCollected shell.
|
|
496
|
+
* Called when creating a replacement CoValueCore after unmounting.
|
|
497
|
+
*/
|
|
498
|
+
setGarbageCollectedState(knownState: CoValueKnownState) {
|
|
499
|
+
// Only set garbageCollected state if storage is active
|
|
500
|
+
// Without storage, we can't reload the CoValue anyway
|
|
501
|
+
if (!this.node.storage) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// Transition counter from 'unknown' (set by constructor) to 'garbageCollected'
|
|
506
|
+
// previousState will be 'unknown', newState will be 'garbageCollected'
|
|
507
|
+
const previousState = this.loadingState;
|
|
508
|
+
this.#lastKnownStateSource = "garbageCollected";
|
|
509
|
+
this.#lastKnownState = knownState;
|
|
510
|
+
this.updateCounter(previousState);
|
|
511
|
+
}
|
|
512
|
+
|
|
473
513
|
missingDependencies = new Set<RawCoID>();
|
|
474
514
|
|
|
475
515
|
isCircularDependency(dependency: CoValueCore) {
|
|
@@ -576,6 +616,10 @@ export class CoValueCore {
|
|
|
576
616
|
header,
|
|
577
617
|
new SessionMap(this.id, this.node.crypto, streamingKnownState),
|
|
578
618
|
);
|
|
619
|
+
// Clean up if transitioning from garbageCollected/onlyKnownState
|
|
620
|
+
if (this.isAvailable()) {
|
|
621
|
+
this.cleanupLastKnownState();
|
|
622
|
+
}
|
|
579
623
|
|
|
580
624
|
return true;
|
|
581
625
|
}
|
|
@@ -606,10 +650,11 @@ export class CoValueCore {
|
|
|
606
650
|
* Used to correctly manage the content & subscriptions during the content streaming process
|
|
607
651
|
*/
|
|
608
652
|
knownStateWithStreaming(): CoValueKnownState {
|
|
609
|
-
|
|
610
|
-
this.verified
|
|
611
|
-
|
|
612
|
-
|
|
653
|
+
if (this.verified) {
|
|
654
|
+
return this.verified.immutableKnownStateWithStreaming();
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
return this.knownState();
|
|
613
658
|
}
|
|
614
659
|
|
|
615
660
|
/**
|
|
@@ -618,9 +663,22 @@ export class CoValueCore {
|
|
|
618
663
|
* The return value identity is going to be stable as long as the CoValue is not modified.
|
|
619
664
|
*
|
|
620
665
|
* On change the knownState is invalidated and a new object is returned.
|
|
666
|
+
*
|
|
667
|
+
* For garbageCollected/onlyKnownState CoValues, returns the cached knownState.
|
|
621
668
|
*/
|
|
622
669
|
knownState(): CoValueKnownState {
|
|
623
|
-
|
|
670
|
+
// 1. If we have verified content in memory, use that (authoritative)
|
|
671
|
+
if (this.verified) {
|
|
672
|
+
return this.verified.immutableKnownState();
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// 2. If we have last known state (GC'd or onlyKnownState), use that
|
|
676
|
+
if (this.#lastKnownState) {
|
|
677
|
+
return this.#lastKnownState;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// 3. Fallback to empty state (truly unknown CoValue)
|
|
681
|
+
return emptyKnownState(this.id);
|
|
624
682
|
}
|
|
625
683
|
|
|
626
684
|
/**
|
|
@@ -1756,7 +1814,7 @@ export class CoValueCore {
|
|
|
1756
1814
|
);
|
|
1757
1815
|
}
|
|
1758
1816
|
|
|
1759
|
-
if (this.
|
|
1817
|
+
if (this.isGroupOrAccount()) {
|
|
1760
1818
|
return expectGroup(this.getCurrentContent()).getCurrentReadKey();
|
|
1761
1819
|
} else if (this.verified.header.ruleset.type === "ownedByGroup") {
|
|
1762
1820
|
return this.node
|
|
@@ -1784,16 +1842,26 @@ export class CoValueCore {
|
|
|
1784
1842
|
);
|
|
1785
1843
|
}
|
|
1786
1844
|
|
|
1787
|
-
|
|
1788
|
-
|
|
1845
|
+
if (this.isGroup()) {
|
|
1846
|
+
// is group
|
|
1789
1847
|
const content = expectGroup(
|
|
1790
|
-
//
|
|
1791
|
-
// to
|
|
1848
|
+
// Private transactions are not considered valid in groups, so we don't need to pass
|
|
1849
|
+
// ignorePrivateTransactions: true to safely load the content
|
|
1850
|
+
this.getCurrentContent(),
|
|
1851
|
+
);
|
|
1852
|
+
|
|
1853
|
+
return content.getReadKey(keyID);
|
|
1854
|
+
} else if (this.isGroupOrAccount()) {
|
|
1855
|
+
// is account
|
|
1856
|
+
const content = expectGroup(
|
|
1857
|
+
// Old accounts might have private transactions, because we were encrypting the root id in the past
|
|
1858
|
+
// So we need to load the account without private transactions, because we can't decrypt them without the read key
|
|
1792
1859
|
this.getCurrentContent({ ignorePrivateTransactions: true }),
|
|
1793
1860
|
);
|
|
1794
1861
|
|
|
1795
1862
|
return content.getReadKey(keyID);
|
|
1796
1863
|
} else if (this.verified.header.ruleset.type === "ownedByGroup") {
|
|
1864
|
+
// is a CoValue owned by a group
|
|
1797
1865
|
return expectGroup(
|
|
1798
1866
|
this.node
|
|
1799
1867
|
.expectCoValueLoaded(this.verified.header.ruleset.group)
|
|
@@ -1891,7 +1959,16 @@ export class CoValueCore {
|
|
|
1891
1959
|
return;
|
|
1892
1960
|
}
|
|
1893
1961
|
|
|
1894
|
-
if
|
|
1962
|
+
// Check if we need to load from storage:
|
|
1963
|
+
// - If storage state is not unknown (already tried), AND
|
|
1964
|
+
// - Overall state is not garbageCollected/onlyKnownState (which need full content)
|
|
1965
|
+
// Then return early
|
|
1966
|
+
const overallState = this.loadingState;
|
|
1967
|
+
if (
|
|
1968
|
+
currentState !== "unknown" &&
|
|
1969
|
+
overallState !== "garbageCollected" &&
|
|
1970
|
+
overallState !== "onlyKnownState"
|
|
1971
|
+
) {
|
|
1895
1972
|
done?.(currentState === "available");
|
|
1896
1973
|
return;
|
|
1897
1974
|
}
|
|
@@ -1916,7 +1993,8 @@ export class CoValueCore {
|
|
|
1916
1993
|
* Lazily load only the knownState from storage without loading full transaction data.
|
|
1917
1994
|
* This is useful for checking if a peer needs new content before committing to a full load.
|
|
1918
1995
|
*
|
|
1919
|
-
*
|
|
1996
|
+
* If found in storage, marks the CoValue as onlyKnownState and caches the knownState.
|
|
1997
|
+
* This enables accurate LOAD requests during peer reconciliation.
|
|
1920
1998
|
*
|
|
1921
1999
|
* @param done - Callback with the storage knownState, or undefined if not found in storage
|
|
1922
2000
|
*/
|
|
@@ -1928,14 +2006,26 @@ export class CoValueCore {
|
|
|
1928
2006
|
return;
|
|
1929
2007
|
}
|
|
1930
2008
|
|
|
1931
|
-
// If already
|
|
1932
|
-
|
|
1933
|
-
|
|
2009
|
+
// If we already have knowledge about this CoValue (in memory or cached), return it
|
|
2010
|
+
// knownState() returns verified state, lastKnownState, or empty state
|
|
2011
|
+
const knownState = this.knownState();
|
|
2012
|
+
if (knownState.header) {
|
|
2013
|
+
done(knownState);
|
|
1934
2014
|
return;
|
|
1935
2015
|
}
|
|
1936
2016
|
|
|
1937
2017
|
// Delegate to storage - caching is handled at storage level
|
|
1938
|
-
this.node.storage.loadKnownState(this.id,
|
|
2018
|
+
this.node.storage.loadKnownState(this.id, (knownState) => {
|
|
2019
|
+
// The coValue could become available in the meantime.
|
|
2020
|
+
if (knownState && !this.isAvailable()) {
|
|
2021
|
+
// Cache the knownState and mark as onlyKnownState
|
|
2022
|
+
const previousState = this.loadingState;
|
|
2023
|
+
this.#lastKnownStateSource = "onlyKnownState";
|
|
2024
|
+
this.#lastKnownState = knownState;
|
|
2025
|
+
this.updateCounter(previousState);
|
|
2026
|
+
}
|
|
2027
|
+
done(knownState);
|
|
2028
|
+
});
|
|
1939
2029
|
}
|
|
1940
2030
|
|
|
1941
2031
|
loadFromPeers(peers: PeerState[], mode?: LoadMode) {
|