cojson 0.7.35 → 0.8.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 (222) hide show
  1. package/.turbo/turbo-build.log +2 -7
  2. package/.turbo/turbo-lint.log +4 -0
  3. package/CHANGELOG.md +13 -0
  4. package/dist/{PeerState.js → native/PeerState.js} +13 -5
  5. package/dist/native/PeerState.js.map +1 -0
  6. package/dist/native/PriorityBasedMessageQueue.js.map +1 -0
  7. package/dist/native/base64url.js.map +1 -0
  8. package/dist/native/base64url.test.js.map +1 -0
  9. package/dist/native/coValue.js.map +1 -0
  10. package/dist/{coValueCore.js → native/coValueCore.js} +0 -6
  11. package/dist/native/coValueCore.js.map +1 -0
  12. package/dist/{coValues → native/coValues}/account.js +2 -3
  13. package/dist/native/coValues/account.js.map +1 -0
  14. package/dist/native/coValues/coList.js.map +1 -0
  15. package/dist/native/coValues/coMap.js.map +1 -0
  16. package/dist/native/coValues/coStream.js.map +1 -0
  17. package/dist/{coValues → native/coValues}/group.js +8 -8
  18. package/dist/native/coValues/group.js.map +1 -0
  19. package/dist/native/coreToCoValue.js.map +1 -0
  20. package/dist/{crypto → native/crypto}/PureJSCrypto.js +4 -0
  21. package/dist/native/crypto/PureJSCrypto.js.map +1 -0
  22. package/dist/{crypto → native/crypto}/crypto.js +4 -1
  23. package/dist/native/crypto/crypto.js.map +1 -0
  24. package/dist/native/ids.js.map +1 -0
  25. package/dist/{index.js → native/index.native.js} +4 -6
  26. package/dist/native/index.native.js.map +1 -0
  27. package/dist/native/jsonStringify.js.map +1 -0
  28. package/dist/{jsonValue.js.map → native/jsonValue.js.map} +1 -1
  29. package/dist/{localNode.js → native/localNode.js} +44 -38
  30. package/dist/native/localNode.js.map +1 -0
  31. package/dist/native/media.js.map +1 -0
  32. package/dist/native/permissions.js.map +1 -0
  33. package/dist/native/priority.js.map +1 -0
  34. package/dist/native/storage/FileSystem.js.map +1 -0
  35. package/dist/{storage → native/storage}/chunksAndKnownStates.js +1 -1
  36. package/dist/native/storage/chunksAndKnownStates.js.map +1 -0
  37. package/dist/native/storage/index.js.map +1 -0
  38. package/dist/native/streamUtils.js.map +1 -0
  39. package/dist/native/sync.js.map +1 -0
  40. package/dist/native/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -0
  41. package/dist/native/typeUtils/expectGroup.js.map +1 -0
  42. package/dist/native/typeUtils/isAccountID.js.map +1 -0
  43. package/dist/native/typeUtils/isCoValue.js.map +1 -0
  44. package/dist/web/PeerState.js +66 -0
  45. package/dist/web/PeerState.js.map +1 -0
  46. package/dist/web/PriorityBasedMessageQueue.js +51 -0
  47. package/dist/web/PriorityBasedMessageQueue.js.map +1 -0
  48. package/dist/web/base64url.js +59 -0
  49. package/dist/web/base64url.js.map +1 -0
  50. package/dist/web/base64url.test.js +25 -0
  51. package/dist/web/base64url.test.js.map +1 -0
  52. package/dist/web/coValue.js +19 -0
  53. package/dist/web/coValue.js.map +1 -0
  54. package/dist/web/coValueCore.js +693 -0
  55. package/dist/web/coValueCore.js.map +1 -0
  56. package/dist/web/coValues/account.js +96 -0
  57. package/dist/web/coValues/account.js.map +1 -0
  58. package/dist/web/coValues/coList.js +393 -0
  59. package/dist/web/coValues/coList.js.map +1 -0
  60. package/dist/web/coValues/coMap.js +197 -0
  61. package/dist/web/coValues/coMap.js.map +1 -0
  62. package/dist/web/coValues/coStream.js +220 -0
  63. package/dist/web/coValues/coStream.js.map +1 -0
  64. package/dist/web/coValues/group.js +250 -0
  65. package/dist/web/coValues/group.js.map +1 -0
  66. package/dist/web/coreToCoValue.js +42 -0
  67. package/dist/web/coreToCoValue.js.map +1 -0
  68. package/dist/web/crypto/PureJSCrypto.js +93 -0
  69. package/dist/web/crypto/PureJSCrypto.js.map +1 -0
  70. package/dist/{crypto → web/crypto}/WasmCrypto.js +3 -0
  71. package/dist/web/crypto/WasmCrypto.js.map +1 -0
  72. package/dist/web/crypto/crypto.js +154 -0
  73. package/dist/web/crypto/crypto.js.map +1 -0
  74. package/dist/web/ids.js +17 -0
  75. package/dist/web/ids.js.map +1 -0
  76. package/dist/web/index.web.js +40 -0
  77. package/dist/web/index.web.js.map +1 -0
  78. package/dist/web/jsonStringify.js +57 -0
  79. package/dist/web/jsonStringify.js.map +1 -0
  80. package/dist/web/jsonValue.js +2 -0
  81. package/dist/web/jsonValue.js.map +1 -0
  82. package/dist/web/localNode.js +442 -0
  83. package/dist/web/localNode.js.map +1 -0
  84. package/dist/web/media.js +2 -0
  85. package/dist/web/media.js.map +1 -0
  86. package/dist/web/permissions.js +206 -0
  87. package/dist/web/permissions.js.map +1 -0
  88. package/dist/web/priority.js +31 -0
  89. package/dist/web/priority.js.map +1 -0
  90. package/dist/web/storage/FileSystem.js +58 -0
  91. package/dist/web/storage/FileSystem.js.map +1 -0
  92. package/dist/web/storage/chunksAndKnownStates.js +100 -0
  93. package/dist/web/storage/chunksAndKnownStates.js.map +1 -0
  94. package/dist/web/storage/index.js +348 -0
  95. package/dist/web/storage/index.js.map +1 -0
  96. package/dist/web/streamUtils.js +41 -0
  97. package/dist/web/streamUtils.js.map +1 -0
  98. package/dist/web/sync.js +504 -0
  99. package/dist/web/sync.js.map +1 -0
  100. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js +5 -0
  101. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -0
  102. package/dist/web/typeUtils/expectGroup.js +13 -0
  103. package/dist/web/typeUtils/expectGroup.js.map +1 -0
  104. package/dist/web/typeUtils/isAccountID.js +4 -0
  105. package/dist/web/typeUtils/isAccountID.js.map +1 -0
  106. package/dist/web/typeUtils/isCoValue.js +11 -0
  107. package/dist/web/typeUtils/isCoValue.js.map +1 -0
  108. package/package.json +25 -8
  109. package/src/PeerState.ts +18 -7
  110. package/src/coValue.ts +1 -1
  111. package/src/coValueCore.ts +9 -14
  112. package/src/coValues/account.ts +12 -7
  113. package/src/coValues/coList.ts +4 -4
  114. package/src/coValues/coMap.ts +3 -3
  115. package/src/coValues/coStream.ts +8 -8
  116. package/src/coValues/group.ts +15 -11
  117. package/src/crypto/PureJSCrypto.ts +5 -0
  118. package/src/crypto/WasmCrypto.ts +4 -0
  119. package/src/crypto/crypto.ts +11 -1
  120. package/src/ids.ts +2 -2
  121. package/src/{index.ts → index.native.ts} +7 -8
  122. package/src/index.web.ts +152 -0
  123. package/src/localNode.ts +75 -67
  124. package/src/permissions.ts +5 -5
  125. package/src/storage/chunksAndKnownStates.ts +1 -1
  126. package/src/storage/index.ts +1 -1
  127. package/src/tests/account.test.ts +1 -2
  128. package/src/tests/coList.test.ts +1 -1
  129. package/src/tests/coMap.test.ts +1 -1
  130. package/src/tests/coStream.test.ts +2 -1
  131. package/src/tests/cryptoImpl.test.ts +24 -2
  132. package/src/tests/group.test.ts +6 -8
  133. package/src/tests/permissions.test.ts +90 -43
  134. package/src/tests/priority.test.ts +44 -15
  135. package/src/tests/sync.test.ts +8 -8
  136. package/src/tests/testUtils.ts +1 -2
  137. package/src/typeUtils/accountOrAgentIDfromSessionID.ts +3 -3
  138. package/src/typeUtils/isAccountID.ts +2 -2
  139. package/tsconfig.json +5 -4
  140. package/tsconfig.native.json +12 -0
  141. package/tsconfig.web.json +11 -0
  142. package/dist/PeerState.js.map +0 -1
  143. package/dist/PriorityBasedMessageQueue.js.map +0 -1
  144. package/dist/base64url.js.map +0 -1
  145. package/dist/base64url.test.js.map +0 -1
  146. package/dist/coValue.js.map +0 -1
  147. package/dist/coValueCore.js.map +0 -1
  148. package/dist/coValues/account.js.map +0 -1
  149. package/dist/coValues/coList.js.map +0 -1
  150. package/dist/coValues/coMap.js.map +0 -1
  151. package/dist/coValues/coStream.js.map +0 -1
  152. package/dist/coValues/group.js.map +0 -1
  153. package/dist/coreToCoValue.js.map +0 -1
  154. package/dist/crypto/PureJSCrypto.js.map +0 -1
  155. package/dist/crypto/WasmCrypto.js.map +0 -1
  156. package/dist/crypto/crypto.js.map +0 -1
  157. package/dist/ids.js.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/jsonStringify.js.map +0 -1
  160. package/dist/localNode.js.map +0 -1
  161. package/dist/media.js.map +0 -1
  162. package/dist/permissions.js.map +0 -1
  163. package/dist/priority.js.map +0 -1
  164. package/dist/storage/FileSystem.js.map +0 -1
  165. package/dist/storage/chunksAndKnownStates.js.map +0 -1
  166. package/dist/storage/index.js.map +0 -1
  167. package/dist/streamUtils.js.map +0 -1
  168. package/dist/sync.js.map +0 -1
  169. package/dist/tests/PeerState.test.js +0 -80
  170. package/dist/tests/PeerState.test.js.map +0 -1
  171. package/dist/tests/PriorityBasedMessageQueue.test.js +0 -97
  172. package/dist/tests/PriorityBasedMessageQueue.test.js.map +0 -1
  173. package/dist/tests/account.test.js +0 -59
  174. package/dist/tests/account.test.js.map +0 -1
  175. package/dist/tests/coList.test.js +0 -76
  176. package/dist/tests/coList.test.js.map +0 -1
  177. package/dist/tests/coMap.test.js +0 -136
  178. package/dist/tests/coMap.test.js.map +0 -1
  179. package/dist/tests/coStream.test.js +0 -205
  180. package/dist/tests/coStream.test.js.map +0 -1
  181. package/dist/tests/coValueCore.test.js +0 -124
  182. package/dist/tests/coValueCore.test.js.map +0 -1
  183. package/dist/tests/crypto.test.js +0 -118
  184. package/dist/tests/crypto.test.js.map +0 -1
  185. package/dist/tests/cryptoImpl.test.js +0 -113
  186. package/dist/tests/cryptoImpl.test.js.map +0 -1
  187. package/dist/tests/group.test.js +0 -34
  188. package/dist/tests/group.test.js.map +0 -1
  189. package/dist/tests/permissions.test.js +0 -1060
  190. package/dist/tests/permissions.test.js.map +0 -1
  191. package/dist/tests/priority.test.js +0 -61
  192. package/dist/tests/priority.test.js.map +0 -1
  193. package/dist/tests/sync.test.js +0 -1187
  194. package/dist/tests/sync.test.js.map +0 -1
  195. package/dist/tests/testUtils.js +0 -60
  196. package/dist/tests/testUtils.js.map +0 -1
  197. package/dist/typeUtils/accountOrAgentIDfromSessionID.js.map +0 -1
  198. package/dist/typeUtils/expectGroup.js.map +0 -1
  199. package/dist/typeUtils/isAccountID.js.map +0 -1
  200. package/dist/typeUtils/isCoValue.js.map +0 -1
  201. /package/dist/{PriorityBasedMessageQueue.js → native/PriorityBasedMessageQueue.js} +0 -0
  202. /package/dist/{base64url.js → native/base64url.js} +0 -0
  203. /package/dist/{base64url.test.js → native/base64url.test.js} +0 -0
  204. /package/dist/{coValue.js → native/coValue.js} +0 -0
  205. /package/dist/{coValues → native/coValues}/coList.js +0 -0
  206. /package/dist/{coValues → native/coValues}/coMap.js +0 -0
  207. /package/dist/{coValues → native/coValues}/coStream.js +0 -0
  208. /package/dist/{coreToCoValue.js → native/coreToCoValue.js} +0 -0
  209. /package/dist/{ids.js → native/ids.js} +0 -0
  210. /package/dist/{jsonStringify.js → native/jsonStringify.js} +0 -0
  211. /package/dist/{jsonValue.js → native/jsonValue.js} +0 -0
  212. /package/dist/{media.js → native/media.js} +0 -0
  213. /package/dist/{permissions.js → native/permissions.js} +0 -0
  214. /package/dist/{priority.js → native/priority.js} +0 -0
  215. /package/dist/{storage → native/storage}/FileSystem.js +0 -0
  216. /package/dist/{storage → native/storage}/index.js +0 -0
  217. /package/dist/{streamUtils.js → native/streamUtils.js} +0 -0
  218. /package/dist/{sync.js → native/sync.js} +0 -0
  219. /package/dist/{typeUtils → native/typeUtils}/accountOrAgentIDfromSessionID.js +0 -0
  220. /package/dist/{typeUtils → native/typeUtils}/expectGroup.js +0 -0
  221. /package/dist/{typeUtils → native/typeUtils}/isAccountID.js +0 -0
  222. /package/dist/{typeUtils → native/typeUtils}/isCoValue.js +0 -0
@@ -1,1060 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import { newRandomSessionID } from "../coValueCore.js";
3
- import { expectMap } from "../coValue.js";
4
- import { newGroup, newGroupHighLevel, groupWithTwoAdmins, groupWithTwoAdminsHighLevel, } from "./testUtils.js";
5
- import { ControlledAgent, WasmCrypto } from "../index.js";
6
- import { expectGroup } from "../typeUtils/expectGroup.js";
7
- const Crypto = await WasmCrypto.create();
8
- test("Initial admin can add another admin to a group", () => {
9
- groupWithTwoAdmins();
10
- });
11
- test("Initial admin can add another admin to a group (high level)", () => {
12
- groupWithTwoAdminsHighLevel();
13
- });
14
- test("Added admin can add a third admin to a group", () => {
15
- const { groupCore, otherAdmin, node } = groupWithTwoAdmins();
16
- const groupAsOtherAdmin = expectGroup(groupCore
17
- .testWithDifferentAccount(otherAdmin, newRandomSessionID(otherAdmin.id))
18
- .getCurrentContent());
19
- expect(groupAsOtherAdmin.get(otherAdmin.id)).toEqual("admin");
20
- const thirdAdmin = node.createAccount();
21
- groupAsOtherAdmin.set(thirdAdmin.id, "admin", "trusting");
22
- expect(groupAsOtherAdmin.get(thirdAdmin.id)).toEqual("admin");
23
- });
24
- test("Added adming can add a third admin to a group (high level)", () => {
25
- const { group, otherAdmin } = groupWithTwoAdminsHighLevel();
26
- const groupAsOtherAdmin = expectGroup(group.core
27
- .testWithDifferentAccount(otherAdmin, newRandomSessionID(otherAdmin.id))
28
- .getCurrentContent());
29
- const thirdAdmin = groupAsOtherAdmin.core.node.createAccount();
30
- groupAsOtherAdmin.addMember(thirdAdmin, "admin");
31
- expect(groupAsOtherAdmin.get(thirdAdmin.id)).toEqual("admin");
32
- });
33
- test("Admins can't demote other admins in a group", () => {
34
- const { groupCore, admin, otherAdmin } = groupWithTwoAdmins();
35
- const groupContent = expectGroup(groupCore.getCurrentContent());
36
- groupContent.set(otherAdmin.id, "writer", "trusting");
37
- expect(groupContent.get(otherAdmin.id)).toEqual("admin");
38
- expect(groupContent.get(otherAdmin.id)).toEqual("admin");
39
- const groupAsOtherAdmin = expectGroup(groupCore
40
- .testWithDifferentAccount(otherAdmin, newRandomSessionID(otherAdmin.id))
41
- .getCurrentContent());
42
- groupAsOtherAdmin.set(admin.id, "writer", "trusting");
43
- expect(groupAsOtherAdmin.get(admin.id)).toEqual("admin");
44
- });
45
- test("Admins can't demote other admins in a group (high level)", () => {
46
- const { group, admin, otherAdmin } = groupWithTwoAdminsHighLevel();
47
- const groupAsOtherAdmin = expectGroup(group.core
48
- .testWithDifferentAccount(otherAdmin, newRandomSessionID(otherAdmin.id))
49
- .getCurrentContent());
50
- expect(() => groupAsOtherAdmin.addMemberInternal(admin.id, "writer")).toThrow("Failed to set role");
51
- expect(groupAsOtherAdmin.get(admin.id)).toEqual("admin");
52
- });
53
- test("Admins an add writers to a group, who can't add admins, writers, or readers", () => {
54
- const { groupCore, node } = newGroup();
55
- const writer = node.createAccount();
56
- const groupContent = expectGroup(groupCore.getCurrentContent());
57
- groupContent.set(writer.id, "writer", "trusting");
58
- expect(groupContent.get(writer.id)).toEqual("writer");
59
- expect(groupContent.get(writer.id)).toEqual("writer");
60
- const groupAsWriter = expectGroup(groupCore
61
- .testWithDifferentAccount(writer, newRandomSessionID(writer.id))
62
- .getCurrentContent());
63
- expect(groupAsWriter.get(writer.id)).toEqual("writer");
64
- const otherAgent = node.createAccount();
65
- groupAsWriter.set(otherAgent.id, "admin", "trusting");
66
- expect(groupAsWriter.get(otherAgent.id)).toBeUndefined();
67
- groupAsWriter.set(otherAgent.id, "writer", "trusting");
68
- expect(groupAsWriter.get(otherAgent.id)).toBeUndefined();
69
- groupAsWriter.set(otherAgent.id, "reader", "trusting");
70
- expect(groupAsWriter.get(otherAgent.id)).toBeUndefined();
71
- });
72
- test("Admins an add writers to a group, who can't add admins, writers, or readers (high level)", () => {
73
- const { group, node } = newGroupHighLevel();
74
- const writer = node.createAccount();
75
- group.addMember(writer, "writer");
76
- expect(group.get(writer.id)).toEqual("writer");
77
- const groupAsWriter = expectGroup(group.core
78
- .testWithDifferentAccount(writer, newRandomSessionID(writer.id))
79
- .getCurrentContent());
80
- expect(groupAsWriter.get(writer.id)).toEqual("writer");
81
- const otherAgent = groupAsWriter.core.node.createAccount();
82
- expect(() => groupAsWriter.addMember(otherAgent, "admin")).toThrow("Failed to set role");
83
- expect(() => groupAsWriter.addMember(otherAgent, "writer")).toThrow("Failed to set role");
84
- expect(() => groupAsWriter.addMember(otherAgent, "reader")).toThrow("Failed to set role");
85
- expect(groupAsWriter.get(otherAgent.id)).toBeUndefined();
86
- });
87
- test("Admins can add readers to a group, who can't add admins, writers, or readers", () => {
88
- const { groupCore, node } = newGroup();
89
- const reader = node.createAccount();
90
- const groupContent = expectGroup(groupCore.getCurrentContent());
91
- groupContent.set(reader.id, "reader", "trusting");
92
- expect(groupContent.get(reader.id)).toEqual("reader");
93
- const groupAsReader = expectGroup(groupCore
94
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
95
- .getCurrentContent());
96
- expect(groupAsReader.get(reader.id)).toEqual("reader");
97
- const otherAgent = node.createAccount();
98
- groupAsReader.set(otherAgent.id, "admin", "trusting");
99
- expect(groupAsReader.get(otherAgent.id)).toBeUndefined();
100
- groupAsReader.set(otherAgent.id, "writer", "trusting");
101
- expect(groupAsReader.get(otherAgent.id)).toBeUndefined();
102
- groupAsReader.set(otherAgent.id, "reader", "trusting");
103
- expect(groupAsReader.get(otherAgent.id)).toBeUndefined();
104
- });
105
- test("Admins can add readers to a group, who can't add admins, writers, or readers (high level)", () => {
106
- const { group, node } = newGroupHighLevel();
107
- const reader = node.createAccount();
108
- group.addMember(reader, "reader");
109
- expect(group.get(reader.id)).toEqual("reader");
110
- const groupAsReader = expectGroup(group.core
111
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
112
- .getCurrentContent());
113
- expect(groupAsReader.get(reader.id)).toEqual("reader");
114
- const otherAgent = groupAsReader.core.node.createAccount();
115
- expect(() => groupAsReader.addMember(otherAgent, "admin")).toThrow("Failed to set role");
116
- expect(() => groupAsReader.addMember(otherAgent, "writer")).toThrow("Failed to set role");
117
- expect(() => groupAsReader.addMember(otherAgent, "reader")).toThrow("Failed to set role");
118
- expect(groupAsReader.get(otherAgent.id)).toBeUndefined();
119
- });
120
- test("Admins can write to an object that is owned by their group", () => {
121
- const { node, groupCore } = newGroup();
122
- const childObject = node.createCoValue({
123
- type: "comap",
124
- ruleset: { type: "ownedByGroup", group: groupCore.id },
125
- meta: null,
126
- ...Crypto.createdNowUnique(),
127
- });
128
- const childContent = expectMap(childObject.getCurrentContent());
129
- childContent.set("foo", "bar", "trusting");
130
- expect(childContent.get("foo")).toEqual("bar");
131
- });
132
- test("Admins can write to an object that is owned by their group (high level)", () => {
133
- const { group } = newGroupHighLevel();
134
- const childObject = group.createMap();
135
- childObject.set("foo", "bar", "trusting");
136
- expect(childObject.get("foo")).toEqual("bar");
137
- });
138
- test("Writers can write to an object that is owned by their group", () => {
139
- const { node, groupCore } = newGroup();
140
- const writer = node.createAccount();
141
- const group = expectGroup(groupCore.getCurrentContent());
142
- group.set(writer.id, "writer", "trusting");
143
- expect(group.get(writer.id)).toEqual("writer");
144
- const childObject = node.createCoValue({
145
- type: "comap",
146
- ruleset: { type: "ownedByGroup", group: groupCore.id },
147
- meta: null,
148
- ...Crypto.createdNowUnique(),
149
- });
150
- const childObjectAsWriter = childObject.testWithDifferentAccount(writer, newRandomSessionID(writer.id));
151
- const childContentAsWriter = expectMap(childObjectAsWriter.getCurrentContent());
152
- childContentAsWriter.set("foo", "bar", "trusting");
153
- expect(childContentAsWriter.get("foo")).toEqual("bar");
154
- });
155
- test("Writers can write to an object that is owned by their group (high level)", () => {
156
- const { node, group } = newGroupHighLevel();
157
- const writer = node.createAccount();
158
- group.addMember(writer, "writer");
159
- const childObject = group.createMap();
160
- const childObjectAsWriter = expectMap(childObject.core
161
- .testWithDifferentAccount(writer, newRandomSessionID(writer.id))
162
- .getCurrentContent());
163
- childObjectAsWriter.set("foo", "bar", "trusting");
164
- expect(childObjectAsWriter.get("foo")).toEqual("bar");
165
- });
166
- test("Readers can not write to an object that is owned by their group", () => {
167
- const { node, groupCore } = newGroup();
168
- const reader = node.createAccount();
169
- const group = expectGroup(groupCore.getCurrentContent());
170
- group.set(reader.id, "reader", "trusting");
171
- expect(group.get(reader.id)).toEqual("reader");
172
- const childObject = node.createCoValue({
173
- type: "comap",
174
- ruleset: { type: "ownedByGroup", group: groupCore.id },
175
- meta: null,
176
- ...Crypto.createdNowUnique(),
177
- });
178
- const childObjectAsReader = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
179
- const childContentAsReader = expectMap(childObjectAsReader.getCurrentContent());
180
- childContentAsReader.set("foo", "bar", "trusting");
181
- expect(childContentAsReader.get("foo")).toBeUndefined();
182
- });
183
- test("Readers can not write to an object that is owned by their group (high level)", () => {
184
- const { node, group } = newGroupHighLevel();
185
- const reader = node.createAccount();
186
- group.addMember(reader, "reader");
187
- const childObject = group.createMap();
188
- const childObjectAsReader = expectMap(childObject.core
189
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
190
- .getCurrentContent());
191
- childObjectAsReader.set("foo", "bar", "trusting");
192
- expect(childObjectAsReader.get("foo")).toBeUndefined();
193
- });
194
- test("Admins can set group read key and then use it to create and read private transactions in owned objects", () => {
195
- const { node, groupCore, admin } = newGroup();
196
- const groupContent = expectGroup(groupCore.getCurrentContent());
197
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
198
- const revelation = Crypto.seal({
199
- message: readKey,
200
- from: admin.currentSealerSecret(),
201
- to: admin.currentSealerID()._unsafeUnwrap(),
202
- nOnceMaterial: {
203
- in: groupCore.id,
204
- tx: groupCore.nextTransactionID(),
205
- },
206
- });
207
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
208
- expect(groupContent.get(`${readKeyID}_for_${admin.id}`)).toEqual(revelation);
209
- groupContent.set("readKey", readKeyID, "trusting");
210
- expect(groupContent.get("readKey")).toEqual(readKeyID);
211
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey);
212
- const childObject = node.createCoValue({
213
- type: "comap",
214
- ruleset: { type: "ownedByGroup", group: groupCore.id },
215
- meta: null,
216
- ...Crypto.createdNowUnique(),
217
- });
218
- const childContent = expectMap(childObject.getCurrentContent());
219
- childContent.set("foo", "bar", "private");
220
- expect(childContent.get("foo")).toEqual("bar");
221
- });
222
- test("Admins can set group read key and then use it to create and read private transactions in owned objects (high level)", () => {
223
- const { group } = newGroupHighLevel();
224
- const childObject = group.createMap();
225
- childObject.set("foo", "bar", "private");
226
- expect(childObject.get("foo")).toEqual("bar");
227
- });
228
- test("Admins can set group read key and then writers can use it to create and read private transactions in owned objects", () => {
229
- const { node, groupCore, admin } = newGroup();
230
- const writer = node.createAccount();
231
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
232
- const groupContent = expectGroup(groupCore.getCurrentContent());
233
- groupContent.set(writer.id, "writer", "trusting");
234
- expect(groupContent.get(writer.id)).toEqual("writer");
235
- const revelation1 = Crypto.seal({
236
- message: readKey,
237
- from: admin.currentSealerSecret(),
238
- to: admin.currentSealerID()._unsafeUnwrap(),
239
- nOnceMaterial: {
240
- in: groupCore.id,
241
- tx: groupCore.nextTransactionID(),
242
- },
243
- });
244
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation1, "trusting");
245
- const revelation2 = Crypto.seal({
246
- message: readKey,
247
- from: admin.currentSealerSecret(),
248
- to: writer.currentSealerID()._unsafeUnwrap(),
249
- nOnceMaterial: {
250
- in: groupCore.id,
251
- tx: groupCore.nextTransactionID(),
252
- },
253
- });
254
- groupContent.set(`${readKeyID}_for_${writer.id}`, revelation2, "trusting");
255
- groupContent.set("readKey", readKeyID, "trusting");
256
- const childObject = node.createCoValue({
257
- type: "comap",
258
- ruleset: { type: "ownedByGroup", group: groupCore.id },
259
- meta: null,
260
- ...Crypto.createdNowUnique(),
261
- });
262
- const childObjectAsWriter = childObject.testWithDifferentAccount(writer, newRandomSessionID(writer.id));
263
- expect(childObject.getCurrentReadKey().secret).toEqual(readKey);
264
- const childContentAsWriter = expectMap(childObjectAsWriter.getCurrentContent());
265
- childContentAsWriter.set("foo", "bar", "private");
266
- expect(childContentAsWriter.get("foo")).toEqual("bar");
267
- });
268
- test("Admins can set group read key and then writers can use it to create and read private transactions in owned objects (high level)", () => {
269
- const { node, group } = newGroupHighLevel();
270
- const writer = node.createAccount();
271
- group.addMember(writer, "writer");
272
- const childObject = group.createMap();
273
- const childObjectAsWriter = expectMap(childObject.core
274
- .testWithDifferentAccount(writer, newRandomSessionID(writer.id))
275
- .getCurrentContent());
276
- childObjectAsWriter.set("foo", "bar", "private");
277
- expect(childObjectAsWriter.get("foo")).toEqual("bar");
278
- });
279
- test("Admins can set group read key and then use it to create private transactions in owned objects, which readers can read", () => {
280
- const { node, groupCore, admin } = newGroup();
281
- const reader = node.createAccount();
282
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
283
- const groupContent = expectGroup(groupCore.getCurrentContent());
284
- groupContent.set(reader.id, "reader", "trusting");
285
- expect(groupContent.get(reader.id)).toEqual("reader");
286
- const revelation1 = Crypto.seal({
287
- message: readKey,
288
- from: admin.currentSealerSecret(),
289
- to: admin.currentSealerID()._unsafeUnwrap(),
290
- nOnceMaterial: {
291
- in: groupCore.id,
292
- tx: groupCore.nextTransactionID(),
293
- },
294
- });
295
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation1, "trusting");
296
- const revelation2 = Crypto.seal({
297
- message: readKey,
298
- from: admin.currentSealerSecret(),
299
- to: reader.currentSealerID()._unsafeUnwrap(),
300
- nOnceMaterial: {
301
- in: groupCore.id,
302
- tx: groupCore.nextTransactionID(),
303
- },
304
- });
305
- groupContent.set(`${readKeyID}_for_${reader.id}`, revelation2, "trusting");
306
- groupContent.set("readKey", readKeyID, "trusting");
307
- const childObject = node.createCoValue({
308
- type: "comap",
309
- ruleset: { type: "ownedByGroup", group: groupCore.id },
310
- meta: null,
311
- ...Crypto.createdNowUnique(),
312
- });
313
- const childContent = expectMap(childObject.getCurrentContent());
314
- childContent.set("foo", "bar", "private");
315
- expect(childContent.get("foo")).toEqual("bar");
316
- const childObjectAsReader = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
317
- expect(childObjectAsReader.getCurrentReadKey().secret).toEqual(readKey);
318
- const childContentAsReader = expectMap(childObjectAsReader.getCurrentContent());
319
- expect(childContentAsReader.get("foo")).toEqual("bar");
320
- });
321
- test("Admins can set group read key and then use it to create private transactions in owned objects, which readers can read (high level)", () => {
322
- const { node, group } = newGroupHighLevel();
323
- const reader = node.createAccount();
324
- group.addMember(reader, "reader");
325
- const childObject = group.createMap();
326
- childObject.set("foo", "bar", "private");
327
- expect(childObject.get("foo")).toEqual("bar");
328
- const childContentAsReader = expectMap(childObject.core
329
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
330
- .getCurrentContent());
331
- expect(childContentAsReader.get("foo")).toEqual("bar");
332
- });
333
- test("Admins can set group read key and then use it to create private transactions in owned objects, which readers can read, even with a separate later revelation for the same read key", () => {
334
- const { node, groupCore, admin } = newGroup();
335
- const reader1 = node.createAccount();
336
- const reader2 = node.createAccount();
337
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
338
- const groupContent = expectGroup(groupCore.getCurrentContent());
339
- groupContent.set(reader1.id, "reader", "trusting");
340
- expect(groupContent.get(reader1.id)).toEqual("reader");
341
- const revelation1 = Crypto.seal({
342
- message: readKey,
343
- from: admin.currentSealerSecret(),
344
- to: admin.currentSealerID()._unsafeUnwrap(),
345
- nOnceMaterial: {
346
- in: groupCore.id,
347
- tx: groupCore.nextTransactionID(),
348
- },
349
- });
350
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation1, "trusting");
351
- const revelation2 = Crypto.seal({
352
- message: readKey,
353
- from: admin.currentSealerSecret(),
354
- to: reader1.currentSealerID()._unsafeUnwrap(),
355
- nOnceMaterial: {
356
- in: groupCore.id,
357
- tx: groupCore.nextTransactionID(),
358
- },
359
- });
360
- groupContent.set(`${readKeyID}_for_${reader1.id}`, revelation2, "trusting");
361
- groupContent.set("readKey", readKeyID, "trusting");
362
- const childObject = node.createCoValue({
363
- type: "comap",
364
- ruleset: { type: "ownedByGroup", group: groupCore.id },
365
- meta: null,
366
- ...Crypto.createdNowUnique(),
367
- });
368
- const childContent = expectMap(childObject.getCurrentContent());
369
- childContent.set("foo", "bar", "private");
370
- expect(childContent.get("foo")).toEqual("bar");
371
- const childObjectAsReader1 = childObject.testWithDifferentAccount(reader1, newRandomSessionID(reader1.id));
372
- expect(childObjectAsReader1.getCurrentReadKey().secret).toEqual(readKey);
373
- const childContentAsReader1 = expectMap(childObjectAsReader1.getCurrentContent());
374
- expect(childContentAsReader1.get("foo")).toEqual("bar");
375
- const revelation3 = Crypto.seal({
376
- message: readKey,
377
- from: admin.currentSealerSecret(),
378
- to: reader2.currentSealerID()._unsafeUnwrap(),
379
- nOnceMaterial: {
380
- in: groupCore.id,
381
- tx: groupCore.nextTransactionID(),
382
- },
383
- });
384
- groupContent.set(`${readKeyID}_for_${reader2.id}`, revelation3, "trusting");
385
- const childObjectAsReader2 = childObject.testWithDifferentAccount(reader2, newRandomSessionID(reader2.id));
386
- expect(childObjectAsReader2.getCurrentReadKey().secret).toEqual(readKey);
387
- const childContentAsReader2 = expectMap(childObjectAsReader2.getCurrentContent());
388
- expect(childContentAsReader2.get("foo")).toEqual("bar");
389
- });
390
- test("Admins can set group read key and then use it to create private transactions in owned objects, which readers can read, even with a separate later revelation for the same read key (high level)", () => {
391
- const { node, group } = newGroupHighLevel();
392
- const reader1 = node.createAccount();
393
- const reader2 = node.createAccount();
394
- group.addMember(reader1, "reader");
395
- const childObject = group.createMap();
396
- childObject.set("foo", "bar", "private");
397
- expect(childObject.get("foo")).toEqual("bar");
398
- const childContentAsReader1 = expectMap(childObject.core
399
- .testWithDifferentAccount(reader1, newRandomSessionID(reader1.id))
400
- .getCurrentContent());
401
- expect(childContentAsReader1.get("foo")).toEqual("bar");
402
- group.addMember(reader2, "reader");
403
- const childContentAsReader2 = expectMap(childObject.core
404
- .testWithDifferentAccount(reader2, newRandomSessionID(reader2.id))
405
- .getCurrentContent());
406
- expect(childContentAsReader2.get("foo")).toEqual("bar");
407
- });
408
- test("Admins can set group read key, make a private transaction in an owned object, rotate the read key, make another private transaction, and both can be read by the admin", () => {
409
- const { node, groupCore, admin } = newGroup();
410
- const groupContent = expectGroup(groupCore.getCurrentContent());
411
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
412
- const revelation1 = Crypto.seal({
413
- message: readKey,
414
- from: admin.currentSealerSecret(),
415
- to: admin.currentSealerID()._unsafeUnwrap(),
416
- nOnceMaterial: {
417
- in: groupCore.id,
418
- tx: groupCore.nextTransactionID(),
419
- },
420
- });
421
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation1, "trusting");
422
- groupContent.set("readKey", readKeyID, "trusting");
423
- expect(groupContent.get("readKey")).toEqual(readKeyID);
424
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey);
425
- const childObject = node.createCoValue({
426
- type: "comap",
427
- ruleset: { type: "ownedByGroup", group: groupCore.id },
428
- meta: null,
429
- ...Crypto.createdNowUnique(),
430
- });
431
- const childContent = expectMap(childObject.getCurrentContent());
432
- childContent.set("foo", "bar", "private");
433
- expect(childContent.get("foo")).toEqual("bar");
434
- const { secret: readKey2, id: readKeyID2 } = Crypto.newRandomKeySecret();
435
- const revelation2 = Crypto.seal({
436
- message: readKey2,
437
- from: admin.currentSealerSecret(),
438
- to: admin.currentSealerID()._unsafeUnwrap(),
439
- nOnceMaterial: {
440
- in: groupCore.id,
441
- tx: groupCore.nextTransactionID(),
442
- },
443
- });
444
- groupContent.set(`${readKeyID2}_for_${admin.id}`, revelation2, "trusting");
445
- groupContent.set("readKey", readKeyID2, "trusting");
446
- expect(groupContent.get("readKey")).toEqual(readKeyID2);
447
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey2);
448
- expect(childContent.get("foo")).toEqual("bar");
449
- childContent.set("foo2", "bar2", "private");
450
- expect(childContent.get("foo2")).toEqual("bar2");
451
- });
452
- test("Admins can set group read key, make a private transaction in an owned object, rotate the read key, make another private transaction, and both can be read by the admin (high level)", () => {
453
- const { group } = newGroupHighLevel();
454
- const childObject = group.createMap();
455
- const firstReadKey = childObject.core.getCurrentReadKey();
456
- childObject.set("foo", "bar", "private");
457
- expect(childObject.get("foo")).toEqual("bar");
458
- group.rotateReadKey();
459
- expect(childObject.core.getCurrentReadKey()).not.toEqual(firstReadKey);
460
- childObject.set("foo2", "bar2", "private");
461
- expect(childObject.get("foo2")).toEqual("bar2");
462
- });
463
- test("Admins can set group read key, make a private transaction in an owned object, rotate the read key, add a reader, make another private transaction in the owned object, and both can be read by the reader", () => {
464
- const { node, groupCore, admin } = newGroup();
465
- const childObject = node.createCoValue({
466
- type: "comap",
467
- ruleset: { type: "ownedByGroup", group: groupCore.id },
468
- meta: null,
469
- ...Crypto.createdNowUnique(),
470
- });
471
- const groupContent = expectGroup(groupCore.getCurrentContent());
472
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
473
- const revelation = Crypto.seal({
474
- message: readKey,
475
- from: admin.currentSealerSecret(),
476
- to: admin.currentSealerID()._unsafeUnwrap(),
477
- nOnceMaterial: {
478
- in: groupCore.id,
479
- tx: groupCore.nextTransactionID(),
480
- },
481
- });
482
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
483
- groupContent.set("readKey", readKeyID, "trusting");
484
- expect(groupContent.get("readKey")).toEqual(readKeyID);
485
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey);
486
- const childContent = expectMap(childObject.getCurrentContent());
487
- childContent.set("foo", "bar", "private");
488
- expect(childContent.get("foo")).toEqual("bar");
489
- expect(childContent.get("foo")).toEqual("bar");
490
- const reader = node.createAccount();
491
- const { secret: readKey2, id: readKeyID2 } = Crypto.newRandomKeySecret();
492
- const revelation2 = Crypto.seal({
493
- message: readKey2,
494
- from: admin.currentSealerSecret(),
495
- to: admin.currentSealerID()._unsafeUnwrap(),
496
- nOnceMaterial: {
497
- in: groupCore.id,
498
- tx: groupCore.nextTransactionID(),
499
- },
500
- });
501
- groupContent.set(`${readKeyID2}_for_${admin.id}`, revelation2, "trusting");
502
- const revelation3 = Crypto.seal({
503
- message: readKey2,
504
- from: admin.currentSealerSecret(),
505
- to: reader.currentSealerID()._unsafeUnwrap(),
506
- nOnceMaterial: {
507
- in: groupCore.id,
508
- tx: groupCore.nextTransactionID(),
509
- },
510
- });
511
- groupContent.set(`${readKeyID2}_for_${reader.id}`, revelation3, "trusting");
512
- groupContent.set(`${readKeyID}_for_${readKeyID2}`, Crypto.encryptKeySecret({
513
- toEncrypt: { id: readKeyID, secret: readKey },
514
- encrypting: { id: readKeyID2, secret: readKey2 },
515
- }).encrypted, "trusting");
516
- groupContent.set("readKey", readKeyID2, "trusting");
517
- expect(groupContent.get("readKey")).toEqual(readKeyID2);
518
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey2);
519
- groupContent.set(reader.id, "reader", "trusting");
520
- expect(groupContent.get(reader.id)).toEqual("reader");
521
- childContent.set("foo2", "bar2", "private");
522
- expect(childContent.get("foo2")).toEqual("bar2");
523
- const childObjectAsReader = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
524
- expect(childObjectAsReader.getCurrentReadKey().secret).toEqual(readKey2);
525
- const childContentAsReader = expectMap(childObjectAsReader.getCurrentContent());
526
- expect(childContentAsReader.get("foo")).toEqual("bar");
527
- expect(childContentAsReader.get("foo2")).toEqual("bar2");
528
- });
529
- test("Admins can set group read key, make a private transaction in an owned object, rotate the read key, add a reader, make another private transaction in the owned object, and both can be read by the reader (high level)", () => {
530
- const { node, group } = newGroupHighLevel();
531
- const childObject = group.createMap();
532
- const firstReadKey = childObject.core.getCurrentReadKey();
533
- childObject.set("foo", "bar", "private");
534
- expect(childObject.get("foo")).toEqual("bar");
535
- expect(childObject.get("foo")).toEqual("bar");
536
- group.rotateReadKey();
537
- expect(childObject.core.getCurrentReadKey()).not.toEqual(firstReadKey);
538
- const reader = node.createAccount();
539
- group.addMember(reader, "reader");
540
- childObject.set("foo2", "bar2", "private");
541
- expect(childObject.get("foo2")).toEqual("bar2");
542
- const childContentAsReader = expectMap(childObject.core
543
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
544
- .getCurrentContent());
545
- expect(childContentAsReader.get("foo")).toEqual("bar");
546
- expect(childContentAsReader.get("foo2")).toEqual("bar2");
547
- });
548
- 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
- const { node, groupCore, admin } = newGroup();
550
- const childObject = node.createCoValue({
551
- type: "comap",
552
- ruleset: { type: "ownedByGroup", group: groupCore.id },
553
- meta: null,
554
- ...Crypto.createdNowUnique(),
555
- });
556
- const groupContent = expectGroup(groupCore.getCurrentContent());
557
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
558
- const reader = node.createAccount();
559
- const reader2 = node.createAccount();
560
- const revelation1 = Crypto.seal({
561
- message: readKey,
562
- from: admin.currentSealerSecret(),
563
- to: admin.currentSealerID()._unsafeUnwrap(),
564
- nOnceMaterial: {
565
- in: groupCore.id,
566
- tx: groupCore.nextTransactionID(),
567
- },
568
- });
569
- groupContent.set(`${readKeyID}_for_${admin.id}`, revelation1, "trusting");
570
- const revelation2 = Crypto.seal({
571
- message: readKey,
572
- from: admin.currentSealerSecret(),
573
- to: reader.currentSealerID()._unsafeUnwrap(),
574
- nOnceMaterial: {
575
- in: groupCore.id,
576
- tx: groupCore.nextTransactionID(),
577
- },
578
- });
579
- groupContent.set(`${readKeyID}_for_${reader.id}`, revelation2, "trusting");
580
- const revelation3 = Crypto.seal({
581
- message: readKey,
582
- from: admin.currentSealerSecret(),
583
- to: reader2.currentSealerID()._unsafeUnwrap(),
584
- nOnceMaterial: {
585
- in: groupCore.id,
586
- tx: groupCore.nextTransactionID(),
587
- },
588
- });
589
- groupContent.set(`${readKeyID}_for_${reader2.id}`, revelation3, "trusting");
590
- groupContent.set("readKey", readKeyID, "trusting");
591
- expect(groupContent.get("readKey")).toEqual(readKeyID);
592
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey);
593
- groupContent.set(reader.id, "reader", "trusting");
594
- expect(groupContent.get(reader.id)).toEqual("reader");
595
- groupContent.set(reader2.id, "reader", "trusting");
596
- expect(groupContent.get(reader2.id)).toEqual("reader");
597
- const childContent = expectMap(childObject.getCurrentContent());
598
- childContent.set("foo", "bar", "private");
599
- expect(childContent.get("foo")).toEqual("bar");
600
- let childObjectAsReader = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
601
- expect(expectMap(childObjectAsReader.getCurrentContent()).get("foo")).toEqual("bar");
602
- let childObjectAsReader2 = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
603
- expect(expectMap(childObjectAsReader2.getCurrentContent()).get("foo")).toEqual("bar");
604
- const { secret: readKey2, id: readKeyID2 } = Crypto.newRandomKeySecret();
605
- const newRevelation1 = Crypto.seal({
606
- message: readKey2,
607
- from: admin.currentSealerSecret(),
608
- to: admin.currentSealerID()._unsafeUnwrap(),
609
- nOnceMaterial: {
610
- in: groupCore.id,
611
- tx: groupCore.nextTransactionID(),
612
- },
613
- });
614
- groupContent.set(`${readKeyID2}_for_${admin.id}`, newRevelation1, "trusting");
615
- const newRevelation2 = Crypto.seal({
616
- message: readKey2,
617
- from: admin.currentSealerSecret(),
618
- to: reader2.currentSealerID()._unsafeUnwrap(),
619
- nOnceMaterial: {
620
- in: groupCore.id,
621
- tx: groupCore.nextTransactionID(),
622
- },
623
- });
624
- groupContent.set(`${readKeyID2}_for_${reader2.id}`, newRevelation2, "trusting");
625
- groupContent.set("readKey", readKeyID2, "trusting");
626
- expect(groupContent.get("readKey")).toEqual(readKeyID2);
627
- expect(groupCore.getCurrentReadKey().secret).toEqual(readKey2);
628
- groupContent.set(reader.id, "revoked", "trusting");
629
- // expect(editable.get(reader.id)).toEqual("revoked");
630
- expect(childObject.getCurrentReadKey().secret).toEqual(readKey2);
631
- childContent.set("foo2", "bar2", "private");
632
- expect(childContent.get("foo2")).toEqual("bar2");
633
- // TODO: make sure these instances of coValues sync between each other so this isn't necessary?
634
- childObjectAsReader = childObject.testWithDifferentAccount(reader, newRandomSessionID(reader.id));
635
- childObjectAsReader2 = childObject.testWithDifferentAccount(reader2, newRandomSessionID(reader2.id));
636
- expect(expectMap(childObjectAsReader.getCurrentContent()).get("foo2")).toBeUndefined();
637
- expect(expectMap(childObjectAsReader2.getCurrentContent()).get("foo2")).toEqual("bar2");
638
- });
639
- 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 (high level)", () => {
640
- const { node, group } = newGroupHighLevel();
641
- const childObject = group.createMap();
642
- childObject.set("foo", "bar", "private");
643
- expect(childObject.get("foo")).toEqual("bar");
644
- expect(childObject.get("foo")).toEqual("bar");
645
- group.rotateReadKey();
646
- const secondReadKey = childObject.core.getCurrentReadKey();
647
- const reader = node.createAccount();
648
- const reader2 = node.createAccount();
649
- group.addMember(reader, "reader");
650
- group.addMember(reader2, "reader");
651
- childObject.set("foo2", "bar2", "private");
652
- expect(childObject.get("foo2")).toEqual("bar2");
653
- group.removeMember(reader);
654
- expect(childObject.core.getCurrentReadKey()).not.toEqual(secondReadKey);
655
- childObject.set("foo3", "bar3", "private");
656
- expect(childObject.get("foo3")).toEqual("bar3");
657
- const childContentAsReader2 = expectMap(childObject.core
658
- .testWithDifferentAccount(reader2, newRandomSessionID(reader2.id))
659
- .getCurrentContent());
660
- expect(childContentAsReader2.get("foo")).toEqual("bar");
661
- expect(childContentAsReader2.get("foo2")).toEqual("bar2");
662
- expect(childContentAsReader2.get("foo3")).toEqual("bar3");
663
- expect(expectMap(childObject.core
664
- .testWithDifferentAccount(reader, newRandomSessionID(reader.id))
665
- .getCurrentContent()).get("foo3")).toBeUndefined();
666
- });
667
- test("Can create two owned objects in the same group and they will have different ids", () => {
668
- const { node, groupCore } = newGroup();
669
- const childObject1 = node.createCoValue({
670
- type: "comap",
671
- ruleset: { type: "ownedByGroup", group: groupCore.id },
672
- meta: null,
673
- ...Crypto.createdNowUnique(),
674
- });
675
- const childObject2 = node.createCoValue({
676
- type: "comap",
677
- ruleset: { type: "ownedByGroup", group: groupCore.id },
678
- meta: null,
679
- ...Crypto.createdNowUnique(),
680
- });
681
- expect(childObject1.id).not.toEqual(childObject2.id);
682
- });
683
- test("Admins can create an adminInvite, which can add an admin", () => {
684
- const { groupCore, admin } = newGroup();
685
- const inviteSecret = Crypto.newRandomAgentSecret();
686
- const inviteID = Crypto.getAgentID(inviteSecret);
687
- const group = expectGroup(groupCore.getCurrentContent());
688
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
689
- const revelation = Crypto.seal({
690
- message: readKey,
691
- from: admin.currentSealerSecret(),
692
- to: admin.currentSealerID()._unsafeUnwrap(),
693
- nOnceMaterial: {
694
- in: groupCore.id,
695
- tx: groupCore.nextTransactionID(),
696
- },
697
- });
698
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
699
- group.set("readKey", readKeyID, "trusting");
700
- group.set(inviteID, "adminInvite", "trusting");
701
- expect(group.get(inviteID)).toEqual("adminInvite");
702
- const revelationForInvite = Crypto.seal({
703
- message: readKey,
704
- from: admin.currentSealerSecret(),
705
- to: Crypto.getAgentSealerID(inviteID),
706
- nOnceMaterial: {
707
- in: groupCore.id,
708
- tx: groupCore.nextTransactionID(),
709
- },
710
- });
711
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
712
- const groupAsInvite = expectGroup(groupCore
713
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
714
- .getCurrentContent());
715
- const invitedAdminSecret = Crypto.newRandomAgentSecret();
716
- const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
717
- groupAsInvite.set(invitedAdminID, "admin", "trusting");
718
- expect(groupAsInvite.get(invitedAdminID)).toEqual("admin");
719
- const readKeyAsInvite = groupAsInvite.core.getCurrentReadKey();
720
- expect(readKeyAsInvite.secret).toBeDefined();
721
- const revelation2 = Crypto.seal({
722
- message: readKeyAsInvite.secret,
723
- from: Crypto.getAgentSealerSecret(invitedAdminSecret),
724
- to: Crypto.getAgentSealerID(invitedAdminID),
725
- nOnceMaterial: {
726
- in: groupCore.id,
727
- tx: groupCore.nextTransactionID(),
728
- },
729
- });
730
- groupAsInvite.set(`${readKeyAsInvite.id}_for_${invitedAdminID}`, revelation2, "trusting");
731
- expect(groupAsInvite.get(`${readKeyAsInvite.id}_for_${invitedAdminID}`)).toEqual(revelation2);
732
- });
733
- test("Admins can create an adminInvite, which can add an admin (high-level)", async () => {
734
- const { node, group } = newGroupHighLevel();
735
- const inviteSecret = group.createInvite("admin");
736
- const invitedAdminSecret = Crypto.newRandomAgentSecret();
737
- const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
738
- const nodeAsInvitedAdmin = node.testWithDifferentAccount(new ControlledAgent(invitedAdminSecret, Crypto), newRandomSessionID(invitedAdminID));
739
- await nodeAsInvitedAdmin.acceptInvite(group.id, inviteSecret);
740
- const thirdAdmin = Crypto.newRandomAgentSecret();
741
- const thirdAdminID = Crypto.getAgentID(thirdAdmin);
742
- const groupAsInvitedAdmin = await nodeAsInvitedAdmin.load(group.id);
743
- if (groupAsInvitedAdmin === "unavailable") {
744
- throw new Error("groupAsInvitedAdmin is unavailable");
745
- }
746
- expect(groupAsInvitedAdmin.get(invitedAdminID)).toEqual("admin");
747
- expect(groupAsInvitedAdmin.core.getCurrentReadKey().secret).toBeDefined();
748
- groupAsInvitedAdmin.addMemberInternal(thirdAdminID, "admin");
749
- expect(groupAsInvitedAdmin.get(thirdAdminID)).toEqual("admin");
750
- });
751
- test("Admins can create a writerInvite, which can add a writer", () => {
752
- const { groupCore, admin } = newGroup();
753
- const inviteSecret = Crypto.newRandomAgentSecret();
754
- const inviteID = Crypto.getAgentID(inviteSecret);
755
- const group = expectGroup(groupCore.getCurrentContent());
756
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
757
- const revelation = Crypto.seal({
758
- message: readKey,
759
- from: admin.currentSealerSecret(),
760
- to: admin.currentSealerID()._unsafeUnwrap(),
761
- nOnceMaterial: {
762
- in: groupCore.id,
763
- tx: groupCore.nextTransactionID(),
764
- },
765
- });
766
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
767
- group.set("readKey", readKeyID, "trusting");
768
- group.set(inviteID, "writerInvite", "trusting");
769
- expect(group.get(inviteID)).toEqual("writerInvite");
770
- const revelationForInvite = Crypto.seal({
771
- message: readKey,
772
- from: admin.currentSealerSecret(),
773
- to: Crypto.getAgentSealerID(inviteID),
774
- nOnceMaterial: {
775
- in: groupCore.id,
776
- tx: groupCore.nextTransactionID(),
777
- },
778
- });
779
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
780
- const groupAsInvite = expectGroup(groupCore
781
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
782
- .getCurrentContent());
783
- const invitedWriterSecret = Crypto.newRandomAgentSecret();
784
- const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
785
- groupAsInvite.set(invitedWriterID, "writer", "trusting");
786
- expect(groupAsInvite.get(invitedWriterID)).toEqual("writer");
787
- const readKeyAsInvite = groupAsInvite.core.getCurrentReadKey();
788
- expect(readKeyAsInvite.secret).toBeDefined();
789
- const revelation2 = Crypto.seal({
790
- message: readKeyAsInvite.secret,
791
- from: Crypto.getAgentSealerSecret(invitedWriterSecret),
792
- to: Crypto.getAgentSealerID(invitedWriterID),
793
- nOnceMaterial: {
794
- in: groupCore.id,
795
- tx: groupCore.nextTransactionID(),
796
- },
797
- });
798
- groupAsInvite.set(`${readKeyAsInvite.id}_for_${invitedWriterID}`, revelation2, "trusting");
799
- expect(groupAsInvite.get(`${readKeyAsInvite.id}_for_${invitedWriterID}`)).toEqual(revelation2);
800
- });
801
- test("Admins can create a writerInvite, which can add a writer (high-level)", async () => {
802
- const { node, group } = newGroupHighLevel();
803
- const inviteSecret = group.createInvite("writer");
804
- const invitedWriterSecret = Crypto.newRandomAgentSecret();
805
- const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
806
- const nodeAsInvitedWriter = node.testWithDifferentAccount(new ControlledAgent(invitedWriterSecret, Crypto), newRandomSessionID(invitedWriterID));
807
- await nodeAsInvitedWriter.acceptInvite(group.id, inviteSecret);
808
- const groupAsInvitedWriter = await nodeAsInvitedWriter.load(group.id);
809
- if (groupAsInvitedWriter === "unavailable") {
810
- throw new Error("groupAsInvitedAdmin is unavailable");
811
- }
812
- expect(groupAsInvitedWriter.get(invitedWriterID)).toEqual("writer");
813
- expect(groupAsInvitedWriter.core.getCurrentReadKey().secret).toBeDefined();
814
- });
815
- test("Admins can create a readerInvite, which can add a reader", () => {
816
- const { groupCore, admin } = newGroup();
817
- const inviteSecret = Crypto.newRandomAgentSecret();
818
- const inviteID = Crypto.getAgentID(inviteSecret);
819
- const group = expectGroup(groupCore.getCurrentContent());
820
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
821
- const revelation = Crypto.seal({
822
- message: readKey,
823
- from: admin.currentSealerSecret(),
824
- to: admin.currentSealerID()._unsafeUnwrap(),
825
- nOnceMaterial: {
826
- in: groupCore.id,
827
- tx: groupCore.nextTransactionID(),
828
- },
829
- });
830
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
831
- group.set("readKey", readKeyID, "trusting");
832
- group.set(inviteID, "readerInvite", "trusting");
833
- expect(group.get(inviteID)).toEqual("readerInvite");
834
- const revelationForInvite = Crypto.seal({
835
- message: readKey,
836
- from: admin.currentSealerSecret(),
837
- to: Crypto.getAgentSealerID(inviteID),
838
- nOnceMaterial: {
839
- in: groupCore.id,
840
- tx: groupCore.nextTransactionID(),
841
- },
842
- });
843
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
844
- const groupAsInvite = expectGroup(groupCore
845
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
846
- .getCurrentContent());
847
- const invitedReaderSecret = Crypto.newRandomAgentSecret();
848
- const invitedReaderID = Crypto.getAgentID(invitedReaderSecret);
849
- groupAsInvite.set(invitedReaderID, "reader", "trusting");
850
- expect(groupAsInvite.get(invitedReaderID)).toEqual("reader");
851
- const readKeyAsInvite = groupAsInvite.core.getCurrentReadKey();
852
- expect(readKeyAsInvite.secret).toBeDefined();
853
- groupAsInvite.set(`${readKeyAsInvite.id}_for_${invitedReaderID}`, revelation, "trusting");
854
- expect(groupAsInvite.get(`${readKeyAsInvite.id}_for_${invitedReaderID}`)).toEqual(revelation);
855
- });
856
- test("Admins can create a readerInvite, which can add a reader (high-level)", async () => {
857
- const { node, group } = newGroupHighLevel();
858
- const inviteSecret = group.createInvite("reader");
859
- const invitedReaderSecret = Crypto.newRandomAgentSecret();
860
- const invitedReaderID = Crypto.getAgentID(invitedReaderSecret);
861
- const nodeAsInvitedReader = node.testWithDifferentAccount(new ControlledAgent(invitedReaderSecret, Crypto), newRandomSessionID(invitedReaderID));
862
- await nodeAsInvitedReader.acceptInvite(group.id, inviteSecret);
863
- const groupAsInvitedReader = await nodeAsInvitedReader.load(group.id);
864
- if (groupAsInvitedReader === "unavailable") {
865
- throw new Error("groupAsInvitedAdmin is unavailable");
866
- }
867
- expect(groupAsInvitedReader.get(invitedReaderID)).toEqual("reader");
868
- expect(groupAsInvitedReader.core.getCurrentReadKey().secret).toBeDefined();
869
- });
870
- test("WriterInvites can not invite admins", () => {
871
- const { groupCore, admin } = newGroup();
872
- const inviteSecret = Crypto.newRandomAgentSecret();
873
- const inviteID = Crypto.getAgentID(inviteSecret);
874
- const group = expectGroup(groupCore.getCurrentContent());
875
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
876
- const revelation = Crypto.seal({
877
- message: readKey,
878
- from: admin.currentSealerSecret(),
879
- to: admin.currentSealerID()._unsafeUnwrap(),
880
- nOnceMaterial: {
881
- in: groupCore.id,
882
- tx: groupCore.nextTransactionID(),
883
- },
884
- });
885
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
886
- group.set("readKey", readKeyID, "trusting");
887
- group.set(inviteID, "writerInvite", "trusting");
888
- expect(group.get(inviteID)).toEqual("writerInvite");
889
- const revelationForInvite = Crypto.seal({
890
- message: readKey,
891
- from: admin.currentSealerSecret(),
892
- to: Crypto.getAgentSealerID(inviteID),
893
- nOnceMaterial: {
894
- in: groupCore.id,
895
- tx: groupCore.nextTransactionID(),
896
- },
897
- });
898
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
899
- const groupAsInvite = expectGroup(groupCore
900
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
901
- .getCurrentContent());
902
- const invitedAdminSecret = Crypto.newRandomAgentSecret();
903
- const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
904
- groupAsInvite.set(invitedAdminID, "admin", "trusting");
905
- expect(groupAsInvite.get(invitedAdminID)).toBeUndefined();
906
- });
907
- test("ReaderInvites can not invite admins", () => {
908
- const { groupCore, admin } = newGroup();
909
- const inviteSecret = Crypto.newRandomAgentSecret();
910
- const inviteID = Crypto.getAgentID(inviteSecret);
911
- const group = expectGroup(groupCore.getCurrentContent());
912
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
913
- const revelation = Crypto.seal({
914
- message: readKey,
915
- from: admin.currentSealerSecret(),
916
- to: admin.currentSealerID()._unsafeUnwrap(),
917
- nOnceMaterial: {
918
- in: groupCore.id,
919
- tx: groupCore.nextTransactionID(),
920
- },
921
- });
922
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
923
- group.set("readKey", readKeyID, "trusting");
924
- group.set(inviteID, "readerInvite", "trusting");
925
- expect(group.get(inviteID)).toEqual("readerInvite");
926
- const revelationForInvite = Crypto.seal({
927
- message: readKey,
928
- from: admin.currentSealerSecret(),
929
- to: Crypto.getAgentSealerID(inviteID),
930
- nOnceMaterial: {
931
- in: groupCore.id,
932
- tx: groupCore.nextTransactionID(),
933
- },
934
- });
935
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
936
- const groupAsInvite = expectGroup(groupCore
937
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
938
- .getCurrentContent());
939
- const invitedAdminSecret = Crypto.newRandomAgentSecret();
940
- const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
941
- groupAsInvite.set(invitedAdminID, "admin", "trusting");
942
- expect(groupAsInvite.get(invitedAdminID)).toBeUndefined();
943
- });
944
- test("ReaderInvites can not invite writers", () => {
945
- const { groupCore, admin } = newGroup();
946
- const inviteSecret = Crypto.newRandomAgentSecret();
947
- const inviteID = Crypto.getAgentID(inviteSecret);
948
- const group = expectGroup(groupCore.getCurrentContent());
949
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
950
- const revelation = Crypto.seal({
951
- message: readKey,
952
- from: admin.currentSealerSecret(),
953
- to: admin.currentSealerID()._unsafeUnwrap(),
954
- nOnceMaterial: {
955
- in: groupCore.id,
956
- tx: groupCore.nextTransactionID(),
957
- },
958
- });
959
- group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
960
- group.set("readKey", readKeyID, "trusting");
961
- group.set(inviteID, "readerInvite", "trusting");
962
- expect(group.get(inviteID)).toEqual("readerInvite");
963
- const revelationForInvite = Crypto.seal({
964
- message: readKey,
965
- from: admin.currentSealerSecret(),
966
- to: Crypto.getAgentSealerID(inviteID),
967
- nOnceMaterial: {
968
- in: groupCore.id,
969
- tx: groupCore.nextTransactionID(),
970
- },
971
- });
972
- group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
973
- const groupAsInvite = expectGroup(groupCore
974
- .testWithDifferentAccount(new ControlledAgent(inviteSecret, Crypto), newRandomSessionID(inviteID))
975
- .getCurrentContent());
976
- const invitedWriterSecret = Crypto.newRandomAgentSecret();
977
- const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
978
- groupAsInvite.set(invitedWriterID, "writer", "trusting");
979
- expect(groupAsInvite.get(invitedWriterID)).toBeUndefined();
980
- });
981
- test("Can give read permission to 'everyone'", () => {
982
- const { node, groupCore } = newGroup();
983
- const childObject = node.createCoValue({
984
- type: "comap",
985
- ruleset: { type: "ownedByGroup", group: groupCore.id },
986
- meta: null,
987
- ...Crypto.createdNowUnique(),
988
- });
989
- const group = expectGroup(groupCore.getCurrentContent());
990
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
991
- group.set("everyone", "reader", "trusting");
992
- group.set("readKey", readKeyID, "trusting");
993
- group.set(`${readKeyID}_for_everyone`, readKey, "trusting");
994
- const childContent = expectMap(childObject.getCurrentContent());
995
- expect(childContent.get("foo")).toBeUndefined();
996
- childContent.set("foo", "bar", "private");
997
- expect(childContent.get("foo")).toEqual("bar");
998
- const newAccount = new ControlledAgent(Crypto.newRandomAgentSecret(), Crypto);
999
- const childContent2 = expectMap(childObject
1000
- .testWithDifferentAccount(newAccount, newRandomSessionID(newAccount.currentAgentID()._unsafeUnwrap()))
1001
- .getCurrentContent());
1002
- expect(childContent2.get("foo")).toEqual("bar");
1003
- });
1004
- test("Can give read permissions to 'everyone' (high-level)", async () => {
1005
- const { group } = newGroupHighLevel();
1006
- const childObject = group.createMap();
1007
- expect(childObject.get("foo")).toBeUndefined();
1008
- group.addMember("everyone", "reader");
1009
- childObject.set("foo", "bar", "private");
1010
- expect(childObject.get("foo")).toEqual("bar");
1011
- const newAccount = new ControlledAgent(Crypto.newRandomAgentSecret(), Crypto);
1012
- const childContent2 = expectMap(childObject.core
1013
- .testWithDifferentAccount(new ControlledAgent(Crypto.newRandomAgentSecret(), Crypto), newRandomSessionID(newAccount.currentAgentID()._unsafeUnwrap()))
1014
- .getCurrentContent());
1015
- expect(childContent2.get("foo")).toEqual("bar");
1016
- });
1017
- test("Can give write permission to 'everyone'", async () => {
1018
- const { node, groupCore } = newGroup();
1019
- const childObject = node.createCoValue({
1020
- type: "comap",
1021
- ruleset: { type: "ownedByGroup", group: groupCore.id },
1022
- meta: null,
1023
- ...Crypto.createdNowUnique(),
1024
- });
1025
- const group = expectGroup(groupCore.getCurrentContent());
1026
- const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
1027
- group.set("everyone", "writer", "trusting");
1028
- group.set("readKey", readKeyID, "trusting");
1029
- group.set(`${readKeyID}_for_everyone`, readKey, "trusting");
1030
- const childContent = expectMap(childObject.getCurrentContent());
1031
- expect(childContent.get("foo")).toBeUndefined();
1032
- childContent.set("foo", "bar", "private");
1033
- expect(childContent.get("foo")).toEqual("bar");
1034
- const newAccount = new ControlledAgent(Crypto.newRandomAgentSecret(), Crypto);
1035
- const childContent2 = expectMap(childObject
1036
- .testWithDifferentAccount(newAccount, newRandomSessionID(newAccount.currentAgentID()._unsafeUnwrap()))
1037
- .getCurrentContent());
1038
- // TODO: resolve race condition
1039
- await new Promise((resolve) => setTimeout(resolve, 50));
1040
- expect(childContent2.get("foo")).toEqual("bar");
1041
- childContent2.set("foo", "bar2", "private");
1042
- expect(childContent2.get("foo")).toEqual("bar2");
1043
- });
1044
- test("Can give write permissions to 'everyone' (high-level)", async () => {
1045
- const { group } = newGroupHighLevel();
1046
- const childObject = group.createMap();
1047
- expect(childObject.get("foo")).toBeUndefined();
1048
- group.addMember("everyone", "writer");
1049
- childObject.set("foo", "bar", "private");
1050
- expect(childObject.get("foo")).toEqual("bar");
1051
- const newAccount = new ControlledAgent(Crypto.newRandomAgentSecret(), Crypto);
1052
- const childContent2 = expectMap(childObject.core
1053
- .testWithDifferentAccount(newAccount, newRandomSessionID(newAccount.currentAgentID()._unsafeUnwrap()))
1054
- .getCurrentContent());
1055
- expect(childContent2.get("foo")).toEqual("bar");
1056
- console.log("Before anon set");
1057
- childContent2.set("foo", "bar2", "private");
1058
- expect(childContent2.get("foo")).toEqual("bar2");
1059
- });
1060
- //# sourceMappingURL=permissions.test.js.map