@dxos/credentials 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (40) hide show
  1. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  2. package/dist/lib/{browser → neutral}/index.mjs +79 -80
  3. package/dist/lib/neutral/index.mjs.map +7 -0
  4. package/dist/lib/{browser → neutral}/meta.json +1 -1
  5. package/dist/types/src/credentials/credential-factory.d.ts +4 -4
  6. package/dist/types/src/credentials/credential-factory.d.ts.map +1 -1
  7. package/dist/types/src/credentials/credential-generator.d.ts +3 -3
  8. package/dist/types/src/credentials/credential-generator.d.ts.map +1 -1
  9. package/dist/types/src/credentials/signing.d.ts.map +1 -1
  10. package/dist/types/src/presentations/presentation.d.ts.map +1 -1
  11. package/dist/types/src/presentations/verifier.d.ts.map +1 -1
  12. package/dist/types/src/processor/device-state-machine.d.ts +2 -2
  13. package/dist/types/src/processor/device-state-machine.d.ts.map +1 -1
  14. package/dist/types/src/processor/profile-state-machine.d.ts +2 -2
  15. package/dist/types/src/processor/profile-state-machine.d.ts.map +1 -1
  16. package/dist/types/src/state-machine/space-state-machine.d.ts +7 -1
  17. package/dist/types/src/state-machine/space-state-machine.d.ts.map +1 -1
  18. package/dist/types/tsconfig.tsbuildinfo +1 -1
  19. package/docs/README.md +17 -17
  20. package/moon.yml +2 -1
  21. package/package.json +19 -20
  22. package/src/credentials/credential-factory.ts +4 -4
  23. package/src/credentials/credential-generator.ts +5 -0
  24. package/src/credentials/signing.ts +12 -0
  25. package/src/presentations/json-encoding.test.ts +0 -2
  26. package/src/presentations/presentation.ts +0 -1
  27. package/src/presentations/verifier.test.ts +0 -1
  28. package/src/presentations/verifier.ts +0 -1
  29. package/src/processor/device-state-machine.ts +2 -3
  30. package/src/processor/profile-state-machine.ts +2 -3
  31. package/src/state-machine/invitation-state-machine.test.ts +0 -1
  32. package/src/state-machine/member-state-machine.test.ts +0 -1
  33. package/src/state-machine/space-state-machine.test.ts +243 -2
  34. package/src/state-machine/space-state-machine.ts +20 -2
  35. package/vitest.config.ts +7 -6
  36. package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
  37. package/dist/lib/browser/index.mjs.map +0 -7
  38. package/dist/lib/node-esm/index.mjs +0 -1936
  39. package/dist/lib/node-esm/index.mjs.map +0 -7
  40. package/dist/lib/node-esm/meta.json +0 -1
@@ -68,6 +68,14 @@ var getCredentialProofPayload = (credential) => {
68
68
  delete copy.parentCredentialIds;
69
69
  }
70
70
  delete copy.id;
71
+ const assertion = copy.subject?.assertion;
72
+ if (assertion) {
73
+ for (const key of Object.keys(assertion)) {
74
+ if (Array.isArray(assertion[key]) && assertion[key].length === 0) {
75
+ delete assertion[key];
76
+ }
77
+ }
78
+ }
71
79
  return Buffer.from(canonicalStringify(copy));
72
80
  };
73
81
  var canonicalStringify = (obj) => stableStringify(obj, {
@@ -314,7 +322,7 @@ var createCredentialSignerWithChain = (signer, chain, signingKey) => ({
314
322
  });
315
323
 
316
324
  // src/credentials/credential-generator.ts
317
- import { AdmittedFeed, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
325
+ import { AdmittedFeed, MembershipPolicy, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
318
326
  import { Timeframe as Timeframe2 } from "@dxos/timeframe";
319
327
  var CredentialGenerator = class {
320
328
  _signer;
@@ -328,7 +336,7 @@ var CredentialGenerator = class {
328
336
  /**
329
337
  * Create genesis messages for new Space.
330
338
  */
331
- async createSpaceGenesis(spaceKey, controlKey, creatorProfile) {
339
+ async createSpaceGenesis(spaceKey, controlKey, creatorProfile, membershipPolicy = MembershipPolicy.INVITE) {
332
340
  return [
333
341
  await createCredential({
334
342
  signer: this._signer,
@@ -336,7 +344,8 @@ var CredentialGenerator = class {
336
344
  subject: spaceKey,
337
345
  assertion: {
338
346
  "@type": "dxos.halo.credentials.SpaceGenesis",
339
- spaceKey
347
+ spaceKey,
348
+ membershipPolicy
340
349
  }
341
350
  }),
342
351
  await createCredential({
@@ -463,7 +472,7 @@ var createDeviceAuthorization = async (signer, identityKey, deviceKey) => {
463
472
  credential
464
473
  }));
465
474
  };
466
- var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId) => {
475
+ var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId, tags) => {
467
476
  const credentials = await Promise.all([
468
477
  await signer.createCredential({
469
478
  subject: identityKey,
@@ -474,7 +483,8 @@ var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFe
474
483
  role,
475
484
  profile,
476
485
  genesisFeedKey,
477
- invitationCredentialId
486
+ invitationCredentialId,
487
+ tags: tags ?? []
478
488
  }
479
489
  })
480
490
  ]);
@@ -631,7 +641,7 @@ import { runInContextAsync, synchronized } from "@dxos/async";
631
641
  import { Context } from "@dxos/context";
632
642
  import { PublicKey as PublicKey8 } from "@dxos/keys";
633
643
  import { log as log3 } from "@dxos/log";
634
- import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
644
+ import { MembershipPolicy as MembershipPolicy2, SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
635
645
  import { Callback as Callback4, ComplexMap as ComplexMap6, ComplexSet as ComplexSet3 } from "@dxos/util";
636
646
 
637
647
  // src/state-machine/feed-state-machine.ts
@@ -641,12 +651,10 @@ import { Callback, ComplexMap as ComplexMap2 } from "@dxos/util";
641
651
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/feed-state-machine.ts";
642
652
  var FeedStateMachine = class {
643
653
  _spaceKey;
644
- _feeds;
645
- onFeedAdmitted;
654
+ _feeds = new ComplexMap2(PublicKey4.hash);
655
+ onFeedAdmitted = new Callback();
646
656
  constructor(_spaceKey) {
647
657
  this._spaceKey = _spaceKey;
648
- this._feeds = new ComplexMap2(PublicKey4.hash);
649
- this.onFeedAdmitted = new Callback();
650
658
  }
651
659
  get feeds() {
652
660
  return this._feeds;
@@ -774,43 +782,36 @@ var CredentialGraph = class {
774
782
  /**
775
783
  * Local ids are used during traversals.
776
784
  */
777
- _vertexIdGenerator;
785
+ _vertexIdGenerator = 1;
778
786
  /**
779
787
  * All credentials without parent references are connected to the root.
780
788
  */
781
- _root;
789
+ _root = {
790
+ id: -1,
791
+ parents: [],
792
+ children: []
793
+ };
782
794
  /**
783
795
  * A credential which is not a parent of any other credential has the sentinel as a child.
784
796
  * Sentinel is a virtual merge-point of all credentials.
785
797
  */
786
- _sentinel;
798
+ _sentinel = {
799
+ id: -2,
800
+ parents: [],
801
+ children: []
802
+ };
787
803
  /**
788
804
  * Vertex references are used for fast credential inserts into the graph.
789
805
  */
790
- _vertexByCredentialId;
806
+ _vertexByCredentialId = new ComplexMap4(PublicKey6.hash);
791
807
  /**
792
808
  * The current state of the graph.
793
809
  */
794
- _subjectToVertex;
795
- _subjectToState;
796
- onSubjectStateChanged;
810
+ _subjectToVertex = new ComplexMap4(PublicKey6.hash);
811
+ _subjectToState = new ComplexMap4(PublicKey6.hash);
812
+ onSubjectStateChanged = new Callback3();
797
813
  constructor(_stateHandler) {
798
814
  this._stateHandler = _stateHandler;
799
- this._vertexIdGenerator = 1;
800
- this._root = {
801
- id: -1,
802
- parents: [],
803
- children: []
804
- };
805
- this._sentinel = {
806
- id: -2,
807
- parents: [],
808
- children: []
809
- };
810
- this._vertexByCredentialId = new ComplexMap4(PublicKey6.hash);
811
- this._subjectToVertex = new ComplexMap4(PublicKey6.hash);
812
- this._subjectToState = new ComplexMap4(PublicKey6.hash);
813
- this.onSubjectStateChanged = new Callback3();
814
815
  }
815
816
  getSubjectState(subjectId) {
816
817
  return this._subjectToState.get(subjectId);
@@ -1347,14 +1348,11 @@ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-mac
1347
1348
  var MemberStateMachine = class {
1348
1349
  _spaceKey;
1349
1350
  _ownerKey;
1350
- _memberProfiles;
1351
- _hashgraph;
1352
- onMemberRoleChanged;
1351
+ _memberProfiles = new ComplexMap5(PublicKey7.hash);
1352
+ _hashgraph = new CredentialGraph(this);
1353
+ onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
1353
1354
  constructor(_spaceKey) {
1354
1355
  this._spaceKey = _spaceKey;
1355
- this._memberProfiles = new ComplexMap5(PublicKey7.hash);
1356
- this._hashgraph = new CredentialGraph(this);
1357
- this.onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
1358
1356
  }
1359
1357
  get creator() {
1360
1358
  return this._ownerKey && this._hashgraph.getSubjectState(this._ownerKey);
@@ -1505,27 +1503,21 @@ var SpaceStateMachine = class {
1505
1503
  _spaceKey;
1506
1504
  _members;
1507
1505
  _feeds;
1508
- _invitations;
1509
- _credentials;
1510
- _credentialsById;
1511
- _processedCredentials;
1506
+ _invitations = new InvitationStateMachine();
1507
+ _credentials = [];
1508
+ _credentialsById = new ComplexMap6(PublicKey8.hash);
1509
+ _processedCredentials = new ComplexSet3(PublicKey8.hash);
1512
1510
  _genesisCredential;
1513
- _credentialProcessors;
1514
- onCredentialProcessed;
1511
+ _tags = [];
1512
+ _membershipPolicy = MembershipPolicy2.INVITE;
1513
+ _credentialProcessors = [];
1514
+ onCredentialProcessed = new Callback4();
1515
1515
  onMemberRoleChanged;
1516
1516
  onFeedAdmitted;
1517
- onDelegatedInvitation;
1518
- onDelegatedInvitationRemoved;
1517
+ onDelegatedInvitation = this._invitations.onDelegatedInvitation;
1518
+ onDelegatedInvitationRemoved = this._invitations.onDelegatedInvitationRemoved;
1519
1519
  constructor(_spaceKey) {
1520
1520
  this._spaceKey = _spaceKey;
1521
- this._invitations = new InvitationStateMachine();
1522
- this._credentials = [];
1523
- this._credentialsById = new ComplexMap6(PublicKey8.hash);
1524
- this._processedCredentials = new ComplexSet3(PublicKey8.hash);
1525
- this._credentialProcessors = [];
1526
- this.onCredentialProcessed = new Callback4();
1527
- this.onDelegatedInvitation = this._invitations.onDelegatedInvitation;
1528
- this.onDelegatedInvitationRemoved = this._invitations.onDelegatedInvitationRemoved;
1529
1521
  this._members = new MemberStateMachine(this._spaceKey);
1530
1522
  this._feeds = new FeedStateMachine(this._spaceKey);
1531
1523
  this.onMemberRoleChanged = this._members.onMemberRoleChanged;
@@ -1552,6 +1544,12 @@ var SpaceStateMachine = class {
1552
1544
  get genesisCredential() {
1553
1545
  return this._genesisCredential;
1554
1546
  }
1547
+ get tags() {
1548
+ return this._tags;
1549
+ }
1550
+ get membershipPolicy() {
1551
+ return this._membershipPolicy;
1552
+ }
1555
1553
  get invitations() {
1556
1554
  return this._invitations.invitations;
1557
1555
  }
@@ -1593,7 +1591,7 @@ var SpaceStateMachine = class {
1593
1591
  if (result.kind !== "pass") {
1594
1592
  log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, {
1595
1593
  F: __dxlog_file6,
1596
- L: 162,
1594
+ L: 173,
1597
1595
  S: this,
1598
1596
  C: (f, a) => f(...a)
1599
1597
  });
@@ -1606,7 +1604,7 @@ var SpaceStateMachine = class {
1606
1604
  if (this._genesisCredential) {
1607
1605
  log3.warn("Space already has a genesis credential.", void 0, {
1608
1606
  F: __dxlog_file6,
1609
- L: 171,
1607
+ L: 182,
1610
1608
  S: this,
1611
1609
  C: (f, a) => f(...a)
1612
1610
  });
@@ -1615,7 +1613,7 @@ var SpaceStateMachine = class {
1615
1613
  if (!credential.issuer.equals(this._spaceKey)) {
1616
1614
  log3.warn("Space genesis credential must be issued by space.", void 0, {
1617
1615
  F: __dxlog_file6,
1618
- L: 175,
1616
+ L: 186,
1619
1617
  S: this,
1620
1618
  C: (f, a) => f(...a)
1621
1619
  });
@@ -1624,13 +1622,15 @@ var SpaceStateMachine = class {
1624
1622
  if (!credential.subject.id.equals(this._spaceKey)) {
1625
1623
  log3.warn("Space genesis credential must be issued to space.", void 0, {
1626
1624
  F: __dxlog_file6,
1627
- L: 179,
1625
+ L: 190,
1628
1626
  S: this,
1629
1627
  C: (f, a) => f(...a)
1630
1628
  });
1631
1629
  return false;
1632
1630
  }
1633
1631
  this._genesisCredential = credential;
1632
+ this._tags = assertion.tags ?? [];
1633
+ this._membershipPolicy = assertion.membershipPolicy ?? MembershipPolicy2.INVITE;
1634
1634
  break;
1635
1635
  }
1636
1636
  case "dxos.halo.credentials.SpaceMember": {
@@ -1640,7 +1640,7 @@ var SpaceStateMachine = class {
1640
1640
  if (!this._genesisCredential) {
1641
1641
  log3.warn("Space must have a genesis credential before adding members.", void 0, {
1642
1642
  F: __dxlog_file6,
1643
- L: 192,
1643
+ L: 205,
1644
1644
  S: this,
1645
1645
  C: (f, a) => f(...a)
1646
1646
  });
@@ -1649,7 +1649,7 @@ var SpaceStateMachine = class {
1649
1649
  if (!this._canInviteNewMembers(credential.issuer)) {
1650
1650
  log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1651
1651
  F: __dxlog_file6,
1652
- L: 196,
1652
+ L: 209,
1653
1653
  S: this,
1654
1654
  C: (f, a) => f(...a)
1655
1655
  });
@@ -1663,7 +1663,7 @@ var SpaceStateMachine = class {
1663
1663
  if (!this._genesisCredential) {
1664
1664
  log3.warn("Space must have a genesis credential before adding members.", void 0, {
1665
1665
  F: __dxlog_file6,
1666
- L: 207,
1666
+ L: 220,
1667
1667
  S: this,
1668
1668
  C: (f, a) => f(...a)
1669
1669
  });
@@ -1676,7 +1676,7 @@ var SpaceStateMachine = class {
1676
1676
  if (!this._genesisCredential) {
1677
1677
  log3.warn("Space must have a genesis credential before admitting feeds.", void 0, {
1678
1678
  F: __dxlog_file6,
1679
- L: 217,
1679
+ L: 230,
1680
1680
  S: this,
1681
1681
  C: (f, a) => f(...a)
1682
1682
  });
@@ -1690,7 +1690,7 @@ var SpaceStateMachine = class {
1690
1690
  if (!this._canInviteNewMembers(credential.issuer)) {
1691
1691
  log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
1692
1692
  F: __dxlog_file6,
1693
- L: 228,
1693
+ L: 241,
1694
1694
  S: this,
1695
1695
  C: (f, a) => f(...a)
1696
1696
  });
@@ -1724,6 +1724,9 @@ var SpaceStateMachine = class {
1724
1724
  return this._canInviteNewMembers(memberKey);
1725
1725
  }
1726
1726
  _canInviteNewMembers(key) {
1727
+ if (this._membershipPolicy === MembershipPolicy2.LOCKED) {
1728
+ return key.equals(this._spaceKey) && this._members.members.size === 0;
1729
+ }
1727
1730
  return key.equals(this._spaceKey) || this._members.getRole(key) === SpaceMember3.Role.ADMIN || this._members.getRole(key) === SpaceMember3.Role.OWNER;
1728
1731
  }
1729
1732
  };
@@ -1734,23 +1737,21 @@ var CredentialConsumer = class {
1734
1737
  processor;
1735
1738
  _onOpen;
1736
1739
  _onClose;
1737
- _ctx;
1740
+ _ctx = new Context(void 0, {
1741
+ F: __dxlog_file6,
1742
+ L: 291
1743
+ });
1738
1744
  /**
1739
1745
  * @internal
1740
1746
  * Processor is ready to process live credentials.
1741
1747
  * NOTE: Setting this flag before all existing credentials are processed will cause them to be processed out of order.
1742
1748
  * Set externally.
1743
1749
  */
1744
- _isReadyForLiveCredentials;
1750
+ _isReadyForLiveCredentials = false;
1745
1751
  constructor(processor, _onOpen, _onClose) {
1746
1752
  this.processor = processor;
1747
1753
  this._onOpen = _onOpen;
1748
1754
  this._onClose = _onClose;
1749
- this._ctx = new Context(void 0, {
1750
- F: __dxlog_file6,
1751
- L: 273
1752
- });
1753
- this._isReadyForLiveCredentials = false;
1754
1755
  }
1755
1756
  /**
1756
1757
  * @internal
@@ -1782,13 +1783,11 @@ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/halo/credentials/src/processor
1782
1783
  var DeviceStateMachine = class {
1783
1784
  _params;
1784
1785
  // TODO(burdon): Return values via getter.
1785
- authorizedDeviceKeys;
1786
- deviceChainReady;
1786
+ authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
1787
+ deviceChainReady = new Trigger();
1787
1788
  deviceCredentialChain;
1788
1789
  constructor(_params) {
1789
1790
  this._params = _params;
1790
- this.authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
1791
- this.deviceChainReady = new Trigger();
1792
1791
  }
1793
1792
  async processCredential(credential) {
1794
1793
  log4("processing credential...", {
@@ -1797,7 +1796,7 @@ var DeviceStateMachine = class {
1797
1796
  credential
1798
1797
  }, {
1799
1798
  F: __dxlog_file7,
1800
- L: 36,
1799
+ L: 35,
1801
1800
  S: this,
1802
1801
  C: (f, a) => f(...a)
1803
1802
  });
@@ -1817,7 +1816,7 @@ var DeviceStateMachine = class {
1817
1816
  size: this.authorizedDeviceKeys.size
1818
1817
  }, {
1819
1818
  F: __dxlog_file7,
1820
- L: 56,
1819
+ L: 55,
1821
1820
  S: this,
1822
1821
  C: (f, a) => f(...a)
1823
1822
  });
@@ -1827,7 +1826,7 @@ var DeviceStateMachine = class {
1827
1826
  case "dxos.halo.credentials.DeviceProfile": {
1828
1827
  invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", {
1829
1828
  F: __dxlog_file7,
1830
- L: 66,
1829
+ L: 65,
1831
1830
  S: this,
1832
1831
  A: [
1833
1832
  "this.authorizedDeviceKeys.has(credential.subject.id)",
@@ -1840,7 +1839,7 @@ var DeviceStateMachine = class {
1840
1839
  profile: assertion.profile
1841
1840
  }, {
1842
1841
  F: __dxlog_file7,
1843
- L: 69,
1842
+ L: 68,
1844
1843
  S: this,
1845
1844
  C: (f, a) => f(...a)
1846
1845
  });
@@ -1873,7 +1872,7 @@ var ProfileStateMachine = class {
1873
1872
  credential
1874
1873
  }, {
1875
1874
  F: __dxlog_file8,
1876
- L: 35,
1875
+ L: 34,
1877
1876
  S: this,
1878
1877
  C: (f, a) => f(...a)
1879
1878
  });
@@ -1885,7 +1884,7 @@ var ProfileStateMachine = class {
1885
1884
  profile: this.profile
1886
1885
  }, {
1887
1886
  F: __dxlog_file8,
1888
- L: 41,
1887
+ L: 40,
1889
1888
  S: this,
1890
1889
  C: (f, a) => f(...a)
1891
1890
  });