cojson 0.9.23 → 0.10.1

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 (216) hide show
  1. package/.turbo/turbo-build.log +2 -10
  2. package/CHANGELOG.md +20 -0
  3. package/dist/CoValuesStore.js.map +1 -0
  4. package/dist/PeerKnownStates.js.map +1 -0
  5. package/dist/PeerState.js.map +1 -0
  6. package/dist/PriorityBasedMessageQueue.js.map +1 -0
  7. package/dist/SyncStateManager.js.map +1 -0
  8. package/dist/base64url.js.map +1 -0
  9. package/dist/base64url.test.js.map +1 -0
  10. package/dist/coValue.js.map +1 -0
  11. package/dist/coValueCore.js.map +1 -0
  12. package/dist/{native/coValueState.js → coValueState.js} +6 -4
  13. package/dist/coValueState.js.map +1 -0
  14. package/dist/coValues/account.js.map +1 -0
  15. package/dist/coValues/coList.js.map +1 -0
  16. package/dist/coValues/coMap.js.map +1 -0
  17. package/dist/coValues/coPlainText.js.map +1 -0
  18. package/dist/coValues/coStream.js.map +1 -0
  19. package/dist/{web/coValues → coValues}/group.js +22 -19
  20. package/dist/coValues/group.js.map +1 -0
  21. package/dist/coreToCoValue.js.map +1 -0
  22. package/dist/crypto/PureJSCrypto.js.map +1 -0
  23. package/dist/{native/crypto → crypto}/WasmCrypto.js +1 -16
  24. package/dist/crypto/WasmCrypto.js.map +1 -0
  25. package/dist/crypto/crypto.js.map +1 -0
  26. package/dist/{native/exports.js → exports.js} +2 -0
  27. package/dist/exports.js.map +1 -0
  28. package/dist/ids.js.map +1 -0
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/jsonStringify.js.map +1 -0
  32. package/dist/{native/jsonValue.js.map → jsonValue.js.map} +1 -1
  33. package/dist/localNode.js.map +1 -0
  34. package/dist/logger.js.map +1 -0
  35. package/dist/media.js.map +1 -0
  36. package/dist/{native/permissions.js → permissions.js} +10 -5
  37. package/dist/permissions.js.map +1 -0
  38. package/dist/priority.js.map +1 -0
  39. package/dist/storage/FileSystem.js.map +1 -0
  40. package/dist/storage/chunksAndKnownStates.js.map +1 -0
  41. package/dist/storage/index.js.map +1 -0
  42. package/dist/streamUtils.js.map +1 -0
  43. package/dist/sync.js.map +1 -0
  44. package/dist/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -0
  45. package/dist/typeUtils/expectGroup.js.map +1 -0
  46. package/dist/typeUtils/isAccountID.js.map +1 -0
  47. package/dist/typeUtils/isCoValue.js.map +1 -0
  48. package/package.json +21 -24
  49. package/src/coValueState.ts +6 -4
  50. package/src/coValues/group.ts +38 -27
  51. package/src/crypto/WasmCrypto.ts +3 -17
  52. package/src/exports.ts +3 -0
  53. package/src/index.ts +1 -0
  54. package/src/permissions.ts +15 -3
  55. package/src/tests/coValueState.test.ts +44 -22
  56. package/src/tests/group.test.ts +230 -27
  57. package/tsconfig.json +3 -1
  58. package/dist/native/CoValuesStore.js.map +0 -1
  59. package/dist/native/PeerKnownStates.js.map +0 -1
  60. package/dist/native/PeerState.js.map +0 -1
  61. package/dist/native/PriorityBasedMessageQueue.js.map +0 -1
  62. package/dist/native/SyncStateManager.js.map +0 -1
  63. package/dist/native/base64url.js.map +0 -1
  64. package/dist/native/base64url.test.js.map +0 -1
  65. package/dist/native/coValue.js.map +0 -1
  66. package/dist/native/coValueCore.js.map +0 -1
  67. package/dist/native/coValueState.js.map +0 -1
  68. package/dist/native/coValues/account.js.map +0 -1
  69. package/dist/native/coValues/coList.js.map +0 -1
  70. package/dist/native/coValues/coMap.js.map +0 -1
  71. package/dist/native/coValues/coPlainText.js.map +0 -1
  72. package/dist/native/coValues/coStream.js.map +0 -1
  73. package/dist/native/coValues/group.js +0 -519
  74. package/dist/native/coValues/group.js.map +0 -1
  75. package/dist/native/coreToCoValue.js.map +0 -1
  76. package/dist/native/crypto/PureJSCrypto.js.map +0 -1
  77. package/dist/native/crypto/WasmCrypto.js.map +0 -1
  78. package/dist/native/crypto/crypto.js.map +0 -1
  79. package/dist/native/crypto/export.js +0 -3
  80. package/dist/native/crypto/export.js.map +0 -1
  81. package/dist/native/exports.js.map +0 -1
  82. package/dist/native/ids.js.map +0 -1
  83. package/dist/native/index.native.js +0 -3
  84. package/dist/native/index.native.js.map +0 -1
  85. package/dist/native/jsonStringify.js.map +0 -1
  86. package/dist/native/localNode.js.map +0 -1
  87. package/dist/native/logger.js.map +0 -1
  88. package/dist/native/media.js.map +0 -1
  89. package/dist/native/permissions.js.map +0 -1
  90. package/dist/native/priority.js.map +0 -1
  91. package/dist/native/storage/FileSystem.js.map +0 -1
  92. package/dist/native/storage/chunksAndKnownStates.js.map +0 -1
  93. package/dist/native/storage/index.js.map +0 -1
  94. package/dist/native/streamUtils.js.map +0 -1
  95. package/dist/native/sync.js.map +0 -1
  96. package/dist/native/typeUtils/accountOrAgentIDfromSessionID.js.map +0 -1
  97. package/dist/native/typeUtils/expectGroup.js.map +0 -1
  98. package/dist/native/typeUtils/isAccountID.js.map +0 -1
  99. package/dist/native/typeUtils/isCoValue.js.map +0 -1
  100. package/dist/web/CoValuesStore.js +0 -31
  101. package/dist/web/CoValuesStore.js.map +0 -1
  102. package/dist/web/PeerKnownStates.js +0 -68
  103. package/dist/web/PeerKnownStates.js.map +0 -1
  104. package/dist/web/PeerState.js +0 -103
  105. package/dist/web/PeerState.js.map +0 -1
  106. package/dist/web/PriorityBasedMessageQueue.js +0 -98
  107. package/dist/web/PriorityBasedMessageQueue.js.map +0 -1
  108. package/dist/web/SyncStateManager.js +0 -94
  109. package/dist/web/SyncStateManager.js.map +0 -1
  110. package/dist/web/base64url.js +0 -53
  111. package/dist/web/base64url.js.map +0 -1
  112. package/dist/web/base64url.test.js +0 -25
  113. package/dist/web/base64url.test.js.map +0 -1
  114. package/dist/web/coValue.js +0 -52
  115. package/dist/web/coValue.js.map +0 -1
  116. package/dist/web/coValueCore.js +0 -597
  117. package/dist/web/coValueCore.js.map +0 -1
  118. package/dist/web/coValueState.js +0 -265
  119. package/dist/web/coValueState.js.map +0 -1
  120. package/dist/web/coValues/account.js +0 -100
  121. package/dist/web/coValues/account.js.map +0 -1
  122. package/dist/web/coValues/coList.js +0 -381
  123. package/dist/web/coValues/coList.js.map +0 -1
  124. package/dist/web/coValues/coMap.js +0 -273
  125. package/dist/web/coValues/coMap.js.map +0 -1
  126. package/dist/web/coValues/coPlainText.js +0 -86
  127. package/dist/web/coValues/coPlainText.js.map +0 -1
  128. package/dist/web/coValues/coStream.js +0 -224
  129. package/dist/web/coValues/coStream.js.map +0 -1
  130. package/dist/web/coValues/group.js.map +0 -1
  131. package/dist/web/coreToCoValue.js +0 -46
  132. package/dist/web/coreToCoValue.js.map +0 -1
  133. package/dist/web/crypto/PureJSCrypto.js +0 -94
  134. package/dist/web/crypto/PureJSCrypto.js.map +0 -1
  135. package/dist/web/crypto/WasmCrypto.js +0 -130
  136. package/dist/web/crypto/WasmCrypto.js.map +0 -1
  137. package/dist/web/crypto/crypto.js +0 -152
  138. package/dist/web/crypto/crypto.js.map +0 -1
  139. package/dist/web/crypto/export.js +0 -3
  140. package/dist/web/crypto/export.js.map +0 -1
  141. package/dist/web/exports.js +0 -46
  142. package/dist/web/exports.js.map +0 -1
  143. package/dist/web/ids.js +0 -50
  144. package/dist/web/ids.js.map +0 -1
  145. package/dist/web/index.web.js +0 -3
  146. package/dist/web/index.web.js.map +0 -1
  147. package/dist/web/jsonStringify.js +0 -57
  148. package/dist/web/jsonStringify.js.map +0 -1
  149. package/dist/web/jsonValue.js +0 -2
  150. package/dist/web/jsonValue.js.map +0 -1
  151. package/dist/web/localNode.js +0 -412
  152. package/dist/web/localNode.js.map +0 -1
  153. package/dist/web/logger.js +0 -58
  154. package/dist/web/logger.js.map +0 -1
  155. package/dist/web/media.js +0 -2
  156. package/dist/web/media.js.map +0 -1
  157. package/dist/web/permissions.js +0 -336
  158. package/dist/web/permissions.js.map +0 -1
  159. package/dist/web/priority.js +0 -31
  160. package/dist/web/priority.js.map +0 -1
  161. package/dist/web/storage/FileSystem.js +0 -48
  162. package/dist/web/storage/FileSystem.js.map +0 -1
  163. package/dist/web/storage/chunksAndKnownStates.js +0 -98
  164. package/dist/web/storage/chunksAndKnownStates.js.map +0 -1
  165. package/dist/web/storage/index.js +0 -336
  166. package/dist/web/storage/index.js.map +0 -1
  167. package/dist/web/streamUtils.js +0 -41
  168. package/dist/web/streamUtils.js.map +0 -1
  169. package/dist/web/sync.js +0 -555
  170. package/dist/web/sync.js.map +0 -1
  171. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js +0 -5
  172. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js.map +0 -1
  173. package/dist/web/typeUtils/expectGroup.js +0 -13
  174. package/dist/web/typeUtils/expectGroup.js.map +0 -1
  175. package/dist/web/typeUtils/isAccountID.js +0 -4
  176. package/dist/web/typeUtils/isAccountID.js.map +0 -1
  177. package/dist/web/typeUtils/isCoValue.js +0 -11
  178. package/dist/web/typeUtils/isCoValue.js.map +0 -1
  179. package/src/crypto/export.ts +0 -2
  180. package/src/index.native.ts +0 -2
  181. package/src/index.web.ts +0 -2
  182. package/tsconfig.native.json +0 -10
  183. package/tsconfig.web.json +0 -5
  184. /package/dist/{native/CoValuesStore.js → CoValuesStore.js} +0 -0
  185. /package/dist/{native/PeerKnownStates.js → PeerKnownStates.js} +0 -0
  186. /package/dist/{native/PeerState.js → PeerState.js} +0 -0
  187. /package/dist/{native/PriorityBasedMessageQueue.js → PriorityBasedMessageQueue.js} +0 -0
  188. /package/dist/{native/SyncStateManager.js → SyncStateManager.js} +0 -0
  189. /package/dist/{native/base64url.js → base64url.js} +0 -0
  190. /package/dist/{native/base64url.test.js → base64url.test.js} +0 -0
  191. /package/dist/{native/coValue.js → coValue.js} +0 -0
  192. /package/dist/{native/coValueCore.js → coValueCore.js} +0 -0
  193. /package/dist/{native/coValues → coValues}/account.js +0 -0
  194. /package/dist/{native/coValues → coValues}/coList.js +0 -0
  195. /package/dist/{native/coValues → coValues}/coMap.js +0 -0
  196. /package/dist/{native/coValues → coValues}/coPlainText.js +0 -0
  197. /package/dist/{native/coValues → coValues}/coStream.js +0 -0
  198. /package/dist/{native/coreToCoValue.js → coreToCoValue.js} +0 -0
  199. /package/dist/{native/crypto → crypto}/PureJSCrypto.js +0 -0
  200. /package/dist/{native/crypto → crypto}/crypto.js +0 -0
  201. /package/dist/{native/ids.js → ids.js} +0 -0
  202. /package/dist/{native/jsonStringify.js → jsonStringify.js} +0 -0
  203. /package/dist/{native/jsonValue.js → jsonValue.js} +0 -0
  204. /package/dist/{native/localNode.js → localNode.js} +0 -0
  205. /package/dist/{native/logger.js → logger.js} +0 -0
  206. /package/dist/{native/media.js → media.js} +0 -0
  207. /package/dist/{native/priority.js → priority.js} +0 -0
  208. /package/dist/{native/storage → storage}/FileSystem.js +0 -0
  209. /package/dist/{native/storage → storage}/chunksAndKnownStates.js +0 -0
  210. /package/dist/{native/storage → storage}/index.js +0 -0
  211. /package/dist/{native/streamUtils.js → streamUtils.js} +0 -0
  212. /package/dist/{native/sync.js → sync.js} +0 -0
  213. /package/dist/{native/typeUtils → typeUtils}/accountOrAgentIDfromSessionID.js +0 -0
  214. /package/dist/{native/typeUtils → typeUtils}/expectGroup.js +0 -0
  215. /package/dist/{native/typeUtils → typeUtils}/isAccountID.js +0 -0
  216. /package/dist/{native/typeUtils → typeUtils}/isCoValue.js +0 -0
@@ -1,336 +0,0 @@
1
- import { RawAccount } from "./coValues/account.js";
2
- import { EVERYONE } from "./coValues/group.js";
3
- import { getParentGroupId, } from "./ids.js";
4
- import { parseJSON } from "./jsonStringify.js";
5
- import { logger } from "./logger.js";
6
- import { accountOrAgentIDfromSessionID } from "./typeUtils/accountOrAgentIDfromSessionID.js";
7
- import { expectGroup } from "./typeUtils/expectGroup.js";
8
- let logPermissionErrors = true;
9
- export function disablePermissionErrors() {
10
- logPermissionErrors = false;
11
- }
12
- function logPermissionError(message, attributes) {
13
- if (logPermissionErrors === false) {
14
- return;
15
- }
16
- logger.warn("Permission error: " + message, attributes);
17
- }
18
- export function determineValidTransactions(coValue) {
19
- if (coValue.header.ruleset.type === "group") {
20
- const initialAdmin = coValue.header.ruleset.initialAdmin;
21
- if (!initialAdmin) {
22
- throw new Error("Group must have initialAdmin");
23
- }
24
- return determineValidTransactionsForGroup(coValue, initialAdmin)
25
- .validTransactions;
26
- }
27
- else if (coValue.header.ruleset.type === "ownedByGroup") {
28
- const groupContent = expectGroup(coValue.node
29
- .expectCoValueLoaded(coValue.header.ruleset.group, "Determining valid transaction in owned object but its group wasn't loaded")
30
- .getCurrentContent());
31
- if (groupContent.type !== "comap") {
32
- throw new Error("Group must be a map");
33
- }
34
- const validTransactions = [];
35
- for (const [sessionID, sessionLog] of coValue.sessionLogs.entries()) {
36
- const transactor = accountOrAgentIDfromSessionID(sessionID);
37
- sessionLog.transactions.forEach((tx, txIndex) => {
38
- const groupAtTime = groupContent.atTime(tx.madeAt);
39
- const effectiveTransactor = agentInAccountOrMemberInGroup(transactor, groupAtTime);
40
- if (!effectiveTransactor) {
41
- return;
42
- }
43
- const transactorRoleAtTxTime = groupAtTime.roleOfInternal(effectiveTransactor)?.role ||
44
- groupAtTime.roleOfInternal(EVERYONE)?.role;
45
- if (transactorRoleAtTxTime !== "admin" &&
46
- transactorRoleAtTxTime !== "writer" &&
47
- transactorRoleAtTxTime !== "writeOnly") {
48
- return;
49
- }
50
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
51
- });
52
- }
53
- return validTransactions;
54
- }
55
- else if (coValue.header.ruleset.type === "unsafeAllowAll") {
56
- const validTransactions = [];
57
- for (const [sessionID, sessionLog] of coValue.sessionLogs.entries()) {
58
- sessionLog.transactions.forEach((tx, txIndex) => {
59
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
60
- });
61
- }
62
- return validTransactions;
63
- }
64
- else {
65
- throw new Error("Unknown ruleset type " +
66
- coValue.header.ruleset.type);
67
- }
68
- }
69
- function isHigherRole(a, b) {
70
- if (a === undefined)
71
- return false;
72
- if (b === undefined)
73
- return true;
74
- if (b === "admin")
75
- return false;
76
- if (a === "admin")
77
- return true;
78
- return a === "writer" && b === "reader";
79
- }
80
- function resolveMemberStateFromParentReference(coValue, memberState, parentReference, extendChain) {
81
- const parentGroup = coValue.node.expectCoValueLoaded(getParentGroupId(parentReference), "Expected parent group to be loaded");
82
- if (parentGroup.header.ruleset.type !== "group") {
83
- return;
84
- }
85
- // Skip circular references
86
- if (extendChain.has(parentGroup.id)) {
87
- return;
88
- }
89
- const initialAdmin = parentGroup.header.ruleset.initialAdmin;
90
- if (!initialAdmin) {
91
- throw new Error("Group must have initialAdmin");
92
- }
93
- extendChain.add(parentGroup.id);
94
- const { memberState: parentGroupMemberState } = determineValidTransactionsForGroup(parentGroup, initialAdmin, extendChain);
95
- for (const agent of Object.keys(parentGroupMemberState)) {
96
- const parentRole = parentGroupMemberState[agent];
97
- const currentRole = memberState[agent];
98
- if (parentRole && isHigherRole(parentRole, currentRole)) {
99
- memberState[agent] = parentRole;
100
- }
101
- }
102
- }
103
- function determineValidTransactionsForGroup(coValue, initialAdmin, extendChain) {
104
- const allTransactionsSorted = [];
105
- for (const [sessionID, sessionLog] of coValue.sessionLogs.entries()) {
106
- sessionLog.transactions.forEach((tx, txIndex) => {
107
- allTransactionsSorted.push({ sessionID, txIndex, tx });
108
- });
109
- }
110
- allTransactionsSorted.sort((a, b) => {
111
- return a.tx.madeAt - b.tx.madeAt;
112
- });
113
- const memberState = {};
114
- const validTransactions = [];
115
- const keyRevelations = new Set();
116
- const writeKeys = new Set();
117
- for (const { sessionID, txIndex, tx } of allTransactionsSorted) {
118
- const transactor = accountOrAgentIDfromSessionID(sessionID);
119
- if (tx.privacy === "private") {
120
- if (memberState[transactor] === "admin") {
121
- validTransactions.push({
122
- txID: { sessionID, txIndex },
123
- tx,
124
- });
125
- continue;
126
- }
127
- else {
128
- logPermissionError("Only admins can make private transactions in groups");
129
- continue;
130
- }
131
- }
132
- let changes;
133
- try {
134
- changes = parseJSON(tx.changes);
135
- }
136
- catch (e) {
137
- logPermissionError("Invalid JSON in transaction", {
138
- id: coValue.id,
139
- tx,
140
- });
141
- continue;
142
- }
143
- const change = changes[0];
144
- if (changes.length !== 1) {
145
- logPermissionError("Group transaction must have exactly one change");
146
- continue;
147
- }
148
- if (change.op !== "set") {
149
- logPermissionError("Group transaction must set a role or readKey");
150
- continue;
151
- }
152
- if (change.key === "readKey") {
153
- if (memberState[transactor] !== "admin") {
154
- logPermissionError("Only admins can set readKeys");
155
- continue;
156
- }
157
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
158
- continue;
159
- }
160
- else if (change.key === "profile") {
161
- if (memberState[transactor] !== "admin") {
162
- logPermissionError("Only admins can set profile");
163
- continue;
164
- }
165
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
166
- continue;
167
- }
168
- else if (isKeyForKeyField(change.key) ||
169
- isKeyForAccountField(change.key)) {
170
- if (memberState[transactor] !== "admin" &&
171
- memberState[transactor] !== "adminInvite" &&
172
- memberState[transactor] !== "writerInvite" &&
173
- memberState[transactor] !== "readerInvite" &&
174
- memberState[transactor] !== "writeOnlyInvite") {
175
- logPermissionError("Only admins can reveal keys");
176
- continue;
177
- }
178
- /**
179
- * We don't want to give the ability to invite members to override
180
- * key revelations, otherwise they could hide a key revelation to any user
181
- * blocking them from accessing the group.
182
- */
183
- if (keyRevelations.has(change.key) &&
184
- memberState[transactor] !== "admin") {
185
- logPermissionError("Key revelation already exists and can't be overridden by invite");
186
- continue;
187
- }
188
- keyRevelations.add(change.key);
189
- // TODO: check validity of agents who the key is revealed to?
190
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
191
- continue;
192
- }
193
- else if (isParentExtension(change.key)) {
194
- if (memberState[transactor] !== "admin") {
195
- logPermissionError("Only admins can set parent extensions");
196
- continue;
197
- }
198
- extendChain = extendChain ?? new Set([]);
199
- resolveMemberStateFromParentReference(coValue, memberState, change.key, extendChain);
200
- // Circular reference detected, drop all the transactions involved
201
- if (extendChain.has(coValue.id)) {
202
- logPermissionError("Circular extend detected, dropping the transaction");
203
- continue;
204
- }
205
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
206
- continue;
207
- }
208
- else if (isChildExtension(change.key)) {
209
- if (memberState[transactor] !== "admin" &&
210
- memberState[transactor] !== "writer" &&
211
- memberState[transactor] !== "reader" &&
212
- memberState[transactor] !== "writeOnly") {
213
- logPermissionError("Only admins, writers, readers and writeOnly can set child extensions");
214
- continue;
215
- }
216
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
217
- continue;
218
- }
219
- else if (isWriteKeyForMember(change.key)) {
220
- if (memberState[transactor] !== "admin" &&
221
- memberState[transactor] !== "writeOnlyInvite") {
222
- logPermissionError("Only admins can set writeKeys");
223
- continue;
224
- }
225
- /**
226
- * writeOnlyInvite need to be able to set writeKeys because every new writeOnly
227
- * member comes with their own write key.
228
- *
229
- * We don't want to give the ability to invite members to override
230
- * write keys, otherwise they could hide a write key to other writeOnly users
231
- * blocking them from accessing the group.ß
232
- */
233
- if (writeKeys.has(change.key) && memberState[transactor] !== "admin") {
234
- logPermissionError("Write key already exists and can't be overridden by invite");
235
- continue;
236
- }
237
- writeKeys.add(change.key);
238
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
239
- continue;
240
- }
241
- const affectedMember = change.key;
242
- const assignedRole = change.value;
243
- if (change.value !== "admin" &&
244
- change.value !== "writer" &&
245
- change.value !== "reader" &&
246
- change.value !== "writeOnly" &&
247
- change.value !== "revoked" &&
248
- change.value !== "adminInvite" &&
249
- change.value !== "writerInvite" &&
250
- change.value !== "readerInvite" &&
251
- change.value !== "writeOnlyInvite") {
252
- logPermissionError("Group transaction must set a valid role");
253
- continue;
254
- }
255
- if (affectedMember === EVERYONE &&
256
- !(change.value === "reader" ||
257
- change.value === "writer" ||
258
- change.value === "revoked")) {
259
- logPermissionError("Everyone can only be set to reader, writer or revoked");
260
- continue;
261
- }
262
- const isFirstSelfAppointment = !memberState[transactor] &&
263
- transactor === initialAdmin &&
264
- change.op === "set" &&
265
- change.key === transactor &&
266
- change.value === "admin";
267
- if (!isFirstSelfAppointment) {
268
- if (memberState[transactor] === "admin") {
269
- if (memberState[affectedMember] === "admin" &&
270
- affectedMember !== transactor &&
271
- assignedRole !== "admin") {
272
- logPermissionError("Admins can only demote themselves.");
273
- continue;
274
- }
275
- }
276
- else if (memberState[transactor] === "adminInvite") {
277
- if (change.value !== "admin") {
278
- logPermissionError("AdminInvites can only create admins.");
279
- continue;
280
- }
281
- }
282
- else if (memberState[transactor] === "writerInvite") {
283
- if (change.value !== "writer") {
284
- logPermissionError("WriterInvites can only create writers.");
285
- continue;
286
- }
287
- }
288
- else if (memberState[transactor] === "readerInvite") {
289
- if (change.value !== "reader") {
290
- logPermissionError("ReaderInvites can only create reader.");
291
- continue;
292
- }
293
- }
294
- else if (memberState[transactor] === "writeOnlyInvite") {
295
- if (change.value !== "writeOnly") {
296
- logPermissionError("WriteOnlyInvites can only create writeOnly.");
297
- continue;
298
- }
299
- }
300
- else {
301
- logPermissionError("Group transaction must be made by current admin or invite");
302
- continue;
303
- }
304
- }
305
- memberState[affectedMember] = change.value;
306
- validTransactions.push({ txID: { sessionID, txIndex }, tx });
307
- }
308
- return { validTransactions, memberState };
309
- }
310
- function agentInAccountOrMemberInGroup(transactor, groupAtTime) {
311
- if (transactor === groupAtTime.id && groupAtTime instanceof RawAccount) {
312
- return groupAtTime.currentAgentID().match((agentID) => agentID, (e) => {
313
- logger.error("Error while determining current agent ID in valid transactions", e);
314
- return undefined;
315
- });
316
- }
317
- return transactor;
318
- }
319
- export function isWriteKeyForMember(co) {
320
- return co.startsWith("writeKeyFor_");
321
- }
322
- export function isKeyForKeyField(co) {
323
- return co.startsWith("key_") && co.includes("_for_key");
324
- }
325
- export function isKeyForAccountField(co) {
326
- return ((co.startsWith("key_") &&
327
- (co.includes("_for_sealer") || co.includes("_for_co"))) ||
328
- co.includes("_for_everyone"));
329
- }
330
- function isParentExtension(key) {
331
- return key.startsWith("parent_");
332
- }
333
- function isChildExtension(key) {
334
- return key.startsWith("child_");
335
- }
336
- //# sourceMappingURL=permissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- /**
2
- * The priority of a `CoValue` determines how much priority is given
3
- * to its content messages.
4
- *
5
- * The priority value is handled as weight in the weighed round robin algorithm
6
- * used to determine the order in which messages are sent.
7
- *
8
- * Follows the HTTP urgency range and order:
9
- * - https://www.rfc-editor.org/rfc/rfc9218.html#name-urgency
10
- */
11
- export const CO_VALUE_PRIORITY = {
12
- HIGH: 0,
13
- MEDIUM: 3,
14
- LOW: 6,
15
- };
16
- export function getPriorityFromHeader(header) {
17
- if (typeof header === "boolean" || !header) {
18
- return CO_VALUE_PRIORITY.MEDIUM;
19
- }
20
- if (header.meta?.type === "account") {
21
- return CO_VALUE_PRIORITY.HIGH;
22
- }
23
- if (header.ruleset.type === "group") {
24
- return CO_VALUE_PRIORITY.HIGH;
25
- }
26
- if (header.type === "costream" && header.meta?.type === "binary") {
27
- return CO_VALUE_PRIORITY.LOW;
28
- }
29
- return CO_VALUE_PRIORITY.MEDIUM;
30
- }
31
- //# sourceMappingURL=priority.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"priority.js","sourceRoot":"","sources":["../../src/priority.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACE,CAAC;AAIX,MAAM,UAAU,qBAAqB,CACnC,MAA2C;IAE3C,IAAI,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO,iBAAiB,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,iBAAiB,CAAC,GAAG,CAAC;IAC/B,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,CAAC;AAClC,CAAC"}
@@ -1,48 +0,0 @@
1
- import { StreamingHash } from "../crypto/crypto.js";
2
- export const textEncoder = new TextEncoder();
3
- export const textDecoder = new TextDecoder();
4
- export async function readChunk(handle, header, fs) {
5
- const chunkBytes = await fs.read(handle, header.start, header.length);
6
- const chunk = JSON.parse(textDecoder.decode(chunkBytes));
7
- return chunk;
8
- }
9
- export async function readHeader(filename, handle, size, fs) {
10
- const headerLength = Number(filename.match(/-H(\d+)\.jsonl$/)[1]);
11
- const headerBytes = await fs.read(handle, size - headerLength, headerLength);
12
- const header = JSON.parse(textDecoder.decode(headerBytes));
13
- return header;
14
- }
15
- export async function writeBlock(chunks, level, blockNumber, fs) {
16
- if (chunks.size === 0) {
17
- throw new Error("No chunks to write");
18
- }
19
- const blockHeader = [];
20
- let offset = 0;
21
- const file = await fs.createFile("wipBlock" + Math.random().toString(36).substring(7) + ".tmp.jsonl");
22
- const hash = new StreamingHash(fs.crypto);
23
- const chunksSortedById = Array.from(chunks).sort(([id1], [id2]) => id1.localeCompare(id2));
24
- for (const [id, chunk] of chunksSortedById) {
25
- const encodedBytes = hash.update(chunk);
26
- const encodedBytesWithNewline = new Uint8Array(encodedBytes.length + 1);
27
- encodedBytesWithNewline.set(encodedBytes);
28
- encodedBytesWithNewline[encodedBytes.length] = 10;
29
- await fs.append(file, encodedBytesWithNewline);
30
- const length = encodedBytesWithNewline.length;
31
- blockHeader.push({ id, start: offset, length });
32
- offset += length;
33
- }
34
- const headerBytes = textEncoder.encode(JSON.stringify(blockHeader));
35
- await fs.append(file, headerBytes);
36
- const filename = `L${level}-${(blockNumber + "").padStart(3, "0")}-${hash.digest().replace("hash_", "").slice(0, 15)}-H${headerBytes.length}.jsonl`;
37
- await fs.closeAndRename(file, filename);
38
- return filename;
39
- }
40
- export async function writeToWal(handle, fs, id, chunk) {
41
- const walEntry = {
42
- id,
43
- ...chunk,
44
- };
45
- const bytes = textEncoder.encode(JSON.stringify(walEntry) + "\n");
46
- return fs.append(handle, bytes);
47
- }
48
- //# sourceMappingURL=FileSystem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileSystem.js","sourceRoot":"","sources":["../../../src/storage/FileSystem.ts"],"names":[],"mappings":"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"}
@@ -1,98 +0,0 @@
1
- import { MAX_RECOMMENDED_TX_SIZE } from "../coValueCore.js";
2
- import { getPriorityFromHeader } from "../priority.js";
3
- export function contentSinceChunk(id, chunk, known) {
4
- const newContentPieces = [];
5
- newContentPieces.push({
6
- id: id,
7
- action: "content",
8
- header: known?.header ? undefined : chunk.header,
9
- new: {},
10
- priority: getPriorityFromHeader(chunk.header),
11
- });
12
- for (const [sessionID, sessionsEntry] of Object.entries(chunk.sessionEntries)) {
13
- for (const entry of sessionsEntry) {
14
- const knownStart = known?.sessions[sessionID] || 0;
15
- if (entry.after + entry.transactions.length <= knownStart) {
16
- continue;
17
- }
18
- const actuallyNewTransactions = entry.transactions.slice(Math.max(0, knownStart - entry.after));
19
- const newAfter = entry.after +
20
- (actuallyNewTransactions.length - entry.transactions.length);
21
- let newContentEntry = newContentPieces[0]?.new[sessionID];
22
- if (!newContentEntry) {
23
- newContentEntry = {
24
- after: newAfter,
25
- lastSignature: entry.lastSignature,
26
- newTransactions: actuallyNewTransactions,
27
- };
28
- newContentPieces[0].new[sessionID] = newContentEntry;
29
- }
30
- else {
31
- newContentEntry.newTransactions.push(...actuallyNewTransactions);
32
- newContentEntry.lastSignature = entry.lastSignature;
33
- }
34
- }
35
- }
36
- return newContentPieces;
37
- }
38
- export function chunkToKnownState(id, chunk) {
39
- const ourKnown = {
40
- id,
41
- header: !!chunk.header,
42
- sessions: {},
43
- };
44
- for (const [sessionID, sessionEntries] of Object.entries(chunk.sessionEntries)) {
45
- for (const entry of sessionEntries) {
46
- ourKnown.sessions[sessionID] =
47
- entry.after + entry.transactions.length;
48
- }
49
- }
50
- return ourKnown;
51
- }
52
- export function mergeChunks(chunkA, chunkB) {
53
- const header = chunkA.header || chunkB.header;
54
- const newSessions = { ...chunkA.sessionEntries };
55
- for (const sessionID in chunkB.sessionEntries) {
56
- // figure out if we can merge the chunks
57
- const sessionEntriesA = chunkA.sessionEntries[sessionID];
58
- const sessionEntriesB = chunkB.sessionEntries[sessionID];
59
- if (!sessionEntriesA) {
60
- newSessions[sessionID] = sessionEntriesB;
61
- continue;
62
- }
63
- const lastEntryOfA = sessionEntriesA[sessionEntriesA.length - 1];
64
- const firstEntryOfB = sessionEntriesB[0];
65
- if (lastEntryOfA.after + lastEntryOfA.transactions.length ===
66
- firstEntryOfB.after) {
67
- const newEntries = [];
68
- let bytesSinceLastSignature = 0;
69
- for (const entry of sessionEntriesA.concat(sessionEntriesB)) {
70
- const entryByteLength = entry.transactions.reduce((sum, tx) => sum +
71
- (tx.privacy === "private"
72
- ? tx.encryptedChanges.length
73
- : tx.changes.length), 0);
74
- if (newEntries.length === 0 ||
75
- bytesSinceLastSignature + entryByteLength > MAX_RECOMMENDED_TX_SIZE) {
76
- newEntries.push({
77
- after: entry.after,
78
- lastSignature: entry.lastSignature,
79
- transactions: entry.transactions,
80
- });
81
- bytesSinceLastSignature = 0;
82
- }
83
- else {
84
- const lastNewEntry = newEntries[newEntries.length - 1];
85
- lastNewEntry.transactions.push(...entry.transactions);
86
- lastNewEntry.lastSignature = entry.lastSignature;
87
- bytesSinceLastSignature += entry.transactions.length;
88
- }
89
- }
90
- newSessions[sessionID] = newEntries;
91
- }
92
- else {
93
- return "nonContigous";
94
- }
95
- }
96
- return { header, sessionEntries: newSessions };
97
- }
98
- //# sourceMappingURL=chunksAndKnownStates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunksAndKnownStates.js","sourceRoot":"","sources":["../../../src/storage/chunksAndKnownStates.ts"],"names":[],"mappings":"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"}