cojson 0.10.15 → 0.11.3

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 (164) 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 +7 -4
  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/coValueState.js +6 -2
  26. package/dist/coValueState.js.map +1 -1
  27. package/dist/coValues/account.d.ts +69 -0
  28. package/dist/coValues/account.d.ts.map +1 -0
  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 +51 -3
  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/PureJSCrypto.js +1 -1
  46. package/dist/crypto/PureJSCrypto.js.map +1 -1
  47. package/dist/crypto/WasmCrypto.d.ts +49 -0
  48. package/dist/crypto/WasmCrypto.d.ts.map +1 -0
  49. package/dist/crypto/WasmCrypto.js +1 -1
  50. package/dist/crypto/WasmCrypto.js.map +1 -1
  51. package/dist/crypto/crypto.d.ts +142 -0
  52. package/dist/crypto/crypto.d.ts.map +1 -0
  53. package/dist/crypto/crypto.js +1 -1
  54. package/dist/crypto/crypto.js.map +1 -1
  55. package/dist/exports.d.ts +84 -0
  56. package/dist/exports.d.ts.map +1 -0
  57. package/dist/ids.d.ts +23 -0
  58. package/dist/ids.d.ts.map +1 -0
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/jsonStringify.d.ts +7 -0
  62. package/dist/jsonStringify.d.ts.map +1 -0
  63. package/dist/jsonValue.d.ts +45 -0
  64. package/dist/jsonValue.d.ts.map +1 -0
  65. package/dist/localNode.d.ts +111 -0
  66. package/dist/localNode.d.ts.map +1 -0
  67. package/dist/localNode.js +7 -3
  68. package/dist/localNode.js.map +1 -1
  69. package/dist/logger.d.ts +37 -0
  70. package/dist/logger.d.ts.map +1 -0
  71. package/dist/logger.js.map +1 -1
  72. package/dist/media.d.ts +8 -0
  73. package/dist/media.d.ts.map +1 -0
  74. package/dist/permissions.d.ts +24 -0
  75. package/dist/permissions.d.ts.map +1 -0
  76. package/dist/permissions.js +3 -4
  77. package/dist/permissions.js.map +1 -1
  78. package/dist/priority.d.ts +19 -0
  79. package/dist/priority.d.ts.map +1 -0
  80. package/dist/storage/FileSystem.d.ts +37 -0
  81. package/dist/storage/FileSystem.d.ts.map +1 -0
  82. package/dist/storage/chunksAndKnownStates.d.ts +7 -0
  83. package/dist/storage/chunksAndKnownStates.d.ts.map +1 -0
  84. package/dist/storage/index.d.ts +52 -0
  85. package/dist/storage/index.d.ts.map +1 -0
  86. package/dist/storage/index.js +10 -11
  87. package/dist/storage/index.js.map +1 -1
  88. package/dist/streamUtils.d.ts +13 -0
  89. package/dist/streamUtils.d.ts.map +1 -0
  90. package/dist/sync.d.ts +97 -0
  91. package/dist/sync.d.ts.map +1 -0
  92. package/dist/sync.js +20 -14
  93. package/dist/sync.js.map +1 -1
  94. package/dist/tests/PeerKnownStates.test.d.ts +2 -0
  95. package/dist/tests/PeerKnownStates.test.d.ts.map +1 -0
  96. package/dist/tests/PeerState.test.d.ts +2 -0
  97. package/dist/tests/PeerState.test.d.ts.map +1 -0
  98. package/dist/tests/PriorityBasedMessageQueue.test.d.ts +2 -0
  99. package/dist/tests/PriorityBasedMessageQueue.test.d.ts.map +1 -0
  100. package/dist/tests/SyncStateManager.test.d.ts +2 -0
  101. package/dist/tests/SyncStateManager.test.d.ts.map +1 -0
  102. package/dist/tests/account.test.d.ts +2 -0
  103. package/dist/tests/account.test.d.ts.map +1 -0
  104. package/dist/tests/coList.test.d.ts +2 -0
  105. package/dist/tests/coList.test.d.ts.map +1 -0
  106. package/dist/tests/coMap.test.d.ts +2 -0
  107. package/dist/tests/coMap.test.d.ts.map +1 -0
  108. package/dist/tests/coPlainText.test.d.ts +2 -0
  109. package/dist/tests/coPlainText.test.d.ts.map +1 -0
  110. package/dist/tests/coStream.test.d.ts +2 -0
  111. package/dist/tests/coStream.test.d.ts.map +1 -0
  112. package/dist/tests/coValueCore.test.d.ts +2 -0
  113. package/dist/tests/coValueCore.test.d.ts.map +1 -0
  114. package/dist/tests/coValueState.test.d.ts +2 -0
  115. package/dist/tests/coValueState.test.d.ts.map +1 -0
  116. package/dist/tests/crypto.test.d.ts +2 -0
  117. package/dist/tests/crypto.test.d.ts.map +1 -0
  118. package/dist/tests/cryptoImpl.test.d.ts +2 -0
  119. package/dist/tests/cryptoImpl.test.d.ts.map +1 -0
  120. package/dist/tests/group.test.d.ts +2 -0
  121. package/dist/tests/group.test.d.ts.map +1 -0
  122. package/dist/tests/group.test.js +130 -0
  123. package/dist/tests/group.test.js.map +1 -1
  124. package/dist/tests/logger.test.d.ts +2 -0
  125. package/dist/tests/logger.test.d.ts.map +1 -0
  126. package/dist/tests/permissions.test.d.ts +2 -0
  127. package/dist/tests/permissions.test.d.ts.map +1 -0
  128. package/dist/tests/permissions.test.js +194 -1
  129. package/dist/tests/permissions.test.js.map +1 -1
  130. package/dist/tests/priority.test.d.ts +2 -0
  131. package/dist/tests/priority.test.d.ts.map +1 -0
  132. package/dist/tests/sync.test.d.ts +2 -0
  133. package/dist/tests/sync.test.d.ts.map +1 -0
  134. package/dist/tests/testUtils.d.ts +142 -0
  135. package/dist/tests/testUtils.d.ts.map +1 -0
  136. package/dist/tests/testUtils.js +4 -1
  137. package/dist/tests/testUtils.js.map +1 -1
  138. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts +4 -0
  139. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts.map +1 -0
  140. package/dist/typeUtils/expectGroup.d.ts +4 -0
  141. package/dist/typeUtils/expectGroup.d.ts.map +1 -0
  142. package/dist/typeUtils/isAccountID.d.ts +4 -0
  143. package/dist/typeUtils/isAccountID.d.ts.map +1 -0
  144. package/dist/typeUtils/isCoValue.d.ts +4 -0
  145. package/dist/typeUtils/isCoValue.d.ts.map +1 -0
  146. package/dist/utils.d.ts +5 -0
  147. package/dist/utils.d.ts.map +1 -0
  148. package/package.json +6 -6
  149. package/src/coValueCore.ts +7 -9
  150. package/src/coValueState.ts +6 -2
  151. package/src/coValues/group.ts +84 -9
  152. package/src/crypto/PureJSCrypto.ts +1 -3
  153. package/src/crypto/WasmCrypto.ts +1 -3
  154. package/src/crypto/crypto.ts +1 -1
  155. package/src/jsonValue.ts +9 -5
  156. package/src/localNode.ts +7 -5
  157. package/src/logger.ts +26 -6
  158. package/src/permissions.ts +3 -4
  159. package/src/storage/index.ts +12 -17
  160. package/src/sync.ts +26 -26
  161. package/src/tests/group.test.ts +187 -0
  162. package/src/tests/permissions.test.ts +285 -0
  163. package/src/tests/testUtils.ts +4 -1
  164. package/tsconfig.json +3 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/tests/logger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.test.d.ts","sourceRoot":"","sources":["../../src/tests/permissions.test.ts"],"names":[],"mappings":""}
@@ -3,7 +3,7 @@ import { expectMap } from "../coValue.js";
3
3
  import { ControlledAgent } from "../coValues/account.js";
4
4
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
5
5
  import { expectGroup } from "../typeUtils/expectGroup.js";
6
- import { connectTwoPeers, createTwoConnectedNodes, groupWithTwoAdmins, groupWithTwoAdminsHighLevel, loadCoValueOrFail, newGroup, newGroupHighLevel, } from "./testUtils.js";
6
+ import { connectTwoPeers, createThreeConnectedNodes, createTwoConnectedNodes, groupWithTwoAdmins, groupWithTwoAdminsHighLevel, loadCoValueOrFail, newGroup, newGroupHighLevel, } from "./testUtils.js";
7
7
  const Crypto = await WasmCrypto.create();
8
8
  test("Initial admin can add another admin to a group", () => {
9
9
  groupWithTwoAdmins();
@@ -545,6 +545,16 @@ test("Admins can set group read key, make a private transaction in an owned obje
545
545
  expect(childContentAsReader.get("foo")).toEqual("bar");
546
546
  expect(childContentAsReader.get("foo2")).toEqual("bar2");
547
547
  });
548
+ test("only admins can add agent ids", () => {
549
+ const { groupCore } = newGroup();
550
+ const inviteSecret = Crypto.newRandomAgentSecret();
551
+ const inviteID = Crypto.getAgentID(inviteSecret);
552
+ const groupAsInvite = expectGroup(groupCore
553
+ .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), Crypto.newRandomSessionID(inviteID))
554
+ .getCurrentContent());
555
+ groupAsInvite.set(inviteID, "adminInvite", "trusting");
556
+ expect(groupAsInvite.get(inviteID)).toEqual(undefined);
557
+ });
548
558
  test("Admins can set group read rey, make a private transaction in an owned object, rotate the read key, add two readers, rotate the read key again to kick out one reader, make another private transaction in the owned object, and only the remaining reader can read both transactions", () => {
549
559
  const { node, groupCore, admin } = newGroup();
550
560
  const childObject = node.createCoValue({
@@ -1757,6 +1767,189 @@ test("Calling extend to create grand-child groups parent and child references an
1757
1767
  .getCurrentContent());
1758
1768
  expect(childContentAsReader.get("foo")).toEqual("bar");
1759
1769
  });
1770
+ test("revoking access on a child group doesn't block access to that group if a more permissive role is inheritable", async () => {
1771
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
1772
+ const group = node1.node.createGroup();
1773
+ const parentGroup = node1.node.createGroup();
1774
+ group.extend(parentGroup);
1775
+ const randomUser = await loadCoValueOrFail(node1.node, node2.accountID);
1776
+ parentGroup.addMember(randomUser, "writer");
1777
+ group.addMember(randomUser, "writer");
1778
+ await group.removeMember(randomUser);
1779
+ const childMap = group.createMap();
1780
+ childMap.set("foo", "bar", "private");
1781
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, childMap.id);
1782
+ mapOnNode2.set("foo", "baz", "private");
1783
+ expect(mapOnNode2.get("foo")).toEqual("baz");
1784
+ });
1785
+ test("revoking access on a parent group doesn't block access to the child group if the same role is inheritable from a grand-parent group", async () => {
1786
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
1787
+ const group = node1.node.createGroup();
1788
+ const parentGroup = node1.node.createGroup();
1789
+ const grandParentGroup = node1.node.createGroup();
1790
+ group.extend(parentGroup);
1791
+ parentGroup.extend(grandParentGroup);
1792
+ const randomUser = await loadCoValueOrFail(node1.node, node2.accountID);
1793
+ grandParentGroup.addMember(randomUser, "writer");
1794
+ parentGroup.addMember(randomUser, "writer");
1795
+ await parentGroup.removeMember(randomUser);
1796
+ const childMap = group.createMap();
1797
+ childMap.set("foo", "bar", "private");
1798
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, childMap.id);
1799
+ mapOnNode2.set("foo", "baz", "private");
1800
+ expect(mapOnNode2.get("foo")).toEqual("baz");
1801
+ });
1802
+ test("revoking access on a parent group doesn't block access to the child group if the same role is inheritable from another parent group", async () => {
1803
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
1804
+ const group = node1.node.createGroup();
1805
+ const parentGroup1 = node1.node.createGroup();
1806
+ const parentGroup2 = node1.node.createGroup();
1807
+ group.extend(parentGroup1);
1808
+ group.extend(parentGroup2);
1809
+ const randomUser = await loadCoValueOrFail(node1.node, node2.accountID);
1810
+ parentGroup1.addMember(randomUser, "writer");
1811
+ parentGroup2.addMember(randomUser, "writer");
1812
+ await parentGroup1.removeMember(randomUser);
1813
+ const childMap = group.createMap();
1814
+ childMap.set("foo", "bar", "private");
1815
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, childMap.id);
1816
+ mapOnNode2.set("foo", "baz", "private");
1817
+ expect(mapOnNode2.get("foo")).toEqual("baz");
1818
+ });
1819
+ test("revoking write access to parent group", async () => {
1820
+ // Start with a node and a group
1821
+ const { group, node } = newGroupHighLevel();
1822
+ // Create a parent group and relate it to the existing group
1823
+ const parentGroup = node.createGroup();
1824
+ group.extend(parentGroup);
1825
+ // Create an account (`alice`) that can write to the parent group
1826
+ // Create an account (`bob`) that can write to the child group
1827
+ const alice = node.createAccount();
1828
+ const bob = node.createAccount();
1829
+ parentGroup.addMember(alice, "writer");
1830
+ group.addMember(bob, "writer");
1831
+ // The child group has a map that can be written to by `bob`
1832
+ const mapCore = node.createCoValue({
1833
+ type: "comap",
1834
+ ruleset: { type: "ownedByGroup", group: group.id },
1835
+ meta: null,
1836
+ ...Crypto.createdNowUnique(),
1837
+ });
1838
+ const bobMap = expectMap(mapCore
1839
+ .testWithDifferentAccount(bob, Crypto.newRandomSessionID(bob.id))
1840
+ .getCurrentContent());
1841
+ // `bob` sets `foo` to `bar`
1842
+ bobMap.set("foo", "bar", "private");
1843
+ // `bob`'s change is made successfully
1844
+ expect(bobMap.get("foo")).toEqual("bar");
1845
+ const aliceMap = expectMap(mapCore
1846
+ .testWithDifferentAccount(alice, Crypto.newRandomSessionID(alice.id))
1847
+ .getCurrentContent());
1848
+ // `alice` sets `foo` to `baz`
1849
+ aliceMap.set("foo", "baz", "private");
1850
+ // `alice`'s change is made successfully
1851
+ expect(aliceMap.get("foo")).toEqual("baz");
1852
+ // The two groups are no longer related
1853
+ await group.revokeExtend(parentGroup);
1854
+ // `bob` sets `foo` to `abc`
1855
+ bobMap.set("foo", "abc", "private");
1856
+ // `bob`'s change is made successfully
1857
+ expect(bobMap.get("foo")).toEqual("abc");
1858
+ const aliceMapAfterUnextend = expectMap(mapCore
1859
+ .testWithDifferentAccount(alice, Crypto.newRandomSessionID(alice.id))
1860
+ .getCurrentContent());
1861
+ // `alice` attempts to set `foo` to `def`, but fails
1862
+ expect(() => aliceMapAfterUnextend.set("foo", "def", "private")).toThrow("Can't make transaction without read key secret");
1863
+ // `alice`'s change is not made successfully
1864
+ expect(aliceMapAfterUnextend.get("foo")).not.toEqual("def");
1865
+ });
1866
+ test("revoking read access to parent group", async () => {
1867
+ // Start with two nodes
1868
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
1869
+ const group = node1.node.createGroup();
1870
+ // Create a parent group and relate it to the existing group
1871
+ const parentGroup = node1.node.createGroup();
1872
+ group.extend(parentGroup);
1873
+ // Create an account (`alice`) that can read from the parent group
1874
+ // Create an account (`bob`) that can write to the child group
1875
+ const alice = await loadCoValueOrFail(node1.node, node2.accountID);
1876
+ const bob = await loadCoValueOrFail(node1.node, node1.accountID);
1877
+ parentGroup.addMember(alice, "reader");
1878
+ group.addMember(bob, "writer");
1879
+ // The child group has a map that can be written to by `bob`
1880
+ const bobMap = group.createMap();
1881
+ // `bob` sets `foo` to `bar`
1882
+ bobMap.set("foo", "bar", "private");
1883
+ // `bob`'s change is made successfully
1884
+ expect(bobMap.get("foo")).toEqual("bar");
1885
+ const aliceMap = await loadCoValueOrFail(node2.node, bobMap.id);
1886
+ // `alice` reads `foo` as `bar`
1887
+ expect(aliceMap.get("foo")).toEqual("bar");
1888
+ // The two groups are no longer related
1889
+ await group.revokeExtend(parentGroup);
1890
+ // `bob` sets `foo` to `abc`
1891
+ bobMap.set("foo", "abc", "private");
1892
+ // `bob`'s change is made successfully
1893
+ expect(bobMap.get("foo")).toEqual("abc");
1894
+ // `alice` reads `foo` as `bar`
1895
+ expect(aliceMap.get("foo")).toEqual("bar");
1896
+ });
1897
+ test("revoking read access to grandparent group", async () => {
1898
+ // Start with two nodes
1899
+ const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
1900
+ const group = node1.node.createGroup();
1901
+ // Create group hierarchy
1902
+ const parentGroup = node1.node.createGroup();
1903
+ const grandParentGroup = node1.node.createGroup();
1904
+ group.extend(parentGroup);
1905
+ parentGroup.extend(grandParentGroup);
1906
+ // Create an account (`alice`) that can read from the parent group
1907
+ // Create an account (`bob`) that can write to the child group
1908
+ // Create an account (`charlie`) that can read from the grandparent group
1909
+ const alice = await loadCoValueOrFail(node1.node, node2.accountID);
1910
+ const bob = await loadCoValueOrFail(node1.node, node1.accountID);
1911
+ const charlie = await loadCoValueOrFail(node1.node, node3.accountID);
1912
+ parentGroup.addMember(alice, "reader");
1913
+ group.addMember(bob, "writer");
1914
+ grandParentGroup.addMember(charlie, "reader");
1915
+ // The child group has a map that can be written to by `bob`
1916
+ const bobMap = group.createMap();
1917
+ // `bob` sets `foo` to `bar`
1918
+ bobMap.set("foo", "bar", "private");
1919
+ // `bob`'s change is made successfully
1920
+ expect(bobMap.get("foo")).toEqual("bar");
1921
+ const aliceMap = await loadCoValueOrFail(node2.node, bobMap.id);
1922
+ // `alice` reads `foo` as `bar`
1923
+ expect(aliceMap.get("foo")).toEqual("bar");
1924
+ const charlieMap = await loadCoValueOrFail(node3.node, bobMap.id);
1925
+ // `charlie` reads `foo` as `bar`
1926
+ expect(charlieMap.get("foo")).toEqual("bar");
1927
+ // The groups are no longer related
1928
+ await parentGroup.revokeExtend(grandParentGroup);
1929
+ await group.revokeExtend(parentGroup);
1930
+ // `bob` sets `foo` to `abc`
1931
+ bobMap.set("foo", "abc", "private");
1932
+ // `bob`'s change is made successfully
1933
+ expect(bobMap.get("foo")).toEqual("abc");
1934
+ // `alice` reads `foo` as `bar`
1935
+ expect(aliceMap.get("foo")).toEqual("bar");
1936
+ // `charlie` reads `foo` as `bar`
1937
+ expect(charlieMap.get("foo")).toEqual("bar");
1938
+ });
1939
+ test("a user should have write access if the parent group has everyone as a writer", async () => {
1940
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
1941
+ const group = node1.node.createGroup();
1942
+ const parentGroup = node1.node.createGroup();
1943
+ group.extend(parentGroup);
1944
+ parentGroup.addMember("everyone", "writer");
1945
+ const randomUser = await loadCoValueOrFail(node1.node, node2.accountID);
1946
+ group.addMember(randomUser, "reader");
1947
+ const childMap = group.createMap();
1948
+ childMap.set("foo", "bar", "private");
1949
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, childMap.id);
1950
+ mapOnNode2.set("foo", "baz", "private");
1951
+ expect(mapOnNode2.get("foo")).toEqual("baz");
1952
+ });
1760
1953
  test("High-level permissions work correctly when a group is extended", async () => {
1761
1954
  const { group, node } = newGroupHighLevel();
1762
1955
  const parentGroup = node.createGroup();