cojson 0.10.8 → 0.11.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 (180) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +20 -0
  3. package/dist/CoValuesStore.d.ts +12 -0
  4. package/dist/CoValuesStore.d.ts.map +1 -0
  5. package/dist/PeerKnownStates.d.ts +38 -0
  6. package/dist/PeerKnownStates.d.ts.map +1 -0
  7. package/dist/PeerState.d.ts +46 -0
  8. package/dist/PeerState.d.ts.map +1 -0
  9. package/dist/PriorityBasedMessageQueue.d.ts +18 -0
  10. package/dist/PriorityBasedMessageQueue.d.ts.map +1 -0
  11. package/dist/SyncStateManager.d.ts +20 -0
  12. package/dist/SyncStateManager.d.ts.map +1 -0
  13. package/dist/base64url.d.ts +3 -0
  14. package/dist/base64url.d.ts.map +1 -0
  15. package/dist/base64url.test.d.ts +2 -0
  16. package/dist/base64url.test.d.ts.map +1 -0
  17. package/dist/coValue.d.ts +52 -0
  18. package/dist/coValue.d.ts.map +1 -0
  19. package/dist/coValueCore.d.ts +143 -0
  20. package/dist/coValueCore.d.ts.map +1 -0
  21. package/dist/coValueCore.js +3 -9
  22. package/dist/coValueCore.js.map +1 -1
  23. package/dist/coValueState.d.ts +58 -0
  24. package/dist/coValueState.d.ts.map +1 -0
  25. package/dist/coValues/account.d.ts +69 -0
  26. package/dist/coValues/account.d.ts.map +1 -0
  27. package/dist/coValues/account.js +9 -10
  28. package/dist/coValues/account.js.map +1 -1
  29. package/dist/coValues/coList.d.ts +163 -0
  30. package/dist/coValues/coList.d.ts.map +1 -0
  31. package/dist/coValues/coMap.d.ts +142 -0
  32. package/dist/coValues/coMap.d.ts.map +1 -0
  33. package/dist/coValues/coPlainText.d.ts +33 -0
  34. package/dist/coValues/coPlainText.d.ts.map +1 -0
  35. package/dist/coValues/coStream.d.ts +109 -0
  36. package/dist/coValues/coStream.d.ts.map +1 -0
  37. package/dist/coValues/group.d.ts +143 -0
  38. package/dist/coValues/group.d.ts.map +1 -0
  39. package/dist/coValues/group.js +52 -6
  40. package/dist/coValues/group.js.map +1 -1
  41. package/dist/coreToCoValue.d.ts +15 -0
  42. package/dist/coreToCoValue.d.ts.map +1 -0
  43. package/dist/crypto/PureJSCrypto.d.ts +50 -0
  44. package/dist/crypto/PureJSCrypto.d.ts.map +1 -0
  45. package/dist/crypto/WasmCrypto.d.ts +49 -0
  46. package/dist/crypto/WasmCrypto.d.ts.map +1 -0
  47. package/dist/crypto/crypto.d.ts +142 -0
  48. package/dist/crypto/crypto.d.ts.map +1 -0
  49. package/dist/exports.d.ts +84 -0
  50. package/dist/exports.d.ts.map +1 -0
  51. package/dist/ids.d.ts +23 -0
  52. package/dist/ids.d.ts.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/jsonStringify.d.ts +7 -0
  56. package/dist/jsonStringify.d.ts.map +1 -0
  57. package/dist/jsonValue.d.ts +45 -0
  58. package/dist/jsonValue.d.ts.map +1 -0
  59. package/dist/localNode.d.ts +111 -0
  60. package/dist/localNode.d.ts.map +1 -0
  61. package/dist/localNode.js +3 -5
  62. package/dist/localNode.js.map +1 -1
  63. package/dist/logger.d.ts +33 -0
  64. package/dist/logger.d.ts.map +1 -0
  65. package/dist/media.d.ts +8 -0
  66. package/dist/media.d.ts.map +1 -0
  67. package/dist/permissions.d.ts +24 -0
  68. package/dist/permissions.d.ts.map +1 -0
  69. package/dist/permissions.js +5 -9
  70. package/dist/permissions.js.map +1 -1
  71. package/dist/priority.d.ts +19 -0
  72. package/dist/priority.d.ts.map +1 -0
  73. package/dist/storage/FileSystem.d.ts +37 -0
  74. package/dist/storage/FileSystem.d.ts.map +1 -0
  75. package/dist/storage/chunksAndKnownStates.d.ts +7 -0
  76. package/dist/storage/chunksAndKnownStates.d.ts.map +1 -0
  77. package/dist/storage/index.d.ts +52 -0
  78. package/dist/storage/index.d.ts.map +1 -0
  79. package/dist/streamUtils.d.ts +13 -0
  80. package/dist/streamUtils.d.ts.map +1 -0
  81. package/dist/sync.d.ts +97 -0
  82. package/dist/sync.d.ts.map +1 -0
  83. package/dist/tests/PeerKnownStates.test.d.ts +2 -0
  84. package/dist/tests/PeerKnownStates.test.d.ts.map +1 -0
  85. package/dist/tests/PeerKnownStates.test.js +82 -0
  86. package/dist/tests/PeerKnownStates.test.js.map +1 -0
  87. package/dist/tests/PeerState.test.d.ts +2 -0
  88. package/dist/tests/PeerState.test.d.ts.map +1 -0
  89. package/dist/tests/PeerState.test.js +188 -0
  90. package/dist/tests/PeerState.test.js.map +1 -0
  91. package/dist/tests/PriorityBasedMessageQueue.test.d.ts +2 -0
  92. package/dist/tests/PriorityBasedMessageQueue.test.d.ts.map +1 -0
  93. package/dist/tests/PriorityBasedMessageQueue.test.js +120 -0
  94. package/dist/tests/PriorityBasedMessageQueue.test.js.map +1 -0
  95. package/dist/tests/SyncStateManager.test.d.ts +2 -0
  96. package/dist/tests/SyncStateManager.test.d.ts.map +1 -0
  97. package/dist/tests/SyncStateManager.test.js +127 -0
  98. package/dist/tests/SyncStateManager.test.js.map +1 -0
  99. package/dist/tests/account.test.d.ts +2 -0
  100. package/dist/tests/account.test.d.ts.map +1 -0
  101. package/dist/tests/account.test.js +66 -0
  102. package/dist/tests/account.test.js.map +1 -0
  103. package/dist/tests/coList.test.d.ts +2 -0
  104. package/dist/tests/coList.test.d.ts.map +1 -0
  105. package/dist/tests/coList.test.js +120 -0
  106. package/dist/tests/coList.test.js.map +1 -0
  107. package/dist/tests/coMap.test.d.ts +2 -0
  108. package/dist/tests/coMap.test.d.ts.map +1 -0
  109. package/dist/tests/coMap.test.js +164 -0
  110. package/dist/tests/coMap.test.js.map +1 -0
  111. package/dist/tests/coPlainText.test.d.ts +2 -0
  112. package/dist/tests/coPlainText.test.d.ts.map +1 -0
  113. package/dist/tests/coPlainText.test.js +99 -0
  114. package/dist/tests/coPlainText.test.js.map +1 -0
  115. package/dist/tests/coStream.test.d.ts +2 -0
  116. package/dist/tests/coStream.test.d.ts.map +1 -0
  117. package/dist/tests/coStream.test.js +206 -0
  118. package/dist/tests/coStream.test.js.map +1 -0
  119. package/dist/tests/coValueCore.test.d.ts +2 -0
  120. package/dist/tests/coValueCore.test.d.ts.map +1 -0
  121. package/dist/tests/coValueCore.test.js +164 -0
  122. package/dist/tests/coValueCore.test.js.map +1 -0
  123. package/dist/tests/coValueState.test.d.ts +2 -0
  124. package/dist/tests/coValueState.test.d.ts.map +1 -0
  125. package/dist/tests/coValueState.test.js +364 -0
  126. package/dist/tests/coValueState.test.js.map +1 -0
  127. package/dist/tests/crypto.test.d.ts +2 -0
  128. package/dist/tests/crypto.test.d.ts.map +1 -0
  129. package/dist/tests/crypto.test.js +144 -0
  130. package/dist/tests/crypto.test.js.map +1 -0
  131. package/dist/tests/cryptoImpl.test.d.ts +2 -0
  132. package/dist/tests/cryptoImpl.test.d.ts.map +1 -0
  133. package/dist/tests/cryptoImpl.test.js +144 -0
  134. package/dist/tests/cryptoImpl.test.js.map +1 -0
  135. package/dist/tests/group.test.d.ts +2 -0
  136. package/dist/tests/group.test.d.ts.map +1 -0
  137. package/dist/tests/group.test.js +576 -0
  138. package/dist/tests/group.test.js.map +1 -0
  139. package/dist/tests/logger.test.d.ts +2 -0
  140. package/dist/tests/logger.test.d.ts.map +1 -0
  141. package/dist/tests/logger.test.js +118 -0
  142. package/dist/tests/logger.test.js.map +1 -0
  143. package/dist/tests/permissions.test.d.ts +2 -0
  144. package/dist/tests/permissions.test.d.ts.map +1 -0
  145. package/dist/tests/permissions.test.js +2051 -0
  146. package/dist/tests/permissions.test.js.map +1 -0
  147. package/dist/tests/priority.test.d.ts +2 -0
  148. package/dist/tests/priority.test.d.ts.map +1 -0
  149. package/dist/tests/priority.test.js +61 -0
  150. package/dist/tests/priority.test.js.map +1 -0
  151. package/dist/tests/sync.test.d.ts +2 -0
  152. package/dist/tests/sync.test.d.ts.map +1 -0
  153. package/dist/tests/sync.test.js +1548 -0
  154. package/dist/tests/sync.test.js.map +1 -0
  155. package/dist/tests/testUtils.d.ts +142 -0
  156. package/dist/tests/testUtils.d.ts.map +1 -0
  157. package/dist/tests/testUtils.js +315 -0
  158. package/dist/tests/testUtils.js.map +1 -0
  159. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts +4 -0
  160. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts.map +1 -0
  161. package/dist/typeUtils/expectGroup.d.ts +4 -0
  162. package/dist/typeUtils/expectGroup.d.ts.map +1 -0
  163. package/dist/typeUtils/isAccountID.d.ts +4 -0
  164. package/dist/typeUtils/isAccountID.d.ts.map +1 -0
  165. package/dist/typeUtils/isCoValue.d.ts +4 -0
  166. package/dist/typeUtils/isCoValue.d.ts.map +1 -0
  167. package/dist/utils.d.ts +5 -0
  168. package/dist/utils.d.ts.map +1 -0
  169. package/package.json +6 -6
  170. package/src/coValueCore.ts +3 -9
  171. package/src/coValues/account.ts +15 -15
  172. package/src/coValues/group.ts +85 -12
  173. package/src/jsonValue.ts +9 -5
  174. package/src/localNode.ts +3 -5
  175. package/src/permissions.ts +5 -15
  176. package/src/tests/coValueCore.test.ts +2 -2
  177. package/src/tests/group.test.ts +187 -0
  178. package/src/tests/permissions.test.ts +330 -57
  179. package/src/tests/testUtils.ts +4 -1
  180. package/tsconfig.json +4 -2
@@ -0,0 +1,120 @@
1
+ import { afterEach, describe, expect, test } from "vitest";
2
+ import { PriorityBasedMessageQueue } from "../PriorityBasedMessageQueue.js";
3
+ import { CO_VALUE_PRIORITY } from "../priority.js";
4
+ import { createTestMetricReader, tearDownTestMetricReader, } from "./testUtils.js";
5
+ function setup() {
6
+ const metricReader = createTestMetricReader();
7
+ const queue = new PriorityBasedMessageQueue(CO_VALUE_PRIORITY.MEDIUM);
8
+ return { queue, metricReader };
9
+ }
10
+ describe("PriorityBasedMessageQueue", () => {
11
+ afterEach(() => {
12
+ tearDownTestMetricReader();
13
+ });
14
+ test("should initialize with correct properties", () => {
15
+ const { queue } = setup();
16
+ expect(queue["defaultPriority"]).toBe(CO_VALUE_PRIORITY.MEDIUM);
17
+ expect(queue["queues"].length).toBe(8);
18
+ expect(queue["queues"].every((q) => !q.length)).toBe(true);
19
+ });
20
+ test("should push message with default priority", async () => {
21
+ const { queue } = setup();
22
+ const message = {
23
+ action: "load",
24
+ id: "co_ztest-id",
25
+ header: false,
26
+ sessions: {},
27
+ };
28
+ void queue.push(message);
29
+ const pulledEntry = queue.pull();
30
+ expect(pulledEntry?.msg).toEqual(message);
31
+ });
32
+ test("should push message with specified priority", async () => {
33
+ const { queue } = setup();
34
+ const message = {
35
+ action: "content",
36
+ id: "co_zhigh",
37
+ new: {},
38
+ priority: CO_VALUE_PRIORITY.HIGH,
39
+ };
40
+ void queue.push(message);
41
+ const pulledEntry = queue.pull();
42
+ expect(pulledEntry?.msg).toEqual(message);
43
+ });
44
+ test("should pull messages in priority order", async () => {
45
+ const { queue, metricReader } = setup();
46
+ const lowPriorityMsg = {
47
+ action: "content",
48
+ id: "co_zlow",
49
+ new: {},
50
+ priority: CO_VALUE_PRIORITY.LOW,
51
+ };
52
+ const mediumPriorityMsg = {
53
+ action: "content",
54
+ id: "co_zmedium",
55
+ new: {},
56
+ priority: CO_VALUE_PRIORITY.MEDIUM,
57
+ };
58
+ const highPriorityMsg = {
59
+ action: "content",
60
+ id: "co_zhigh",
61
+ new: {},
62
+ priority: CO_VALUE_PRIORITY.HIGH,
63
+ };
64
+ void queue.push(lowPriorityMsg);
65
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
66
+ priority: lowPriorityMsg.priority,
67
+ })).toBe(1);
68
+ void queue.push(mediumPriorityMsg);
69
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
70
+ priority: mediumPriorityMsg.priority,
71
+ })).toBe(1);
72
+ void queue.push(highPriorityMsg);
73
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
74
+ priority: highPriorityMsg.priority,
75
+ })).toBe(1);
76
+ expect(queue.pull()?.msg).toEqual(highPriorityMsg);
77
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
78
+ priority: highPriorityMsg.priority,
79
+ })).toBe(0);
80
+ expect(queue.pull()?.msg).toEqual(mediumPriorityMsg);
81
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
82
+ priority: mediumPriorityMsg.priority,
83
+ })).toBe(0);
84
+ expect(queue.pull()?.msg).toEqual(lowPriorityMsg);
85
+ expect(await metricReader.getMetricValue("jazz.messagequeue.size", {
86
+ priority: lowPriorityMsg.priority,
87
+ })).toBe(0);
88
+ });
89
+ test("should return undefined when pulling from empty queue", () => {
90
+ const { queue } = setup();
91
+ expect(queue.pull()).toBeUndefined();
92
+ });
93
+ test("should resolve promise when message is pulled", async () => {
94
+ const { queue } = setup();
95
+ const message = {
96
+ action: "load",
97
+ id: "co_ztest-id",
98
+ header: false,
99
+ sessions: {},
100
+ };
101
+ const pushPromise = queue.push(message);
102
+ const pulledEntry = queue.pull();
103
+ pulledEntry?.resolve();
104
+ await expect(pushPromise).resolves.toBeUndefined();
105
+ });
106
+ test("should reject promise when message is rejected", async () => {
107
+ const { queue } = setup();
108
+ const message = {
109
+ action: "load",
110
+ id: "co_ztest-id",
111
+ header: false,
112
+ sessions: {},
113
+ };
114
+ const pushPromise = queue.push(message);
115
+ const pulledEntry = queue.pull();
116
+ pulledEntry?.reject(new Error("Test error"));
117
+ await expect(pushPromise).rejects.toThrow("Test error");
118
+ });
119
+ });
120
+ //# sourceMappingURL=PriorityBasedMessageQueue.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PriorityBasedMessageQueue.test.js","sourceRoot":"","sources":["../../src/tests/PriorityBasedMessageQueue.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SyncStateManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncStateManager.test.d.ts","sourceRoot":"","sources":["../../src/tests/SyncStateManager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { beforeEach, describe, expect, onTestFinished, test, vi } from "vitest";
2
+ import { connectedPeers } from "../streamUtils.js";
3
+ import { emptyKnownState } from "../sync.js";
4
+ import { blockMessageTypeOnOutgoingPeer, connectNodeToSyncServer, createTestNode, loadCoValueOrFail, setupSyncServer, waitFor, } from "./testUtils.js";
5
+ let jazzCloud = setupSyncServer();
6
+ beforeEach(async () => {
7
+ jazzCloud = setupSyncServer();
8
+ });
9
+ describe("SyncStateManager", () => {
10
+ test("subscribeToUpdates receives updates when peer state changes", async () => {
11
+ // Setup nodes
12
+ const client = createTestNode();
13
+ const { nodeToServerPeer } = connectNodeToSyncServer(client);
14
+ // Create test data
15
+ const group = client.createGroup();
16
+ const map = group.createMap();
17
+ map.set("key1", "value1", "trusting");
18
+ const subscriptionManager = client.syncManager.syncState;
19
+ const updateSpy = vi.fn();
20
+ const unsubscribe = subscriptionManager.subscribeToUpdates(updateSpy);
21
+ await client.syncManager.actuallySyncCoValue(map.core);
22
+ expect(updateSpy).toHaveBeenCalledWith(nodeToServerPeer.id, emptyKnownState(map.core.id), { uploaded: false });
23
+ await waitFor(() => {
24
+ return subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id).uploaded;
25
+ });
26
+ expect(updateSpy).toHaveBeenCalledWith(nodeToServerPeer.id, client.syncManager.peers[nodeToServerPeer.id].knownStates.get(map.core.id), { uploaded: true });
27
+ // Cleanup
28
+ unsubscribe();
29
+ });
30
+ test("subscribeToPeerUpdates receives updates only for specific peer", async () => {
31
+ // Setup nodes
32
+ const client = createTestNode();
33
+ const { nodeToServerPeer } = connectNodeToSyncServer(client);
34
+ // Create test data
35
+ const group = client.createGroup();
36
+ const map = group.createMap();
37
+ map.set("key1", "value1", "trusting");
38
+ const [clientStoragePeer] = connectedPeers("clientStorage", "unusedPeer", {
39
+ peer1role: "client",
40
+ peer2role: "server",
41
+ });
42
+ client.syncManager.addPeer(clientStoragePeer);
43
+ const subscriptionManager = client.syncManager.syncState;
44
+ const updateToJazzCloudSpy = vi.fn();
45
+ const updateToStorageSpy = vi.fn();
46
+ const unsubscribe1 = subscriptionManager.subscribeToPeerUpdates(nodeToServerPeer.id, updateToJazzCloudSpy);
47
+ const unsubscribe2 = subscriptionManager.subscribeToPeerUpdates(clientStoragePeer.id, updateToStorageSpy);
48
+ onTestFinished(() => {
49
+ unsubscribe1();
50
+ unsubscribe2();
51
+ });
52
+ await client.syncManager.actuallySyncCoValue(map.core);
53
+ expect(updateToJazzCloudSpy).toHaveBeenCalledWith(emptyKnownState(map.core.id), { uploaded: false });
54
+ await waitFor(() => {
55
+ return subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id).uploaded;
56
+ });
57
+ expect(updateToJazzCloudSpy).toHaveBeenLastCalledWith(client.syncManager.peers[nodeToServerPeer.id].knownStates.get(map.core.id), { uploaded: true });
58
+ expect(updateToStorageSpy).toHaveBeenLastCalledWith(emptyKnownState(map.core.id), { uploaded: false });
59
+ });
60
+ test("getIsCoValueFullyUploadedIntoPeer returns correct status", async () => {
61
+ // Setup nodes
62
+ const client = createTestNode();
63
+ const { nodeToServerPeer } = connectNodeToSyncServer(client);
64
+ // Create test data
65
+ const group = client.createGroup();
66
+ const map = group.createMap();
67
+ map.set("key1", "value1", "trusting");
68
+ await client.syncManager.actuallySyncCoValue(map.core);
69
+ const subscriptionManager = client.syncManager.syncState;
70
+ expect(subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id)
71
+ .uploaded).toBe(false);
72
+ await waitFor(() => {
73
+ return subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id).uploaded;
74
+ });
75
+ expect(subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id)
76
+ .uploaded).toBe(true);
77
+ });
78
+ test("unsubscribe stops receiving updates", async () => {
79
+ // Setup nodes
80
+ const client = createTestNode();
81
+ const { nodeToServerPeer } = connectNodeToSyncServer(client);
82
+ // Create test data
83
+ const group = client.createGroup();
84
+ const map = group.createMap();
85
+ map.set("key1", "value1", "trusting");
86
+ const subscriptionManager = client.syncManager.syncState;
87
+ const anyUpdateSpy = vi.fn();
88
+ const unsubscribe1 = subscriptionManager.subscribeToUpdates(anyUpdateSpy);
89
+ const unsubscribe2 = subscriptionManager.subscribeToPeerUpdates(nodeToServerPeer.id, anyUpdateSpy);
90
+ unsubscribe1();
91
+ unsubscribe2();
92
+ await client.syncManager.actuallySyncCoValue(map.core);
93
+ anyUpdateSpy.mockClear();
94
+ await waitFor(() => {
95
+ return subscriptionManager.getCurrentSyncState(nodeToServerPeer.id, map.core.id).uploaded;
96
+ });
97
+ expect(anyUpdateSpy).not.toHaveBeenCalled();
98
+ });
99
+ test("getCurrentSyncState should return the correct state", async () => {
100
+ // Setup nodes
101
+ const clientNode = createTestNode();
102
+ const serverNode = jazzCloud;
103
+ const { nodeToServerPeer: clientToServerPeer, serverToNodePeer: serverToClientPeer, } = connectNodeToSyncServer(clientNode);
104
+ // Create test data
105
+ const group = clientNode.createGroup();
106
+ const map = group.createMap();
107
+ map.set("key1", "value1", "trusting");
108
+ group.addMember("everyone", "writer");
109
+ // Initially should not be synced
110
+ expect(clientNode.syncManager.syncState.getCurrentSyncState(clientToServerPeer.id, map.core.id)).toEqual({ uploaded: false });
111
+ // Wait for full sync
112
+ await map.core.waitForSync();
113
+ expect(clientNode.syncManager.syncState.getCurrentSyncState(clientToServerPeer.id, map.core.id)).toEqual({ uploaded: true });
114
+ const mapOnServer = await loadCoValueOrFail(serverNode, map.id);
115
+ // Block the content messages so the client won't fully sync immediately
116
+ const outgoing = blockMessageTypeOnOutgoingPeer(serverToClientPeer, "content");
117
+ mapOnServer.set("key2", "value2", "trusting");
118
+ expect(clientNode.syncManager.syncState.getCurrentSyncState(clientToServerPeer.id, map.core.id)).toEqual({ uploaded: true });
119
+ expect(serverNode.syncManager.syncState.getCurrentSyncState(serverToClientPeer.id, map.core.id)).toEqual({ uploaded: false });
120
+ await outgoing.sendBlockedMessages();
121
+ outgoing.unblock();
122
+ await mapOnServer.core.waitForSync();
123
+ expect(clientNode.syncManager.syncState.getCurrentSyncState(clientToServerPeer.id, map.core.id)).toEqual({ uploaded: true });
124
+ expect(serverNode.syncManager.syncState.getCurrentSyncState(serverToClientPeer.id, map.core.id)).toEqual({ uploaded: true });
125
+ });
126
+ });
127
+ //# sourceMappingURL=SyncStateManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncStateManager.test.js","sourceRoot":"","sources":["../../src/tests/SyncStateManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.test.d.ts","sourceRoot":"","sources":["../../src/tests/account.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { expect, test } from "vitest";
2
+ import { WasmCrypto } from "../crypto/WasmCrypto.js";
3
+ import { LocalNode } from "../localNode.js";
4
+ import { connectedPeers } from "../streamUtils.js";
5
+ const Crypto = await WasmCrypto.create();
6
+ test("Can create a node while creating a new account with profile", async () => {
7
+ const { node, accountID, accountSecret, sessionID } = await LocalNode.withNewlyCreatedAccount({
8
+ creationProps: { name: "Hermes Puggington" },
9
+ crypto: Crypto,
10
+ });
11
+ expect(node).not.toBeNull();
12
+ expect(accountID).not.toBeNull();
13
+ expect(accountSecret).not.toBeNull();
14
+ expect(sessionID).not.toBeNull();
15
+ expect(node.expectProfileLoaded(accountID).get("name")).toEqual("Hermes Puggington");
16
+ });
17
+ test("A node with an account can create groups and and objects within them", async () => {
18
+ const { node, accountID } = await LocalNode.withNewlyCreatedAccount({
19
+ creationProps: { name: "Hermes Puggington" },
20
+ crypto: Crypto,
21
+ });
22
+ const group = await node.createGroup();
23
+ expect(group).not.toBeNull();
24
+ const map = group.createMap();
25
+ map.set("foo", "bar", "private");
26
+ expect(map.get("foo")).toEqual("bar");
27
+ expect(map.lastEditAt("foo")?.by).toEqual(accountID);
28
+ });
29
+ test("Can create account with one node, and then load it on another", async () => {
30
+ const { node, accountID, accountSecret } = await LocalNode.withNewlyCreatedAccount({
31
+ creationProps: { name: "Hermes Puggington" },
32
+ crypto: Crypto,
33
+ });
34
+ const group = await node.createGroup();
35
+ expect(group).not.toBeNull();
36
+ const map = group.createMap();
37
+ map.set("foo", "bar", "private");
38
+ expect(map.get("foo")).toEqual("bar");
39
+ const [node1asPeer, node2asPeer] = connectedPeers("node1", "node2", {
40
+ peer1role: "server",
41
+ peer2role: "client",
42
+ });
43
+ node.syncManager.addPeer(node2asPeer);
44
+ const node2 = await LocalNode.withLoadedAccount({
45
+ accountID,
46
+ accountSecret,
47
+ sessionID: Crypto.newRandomSessionID(accountID),
48
+ peersToLoadFrom: [node1asPeer],
49
+ crypto: Crypto,
50
+ });
51
+ const map2 = await node2.load(map.id);
52
+ if (map2 === "unavailable")
53
+ throw new Error("Map unavailable");
54
+ expect(map2.get("foo")).toEqual("bar");
55
+ });
56
+ test("throws an error if the user tried to create an invite from an account", async () => {
57
+ const { node, accountID } = await LocalNode.withNewlyCreatedAccount({
58
+ creationProps: { name: "Hermes Puggington" },
59
+ crypto: Crypto,
60
+ });
61
+ const account = await node.load(accountID);
62
+ if (account === "unavailable")
63
+ throw new Error("Account unavailable");
64
+ expect(() => account.createInvite("admin")).toThrow("Cannot create invite from an account");
65
+ });
66
+ //# sourceMappingURL=account.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.test.js","sourceRoot":"","sources":["../../src/tests/account.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=coList.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coList.test.d.ts","sourceRoot":"","sources":["../../src/tests/coList.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { expect, test } from "vitest";
2
+ import { expectList } from "../coValue.js";
3
+ import { WasmCrypto } from "../crypto/WasmCrypto.js";
4
+ import { LocalNode } from "../localNode.js";
5
+ import { randomAnonymousAccountAndSessionID } from "./testUtils.js";
6
+ const Crypto = await WasmCrypto.create();
7
+ test("Empty CoList works", () => {
8
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
9
+ const coValue = node.createCoValue({
10
+ type: "colist",
11
+ ruleset: { type: "unsafeAllowAll" },
12
+ meta: null,
13
+ ...Crypto.createdNowUnique(),
14
+ });
15
+ const content = expectList(coValue.getCurrentContent());
16
+ expect(content.type).toEqual("colist");
17
+ expect(content.toJSON()).toEqual([]);
18
+ });
19
+ test("Can append, prepend, delete and replace items in CoList", () => {
20
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
21
+ const coValue = node.createCoValue({
22
+ type: "colist",
23
+ ruleset: { type: "unsafeAllowAll" },
24
+ meta: null,
25
+ ...Crypto.createdNowUnique(),
26
+ });
27
+ const content = expectList(coValue.getCurrentContent());
28
+ content.append("hello", 0, "trusting");
29
+ expect(content.toJSON()).toEqual(["hello"]);
30
+ content.append("world", 0, "trusting");
31
+ expect(content.toJSON()).toEqual(["hello", "world"]);
32
+ content.prepend("beautiful", 1, "trusting");
33
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "world"]);
34
+ content.prepend("hooray", 3, "trusting");
35
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "world", "hooray"]);
36
+ content.replace(2, "universe", "trusting");
37
+ expect(content.toJSON()).toEqual([
38
+ "hello",
39
+ "beautiful",
40
+ "universe",
41
+ "hooray",
42
+ ]);
43
+ content.delete(2, "trusting");
44
+ expect(content.toJSON()).toEqual(["hello", "beautiful", "hooray"]);
45
+ });
46
+ test("Push is equivalent to append after last item", () => {
47
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
48
+ const coValue = node.createCoValue({
49
+ type: "colist",
50
+ ruleset: { type: "unsafeAllowAll" },
51
+ meta: null,
52
+ ...Crypto.createdNowUnique(),
53
+ });
54
+ const content = expectList(coValue.getCurrentContent());
55
+ expect(content.type).toEqual("colist");
56
+ content.append("hello", 0, "trusting");
57
+ expect(content.toJSON()).toEqual(["hello"]);
58
+ content.append("world", undefined, "trusting");
59
+ expect(content.toJSON()).toEqual(["hello", "world"]);
60
+ content.append("hooray", undefined, "trusting");
61
+ expect(content.toJSON()).toEqual(["hello", "world", "hooray"]);
62
+ });
63
+ test("appendItems add an array of items at the end of the list", () => {
64
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
65
+ const coValue = node.createCoValue({
66
+ type: "colist",
67
+ ruleset: { type: "unsafeAllowAll" },
68
+ meta: null,
69
+ ...Crypto.createdNowUnique(),
70
+ });
71
+ const content = expectList(coValue.getCurrentContent());
72
+ expect(content.type).toEqual("colist");
73
+ content.append("hello", 0, "trusting");
74
+ expect(content.toJSON()).toEqual(["hello"]);
75
+ content.appendItems(["world", "hooray", "universe"], undefined, "trusting");
76
+ expect(content.toJSON()).toEqual(["hello", "world", "hooray", "universe"]);
77
+ });
78
+ test("Can push into empty list", () => {
79
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
80
+ const coValue = node.createCoValue({
81
+ type: "colist",
82
+ ruleset: { type: "unsafeAllowAll" },
83
+ meta: null,
84
+ ...Crypto.createdNowUnique(),
85
+ });
86
+ const content = expectList(coValue.getCurrentContent());
87
+ expect(content.type).toEqual("colist");
88
+ content.append("hello", undefined, "trusting");
89
+ expect(content.toJSON()).toEqual(["hello"]);
90
+ });
91
+ test("init the list correctly", () => {
92
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
93
+ const group = node.createGroup();
94
+ const content = group.createList(["hello", "world", "hooray", "universe"]);
95
+ expect(content.type).toEqual("colist");
96
+ expect(content.toJSON()).toEqual(["hello", "world", "hooray", "universe"]);
97
+ content.append("hello", content.toJSON().length - 1, "trusting");
98
+ expect(content.toJSON()).toEqual([
99
+ "hello",
100
+ "world",
101
+ "hooray",
102
+ "universe",
103
+ "hello",
104
+ ]);
105
+ });
106
+ test("Items prepended to start appear with latest first", () => {
107
+ const node = new LocalNode(...randomAnonymousAccountAndSessionID(), Crypto);
108
+ const coValue = node.createCoValue({
109
+ type: "colist",
110
+ ruleset: { type: "unsafeAllowAll" },
111
+ meta: null,
112
+ ...Crypto.createdNowUnique(),
113
+ });
114
+ const content = expectList(coValue.getCurrentContent());
115
+ content.prepend("first", 0, "trusting");
116
+ content.prepend("second", 0, "trusting");
117
+ content.prepend("third", 0, "trusting");
118
+ expect(content.toJSON()).toEqual(["third", "second", "first"]);
119
+ });
120
+ //# sourceMappingURL=coList.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coList.test.js","sourceRoot":"","sources":["../../src/tests/coList.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=coMap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coMap.test.d.ts","sourceRoot":"","sources":["../../src/tests/coMap.test.ts"],"names":[],"mappings":""}