cojson 0.18.6 → 0.18.8

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 (86) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +18 -0
  3. package/dist/coValueContentMessage.d.ts +2 -0
  4. package/dist/coValueContentMessage.d.ts.map +1 -1
  5. package/dist/coValueContentMessage.js +7 -0
  6. package/dist/coValueContentMessage.js.map +1 -1
  7. package/dist/coValueCore/SessionMap.d.ts +2 -2
  8. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  9. package/dist/coValueCore/SessionMap.js +2 -4
  10. package/dist/coValueCore/SessionMap.js.map +1 -1
  11. package/dist/coValueCore/branching.d.ts +31 -9
  12. package/dist/coValueCore/branching.d.ts.map +1 -1
  13. package/dist/coValueCore/branching.js +50 -100
  14. package/dist/coValueCore/branching.js.map +1 -1
  15. package/dist/coValueCore/coValueCore.d.ts +12 -8
  16. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  17. package/dist/coValueCore/coValueCore.js +93 -23
  18. package/dist/coValueCore/coValueCore.js.map +1 -1
  19. package/dist/coValueCore/verifiedState.d.ts +4 -2
  20. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  21. package/dist/coValueCore/verifiedState.js +6 -4
  22. package/dist/coValueCore/verifiedState.js.map +1 -1
  23. package/dist/coValues/coList.d.ts.map +1 -1
  24. package/dist/coValues/coList.js +10 -1
  25. package/dist/coValues/coList.js.map +1 -1
  26. package/dist/coValues/coMap.d.ts +2 -2
  27. package/dist/coValues/coMap.d.ts.map +1 -1
  28. package/dist/coValues/coMap.js +8 -8
  29. package/dist/coValues/coMap.js.map +1 -1
  30. package/dist/coValues/group.d.ts.map +1 -1
  31. package/dist/coValues/group.js +14 -1
  32. package/dist/coValues/group.js.map +1 -1
  33. package/dist/config.d.ts +6 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +8 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/crypto/PureJSCrypto.d.ts.map +1 -1
  38. package/dist/crypto/PureJSCrypto.js +14 -6
  39. package/dist/crypto/PureJSCrypto.js.map +1 -1
  40. package/dist/exports.d.ts +3 -2
  41. package/dist/exports.d.ts.map +1 -1
  42. package/dist/exports.js +2 -2
  43. package/dist/exports.js.map +1 -1
  44. package/dist/localNode.d.ts +1 -0
  45. package/dist/localNode.d.ts.map +1 -1
  46. package/dist/localNode.js +10 -2
  47. package/dist/localNode.js.map +1 -1
  48. package/dist/storage/storageAsync.d.ts.map +1 -1
  49. package/dist/storage/storageAsync.js.map +1 -1
  50. package/dist/sync.d.ts +3 -3
  51. package/dist/sync.d.ts.map +1 -1
  52. package/dist/sync.js +29 -19
  53. package/dist/sync.js.map +1 -1
  54. package/dist/tests/branching.test.js +107 -9
  55. package/dist/tests/branching.test.js.map +1 -1
  56. package/dist/tests/coValueCore.test.js +45 -1
  57. package/dist/tests/coValueCore.test.js.map +1 -1
  58. package/dist/tests/sync.content.test.d.ts +2 -0
  59. package/dist/tests/sync.content.test.d.ts.map +1 -0
  60. package/dist/tests/sync.content.test.js +120 -0
  61. package/dist/tests/sync.content.test.js.map +1 -0
  62. package/dist/tests/sync.load.test.js +15 -2
  63. package/dist/tests/sync.load.test.js.map +1 -1
  64. package/dist/tests/sync.storage.test.js +1 -1
  65. package/dist/tests/sync.upload.test.js +2 -2
  66. package/package.json +2 -2
  67. package/src/coValueContentMessage.ts +13 -0
  68. package/src/coValueCore/SessionMap.ts +2 -2
  69. package/src/coValueCore/branching.ts +94 -149
  70. package/src/coValueCore/coValueCore.ts +121 -27
  71. package/src/coValueCore/verifiedState.ts +8 -0
  72. package/src/coValues/coList.ts +12 -1
  73. package/src/coValues/coMap.ts +10 -12
  74. package/src/coValues/group.ts +14 -1
  75. package/src/config.ts +9 -0
  76. package/src/crypto/PureJSCrypto.ts +25 -13
  77. package/src/exports.ts +7 -1
  78. package/src/localNode.ts +12 -2
  79. package/src/storage/storageAsync.ts +0 -1
  80. package/src/sync.ts +37 -33
  81. package/src/tests/branching.test.ts +158 -9
  82. package/src/tests/coValueCore.test.ts +62 -2
  83. package/src/tests/sync.content.test.ts +153 -0
  84. package/src/tests/sync.load.test.ts +19 -2
  85. package/src/tests/sync.storage.test.ts +1 -1
  86. package/src/tests/sync.upload.test.ts +2 -2
@@ -0,0 +1,153 @@
1
+ import { beforeEach, describe, expect, test } from "vitest";
2
+
3
+ import { SyncMessagesLog, TEST_NODE_CONFIG, setupTestNode } from "./testUtils";
4
+
5
+ // We want to simulate a real world communication that happens asynchronously
6
+ TEST_NODE_CONFIG.withAsyncPeers = true;
7
+
8
+ describe("handling content messages", () => {
9
+ beforeEach(async () => {
10
+ SyncMessagesLog.clear();
11
+ });
12
+
13
+ test("dependencies are included when syncing new content to clients", async () => {
14
+ /*
15
+ * Initial Setup:
16
+ * core <-- edge <-- client1
17
+ */
18
+ const core = setupTestNode();
19
+
20
+ const edge = setupTestNode();
21
+ edge.connectToSyncServer({
22
+ ourName: "edge",
23
+ syncServerName: "core",
24
+ syncServer: core.node,
25
+ });
26
+
27
+ const client1 = setupTestNode();
28
+ client1.connectToSyncServer({
29
+ ourName: "client1",
30
+ syncServerName: "edge",
31
+ syncServer: edge.node,
32
+ });
33
+
34
+ // Create a map with a dependency on the client.
35
+ // Everythig will sync all the way back to core.
36
+ const group = client1.node.createGroup();
37
+ const map = group.createMap();
38
+ map.set("hello", "world", "trusting");
39
+ await map.core.waitForSync();
40
+
41
+ /*
42
+ * Add another client:
43
+ *
44
+ * |-- client1
45
+ * core <-- edge <--|
46
+ * |-- client2
47
+ *
48
+ */
49
+ const client2 = setupTestNode();
50
+ const { peerStateOnServer: client2PeerStateOnEdge } =
51
+ client2.connectToSyncServer({
52
+ ourName: "client2",
53
+ syncServerName: "edge",
54
+ syncServer: edge.node,
55
+ });
56
+
57
+ client2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
58
+ id: map.core.id,
59
+ header: false,
60
+ sessions: {},
61
+ });
62
+
63
+ // Update the map on client1.
64
+ // This should sync the map AND its dependencies to the new client.
65
+ map.set("hello2", "world2", "trusting");
66
+ await map.core.waitForSync();
67
+
68
+ const syncMessages = SyncMessagesLog.getMessages({
69
+ Group: group.core,
70
+ Map: map.core,
71
+ });
72
+ expect(
73
+ syncMessages.some((msg) =>
74
+ msg.startsWith("edge -> client2 | CONTENT Map"),
75
+ ),
76
+ ).toBe(true);
77
+ expect(
78
+ syncMessages.some((msg) =>
79
+ msg.startsWith("edge -> client2 | CONTENT Group"),
80
+ ),
81
+ ).toBe(true);
82
+ });
83
+
84
+ test("dependencies are excluded when syncing new content to servers", async () => {
85
+ /*
86
+ * Initial Setup:
87
+ * core1 <-- edge <-- client
88
+ */
89
+ const core1 = setupTestNode();
90
+
91
+ const edge = setupTestNode();
92
+ edge.connectToSyncServer({
93
+ ourName: "edge",
94
+ syncServerName: "core1",
95
+ syncServer: core1.node,
96
+ });
97
+
98
+ const client = setupTestNode();
99
+ client.connectToSyncServer({
100
+ ourName: "client",
101
+ syncServerName: "edge",
102
+ syncServer: edge.node,
103
+ });
104
+
105
+ // Create a map with a dependency on the client.
106
+ // Everythig will sync all the way back to core1.
107
+ const group = client.node.createGroup();
108
+ const map = group.createMap();
109
+ map.set("hello", "world", "trusting");
110
+ await map.core.waitForSync();
111
+
112
+ /*
113
+ * Add another core:
114
+ *
115
+ * core1 <--
116
+ * |
117
+ * |-- edge <-- client
118
+ * |
119
+ * core2 <--
120
+ */
121
+ const core2 = setupTestNode();
122
+ const { peerState: core2PeerStateOnEdge } = edge.connectToSyncServer({
123
+ ourName: "edge",
124
+ syncServerName: "core2",
125
+ syncServer: core2.node,
126
+ skipReconciliation: true,
127
+ });
128
+
129
+ core2PeerStateOnEdge.setOptimisticKnownState(map.core.id, {
130
+ id: map.core.id,
131
+ header: false,
132
+ sessions: {},
133
+ });
134
+
135
+ // Update the map on the client.
136
+ // This should sync ONLY the map back to both cores.
137
+ map.set("hello2", "world2", "trusting");
138
+ await map.core.waitForSync();
139
+
140
+ const syncMessages = SyncMessagesLog.getMessages({
141
+ Group: group.core,
142
+ Map: map.core,
143
+ });
144
+ expect(
145
+ syncMessages.some((msg) => msg.startsWith("edge -> core2 | CONTENT Map")),
146
+ ).toBe(true);
147
+ expect(
148
+ syncMessages.some((msg) =>
149
+ msg.startsWith("edge -> core2 | CONTENT Group"),
150
+ ),
151
+ ).toBe(false);
152
+ });
153
+ });
@@ -171,10 +171,10 @@ describe("loading coValues from server", () => {
171
171
  [
172
172
  "client -> server | LOAD Branch sessions: empty",
173
173
  "server -> client | CONTENT Group header: true new: After: 0 New: 5",
174
- "server -> client | CONTENT Map header: true new: After: 0 New: 2",
174
+ "server -> client | CONTENT Map header: true new: After: 0 New: 3",
175
175
  "server -> client | CONTENT Branch header: true new: After: 0 New: 2",
176
176
  "client -> server | KNOWN Group sessions: header/5",
177
- "client -> server | KNOWN Map sessions: header/2",
177
+ "client -> server | KNOWN Map sessions: header/3",
178
178
  "client -> server | KNOWN Branch sessions: header/2",
179
179
  ]
180
180
  `);
@@ -1134,4 +1134,21 @@ describe("loading coValues from server", () => {
1134
1134
  const mapOnServerCore = await syncServer.node.loadCoValueCore(map.core.id);
1135
1135
  expect(mapOnServerCore.isAvailable()).toBe(true);
1136
1136
  });
1137
+
1138
+ test("unknown coValues are ignored if ignoreUnrequestedCoValues is true", async () => {
1139
+ const group = jazzCloud.node.createGroup();
1140
+ const map = group.createMap();
1141
+ map.set("hello", "world", "trusting");
1142
+
1143
+ const { node: shardedCoreNode } = setupTestNode({
1144
+ connected: true,
1145
+ });
1146
+ shardedCoreNode.syncManager.disableTransactionVerification();
1147
+ shardedCoreNode.syncManager.ignoreUnknownCoValuesFromServers();
1148
+
1149
+ await shardedCoreNode.loadCoValueCore(map.id);
1150
+
1151
+ expect(shardedCoreNode.hasCoValue(map.id)).toBe(true);
1152
+ expect(shardedCoreNode.hasCoValue(group.id)).toBe(false);
1153
+ });
1137
1154
  });
@@ -238,7 +238,7 @@ describe("client with storage syncs with server", () => {
238
238
  [
239
239
  "client -> storage | LOAD Branch sessions: empty",
240
240
  "storage -> client | CONTENT Group header: true new: After: 0 New: 3",
241
- "storage -> client | CONTENT Map header: true new: After: 0 New: 2",
241
+ "storage -> client | CONTENT Map header: true new: After: 0 New: 3",
242
242
  "storage -> client | CONTENT Branch header: true new: After: 0 New: 2",
243
243
  ]
244
244
  `);
@@ -92,11 +92,11 @@ describe("client to server upload", () => {
92
92
  "server -> client | CONTENT Map header: true new: After: 0 New: 2",
93
93
  "client -> server | KNOWN Group sessions: header/5",
94
94
  "client -> server | KNOWN Map sessions: header/2",
95
- "client -> server | LOAD Branch sessions: empty",
96
- "server -> client | KNOWN Branch sessions: empty",
97
95
  "client -> server | CONTENT Branch header: true new: After: 0 New: 1",
96
+ "client -> server | CONTENT Map header: false new: After: 0 New: 1",
98
97
  "client -> server | CONTENT Branch header: false new: After: 1 New: 1",
99
98
  "server -> client | KNOWN Branch sessions: header/1",
99
+ "server -> client | KNOWN Map sessions: header/3",
100
100
  "server -> client | KNOWN Branch sessions: header/2",
101
101
  ]
102
102
  `);