@dxos/credentials 0.8.4-main.f5c0578 → 0.8.4-main.fcc0d83b33
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/dist/lib/{browser → neutral}/index.mjs +106 -366
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/types/src/credentials/assertions.d.ts.map +1 -1
- package/dist/types/src/credentials/credential-factory.d.ts +4 -4
- package/dist/types/src/credentials/credential-factory.d.ts.map +1 -1
- package/dist/types/src/credentials/credential-generator.d.ts +3 -3
- package/dist/types/src/credentials/credential-generator.d.ts.map +1 -1
- package/dist/types/src/credentials/signing.d.ts.map +1 -1
- package/dist/types/src/credentials/verifier.d.ts.map +1 -1
- package/dist/types/src/did.d.ts.map +1 -1
- package/dist/types/src/graph/credential-graph.d.ts.map +1 -1
- package/dist/types/src/passcode.d.ts.map +1 -1
- package/dist/types/src/presentations/presentation.d.ts.map +1 -1
- package/dist/types/src/presentations/signing.d.ts.map +1 -1
- package/dist/types/src/presentations/verifier.d.ts.map +1 -1
- package/dist/types/src/processor/device-state-machine.d.ts +2 -2
- package/dist/types/src/processor/device-state-machine.d.ts.map +1 -1
- package/dist/types/src/processor/profile-state-machine.d.ts +2 -2
- package/dist/types/src/processor/profile-state-machine.d.ts.map +1 -1
- package/dist/types/src/seedphrase.d.ts.map +1 -1
- package/dist/types/src/state-machine/feed-state-machine.d.ts.map +1 -1
- package/dist/types/src/state-machine/invitation-state-machine.d.ts.map +1 -1
- package/dist/types/src/state-machine/member-state-machine.d.ts.map +1 -1
- package/dist/types/src/state-machine/space-state-machine.d.ts +7 -1
- package/dist/types/src/state-machine/space-state-machine.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/docs/README.md +17 -17
- package/moon.yml +2 -1
- package/package.json +19 -23
- package/src/credentials/credential-factory.ts +4 -4
- package/src/credentials/credential-generator.ts +5 -0
- package/src/credentials/signing.ts +12 -0
- package/src/presentations/json-encoding.test.ts +0 -2
- package/src/presentations/presentation.ts +0 -1
- package/src/presentations/verifier.test.ts +0 -1
- package/src/presentations/verifier.ts +0 -1
- package/src/processor/device-state-machine.ts +2 -3
- package/src/processor/profile-state-machine.ts +2 -3
- package/src/state-machine/invitation-state-machine.test.ts +0 -1
- package/src/state-machine/member-state-machine.test.ts +0 -1
- package/src/state-machine/space-state-machine.test.ts +243 -2
- package/src/state-machine/space-state-machine.ts +20 -2
- package/vitest.config.ts +7 -6
- package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -1936
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
|
@@ -28,15 +28,7 @@ import { invariant } from "@dxos/invariant";
|
|
|
28
28
|
var __dxlog_file = "/__w/dxos/dxos/packages/core/halo/credentials/src/seedphrase.ts";
|
|
29
29
|
var generateSeedPhrase = () => generateMnemonic();
|
|
30
30
|
var keyPairFromSeedPhrase = (seedPhrase) => {
|
|
31
|
-
invariant(seedPhrase, void 0, {
|
|
32
|
-
F: __dxlog_file,
|
|
33
|
-
L: 20,
|
|
34
|
-
S: void 0,
|
|
35
|
-
A: [
|
|
36
|
-
"seedPhrase",
|
|
37
|
-
""
|
|
38
|
-
]
|
|
39
|
-
});
|
|
31
|
+
invariant(seedPhrase, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 13, S: void 0, A: ["seedPhrase", ""] });
|
|
40
32
|
const seed = mnemonicToSeedSync(seedPhrase);
|
|
41
33
|
return createKeyPair(seed);
|
|
42
34
|
};
|
|
@@ -68,6 +60,14 @@ var getCredentialProofPayload = (credential) => {
|
|
|
68
60
|
delete copy.parentCredentialIds;
|
|
69
61
|
}
|
|
70
62
|
delete copy.id;
|
|
63
|
+
const assertion = copy.subject?.assertion;
|
|
64
|
+
if (assertion) {
|
|
65
|
+
for (const key of Object.keys(assertion)) {
|
|
66
|
+
if (Array.isArray(assertion[key]) && assertion[key].length === 0) {
|
|
67
|
+
delete assertion[key];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
71
|
return Buffer.from(canonicalStringify(copy));
|
|
72
72
|
};
|
|
73
73
|
var canonicalStringify = (obj) => stableStringify(obj, {
|
|
@@ -228,35 +228,11 @@ var verifyChain = async (chain, authority, subject) => {
|
|
|
228
228
|
// src/credentials/credential-factory.ts
|
|
229
229
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/halo/credentials/src/credentials/credential-factory.ts";
|
|
230
230
|
var createCredential = async ({ signer, issuer, subject, assertion, signingKey, chain, nonce, parentCredentialIds }) => {
|
|
231
|
-
invariant2(assertion["@type"], "Invalid assertion.", {
|
|
232
|
-
|
|
233
|
-
L: 48,
|
|
234
|
-
S: void 0,
|
|
235
|
-
A: [
|
|
236
|
-
"assertion['@type']",
|
|
237
|
-
"'Invalid assertion.'"
|
|
238
|
-
]
|
|
239
|
-
});
|
|
240
|
-
invariant2(!!signingKey === !!chain, "Chain must be provided if and only if the signing key differs from the issuer.", {
|
|
241
|
-
F: __dxlog_file2,
|
|
242
|
-
L: 49,
|
|
243
|
-
S: void 0,
|
|
244
|
-
A: [
|
|
245
|
-
"!!signingKey === !!chain",
|
|
246
|
-
"'Chain must be provided if and only if the signing key differs from the issuer.'"
|
|
247
|
-
]
|
|
248
|
-
});
|
|
231
|
+
invariant2(assertion["@type"], "Invalid assertion.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 12, S: void 0, A: ["assertion['@type']", "'Invalid assertion.'"] });
|
|
232
|
+
invariant2(!!signingKey === !!chain, "Chain must be provided if and only if the signing key differs from the issuer.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 13, S: void 0, A: ["!!signingKey === !!chain", "'Chain must be provided if and only if the signing key differs from the issuer.'"] });
|
|
249
233
|
if (chain) {
|
|
250
234
|
const result = await verifyChain(chain, issuer, signingKey);
|
|
251
|
-
invariant2(result.kind === "pass", "Invalid chain.", {
|
|
252
|
-
F: __dxlog_file2,
|
|
253
|
-
L: 52,
|
|
254
|
-
S: void 0,
|
|
255
|
-
A: [
|
|
256
|
-
"result.kind === 'pass'",
|
|
257
|
-
"'Invalid chain.'"
|
|
258
|
-
]
|
|
259
|
-
});
|
|
235
|
+
invariant2(result.kind === "pass", "Invalid chain.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 16, S: void 0, A: ["result.kind === 'pass'", "'Invalid chain.'"] });
|
|
260
236
|
}
|
|
261
237
|
const credential = {
|
|
262
238
|
issuer,
|
|
@@ -314,7 +290,7 @@ var createCredentialSignerWithChain = (signer, chain, signingKey) => ({
|
|
|
314
290
|
});
|
|
315
291
|
|
|
316
292
|
// src/credentials/credential-generator.ts
|
|
317
|
-
import { AdmittedFeed, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
293
|
+
import { AdmittedFeed, MembershipPolicy, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
318
294
|
import { Timeframe as Timeframe2 } from "@dxos/timeframe";
|
|
319
295
|
var CredentialGenerator = class {
|
|
320
296
|
_signer;
|
|
@@ -328,7 +304,7 @@ var CredentialGenerator = class {
|
|
|
328
304
|
/**
|
|
329
305
|
* Create genesis messages for new Space.
|
|
330
306
|
*/
|
|
331
|
-
async createSpaceGenesis(spaceKey, controlKey, creatorProfile) {
|
|
307
|
+
async createSpaceGenesis(spaceKey, controlKey, creatorProfile, membershipPolicy = MembershipPolicy.INVITE) {
|
|
332
308
|
return [
|
|
333
309
|
await createCredential({
|
|
334
310
|
signer: this._signer,
|
|
@@ -336,7 +312,8 @@ var CredentialGenerator = class {
|
|
|
336
312
|
subject: spaceKey,
|
|
337
313
|
assertion: {
|
|
338
314
|
"@type": "dxos.halo.credentials.SpaceGenesis",
|
|
339
|
-
spaceKey
|
|
315
|
+
spaceKey,
|
|
316
|
+
membershipPolicy
|
|
340
317
|
}
|
|
341
318
|
}),
|
|
342
319
|
await createCredential({
|
|
@@ -463,7 +440,7 @@ var createDeviceAuthorization = async (signer, identityKey, deviceKey) => {
|
|
|
463
440
|
credential
|
|
464
441
|
}));
|
|
465
442
|
};
|
|
466
|
-
var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId) => {
|
|
443
|
+
var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFeedKey, role = SpaceMember.Role.ADMIN, membershipChainHeads = [], profile, invitationCredentialId, tags) => {
|
|
467
444
|
const credentials = await Promise.all([
|
|
468
445
|
await signer.createCredential({
|
|
469
446
|
subject: identityKey,
|
|
@@ -474,7 +451,8 @@ var createAdmissionCredentials = async (signer, identityKey, spaceKey, genesisFe
|
|
|
474
451
|
role,
|
|
475
452
|
profile,
|
|
476
453
|
genesisFeedKey,
|
|
477
|
-
invitationCredentialId
|
|
454
|
+
invitationCredentialId,
|
|
455
|
+
tags: tags ?? []
|
|
478
456
|
}
|
|
479
457
|
})
|
|
480
458
|
]);
|
|
@@ -631,7 +609,7 @@ import { runInContextAsync, synchronized } from "@dxos/async";
|
|
|
631
609
|
import { Context } from "@dxos/context";
|
|
632
610
|
import { PublicKey as PublicKey8 } from "@dxos/keys";
|
|
633
611
|
import { log as log3 } from "@dxos/log";
|
|
634
|
-
import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
612
|
+
import { MembershipPolicy as MembershipPolicy2, SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
635
613
|
import { Callback as Callback4, ComplexMap as ComplexMap6, ComplexSet as ComplexSet3 } from "@dxos/util";
|
|
636
614
|
|
|
637
615
|
// src/state-machine/feed-state-machine.ts
|
|
@@ -641,12 +619,10 @@ import { Callback, ComplexMap as ComplexMap2 } from "@dxos/util";
|
|
|
641
619
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/feed-state-machine.ts";
|
|
642
620
|
var FeedStateMachine = class {
|
|
643
621
|
_spaceKey;
|
|
644
|
-
_feeds;
|
|
645
|
-
onFeedAdmitted;
|
|
622
|
+
_feeds = new ComplexMap2(PublicKey4.hash);
|
|
623
|
+
onFeedAdmitted = new Callback();
|
|
646
624
|
constructor(_spaceKey) {
|
|
647
625
|
this._spaceKey = _spaceKey;
|
|
648
|
-
this._feeds = new ComplexMap2(PublicKey4.hash);
|
|
649
|
-
this.onFeedAdmitted = new Callback();
|
|
650
626
|
}
|
|
651
627
|
get feeds() {
|
|
652
628
|
return this._feeds;
|
|
@@ -659,24 +635,8 @@ var FeedStateMachine = class {
|
|
|
659
635
|
*/
|
|
660
636
|
async process(credential, fromFeed) {
|
|
661
637
|
const assertion = getCredentialAssertion(credential);
|
|
662
|
-
invariant3(assertion["@type"] === "dxos.halo.credentials.AdmittedFeed", void 0, {
|
|
663
|
-
|
|
664
|
-
L: 47,
|
|
665
|
-
S: this,
|
|
666
|
-
A: [
|
|
667
|
-
"assertion['@type'] === 'dxos.halo.credentials.AdmittedFeed'",
|
|
668
|
-
""
|
|
669
|
-
]
|
|
670
|
-
});
|
|
671
|
-
invariant3(assertion.spaceKey.equals(this._spaceKey), void 0, {
|
|
672
|
-
F: __dxlog_file3,
|
|
673
|
-
L: 48,
|
|
674
|
-
S: this,
|
|
675
|
-
A: [
|
|
676
|
-
"assertion.spaceKey.equals(this._spaceKey)",
|
|
677
|
-
""
|
|
678
|
-
]
|
|
679
|
-
});
|
|
638
|
+
invariant3(assertion["@type"] === "dxos.halo.credentials.AdmittedFeed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 28, S: this, A: ["assertion['@type'] === 'dxos.halo.credentials.AdmittedFeed'", ""] });
|
|
639
|
+
invariant3(assertion.spaceKey.equals(this._spaceKey), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 29, S: this, A: ["assertion.spaceKey.equals(this._spaceKey)", ""] });
|
|
680
640
|
const info = {
|
|
681
641
|
key: credential.subject.id,
|
|
682
642
|
credential,
|
|
@@ -774,43 +734,36 @@ var CredentialGraph = class {
|
|
|
774
734
|
/**
|
|
775
735
|
* Local ids are used during traversals.
|
|
776
736
|
*/
|
|
777
|
-
_vertexIdGenerator;
|
|
737
|
+
_vertexIdGenerator = 1;
|
|
778
738
|
/**
|
|
779
739
|
* All credentials without parent references are connected to the root.
|
|
780
740
|
*/
|
|
781
|
-
_root
|
|
741
|
+
_root = {
|
|
742
|
+
id: -1,
|
|
743
|
+
parents: [],
|
|
744
|
+
children: []
|
|
745
|
+
};
|
|
782
746
|
/**
|
|
783
747
|
* A credential which is not a parent of any other credential has the sentinel as a child.
|
|
784
748
|
* Sentinel is a virtual merge-point of all credentials.
|
|
785
749
|
*/
|
|
786
|
-
_sentinel
|
|
750
|
+
_sentinel = {
|
|
751
|
+
id: -2,
|
|
752
|
+
parents: [],
|
|
753
|
+
children: []
|
|
754
|
+
};
|
|
787
755
|
/**
|
|
788
756
|
* Vertex references are used for fast credential inserts into the graph.
|
|
789
757
|
*/
|
|
790
|
-
_vertexByCredentialId;
|
|
758
|
+
_vertexByCredentialId = new ComplexMap4(PublicKey6.hash);
|
|
791
759
|
/**
|
|
792
760
|
* The current state of the graph.
|
|
793
761
|
*/
|
|
794
|
-
_subjectToVertex;
|
|
795
|
-
_subjectToState;
|
|
796
|
-
onSubjectStateChanged;
|
|
762
|
+
_subjectToVertex = new ComplexMap4(PublicKey6.hash);
|
|
763
|
+
_subjectToState = new ComplexMap4(PublicKey6.hash);
|
|
764
|
+
onSubjectStateChanged = new Callback3();
|
|
797
765
|
constructor(_stateHandler) {
|
|
798
766
|
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
767
|
}
|
|
815
768
|
getSubjectState(subjectId) {
|
|
816
769
|
return this._subjectToState.get(subjectId);
|
|
@@ -846,12 +799,7 @@ var CredentialGraph = class {
|
|
|
846
799
|
log.error("credential skipped because of the unknown parent", {
|
|
847
800
|
credential,
|
|
848
801
|
parentId
|
|
849
|
-
}, {
|
|
850
|
-
F: __dxlog_file4,
|
|
851
|
-
L: 72,
|
|
852
|
-
S: this,
|
|
853
|
-
C: (f, a) => f(...a)
|
|
854
|
-
});
|
|
802
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 70, S: this });
|
|
855
803
|
continue;
|
|
856
804
|
}
|
|
857
805
|
parentVertex.children.push(newVertex);
|
|
@@ -868,29 +816,13 @@ var CredentialGraph = class {
|
|
|
868
816
|
if (sentinelIdx >= 0) {
|
|
869
817
|
vertex.children.splice(sentinelIdx, 1);
|
|
870
818
|
const vertexInSentinelIdx = this._sentinel.parents.indexOf(vertex);
|
|
871
|
-
invariant4(vertexInSentinelIdx >= 0, void 0, {
|
|
872
|
-
F: __dxlog_file4,
|
|
873
|
-
L: 90,
|
|
874
|
-
S: this,
|
|
875
|
-
A: [
|
|
876
|
-
"vertexInSentinelIdx >= 0",
|
|
877
|
-
""
|
|
878
|
-
]
|
|
879
|
-
});
|
|
819
|
+
invariant4(vertexInSentinelIdx >= 0, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 90, S: this, A: ["vertexInSentinelIdx >= 0", ""] });
|
|
880
820
|
this._sentinel.parents.splice(vertexInSentinelIdx, 1);
|
|
881
821
|
}
|
|
882
822
|
}
|
|
883
823
|
async _onVertexInserted(newVertex) {
|
|
884
824
|
const { credential, assertion } = newVertex;
|
|
885
|
-
invariant4(credential, void 0, {
|
|
886
|
-
F: __dxlog_file4,
|
|
887
|
-
L: 97,
|
|
888
|
-
S: this,
|
|
889
|
-
A: [
|
|
890
|
-
"credential",
|
|
891
|
-
""
|
|
892
|
-
]
|
|
893
|
-
});
|
|
825
|
+
invariant4(credential, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 96, S: this, A: ["credential", ""] });
|
|
894
826
|
let changedSubjects = [];
|
|
895
827
|
const isUpdateAppliedOnTopOfThePreviousState = this._sentinel.parents.length === 1;
|
|
896
828
|
if (isUpdateAppliedOnTopOfThePreviousState) {
|
|
@@ -927,21 +859,11 @@ var CredentialGraph = class {
|
|
|
927
859
|
const path = paths.pop();
|
|
928
860
|
log("visit vertex", {
|
|
929
861
|
id: path.head.id
|
|
930
|
-
}, {
|
|
931
|
-
F: __dxlog_file4,
|
|
932
|
-
L: 132,
|
|
933
|
-
S: this,
|
|
934
|
-
C: (f, a) => f(...a)
|
|
935
|
-
});
|
|
862
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 131, S: this });
|
|
936
863
|
this._updatePathState(path);
|
|
937
864
|
const convergedPaths = this._handleMergePoint(paths, pendingPaths, path);
|
|
938
865
|
if (convergedPaths == null) {
|
|
939
|
-
log("waiting for other paths", void 0, {
|
|
940
|
-
F: __dxlog_file4,
|
|
941
|
-
L: 136,
|
|
942
|
-
S: this,
|
|
943
|
-
C: (f, a) => f(...a)
|
|
944
|
-
});
|
|
866
|
+
log("waiting for other paths", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 137, S: this });
|
|
945
867
|
continue;
|
|
946
868
|
}
|
|
947
869
|
const mergeResult = this._mergePaths(convergedPaths);
|
|
@@ -965,12 +887,7 @@ var CredentialGraph = class {
|
|
|
965
887
|
path: toChosenPath(p),
|
|
966
888
|
head: p.head.id
|
|
967
889
|
}))
|
|
968
|
-
}, {
|
|
969
|
-
F: __dxlog_file4,
|
|
970
|
-
L: 155,
|
|
971
|
-
S: this,
|
|
972
|
-
C: (f, a) => f(...a)
|
|
973
|
-
});
|
|
890
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 156, S: this });
|
|
974
891
|
}
|
|
975
892
|
return this._setCurrentState(lastPath);
|
|
976
893
|
}
|
|
@@ -991,12 +908,7 @@ var CredentialGraph = class {
|
|
|
991
908
|
path: toChosenPath(path),
|
|
992
909
|
overrides: path?.stateOverrides?.mapValues((v) => this._stateHandler.toLogString(v.assertion))
|
|
993
910
|
}))
|
|
994
|
-
}), {
|
|
995
|
-
F: __dxlog_file4,
|
|
996
|
-
L: 175,
|
|
997
|
-
S: this,
|
|
998
|
-
C: (f, a) => f(...a)
|
|
999
|
-
});
|
|
911
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 175, S: this });
|
|
1000
912
|
const clearedPending = convergedPaths.filter((l) => !mergeResult.replay.includes(l));
|
|
1001
913
|
pendingPaths.set(convergedPaths[0].head.id, clearedPending);
|
|
1002
914
|
}
|
|
@@ -1008,12 +920,7 @@ var CredentialGraph = class {
|
|
|
1008
920
|
return null;
|
|
1009
921
|
}
|
|
1010
922
|
if (path.head.id === this._sentinel.id && paths.length > 0) {
|
|
1011
|
-
log("waiting for all the active paths to converge on the sentinel", void 0, {
|
|
1012
|
-
F: __dxlog_file4,
|
|
1013
|
-
L: 199,
|
|
1014
|
-
S: this,
|
|
1015
|
-
C: (f, a) => f(...a)
|
|
1016
|
-
});
|
|
923
|
+
log("waiting for all the active paths to converge on the sentinel", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 194, S: this });
|
|
1017
924
|
return null;
|
|
1018
925
|
}
|
|
1019
926
|
pendingPaths.delete(path.head.id);
|
|
@@ -1038,12 +945,7 @@ var CredentialGraph = class {
|
|
|
1038
945
|
log("path state updated", () => ({
|
|
1039
946
|
subject: updatedSubject,
|
|
1040
947
|
newState: this._stateHandler.toLogString(path.head.assertion)
|
|
1041
|
-
}), {
|
|
1042
|
-
F: __dxlog_file4,
|
|
1043
|
-
L: 223,
|
|
1044
|
-
S: this,
|
|
1045
|
-
C: (f, a) => f(...a)
|
|
1046
|
-
});
|
|
948
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 217, S: this });
|
|
1047
949
|
}
|
|
1048
950
|
}
|
|
1049
951
|
_forkTraversal(paths, path) {
|
|
@@ -1053,12 +955,7 @@ var CredentialGraph = class {
|
|
|
1053
955
|
log("edge traversal", {
|
|
1054
956
|
from: path.head.id,
|
|
1055
957
|
to: choice.id
|
|
1056
|
-
}, {
|
|
1057
|
-
F: __dxlog_file4,
|
|
1058
|
-
L: 234,
|
|
1059
|
-
S: this,
|
|
1060
|
-
C: (f, a) => f(...a)
|
|
1061
|
-
});
|
|
958
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 227, S: this });
|
|
1062
959
|
const fork = {
|
|
1063
960
|
forkPoint: path,
|
|
1064
961
|
chosenPath: {
|
|
@@ -1151,15 +1048,7 @@ var CredentialGraph = class {
|
|
|
1151
1048
|
return path;
|
|
1152
1049
|
}
|
|
1153
1050
|
_mergePaths(convergedPaths) {
|
|
1154
|
-
invariant4(convergedPaths.length >= 1, void 0, {
|
|
1155
|
-
F: __dxlog_file4,
|
|
1156
|
-
L: 324,
|
|
1157
|
-
S: this,
|
|
1158
|
-
A: [
|
|
1159
|
-
"convergedPaths.length >= 1",
|
|
1160
|
-
""
|
|
1161
|
-
]
|
|
1162
|
-
});
|
|
1051
|
+
invariant4(convergedPaths.length >= 1, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 320, S: this, A: ["convergedPaths.length >= 1", ""] });
|
|
1163
1052
|
if (convergedPaths.length === 1) {
|
|
1164
1053
|
return {
|
|
1165
1054
|
type: "merged",
|
|
@@ -1171,22 +1060,9 @@ var CredentialGraph = class {
|
|
|
1171
1060
|
forkPointId: forkPoint.head.id,
|
|
1172
1061
|
pathCount: convergedPaths.length,
|
|
1173
1062
|
forkPoints: convergedPaths.map((fp) => fp.forkPoint?.head.id)
|
|
1174
|
-
}), {
|
|
1175
|
-
F: __dxlog_file4,
|
|
1176
|
-
L: 329,
|
|
1177
|
-
S: this,
|
|
1178
|
-
C: (f, a) => f(...a)
|
|
1179
|
-
});
|
|
1063
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 328, S: this });
|
|
1180
1064
|
const paths = convergedPaths.map((p) => this._moveUpToForkPoint(forkPoint, p));
|
|
1181
|
-
invariant4(forkPoint, void 0, {
|
|
1182
|
-
F: __dxlog_file4,
|
|
1183
|
-
L: 335,
|
|
1184
|
-
S: this,
|
|
1185
|
-
A: [
|
|
1186
|
-
"forkPoint",
|
|
1187
|
-
""
|
|
1188
|
-
]
|
|
1189
|
-
});
|
|
1065
|
+
invariant4(forkPoint, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 334, S: this, A: ["forkPoint", ""] });
|
|
1190
1066
|
const result = {
|
|
1191
1067
|
forkPoint: forkPoint.forkPoint,
|
|
1192
1068
|
chosenPath: {
|
|
@@ -1207,12 +1083,7 @@ var CredentialGraph = class {
|
|
|
1207
1083
|
modified: path.forkChangedSubjects,
|
|
1208
1084
|
forkIssuers: path.forkIssuers,
|
|
1209
1085
|
state: path.state.mapValues((v) => this._stateHandler.toLogString(v.assertion))
|
|
1210
|
-
}), {
|
|
1211
|
-
F: __dxlog_file4,
|
|
1212
|
-
L: 348,
|
|
1213
|
-
S: this,
|
|
1214
|
-
C: (f, a) => f(...a)
|
|
1215
|
-
});
|
|
1086
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 350, S: this });
|
|
1216
1087
|
path.forkIssuers.forEach((iss) => result.forkIssuers.add(iss));
|
|
1217
1088
|
path.credentials.forEach((cred) => result.credentials.add(cred));
|
|
1218
1089
|
result.chosenPath[forkPoint.head.id].push(...path.chosenPath[forkPoint.head.id] ?? []);
|
|
@@ -1232,12 +1103,7 @@ var CredentialGraph = class {
|
|
|
1232
1103
|
log("set subject state", () => ({
|
|
1233
1104
|
subject,
|
|
1234
1105
|
state: this._stateHandler.toLogString(vertex.assertion)
|
|
1235
|
-
}), {
|
|
1236
|
-
F: __dxlog_file4,
|
|
1237
|
-
L: 370,
|
|
1238
|
-
S: this,
|
|
1239
|
-
C: (f, a) => f(...a)
|
|
1240
|
-
});
|
|
1106
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 372, S: this });
|
|
1241
1107
|
const otherPaths = paths.filter((p) => p !== branch);
|
|
1242
1108
|
this._stateHandler.getConflictingPaths(otherPaths, vertex).forEach(addReplayPath);
|
|
1243
1109
|
}
|
|
@@ -1276,12 +1142,7 @@ var CredentialGraph = class {
|
|
|
1276
1142
|
if (candidateVertex.id === mergePointId || currentVertex.id === mergePointId) {
|
|
1277
1143
|
log("merge point chosen to break the tie", {
|
|
1278
1144
|
mergePointId: existing.head.id
|
|
1279
|
-
}, {
|
|
1280
|
-
F: __dxlog_file4,
|
|
1281
|
-
L: 408,
|
|
1282
|
-
S: this,
|
|
1283
|
-
C: (f, a) => f(...a)
|
|
1284
|
-
});
|
|
1145
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 412, S: this });
|
|
1285
1146
|
return mergePointId === candidateVertex.id;
|
|
1286
1147
|
}
|
|
1287
1148
|
const candidateCredential = candidateVertex.credential;
|
|
@@ -1290,12 +1151,7 @@ var CredentialGraph = class {
|
|
|
1290
1151
|
log("one of the credentials was overridden in another branch", {
|
|
1291
1152
|
current: currentVertex.id,
|
|
1292
1153
|
candidate: candidateVertex.id
|
|
1293
|
-
}, {
|
|
1294
|
-
F: __dxlog_file4,
|
|
1295
|
-
L: 415,
|
|
1296
|
-
S: this,
|
|
1297
|
-
C: (f, a) => f(...a)
|
|
1298
|
-
});
|
|
1154
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 421, S: this });
|
|
1299
1155
|
return candidate.credentials.has(currentCredential.id);
|
|
1300
1156
|
}
|
|
1301
1157
|
const winningCredential = this._stateHandler.tryPickWinningUpdate(existing, currentCredential, candidate, candidateCredential);
|
|
@@ -1308,20 +1164,10 @@ var CredentialGraph = class {
|
|
|
1308
1164
|
existing.forkIssuers.size,
|
|
1309
1165
|
candidate.forkIssuers.size
|
|
1310
1166
|
]
|
|
1311
|
-
}, {
|
|
1312
|
-
F: __dxlog_file4,
|
|
1313
|
-
L: 432,
|
|
1314
|
-
S: this,
|
|
1315
|
-
C: (f, a) => f(...a)
|
|
1316
|
-
});
|
|
1167
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 433, S: this });
|
|
1317
1168
|
return candidate.forkIssuers.size > existing.forkIssuers.size;
|
|
1318
1169
|
}
|
|
1319
|
-
log("issuance date used to break the tie", void 0, {
|
|
1320
|
-
F: __dxlog_file4,
|
|
1321
|
-
L: 437,
|
|
1322
|
-
S: this,
|
|
1323
|
-
C: (f, a) => f(...a)
|
|
1324
|
-
});
|
|
1170
|
+
log("issuance date used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 441, S: this });
|
|
1325
1171
|
return candidateCredential.issuanceDate.getTime() > currentCredential.issuanceDate.getTime();
|
|
1326
1172
|
}
|
|
1327
1173
|
_createRootPath() {
|
|
@@ -1347,14 +1193,11 @@ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-mac
|
|
|
1347
1193
|
var MemberStateMachine = class {
|
|
1348
1194
|
_spaceKey;
|
|
1349
1195
|
_ownerKey;
|
|
1350
|
-
_memberProfiles;
|
|
1351
|
-
_hashgraph;
|
|
1352
|
-
onMemberRoleChanged;
|
|
1196
|
+
_memberProfiles = new ComplexMap5(PublicKey7.hash);
|
|
1197
|
+
_hashgraph = new CredentialGraph(this);
|
|
1198
|
+
onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
|
|
1353
1199
|
constructor(_spaceKey) {
|
|
1354
1200
|
this._spaceKey = _spaceKey;
|
|
1355
|
-
this._memberProfiles = new ComplexMap5(PublicKey7.hash);
|
|
1356
|
-
this._hashgraph = new CredentialGraph(this);
|
|
1357
|
-
this.onMemberRoleChanged = this._hashgraph.onSubjectStateChanged;
|
|
1358
1201
|
}
|
|
1359
1202
|
get creator() {
|
|
1360
1203
|
return this._ownerKey && this._hashgraph.getSubjectState(this._ownerKey);
|
|
@@ -1376,15 +1219,7 @@ var MemberStateMachine = class {
|
|
|
1376
1219
|
const assertion = getCredentialAssertion(credential);
|
|
1377
1220
|
switch (assertion["@type"]) {
|
|
1378
1221
|
case "dxos.halo.credentials.SpaceMember": {
|
|
1379
|
-
invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, {
|
|
1380
|
-
F: __dxlog_file5,
|
|
1381
|
-
L: 66,
|
|
1382
|
-
S: this,
|
|
1383
|
-
A: [
|
|
1384
|
-
"assertion.spaceKey.equals(this._spaceKey)",
|
|
1385
|
-
""
|
|
1386
|
-
]
|
|
1387
|
-
});
|
|
1222
|
+
invariant5(assertion.spaceKey.equals(this._spaceKey), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 43, S: this, A: ["assertion.spaceKey.equals(this._spaceKey)", ""] });
|
|
1388
1223
|
if (this._ownerKey == null && credential.issuer === this._spaceKey) {
|
|
1389
1224
|
this._ownerKey = credential.subject.id;
|
|
1390
1225
|
}
|
|
@@ -1401,12 +1236,7 @@ var MemberStateMachine = class {
|
|
|
1401
1236
|
} else {
|
|
1402
1237
|
log2.warn("Member not found", {
|
|
1403
1238
|
id: credential.subject.id
|
|
1404
|
-
}, {
|
|
1405
|
-
F: __dxlog_file5,
|
|
1406
|
-
L: 81,
|
|
1407
|
-
S: this,
|
|
1408
|
-
C: (f, a) => f(...a)
|
|
1409
|
-
});
|
|
1239
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 59, S: this });
|
|
1410
1240
|
}
|
|
1411
1241
|
this._memberProfiles.set(credential.subject.id, assertion.profile);
|
|
1412
1242
|
break;
|
|
@@ -1451,12 +1281,7 @@ var MemberStateMachine = class {
|
|
|
1451
1281
|
const path1IssuerRole = this._getRole(scope1, update1.issuer);
|
|
1452
1282
|
const path2IssuerRole = this._getRole(scope2, update2.issuer);
|
|
1453
1283
|
if (path2IssuerRole === SpaceMember2.Role.OWNER !== (path1IssuerRole === SpaceMember2.Role.OWNER)) {
|
|
1454
|
-
log2("owner decision used to break the tie", void 0, {
|
|
1455
|
-
F: __dxlog_file5,
|
|
1456
|
-
L: 139,
|
|
1457
|
-
S: this,
|
|
1458
|
-
C: (f, a) => f(...a)
|
|
1459
|
-
});
|
|
1284
|
+
log2("owner decision used to break the tie", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 107, S: this });
|
|
1460
1285
|
return path1IssuerRole === SpaceMember2.Role.OWNER ? update1 : update2;
|
|
1461
1286
|
}
|
|
1462
1287
|
return null;
|
|
@@ -1480,12 +1305,7 @@ var MemberStateMachine = class {
|
|
|
1480
1305
|
headId: scope.head?.id,
|
|
1481
1306
|
roleOverride: this.toLogString(override.assertion),
|
|
1482
1307
|
realRole: this.toLogString(scope.state.get(memberId)?.assertion)
|
|
1483
|
-
}), {
|
|
1484
|
-
F: __dxlog_file5,
|
|
1485
|
-
L: 162,
|
|
1486
|
-
S: this,
|
|
1487
|
-
C: (f, a) => f(...a)
|
|
1488
|
-
});
|
|
1308
|
+
}), { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 127, S: this });
|
|
1489
1309
|
return override.assertion.role;
|
|
1490
1310
|
}
|
|
1491
1311
|
}
|
|
@@ -1494,38 +1314,32 @@ var MemberStateMachine = class {
|
|
|
1494
1314
|
};
|
|
1495
1315
|
|
|
1496
1316
|
// src/state-machine/space-state-machine.ts
|
|
1317
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/space-state-machine.ts";
|
|
1497
1318
|
function _ts_decorate(decorators, target, key, desc) {
|
|
1498
1319
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1499
1320
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1500
1321
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1501
1322
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1502
1323
|
}
|
|
1503
|
-
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/halo/credentials/src/state-machine/space-state-machine.ts";
|
|
1504
1324
|
var SpaceStateMachine = class {
|
|
1505
1325
|
_spaceKey;
|
|
1506
1326
|
_members;
|
|
1507
1327
|
_feeds;
|
|
1508
|
-
_invitations;
|
|
1509
|
-
_credentials;
|
|
1510
|
-
_credentialsById;
|
|
1511
|
-
_processedCredentials;
|
|
1328
|
+
_invitations = new InvitationStateMachine();
|
|
1329
|
+
_credentials = [];
|
|
1330
|
+
_credentialsById = new ComplexMap6(PublicKey8.hash);
|
|
1331
|
+
_processedCredentials = new ComplexSet3(PublicKey8.hash);
|
|
1512
1332
|
_genesisCredential;
|
|
1513
|
-
|
|
1514
|
-
|
|
1333
|
+
_tags = [];
|
|
1334
|
+
_membershipPolicy = MembershipPolicy2.INVITE;
|
|
1335
|
+
_credentialProcessors = [];
|
|
1336
|
+
onCredentialProcessed = new Callback4();
|
|
1515
1337
|
onMemberRoleChanged;
|
|
1516
1338
|
onFeedAdmitted;
|
|
1517
|
-
onDelegatedInvitation;
|
|
1518
|
-
onDelegatedInvitationRemoved;
|
|
1339
|
+
onDelegatedInvitation = this._invitations.onDelegatedInvitation;
|
|
1340
|
+
onDelegatedInvitationRemoved = this._invitations.onDelegatedInvitationRemoved;
|
|
1519
1341
|
constructor(_spaceKey) {
|
|
1520
1342
|
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
1343
|
this._members = new MemberStateMachine(this._spaceKey);
|
|
1530
1344
|
this._feeds = new FeedStateMachine(this._spaceKey);
|
|
1531
1345
|
this.onMemberRoleChanged = this._members.onMemberRoleChanged;
|
|
@@ -1552,6 +1366,12 @@ var SpaceStateMachine = class {
|
|
|
1552
1366
|
get genesisCredential() {
|
|
1553
1367
|
return this._genesisCredential;
|
|
1554
1368
|
}
|
|
1369
|
+
get tags() {
|
|
1370
|
+
return this._tags;
|
|
1371
|
+
}
|
|
1372
|
+
get membershipPolicy() {
|
|
1373
|
+
return this._membershipPolicy;
|
|
1374
|
+
}
|
|
1555
1375
|
get invitations() {
|
|
1556
1376
|
return this._invitations.invitations;
|
|
1557
1377
|
}
|
|
@@ -1591,12 +1411,7 @@ var SpaceStateMachine = class {
|
|
|
1591
1411
|
if (!skipVerification) {
|
|
1592
1412
|
const result = await verifyCredential(credential);
|
|
1593
1413
|
if (result.kind !== "pass") {
|
|
1594
|
-
log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, {
|
|
1595
|
-
F: __dxlog_file6,
|
|
1596
|
-
L: 162,
|
|
1597
|
-
S: this,
|
|
1598
|
-
C: (f, a) => f(...a)
|
|
1599
|
-
});
|
|
1414
|
+
log3.warn(`Invalid credential: ${result.errors.join(", ")}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 116, S: this });
|
|
1600
1415
|
return false;
|
|
1601
1416
|
}
|
|
1602
1417
|
}
|
|
@@ -1604,33 +1419,20 @@ var SpaceStateMachine = class {
|
|
|
1604
1419
|
switch (assertion["@type"]) {
|
|
1605
1420
|
case "dxos.halo.credentials.SpaceGenesis": {
|
|
1606
1421
|
if (this._genesisCredential) {
|
|
1607
|
-
log3.warn("Space already has a genesis credential.", void 0, {
|
|
1608
|
-
F: __dxlog_file6,
|
|
1609
|
-
L: 171,
|
|
1610
|
-
S: this,
|
|
1611
|
-
C: (f, a) => f(...a)
|
|
1612
|
-
});
|
|
1422
|
+
log3.warn("Space already has a genesis credential.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 125, S: this });
|
|
1613
1423
|
return false;
|
|
1614
1424
|
}
|
|
1615
1425
|
if (!credential.issuer.equals(this._spaceKey)) {
|
|
1616
|
-
log3.warn("Space genesis credential must be issued by space.", void 0, {
|
|
1617
|
-
F: __dxlog_file6,
|
|
1618
|
-
L: 175,
|
|
1619
|
-
S: this,
|
|
1620
|
-
C: (f, a) => f(...a)
|
|
1621
|
-
});
|
|
1426
|
+
log3.warn("Space genesis credential must be issued by space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 129, S: this });
|
|
1622
1427
|
return false;
|
|
1623
1428
|
}
|
|
1624
1429
|
if (!credential.subject.id.equals(this._spaceKey)) {
|
|
1625
|
-
log3.warn("Space genesis credential must be issued to space.", void 0, {
|
|
1626
|
-
F: __dxlog_file6,
|
|
1627
|
-
L: 179,
|
|
1628
|
-
S: this,
|
|
1629
|
-
C: (f, a) => f(...a)
|
|
1630
|
-
});
|
|
1430
|
+
log3.warn("Space genesis credential must be issued to space.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 133, S: this });
|
|
1631
1431
|
return false;
|
|
1632
1432
|
}
|
|
1633
1433
|
this._genesisCredential = credential;
|
|
1434
|
+
this._tags = assertion.tags ?? [];
|
|
1435
|
+
this._membershipPolicy = assertion.membershipPolicy ?? MembershipPolicy2.INVITE;
|
|
1634
1436
|
break;
|
|
1635
1437
|
}
|
|
1636
1438
|
case "dxos.halo.credentials.SpaceMember": {
|
|
@@ -1638,21 +1440,11 @@ var SpaceStateMachine = class {
|
|
|
1638
1440
|
break;
|
|
1639
1441
|
}
|
|
1640
1442
|
if (!this._genesisCredential) {
|
|
1641
|
-
log3.warn("Space must have a genesis credential before adding members.", void 0, {
|
|
1642
|
-
F: __dxlog_file6,
|
|
1643
|
-
L: 192,
|
|
1644
|
-
S: this,
|
|
1645
|
-
C: (f, a) => f(...a)
|
|
1646
|
-
});
|
|
1443
|
+
log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 147, S: this });
|
|
1647
1444
|
return false;
|
|
1648
1445
|
}
|
|
1649
1446
|
if (!this._canInviteNewMembers(credential.issuer)) {
|
|
1650
|
-
log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
|
|
1651
|
-
F: __dxlog_file6,
|
|
1652
|
-
L: 196,
|
|
1653
|
-
S: this,
|
|
1654
|
-
C: (f, a) => f(...a)
|
|
1655
|
-
});
|
|
1447
|
+
log3.warn(`Space member is not authorized to invite new members: ${credential.issuer}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 151, S: this });
|
|
1656
1448
|
return false;
|
|
1657
1449
|
}
|
|
1658
1450
|
await this._members.process(credential);
|
|
@@ -1661,12 +1453,7 @@ var SpaceStateMachine = class {
|
|
|
1661
1453
|
}
|
|
1662
1454
|
case "dxos.halo.credentials.MemberProfile": {
|
|
1663
1455
|
if (!this._genesisCredential) {
|
|
1664
|
-
log3.warn("Space must have a genesis credential before adding members.", void 0, {
|
|
1665
|
-
F: __dxlog_file6,
|
|
1666
|
-
L: 207,
|
|
1667
|
-
S: this,
|
|
1668
|
-
C: (f, a) => f(...a)
|
|
1669
|
-
});
|
|
1456
|
+
log3.warn("Space must have a genesis credential before adding members.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 161, S: this });
|
|
1670
1457
|
return false;
|
|
1671
1458
|
}
|
|
1672
1459
|
await this._members.process(credential);
|
|
@@ -1674,12 +1461,7 @@ var SpaceStateMachine = class {
|
|
|
1674
1461
|
}
|
|
1675
1462
|
case "dxos.halo.credentials.AdmittedFeed": {
|
|
1676
1463
|
if (!this._genesisCredential) {
|
|
1677
|
-
log3.warn("Space must have a genesis credential before admitting feeds.", void 0, {
|
|
1678
|
-
F: __dxlog_file6,
|
|
1679
|
-
L: 217,
|
|
1680
|
-
S: this,
|
|
1681
|
-
C: (f, a) => f(...a)
|
|
1682
|
-
});
|
|
1464
|
+
log3.warn("Space must have a genesis credential before admitting feeds.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 170, S: this });
|
|
1683
1465
|
return false;
|
|
1684
1466
|
}
|
|
1685
1467
|
await this._feeds.process(credential, sourceFeed);
|
|
@@ -1688,12 +1470,7 @@ var SpaceStateMachine = class {
|
|
|
1688
1470
|
case "dxos.halo.invitations.CancelDelegatedInvitation":
|
|
1689
1471
|
case "dxos.halo.invitations.DelegateSpaceInvitation": {
|
|
1690
1472
|
if (!this._canInviteNewMembers(credential.issuer)) {
|
|
1691
|
-
log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, {
|
|
1692
|
-
F: __dxlog_file6,
|
|
1693
|
-
L: 228,
|
|
1694
|
-
S: this,
|
|
1695
|
-
C: (f, a) => f(...a)
|
|
1696
|
-
});
|
|
1473
|
+
log3.warn(`Invalid invitation, space member is not authorized to invite new members: ${credential.issuer}`, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 181, S: this });
|
|
1697
1474
|
return false;
|
|
1698
1475
|
}
|
|
1699
1476
|
await this._invitations.process(credential);
|
|
@@ -1724,6 +1501,9 @@ var SpaceStateMachine = class {
|
|
|
1724
1501
|
return this._canInviteNewMembers(memberKey);
|
|
1725
1502
|
}
|
|
1726
1503
|
_canInviteNewMembers(key) {
|
|
1504
|
+
if (this._membershipPolicy === MembershipPolicy2.LOCKED) {
|
|
1505
|
+
return key.equals(this._spaceKey) && this._members.members.size === 0;
|
|
1506
|
+
}
|
|
1727
1507
|
return key.equals(this._spaceKey) || this._members.getRole(key) === SpaceMember3.Role.ADMIN || this._members.getRole(key) === SpaceMember3.Role.OWNER;
|
|
1728
1508
|
}
|
|
1729
1509
|
};
|
|
@@ -1734,23 +1514,18 @@ var CredentialConsumer = class {
|
|
|
1734
1514
|
processor;
|
|
1735
1515
|
_onOpen;
|
|
1736
1516
|
_onClose;
|
|
1737
|
-
_ctx;
|
|
1517
|
+
_ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 229 });
|
|
1738
1518
|
/**
|
|
1739
1519
|
* @internal
|
|
1740
1520
|
* Processor is ready to process live credentials.
|
|
1741
1521
|
* NOTE: Setting this flag before all existing credentials are processed will cause them to be processed out of order.
|
|
1742
1522
|
* Set externally.
|
|
1743
1523
|
*/
|
|
1744
|
-
_isReadyForLiveCredentials;
|
|
1524
|
+
_isReadyForLiveCredentials = false;
|
|
1745
1525
|
constructor(processor, _onOpen, _onClose) {
|
|
1746
1526
|
this.processor = processor;
|
|
1747
1527
|
this._onOpen = _onOpen;
|
|
1748
1528
|
this._onClose = _onClose;
|
|
1749
|
-
this._ctx = new Context(void 0, {
|
|
1750
|
-
F: __dxlog_file6,
|
|
1751
|
-
L: 273
|
|
1752
|
-
});
|
|
1753
|
-
this._isReadyForLiveCredentials = false;
|
|
1754
1529
|
}
|
|
1755
1530
|
/**
|
|
1756
1531
|
* @internal
|
|
@@ -1782,25 +1557,18 @@ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/halo/credentials/src/processor
|
|
|
1782
1557
|
var DeviceStateMachine = class {
|
|
1783
1558
|
_params;
|
|
1784
1559
|
// TODO(burdon): Return values via getter.
|
|
1785
|
-
authorizedDeviceKeys;
|
|
1786
|
-
deviceChainReady;
|
|
1560
|
+
authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
|
|
1561
|
+
deviceChainReady = new Trigger();
|
|
1787
1562
|
deviceCredentialChain;
|
|
1788
1563
|
constructor(_params) {
|
|
1789
1564
|
this._params = _params;
|
|
1790
|
-
this.authorizedDeviceKeys = new ComplexMap7(PublicKey9.hash);
|
|
1791
|
-
this.deviceChainReady = new Trigger();
|
|
1792
1565
|
}
|
|
1793
1566
|
async processCredential(credential) {
|
|
1794
1567
|
log4("processing credential...", {
|
|
1795
1568
|
identityKey: this._params.identityKey,
|
|
1796
1569
|
deviceKey: this._params.deviceKey,
|
|
1797
1570
|
credential
|
|
1798
|
-
}, {
|
|
1799
|
-
F: __dxlog_file7,
|
|
1800
|
-
L: 36,
|
|
1801
|
-
S: this,
|
|
1802
|
-
C: (f, a) => f(...a)
|
|
1803
|
-
});
|
|
1571
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 22, S: this });
|
|
1804
1572
|
if (isValidAuthorizedDeviceCredential(credential, this._params.identityKey, this._params.deviceKey)) {
|
|
1805
1573
|
this.deviceCredentialChain = {
|
|
1806
1574
|
credential
|
|
@@ -1815,35 +1583,17 @@ var DeviceStateMachine = class {
|
|
|
1815
1583
|
localDeviceKey: this._params.deviceKey,
|
|
1816
1584
|
deviceKey: assertion.deviceKey,
|
|
1817
1585
|
size: this.authorizedDeviceKeys.size
|
|
1818
|
-
}, {
|
|
1819
|
-
F: __dxlog_file7,
|
|
1820
|
-
L: 56,
|
|
1821
|
-
S: this,
|
|
1822
|
-
C: (f, a) => f(...a)
|
|
1823
|
-
});
|
|
1586
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 41, S: this });
|
|
1824
1587
|
this._params.onUpdate?.();
|
|
1825
1588
|
break;
|
|
1826
1589
|
}
|
|
1827
1590
|
case "dxos.halo.credentials.DeviceProfile": {
|
|
1828
|
-
invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", {
|
|
1829
|
-
F: __dxlog_file7,
|
|
1830
|
-
L: 66,
|
|
1831
|
-
S: this,
|
|
1832
|
-
A: [
|
|
1833
|
-
"this.authorizedDeviceKeys.has(credential.subject.id)",
|
|
1834
|
-
"'Device not found.'"
|
|
1835
|
-
]
|
|
1836
|
-
});
|
|
1591
|
+
invariant6(this.authorizedDeviceKeys.has(credential.subject.id), "Device not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 51, S: this, A: ["this.authorizedDeviceKeys.has(credential.subject.id)", "'Device not found.'"] });
|
|
1837
1592
|
if (assertion && credential.subject.id.equals(this._params.deviceKey)) {
|
|
1838
1593
|
log4.trace("dxos.halo.device", {
|
|
1839
1594
|
deviceKey: credential.subject.id,
|
|
1840
1595
|
profile: assertion.profile
|
|
1841
|
-
}, {
|
|
1842
|
-
F: __dxlog_file7,
|
|
1843
|
-
L: 69,
|
|
1844
|
-
S: this,
|
|
1845
|
-
C: (f, a) => f(...a)
|
|
1846
|
-
});
|
|
1596
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 53, S: this });
|
|
1847
1597
|
}
|
|
1848
1598
|
this.authorizedDeviceKeys.set(credential.subject.id, assertion.profile);
|
|
1849
1599
|
this._params.onUpdate?.();
|
|
@@ -1871,24 +1621,14 @@ var ProfileStateMachine = class {
|
|
|
1871
1621
|
log5.warn("Invalid profile credential", {
|
|
1872
1622
|
expectedIdentity: this._params.identityKey,
|
|
1873
1623
|
credential
|
|
1874
|
-
}, {
|
|
1875
|
-
F: __dxlog_file8,
|
|
1876
|
-
L: 35,
|
|
1877
|
-
S: this,
|
|
1878
|
-
C: (f, a) => f(...a)
|
|
1879
|
-
});
|
|
1624
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 21, S: this });
|
|
1880
1625
|
return;
|
|
1881
1626
|
}
|
|
1882
1627
|
this.profile = assertion.profile;
|
|
1883
1628
|
log5("updated profile", {
|
|
1884
1629
|
identityKey: this._params.identityKey,
|
|
1885
1630
|
profile: this.profile
|
|
1886
|
-
}, {
|
|
1887
|
-
F: __dxlog_file8,
|
|
1888
|
-
L: 41,
|
|
1889
|
-
S: this,
|
|
1890
|
-
C: (f, a) => f(...a)
|
|
1891
|
-
});
|
|
1631
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 29, S: this });
|
|
1892
1632
|
this._params.onUpdate?.();
|
|
1893
1633
|
break;
|
|
1894
1634
|
}
|