@sphereon/gx-compliance-client
Version:
<!--suppress HtmlDeprecatedAttribute --> <h1 align="center"> <br> <a href="https://www.sphereon.com"><img src="https://sphereon.com/content/themes/sphereon/assets/img/logo.svg" alt="Sphereon" width="400"></a> <br>Gaia-X Compliance client (Typescript
269 lines (268 loc) • 13.5 kB
JavaScript
"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.GXComplianceClient = void 0;
const index_1 = require("../index");
const DID_1 = require("./DID");
const CredentialHandler_1 = require("./CredentialHandler");
const utils_1 = require("../utils");
const utils_2 = require("../utils");
const utils_3 = require("../utils");
/**
* {@inheritDoc IGXComplianceClient}
*/
class GXComplianceClient {
constructor(config) {
this.credentialHandler = new CredentialHandler_1.CredentialHandler(this);
this.schema = index_1.schema.IGaiaxComplianceClient;
this.methods = {
submitComplianceCredential: this.submitComplianceCredential.bind(this),
acquireComplianceCredentialFromExistingParticipant: this.acquireComplianceCredentialFromExistingParticipant.bind(this),
acquireComplianceCredentialFromUnsignedParticipant: this.acquireComplianceCredentialFromUnsignedParticipant.bind(this),
submitServiceOffering: this.submitServiceOffering.bind(this),
createAndSubmitServiceOffering: this.createAndSubmitServiceOffering.bind(this),
createDIDFromX509: this.createDIDFromX509.bind(this),
exportDIDDocument: this.exportDIDDocument.bind(this),
exportDIDToPath: this.exportDIDToPath.bind(this),
issueVerifiableCredential: this.credentialHandler.issueVerifiableCredential.bind(this),
issueVerifiablePresentation: this.credentialHandler.issueVerifiablePresentation.bind(this),
checkVerifiableCredential: this.credentialHandler.checkVerifiableCredential.bind(this),
checkVerifiablePresentation: this.credentialHandler.checkVerifiablePresentation.bind(this),
onboardParticipantWithCredential: this.onboardParticipantWithCredential.bind(this),
onboardParticipantWithCredentialIds: this.onboardParticipantWithCredentialIds.bind(this),
verifySelfDescription: this.verifySelfDescription.bind(this),
};
this._config = config;
}
client() {
return this;
}
config() {
return this.client()._config;
}
/** {@inheritDoc IGXComplianceClient.submitComplianceCredential} */
submitComplianceCredential(args, _context) {
return __awaiter(this, void 0, void 0, function* () {
console.log(JSON.stringify(args.selfDescriptionVP, null, 2));
try {
return (yield (0, utils_2.postRequest)(this.getApiVersionedUrl() + '/compliance', JSON.stringify(args.selfDescriptionVP)));
}
catch (e) {
throw new Error('Error on fetching complianceVC: ' + e);
}
});
}
/** {@inheritDoc IGXComplianceClient.acquireComplianceCredentialFromExistingParticipant} */
acquireComplianceCredentialFromExistingParticipant(args, context) {
return __awaiter(this, void 0, void 0, function* () {
const selfDescribedVC = yield context.agent.dataStoreGetVerifiableCredential({
hash: args.participantSDId,
});
const did = selfDescribedVC.credentialSubject['id'];
const signInfo = yield (0, utils_3.extractSignInfo)({ did, section: 'authentication' }, context);
const uniqueVP = yield this.credentialHandler.issueVerifiablePresentation({
keyRef: signInfo.keyRef,
verifiableCredentials: [selfDescribedVC],
challenge: GXComplianceClient.getDateChallenge(),
domain: signInfo.participantDomain,
persist: true,
}, context);
return this.acquireComplianceCredential({
verifiablePresentation: uniqueVP.verifiablePresentation,
}, context);
});
}
/** {@inheritDoc IGXComplianceClient.acquireComplianceCredentialFromUnsignedParticipant} */
acquireComplianceCredentialFromUnsignedParticipant(args, context) {
return __awaiter(this, void 0, void 0, function* () {
const signInfo = yield (0, utils_3.extractSignInfo)({
did: args.credential.credentialSubject.id,
section: 'assertionMethod',
}, context);
const selfDescription = yield this.credentialHandler.issueVerifiableCredential({
credential: args.credential,
domain: signInfo.participantDomain,
keyRef: signInfo.keyRef,
persist: true,
}, context);
console.log(selfDescription.hash);
const uniqueVP = yield this.credentialHandler.issueVerifiablePresentation({
challenge: GXComplianceClient.getDateChallenge(),
keyRef: signInfo.keyRef,
verifiableCredentials: [selfDescription.verifiableCredential],
domain: signInfo.participantDomain,
}, context);
const verifiableCredentialResponse = (yield this.acquireComplianceCredential({
verifiablePresentation: uniqueVP.verifiablePresentation,
}, context));
return verifiableCredentialResponse;
});
}
/** {@inheritDoc IGXComplianceClient.createAndSubmitServiceOffering} */
createAndSubmitServiceOffering(args, context) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
//TODO: implement fetching compliance VC from data storage
if (!args.complianceId && !args.complianceVC) {
throw new Error('You should provide either complianceId or complete complianceVC');
}
const complianceIsPersisted = args.complianceId;
const complianceCredential = complianceIsPersisted
? yield context.agent.dataStoreGetVerifiableCredential({
hash: args.complianceId,
})
: args.complianceVC;
const did = (0, index_1.asDID)((_a = args.domain) !== null && _a !== void 0 ? _a : (0, index_1.extractSubjectDIDFromVCs)([complianceCredential]));
const serviceOffering = yield this.credentialHandler.issueVerifiableCredential({
domain: did,
keyRef: args.keyRef,
credential: args.serviceOfferingCredential,
persist: true,
}, context);
const serviceOfferingVP = yield this.credentialHandler.issueVerifiablePresentation({
challenge: args.challenge ? args.challenge : GXComplianceClient.getDateChallenge(),
keyRef: args.keyRef,
// purpose: args.purpose,
verifiableCredentials: [complianceCredential, serviceOffering.verifiableCredential],
domain: did,
persist: true,
}, context);
return yield this.submitServiceOffering({
serviceOfferingVP: serviceOfferingVP.verifiablePresentation,
}, context);
});
}
/** {@inheritDoc IGXComplianceClient.submitServiceOffering} */
submitServiceOffering(args, _context) {
return __awaiter(this, void 0, void 0, function* () {
try {
return (yield (0, utils_2.postRequest)(this.getApiVersionedUrl() + '/service-offering/verify/raw', JSON.stringify(args.serviceOfferingVP)));
}
catch (e) {
throw new Error('Error on fetching complianceVC: ' + e);
}
});
}
/** {@inheritDoc IGXComplianceClient.createDIDFromX509} */
createDIDFromX509(args, context) {
return __awaiter(this, void 0, void 0, function* () {
return DID_1.DID.createDIDFromX509(Object.assign(Object.assign({}, args), { kms: args.kms ? args.kms : this._config.kmsName ? this._config.kmsName : 'local' }), context);
});
}
exportDIDDocument({ domain, services }, context) {
return __awaiter(this, void 0, void 0, function* () {
return DID_1.DID.exportDocument({ domain, services }, context);
});
}
exportDIDToPath({ domain, services, path }, context) {
return __awaiter(this, void 0, void 0, function* () {
return DID_1.DID.exportToPath({ domain, path, services }, context);
});
}
/** {@inheritDoc IGXComplianceClient.verifyUnsignedSelfDescribedCredential} */
verifySelfDescription(args, context) {
return __awaiter(this, void 0, void 0, function* () {
if (!args.verifiableCredential && !args.id) {
throw new Error('You should provide either vc id or vc itself');
}
const vc = args.verifiableCredential
? args.verifiableCredential
: yield context.agent.dataStoreGetVerifiableCredential({
hash: args.id,
});
const valid = context.agent.verifyCredentialLDLocal({
credential: vc,
purpose: new index_1.AssertionProofPurpose(),
fetchRemoteContexts: true,
});
if (!valid) {
throw Error(`Invalid verifiable credential supplied`);
}
let url = this.getApiVersionedUrl();
if (vc.type.indexOf('ServiceOffering') != -1) {
url = url + '/service-offering/validate/vc';
}
else if (vc.type.indexOf('LegalPerson') != -1 || vc.type.indexOf('NaturalPerson') != -1) {
url = url + '/participant/validate/vc';
}
try {
return (yield (0, utils_2.postRequest)(url, JSON.stringify(vc)));
}
catch (e) {
throw new Error('Error on fetching complianceCredential: ' + e.message);
}
});
}
/**
* Below are the helper functions for this agent. These are for inner functionality of the agent
*/
acquireComplianceCredential(args, context) {
return __awaiter(this, void 0, void 0, function* () {
const complianceCredential = yield this.submitComplianceCredential({
selfDescriptionVP: args.verifiablePresentation,
}, context);
const hash = yield context.agent.dataStoreSaveVerifiableCredential({
verifiableCredential: complianceCredential,
});
return {
verifiableCredential: complianceCredential,
hash,
};
});
}
static getDateChallenge() {
return new Date().toISOString().substring(0, 10);
}
onboardParticipantWithCredential(args, context) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const onboardingVP = yield this.credentialHandler.issueVerifiablePresentation({
keyRef: args.keyRef,
// purpose: args.purpose,
verifiableCredentials: [args.complianceVC, args.selfDescriptionVC],
challenge: args.challenge ? args.challenge : GXComplianceClient.getDateChallenge(),
domain: (0, index_1.asDID)((_a = args.domain) !== null && _a !== void 0 ? _a : (0, index_1.extractSubjectDIDFromVCs)([args.selfDescriptionVC])),
persist: true,
}, context);
const apiType = (0, utils_1.extractApiTypeFromVC)(args.selfDescriptionVC);
const URL = `${this.getApiVersionedUrl()}/${apiType}/verify/raw?store=true`;
try {
return (yield (0, utils_2.postRequest)(URL, JSON.stringify(onboardingVP)));
}
catch (e) {
throw new Error('Error on onboarding a complianceVC: ' + e);
}
});
}
onboardParticipantWithCredentialIds(args, context) {
return __awaiter(this, void 0, void 0, function* () {
const complianceCredential = yield context.agent.dataStoreGetVerifiableCredential({
hash: args.complianceId,
});
const selfDescriptionVC = yield context.agent.dataStoreGetVerifiableCredential({
hash: args.selfDescriptionId,
});
const did = selfDescriptionVC.credentialSubject['id'];
const signInfo = yield (0, utils_3.extractSignInfo)({ did, section: 'authentication' }, context);
return this.onboardParticipantWithCredential({
complianceVC: complianceCredential,
selfDescriptionVC: selfDescriptionVC,
keyRef: signInfo.keyRef,
domain: signInfo.participantDomain,
challenge: GXComplianceClient.getDateChallenge(),
}, context);
});
}
getApiVersionedUrl() {
return (0, utils_2.getApiVersionedUrl)(this._config);
}
}
exports.GXComplianceClient = GXComplianceClient;