UNPKG

@sphereon/ssi-sdk.presentation-exchange

Version:

120 lines • 6.87 kB
"use strict"; 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