@affinidi/common-check-widget-backend-lib
Version:
An common-check-widget-backend-lib used to development backend for common-check-widget-frontend
129 lines • 16.1 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EndpointServiceBase = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs = require("fs");
const node_fetch_1 = require("node-fetch");
const crypto = require("crypto");
const jwt = require("jsonwebtoken");
class EndpointServiceBase {
constructor(apiEndpoint, apiKey, errorCode, privateKeyFile, secretPassphrase, requestID) {
this.apiEndpoint = apiEndpoint;
this.apiKey = apiKey;
this.errorCode = errorCode;
this.privateKeyFile = privateKeyFile;
this.secretPassphrase = secretPassphrase;
this.requestID = requestID;
}
retrieveApiKey() {
return this.apiKey;
}
fillOptions(options) {
this.options = options;
}
async callAPIEndpoint() {
console.log(new Date(), "Calling Endpoint", this.apiEndpoint);
let response;
try {
response = await node_fetch_1.default(this.apiEndpoint, this.options);
console.log(new Date(), "Completed Endpoint");
if (response === null || response === void 0 ? void 0 : response.code) {
return this.getErrorMessage({
type: 'Error Code',
value: response.code,
description: 'Error From Endpoint'
});
}
return response.json();
}
catch (error) {
console.log(new Date(), "Fail Endpoint with error", { error });
throw new Error(response.status);
}
}
getErrorMessage(errorObj) {
let error = [];
if (errorObj) {
error.push(errorObj);
}
this.errors = ({
code: this.errorCode,
errors: error,
metadata: {
requestID: this.requestID,
service: 'EndpointService'
}
});
return this.errors;
}
decrypt(data) {
console.log("encrypted_data", data);
try {
const privateKey = fs.readFileSync(this.privateKeyFile);
const buffer = Buffer.from(data, "base64");
const decrypted = crypto.privateDecrypt({
key: privateKey,
passphrase: this.secretPassphrase,
}, buffer).toString();
return decrypted;
}
catch (error) {
console.log(new Date(), "Fail Endpoint with error", { error });
throw new Error(error);
}
}
generatePayloadJson(flightNumber, flightDate, firstName, lastName, dateOfBirth, passport, nationality) {
const json = {
intent: {
flight_number: flightNumber,
scheduled_departure_time: flightDate
},
user_identity: {
first_name: firstName,
last_name: lastName,
dob: dateOfBirth,
passport: passport,
nationality: nationality
}
};
return JSON.stringify(json);
}
async generateHashFromData(dataToSign) {
const binary = Buffer.from(dataToSign, 'binary');
const hashSum = crypto.createHash('sha256');
hashSum.update(binary);
const hash = hashSum.digest('hex');
return hash;
}
async generateJWTFromDataHash(dataToSign) {
const binary = Buffer.from(dataToSign, 'binary');
const hashSum = crypto.createHash('sha256');
hashSum.update(binary);
const privateKey = fs.readFileSync(this.privateKeyFile);
const objectToSign = hashSum.digest('hex');
const token = jwt.sign(objectToSign, { key: privateKey, passphrase: this.secretPassphrase }, { algorithm: 'RS512' });
return token;
}
async generateJWTFromData(dataToSign) {
const privateKey = fs.readFileSync(this.privateKeyFile);
const token = jwt.sign(dataToSign, { key: privateKey, passphrase: this.secretPassphrase }, { algorithm: 'RS512' });
return token;
}
compare(tokenExpected, tokenCompared) {
let isVaildToken = false;
if (tokenCompared && tokenCompared) {
if (tokenExpected === tokenCompared) {
isVaildToken = true;
}
else {
isVaildToken = false;
}
}
return isVaildToken;
}
}
exports.EndpointServiceBase = EndpointServiceBase;
_a = JSII_RTTI_SYMBOL_1;
EndpointServiceBase[_a] = { fqn: "@affinidi/common-check-widget-backend-lib.commonCheckVerify.endpointServiceBase.EndpointServiceBase", version: "2.1.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBd0I7QUFDeEIsMkNBQThCO0FBQzlCLGlDQUFnQztBQUNoQyxvQ0FBbUM7QUFFbkMsTUFBc0IsbUJBQW1CO0lBVXJDLFlBQWEsV0FBbUIsRUFBRSxNQUFjLEVBQUUsU0FBZ0IsRUFBRSxjQUFzQixFQUFFLGdCQUF3QixFQUFFLFNBQWlCO1FBQ25JLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRU0sY0FBYztRQUVqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFZO1FBRTNCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUV4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzdELElBQUksUUFBWSxDQUFBO1FBQ2hCLElBQUc7WUFDQyxRQUFRLEdBQUcsTUFBTSxvQkFBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1lBQzdDLElBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxD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LEdBQUcsS0FBSyxDQUFBO1FBQ3hCLElBQUksYUFBYSxJQUFJLGFBQWEsRUFDbEM7WUFFRSxJQUFJLGFBQWEsS0FBSyxhQUFhLEVBQ25DO2dCQUNFLFlBQVksR0FBRyxJQUFJLENBQUE7YUFDcEI7aUJBRUQ7Z0JBQ0UsWUFBWSxHQUFHLEtBQUssQ0FBQTthQUNyQjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQzs7QUFySkwsa0RBc0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgZmV0Y2ggZnJvbSAnbm9kZS1mZXRjaCdcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nXG5pbXBvcnQgKiBhcyBqd3QgZnJvbSAnanNvbndlYnRva2VuJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnRTZXJ2aWNlQmFzZSB7XG4gICAgYXBpRW5kcG9pbnQ6IHN0cmluZ1xuICAgIGFwaUtleTogc3RyaW5nXG4gICAgZXJyb3JDb2RlOiBzdHJpbmdcbiAgICBwcml2YXRlS2V5RmlsZTogc3RyaW5nXG4gICAgc2VjcmV0UGFzc3BocmFzZTogc3RyaW5nXG4gICAgcmVxdWVzdElEOiBzdHJpbmdcbiAgICBvcHRpb25zOiBhbnlcbiAgICBlcnJvcnM6IGFueVxuXG4gICAgY29uc3RydWN0b3IgKGFwaUVuZHBvaW50OiBzdHJpbmcsIGFwaUtleTogc3RyaW5nLCBlcnJvckNvZGU6c3RyaW5nLCBwcml2YXRlS2V5RmlsZTogc3RyaW5nLCBzZWNyZXRQYXNzcGhyYXNlOiBzdHJpbmcsIHJlcXVlc3RJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXBpRW5kcG9pbnQgPSBhcGlFbmRwb2ludFxuICAgICAgICB0aGlzLmFwaUtleSA9IGFwaUtleVxuICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZVxuICAgICAgICB0aGlzLnByaXZhdGVLZXlGaWxlID0gcHJpdmF0ZUtleUZpbGVcbiAgICAgICAgdGhpcy5zZWNyZXRQYXNzcGhyYXNlID0gc2VjcmV0UGFzc3BocmFzZVxuICAgICAgICB0aGlzLnJlcXVlc3RJRCA9IHJlcXVlc3RJRFxuICAgIH1cblxuICAgIHB1YmxpYyByZXRyaWV2ZUFwaUtleSgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlLZXlcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsbE9wdGlvbnMob3B0aW9uczogYW55KVxuICAgIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxsQVBJRW5kcG9pbnQgKCkge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIFwiQ2FsbGluZyBFbmRwb2ludFwiLCB0aGlzLmFwaUVuZHBvaW50KVxuICAgICAgICBsZXQgcmVzcG9uc2U6YW55XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCwgdGhpcy5vcHRpb25zKVxuICAgICAgICAgICAgY29uc29sZS5sb2cobmV3IERhdGUoKSwgXCJDb21wbGV0ZWQgRW5kcG9pbnRcIilcbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uY29kZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFcnJvck1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRXJyb3IgQ29kZScsIFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA6IHJlc3BvbnNlLmNvZGUsIFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA6ICdFcnJvciBGcm9tIEVuZHBvaW50J1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhuZXcgRGF0ZSgpLCBcIkZhaWwgRW5kcG9pbnQgd2l0aCBlcnJvclwiLCB7ZXJyb3J9KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmo/OiBhbnkpXG4gICAge1xuICAgICAgICBsZXQgZXJyb3IgPSBbXVxuICAgICAgICBpZiAoZXJyb3JPYmopXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yLnB1c2goZXJyb3JPYmopXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnJvcnMgPSAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvZGU6IHRoaXMuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvcnM6IGVycm9yLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdElEOiB0aGlzLnJlcXVlc3RJRCxcbiAgICAgICAgICAgICAgICAgIHNlcnZpY2U6ICdFbmRwb2ludFNlcnZpY2UnXG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzXG4gICAgfVxuXG4gICAgcHVibGljIGRlY3J5cHQoZGF0YTogYW55KVxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlbmNyeXB0ZWRfZGF0YVwiLCBkYXRhKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIilcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGNyeXB0by5wcml2YXRlRGVjcnlwdCh7XG4gICAgICAgICAgICBrZXk6IHByaXZhdGVLZXksXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICB9LCBidWZmZXIpLnRvU3RyaW5nKClcbiAgICAgICAgICAgIHJldHVybiBkZWNyeXB0ZWRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIFwiRmFpbCBFbmRwb2ludCB3aXRoIGVycm9yXCIsIHtlcnJvcn0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IgYXMgc3RyaW5nKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlUGF5bG9hZEpzb24oZmxpZ2h0TnVtYmVyOiBzdHJpbmcsIGZsaWdodERhdGU6IHN0cmluZywgZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcsIGRhdGVPZkJpcnRoOiBzdHJpbmcsIHBhc3Nwb3J0OiBzdHJpbmcsIG5hdGlvbmFsaXR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QganNvbiA9ICB7XG4gICAgICAgICAgICBpbnRlbnQ6IHtcbiAgICAgICAgICAgICAgZmxpZ2h0X251bWJlcjogZmxpZ2h0TnVtYmVyLFxuICAgICAgICAgICAgICBzY2hlZHVsZWRfZGVwYXJ0dXJlX3RpbWU6IGZsaWdodERhdGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyX2lkZW50aXR5OntcbiAgICAgICAgICAgICAgZmlyc3RfbmFtZTogZmlyc3ROYW1lLFxuICAgICAgICAgICAgICBsYXN0X25hbWU6IGxhc3ROYW1lLFxuICAgICAgICAgICAgICBkb2I6IGRhdGVPZkJpcnRoLFxuICAgICAgICAgICAgICBwYXNzcG9ydDogcGFzc3BvcnQsXG4gICAgICAgICAgICAgIG5hdGlvbmFsaXR5OiBuYXRpb25hbGl0eVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVIYXNoRnJvbURhdGEoZGF0YVRvU2lnbjogYW55KVxuICAgIHtcbiAgICAgICAgY29uc3QgYmluYXJ5ID0gQnVmZmVyLmZyb20oZGF0YVRvU2lnbiwgJ2JpbmFyeScpXG4gICAgICAgIGNvbnN0IGhhc2hTdW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgaGFzaFN1bS51cGRhdGUoYmluYXJ5KVxuICAgICAgICBjb25zdCBoYXNoID0gaGFzaFN1bS5kaWdlc3QoJ2hleCcpXG4gICAgICAgIHJldHVybiBoYXNoXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlSldURnJvbURhdGFIYXNoKGRhdGFUb1NpZ246IGFueSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGJpbmFyeSA9IEJ1ZmZlci5mcm9tKGRhdGFUb1NpZ24sICdiaW5hcnknKVxuICAgICAgICBjb25zdCBoYXNoU3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIGhhc2hTdW0udXBkYXRlKGJpbmFyeSlcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICBjb25zdCBvYmplY3RUb1NpZ24gPSBoYXNoU3VtLmRpZ2VzdCgnaGV4JylcbiAgICAgICAgY29uc3QgdG9rZW4gPSBqd3Quc2lnbihvYmplY3RUb1NpZ24sIHsga2V5OiBwcml2YXRlS2V5LCBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UgfSwgeyBhbGdvcml0aG06ICdSUzUxMicgfSlcbiAgICAgICAgcmV0dXJuIHRva2VuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlSldURnJvbURhdGEoZGF0YVRvU2lnbjogYW55KVxuICAgIHtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICBjb25zdCB0b2tlbiA9IGp3dC5zaWduKGRhdGFUb1NpZ24sIHsga2V5OiBwcml2YXRlS2V5LCBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UgfSwgeyBhbGdvcml0aG06ICdSUzUxMicgfSlcbiAgICAgICAgcmV0dXJuIHRva2VuXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBhcmUodG9rZW5FeHBlY3RlZDogYW55LCB0b2tlbkNvbXBhcmVkOmFueSkgXG4gICAge1xuICAgICAgbGV0IGlzVmFpbGRUb2tlbiA9IGZhbHNlXG4gICAgICBpZiAodG9rZW5Db21wYXJlZCAmJiB0b2tlbkNvbXBhcmVkKVxuICAgICAge1xuXG4gICAgICAgIGlmICh0b2tlbkV4cGVjdGVkID09PSB0b2tlbkNvbXBhcmVkKVxuICAgICAgICB7XG4gICAgICAgICAgaXNWYWlsZFRva2VuID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgIGlzVmFpbGRUb2tlbiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1ZhaWxkVG9rZW5cbiAgICB9XG59Il19