cojson 0.18.28 → 0.18.30

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 (144) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/dist/PeerState.d.ts +23 -14
  4. package/dist/PeerState.d.ts.map +1 -1
  5. package/dist/PeerState.js +74 -23
  6. package/dist/PeerState.js.map +1 -1
  7. package/dist/SyncStateManager.d.ts +3 -3
  8. package/dist/SyncStateManager.d.ts.map +1 -1
  9. package/dist/SyncStateManager.js +18 -44
  10. package/dist/SyncStateManager.js.map +1 -1
  11. package/dist/coValueContentMessage.d.ts.map +1 -1
  12. package/dist/coValueContentMessage.js +2 -1
  13. package/dist/coValueContentMessage.js.map +1 -1
  14. package/dist/coValueCore/PeerKnownState.d.ts +21 -0
  15. package/dist/coValueCore/PeerKnownState.d.ts.map +1 -0
  16. package/dist/coValueCore/PeerKnownState.js +52 -0
  17. package/dist/coValueCore/PeerKnownState.js.map +1 -0
  18. package/dist/coValueCore/coValueCore.d.ts +39 -8
  19. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  20. package/dist/coValueCore/coValueCore.js +139 -40
  21. package/dist/coValueCore/coValueCore.js.map +1 -1
  22. package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts.map +1 -1
  23. package/dist/coValueCore/decryptTransactionChangesAndMeta.js +0 -5
  24. package/dist/coValueCore/decryptTransactionChangesAndMeta.js.map +1 -1
  25. package/dist/coValueCore/verifiedState.d.ts +0 -14
  26. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  27. package/dist/coValueCore/verifiedState.js +2 -32
  28. package/dist/coValueCore/verifiedState.js.map +1 -1
  29. package/dist/coValues/coList.d.ts +3 -4
  30. package/dist/coValues/coList.d.ts.map +1 -1
  31. package/dist/coValues/coList.js +4 -4
  32. package/dist/coValues/coList.js.map +1 -1
  33. package/dist/coValues/coMap.d.ts +3 -4
  34. package/dist/coValues/coMap.d.ts.map +1 -1
  35. package/dist/coValues/coMap.js +5 -4
  36. package/dist/coValues/coMap.js.map +1 -1
  37. package/dist/coValues/coStream.d.ts +3 -3
  38. package/dist/coValues/coStream.d.ts.map +1 -1
  39. package/dist/coValues/coStream.js +3 -4
  40. package/dist/coValues/coStream.js.map +1 -1
  41. package/dist/coValues/group.d.ts +3 -3
  42. package/dist/coValues/group.d.ts.map +1 -1
  43. package/dist/coValues/group.js +74 -52
  44. package/dist/coValues/group.js.map +1 -1
  45. package/dist/exports.d.ts +2 -2
  46. package/dist/exports.d.ts.map +1 -1
  47. package/dist/exports.js +2 -2
  48. package/dist/exports.js.map +1 -1
  49. package/dist/localNode.d.ts.map +1 -1
  50. package/dist/localNode.js +7 -5
  51. package/dist/localNode.js.map +1 -1
  52. package/dist/permissions.d.ts +5 -1
  53. package/dist/permissions.d.ts.map +1 -1
  54. package/dist/permissions.js +173 -109
  55. package/dist/permissions.js.map +1 -1
  56. package/dist/sync.d.ts.map +1 -1
  57. package/dist/sync.js +33 -44
  58. package/dist/sync.js.map +1 -1
  59. package/dist/tests/PeerKnownState.test.d.ts +2 -0
  60. package/dist/tests/PeerKnownState.test.d.ts.map +1 -0
  61. package/dist/tests/PeerKnownState.test.js +342 -0
  62. package/dist/tests/PeerKnownState.test.js.map +1 -0
  63. package/dist/tests/PeerState.test.js +17 -16
  64. package/dist/tests/PeerState.test.js.map +1 -1
  65. package/dist/tests/StorageApiAsync.test.js +12 -12
  66. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  67. package/dist/tests/StorageApiSync.test.js +11 -11
  68. package/dist/tests/StorageApiSync.test.js.map +1 -1
  69. package/dist/tests/SyncStateManager.test.js +16 -21
  70. package/dist/tests/SyncStateManager.test.js.map +1 -1
  71. package/dist/tests/coValueCore.dependencies.test.js +59 -0
  72. package/dist/tests/coValueCore.dependencies.test.js.map +1 -1
  73. package/dist/tests/coValueCore.test.js +41 -21
  74. package/dist/tests/coValueCore.test.js.map +1 -1
  75. package/dist/tests/group.addMember.test.js +266 -219
  76. package/dist/tests/group.addMember.test.js.map +1 -1
  77. package/dist/tests/group.inheritance.test.js +12 -0
  78. package/dist/tests/group.inheritance.test.js.map +1 -1
  79. package/dist/tests/group.invite.test.js +77 -0
  80. package/dist/tests/group.invite.test.js.map +1 -1
  81. package/dist/tests/group.removeMember.test.js +64 -7
  82. package/dist/tests/group.removeMember.test.js.map +1 -1
  83. package/dist/tests/group.roleOf.test.js +14 -4
  84. package/dist/tests/group.roleOf.test.js.map +1 -1
  85. package/dist/tests/permissions.test.js +51 -202
  86. package/dist/tests/permissions.test.js.map +1 -1
  87. package/dist/tests/sync.content.test.js +2 -2
  88. package/dist/tests/sync.content.test.js.map +1 -1
  89. package/dist/tests/sync.invite.test.js +6 -6
  90. package/dist/tests/sync.load.test.js +22 -22
  91. package/dist/tests/sync.mesh.test.js +9 -9
  92. package/dist/tests/sync.storage.test.js +13 -7
  93. package/dist/tests/sync.storage.test.js.map +1 -1
  94. package/dist/tests/sync.storageAsync.test.js +3 -3
  95. package/dist/tests/sync.test.js +13 -33
  96. package/dist/tests/sync.test.js.map +1 -1
  97. package/dist/tests/sync.upload.test.js +2 -2
  98. package/package.json +3 -3
  99. package/src/PeerState.ts +86 -34
  100. package/src/SyncStateManager.ts +25 -60
  101. package/src/coValueContentMessage.ts +3 -1
  102. package/src/coValueCore/PeerKnownState.ts +74 -0
  103. package/src/coValueCore/coValueCore.ts +180 -49
  104. package/src/coValueCore/decryptTransactionChangesAndMeta.ts +0 -6
  105. package/src/coValueCore/verifiedState.ts +2 -37
  106. package/src/coValues/coList.ts +7 -7
  107. package/src/coValues/coMap.ts +9 -7
  108. package/src/coValues/coStream.ts +6 -5
  109. package/src/coValues/group.ts +99 -60
  110. package/src/exports.ts +2 -1
  111. package/src/localNode.ts +7 -5
  112. package/src/permissions.ts +204 -123
  113. package/src/sync.ts +37 -53
  114. package/src/tests/PeerKnownState.test.ts +426 -0
  115. package/src/tests/PeerState.test.ts +24 -24
  116. package/src/tests/StorageApiAsync.test.ts +12 -12
  117. package/src/tests/StorageApiSync.test.ts +11 -11
  118. package/src/tests/SyncStateManager.test.ts +23 -53
  119. package/src/tests/coValueCore.dependencies.test.ts +87 -0
  120. package/src/tests/coValueCore.test.ts +64 -22
  121. package/src/tests/group.addMember.test.ts +384 -345
  122. package/src/tests/group.inheritance.test.ts +33 -0
  123. package/src/tests/group.invite.test.ts +117 -0
  124. package/src/tests/group.removeMember.test.ts +95 -9
  125. package/src/tests/group.roleOf.test.ts +16 -4
  126. package/src/tests/permissions.test.ts +56 -295
  127. package/src/tests/sync.content.test.ts +2 -2
  128. package/src/tests/sync.invite.test.ts +6 -6
  129. package/src/tests/sync.load.test.ts +22 -22
  130. package/src/tests/sync.mesh.test.ts +9 -9
  131. package/src/tests/sync.storage.test.ts +13 -8
  132. package/src/tests/sync.storageAsync.test.ts +3 -3
  133. package/src/tests/sync.test.ts +21 -50
  134. package/src/tests/sync.upload.test.ts +2 -2
  135. package/dist/PeerKnownStates.d.ts +0 -19
  136. package/dist/PeerKnownStates.d.ts.map +0 -1
  137. package/dist/PeerKnownStates.js +0 -64
  138. package/dist/PeerKnownStates.js.map +0 -1
  139. package/dist/tests/PeerKnownStates.test.d.ts +0 -2
  140. package/dist/tests/PeerKnownStates.test.d.ts.map +0 -1
  141. package/dist/tests/PeerKnownStates.test.js +0 -77
  142. package/dist/tests/PeerKnownStates.test.js.map +0 -1
  143. package/src/PeerKnownStates.ts +0 -93
  144. 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
- "Administrators cannot demote other administrators in a group",
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
- "Failed to set role due to insufficient permissions (role of current account is writer)",
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
- "Failed to set role due to insufficient permissions (role of current account is writer)",
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
- "Failed to set role due to insufficient permissions (role of current account is writer)",
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
- "Failed to set role due to insufficient permissions (role of current account is reader)",
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
- "Failed to set role due to insufficient permissions (role of current account is reader)",
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
- "Failed to set role due to insufficient permissions (role of current account is reader)",
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("WriterInvites can not invite admins", async () => {
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, "writerInvite", "trusting");
1377
+ group.set(inviteID, inviteRole, "trusting");
1351
1378
 
1352
- expect(group.get(inviteID)).toEqual("writerInvite");
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, "admin", "trusting");
1402
+ groupAsInvite.set(invitedAdminID, finalRole, "trusting");
1376
1403
  expect(groupAsInvite.get(invitedAdminID)).toBeUndefined();
1377
1404
  });
1378
1405
 
1379
- test("ReaderInvites can not invite admins", async () => {
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, "readerInvite", "trusting");
1435
+ group.set(inviteID, inviteRole, "trusting");
1402
1436
 
1403
- expect(group.get(inviteID)).toEqual("readerInvite");
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, "admin", "trusting");
1427
- expect(groupAsInvite.get(invitedAdminID)).toBeUndefined();
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("Admins can set child extensions", () => {
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("extend");
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("extend");
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("extend");
2542
- expect(grandParentGroup.get(`child_${parentGroup.id}`)).toEqual("extend");
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.setOptimisticKnownState(map.core.id, {
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.setOptimisticKnownState(map.core.id, {
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: 4",
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/4",
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: 6",
152
- "invite-consumer -> server | KNOWN ParentGroup sessions: header/6",
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/8",
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/8",
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: 4",
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/4",
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: 4",
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/4",
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: 6",
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/6",
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: 6",
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/6",
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: 6",
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/6",
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: 4",
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/4",
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: 4",
1186
- "edge -> core | KNOWN ParentGroup sessions: header/4",
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: 4",
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/4",
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: 6",
1316
- "client -> server | CONTENT Group header: false new: After: 3 New: 3",
1317
- "client -> server | CONTENT ParentGroup header: false new: After: 6 New: 2",
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/6",
1321
- "server -> client | KNOWN Group sessions: header/6",
1322
- "server -> client | KNOWN ParentGroup sessions: header/8",
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
  `);