@sphereon/ssi-sdk.presentation-exchange
Version:
120 lines • 6.87 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PresentationExchange = void 0;
const index_1 = require("../index");
const pex_1 = require("@sphereon/pex");
const ssi_types_1 = require("@sphereon/ssi-types");
const ssi_sdk_ext_did_utils_1 = require("@sphereon/ssi-sdk-ext.did-utils");
const ssi_sdk_credential_store_1 = require("@sphereon/ssi-sdk.credential-store");
class PresentationExchange {
constructor(opts) {
this.schema = index_1.schema.IDidAuthSiopOpAuthenticator;
this.pex = new pex_1.PEX();
this.methods = {
pexValidateDefinition: this.pexValidateDefinition.bind(this),
pexDefinitionVersion: this.pexDefinitionVersion.bind(this),
pexDefinitionFilterCredentials: this.pexDefinitionFilterCredentials.bind(this),
pexDefinitionFilterCredentialsPerInputDescriptor: this.pexDefinitionFilterCredentialsPerInputDescriptor.bind(this),
};
}
pexValidateDefinition(args) {
return __awaiter(this, void 0, void 0, function* () {
const { definition } = args;
const invalids = [];
try {
const result = pex_1.PEX.validateDefinition(definition);
const validations = Array.isArray(result) ? result : [result];
invalids.push(...validations.filter((v) => v.status === 'error'));
}
catch (error) {
invalids.push({
status: 'error',
message: typeof error === 'string'
? error
: typeof error === 'object' && 'message' in error
? error.message
: 'unknown error',
tag: 'validation',
});
}
if (invalids.length > 0) {
throw Error(`Invalid definition. ${invalids.map((v) => v.message).toString()}`);
}
return true; // Never returns false, but REST API does not allow Promise<void>
});
}
pexDefinitionVersion(presentationDefinition) {
return __awaiter(this, void 0, void 0, function* () {
return pex_1.PEX.definitionVersionDiscovery(presentationDefinition);
});
}
pexDefinitionFilterCredentials(args, context) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
const credentials = yield this.pexFilterCredentials(args.credentialFilterOpts, context);
const holderDIDs = args.holderDIDs ? (0, ssi_sdk_ext_did_utils_1.toDIDs)(args.holderDIDs) : (0, ssi_sdk_ext_did_utils_1.toDIDs)(yield context.agent.dataStoreORMGetIdentifiers());
const selectResults = this.pex.selectFrom(args.presentationDefinition, credentials !== null && credentials !== void 0 ? credentials : [], Object.assign(Object.assign({}, args), { holderDIDs, limitDisclosureSignatureSuites: (_a = args.limitDisclosureSignatureSuites) !== null && _a !== void 0 ? _a : ['BbsBlsSignature2020'] }));
return {
id: args.presentationDefinition.id,
selectResults,
filteredCredentials: (_c = (_b = selectResults.verifiableCredential) === null || _b === void 0 ? void 0 : _b.map((vc) => ssi_types_1.CredentialMapper.storedCredentialToOriginalFormat(vc))) !== null && _c !== void 0 ? _c : [],
};
});
}
pexDefinitionFilterCredentialsPerInputDescriptor(args, context) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const origDefinition = args.presentationDefinition;
const credentials = yield this.pexFilterCredentials((_a = args.credentialFilterOpts) !== null && _a !== void 0 ? _a : {}, context);
const holderDIDs = args.holderDIDs ? (0, ssi_sdk_ext_did_utils_1.toDIDs)(args.holderDIDs) : (0, ssi_sdk_ext_did_utils_1.toDIDs)(yield context.agent.dataStoreORMGetIdentifiers());
const limitDisclosureSignatureSuites = args.limitDisclosureSignatureSuites;
const promises = new Map();
origDefinition.input_descriptors.forEach((inputDescriptor) => {
const presentationDefinition = {
id: inputDescriptor.id,
input_descriptors: [inputDescriptor],
};
const credentialRole = args.credentialFilterOpts.credentialRole;
promises.set(inputDescriptor, this.pexDefinitionFilterCredentials({
credentialFilterOpts: { credentialRole, verifiableCredentials: credentials },
// @ts-ignore
presentationDefinition,
holderDIDs,
limitDisclosureSignatureSuites,
}, context));
});
yield Promise.all(promises.values());
const result = [];
for (const entry of promises.entries()) {
result.push(Object.assign(Object.assign({}, (yield entry[1])), { inputDescriptor: entry[0] }));
}
return result;
});
}
pexFilterCredentials(filterOpts, context) {
return __awaiter(this, void 0, void 0, function* () {
if (filterOpts.verifiableCredentials && filterOpts.verifiableCredentials.length > 0) {
return filterOpts.verifiableCredentials;
}
const filter = (0, ssi_sdk_credential_store_1.verifiableCredentialForRoleFilter)(filterOpts.credentialRole, filterOpts.filter);
const uniqueCredentials = yield context.agent.crsGetUniqueCredentials({ filter });
return uniqueCredentials.map((uniqueVC) => {
const vc = uniqueVC.uniformVerifiableCredential;
const proof = Array.isArray(vc.proof) ? vc.proof : [vc.proof];
const jwtProof = proof.find((p) => (p === null || p === void 0 ? void 0 : p.type) === ssi_types_1.JWT_PROOF_TYPE_2020);
return jwtProof ? jwtProof.jwt : vc;
});
});
}
}
exports.PresentationExchange = PresentationExchange;
//# sourceMappingURL=PresentationExchange.js.map