cojson 0.18.29 → 0.18.31
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 +17 -0
- package/dist/PeerState.d.ts +23 -14
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js +74 -23
- package/dist/PeerState.js.map +1 -1
- package/dist/SyncStateManager.d.ts +3 -3
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +18 -44
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueContentMessage.d.ts.map +1 -1
- package/dist/coValueContentMessage.js +2 -1
- package/dist/coValueContentMessage.js.map +1 -1
- package/dist/coValueCore/PeerKnownState.d.ts +21 -0
- package/dist/coValueCore/PeerKnownState.d.ts.map +1 -0
- package/dist/coValueCore/PeerKnownState.js +52 -0
- package/dist/coValueCore/PeerKnownState.js.map +1 -0
- package/dist/coValueCore/coValueCore.d.ts +39 -8
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +139 -40
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts.map +1 -1
- package/dist/coValueCore/decryptTransactionChangesAndMeta.js +0 -5
- package/dist/coValueCore/decryptTransactionChangesAndMeta.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +0 -14
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +2 -32
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coList.d.ts +3 -4
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js +4 -4
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coMap.d.ts +3 -4
- package/dist/coValues/coMap.d.ts.map +1 -1
- package/dist/coValues/coMap.js +5 -4
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/coStream.d.ts +3 -3
- package/dist/coValues/coStream.d.ts.map +1 -1
- package/dist/coValues/coStream.js +3 -4
- package/dist/coValues/coStream.js.map +1 -1
- package/dist/coValues/group.d.ts +3 -3
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +74 -52
- package/dist/coValues/group.js.map +1 -1
- package/dist/exports.d.ts +2 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +2 -2
- package/dist/exports.js.map +1 -1
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +7 -5
- package/dist/localNode.js.map +1 -1
- package/dist/permissions.d.ts +5 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +173 -109
- package/dist/permissions.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +33 -44
- package/dist/sync.js.map +1 -1
- package/dist/tests/PeerKnownState.test.d.ts +2 -0
- package/dist/tests/PeerKnownState.test.d.ts.map +1 -0
- package/dist/tests/PeerKnownState.test.js +342 -0
- package/dist/tests/PeerKnownState.test.js.map +1 -0
- package/dist/tests/PeerState.test.js +17 -16
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +12 -12
- package/dist/tests/StorageApiAsync.test.js.map +1 -1
- package/dist/tests/StorageApiSync.test.js +11 -11
- package/dist/tests/StorageApiSync.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +16 -21
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/coValueCore.dependencies.test.js +59 -0
- package/dist/tests/coValueCore.dependencies.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +41 -21
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/group.addMember.test.js +266 -219
- package/dist/tests/group.addMember.test.js.map +1 -1
- package/dist/tests/group.inheritance.test.js +12 -0
- package/dist/tests/group.inheritance.test.js.map +1 -1
- package/dist/tests/group.invite.test.js +77 -0
- package/dist/tests/group.invite.test.js.map +1 -1
- package/dist/tests/group.removeMember.test.js +65 -8
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/group.roleOf.test.js +14 -4
- package/dist/tests/group.roleOf.test.js.map +1 -1
- package/dist/tests/permissions.test.js +51 -202
- package/dist/tests/permissions.test.js.map +1 -1
- package/dist/tests/sync.content.test.js +2 -2
- package/dist/tests/sync.content.test.js.map +1 -1
- package/dist/tests/sync.invite.test.js +6 -6
- package/dist/tests/sync.load.test.js +22 -22
- package/dist/tests/sync.mesh.test.js +9 -9
- package/dist/tests/sync.storage.test.js +13 -7
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +3 -3
- package/dist/tests/sync.test.js +13 -33
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +2 -2
- package/package.json +3 -3
- package/src/PeerState.ts +86 -34
- package/src/SyncStateManager.ts +25 -60
- package/src/coValueContentMessage.ts +3 -1
- package/src/coValueCore/PeerKnownState.ts +74 -0
- package/src/coValueCore/coValueCore.ts +180 -49
- package/src/coValueCore/decryptTransactionChangesAndMeta.ts +0 -6
- package/src/coValueCore/verifiedState.ts +2 -37
- package/src/coValues/coList.ts +7 -7
- package/src/coValues/coMap.ts +9 -7
- package/src/coValues/coStream.ts +6 -5
- package/src/coValues/group.ts +99 -60
- package/src/exports.ts +2 -1
- package/src/localNode.ts +7 -5
- package/src/permissions.ts +204 -123
- package/src/sync.ts +37 -53
- package/src/tests/PeerKnownState.test.ts +426 -0
- package/src/tests/PeerState.test.ts +24 -24
- package/src/tests/StorageApiAsync.test.ts +12 -12
- package/src/tests/StorageApiSync.test.ts +11 -11
- package/src/tests/SyncStateManager.test.ts +23 -53
- package/src/tests/coValueCore.dependencies.test.ts +87 -0
- package/src/tests/coValueCore.test.ts +64 -22
- package/src/tests/group.addMember.test.ts +384 -345
- package/src/tests/group.inheritance.test.ts +33 -0
- package/src/tests/group.invite.test.ts +117 -0
- package/src/tests/group.removeMember.test.ts +96 -10
- package/src/tests/group.roleOf.test.ts +16 -4
- package/src/tests/permissions.test.ts +56 -295
- package/src/tests/sync.content.test.ts +2 -2
- package/src/tests/sync.invite.test.ts +6 -6
- package/src/tests/sync.load.test.ts +22 -22
- package/src/tests/sync.mesh.test.ts +9 -9
- package/src/tests/sync.storage.test.ts +13 -8
- package/src/tests/sync.storageAsync.test.ts +3 -3
- package/src/tests/sync.test.ts +21 -50
- package/src/tests/sync.upload.test.ts +2 -2
- package/dist/PeerKnownStates.d.ts +0 -19
- package/dist/PeerKnownStates.d.ts.map +0 -1
- package/dist/PeerKnownStates.js +0 -64
- package/dist/PeerKnownStates.js.map +0 -1
- package/dist/tests/PeerKnownStates.test.d.ts +0 -2
- package/dist/tests/PeerKnownStates.test.d.ts.map +0 -1
- package/dist/tests/PeerKnownStates.test.js +0 -77
- package/dist/tests/PeerKnownStates.test.js.map +0 -1
- package/src/PeerKnownStates.ts +0 -93
- package/src/tests/PeerKnownStates.test.ts +0 -99
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
newGroupHighLevel,
|
|
16
16
|
waitFor,
|
|
17
17
|
} from "./testUtils.js";
|
|
18
|
+
import { Role } from "../permissions.js";
|
|
18
19
|
|
|
19
20
|
const Crypto = await WasmCrypto.create();
|
|
20
21
|
|
|
@@ -81,7 +82,7 @@ test("Admins can't demote other admins in a group (high level)", async () => {
|
|
|
81
82
|
);
|
|
82
83
|
|
|
83
84
|
expect(() => groupAsOtherAdmin.addMemberInternal(admin.id, "writer")).toThrow(
|
|
84
|
-
|
|
85
|
+
`Failed to set role writer to ${admin.id} (role of current account is admin)`,
|
|
85
86
|
);
|
|
86
87
|
|
|
87
88
|
expect(groupAsOtherAdmin.get(admin.id)).toEqual("admin");
|
|
@@ -133,13 +134,13 @@ test("Admins an add writers to a group, who can't add admins, writers, or reader
|
|
|
133
134
|
const otherAgent = createAccountInNode(groupAsWriter.core.node);
|
|
134
135
|
|
|
135
136
|
expect(() => groupAsWriter.addMember(otherAgent, "admin")).toThrow(
|
|
136
|
-
|
|
137
|
+
`Failed to set role admin to ${otherAgent.id} (role of current account is writer)`,
|
|
137
138
|
);
|
|
138
139
|
expect(() => groupAsWriter.addMember(otherAgent, "writer")).toThrow(
|
|
139
|
-
|
|
140
|
+
`Failed to set role writer to ${otherAgent.id} (role of current account is writer)`,
|
|
140
141
|
);
|
|
141
142
|
expect(() => groupAsWriter.addMember(otherAgent, "reader")).toThrow(
|
|
142
|
-
|
|
143
|
+
`Failed to set role reader to ${otherAgent.id} (role of current account is writer)`,
|
|
143
144
|
);
|
|
144
145
|
|
|
145
146
|
expect(groupAsWriter.get(otherAgent.id)).toBeUndefined();
|
|
@@ -190,13 +191,13 @@ test("Admins can add readers to a group, who can't add admins, writers, or reade
|
|
|
190
191
|
const otherAgent = createAccountInNode(groupAsReader.core.node);
|
|
191
192
|
|
|
192
193
|
expect(() => groupAsReader.addMember(otherAgent, "admin")).toThrow(
|
|
193
|
-
|
|
194
|
+
`Failed to set role admin to ${otherAgent.id} (role of current account is reader)`,
|
|
194
195
|
);
|
|
195
196
|
expect(() => groupAsReader.addMember(otherAgent, "writer")).toThrow(
|
|
196
|
-
|
|
197
|
+
`Failed to set role writer to ${otherAgent.id} (role of current account is reader)`,
|
|
197
198
|
);
|
|
198
199
|
expect(() => groupAsReader.addMember(otherAgent, "reader")).toThrow(
|
|
199
|
-
|
|
200
|
+
`Failed to set role reader to ${otherAgent.id} (role of current account is reader)`,
|
|
200
201
|
);
|
|
201
202
|
|
|
202
203
|
expect(groupAsReader.get(otherAgent.id)).toBeUndefined();
|
|
@@ -1325,7 +1326,33 @@ test("Admins can create a readerInvite, which can add a reader (high-level)", as
|
|
|
1325
1326
|
expect(groupAsInvitedReader.core.getCurrentReadKey().secret).toBeDefined();
|
|
1326
1327
|
});
|
|
1327
1328
|
|
|
1328
|
-
test(
|
|
1329
|
+
test.each([
|
|
1330
|
+
// [inviteRole, finalRole]
|
|
1331
|
+
["adminInvite", "manager"],
|
|
1332
|
+
["adminInvite", "writer"],
|
|
1333
|
+
["adminInvite", "reader"],
|
|
1334
|
+
["adminInvite", "writeOnly"],
|
|
1335
|
+
|
|
1336
|
+
["managerInvite", "admin"],
|
|
1337
|
+
["managerInvite", "writer"],
|
|
1338
|
+
["managerInvite", "reader"],
|
|
1339
|
+
["managerInvite", "writeOnly"],
|
|
1340
|
+
|
|
1341
|
+
["writerInvite", "admin"],
|
|
1342
|
+
["writerInvite", "reader"],
|
|
1343
|
+
["writerInvite", "manager"],
|
|
1344
|
+
["writerInvite", "writeOnly"],
|
|
1345
|
+
|
|
1346
|
+
["readerInvite", "admin"],
|
|
1347
|
+
["readerInvite", "writer"],
|
|
1348
|
+
["readerInvite", "manager"],
|
|
1349
|
+
["readerInvite", "writeOnly"],
|
|
1350
|
+
|
|
1351
|
+
["writeOnlyInvite", "admin"],
|
|
1352
|
+
["writeOnlyInvite", "manager"],
|
|
1353
|
+
["writeOnlyInvite", "writer"],
|
|
1354
|
+
["writeOnlyInvite", "reader"],
|
|
1355
|
+
] as [Role, Role][])("%s can not invite %s", async (inviteRole, finalRole) => {
|
|
1329
1356
|
const { groupCore, admin } = newGroup();
|
|
1330
1357
|
|
|
1331
1358
|
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
@@ -1347,9 +1374,9 @@ test("WriterInvites can not invite admins", async () => {
|
|
|
1347
1374
|
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1348
1375
|
group.set("readKey", readKeyID, "trusting");
|
|
1349
1376
|
|
|
1350
|
-
group.set(inviteID,
|
|
1377
|
+
group.set(inviteID, inviteRole, "trusting");
|
|
1351
1378
|
|
|
1352
|
-
expect(group.get(inviteID)).toEqual(
|
|
1379
|
+
expect(group.get(inviteID)).toEqual(inviteRole);
|
|
1353
1380
|
|
|
1354
1381
|
const revelationForInvite = Crypto.seal({
|
|
1355
1382
|
message: readKey,
|
|
@@ -1372,11 +1399,18 @@ test("WriterInvites can not invite admins", async () => {
|
|
|
1372
1399
|
const invitedAdminSecret = Crypto.newRandomAgentSecret();
|
|
1373
1400
|
const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
|
|
1374
1401
|
|
|
1375
|
-
groupAsInvite.set(invitedAdminID,
|
|
1402
|
+
groupAsInvite.set(invitedAdminID, finalRole, "trusting");
|
|
1376
1403
|
expect(groupAsInvite.get(invitedAdminID)).toBeUndefined();
|
|
1377
1404
|
});
|
|
1378
1405
|
|
|
1379
|
-
test(
|
|
1406
|
+
test.each([
|
|
1407
|
+
// [inviteRole, finalRole]
|
|
1408
|
+
["adminInvite", "admin"],
|
|
1409
|
+
["managerInvite", "manager"],
|
|
1410
|
+
["writerInvite", "writer"],
|
|
1411
|
+
["readerInvite", "reader"],
|
|
1412
|
+
["writeOnlyInvite", "writeOnly"],
|
|
1413
|
+
] as [Role, Role][])("%s can invite %s", async (inviteRole, finalRole) => {
|
|
1380
1414
|
const { groupCore, admin } = newGroup();
|
|
1381
1415
|
|
|
1382
1416
|
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
@@ -1398,9 +1432,9 @@ test("ReaderInvites can not invite admins", async () => {
|
|
|
1398
1432
|
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1399
1433
|
group.set("readKey", readKeyID, "trusting");
|
|
1400
1434
|
|
|
1401
|
-
group.set(inviteID,
|
|
1435
|
+
group.set(inviteID, inviteRole, "trusting");
|
|
1402
1436
|
|
|
1403
|
-
expect(group.get(inviteID)).toEqual(
|
|
1437
|
+
expect(group.get(inviteID)).toEqual(inviteRole);
|
|
1404
1438
|
|
|
1405
1439
|
const revelationForInvite = Crypto.seal({
|
|
1406
1440
|
message: readKey,
|
|
@@ -1423,212 +1457,8 @@ test("ReaderInvites can not invite admins", async () => {
|
|
|
1423
1457
|
const invitedAdminSecret = Crypto.newRandomAgentSecret();
|
|
1424
1458
|
const invitedAdminID = Crypto.getAgentID(invitedAdminSecret);
|
|
1425
1459
|
|
|
1426
|
-
groupAsInvite.set(invitedAdminID,
|
|
1427
|
-
expect(groupAsInvite.get(invitedAdminID)).
|
|
1428
|
-
});
|
|
1429
|
-
|
|
1430
|
-
test("ReaderInvites can not invite writers", async () => {
|
|
1431
|
-
const { groupCore, admin } = newGroup();
|
|
1432
|
-
|
|
1433
|
-
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
1434
|
-
const inviteID = Crypto.getAgentID(inviteSecret);
|
|
1435
|
-
|
|
1436
|
-
const group = expectGroup(groupCore.getCurrentContent());
|
|
1437
|
-
|
|
1438
|
-
const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
|
|
1439
|
-
const revelation = Crypto.seal({
|
|
1440
|
-
message: readKey,
|
|
1441
|
-
from: admin.currentSealerSecret(),
|
|
1442
|
-
to: admin.currentSealerID(),
|
|
1443
|
-
nOnceMaterial: {
|
|
1444
|
-
in: groupCore.id,
|
|
1445
|
-
tx: groupCore.nextTransactionID(),
|
|
1446
|
-
},
|
|
1447
|
-
});
|
|
1448
|
-
|
|
1449
|
-
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1450
|
-
group.set("readKey", readKeyID, "trusting");
|
|
1451
|
-
|
|
1452
|
-
group.set(inviteID, "readerInvite", "trusting");
|
|
1453
|
-
|
|
1454
|
-
expect(group.get(inviteID)).toEqual("readerInvite");
|
|
1455
|
-
|
|
1456
|
-
const revelationForInvite = Crypto.seal({
|
|
1457
|
-
message: readKey,
|
|
1458
|
-
from: admin.currentSealerSecret(),
|
|
1459
|
-
to: Crypto.getAgentSealerID(inviteID),
|
|
1460
|
-
nOnceMaterial: {
|
|
1461
|
-
in: groupCore.id,
|
|
1462
|
-
tx: groupCore.nextTransactionID(),
|
|
1463
|
-
},
|
|
1464
|
-
});
|
|
1465
|
-
|
|
1466
|
-
group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
|
|
1467
|
-
|
|
1468
|
-
const groupAsInvite = expectGroup(
|
|
1469
|
-
await groupCore.contentInClonedNodeWithDifferentAccount(
|
|
1470
|
-
new ControlledAgent(inviteSecret, Crypto),
|
|
1471
|
-
),
|
|
1472
|
-
);
|
|
1473
|
-
|
|
1474
|
-
const invitedWriterSecret = Crypto.newRandomAgentSecret();
|
|
1475
|
-
const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
|
|
1476
|
-
|
|
1477
|
-
groupAsInvite.set(invitedWriterID, "writer", "trusting");
|
|
1478
|
-
expect(groupAsInvite.get(invitedWriterID)).toBeUndefined();
|
|
1479
|
-
});
|
|
1480
|
-
|
|
1481
|
-
test("WriteOnlyInvites can not invite writers", async () => {
|
|
1482
|
-
const { groupCore, admin } = newGroup();
|
|
1483
|
-
|
|
1484
|
-
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
1485
|
-
const inviteID = Crypto.getAgentID(inviteSecret);
|
|
1486
|
-
|
|
1487
|
-
const group = expectGroup(groupCore.getCurrentContent());
|
|
1488
|
-
|
|
1489
|
-
const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
|
|
1490
|
-
const revelation = Crypto.seal({
|
|
1491
|
-
message: readKey,
|
|
1492
|
-
from: admin.currentSealerSecret(),
|
|
1493
|
-
to: admin.currentSealerID(),
|
|
1494
|
-
nOnceMaterial: {
|
|
1495
|
-
in: groupCore.id,
|
|
1496
|
-
tx: groupCore.nextTransactionID(),
|
|
1497
|
-
},
|
|
1498
|
-
});
|
|
1499
|
-
|
|
1500
|
-
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1501
|
-
group.set("readKey", readKeyID, "trusting");
|
|
1502
|
-
|
|
1503
|
-
group.set(inviteID, "writeOnlyInvite", "trusting");
|
|
1504
|
-
|
|
1505
|
-
expect(group.get(inviteID)).toEqual("writeOnlyInvite");
|
|
1506
|
-
|
|
1507
|
-
const revelationForInvite = Crypto.seal({
|
|
1508
|
-
message: readKey,
|
|
1509
|
-
from: admin.currentSealerSecret(),
|
|
1510
|
-
to: Crypto.getAgentSealerID(inviteID),
|
|
1511
|
-
nOnceMaterial: {
|
|
1512
|
-
in: groupCore.id,
|
|
1513
|
-
tx: groupCore.nextTransactionID(),
|
|
1514
|
-
},
|
|
1515
|
-
});
|
|
1516
|
-
|
|
1517
|
-
group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
|
|
1518
|
-
|
|
1519
|
-
const groupAsInvite = expectGroup(
|
|
1520
|
-
await groupCore.contentInClonedNodeWithDifferentAccount(
|
|
1521
|
-
new ControlledAgent(inviteSecret, Crypto),
|
|
1522
|
-
),
|
|
1523
|
-
);
|
|
1524
|
-
|
|
1525
|
-
const invitedWriterSecret = Crypto.newRandomAgentSecret();
|
|
1526
|
-
const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
|
|
1527
|
-
|
|
1528
|
-
groupAsInvite.set(invitedWriterID, "writer", "trusting");
|
|
1529
|
-
expect(groupAsInvite.get(invitedWriterID)).toBeUndefined();
|
|
1530
|
-
});
|
|
1531
|
-
|
|
1532
|
-
test("WriteOnlyInvites can not invite admins", async () => {
|
|
1533
|
-
const { groupCore, admin } = newGroup();
|
|
1534
|
-
|
|
1535
|
-
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
1536
|
-
const inviteID = Crypto.getAgentID(inviteSecret);
|
|
1537
|
-
|
|
1538
|
-
const group = expectGroup(groupCore.getCurrentContent());
|
|
1539
|
-
|
|
1540
|
-
const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
|
|
1541
|
-
const revelation = Crypto.seal({
|
|
1542
|
-
message: readKey,
|
|
1543
|
-
from: admin.currentSealerSecret(),
|
|
1544
|
-
to: admin.currentSealerID(),
|
|
1545
|
-
nOnceMaterial: {
|
|
1546
|
-
in: groupCore.id,
|
|
1547
|
-
tx: groupCore.nextTransactionID(),
|
|
1548
|
-
},
|
|
1549
|
-
});
|
|
1550
|
-
|
|
1551
|
-
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1552
|
-
group.set("readKey", readKeyID, "trusting");
|
|
1553
|
-
|
|
1554
|
-
group.set(inviteID, "writeOnlyInvite", "trusting");
|
|
1555
|
-
|
|
1556
|
-
expect(group.get(inviteID)).toEqual("writeOnlyInvite");
|
|
1557
|
-
|
|
1558
|
-
const revelationForInvite = Crypto.seal({
|
|
1559
|
-
message: readKey,
|
|
1560
|
-
from: admin.currentSealerSecret(),
|
|
1561
|
-
to: Crypto.getAgentSealerID(inviteID),
|
|
1562
|
-
nOnceMaterial: {
|
|
1563
|
-
in: groupCore.id,
|
|
1564
|
-
tx: groupCore.nextTransactionID(),
|
|
1565
|
-
},
|
|
1566
|
-
});
|
|
1567
|
-
|
|
1568
|
-
group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
|
|
1569
|
-
|
|
1570
|
-
const groupAsInvite = expectGroup(
|
|
1571
|
-
await groupCore.contentInClonedNodeWithDifferentAccount(
|
|
1572
|
-
new ControlledAgent(inviteSecret, Crypto),
|
|
1573
|
-
),
|
|
1574
|
-
);
|
|
1575
|
-
|
|
1576
|
-
const invitedWriterSecret = Crypto.newRandomAgentSecret();
|
|
1577
|
-
const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
|
|
1578
|
-
|
|
1579
|
-
groupAsInvite.set(invitedWriterID, "admin", "trusting");
|
|
1580
|
-
expect(groupAsInvite.get(invitedWriterID)).toBeUndefined();
|
|
1581
|
-
});
|
|
1582
|
-
|
|
1583
|
-
test("WriteOnlyInvites can invite writeOnly", async () => {
|
|
1584
|
-
const { groupCore, admin } = newGroup();
|
|
1585
|
-
|
|
1586
|
-
const inviteSecret = Crypto.newRandomAgentSecret();
|
|
1587
|
-
const inviteID = Crypto.getAgentID(inviteSecret);
|
|
1588
|
-
|
|
1589
|
-
const group = expectGroup(groupCore.getCurrentContent());
|
|
1590
|
-
|
|
1591
|
-
const { secret: readKey, id: readKeyID } = Crypto.newRandomKeySecret();
|
|
1592
|
-
const revelation = Crypto.seal({
|
|
1593
|
-
message: readKey,
|
|
1594
|
-
from: admin.currentSealerSecret(),
|
|
1595
|
-
to: admin.currentSealerID(),
|
|
1596
|
-
nOnceMaterial: {
|
|
1597
|
-
in: groupCore.id,
|
|
1598
|
-
tx: groupCore.nextTransactionID(),
|
|
1599
|
-
},
|
|
1600
|
-
});
|
|
1601
|
-
|
|
1602
|
-
group.set(`${readKeyID}_for_${admin.id}`, revelation, "trusting");
|
|
1603
|
-
group.set("readKey", readKeyID, "trusting");
|
|
1604
|
-
|
|
1605
|
-
group.set(inviteID, "writeOnlyInvite", "trusting");
|
|
1606
|
-
|
|
1607
|
-
expect(group.get(inviteID)).toEqual("writeOnlyInvite");
|
|
1608
|
-
|
|
1609
|
-
const revelationForInvite = Crypto.seal({
|
|
1610
|
-
message: readKey,
|
|
1611
|
-
from: admin.currentSealerSecret(),
|
|
1612
|
-
to: Crypto.getAgentSealerID(inviteID),
|
|
1613
|
-
nOnceMaterial: {
|
|
1614
|
-
in: groupCore.id,
|
|
1615
|
-
tx: groupCore.nextTransactionID(),
|
|
1616
|
-
},
|
|
1617
|
-
});
|
|
1618
|
-
|
|
1619
|
-
group.set(`${readKeyID}_for_${inviteID}`, revelationForInvite, "trusting");
|
|
1620
|
-
|
|
1621
|
-
const groupAsInvite = expectGroup(
|
|
1622
|
-
await groupCore.contentInClonedNodeWithDifferentAccount(
|
|
1623
|
-
new ControlledAgent(inviteSecret, Crypto),
|
|
1624
|
-
),
|
|
1625
|
-
);
|
|
1626
|
-
|
|
1627
|
-
const invitedWriterSecret = Crypto.newRandomAgentSecret();
|
|
1628
|
-
const invitedWriterID = Crypto.getAgentID(invitedWriterSecret);
|
|
1629
|
-
|
|
1630
|
-
groupAsInvite.set(invitedWriterID, "writeOnly", "trusting");
|
|
1631
|
-
expect(groupAsInvite.get(invitedWriterID)).toEqual("writeOnly");
|
|
1460
|
+
groupAsInvite.set(invitedAdminID, finalRole, "trusting");
|
|
1461
|
+
expect(groupAsInvite.get(invitedAdminID)).toEqual(finalRole);
|
|
1632
1462
|
});
|
|
1633
1463
|
|
|
1634
1464
|
test("WriteOnlyInvites can set writeKeys", async () => {
|
|
@@ -1914,69 +1744,12 @@ test("Writers, readers and invitees can not set parent extensions", async () =>
|
|
|
1914
1744
|
expect(groupAsReaderInvite.get(`parent_${parentGroup.id}`)).toBeUndefined();
|
|
1915
1745
|
});
|
|
1916
1746
|
|
|
1917
|
-
test("
|
|
1747
|
+
test("Child extensions are ignored", () => {
|
|
1918
1748
|
const { group, node } = newGroupHighLevel();
|
|
1919
1749
|
const childGroup = node.createGroup();
|
|
1920
1750
|
|
|
1921
1751
|
group.set(`child_${childGroup.id}`, "extend", "trusting");
|
|
1922
|
-
expect(group.get(`child_${childGroup.id}`)).toEqual(
|
|
1923
|
-
});
|
|
1924
|
-
|
|
1925
|
-
test("Admins can set child extensions when the admin role is inherited", async () => {
|
|
1926
|
-
const { node1, node2 } = await createTwoConnectedNodes("server", "server");
|
|
1927
|
-
|
|
1928
|
-
const node2AccountOnNode1 = await loadCoValueOrFail(
|
|
1929
|
-
node1.node,
|
|
1930
|
-
node2.accountID,
|
|
1931
|
-
);
|
|
1932
|
-
|
|
1933
|
-
const group = node1.node.createGroup();
|
|
1934
|
-
|
|
1935
|
-
group.addMember(node2AccountOnNode1, "admin");
|
|
1936
|
-
|
|
1937
|
-
const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
|
|
1938
|
-
|
|
1939
|
-
const childGroup = node2.node.createGroup();
|
|
1940
|
-
childGroup.extend(groupOnNode2);
|
|
1941
|
-
|
|
1942
|
-
const childGroupOnNode1 = await loadCoValueOrFail(node1.node, childGroup.id);
|
|
1943
|
-
|
|
1944
|
-
const grandChildGroup = node2.node.createGroup();
|
|
1945
|
-
grandChildGroup.extend(childGroupOnNode1);
|
|
1946
|
-
|
|
1947
|
-
expect(childGroupOnNode1.get(`child_${grandChildGroup.id}`)).toEqual(
|
|
1948
|
-
"extend",
|
|
1949
|
-
);
|
|
1950
|
-
expect(grandChildGroup.get(`parent_${childGroupOnNode1.id}`)).toEqual(
|
|
1951
|
-
"extend",
|
|
1952
|
-
);
|
|
1953
|
-
});
|
|
1954
|
-
|
|
1955
|
-
test("Writers, readers and writeOnly can set child extensions", async () => {
|
|
1956
|
-
const { group, node } = newGroupHighLevel();
|
|
1957
|
-
const childGroup = node.createGroup();
|
|
1958
|
-
|
|
1959
|
-
const writer = createAccountInNode(node);
|
|
1960
|
-
const reader = createAccountInNode(node);
|
|
1961
|
-
const writeOnly = createAccountInNode(node);
|
|
1962
|
-
|
|
1963
|
-
group.addMember(writer, "writer");
|
|
1964
|
-
group.addMember(reader, "reader");
|
|
1965
|
-
group.addMember(writeOnly, "writeOnly");
|
|
1966
|
-
|
|
1967
|
-
const groupAsWriter = expectGroup(
|
|
1968
|
-
await group.core.contentInClonedNodeWithDifferentAccount(writer),
|
|
1969
|
-
);
|
|
1970
|
-
|
|
1971
|
-
groupAsWriter.set(`child_${childGroup.id}`, "extend", "trusting");
|
|
1972
|
-
expect(groupAsWriter.get(`child_${childGroup.id}`)).toEqual("extend");
|
|
1973
|
-
|
|
1974
|
-
const groupAsReader = expectGroup(
|
|
1975
|
-
await group.core.contentInClonedNodeWithDifferentAccount(reader),
|
|
1976
|
-
);
|
|
1977
|
-
|
|
1978
|
-
groupAsReader.set(`child_${childGroup.id}`, "extend", "trusting");
|
|
1979
|
-
expect(groupAsReader.get(`child_${childGroup.id}`)).toEqual("extend");
|
|
1752
|
+
expect(group.get(`child_${childGroup.id}`)).toEqual(undefined);
|
|
1980
1753
|
});
|
|
1981
1754
|
|
|
1982
1755
|
test("Member roles are inherited by child groups (except invites)", () => {
|
|
@@ -2375,11 +2148,10 @@ test("When rotating the key of a child group, the new child key is exposed to th
|
|
|
2375
2148
|
expect(group.get(`${newReadKeyID}_for_${parentReadKeyID}`)).toBeDefined();
|
|
2376
2149
|
});
|
|
2377
2150
|
|
|
2378
|
-
test("When rotating the key of a parent group, the keys of all child groups are also rotated", () => {
|
|
2151
|
+
test("When rotating the key of a parent group, the keys of all loaded child groups are also rotated", () => {
|
|
2379
2152
|
const { group, node } = newGroupHighLevel();
|
|
2380
2153
|
const parentGroup = node.createGroup();
|
|
2381
2154
|
|
|
2382
|
-
parentGroup.set(`child_${group.id}`, "extend", "trusting");
|
|
2383
2155
|
group.set(`parent_${parentGroup.id}`, "extend", "trusting");
|
|
2384
2156
|
|
|
2385
2157
|
group.rotateReadKey();
|
|
@@ -2439,8 +2211,6 @@ test("When rotating the key of a grand-parent group, the keys of all child and g
|
|
|
2439
2211
|
const grandParentGroup = node.createGroup();
|
|
2440
2212
|
const parentGroup = node.createGroup();
|
|
2441
2213
|
|
|
2442
|
-
grandParentGroup.set(`child_${parentGroup.id}`, "extend", "trusting");
|
|
2443
|
-
parentGroup.set(`child_${group.id}`, "extend", "trusting");
|
|
2444
2214
|
parentGroup.set(`parent_${grandParentGroup.id}`, "extend", "trusting");
|
|
2445
2215
|
group.set(`parent_${grandParentGroup.id}`, "extend", "trusting");
|
|
2446
2216
|
|
|
@@ -2494,7 +2264,7 @@ test("Calling extend on group sets up parent and child references and reveals ch
|
|
|
2494
2264
|
group.extend(parentGroup);
|
|
2495
2265
|
|
|
2496
2266
|
expect(group.get(`parent_${parentGroup.id}`)).toEqual("extend");
|
|
2497
|
-
expect(parentGroup.get(`child_${group.id}`)).toEqual(
|
|
2267
|
+
expect(parentGroup.get(`child_${group.id}`)).toEqual(undefined);
|
|
2498
2268
|
|
|
2499
2269
|
const parentReadKeyID = parentGroup.get("readKey");
|
|
2500
2270
|
if (!parentReadKeyID) {
|
|
@@ -2538,8 +2308,8 @@ test("Calling extend to create grand-child groups parent and child references an
|
|
|
2538
2308
|
|
|
2539
2309
|
expect(group.get(`parent_${parentGroup.id}`)).toEqual("extend");
|
|
2540
2310
|
expect(parentGroup.get(`parent_${grandParentGroup.id}`)).toEqual("extend");
|
|
2541
|
-
expect(parentGroup.get(`child_${group.id}`)).toEqual(
|
|
2542
|
-
expect(grandParentGroup.get(`child_${parentGroup.id}`)).toEqual(
|
|
2311
|
+
expect(parentGroup.get(`child_${group.id}`)).toEqual(undefined);
|
|
2312
|
+
expect(grandParentGroup.get(`child_${parentGroup.id}`)).toEqual(undefined);
|
|
2543
2313
|
|
|
2544
2314
|
const reader = createAccountInNode(node);
|
|
2545
2315
|
grandParentGroup.addMember(reader, "reader");
|
|
@@ -2868,7 +2638,6 @@ test("High-level permissions work correctly when a group is extended", async ()
|
|
|
2868
2638
|
test("self-extensions should not break the permissions checks", () => {
|
|
2869
2639
|
const { group } = newGroupHighLevel();
|
|
2870
2640
|
|
|
2871
|
-
group.set(`child_${group.id}`, "extend", "trusting");
|
|
2872
2641
|
group.set(`parent_${group.id}`, "extend", "trusting");
|
|
2873
2642
|
|
|
2874
2643
|
const map = group.createMap();
|
|
@@ -2883,10 +2652,6 @@ test("extend cycles should not break the permissions checks", () => {
|
|
|
2883
2652
|
const group2 = node.createGroup();
|
|
2884
2653
|
const group3 = node.createGroup();
|
|
2885
2654
|
|
|
2886
|
-
group.set(`child_${group2.id}`, "extend", "trusting");
|
|
2887
|
-
group2.set(`child_${group3.id}`, "extend", "trusting");
|
|
2888
|
-
group3.set(`child_${group.id}`, "extend", "trusting");
|
|
2889
|
-
|
|
2890
2655
|
group.set(`parent_${group2.id}`, "extend", "trusting");
|
|
2891
2656
|
group2.set(`parent_${group3.id}`, "extend", "trusting");
|
|
2892
2657
|
group3.set(`parent_${group.id}`, "extend", "trusting");
|
|
@@ -2903,10 +2668,6 @@ test("extend cycles should not break the keys rotation", () => {
|
|
|
2903
2668
|
const group2 = node.createGroup();
|
|
2904
2669
|
const group3 = node.createGroup();
|
|
2905
2670
|
|
|
2906
|
-
group.set(`child_${group2.id}`, "extend", "trusting");
|
|
2907
|
-
group2.set(`child_${group3.id}`, "extend", "trusting");
|
|
2908
|
-
group3.set(`child_${group.id}`, "extend", "trusting");
|
|
2909
|
-
|
|
2910
2671
|
group.set(`parent_${group2.id}`, "extend", "trusting");
|
|
2911
2672
|
group2.set(`parent_${group3.id}`, "extend", "trusting");
|
|
2912
2673
|
group3.set(`parent_${group.id}`, "extend", "trusting");
|
|
@@ -54,7 +54,7 @@ describe("handling content messages", () => {
|
|
|
54
54
|
syncServer: edge.node,
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
client2PeerStateOnEdge.
|
|
57
|
+
client2PeerStateOnEdge.setKnownState(map.core.id, {
|
|
58
58
|
id: map.core.id,
|
|
59
59
|
header: false,
|
|
60
60
|
sessions: {},
|
|
@@ -126,7 +126,7 @@ describe("handling content messages", () => {
|
|
|
126
126
|
skipReconciliation: true,
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
-
core2PeerStateOnEdge.
|
|
129
|
+
core2PeerStateOnEdge.setKnownState(map.core.id, {
|
|
130
130
|
id: map.core.id,
|
|
131
131
|
header: false,
|
|
132
132
|
sessions: {},
|
|
@@ -99,10 +99,10 @@ describe("invitations sync", () => {
|
|
|
99
99
|
).toMatchInlineSnapshot(`
|
|
100
100
|
[
|
|
101
101
|
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
102
|
-
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New:
|
|
102
|
+
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
103
103
|
"server -> invite-consumer | CONTENT Group header: true new: After: 0 New: 7",
|
|
104
104
|
"server -> invite-consumer | CONTENT Map header: true new: After: 0 New: 1",
|
|
105
|
-
"invite-consumer -> server | KNOWN ParentGroup sessions: header/
|
|
105
|
+
"invite-consumer -> server | KNOWN ParentGroup sessions: header/3",
|
|
106
106
|
"invite-consumer -> server | KNOWN Group sessions: header/7",
|
|
107
107
|
"invite-consumer -> server | KNOWN Map sessions: header/1",
|
|
108
108
|
"invite-consumer -> server | CONTENT Group header: false new: After: 0 New: 2",
|
|
@@ -148,15 +148,15 @@ describe("invitations sync", () => {
|
|
|
148
148
|
).toMatchInlineSnapshot(`
|
|
149
149
|
[
|
|
150
150
|
"invite-consumer -> server | LOAD ParentGroup sessions: empty",
|
|
151
|
-
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New:
|
|
152
|
-
"invite-consumer -> server | KNOWN ParentGroup sessions: header/
|
|
151
|
+
"server -> invite-consumer | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
152
|
+
"invite-consumer -> server | KNOWN ParentGroup sessions: header/5",
|
|
153
153
|
"invite-consumer -> server | CONTENT ParentGroup header: false new: After: 0 New: 2",
|
|
154
154
|
"invite-consumer -> server | LOAD Map sessions: empty",
|
|
155
|
-
"server -> invite-consumer | KNOWN ParentGroup sessions: header/
|
|
155
|
+
"server -> invite-consumer | KNOWN ParentGroup sessions: header/7",
|
|
156
156
|
"server -> invite-provider | CONTENT ParentGroup header: false new: After: 0 New: 2",
|
|
157
157
|
"server -> invite-consumer | CONTENT Group header: true new: After: 0 New: 5",
|
|
158
158
|
"server -> invite-consumer | CONTENT Map header: true new: After: 0 New: 1",
|
|
159
|
-
"invite-provider -> server | KNOWN ParentGroup sessions: header/
|
|
159
|
+
"invite-provider -> server | KNOWN ParentGroup sessions: header/7",
|
|
160
160
|
"invite-consumer -> server | KNOWN Group sessions: header/5",
|
|
161
161
|
"invite-consumer -> server | KNOWN Map sessions: header/1",
|
|
162
162
|
]
|
|
@@ -174,13 +174,13 @@ describe("loading coValues from server", () => {
|
|
|
174
174
|
"server -> client2 | CONTENT Map header: true new: After: 0 New: 1",
|
|
175
175
|
"client2 -> server | KNOWN Group sessions: header/5",
|
|
176
176
|
"client2 -> server | KNOWN Map sessions: header/1",
|
|
177
|
-
"client -> server | CONTENT ParentGroup header: true new: After: 0 New:
|
|
177
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
178
178
|
"client -> server | CONTENT Group header: false new: After: 5 New: 2",
|
|
179
|
-
"server -> client | KNOWN ParentGroup sessions: header/
|
|
179
|
+
"server -> client | KNOWN ParentGroup sessions: header/3",
|
|
180
180
|
"server -> client | KNOWN Group sessions: header/7",
|
|
181
|
-
"server -> client2 | CONTENT ParentGroup header: true new: After: 0 New:
|
|
181
|
+
"server -> client2 | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
182
182
|
"server -> client2 | CONTENT Group header: false new: After: 5 New: 2",
|
|
183
|
-
"client2 -> server | KNOWN ParentGroup sessions: header/
|
|
183
|
+
"client2 -> server | KNOWN ParentGroup sessions: header/3",
|
|
184
184
|
"client2 -> server | KNOWN Group sessions: header/7",
|
|
185
185
|
]
|
|
186
186
|
`);
|
|
@@ -356,10 +356,10 @@ describe("loading coValues from server", () => {
|
|
|
356
356
|
).toMatchInlineSnapshot(`
|
|
357
357
|
[
|
|
358
358
|
"client -> server | LOAD Map sessions: empty",
|
|
359
|
-
"server -> client | CONTENT ParentGroup header: true new: After: 0 New:
|
|
359
|
+
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
360
360
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
361
361
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
362
|
-
"client -> server | KNOWN ParentGroup sessions: header/
|
|
362
|
+
"client -> server | KNOWN ParentGroup sessions: header/5",
|
|
363
363
|
"client -> server | KNOWN Group sessions: header/5",
|
|
364
364
|
"client -> server | KNOWN Map sessions: header/1",
|
|
365
365
|
]
|
|
@@ -738,9 +738,9 @@ describe("loading coValues from server", () => {
|
|
|
738
738
|
).toMatchInlineSnapshot(`
|
|
739
739
|
[
|
|
740
740
|
"client -> server | LOAD Map sessions: empty",
|
|
741
|
-
"server -> client | CONTENT ParentGroup header: true new: After: 0 New:
|
|
741
|
+
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
742
742
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
743
|
-
"client -> server | KNOWN ParentGroup sessions: header/
|
|
743
|
+
"client -> server | KNOWN ParentGroup sessions: header/5",
|
|
744
744
|
"client -> server | LOAD Group sessions: empty",
|
|
745
745
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
746
746
|
"client -> server | KNOWN Group sessions: header/5",
|
|
@@ -786,9 +786,9 @@ describe("loading coValues from server", () => {
|
|
|
786
786
|
"server -> client | CONTENT Map header: true new: After: 0 New: 1",
|
|
787
787
|
"client -> server | LOAD ParentGroup sessions: empty",
|
|
788
788
|
"client -> server | LOAD Group sessions: empty",
|
|
789
|
-
"server -> client | CONTENT ParentGroup header: true new: After: 0 New:
|
|
789
|
+
"server -> client | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
790
790
|
"server -> client | CONTENT Group header: true new: After: 0 New: 5",
|
|
791
|
-
"client -> server | KNOWN ParentGroup sessions: header/
|
|
791
|
+
"client -> server | KNOWN ParentGroup sessions: header/5",
|
|
792
792
|
"client -> server | KNOWN Group sessions: header/5",
|
|
793
793
|
"client -> server | KNOWN Map sessions: header/1",
|
|
794
794
|
]
|
|
@@ -1176,18 +1176,18 @@ describe("loading coValues from server", () => {
|
|
|
1176
1176
|
}),
|
|
1177
1177
|
).toMatchInlineSnapshot(`
|
|
1178
1178
|
[
|
|
1179
|
-
"newSession -> core | CONTENT ParentGroup header: true new: After: 0 New:
|
|
1179
|
+
"newSession -> core | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
1180
1180
|
"newSession -> core | CONTENT Group header: false new: After: 0 New: 2",
|
|
1181
|
-
"core -> newSession | KNOWN ParentGroup sessions: header/
|
|
1181
|
+
"core -> newSession | KNOWN ParentGroup sessions: header/3",
|
|
1182
1182
|
"core -> newSession | KNOWN Group sessions: header/5",
|
|
1183
1183
|
"core -> edge | CONTENT Group header: false new: After: 0 New: 2",
|
|
1184
1184
|
"edge -> core | LOAD ParentGroup sessions: empty",
|
|
1185
|
-
"core -> edge | CONTENT ParentGroup header: true new: After: 0 New:
|
|
1186
|
-
"edge -> core | KNOWN ParentGroup sessions: header/
|
|
1185
|
+
"core -> edge | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
1186
|
+
"edge -> core | KNOWN ParentGroup sessions: header/3",
|
|
1187
1187
|
"edge -> core | KNOWN Group sessions: header/5",
|
|
1188
|
-
"edge -> client | CONTENT ParentGroup header: true new: After: 0 New:
|
|
1188
|
+
"edge -> client | CONTENT ParentGroup header: true new: After: 0 New: 3",
|
|
1189
1189
|
"edge -> client | CONTENT Group header: false new: After: 0 New: 2",
|
|
1190
|
-
"client -> edge | KNOWN ParentGroup sessions: header/
|
|
1190
|
+
"client -> edge | KNOWN ParentGroup sessions: header/3",
|
|
1191
1191
|
"client -> edge | KNOWN Group sessions: header/5",
|
|
1192
1192
|
]
|
|
1193
1193
|
`);
|
|
@@ -1312,14 +1312,14 @@ describe("loading coValues from server", () => {
|
|
|
1312
1312
|
).toMatchInlineSnapshot(`
|
|
1313
1313
|
[
|
|
1314
1314
|
"client -> server | CONTENT Group header: true new: After: 0 New: 3",
|
|
1315
|
-
"client -> server | CONTENT ParentGroup header: true new: After: 0 New:
|
|
1316
|
-
"client -> server | CONTENT Group header: false new: After: 3 New:
|
|
1317
|
-
"client -> server | CONTENT ParentGroup header: false new: After:
|
|
1315
|
+
"client -> server | CONTENT ParentGroup header: true new: After: 0 New: 5",
|
|
1316
|
+
"client -> server | CONTENT Group header: false new: After: 3 New: 2",
|
|
1317
|
+
"client -> server | CONTENT ParentGroup header: false new: After: 5 New: 2",
|
|
1318
1318
|
"client -> server | CONTENT Map header: true new: After: 0 New: 1",
|
|
1319
1319
|
"server -> client | KNOWN Group sessions: header/3",
|
|
1320
|
-
"server -> client | KNOWN ParentGroup sessions: header/
|
|
1321
|
-
"server -> client | KNOWN Group sessions: header/
|
|
1322
|
-
"server -> client | KNOWN ParentGroup sessions: header/
|
|
1320
|
+
"server -> client | KNOWN ParentGroup sessions: header/5",
|
|
1321
|
+
"server -> client | KNOWN Group sessions: header/5",
|
|
1322
|
+
"server -> client | KNOWN ParentGroup sessions: header/7",
|
|
1323
1323
|
"server -> client | KNOWN Map sessions: header/1",
|
|
1324
1324
|
]
|
|
1325
1325
|
`);
|