cojson 0.13.30 → 0.13.33

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 (46) hide show
  1. package/.turbo/turbo-build.log +5 -4
  2. package/.turbo/turbo-lint.log +4 -0
  3. package/.turbo/turbo-test.log +1001 -0
  4. package/CHANGELOG.md +13 -0
  5. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  6. package/dist/coValueCore/coValueCore.js +1 -4
  7. package/dist/coValueCore/coValueCore.js.map +1 -1
  8. package/dist/coValues/group.d.ts.map +1 -1
  9. package/dist/coValues/group.js +4 -1
  10. package/dist/coValues/group.js.map +1 -1
  11. package/dist/localNode.d.ts.map +1 -1
  12. package/dist/localNode.js +1 -1
  13. package/dist/localNode.js.map +1 -1
  14. package/dist/permissions.d.ts.map +1 -1
  15. package/dist/permissions.js +0 -12
  16. package/dist/permissions.js.map +1 -1
  17. package/dist/tests/group.inheritance.test.d.ts +2 -0
  18. package/dist/tests/group.inheritance.test.d.ts.map +1 -0
  19. package/dist/tests/group.inheritance.test.js +235 -0
  20. package/dist/tests/group.inheritance.test.js.map +1 -0
  21. package/dist/tests/group.invite.test.d.ts +2 -0
  22. package/dist/tests/group.invite.test.d.ts.map +1 -0
  23. package/dist/tests/group.invite.test.js +214 -0
  24. package/dist/tests/group.invite.test.js.map +1 -0
  25. package/dist/tests/group.removeMember.test.js +22 -0
  26. package/dist/tests/group.removeMember.test.js.map +1 -1
  27. package/dist/tests/group.roleOf.test.d.ts +2 -0
  28. package/dist/tests/group.roleOf.test.d.ts.map +1 -0
  29. package/dist/tests/group.roleOf.test.js +275 -0
  30. package/dist/tests/group.roleOf.test.js.map +1 -0
  31. package/dist/tests/group.test.js +1 -505
  32. package/dist/tests/group.test.js.map +1 -1
  33. package/dist/tests/permissions.test.js +0 -33
  34. package/dist/tests/permissions.test.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/coValueCore/coValueCore.ts +1 -6
  37. package/src/coValues/group.ts +4 -1
  38. package/src/localNode.ts +3 -1
  39. package/src/permissions.ts +0 -18
  40. package/src/tests/group.inheritance.test.ts +418 -0
  41. package/src/tests/group.invite.test.ts +354 -0
  42. package/src/tests/group.removeMember.test.ts +48 -0
  43. package/src/tests/group.roleOf.test.ts +450 -0
  44. package/src/tests/group.test.ts +0 -852
  45. package/src/tests/permissions.test.ts +0 -52
  46. package/src/tests/sync.invite.test.ts +12 -4
@@ -4,7 +4,7 @@ import { RawCoMap } from "../coValues/coMap.js";
4
4
  import { RawCoStream } from "../coValues/coStream.js";
5
5
  import { RawBinaryCoStream } from "../coValues/coStream.js";
6
6
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
7
- import { createThreeConnectedNodes, createTwoConnectedNodes, loadCoValueOrFail, nodeWithRandomAgentAndSessionID, randomAgentAndSessionID, waitFor, } from "./testUtils.js";
7
+ import { createThreeConnectedNodes, createTwoConnectedNodes, loadCoValueOrFail, nodeWithRandomAgentAndSessionID, } from "./testUtils.js";
8
8
  const Crypto = await WasmCrypto.create();
9
9
  test("Can create a RawCoMap in a group", () => {
10
10
  const node = nodeWithRandomAgentAndSessionID();
@@ -258,508 +258,4 @@ describe("writeOnly", () => {
258
258
  expect(mapOnNode2.get("test")).toEqual("Written from the writeOnly member");
259
259
  });
260
260
  });
261
- describe("extend", () => {
262
- test("inherited writer roles should work correctly", async () => {
263
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
264
- const group = node1.node.createGroup();
265
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
266
- const childGroup = node1.node.createGroup();
267
- childGroup.extend(group);
268
- childGroup.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
269
- const map = childGroup.createMap();
270
- map.set("test", "Written from the admin");
271
- await map.core.waitForSync();
272
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
273
- // The writer role should be able to see the edits from the admin
274
- expect(mapOnNode2.get("test")).toEqual("Written from the admin");
275
- });
276
- test("a user should be able to extend a group when his role on the parent group is writer", async () => {
277
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
278
- const group = node1.node.createGroup();
279
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
280
- await group.core.waitForSync();
281
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
282
- const childGroup = node2.node.createGroup();
283
- childGroup.extend(groupOnNode2);
284
- const map = childGroup.createMap();
285
- map.set("test", "Written from node2");
286
- await map.core.waitForSync();
287
- await childGroup.core.waitForSync();
288
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
289
- expect(mapOnNode2.get("test")).toEqual("Written from node2");
290
- });
291
- test("a user should be able to extend a group when his role on the parent group is reader", async () => {
292
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
293
- const group = node1.node.createGroup();
294
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
295
- await group.core.waitForSync();
296
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
297
- const childGroup = node2.node.createGroup();
298
- childGroup.extend(groupOnNode2);
299
- const map = childGroup.createMap();
300
- map.set("test", "Written from node2");
301
- await map.core.waitForSync();
302
- await childGroup.core.waitForSync();
303
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
304
- expect(mapOnNode2.get("test")).toEqual("Written from node2");
305
- });
306
- test("a user should be able to extend a group when his role on the parent group is writeOnly", async () => {
307
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
308
- const group = node1.node.createGroup();
309
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
310
- await group.core.waitForSync();
311
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
312
- const childGroup = node2.node.createGroup();
313
- childGroup.extend(groupOnNode2);
314
- const map = childGroup.createMap();
315
- map.set("test", "Written from node2");
316
- await map.core.waitForSync();
317
- await childGroup.core.waitForSync();
318
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
319
- expect(mapOnNode2.get("test")).toEqual("Written from node2");
320
- });
321
- test("self-extend a group should not break anything", async () => {
322
- const { node1 } = await createTwoConnectedNodes("server", "server");
323
- const group = node1.node.createGroup();
324
- group.extend(group);
325
- const map = group.createMap();
326
- map.set("test", "Hello!");
327
- expect(map.get("test")).toEqual("Hello!");
328
- });
329
- test("should not break when introducing extend cycles", async () => {
330
- const { node1 } = await createTwoConnectedNodes("server", "server");
331
- const group = node1.node.createGroup();
332
- const group2 = node1.node.createGroup();
333
- const group3 = node1.node.createGroup();
334
- group.extend(group2);
335
- group2.extend(group3);
336
- group3.extend(group);
337
- const map = group.createMap();
338
- map.set("test", "Hello!");
339
- expect(map.get("test")).toEqual("Hello!");
340
- });
341
- test("a writerInvite role should not be inherited", async () => {
342
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
343
- const group = node1.node.createGroup();
344
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writerInvite");
345
- const childGroup = node1.node.createGroup();
346
- childGroup.extend(group);
347
- expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
348
- });
349
- });
350
- describe("unextend", () => {
351
- test("should revoke roles", async () => {
352
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
353
- // `parentGroup` has `alice` as a writer
354
- const parentGroup = node1.node.createGroup();
355
- const alice = await loadCoValueOrFail(node1.node, node2.accountID);
356
- parentGroup.addMember(alice, "writer");
357
- // `alice`'s role in `parentGroup` is `"writer"`
358
- expect(parentGroup.roleOf(alice.id)).toBe("writer");
359
- // `childGroup` has `bob` as a reader
360
- const childGroup = node1.node.createGroup();
361
- const bob = await loadCoValueOrFail(node1.node, node3.accountID);
362
- childGroup.addMember(bob, "reader");
363
- // `bob`'s role in `childGroup` is `"reader"`
364
- expect(childGroup.roleOf(bob.id)).toBe("reader");
365
- // `childGroup` has `parentGroup`'s members (in this case, `alice` as a writer)
366
- childGroup.extend(parentGroup);
367
- expect(childGroup.roleOf(alice.id)).toBe("writer");
368
- // `childGroup` no longer has `parentGroup`'s members
369
- await childGroup.revokeExtend(parentGroup);
370
- expect(childGroup.roleOf(bob.id)).toBe("reader");
371
- expect(childGroup.roleOf(alice.id)).toBe(undefined);
372
- });
373
- test("should do nothing if applied to a group that is not extended", async () => {
374
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
375
- const parentGroup = node1.node.createGroup();
376
- const alice = await loadCoValueOrFail(node1.node, node2.accountID);
377
- parentGroup.addMember(alice, "writer");
378
- const childGroup = node1.node.createGroup();
379
- const bob = await loadCoValueOrFail(node1.node, node3.accountID);
380
- childGroup.addMember(bob, "reader");
381
- await childGroup.revokeExtend(parentGroup);
382
- expect(childGroup.roleOf(bob.id)).toBe("reader");
383
- expect(childGroup.roleOf(alice.id)).toBe(undefined);
384
- });
385
- test("should not throw if the revokeExtend is called twice", async () => {
386
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
387
- const parentGroup = node1.node.createGroup();
388
- const alice = await loadCoValueOrFail(node1.node, node2.accountID);
389
- parentGroup.addMember(alice, "writer");
390
- const childGroup = node1.node.createGroup();
391
- const bob = await loadCoValueOrFail(node1.node, node3.accountID);
392
- childGroup.addMember(bob, "reader");
393
- childGroup.extend(parentGroup);
394
- await childGroup.revokeExtend(parentGroup);
395
- await childGroup.revokeExtend(parentGroup);
396
- expect(childGroup.roleOf(bob.id)).toBe("reader");
397
- expect(childGroup.roleOf(alice.id)).toBe(undefined);
398
- });
399
- });
400
- describe("extend with role mapping", () => {
401
- test("mapping to writer should add the ability to write", async () => {
402
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
403
- const group = node1.node.createGroup();
404
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
405
- const childGroup = node1.node.createGroup();
406
- childGroup.extend(group, "writer");
407
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
408
- const map = childGroup.createMap();
409
- map.set("test", "Written from the admin");
410
- await map.core.waitForSync();
411
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
412
- expect(mapOnNode2.get("test")).toEqual("Written from the admin");
413
- mapOnNode2.set("test", "Written from the inherited role");
414
- expect(mapOnNode2.get("test")).toEqual("Written from the inherited role");
415
- await mapOnNode2.core.waitForSync();
416
- expect(map.get("test")).toEqual("Written from the inherited role");
417
- });
418
- test("mapping to reader should remove the ability to write", async () => {
419
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
420
- const group = node1.node.createGroup();
421
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writer");
422
- const childGroup = node1.node.createGroup();
423
- childGroup.extend(group, "reader");
424
- expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
425
- const map = childGroup.createMap();
426
- map.set("test", "Written from the admin");
427
- await map.core.waitForSync();
428
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
429
- expect(mapOnNode2.get("test")).toEqual("Written from the admin");
430
- mapOnNode2.set("test", "Should not be visible");
431
- await mapOnNode2.core.waitForSync();
432
- expect(map.get("test")).toEqual("Written from the admin");
433
- expect(mapOnNode2.get("test")).toEqual("Written from the admin");
434
- });
435
- test("mapping to admin should add the ability to add members", async () => {
436
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
437
- const group = node1.node.createGroup();
438
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "reader");
439
- const childGroup = node1.node.createGroup();
440
- childGroup.extend(group, "admin");
441
- expect(childGroup.roleOf(node2.accountID)).toEqual("admin");
442
- await childGroup.core.waitForSync();
443
- const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
444
- childGroupOnNode2.addMember(await loadCoValueOrFail(node2.node, node3.accountID), "reader");
445
- expect(childGroupOnNode2.roleOf(node3.accountID)).toEqual("reader");
446
- });
447
- test("mapping to reader should remove the ability to add members", async () => {
448
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
449
- const group = node1.node.createGroup();
450
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "admin");
451
- const childGroup = node1.node.createGroup();
452
- childGroup.extend(group, "reader");
453
- expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
454
- await childGroup.core.waitForSync();
455
- const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
456
- const accountToAdd = await loadCoValueOrFail(node2.node, node3.accountID);
457
- expect(() => {
458
- childGroupOnNode2.addMember(accountToAdd, "reader");
459
- }).toThrow();
460
- expect(childGroupOnNode2.roleOf(node3.accountID)).toEqual(undefined);
461
- });
462
- test("non-inheritable roles should not give access to the child group when role mapping is used", async () => {
463
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
464
- const group = node1.node.createGroup();
465
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writeOnly");
466
- const childGroup = node1.node.createGroup();
467
- childGroup.extend(group, "reader");
468
- expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
469
- const map = childGroup.createMap();
470
- map.set("test", "Written from the admin");
471
- await map.core.waitForSync();
472
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
473
- expect(mapOnNode2.get("test")).toEqual(undefined);
474
- });
475
- test("invite roles should not give write access to the child group when role mapping is used", async () => {
476
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
477
- const group = node1.node.createGroup();
478
- group.addMember(await loadCoValueOrFail(node1.node, node2.accountID), "writerInvite");
479
- const childGroup = node1.node.createGroup();
480
- childGroup.extend(group, "writer");
481
- expect(childGroup.roleOf(node2.accountID)).toEqual(undefined);
482
- const map = childGroup.createMap();
483
- map.set("test", "Written from the admin");
484
- await map.core.waitForSync();
485
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
486
- expect(mapOnNode2.get("test")).toEqual("Written from the admin"); // The invite roles have access to the readKey hence can read the values on inherited groups
487
- mapOnNode2.set("test", "Should not be visible");
488
- await mapOnNode2.core.waitForSync();
489
- expect(map.get("test")).toEqual("Written from the admin");
490
- expect(mapOnNode2.get("test")).toEqual("Written from the admin");
491
- });
492
- });
493
- describe("roleOf", () => {
494
- test("returns direct role assignments", () => {
495
- const node = nodeWithRandomAgentAndSessionID();
496
- const group = node.createGroup();
497
- const [agent2] = randomAgentAndSessionID();
498
- group.addMember(agent2, "writer");
499
- expect(group.roleOfInternal(agent2.id)).toEqual("writer");
500
- });
501
- test("returns undefined for non-members", () => {
502
- const node = nodeWithRandomAgentAndSessionID();
503
- const group = node.createGroup();
504
- const [agent2] = randomAgentAndSessionID();
505
- expect(group.roleOfInternal(agent2.id)).toEqual(undefined);
506
- });
507
- test("revoked roles return undefined", () => {
508
- const node = nodeWithRandomAgentAndSessionID();
509
- const group = node.createGroup();
510
- const [agent2] = randomAgentAndSessionID();
511
- group.addMember(agent2, "writer");
512
- group.removeMemberInternal(agent2);
513
- expect(group.roleOfInternal(agent2.id)).toEqual(undefined);
514
- });
515
- test("everyone role applies to all accounts", () => {
516
- const node = nodeWithRandomAgentAndSessionID();
517
- const group = node.createGroup();
518
- const [agent2, sessionID2] = randomAgentAndSessionID();
519
- group.addMemberInternal("everyone", "reader");
520
- expect(group.roleOfInternal(agent2.id)).toEqual("reader");
521
- });
522
- test("account role overrides everyone role", () => {
523
- const node = nodeWithRandomAgentAndSessionID();
524
- const group = node.createGroup();
525
- const [agent2, sessionID2] = randomAgentAndSessionID();
526
- group.addMemberInternal("everyone", "writer");
527
- group.addMember(agent2, "reader");
528
- expect(group.roleOfInternal(agent2.id)).toEqual("reader");
529
- });
530
- test("Revoking access on everyone role should not affect existing members", () => {
531
- const node = nodeWithRandomAgentAndSessionID();
532
- const group = node.createGroup();
533
- const [agent2, sessionID2] = randomAgentAndSessionID();
534
- group.addMemberInternal("everyone", "reader");
535
- group.addMember(agent2, "writer");
536
- group.removeMemberInternal("everyone");
537
- expect(group.roleOfInternal(agent2.id)).toEqual("writer");
538
- expect(group.roleOfInternal("123")).toEqual(undefined);
539
- });
540
- test("Everyone role is inherited following the most permissive algorithm", () => {
541
- const node = nodeWithRandomAgentAndSessionID();
542
- const group = node.createGroup();
543
- const [agent2, sessionID2] = randomAgentAndSessionID();
544
- const parentGroup = node.createGroup();
545
- parentGroup.addMemberInternal("everyone", "writer");
546
- group.extend(parentGroup);
547
- group.addMember(agent2, "reader");
548
- expect(group.roleOfInternal(agent2.id)).toEqual("writer");
549
- });
550
- test("roleOf should prioritize explicit account role over everyone role in same group", async () => {
551
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
552
- const group = node1.node.createGroup();
553
- const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
554
- // Add both everyone and specific account
555
- group.addMember("everyone", "reader");
556
- group.addMember(account2, "writer");
557
- // Should return the explicit role, not everyone's role
558
- expect(group.roleOf(node2.accountID)).toEqual("writer");
559
- // Change everyone's role
560
- group.addMember("everyone", "writer");
561
- // Should still return the explicit role
562
- expect(group.roleOf(node2.accountID)).toEqual("writer");
563
- });
564
- test("roleOf should prioritize inherited everyone role over explicit account role", async () => {
565
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
566
- const parentGroup = node1.node.createGroup();
567
- const childGroup = node1.node.createGroup();
568
- const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
569
- // Set up inheritance
570
- childGroup.extend(parentGroup);
571
- // Add everyone to parent and account to child
572
- parentGroup.addMember("everyone", "writer");
573
- childGroup.addMember(account2, "reader");
574
- // Should return the explicit role from child, not inherited everyone role
575
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
576
- });
577
- test("roleOf should use everyone role when no explicit role exists", async () => {
578
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
579
- const group = node1.node.createGroup();
580
- // Add only everyone role
581
- group.addMember("everyone", "reader");
582
- // Should return everyone's role when no explicit role exists
583
- expect(group.roleOf(node2.accountID)).toEqual("reader");
584
- });
585
- test("roleOf should inherit everyone role from parent when no explicit roles exist", async () => {
586
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
587
- const parentGroup = node1.node.createGroup();
588
- const childGroup = node1.node.createGroup();
589
- // Set up inheritance
590
- childGroup.extend(parentGroup);
591
- // Add everyone to parent only
592
- parentGroup.addMember("everyone", "reader");
593
- // Should inherit everyone's role from parent
594
- expect(childGroup.roleOf(node2.accountID)).toEqual("reader");
595
- });
596
- test("roleOf should handle everyone role inheritance through multiple levels", async () => {
597
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
598
- const grandParentGroup = node1.node.createGroup();
599
- const parentGroup = node1.node.createGroup();
600
- const childGroup = node1.node.createGroup();
601
- const childGroupOnNode2 = await loadCoValueOrFail(node2.node, childGroup.id);
602
- const account2 = await loadCoValueOrFail(node1.node, node2.accountID);
603
- // Set up inheritance chain
604
- parentGroup.extend(grandParentGroup);
605
- childGroup.extend(parentGroup);
606
- // Add everyone to grandparent
607
- grandParentGroup.addMember("everyone", "writer");
608
- // Should inherit everyone's role from grandparent
609
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
610
- // Add explicit role in parent
611
- parentGroup.addMember(account2, "reader");
612
- // Should use parent's explicit role instead of grandparent's everyone role
613
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
614
- // Add explicit role in child
615
- childGroup.addMember(account2, "admin");
616
- await childGroup.core.waitForSync();
617
- // Should use child's explicit role
618
- expect(childGroup.roleOf(node2.accountID)).toEqual("admin");
619
- // Remove child's explicit role
620
- await childGroupOnNode2.removeMember(account2);
621
- await childGroupOnNode2.core.waitForSync();
622
- // Should fall back to parent's explicit role
623
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
624
- // Remove parent's explicit role
625
- await parentGroup.removeMember(account2);
626
- await childGroup.core.waitForSync();
627
- // Should fall back to grandparent's everyone role
628
- expect(childGroup.roleOf(node2.accountID)).toEqual("writer");
629
- });
630
- describe("writeOnly can be used as a role for everyone", () => {
631
- test("writeOnly can be used as a role for everyone", async () => {
632
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
633
- const group = node1.node.createGroup();
634
- group.addMember("everyone", "writeOnly");
635
- const map = group.createMap();
636
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
637
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
638
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
639
- mapOnNode2.set("test", "Written from everyone");
640
- await waitFor(async () => {
641
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
642
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
643
- });
644
- });
645
- test("switching from everyone reader to writeOnly", async () => {
646
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
647
- const group = node1.node.createGroup();
648
- group.addMember("everyone", "reader");
649
- group.addMember("everyone", "writeOnly");
650
- const map = group.createMap();
651
- map.set("test", "Written from admin");
652
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
653
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
654
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
655
- expect(mapOnNode2.get("test")).toEqual(undefined);
656
- mapOnNode2.set("test", "Written from everyone");
657
- await waitFor(async () => {
658
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
659
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
660
- });
661
- });
662
- test("switching from everyone writer to writeOnly", async () => {
663
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
664
- const group = node1.node.createGroup();
665
- group.addMember("everyone", "writer");
666
- group.addMember("everyone", "writeOnly");
667
- const map = group.createMap();
668
- map.set("test", "Written from admin");
669
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
670
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
671
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
672
- expect(mapOnNode2.get("test")).toEqual(undefined);
673
- mapOnNode2.set("test", "Written from everyone");
674
- await waitFor(async () => {
675
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
676
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
677
- });
678
- });
679
- test("switching from everyone writeOnly to reader", async () => {
680
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
681
- const group = node1.node.createGroup();
682
- group.addMember("everyone", "writeOnly");
683
- const map = group.createMap();
684
- map.set("fromAdmin", "Written from admin");
685
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
686
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
687
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
688
- expect(mapOnNode2.get("test")).toEqual(undefined);
689
- mapOnNode2.set("test", "Written from everyone");
690
- await waitFor(async () => {
691
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
692
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
693
- });
694
- group.addMember("everyone", "reader");
695
- await group.core.waitForSync();
696
- mapOnNode2.set("test", "Updated after the downgrade");
697
- expect(mapOnNode2.get("test")).toEqual("Written from everyone");
698
- expect(mapOnNode2.get("fromAdmin")).toEqual("Written from admin");
699
- });
700
- test("switching from everyone writeOnly to writer", async () => {
701
- const { node1, node2 } = await createTwoConnectedNodes("server", "server");
702
- const group = node1.node.createGroup();
703
- group.addMember("everyone", "writeOnly");
704
- const map = group.createMap();
705
- map.set("fromAdmin", "Written from admin");
706
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
707
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
708
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
709
- expect(mapOnNode2.get("test")).toEqual(undefined);
710
- mapOnNode2.set("test", "Written from everyone");
711
- await waitFor(async () => {
712
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
713
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
714
- });
715
- group.addMember("everyone", "writer");
716
- await group.core.waitForSync();
717
- mapOnNode2.set("test", "Updated after the upgrade");
718
- expect(mapOnNode2.get("test")).toEqual("Updated after the upgrade");
719
- expect(mapOnNode2.get("fromAdmin")).toEqual("Written from admin");
720
- });
721
- test("adding a reader member after writeOnly", async () => {
722
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
723
- const group = node1.node.createGroup();
724
- group.addMember("everyone", "writeOnly");
725
- const map = group.createMap();
726
- map.set("fromAdmin", "Written from admin");
727
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
728
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
729
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
730
- expect(mapOnNode2.get("test")).toEqual(undefined);
731
- mapOnNode2.set("test", "Written from everyone");
732
- await waitFor(async () => {
733
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
734
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
735
- });
736
- const account3 = await loadCoValueOrFail(node1.node, node3.accountID);
737
- group.addMember(account3, "reader");
738
- await group.core.waitForSync();
739
- const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
740
- expect(mapOnNode3.get("test")).toEqual("Written from everyone");
741
- });
742
- test.skip("adding a reader member while creating the writeOnly keys", async () => {
743
- const { node1, node2, node3 } = await createThreeConnectedNodes("server", "server", "server");
744
- const account3 = await loadCoValueOrFail(node1.node, node3.accountID);
745
- const group = node1.node.createGroup();
746
- group.addMember("everyone", "writeOnly");
747
- const map = group.createMap();
748
- map.set("fromAdmin", "Written from admin");
749
- const groupOnNode2 = await loadCoValueOrFail(node2.node, group.id);
750
- expect(groupOnNode2.myRole()).toEqual("writeOnly");
751
- const mapOnNode2 = await loadCoValueOrFail(node2.node, map.id);
752
- group.addMember(account3, "reader");
753
- expect(mapOnNode2.get("test")).toEqual(undefined);
754
- mapOnNode2.set("test", "Written from everyone");
755
- await waitFor(async () => {
756
- const mapOnNode1 = await loadCoValueOrFail(node1.node, map.id);
757
- expect(mapOnNode1.get("test")).toEqual("Written from everyone");
758
- });
759
- await group.core.waitForSync();
760
- const mapOnNode3 = await loadCoValueOrFail(node3.node, map.id);
761
- expect(mapOnNode3.get("test")).toEqual("Written from everyone");
762
- });
763
- });
764
- });
765
261
  //# sourceMappingURL=group.test.js.map