cojson 0.20.7 → 0.20.9

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 (209) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/dist/SyncStateManager.d.ts.map +1 -1
  4. package/dist/SyncStateManager.js +0 -2
  5. package/dist/SyncStateManager.js.map +1 -1
  6. package/dist/base64url.d.ts +15 -0
  7. package/dist/base64url.d.ts.map +1 -1
  8. package/dist/base64url.js +101 -5
  9. package/dist/base64url.js.map +1 -1
  10. package/dist/base64url.test.js +76 -1
  11. package/dist/base64url.test.js.map +1 -1
  12. package/dist/coValue.d.ts +2 -1
  13. package/dist/coValue.d.ts.map +1 -1
  14. package/dist/coValue.js.map +1 -1
  15. package/dist/coValueCore/coValueCore.d.ts +9 -11
  16. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  17. package/dist/coValueCore/coValueCore.js +92 -65
  18. package/dist/coValueCore/coValueCore.js.map +1 -1
  19. package/dist/coValueCore/verifiedState.d.ts +38 -7
  20. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  21. package/dist/coValueCore/verifiedState.js +226 -30
  22. package/dist/coValueCore/verifiedState.js.map +1 -1
  23. package/dist/coValues/binaryCoStream.d.ts +63 -0
  24. package/dist/coValues/binaryCoStream.d.ts.map +1 -0
  25. package/dist/coValues/binaryCoStream.js +125 -0
  26. package/dist/coValues/binaryCoStream.js.map +1 -0
  27. package/dist/coValues/coList.d.ts +3 -1
  28. package/dist/coValues/coList.d.ts.map +1 -1
  29. package/dist/coValues/coList.js +15 -6
  30. package/dist/coValues/coList.js.map +1 -1
  31. package/dist/coValues/coMap.d.ts +1 -1
  32. package/dist/coValues/coMap.d.ts.map +1 -1
  33. package/dist/coValues/coMap.js +2 -2
  34. package/dist/coValues/coMap.js.map +1 -1
  35. package/dist/coValues/coStream.d.ts +0 -38
  36. package/dist/coValues/coStream.d.ts.map +1 -1
  37. package/dist/coValues/coStream.js +0 -86
  38. package/dist/coValues/coStream.js.map +1 -1
  39. package/dist/coValues/group.d.ts +44 -6
  40. package/dist/coValues/group.d.ts.map +1 -1
  41. package/dist/coValues/group.js +198 -17
  42. package/dist/coValues/group.js.map +1 -1
  43. package/dist/coreToCoValue.d.ts +2 -1
  44. package/dist/coreToCoValue.d.ts.map +1 -1
  45. package/dist/coreToCoValue.js +2 -1
  46. package/dist/coreToCoValue.js.map +1 -1
  47. package/dist/crypto/NapiCrypto.d.ts +18 -24
  48. package/dist/crypto/NapiCrypto.d.ts.map +1 -1
  49. package/dist/crypto/NapiCrypto.js +98 -60
  50. package/dist/crypto/NapiCrypto.js.map +1 -1
  51. package/dist/crypto/RNCrypto.d.ts +16 -3
  52. package/dist/crypto/RNCrypto.d.ts.map +1 -1
  53. package/dist/crypto/RNCrypto.js +117 -54
  54. package/dist/crypto/RNCrypto.js.map +1 -1
  55. package/dist/crypto/WasmCrypto.d.ts +18 -24
  56. package/dist/crypto/WasmCrypto.d.ts.map +1 -1
  57. package/dist/crypto/WasmCrypto.js +100 -61
  58. package/dist/crypto/WasmCrypto.js.map +1 -1
  59. package/dist/crypto/crypto.d.ts +55 -19
  60. package/dist/crypto/crypto.d.ts.map +1 -1
  61. package/dist/crypto/crypto.js +14 -3
  62. package/dist/crypto/crypto.js.map +1 -1
  63. package/dist/exports.d.ts +7 -3
  64. package/dist/exports.d.ts.map +1 -1
  65. package/dist/exports.js +4 -2
  66. package/dist/exports.js.map +1 -1
  67. package/dist/localNode.d.ts +3 -1
  68. package/dist/localNode.d.ts.map +1 -1
  69. package/dist/localNode.js +10 -3
  70. package/dist/localNode.js.map +1 -1
  71. package/dist/media.d.ts +1 -1
  72. package/dist/media.d.ts.map +1 -1
  73. package/dist/permissions.d.ts +2 -1
  74. package/dist/permissions.d.ts.map +1 -1
  75. package/dist/permissions.js +19 -3
  76. package/dist/permissions.js.map +1 -1
  77. package/dist/storage/sqliteAsync/client.d.ts +24 -12
  78. package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
  79. package/dist/storage/sqliteAsync/client.js +70 -58
  80. package/dist/storage/sqliteAsync/client.js.map +1 -1
  81. package/dist/storage/sqliteAsync/types.d.ts +1 -1
  82. package/dist/storage/sqliteAsync/types.d.ts.map +1 -1
  83. package/dist/storage/types.d.ts +1 -0
  84. package/dist/storage/types.d.ts.map +1 -1
  85. package/dist/sync.d.ts.map +1 -1
  86. package/dist/sync.js +7 -1
  87. package/dist/sync.js.map +1 -1
  88. package/dist/tests/CojsonMessageChannel.test.js +2 -2
  89. package/dist/tests/SQLiteClientAsync.test.d.ts +2 -0
  90. package/dist/tests/SQLiteClientAsync.test.d.ts.map +1 -0
  91. package/dist/tests/SQLiteClientAsync.test.js +64 -0
  92. package/dist/tests/SQLiteClientAsync.test.js.map +1 -0
  93. package/dist/tests/StorageApiAsync.test.js +2 -8
  94. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  95. package/dist/tests/SyncStateManager.test.js +2 -2
  96. package/dist/tests/WasmCrypto.test.js +1 -15
  97. package/dist/tests/WasmCrypto.test.js.map +1 -1
  98. package/dist/tests/coList.test.js +24 -5
  99. package/dist/tests/coList.test.js.map +1 -1
  100. package/dist/tests/coStream.test.js +4 -3
  101. package/dist/tests/coStream.test.js.map +1 -1
  102. package/dist/tests/coValueCore.initTransaction.test.d.ts +2 -0
  103. package/dist/tests/coValueCore.initTransaction.test.d.ts.map +1 -0
  104. package/dist/tests/coValueCore.initTransaction.test.js +438 -0
  105. package/dist/tests/coValueCore.initTransaction.test.js.map +1 -0
  106. package/dist/tests/coValueCore.test.js +11 -19
  107. package/dist/tests/coValueCore.test.js.map +1 -1
  108. package/dist/tests/crypto.test.js +83 -0
  109. package/dist/tests/crypto.test.js.map +1 -1
  110. package/dist/tests/deleteCoValue.test.js +5 -5
  111. package/dist/tests/deleteCoValue.test.js.map +1 -1
  112. package/dist/tests/group.inheritance.test.js +11 -0
  113. package/dist/tests/group.inheritance.test.js.map +1 -1
  114. package/dist/tests/group.test.js +24 -1
  115. package/dist/tests/group.test.js.map +1 -1
  116. package/dist/tests/groupSealer.test.d.ts +2 -0
  117. package/dist/tests/groupSealer.test.d.ts.map +1 -0
  118. package/dist/tests/groupSealer.test.js +913 -0
  119. package/dist/tests/groupSealer.test.js.map +1 -0
  120. package/dist/tests/setup.js +5 -0
  121. package/dist/tests/setup.js.map +1 -1
  122. package/dist/tests/sync.auth.test.js +10 -10
  123. package/dist/tests/sync.concurrentLoad.test.js +12 -12
  124. package/dist/tests/sync.deleted.test.js +8 -8
  125. package/dist/tests/sync.garbageCollection.test.js +10 -10
  126. package/dist/tests/sync.invite.test.js +12 -12
  127. package/dist/tests/sync.known.test.js +2 -2
  128. package/dist/tests/sync.load.test.js +107 -107
  129. package/dist/tests/sync.mesh.test.js +164 -46
  130. package/dist/tests/sync.mesh.test.js.map +1 -1
  131. package/dist/tests/sync.multipleServers.test.js +43 -43
  132. package/dist/tests/sync.peerReconciliation.test.js +29 -29
  133. package/dist/tests/sync.sharding.test.js +3 -3
  134. package/dist/tests/sync.storage.test.js +104 -104
  135. package/dist/tests/sync.storage.test.js.map +1 -1
  136. package/dist/tests/sync.storageAsync.test.js +56 -56
  137. package/dist/tests/sync.upload.test.js +22 -22
  138. package/dist/tests/testStorage.d.ts +2 -0
  139. package/dist/tests/testStorage.d.ts.map +1 -1
  140. package/dist/tests/testStorage.js +30 -6
  141. package/dist/tests/testStorage.js.map +1 -1
  142. package/dist/typeUtils/isCoValue.js +1 -1
  143. package/dist/typeUtils/isCoValue.js.map +1 -1
  144. package/package.json +4 -4
  145. package/src/SyncStateManager.ts +0 -2
  146. package/src/base64url.test.ts +89 -1
  147. package/src/base64url.ts +134 -6
  148. package/src/coValue.ts +2 -1
  149. package/src/coValueCore/coValueCore.ts +126 -84
  150. package/src/coValueCore/verifiedState.ts +335 -53
  151. package/src/coValues/binaryCoStream.ts +217 -0
  152. package/src/coValues/coList.ts +21 -8
  153. package/src/coValues/coMap.ts +3 -0
  154. package/src/coValues/coStream.ts +0 -170
  155. package/src/coValues/group.ts +270 -21
  156. package/src/coreToCoValue.ts +2 -1
  157. package/src/crypto/NapiCrypto.ts +198 -95
  158. package/src/crypto/RNCrypto.ts +229 -102
  159. package/src/crypto/WasmCrypto.ts +201 -95
  160. package/src/crypto/crypto.ts +118 -45
  161. package/src/exports.ts +11 -5
  162. package/src/localNode.ts +17 -1
  163. package/src/media.ts +1 -1
  164. package/src/permissions.ts +30 -7
  165. package/src/storage/sqliteAsync/client.ts +136 -115
  166. package/src/storage/sqliteAsync/types.ts +3 -1
  167. package/src/storage/types.ts +4 -0
  168. package/src/sync.ts +10 -1
  169. package/src/tests/CojsonMessageChannel.test.ts +2 -2
  170. package/src/tests/SQLiteClientAsync.test.ts +75 -0
  171. package/src/tests/StorageApiAsync.test.ts +4 -9
  172. package/src/tests/SyncStateManager.test.ts +2 -2
  173. package/src/tests/WasmCrypto.test.ts +1 -25
  174. package/src/tests/coList.test.ts +39 -5
  175. package/src/tests/coStream.test.ts +4 -5
  176. package/src/tests/coValueCore.initTransaction.test.ts +836 -0
  177. package/src/tests/coValueCore.test.ts +11 -22
  178. package/src/tests/crypto.test.ts +107 -0
  179. package/src/tests/deleteCoValue.test.ts +5 -5
  180. package/src/tests/group.inheritance.test.ts +16 -0
  181. package/src/tests/group.test.ts +29 -1
  182. package/src/tests/groupSealer.test.ts +1473 -0
  183. package/src/tests/setup.ts +6 -0
  184. package/src/tests/sync.auth.test.ts +10 -10
  185. package/src/tests/sync.concurrentLoad.test.ts +12 -12
  186. package/src/tests/sync.deleted.test.ts +8 -8
  187. package/src/tests/sync.garbageCollection.test.ts +10 -10
  188. package/src/tests/sync.invite.test.ts +12 -12
  189. package/src/tests/sync.known.test.ts +2 -2
  190. package/src/tests/sync.load.test.ts +107 -107
  191. package/src/tests/sync.mesh.test.ts +189 -46
  192. package/src/tests/sync.multipleServers.test.ts +43 -43
  193. package/src/tests/sync.peerReconciliation.test.ts +29 -29
  194. package/src/tests/sync.sharding.test.ts +3 -3
  195. package/src/tests/sync.storage.test.ts +104 -104
  196. package/src/tests/sync.storageAsync.test.ts +56 -56
  197. package/src/tests/sync.upload.test.ts +22 -22
  198. package/src/tests/testStorage.ts +39 -9
  199. package/src/typeUtils/isCoValue.ts +1 -1
  200. package/dist/coValueCore/SessionMap.d.ts +0 -55
  201. package/dist/coValueCore/SessionMap.d.ts.map +0 -1
  202. package/dist/coValueCore/SessionMap.js +0 -206
  203. package/dist/coValueCore/SessionMap.js.map +0 -1
  204. package/dist/tests/coreWasm.test.d.ts +0 -2
  205. package/dist/tests/coreWasm.test.d.ts.map +0 -1
  206. package/dist/tests/coreWasm.test.js +0 -203
  207. package/dist/tests/coreWasm.test.js.map +0 -1
  208. package/src/coValueCore/SessionMap.ts +0 -394
  209. package/src/tests/coreWasm.test.ts +0 -452
@@ -0,0 +1,438 @@
1
+ import { beforeEach, describe, expect, test, vi } from "vitest";
2
+ import { createTwoConnectedNodes, importContentIntoNode, loadCoValueOrFail, setupTestNode, waitFor, } from "./testUtils.js";
3
+ beforeEach(() => {
4
+ setupTestNode({ isSyncServer: true });
5
+ });
6
+ describe("init transaction meta", () => {
7
+ test("a transaction with init meta is parsed correctly", () => {
8
+ const client = setupTestNode();
9
+ const group = client.node.createGroup();
10
+ const map = group.createMap();
11
+ map.core.makeTransaction([{ op: "set", key: "hello", value: "world" }], "trusting", { fww: "init" });
12
+ const transactions = map.core.getValidSortedTransactions();
13
+ expect(transactions).toHaveLength(1);
14
+ expect(transactions[0]?.meta).toEqual({ fww: "init" });
15
+ });
16
+ test("first-init-wins: only the first init transaction is valid", () => {
17
+ const client = setupTestNode();
18
+ const group = client.node.createGroup();
19
+ const map = group.createMap();
20
+ // Make two init transactions with different timestamps
21
+ // The first one (earlier madeAt) should win
22
+ const earlierTime = Date.now();
23
+ map.core.makeTransaction([{ op: "set", key: "version", value: "first" }], "trusting", { fww: "init" }, earlierTime);
24
+ const laterTime = earlierTime + 100;
25
+ map.core.makeTransaction([{ op: "set", key: "version", value: "second" }], "trusting", { fww: "init" }, laterTime);
26
+ const validTransactions = map.core.getValidSortedTransactions();
27
+ // Only the first init transaction should be valid
28
+ expect(validTransactions).toHaveLength(1);
29
+ expect(validTransactions[0]?.meta).toEqual({ fww: "init" });
30
+ // The first transaction (earlier madeAt) should be the valid one
31
+ expect(validTransactions[0]?.madeAt).toBe(earlierTime);
32
+ });
33
+ test("first-init-wins: transactions without init meta are not affected", () => {
34
+ const client = setupTestNode();
35
+ const group = client.node.createGroup();
36
+ const map = group.createMap();
37
+ // Make an init transaction
38
+ map.core.makeTransaction([{ op: "set", key: "version", value: "init" }], "trusting", { fww: "init" });
39
+ // Make a regular transaction (no init meta)
40
+ map.core.makeTransaction([{ op: "set", key: "hello", value: "world" }], "trusting");
41
+ const validTransactions = map.core.getValidSortedTransactions();
42
+ // Both transactions should be valid
43
+ expect(validTransactions).toHaveLength(2);
44
+ });
45
+ test("late-arriving winner triggers content rebuild", async () => {
46
+ const client = setupTestNode({ connected: true });
47
+ const clientSession2 = client.spawnNewSession();
48
+ const group = client.node.createGroup();
49
+ const map = group.createMap();
50
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
51
+ // Make an init transaction with a later timestamp
52
+ const laterTime = Date.now() + 1000;
53
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
54
+ expect(map.get("version")).toBe("later");
55
+ const rebuildSpy = vi.spyOn(map, "rebuildFromCore");
56
+ // Now make an init transaction with an earlier timestamp (this should win)
57
+ const earlierTime = laterTime - 500;
58
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
59
+ await waitFor(() => {
60
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
61
+ });
62
+ // The content should have been rebuilt
63
+ expect(rebuildSpy).toHaveBeenCalled();
64
+ expect(map.get("version")).toBe("earlier");
65
+ });
66
+ test("two init transactions coming together do not trigger content rebuild", async () => {
67
+ const alice = setupTestNode({ connected: true });
68
+ const aliceSession2 = alice.spawnNewSession();
69
+ const bob = setupTestNode({ connected: false });
70
+ const group = alice.node.createGroup();
71
+ group.addMember("everyone", "writer");
72
+ const map = group.createMap();
73
+ importContentIntoNode(group.core, bob.node);
74
+ importContentIntoNode(map.core, bob.node);
75
+ const mapOnBob = bob.node.getCoValue(map.id);
76
+ const rebuildSpy = vi.spyOn(mapOnBob, "scheduleContentRebuild");
77
+ const mapOnAliceSession2 = await loadCoValueOrFail(aliceSession2.node, map.id);
78
+ // Make an init transaction with a later timestamp
79
+ const laterTime = Date.now() + 1000;
80
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
81
+ expect(map.get("version")).toBe("later");
82
+ // Now make an init transaction with an earlier timestamp (this should win)
83
+ const earlierTime = laterTime - 500;
84
+ mapOnAliceSession2.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
85
+ await waitFor(() => {
86
+ expect(map.core.knownState()).toEqual(mapOnAliceSession2.core.knownState());
87
+ });
88
+ importContentIntoNode(map.core, bob.node);
89
+ // The content should have been rebuilt
90
+ expect(rebuildSpy).not.toHaveBeenCalled();
91
+ expect(mapOnBob.getCurrentContent().toJSON()).toEqual({
92
+ version: "earlier",
93
+ });
94
+ expect(map.get("version")).toBe("earlier");
95
+ });
96
+ test("content reflects the winning init transaction after rebuild", async () => {
97
+ const client = setupTestNode({ connected: true });
98
+ const clientSession2 = client.spawnNewSession();
99
+ const group = client.node.createGroup();
100
+ const map = group.createMap();
101
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
102
+ // Make an init transaction with a later timestamp
103
+ const laterTime = Date.now() + 1000;
104
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
105
+ // Verify initial content
106
+ expect(map.get("version")).toBe("later");
107
+ // Now make an init transaction with an earlier timestamp (this should win)
108
+ const earlierTime = laterTime - 500;
109
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
110
+ await waitFor(() => {
111
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
112
+ });
113
+ // The content should reflect the earlier (winning) init transaction
114
+ expect(map.get("version")).toBe("earlier");
115
+ });
116
+ test("losing init transaction is marked as invalid (different sessions)", async () => {
117
+ const client = setupTestNode({ connected: true });
118
+ const clientSession2 = client.spawnNewSession();
119
+ const group = client.node.createGroup();
120
+ const map = group.createMap();
121
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
122
+ const earlierTime = Date.now();
123
+ map.core.makeTransaction([{ op: "set", key: "version", value: "first" }], "trusting", { fww: "init" }, earlierTime);
124
+ const laterTime = earlierTime + 100;
125
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "version", value: "second" }], "trusting", { fww: "init" }, laterTime);
126
+ await waitFor(() => {
127
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
128
+ });
129
+ // Check the raw verified transactions
130
+ const allTransactions = map.core.verifiedTransactions;
131
+ expect(allTransactions).toHaveLength(2);
132
+ // The first transaction should be valid
133
+ const firstTx = allTransactions.find((tx) => tx.madeAt === earlierTime);
134
+ expect(firstTx?.isValid).toBe(true);
135
+ // The second transaction should be invalid
136
+ const secondTx = allTransactions.find((tx) => tx.madeAt === laterTime);
137
+ expect(secondTx?.isValid).toBe(false);
138
+ expect(secondTx?.validationErrorMessage).toBe(`Transaction is not the first writer for fww key "init"`);
139
+ });
140
+ test("losing init transaction is marked as invalid (same session)", () => {
141
+ const client = setupTestNode();
142
+ const group = client.node.createGroup();
143
+ const map = group.createMap();
144
+ const earlierTime = Date.now();
145
+ map.core.makeTransaction([{ op: "set", key: "version", value: "first" }], "trusting", { fww: "init" }, earlierTime);
146
+ const laterTime = earlierTime + 100;
147
+ map.core.makeTransaction([{ op: "set", key: "version", value: "second" }], "trusting", { fww: "init" }, laterTime);
148
+ // Check the raw verified transactions
149
+ const allTransactions = map.core.verifiedTransactions;
150
+ expect(allTransactions).toHaveLength(2);
151
+ // The first transaction should be valid
152
+ const firstTx = allTransactions.find((tx) => tx.madeAt === earlierTime);
153
+ expect(firstTx?.isValid).toBe(true);
154
+ // The second transaction should be invalid
155
+ const secondTx = allTransactions.find((tx) => tx.madeAt === laterTime);
156
+ expect(secondTx?.isValid).toBe(false);
157
+ expect(secondTx?.validationErrorMessage).toBe(`Transaction is not the first writer for fww key "init"`);
158
+ });
159
+ test("validity change on processed transaction dispatches rebuild", async () => {
160
+ const client = setupTestNode({ connected: true });
161
+ const clientSession2 = client.spawnNewSession();
162
+ const group = client.node.createGroup();
163
+ const map = group.createMap();
164
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
165
+ // Make an init transaction and process it
166
+ const laterTime = Date.now() + 1000;
167
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
168
+ // Check the transaction is marked as processed
169
+ const laterTx = map.core.verifiedTransactions.find((tx) => tx.madeAt === laterTime);
170
+ expect(laterTx?.stage).toBe("processed");
171
+ expect(laterTx?.isValid).toBe(true);
172
+ // Add a new init transaction with an earlier timestamp
173
+ const earlierTime = laterTime - 500;
174
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
175
+ await waitFor(() => {
176
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
177
+ });
178
+ // The later transaction should now be invalid
179
+ expect(laterTx?.isValid).toBe(false);
180
+ });
181
+ test("synced init transactions resolve correctly across nodes", async () => {
182
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
183
+ const group = node1.node.createGroup();
184
+ group.addMember("everyone", "writer");
185
+ const map = group.createMap();
186
+ // Make an init transaction on node1
187
+ map.core.makeTransaction([{ op: "set", key: "version", value: "node1" }], "trusting", { fww: "init" });
188
+ await map.core.waitForSync();
189
+ // Load the map on node2
190
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
191
+ await waitFor(() => {
192
+ expect(mapOnNode2.get("version")).toBe("node1");
193
+ });
194
+ // Both nodes should have the same valid transaction
195
+ const node1ValidTxs = map.core.getValidSortedTransactions();
196
+ const node2ValidTxs = mapOnNode2.core.getValidSortedTransactions();
197
+ expect(node1ValidTxs).toHaveLength(1);
198
+ expect(node2ValidTxs).toHaveLength(1);
199
+ expect(node1ValidTxs[0]?.madeAt).toBe(node2ValidTxs[0]?.madeAt);
200
+ });
201
+ test("concurrent init transactions from different nodes resolve deterministically", async () => {
202
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
203
+ const group = node1.node.createGroup();
204
+ group.addMember("everyone", "writer");
205
+ const map = group.createMap();
206
+ await map.core.waitForSync();
207
+ // Load the map on node2
208
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
209
+ // Make init transactions on both nodes with different timestamps
210
+ const node1Time = Date.now();
211
+ const node2Time = node1Time + 1000; // node2 is later
212
+ map.core.makeTransaction([{ op: "set", key: "version", value: "node1" }], "trusting", { fww: "init" }, node1Time);
213
+ mapOnNode2.core.makeTransaction([{ op: "set", key: "version", value: "node2" }], "trusting", { fww: "init" }, node2Time);
214
+ // Wait for sync
215
+ await map.core.waitForSync();
216
+ await mapOnNode2.core.waitForSync();
217
+ // Wait for microtasks
218
+ await new Promise((resolve) => queueMicrotask(resolve));
219
+ // Both nodes should converge to the same winner (node1 with earlier timestamp)
220
+ await waitFor(() => {
221
+ expect(map.get("version")).toBe("node1");
222
+ expect(mapOnNode2.get("version")).toBe("node1");
223
+ });
224
+ });
225
+ test("subscription is notified when init transaction changes the content", async () => {
226
+ const client = setupTestNode();
227
+ const group = client.node.createGroup();
228
+ const map = group.createMap();
229
+ // Make an init transaction with a later timestamp
230
+ const laterTime = Date.now() + 1000;
231
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
232
+ // Subscribe to changes
233
+ const subscriptionSpy = vi.fn();
234
+ const unsubscribe = map.subscribe(subscriptionSpy);
235
+ subscriptionSpy.mockClear();
236
+ // Add a new init transaction with an earlier timestamp
237
+ const earlierTime = laterTime - 500;
238
+ map.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
239
+ // Wait for notifications
240
+ await waitFor(() => {
241
+ expect(subscriptionSpy).toHaveBeenCalled();
242
+ });
243
+ unsubscribe();
244
+ });
245
+ test("getValidTransactions returns discarded init transactions when includeInvalidMetaTransactions is true", async () => {
246
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
247
+ const group = node1.node.createGroup();
248
+ group.addMember("everyone", "writer");
249
+ const map = group.createMap();
250
+ const earlierTime = Date.now();
251
+ const laterTime = earlierTime + 1000;
252
+ map.core.makeTransaction([{ op: "set", key: "version", value: "later" }], "trusting", { fww: "init" }, laterTime);
253
+ await map.core.waitForSync();
254
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
255
+ await waitFor(() => {
256
+ expect(mapOnNode2.get("version")).toBe("later");
257
+ });
258
+ mapOnNode2.core.makeTransaction([{ op: "set", key: "version", value: "earlier" }], "trusting", { fww: "init" }, earlierTime);
259
+ await waitFor(() => {
260
+ expect(map.core.knownState()).toEqual(mapOnNode2.core.knownState());
261
+ });
262
+ // Without flag: only valid transactions
263
+ const validOnly = map.core.getValidSortedTransactions();
264
+ expect(validOnly).toHaveLength(1);
265
+ expect(validOnly[0]?.madeAt).toBe(earlierTime);
266
+ // With flag: includes invalid init transactions
267
+ const withInvalid = map.core.getValidSortedTransactions({
268
+ includeInvalidMetaTransactions: true,
269
+ ignorePrivateTransactions: false,
270
+ });
271
+ expect(withInvalid).toHaveLength(2);
272
+ expect(withInvalid.filter((tx) => tx.isValid)).toHaveLength(1);
273
+ expect(withInvalid.filter((tx) => !tx.isValid)).toHaveLength(1);
274
+ });
275
+ test("getValidTransactions({includeInvalidMetaTransactions: true}) does not return permission-invalid transactions", async () => {
276
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
277
+ const group = node1.node.createGroup();
278
+ const map = group.createMap();
279
+ group.addMember(node2.node.getCurrentAgent(), "reader");
280
+ map.set("key", "admin-value", "trusting");
281
+ await map.core.waitForSync();
282
+ const mapOnReader = await loadCoValueOrFail(node2.node, map.id);
283
+ await waitFor(() => {
284
+ expect(mapOnReader.get("key")).toBe("admin-value");
285
+ });
286
+ mapOnReader.set("key", "reader-value", "trusting");
287
+ // Permission-invalid transactions are never included
288
+ const allTx = mapOnReader.core.getValidSortedTransactions({
289
+ includeInvalidMetaTransactions: true,
290
+ ignorePrivateTransactions: false,
291
+ });
292
+ expect(allTx).toHaveLength(1);
293
+ expect(mapOnReader.get("key")).toBe("admin-value");
294
+ });
295
+ test("different FWW keys are independent", () => {
296
+ const client = setupTestNode();
297
+ const group = client.node.createGroup();
298
+ const map = group.createMap();
299
+ // Make two FWW transactions with different keys
300
+ map.core.makeTransaction([{ op: "set", key: "keyA", value: "valueA" }], "trusting", { fww: "keyA" });
301
+ map.core.makeTransaction([{ op: "set", key: "keyB", value: "valueB" }], "trusting", { fww: "keyB" });
302
+ const validTransactions = map.core.getValidSortedTransactions();
303
+ // Both transactions should be valid since they have different FWW keys
304
+ expect(validTransactions).toHaveLength(2);
305
+ expect(validTransactions[0]?.meta).toEqual({ fww: "keyA" });
306
+ expect(validTransactions[1]?.meta).toEqual({ fww: "keyB" });
307
+ });
308
+ test("FWW at non-zero txIndex is valid", () => {
309
+ const client = setupTestNode();
310
+ const group = client.node.createGroup();
311
+ const map = group.createMap();
312
+ // Make a regular transaction first (no FWW meta)
313
+ map.core.makeTransaction([{ op: "set", key: "setup", value: "regular" }], "trusting");
314
+ // Make an FWW transaction at txIndex > 0
315
+ map.core.makeTransaction([{ op: "set", key: "version", value: "init" }], "trusting", { fww: "init" });
316
+ const validTransactions = map.core.getValidSortedTransactions();
317
+ // Both transactions should be valid
318
+ expect(validTransactions).toHaveLength(2);
319
+ // The FWW transaction should be valid even though it's not at txIndex 0
320
+ const fwwTx = validTransactions.find((tx) => tx.meta?.fww === "init");
321
+ expect(fwwTx).toBeDefined();
322
+ expect(fwwTx?.isValid).toBe(true);
323
+ });
324
+ test("multiple FWW keys with different winners", async () => {
325
+ const client = setupTestNode({ connected: true });
326
+ const clientSession2 = client.spawnNewSession();
327
+ const group = client.node.createGroup();
328
+ const map = group.createMap();
329
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
330
+ const earlierTime = Date.now();
331
+ const laterTime = earlierTime + 100;
332
+ // Session 1: Make FWW transaction for "keyA" with earlier time
333
+ map.core.makeTransaction([{ op: "set", key: "keyA", value: "session1" }], "trusting", { fww: "keyA" }, earlierTime);
334
+ // Session 1: Make FWW transaction for "keyB" with later time
335
+ map.core.makeTransaction([{ op: "set", key: "keyB", value: "session1" }], "trusting", { fww: "keyB" }, laterTime);
336
+ // Session 2: Make FWW transaction for "keyA" with later time
337
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "keyA", value: "session2" }], "trusting", { fww: "keyA" }, laterTime);
338
+ // Session 2: Make FWW transaction for "keyB" with earlier time
339
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "keyB", value: "session2" }], "trusting", { fww: "keyB" }, earlierTime);
340
+ await waitFor(() => {
341
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
342
+ });
343
+ // Each key should independently pick its winner
344
+ // keyA: session1 wins (earlier time)
345
+ // keyB: session2 wins (earlier time)
346
+ const validTransactions = map.core.getValidSortedTransactions();
347
+ expect(validTransactions).toHaveLength(2);
348
+ const keyAWinner = validTransactions.find((tx) => tx.meta?.fww === "keyA");
349
+ const keyBWinner = validTransactions.find((tx) => tx.meta?.fww === "keyB");
350
+ expect(keyAWinner).toBeDefined();
351
+ expect(keyBWinner).toBeDefined();
352
+ // Verify the correct values are in the map
353
+ expect(map.get("keyA")).toBe("session1");
354
+ expect(map.get("keyB")).toBe("session2");
355
+ });
356
+ test("multiple FWW keys resolve independently across synced nodes", async () => {
357
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
358
+ const group = node1.node.createGroup();
359
+ group.addMember("everyone", "writer");
360
+ const map = group.createMap();
361
+ await map.core.waitForSync();
362
+ // Load the map on node2
363
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
364
+ const earlierTime = Date.now();
365
+ const laterTime = earlierTime + 1000;
366
+ // On node1: create FWW transaction for "keyA" with earlier time, "keyB" with later time
367
+ map.core.makeTransaction([{ op: "set", key: "keyA", value: "node1" }], "trusting", { fww: "keyA" }, earlierTime);
368
+ map.core.makeTransaction([{ op: "set", key: "keyB", value: "node1" }], "trusting", { fww: "keyB" }, laterTime);
369
+ // On node2: create FWW transaction for "keyA" with later time, "keyB" with earlier time
370
+ mapOnNode2.core.makeTransaction([{ op: "set", key: "keyA", value: "node2" }], "trusting", { fww: "keyA" }, laterTime);
371
+ mapOnNode2.core.makeTransaction([{ op: "set", key: "keyB", value: "node2" }], "trusting", { fww: "keyB" }, earlierTime);
372
+ // Wait for sync
373
+ await map.core.waitForSync();
374
+ await mapOnNode2.core.waitForSync();
375
+ // Wait for microtasks
376
+ await new Promise((resolve) => queueMicrotask(resolve));
377
+ // Both nodes should converge to the same state
378
+ // keyA: node1 wins (earlier timestamp)
379
+ // keyB: node2 wins (earlier timestamp)
380
+ await waitFor(() => {
381
+ expect(map.get("keyA")).toBe("node1");
382
+ expect(map.get("keyB")).toBe("node2");
383
+ expect(mapOnNode2.get("keyA")).toBe("node1");
384
+ expect(mapOnNode2.get("keyB")).toBe("node2");
385
+ });
386
+ // Verify both nodes have exactly 2 valid transactions (one per key)
387
+ const node1ValidTxs = map.core.getValidSortedTransactions();
388
+ const node2ValidTxs = mapOnNode2.core.getValidSortedTransactions();
389
+ expect(node1ValidTxs).toHaveLength(2);
390
+ expect(node2ValidTxs).toHaveLength(2);
391
+ });
392
+ test("late-arriving winner for one key does not affect other keys", async () => {
393
+ const client = setupTestNode({ connected: true });
394
+ const clientSession2 = client.spawnNewSession();
395
+ const group = client.node.createGroup();
396
+ const map = group.createMap();
397
+ const mapOnClientSession2 = await loadCoValueOrFail(clientSession2.node, map.id);
398
+ const earlierTime = Date.now();
399
+ const laterTime = earlierTime + 1000;
400
+ // Session 1: Create FWW transaction for "keyA" with later time
401
+ map.core.makeTransaction([{ op: "set", key: "keyA", value: "session1" }], "trusting", { fww: "keyA" }, laterTime);
402
+ // Session 1: Create FWW transaction for "keyB" (any time)
403
+ map.core.makeTransaction([{ op: "set", key: "keyB", value: "session1" }], "trusting", { fww: "keyB" }, earlierTime);
404
+ // Verify initial state
405
+ expect(map.get("keyA")).toBe("session1");
406
+ expect(map.get("keyB")).toBe("session1");
407
+ // Session 2: Create FWW transaction for "keyA" with earlier time (this should win)
408
+ mapOnClientSession2.core.makeTransaction([{ op: "set", key: "keyA", value: "session2" }], "trusting", { fww: "keyA" }, earlierTime);
409
+ await waitFor(() => {
410
+ expect(map.core.knownState()).toEqual(mapOnClientSession2.core.knownState());
411
+ });
412
+ // After sync:
413
+ // keyA: session2's transaction wins (earlier timestamp), session1's is invalidated
414
+ // keyB: session1's transaction remains valid (unaffected)
415
+ expect(map.get("keyA")).toBe("session2");
416
+ expect(map.get("keyB")).toBe("session1");
417
+ // Check that both keys have exactly one valid transaction each
418
+ const allTransactions = map.core.getValidSortedTransactions({
419
+ includeInvalidMetaTransactions: true,
420
+ ignorePrivateTransactions: false,
421
+ });
422
+ // Should have 3 total transactions: 2 for keyA (one invalid), 1 for keyB (valid)
423
+ expect(allTransactions).toHaveLength(3);
424
+ // keyA transactions
425
+ const keyATransactions = allTransactions.filter((tx) => tx.meta?.fww === "keyA");
426
+ expect(keyATransactions).toHaveLength(2);
427
+ expect(keyATransactions.filter((tx) => tx.isValid)).toHaveLength(1);
428
+ expect(keyATransactions.filter((tx) => !tx.isValid)).toHaveLength(1);
429
+ // The winning keyA transaction should be from session2 (earlier time)
430
+ const validKeyA = keyATransactions.find((tx) => tx.isValid);
431
+ expect(validKeyA?.madeAt).toBe(earlierTime);
432
+ // keyB transaction should be valid (unaffected by keyA's late-arriving winner)
433
+ const keyBTransactions = allTransactions.filter((tx) => tx.meta?.fww === "keyB");
434
+ expect(keyBTransactions).toHaveLength(1);
435
+ expect(keyBTransactions[0]?.isValid).toBe(true);
436
+ });
437
+ });
438
+ //# sourceMappingURL=coValueCore.initTransaction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coValueCore.initTransaction.test.js","sourceRoot":"","sources":["../../src/tests/coValueCore.initTransaction.test.ts"],"names":[],"mappings":"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"}
@@ -248,7 +248,8 @@ test("(smoke test) records transactions from local node", async () => {
248
248
  source: "local",
249
249
  });
250
250
  assert(typeof value !== "number" && !!value?.count);
251
- expect(value.count).toBe(3);
251
+ // Creating a group now creates 4 transactions: admin member, key revelation, readKey, and groupSealer
252
+ expect(value.count).toBe(4);
252
253
  });
253
254
  test("creating a coValue with a group should't trigger automatically a content creation (performance)", () => {
254
255
  const node = createTestNode();
@@ -584,33 +585,24 @@ describe("markErrored and isErroredInPeer", () => {
584
585
  expect(notificationCount).toBeGreaterThan(0);
585
586
  });
586
587
  });
587
- test("knownState should return the same object until the CoValue is modified", () => {
588
+ test("knownState should reflect modifications", () => {
588
589
  const [agent, sessionID] = randomAgentAndSessionID();
589
590
  const node = new LocalNode(agent.agentSecret, sessionID, Crypto);
590
591
  const group = node.createGroup();
591
592
  const map = group.createMap();
592
- // Get the knownState for the first time
593
+ // Get the knownState before any modification
593
594
  const knownState1 = map.core.knownState();
594
- // Get the knownState again - should be the same object
595
- const knownState2 = map.core.knownState();
596
- expect(knownState2).toBe(knownState1);
597
- // Call it multiple times to ensure it's always the same object
598
- const knownState3 = map.core.knownState();
599
- expect(knownState3).toBe(knownState1);
600
595
  // Now modify the CoValue by making a transaction
601
596
  map.set("hello", "world");
602
- // Get the knownState after modification - should be a different object
603
- const knownState4 = map.core.knownState();
604
- expect(knownState4).not.toBe(knownState1);
605
- // Verify that subsequent calls still return the same (new) object
606
- const knownState5 = map.core.knownState();
607
- expect(knownState5).toBe(knownState4);
597
+ // Get the knownState after modification - should have updated sessions
598
+ const knownState2 = map.core.knownState();
599
+ expect(knownState2).not.toEqual(knownState1);
608
600
  // Make another modification
609
601
  map.set("foo", "bar");
610
- // Get the knownState after second modification - should be yet another different object
611
- const knownState6 = map.core.knownState();
612
- expect(knownState6).not.toBe(knownState4);
613
- expect(knownState6).not.toBe(knownState1);
602
+ // Get the knownState after second modification - should have updated sessions again
603
+ const knownState3 = map.core.knownState();
604
+ expect(knownState3).not.toEqual(knownState2);
605
+ expect(knownState3).not.toEqual(knownState1);
614
606
  });
615
607
  describe("provideHeader uniqueness validation", () => {
616
608
  test("should reject number uniqueness", () => {