cojson 0.13.23 → 0.13.27
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +12 -0
- package/dist/coValueCore/coValueCore.d.ts +1 -0
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +2 -1
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +3 -1
- package/dist/coValues/group.js.map +1 -1
- package/dist/exports.d.ts +1 -0
- package/dist/exports.d.ts.map +1 -1
- package/dist/localNode.d.ts +1 -0
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +15 -11
- package/dist/localNode.js.map +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +3 -1
- package/dist/permissions.js.map +1 -1
- package/dist/sync.js +5 -5
- package/dist/sync.js.map +1 -1
- package/dist/tests/group.removeMember.test.d.ts +2 -0
- package/dist/tests/group.removeMember.test.d.ts.map +1 -0
- package/dist/tests/group.removeMember.test.js +133 -0
- package/dist/tests/group.removeMember.test.js.map +1 -0
- package/dist/tests/sync.test.js +1 -1
- package/dist/tests/sync.test.js.map +1 -1
- package/package.json +1 -1
- package/src/coValueCore/coValueCore.ts +2 -1
- package/src/coValues/group.ts +4 -1
- package/src/localNode.ts +22 -12
- package/src/permissions.ts +6 -1
- package/src/sync.ts +6 -6
- package/src/tests/group.removeMember.test.ts +255 -0
- package/src/tests/sync.test.ts +1 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test } from "vitest";
|
|
2
|
+
import { RawCoList } from "../coValues/coList.js";
|
|
3
|
+
import { RawCoMap } from "../coValues/coMap.js";
|
|
4
|
+
import { RawCoStream } from "../coValues/coStream.js";
|
|
5
|
+
import { RawBinaryCoStream } from "../coValues/coStream.js";
|
|
6
|
+
import { WasmCrypto } from "../crypto/WasmCrypto.js";
|
|
7
|
+
import { RawAccountID } from "../exports.js";
|
|
8
|
+
import {
|
|
9
|
+
SyncMessagesLog,
|
|
10
|
+
createTwoConnectedNodes,
|
|
11
|
+
loadCoValueOrFail,
|
|
12
|
+
setupTestAccount,
|
|
13
|
+
setupTestNode,
|
|
14
|
+
} from "./testUtils.js";
|
|
15
|
+
|
|
16
|
+
let jazzCloud = setupTestNode({ isSyncServer: true });
|
|
17
|
+
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
SyncMessagesLog.clear();
|
|
20
|
+
jazzCloud = setupTestNode({ isSyncServer: true });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe("Group.removeMember", () => {
|
|
24
|
+
test("a reader member should be able to revoke themselves", async () => {
|
|
25
|
+
const admin = await setupTestAccount({
|
|
26
|
+
connected: true,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const reader = await setupTestAccount({
|
|
30
|
+
connected: true,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const group = admin.node.createGroup();
|
|
34
|
+
const readerOnAdminNode = await loadCoValueOrFail(
|
|
35
|
+
admin.node,
|
|
36
|
+
reader.accountID,
|
|
37
|
+
);
|
|
38
|
+
group.addMember(readerOnAdminNode, "reader");
|
|
39
|
+
|
|
40
|
+
const groupOnReaderNode = await loadCoValueOrFail(reader.node, group.id);
|
|
41
|
+
expect(groupOnReaderNode.myRole()).toEqual("reader");
|
|
42
|
+
|
|
43
|
+
await groupOnReaderNode.removeMember(
|
|
44
|
+
reader.node.expectCurrentAccount("reader"),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
expect(groupOnReaderNode.myRole()).toEqual(undefined);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("a writer member should be able to revoke themselves", async () => {
|
|
51
|
+
const admin = await setupTestAccount({
|
|
52
|
+
connected: true,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const writer = await setupTestAccount({
|
|
56
|
+
connected: true,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const group = admin.node.createGroup();
|
|
60
|
+
const writerOnAdminNode = await loadCoValueOrFail(
|
|
61
|
+
admin.node,
|
|
62
|
+
writer.accountID,
|
|
63
|
+
);
|
|
64
|
+
group.addMember(writerOnAdminNode, "writer");
|
|
65
|
+
|
|
66
|
+
const groupOnWriterNode = await loadCoValueOrFail(writer.node, group.id);
|
|
67
|
+
expect(groupOnWriterNode.myRole()).toEqual("writer");
|
|
68
|
+
|
|
69
|
+
await groupOnWriterNode.removeMember(
|
|
70
|
+
writer.node.expectCurrentAccount("writer"),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
expect(groupOnWriterNode.myRole()).toEqual(undefined);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("a writeOnly member should be able to revoke themselves", async () => {
|
|
77
|
+
const admin = await setupTestAccount({
|
|
78
|
+
connected: true,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const writeOnly = await setupTestAccount({
|
|
82
|
+
connected: true,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const group = admin.node.createGroup();
|
|
86
|
+
const writeOnlyOnAdminNode = await loadCoValueOrFail(
|
|
87
|
+
admin.node,
|
|
88
|
+
writeOnly.accountID,
|
|
89
|
+
);
|
|
90
|
+
group.addMember(writeOnlyOnAdminNode, "writeOnly");
|
|
91
|
+
|
|
92
|
+
const groupOnWriteOnlyNode = await loadCoValueOrFail(
|
|
93
|
+
writeOnly.node,
|
|
94
|
+
group.id,
|
|
95
|
+
);
|
|
96
|
+
expect(groupOnWriteOnlyNode.myRole()).toEqual("writeOnly");
|
|
97
|
+
|
|
98
|
+
await groupOnWriteOnlyNode.removeMember(
|
|
99
|
+
writeOnly.node.expectCurrentAccount("writeOnly"),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
expect(groupOnWriteOnlyNode.myRole()).toEqual(undefined);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("an admin member should be able to revoke themselves", async () => {
|
|
106
|
+
const admin = await setupTestAccount({
|
|
107
|
+
connected: true,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const otherAdmin = await setupTestAccount({
|
|
111
|
+
connected: true,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const group = admin.node.createGroup();
|
|
115
|
+
const otherAdminOnAdminNode = await loadCoValueOrFail(
|
|
116
|
+
admin.node,
|
|
117
|
+
otherAdmin.accountID,
|
|
118
|
+
);
|
|
119
|
+
group.addMember(otherAdminOnAdminNode, "admin");
|
|
120
|
+
|
|
121
|
+
const groupOnOtherAdminNode = await loadCoValueOrFail(
|
|
122
|
+
otherAdmin.node,
|
|
123
|
+
group.id,
|
|
124
|
+
);
|
|
125
|
+
expect(groupOnOtherAdminNode.myRole()).toEqual("admin");
|
|
126
|
+
|
|
127
|
+
await groupOnOtherAdminNode.removeMember(
|
|
128
|
+
otherAdmin.node.expectCurrentAccount("admin"),
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
expect(groupOnOtherAdminNode.myRole()).toEqual(undefined);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("a writer member cannot remove other accounts", async () => {
|
|
135
|
+
const admin = await setupTestAccount({
|
|
136
|
+
connected: true,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const writer = await setupTestAccount({
|
|
140
|
+
connected: true,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const otherMember = await setupTestAccount({
|
|
144
|
+
connected: true,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const group = admin.node.createGroup();
|
|
148
|
+
const writerOnAdminNode = await loadCoValueOrFail(
|
|
149
|
+
admin.node,
|
|
150
|
+
writer.accountID,
|
|
151
|
+
);
|
|
152
|
+
const otherMemberOnAdminNode = await loadCoValueOrFail(
|
|
153
|
+
admin.node,
|
|
154
|
+
otherMember.accountID,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
group.addMember(writerOnAdminNode, "writer");
|
|
158
|
+
group.addMember(otherMemberOnAdminNode, "reader");
|
|
159
|
+
|
|
160
|
+
const groupOnWriterNode = await loadCoValueOrFail(writer.node, group.id);
|
|
161
|
+
expect(groupOnWriterNode.myRole()).toEqual("writer");
|
|
162
|
+
|
|
163
|
+
const otherMemberOnWriterNode = await loadCoValueOrFail(
|
|
164
|
+
writer.node,
|
|
165
|
+
otherMember.accountID,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
await groupOnWriterNode.removeMember(otherMemberOnWriterNode);
|
|
169
|
+
|
|
170
|
+
expect(groupOnWriterNode.roleOf(otherMember.accountID)).toEqual("reader");
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("a writeOnly member cannot remove other accounts", async () => {
|
|
174
|
+
const admin = await setupTestAccount({
|
|
175
|
+
connected: true,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
const writeOnly = await setupTestAccount({
|
|
179
|
+
connected: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const otherMember = await setupTestAccount({
|
|
183
|
+
connected: true,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const group = admin.node.createGroup();
|
|
187
|
+
const writeOnlyOnAdminNode = await loadCoValueOrFail(
|
|
188
|
+
admin.node,
|
|
189
|
+
writeOnly.accountID,
|
|
190
|
+
);
|
|
191
|
+
const otherMemberOnAdminNode = await loadCoValueOrFail(
|
|
192
|
+
admin.node,
|
|
193
|
+
otherMember.accountID,
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
group.addMember(writeOnlyOnAdminNode, "writeOnly");
|
|
197
|
+
group.addMember(otherMemberOnAdminNode, "reader");
|
|
198
|
+
|
|
199
|
+
const groupOnWriteOnlyNode = await loadCoValueOrFail(
|
|
200
|
+
writeOnly.node,
|
|
201
|
+
group.id,
|
|
202
|
+
);
|
|
203
|
+
expect(groupOnWriteOnlyNode.myRole()).toEqual("writeOnly");
|
|
204
|
+
|
|
205
|
+
const otherMemberOnWriteOnlyNode = await loadCoValueOrFail(
|
|
206
|
+
writeOnly.node,
|
|
207
|
+
otherMember.accountID,
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
await groupOnWriteOnlyNode.removeMember(otherMemberOnWriteOnlyNode);
|
|
211
|
+
|
|
212
|
+
expect(groupOnWriteOnlyNode.roleOf(otherMember.accountID)).toEqual(
|
|
213
|
+
"reader",
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("a reader member cannot remove other accounts", async () => {
|
|
218
|
+
const admin = await setupTestAccount({
|
|
219
|
+
connected: true,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const reader = await setupTestAccount({
|
|
223
|
+
connected: true,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const otherMember = await setupTestAccount({
|
|
227
|
+
connected: true,
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const group = admin.node.createGroup();
|
|
231
|
+
const readerOnAdminNode = await loadCoValueOrFail(
|
|
232
|
+
admin.node,
|
|
233
|
+
reader.accountID,
|
|
234
|
+
);
|
|
235
|
+
const otherMemberOnAdminNode = await loadCoValueOrFail(
|
|
236
|
+
admin.node,
|
|
237
|
+
otherMember.accountID,
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
group.addMember(readerOnAdminNode, "reader");
|
|
241
|
+
group.addMember(otherMemberOnAdminNode, "writer");
|
|
242
|
+
|
|
243
|
+
const groupOnReaderNode = await loadCoValueOrFail(reader.node, group.id);
|
|
244
|
+
expect(groupOnReaderNode.myRole()).toEqual("reader");
|
|
245
|
+
|
|
246
|
+
const otherMemberOnReaderNode = await loadCoValueOrFail(
|
|
247
|
+
reader.node,
|
|
248
|
+
otherMember.accountID,
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
await groupOnReaderNode.removeMember(otherMemberOnReaderNode);
|
|
252
|
+
|
|
253
|
+
expect(groupOnReaderNode.roleOf(otherMember.accountID)).toEqual("writer");
|
|
254
|
+
});
|
|
255
|
+
});
|
package/src/tests/sync.test.ts
CHANGED
|
@@ -1045,7 +1045,7 @@ describe("SyncManager.handleSyncMessage", () => {
|
|
|
1045
1045
|
sessions: {},
|
|
1046
1046
|
} as unknown as LoadMessage;
|
|
1047
1047
|
|
|
1048
|
-
|
|
1048
|
+
client.node.syncManager.handleSyncMessage(invalidMessage, peerState);
|
|
1049
1049
|
|
|
1050
1050
|
// Verify that no state changes occurred
|
|
1051
1051
|
expect(peerState.knownStates.has(invalidMessage.id)).toBe(false);
|