cojson 0.19.21 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +67 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts +42 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.js +261 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.js.map +1 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts +18 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js +37 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js.map +1 -0
- package/dist/CojsonMessageChannel/index.d.ts +3 -0
- package/dist/CojsonMessageChannel/index.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/index.js +2 -0
- package/dist/CojsonMessageChannel/index.js.map +1 -0
- package/dist/CojsonMessageChannel/types.d.ts +149 -0
- package/dist/CojsonMessageChannel/types.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/types.js +36 -0
- package/dist/CojsonMessageChannel/types.js.map +1 -0
- package/dist/GarbageCollector.d.ts +4 -2
- package/dist/GarbageCollector.d.ts.map +1 -1
- package/dist/GarbageCollector.js +5 -3
- package/dist/GarbageCollector.js.map +1 -1
- package/dist/SyncStateManager.d.ts +3 -3
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +4 -4
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueContentMessage.d.ts +0 -2
- package/dist/coValueContentMessage.d.ts.map +1 -1
- package/dist/coValueContentMessage.js +0 -8
- package/dist/coValueContentMessage.js.map +1 -1
- package/dist/coValueCore/SessionMap.d.ts +4 -2
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +30 -0
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +86 -4
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +318 -17
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +6 -1
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +9 -0
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coList.d.ts +3 -2
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +3 -6
- package/dist/coValues/group.js.map +1 -1
- package/dist/config.d.ts +0 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -8
- package/dist/config.js.map +1 -1
- package/dist/crypto/NapiCrypto.d.ts +1 -2
- package/dist/crypto/NapiCrypto.d.ts.map +1 -1
- package/dist/crypto/NapiCrypto.js +19 -4
- package/dist/crypto/NapiCrypto.js.map +1 -1
- package/dist/crypto/RNCrypto.d.ts.map +1 -1
- package/dist/crypto/RNCrypto.js +19 -4
- package/dist/crypto/RNCrypto.js.map +1 -1
- package/dist/crypto/WasmCrypto.d.ts +11 -4
- package/dist/crypto/WasmCrypto.d.ts.map +1 -1
- package/dist/crypto/WasmCrypto.js +52 -10
- package/dist/crypto/WasmCrypto.js.map +1 -1
- package/dist/crypto/WasmCryptoEdge.d.ts +1 -0
- package/dist/crypto/WasmCryptoEdge.d.ts.map +1 -1
- package/dist/crypto/WasmCryptoEdge.js +4 -1
- package/dist/crypto/WasmCryptoEdge.js.map +1 -1
- package/dist/crypto/crypto.d.ts +3 -3
- package/dist/crypto/crypto.d.ts.map +1 -1
- package/dist/crypto/crypto.js +6 -1
- package/dist/crypto/crypto.js.map +1 -1
- package/dist/exports.d.ts +3 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -1
- package/dist/exports.js.map +1 -1
- package/dist/ids.d.ts +4 -1
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +4 -0
- package/dist/ids.js.map +1 -1
- package/dist/knownState.d.ts +2 -0
- package/dist/knownState.d.ts.map +1 -1
- package/dist/localNode.d.ts +13 -3
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +17 -2
- package/dist/localNode.js.map +1 -1
- package/dist/platformUtils.d.ts +3 -0
- package/dist/platformUtils.d.ts.map +1 -0
- package/dist/platformUtils.js +24 -0
- package/dist/platformUtils.js.map +1 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.d.ts +30 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.d.ts.map +1 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.js +84 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.js.map +1 -0
- package/dist/storage/sqlite/client.d.ts +3 -0
- package/dist/storage/sqlite/client.d.ts.map +1 -1
- package/dist/storage/sqlite/client.js +44 -0
- package/dist/storage/sqlite/client.js.map +1 -1
- package/dist/storage/sqlite/sqliteMigrations.d.ts.map +1 -1
- package/dist/storage/sqlite/sqliteMigrations.js +7 -0
- package/dist/storage/sqlite/sqliteMigrations.js.map +1 -1
- package/dist/storage/sqliteAsync/client.d.ts +3 -0
- package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
- package/dist/storage/sqliteAsync/client.js +42 -0
- package/dist/storage/sqliteAsync/client.js.map +1 -1
- package/dist/storage/storageAsync.d.ts +15 -3
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +60 -3
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts +14 -3
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +54 -3
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/storage/types.d.ts +64 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +12 -1
- package/dist/storage/types.js.map +1 -1
- package/dist/sync.d.ts +6 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +69 -15
- package/dist/sync.js.map +1 -1
- package/dist/tests/CojsonMessageChannel.test.d.ts +2 -0
- package/dist/tests/CojsonMessageChannel.test.d.ts.map +1 -0
- package/dist/tests/CojsonMessageChannel.test.js +236 -0
- package/dist/tests/CojsonMessageChannel.test.js.map +1 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts +2 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts.map +1 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.js +149 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.js.map +1 -0
- package/dist/tests/GarbageCollector.test.js +91 -18
- package/dist/tests/GarbageCollector.test.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +510 -146
- package/dist/tests/StorageApiAsync.test.js.map +1 -1
- package/dist/tests/StorageApiSync.test.js +531 -130
- package/dist/tests/StorageApiSync.test.js.map +1 -1
- package/dist/tests/SyncManager.processQueues.test.js +1 -1
- package/dist/tests/SyncManager.processQueues.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +1 -1
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/WasmCrypto.test.js +6 -3
- package/dist/tests/WasmCrypto.test.js.map +1 -1
- package/dist/tests/coPlainText.test.js +1 -1
- package/dist/tests/coPlainText.test.js.map +1 -1
- package/dist/tests/coValueCore.loadFromStorage.test.js +4 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +34 -13
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coreWasm.test.js +127 -4
- package/dist/tests/coreWasm.test.js.map +1 -1
- package/dist/tests/crypto.test.js +89 -93
- package/dist/tests/crypto.test.js.map +1 -1
- package/dist/tests/deleteCoValue.test.d.ts +2 -0
- package/dist/tests/deleteCoValue.test.d.ts.map +1 -0
- package/dist/tests/deleteCoValue.test.js +313 -0
- package/dist/tests/deleteCoValue.test.js.map +1 -0
- package/dist/tests/group.removeMember.test.js +18 -30
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/knownState.lazyLoading.test.js +4 -0
- package/dist/tests/knownState.lazyLoading.test.js.map +1 -1
- package/dist/tests/sync.deleted.test.d.ts +2 -0
- package/dist/tests/sync.deleted.test.d.ts.map +1 -0
- package/dist/tests/sync.deleted.test.js +214 -0
- package/dist/tests/sync.deleted.test.js.map +1 -0
- package/dist/tests/sync.garbageCollection.test.js +56 -32
- package/dist/tests/sync.garbageCollection.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +3 -5
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +4 -3
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +3 -3
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +12 -11
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +7 -7
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.test.js +3 -2
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.tracking.test.js +35 -4
- package/dist/tests/sync.tracking.test.js.map +1 -1
- package/dist/tests/testStorage.d.ts +3 -0
- package/dist/tests/testStorage.d.ts.map +1 -1
- package/dist/tests/testStorage.js +16 -2
- package/dist/tests/testStorage.js.map +1 -1
- package/dist/tests/testUtils.d.ts +29 -4
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +84 -9
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +6 -16
- package/src/CojsonMessageChannel/CojsonMessageChannel.ts +332 -0
- package/src/CojsonMessageChannel/MessagePortOutgoingChannel.ts +52 -0
- package/src/CojsonMessageChannel/index.ts +9 -0
- package/src/CojsonMessageChannel/types.ts +200 -0
- package/src/GarbageCollector.ts +5 -5
- package/src/SyncStateManager.ts +6 -6
- package/src/coValueContentMessage.ts +0 -14
- package/src/coValueCore/SessionMap.ts +43 -1
- package/src/coValueCore/coValueCore.ts +430 -15
- package/src/coValueCore/verifiedState.ts +26 -3
- package/src/coValues/coList.ts +5 -3
- package/src/coValues/group.ts +5 -6
- package/src/config.ts +0 -9
- package/src/crypto/NapiCrypto.ts +29 -13
- package/src/crypto/RNCrypto.ts +29 -11
- package/src/crypto/WasmCrypto.ts +67 -20
- package/src/crypto/WasmCryptoEdge.ts +5 -1
- package/src/crypto/crypto.ts +16 -4
- package/src/exports.ts +3 -0
- package/src/ids.ts +11 -1
- package/src/localNode.ts +18 -5
- package/src/platformUtils.ts +26 -0
- package/src/storage/DeletedCoValuesEraserScheduler.ts +124 -0
- package/src/storage/sqlite/client.ts +77 -0
- package/src/storage/sqlite/sqliteMigrations.ts +7 -0
- package/src/storage/sqliteAsync/client.ts +75 -0
- package/src/storage/storageAsync.ts +77 -4
- package/src/storage/storageSync.ts +73 -4
- package/src/storage/types.ts +75 -0
- package/src/sync.ts +84 -15
- package/src/tests/CojsonMessageChannel.test.ts +306 -0
- package/src/tests/DeletedCoValuesEraserScheduler.test.ts +185 -0
- package/src/tests/GarbageCollector.test.ts +119 -22
- package/src/tests/StorageApiAsync.test.ts +615 -156
- package/src/tests/StorageApiSync.test.ts +623 -137
- package/src/tests/SyncManager.processQueues.test.ts +1 -1
- package/src/tests/SyncStateManager.test.ts +1 -1
- package/src/tests/WasmCrypto.test.ts +8 -3
- package/src/tests/coPlainText.test.ts +1 -1
- package/src/tests/coValueCore.loadFromStorage.test.ts +8 -0
- package/src/tests/coValueCore.test.ts +49 -14
- package/src/tests/coreWasm.test.ts +319 -10
- package/src/tests/crypto.test.ts +141 -150
- package/src/tests/deleteCoValue.test.ts +528 -0
- package/src/tests/group.removeMember.test.ts +35 -35
- package/src/tests/knownState.lazyLoading.test.ts +8 -0
- package/src/tests/sync.deleted.test.ts +294 -0
- package/src/tests/sync.garbageCollection.test.ts +69 -36
- package/src/tests/sync.load.test.ts +3 -5
- package/src/tests/sync.mesh.test.ts +6 -3
- package/src/tests/sync.peerReconciliation.test.ts +3 -3
- package/src/tests/sync.storage.test.ts +14 -11
- package/src/tests/sync.storageAsync.test.ts +7 -7
- package/src/tests/sync.test.ts +5 -2
- package/src/tests/sync.tracking.test.ts +54 -4
- package/src/tests/testStorage.ts +30 -3
- package/src/tests/testUtils.ts +113 -15
- package/dist/crypto/PureJSCrypto.d.ts +0 -77
- package/dist/crypto/PureJSCrypto.d.ts.map +0 -1
- package/dist/crypto/PureJSCrypto.js +0 -236
- package/dist/crypto/PureJSCrypto.js.map +0 -1
- package/dist/tests/PureJSCrypto.test.d.ts +0 -2
- package/dist/tests/PureJSCrypto.test.d.ts.map +0 -1
- package/dist/tests/PureJSCrypto.test.js +0 -145
- package/dist/tests/PureJSCrypto.test.js.map +0 -1
- package/src/crypto/PureJSCrypto.ts +0 -429
- package/src/tests/PureJSCrypto.test.ts +0 -217
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { assert, beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
2
|
|
|
3
3
|
import { setGarbageCollectorMaxAge } from "../config";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
blockMessageTypeOnOutgoingPeer,
|
|
6
|
+
TEST_NODE_CONFIG,
|
|
7
|
+
setupTestAccount,
|
|
8
|
+
setupTestNode,
|
|
9
|
+
} from "./testUtils";
|
|
10
|
+
import { createSyncStorage } from "./testStorage.js";
|
|
5
11
|
|
|
6
12
|
// We want to simulate a real world communication that happens asynchronously
|
|
7
13
|
TEST_NODE_CONFIG.withAsyncPeers = true;
|
|
@@ -10,6 +16,8 @@ beforeEach(() => {
|
|
|
10
16
|
// We want to test what happens when the garbage collector kicks in and removes a coValue
|
|
11
17
|
// We set the max age to -1 to make it remove everything
|
|
12
18
|
setGarbageCollectorMaxAge(-1);
|
|
19
|
+
|
|
20
|
+
setupTestNode({ isSyncServer: true });
|
|
13
21
|
});
|
|
14
22
|
|
|
15
23
|
describe("garbage collector", () => {
|
|
@@ -19,13 +27,14 @@ describe("garbage collector", () => {
|
|
|
19
27
|
client.addStorage({
|
|
20
28
|
ourName: "client",
|
|
21
29
|
});
|
|
30
|
+
client.connectToSyncServer();
|
|
22
31
|
client.node.enableGarbageCollector();
|
|
23
32
|
|
|
24
33
|
const group = client.node.createGroup();
|
|
25
34
|
const map = group.createMap();
|
|
26
35
|
map.set("hello", "world", "trusting");
|
|
27
36
|
|
|
28
|
-
await
|
|
37
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
29
38
|
|
|
30
39
|
client.node.garbageCollector?.collect();
|
|
31
40
|
|
|
@@ -40,6 +49,7 @@ describe("garbage collector", () => {
|
|
|
40
49
|
client.addStorage({
|
|
41
50
|
ourName: "client",
|
|
42
51
|
});
|
|
52
|
+
client.connectToSyncServer();
|
|
43
53
|
client.node.enableGarbageCollector();
|
|
44
54
|
|
|
45
55
|
const group = client.node.createGroup();
|
|
@@ -51,7 +61,7 @@ describe("garbage collector", () => {
|
|
|
51
61
|
// This listener keeps the coValue alive
|
|
52
62
|
});
|
|
53
63
|
|
|
54
|
-
await
|
|
64
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
55
65
|
|
|
56
66
|
client.node.garbageCollector?.collect();
|
|
57
67
|
|
|
@@ -66,45 +76,137 @@ describe("garbage collector", () => {
|
|
|
66
76
|
expect(client.node.getCoValue(map.id).isAvailable()).toBe(false);
|
|
67
77
|
});
|
|
68
78
|
|
|
69
|
-
test("coValues are not garbage collected if they are
|
|
70
|
-
const client =
|
|
79
|
+
test("coValues are not garbage collected if they are not synced with server peers", async () => {
|
|
80
|
+
const client = setupTestNode();
|
|
71
81
|
|
|
72
82
|
client.addStorage({
|
|
73
83
|
ourName: "client",
|
|
74
84
|
});
|
|
75
|
-
client.node.enableGarbageCollector(
|
|
76
|
-
|
|
77
|
-
|
|
85
|
+
client.node.enableGarbageCollector();
|
|
86
|
+
const { peer: serverPeer } = client.connectToSyncServer();
|
|
87
|
+
// Block sync with server
|
|
88
|
+
const blocker = blockMessageTypeOnOutgoingPeer(serverPeer, "content", {});
|
|
78
89
|
|
|
79
90
|
const group = client.node.createGroup();
|
|
91
|
+
const map = group.createMap();
|
|
92
|
+
map.set("hello", "world", "trusting");
|
|
80
93
|
|
|
81
94
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
82
95
|
|
|
83
96
|
client.node.garbageCollector?.collect();
|
|
84
97
|
|
|
85
|
-
expect(client.node.getCoValue(
|
|
98
|
+
expect(client.node.getCoValue(map.id).isAvailable()).toBe(true);
|
|
99
|
+
|
|
100
|
+
// Resume sync with server
|
|
101
|
+
blocker.sendBlockedMessages();
|
|
102
|
+
blocker.unblock();
|
|
103
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
104
|
+
|
|
105
|
+
// The coValue should now be collected
|
|
106
|
+
client.node.garbageCollector?.collect();
|
|
107
|
+
|
|
108
|
+
expect(client.node.getCoValue(map.id).isAvailable()).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("coValues are garbage collected if there are no server peers", async () => {
|
|
112
|
+
const client = setupTestNode();
|
|
113
|
+
|
|
114
|
+
client.addStorage({
|
|
115
|
+
ourName: "client",
|
|
116
|
+
});
|
|
117
|
+
client.node.enableGarbageCollector();
|
|
118
|
+
// Client is not connected to the sync server
|
|
119
|
+
|
|
120
|
+
const group = client.node.createGroup();
|
|
121
|
+
const map = group.createMap();
|
|
122
|
+
map.set("hello", "world", "trusting");
|
|
123
|
+
|
|
124
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
125
|
+
|
|
126
|
+
client.node.garbageCollector?.collect();
|
|
127
|
+
|
|
128
|
+
expect(client.node.getCoValue(map.id).isAvailable()).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("account coValues are not garbage collected if they have dependencies", async () => {
|
|
132
|
+
const client = await setupTestAccount({
|
|
133
|
+
// Add storage before creating the account so it's persisted
|
|
134
|
+
storage: createSyncStorage({
|
|
135
|
+
nodeName: "client",
|
|
136
|
+
storageName: "storage",
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
// The account is created along with its profile, and the group that owns the profile
|
|
140
|
+
const profile = client.node.expectProfileLoaded(client.accountID);
|
|
141
|
+
const profileId = profile.id;
|
|
142
|
+
const profileOwnerId = profile.group.id;
|
|
143
|
+
|
|
144
|
+
client.connectToSyncServer();
|
|
145
|
+
client.node.enableGarbageCollector();
|
|
146
|
+
|
|
147
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
148
|
+
|
|
149
|
+
// First collect removes the profile
|
|
150
|
+
client.node.garbageCollector?.collect();
|
|
151
|
+
expect(client.node.getCoValue(profileId).isAvailable()).toBe(false);
|
|
152
|
+
expect(client.node.getCoValue(profileOwnerId).isAvailable()).toBe(true);
|
|
153
|
+
expect(client.node.getCoValue(client.accountID).isAvailable()).toBe(true);
|
|
154
|
+
|
|
155
|
+
// Second collect removes the profile owner
|
|
156
|
+
client.node.garbageCollector?.collect();
|
|
157
|
+
expect(client.node.getCoValue(profileOwnerId).isAvailable()).toBe(false);
|
|
158
|
+
expect(client.node.getCoValue(client.accountID).isAvailable()).toBe(true);
|
|
159
|
+
|
|
160
|
+
// Third collect removes the account
|
|
161
|
+
client.node.garbageCollector?.collect();
|
|
86
162
|
expect(client.node.getCoValue(client.accountID).isAvailable()).toBe(false);
|
|
87
163
|
});
|
|
88
164
|
|
|
89
|
-
test("group
|
|
90
|
-
const client =
|
|
165
|
+
test("group coValues are garbage collected if they have no dependencies", async () => {
|
|
166
|
+
const client = setupTestNode();
|
|
91
167
|
|
|
92
168
|
client.addStorage({
|
|
93
169
|
ourName: "client",
|
|
94
170
|
});
|
|
171
|
+
client.connectToSyncServer();
|
|
95
172
|
client.node.enableGarbageCollector();
|
|
96
173
|
|
|
97
174
|
const group = client.node.createGroup();
|
|
98
175
|
|
|
99
|
-
await
|
|
176
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
100
177
|
|
|
101
178
|
client.node.garbageCollector?.collect();
|
|
102
179
|
|
|
180
|
+
expect(client.node.getCoValue(group.id).isAvailable()).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("group coValues are not garbage collected if they have dependencies", async () => {
|
|
184
|
+
const client = setupTestNode();
|
|
185
|
+
|
|
186
|
+
client.addStorage({
|
|
187
|
+
ourName: "client",
|
|
188
|
+
});
|
|
189
|
+
client.node.enableGarbageCollector();
|
|
190
|
+
|
|
191
|
+
const group = client.node.createGroup();
|
|
192
|
+
const map = group.createMap();
|
|
193
|
+
map.set("hello", "world", "trusting");
|
|
194
|
+
|
|
195
|
+
await client.node.syncManager.waitForAllCoValuesSync();
|
|
196
|
+
|
|
197
|
+
// First collect removes the map
|
|
198
|
+
client.node.garbageCollector?.collect();
|
|
103
199
|
expect(client.node.getCoValue(group.id).isAvailable()).toBe(true);
|
|
104
|
-
expect(client.node.getCoValue(
|
|
200
|
+
expect(client.node.getCoValue(map.id).isAvailable()).toBe(false);
|
|
201
|
+
|
|
202
|
+
// Second collect removes the group
|
|
203
|
+
client.node.garbageCollector?.collect();
|
|
204
|
+
expect(client.node.getCoValue(group.id).isAvailable()).toBe(false);
|
|
105
205
|
});
|
|
106
206
|
|
|
107
207
|
test("coValues are not garbage collected if the maxAge is not reached", async () => {
|
|
208
|
+
vi.useFakeTimers();
|
|
209
|
+
|
|
108
210
|
setGarbageCollectorMaxAge(1000);
|
|
109
211
|
|
|
110
212
|
const client = setupTestNode();
|
|
@@ -118,30 +220,25 @@ describe("garbage collector", () => {
|
|
|
118
220
|
|
|
119
221
|
assert(garbageCollector);
|
|
120
222
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
getCurrentTime.mockReturnValue(1);
|
|
223
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
124
224
|
|
|
125
225
|
const group = client.node.createGroup();
|
|
126
226
|
const map1 = group.createMap();
|
|
127
227
|
const map2 = group.createMap();
|
|
128
228
|
|
|
129
|
-
await
|
|
229
|
+
await vi.advanceTimersByTimeAsync(800);
|
|
130
230
|
|
|
231
|
+
// Access map1 again, to prevent it from being garbage collected
|
|
131
232
|
map1.set("hello", "world", "trusting");
|
|
132
233
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
234
|
+
await vi.advanceTimersByTimeAsync(300);
|
|
136
235
|
|
|
137
236
|
garbageCollector.collect();
|
|
138
237
|
|
|
139
238
|
const coValue = client.node.getCoValue(map1.id);
|
|
140
|
-
|
|
141
239
|
expect(coValue.isAvailable()).toBe(true);
|
|
142
240
|
|
|
143
241
|
const coValue2 = client.node.getCoValue(map2.id);
|
|
144
|
-
|
|
145
242
|
expect(coValue2.isAvailable()).toBe(false);
|
|
146
243
|
});
|
|
147
244
|
});
|