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.
Files changed (254) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +67 -0
  3. package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts +42 -0
  4. package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts.map +1 -0
  5. package/dist/CojsonMessageChannel/CojsonMessageChannel.js +261 -0
  6. package/dist/CojsonMessageChannel/CojsonMessageChannel.js.map +1 -0
  7. package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts +18 -0
  8. package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts.map +1 -0
  9. package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js +37 -0
  10. package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js.map +1 -0
  11. package/dist/CojsonMessageChannel/index.d.ts +3 -0
  12. package/dist/CojsonMessageChannel/index.d.ts.map +1 -0
  13. package/dist/CojsonMessageChannel/index.js +2 -0
  14. package/dist/CojsonMessageChannel/index.js.map +1 -0
  15. package/dist/CojsonMessageChannel/types.d.ts +149 -0
  16. package/dist/CojsonMessageChannel/types.d.ts.map +1 -0
  17. package/dist/CojsonMessageChannel/types.js +36 -0
  18. package/dist/CojsonMessageChannel/types.js.map +1 -0
  19. package/dist/GarbageCollector.d.ts +4 -2
  20. package/dist/GarbageCollector.d.ts.map +1 -1
  21. package/dist/GarbageCollector.js +5 -3
  22. package/dist/GarbageCollector.js.map +1 -1
  23. package/dist/SyncStateManager.d.ts +3 -3
  24. package/dist/SyncStateManager.d.ts.map +1 -1
  25. package/dist/SyncStateManager.js +4 -4
  26. package/dist/SyncStateManager.js.map +1 -1
  27. package/dist/coValueContentMessage.d.ts +0 -2
  28. package/dist/coValueContentMessage.d.ts.map +1 -1
  29. package/dist/coValueContentMessage.js +0 -8
  30. package/dist/coValueContentMessage.js.map +1 -1
  31. package/dist/coValueCore/SessionMap.d.ts +4 -2
  32. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  33. package/dist/coValueCore/SessionMap.js +30 -0
  34. package/dist/coValueCore/SessionMap.js.map +1 -1
  35. package/dist/coValueCore/coValueCore.d.ts +86 -4
  36. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  37. package/dist/coValueCore/coValueCore.js +318 -17
  38. package/dist/coValueCore/coValueCore.js.map +1 -1
  39. package/dist/coValueCore/verifiedState.d.ts +6 -1
  40. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  41. package/dist/coValueCore/verifiedState.js +9 -0
  42. package/dist/coValueCore/verifiedState.js.map +1 -1
  43. package/dist/coValues/coList.d.ts +3 -2
  44. package/dist/coValues/coList.d.ts.map +1 -1
  45. package/dist/coValues/coList.js.map +1 -1
  46. package/dist/coValues/group.d.ts.map +1 -1
  47. package/dist/coValues/group.js +3 -6
  48. package/dist/coValues/group.js.map +1 -1
  49. package/dist/config.d.ts +0 -6
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +0 -8
  52. package/dist/config.js.map +1 -1
  53. package/dist/crypto/NapiCrypto.d.ts +1 -2
  54. package/dist/crypto/NapiCrypto.d.ts.map +1 -1
  55. package/dist/crypto/NapiCrypto.js +19 -4
  56. package/dist/crypto/NapiCrypto.js.map +1 -1
  57. package/dist/crypto/RNCrypto.d.ts.map +1 -1
  58. package/dist/crypto/RNCrypto.js +19 -4
  59. package/dist/crypto/RNCrypto.js.map +1 -1
  60. package/dist/crypto/WasmCrypto.d.ts +11 -4
  61. package/dist/crypto/WasmCrypto.d.ts.map +1 -1
  62. package/dist/crypto/WasmCrypto.js +52 -10
  63. package/dist/crypto/WasmCrypto.js.map +1 -1
  64. package/dist/crypto/WasmCryptoEdge.d.ts +1 -0
  65. package/dist/crypto/WasmCryptoEdge.d.ts.map +1 -1
  66. package/dist/crypto/WasmCryptoEdge.js +4 -1
  67. package/dist/crypto/WasmCryptoEdge.js.map +1 -1
  68. package/dist/crypto/crypto.d.ts +3 -3
  69. package/dist/crypto/crypto.d.ts.map +1 -1
  70. package/dist/crypto/crypto.js +6 -1
  71. package/dist/crypto/crypto.js.map +1 -1
  72. package/dist/exports.d.ts +3 -2
  73. package/dist/exports.d.ts.map +1 -1
  74. package/dist/exports.js +3 -1
  75. package/dist/exports.js.map +1 -1
  76. package/dist/ids.d.ts +4 -1
  77. package/dist/ids.d.ts.map +1 -1
  78. package/dist/ids.js +4 -0
  79. package/dist/ids.js.map +1 -1
  80. package/dist/knownState.d.ts +2 -0
  81. package/dist/knownState.d.ts.map +1 -1
  82. package/dist/localNode.d.ts +13 -3
  83. package/dist/localNode.d.ts.map +1 -1
  84. package/dist/localNode.js +17 -2
  85. package/dist/localNode.js.map +1 -1
  86. package/dist/platformUtils.d.ts +3 -0
  87. package/dist/platformUtils.d.ts.map +1 -0
  88. package/dist/platformUtils.js +24 -0
  89. package/dist/platformUtils.js.map +1 -0
  90. package/dist/storage/DeletedCoValuesEraserScheduler.d.ts +30 -0
  91. package/dist/storage/DeletedCoValuesEraserScheduler.d.ts.map +1 -0
  92. package/dist/storage/DeletedCoValuesEraserScheduler.js +84 -0
  93. package/dist/storage/DeletedCoValuesEraserScheduler.js.map +1 -0
  94. package/dist/storage/sqlite/client.d.ts +3 -0
  95. package/dist/storage/sqlite/client.d.ts.map +1 -1
  96. package/dist/storage/sqlite/client.js +44 -0
  97. package/dist/storage/sqlite/client.js.map +1 -1
  98. package/dist/storage/sqlite/sqliteMigrations.d.ts.map +1 -1
  99. package/dist/storage/sqlite/sqliteMigrations.js +7 -0
  100. package/dist/storage/sqlite/sqliteMigrations.js.map +1 -1
  101. package/dist/storage/sqliteAsync/client.d.ts +3 -0
  102. package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
  103. package/dist/storage/sqliteAsync/client.js +42 -0
  104. package/dist/storage/sqliteAsync/client.js.map +1 -1
  105. package/dist/storage/storageAsync.d.ts +15 -3
  106. package/dist/storage/storageAsync.d.ts.map +1 -1
  107. package/dist/storage/storageAsync.js +60 -3
  108. package/dist/storage/storageAsync.js.map +1 -1
  109. package/dist/storage/storageSync.d.ts +14 -3
  110. package/dist/storage/storageSync.d.ts.map +1 -1
  111. package/dist/storage/storageSync.js +54 -3
  112. package/dist/storage/storageSync.js.map +1 -1
  113. package/dist/storage/types.d.ts +64 -0
  114. package/dist/storage/types.d.ts.map +1 -1
  115. package/dist/storage/types.js +12 -1
  116. package/dist/storage/types.js.map +1 -1
  117. package/dist/sync.d.ts +6 -0
  118. package/dist/sync.d.ts.map +1 -1
  119. package/dist/sync.js +69 -15
  120. package/dist/sync.js.map +1 -1
  121. package/dist/tests/CojsonMessageChannel.test.d.ts +2 -0
  122. package/dist/tests/CojsonMessageChannel.test.d.ts.map +1 -0
  123. package/dist/tests/CojsonMessageChannel.test.js +236 -0
  124. package/dist/tests/CojsonMessageChannel.test.js.map +1 -0
  125. package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts +2 -0
  126. package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts.map +1 -0
  127. package/dist/tests/DeletedCoValuesEraserScheduler.test.js +149 -0
  128. package/dist/tests/DeletedCoValuesEraserScheduler.test.js.map +1 -0
  129. package/dist/tests/GarbageCollector.test.js +91 -18
  130. package/dist/tests/GarbageCollector.test.js.map +1 -1
  131. package/dist/tests/StorageApiAsync.test.js +510 -146
  132. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  133. package/dist/tests/StorageApiSync.test.js +531 -130
  134. package/dist/tests/StorageApiSync.test.js.map +1 -1
  135. package/dist/tests/SyncManager.processQueues.test.js +1 -1
  136. package/dist/tests/SyncManager.processQueues.test.js.map +1 -1
  137. package/dist/tests/SyncStateManager.test.js +1 -1
  138. package/dist/tests/SyncStateManager.test.js.map +1 -1
  139. package/dist/tests/WasmCrypto.test.js +6 -3
  140. package/dist/tests/WasmCrypto.test.js.map +1 -1
  141. package/dist/tests/coPlainText.test.js +1 -1
  142. package/dist/tests/coPlainText.test.js.map +1 -1
  143. package/dist/tests/coValueCore.loadFromStorage.test.js +4 -0
  144. package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
  145. package/dist/tests/coValueCore.test.js +34 -13
  146. package/dist/tests/coValueCore.test.js.map +1 -1
  147. package/dist/tests/coreWasm.test.js +127 -4
  148. package/dist/tests/coreWasm.test.js.map +1 -1
  149. package/dist/tests/crypto.test.js +89 -93
  150. package/dist/tests/crypto.test.js.map +1 -1
  151. package/dist/tests/deleteCoValue.test.d.ts +2 -0
  152. package/dist/tests/deleteCoValue.test.d.ts.map +1 -0
  153. package/dist/tests/deleteCoValue.test.js +313 -0
  154. package/dist/tests/deleteCoValue.test.js.map +1 -0
  155. package/dist/tests/group.removeMember.test.js +18 -30
  156. package/dist/tests/group.removeMember.test.js.map +1 -1
  157. package/dist/tests/knownState.lazyLoading.test.js +4 -0
  158. package/dist/tests/knownState.lazyLoading.test.js.map +1 -1
  159. package/dist/tests/sync.deleted.test.d.ts +2 -0
  160. package/dist/tests/sync.deleted.test.d.ts.map +1 -0
  161. package/dist/tests/sync.deleted.test.js +214 -0
  162. package/dist/tests/sync.deleted.test.js.map +1 -0
  163. package/dist/tests/sync.garbageCollection.test.js +56 -32
  164. package/dist/tests/sync.garbageCollection.test.js.map +1 -1
  165. package/dist/tests/sync.load.test.js +3 -5
  166. package/dist/tests/sync.load.test.js.map +1 -1
  167. package/dist/tests/sync.mesh.test.js +4 -3
  168. package/dist/tests/sync.mesh.test.js.map +1 -1
  169. package/dist/tests/sync.peerReconciliation.test.js +3 -3
  170. package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
  171. package/dist/tests/sync.storage.test.js +12 -11
  172. package/dist/tests/sync.storage.test.js.map +1 -1
  173. package/dist/tests/sync.storageAsync.test.js +7 -7
  174. package/dist/tests/sync.storageAsync.test.js.map +1 -1
  175. package/dist/tests/sync.test.js +3 -2
  176. package/dist/tests/sync.test.js.map +1 -1
  177. package/dist/tests/sync.tracking.test.js +35 -4
  178. package/dist/tests/sync.tracking.test.js.map +1 -1
  179. package/dist/tests/testStorage.d.ts +3 -0
  180. package/dist/tests/testStorage.d.ts.map +1 -1
  181. package/dist/tests/testStorage.js +16 -2
  182. package/dist/tests/testStorage.js.map +1 -1
  183. package/dist/tests/testUtils.d.ts +29 -4
  184. package/dist/tests/testUtils.d.ts.map +1 -1
  185. package/dist/tests/testUtils.js +84 -9
  186. package/dist/tests/testUtils.js.map +1 -1
  187. package/package.json +6 -16
  188. package/src/CojsonMessageChannel/CojsonMessageChannel.ts +332 -0
  189. package/src/CojsonMessageChannel/MessagePortOutgoingChannel.ts +52 -0
  190. package/src/CojsonMessageChannel/index.ts +9 -0
  191. package/src/CojsonMessageChannel/types.ts +200 -0
  192. package/src/GarbageCollector.ts +5 -5
  193. package/src/SyncStateManager.ts +6 -6
  194. package/src/coValueContentMessage.ts +0 -14
  195. package/src/coValueCore/SessionMap.ts +43 -1
  196. package/src/coValueCore/coValueCore.ts +430 -15
  197. package/src/coValueCore/verifiedState.ts +26 -3
  198. package/src/coValues/coList.ts +5 -3
  199. package/src/coValues/group.ts +5 -6
  200. package/src/config.ts +0 -9
  201. package/src/crypto/NapiCrypto.ts +29 -13
  202. package/src/crypto/RNCrypto.ts +29 -11
  203. package/src/crypto/WasmCrypto.ts +67 -20
  204. package/src/crypto/WasmCryptoEdge.ts +5 -1
  205. package/src/crypto/crypto.ts +16 -4
  206. package/src/exports.ts +3 -0
  207. package/src/ids.ts +11 -1
  208. package/src/localNode.ts +18 -5
  209. package/src/platformUtils.ts +26 -0
  210. package/src/storage/DeletedCoValuesEraserScheduler.ts +124 -0
  211. package/src/storage/sqlite/client.ts +77 -0
  212. package/src/storage/sqlite/sqliteMigrations.ts +7 -0
  213. package/src/storage/sqliteAsync/client.ts +75 -0
  214. package/src/storage/storageAsync.ts +77 -4
  215. package/src/storage/storageSync.ts +73 -4
  216. package/src/storage/types.ts +75 -0
  217. package/src/sync.ts +84 -15
  218. package/src/tests/CojsonMessageChannel.test.ts +306 -0
  219. package/src/tests/DeletedCoValuesEraserScheduler.test.ts +185 -0
  220. package/src/tests/GarbageCollector.test.ts +119 -22
  221. package/src/tests/StorageApiAsync.test.ts +615 -156
  222. package/src/tests/StorageApiSync.test.ts +623 -137
  223. package/src/tests/SyncManager.processQueues.test.ts +1 -1
  224. package/src/tests/SyncStateManager.test.ts +1 -1
  225. package/src/tests/WasmCrypto.test.ts +8 -3
  226. package/src/tests/coPlainText.test.ts +1 -1
  227. package/src/tests/coValueCore.loadFromStorage.test.ts +8 -0
  228. package/src/tests/coValueCore.test.ts +49 -14
  229. package/src/tests/coreWasm.test.ts +319 -10
  230. package/src/tests/crypto.test.ts +141 -150
  231. package/src/tests/deleteCoValue.test.ts +528 -0
  232. package/src/tests/group.removeMember.test.ts +35 -35
  233. package/src/tests/knownState.lazyLoading.test.ts +8 -0
  234. package/src/tests/sync.deleted.test.ts +294 -0
  235. package/src/tests/sync.garbageCollection.test.ts +69 -36
  236. package/src/tests/sync.load.test.ts +3 -5
  237. package/src/tests/sync.mesh.test.ts +6 -3
  238. package/src/tests/sync.peerReconciliation.test.ts +3 -3
  239. package/src/tests/sync.storage.test.ts +14 -11
  240. package/src/tests/sync.storageAsync.test.ts +7 -7
  241. package/src/tests/sync.test.ts +5 -2
  242. package/src/tests/sync.tracking.test.ts +54 -4
  243. package/src/tests/testStorage.ts +30 -3
  244. package/src/tests/testUtils.ts +113 -15
  245. package/dist/crypto/PureJSCrypto.d.ts +0 -77
  246. package/dist/crypto/PureJSCrypto.d.ts.map +0 -1
  247. package/dist/crypto/PureJSCrypto.js +0 -236
  248. package/dist/crypto/PureJSCrypto.js.map +0 -1
  249. package/dist/tests/PureJSCrypto.test.d.ts +0 -2
  250. package/dist/tests/PureJSCrypto.test.d.ts.map +0 -1
  251. package/dist/tests/PureJSCrypto.test.js +0 -145
  252. package/dist/tests/PureJSCrypto.test.js.map +0 -1
  253. package/src/crypto/PureJSCrypto.ts +0 -429
  254. 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 { TEST_NODE_CONFIG, setupTestAccount, setupTestNode } from "./testUtils";
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 new Promise((resolve) => setTimeout(resolve, 10));
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 new Promise((resolve) => setTimeout(resolve, 10));
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 a group or account", async () => {
70
- const client = await setupTestAccount();
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
- garbageCollectGroups: true,
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(group.id).isAvailable()).toBe(false);
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 or account coValues are garbage collected if garbageCollectGroups is true", async () => {
90
- const client = await setupTestAccount();
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 new Promise((resolve) => setTimeout(resolve, 10));
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(client.accountID).isAvailable()).toBe(true);
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
- const getCurrentTime = vi.spyOn(garbageCollector, "getCurrentTime");
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 new Promise((resolve) => setTimeout(resolve, 10));
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
- getCurrentTime.mockReturnValue(2000);
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
  });