UNPKG

@safient/core

Version:

JavaScript SDK to manage safes and interact with Safient protocol.

440 lines (439 loc) 16 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.getDecShards = exports.deleteDecShard = exports.updateDecShard = exports.createIpfsSafeLink = exports.createClaimEvidenceUri = exports.createMetaData = exports.updateStage = exports.getSafeData = exports.createSafe = exports.generateRandomGuardians = exports.queryUserDid = exports.queryUserEmail = exports.getUsers = exports.getUser = exports.createUser = exports.checkUser = exports.init = void 0; const crypto_1 = require("../crypto"); const database_1 = require("../database"); const index_1 = require("../storage/index"); var environment = require("browser-or-node"); let database; let crypto; let connection; let storage; let safientAgreementURI = '/ipfs/QmPMdGmenYuh9kzhU6WkEvRsWpr1B8T7nVWA52u6yoJu13/Safex Agreement.png'; /** * * @param databaseType - Type of database to be used * @param connectionObject - Connection object of the database selected * @returns */ const init = (databaseType, connectionObject) => { database = new database_1.Database(databaseType, connectionObject); crypto = new crypto_1.Crypto(); connection = connectionObject; storage = new index_1.Storage('IPFS'); return { database, crypto }; }; exports.init = init; /** * * @param email - Email of the user * @returns - The status of the user if he exists or not */ const checkUser = (did) => __awaiter(void 0, void 0, void 0, function* () { try { let registerStatus; const result = yield database.read('did', did, 'Users'); if (result.length === 1) { registerStatus = { status: true, user: result[0] }; } else { registerStatus = { status: false, user: result[0] }; } return registerStatus; } catch (err) { throw new Error(`Error while checking user status, ${err}`); } }); exports.checkUser = checkUser; /** * * @param userData - The user data that is created on the database * @returns - Database ID of the created data */ const createUser = (userData, did) => __awaiter(void 0, void 0, void 0, function* () { try { let response = { status: false, data: null, idx: null, }; const userStatus = yield (0, exports.checkUser)(userData.did); if (userStatus.status === true) { const userData = yield (0, exports.getUser)({ did: did }); response = { status: true, data: userData, idx: null, }; } else if (userStatus.status === false) { const userRegistration = yield database.create(userData, 'Users'); const user = yield (0, exports.getUser)({ did: did }); response = { status: false, data: user, idx: null, }; } return response; } catch (err) { throw new Error(`Error while registering user, ${err}`); } }); exports.createUser = createUser; /** * * @param did - Did of the user * @returns - User data if it exists */ const getUser = (Obj) => __awaiter(void 0, void 0, void 0, function* () { try { let result = []; if (Obj.did) { result = yield database.read('did', Obj.did, 'Users'); } else { if (Obj.email) result = yield database.read('email', Obj.email, 'Users'); } if (result.length < 1) { return null; } else { return result[0]; } } catch (err) { throw new Error(`User not registered`); } }); exports.getUser = getUser; /** * * @returns - All the users on the database */ const getUsers = () => __awaiter(void 0, void 0, void 0, function* () { var _a; try { const registeredUsers = yield database.read('', '', 'Users'); let caller = ((_a = connection.idx) === null || _a === void 0 ? void 0 : _a.id) || ''; let userArray = []; for (let i = 0; i < registeredUsers.length; i++) { const result = registeredUsers[i]; const value = { name: result.name, email: result.email, did: result.did, }; value.did.toLowerCase() === result.did.toLowerCase() ? (caller = value) : (caller = `${value.did} is not registered!`); userArray.push(value); } return userArray; } catch (err) { throw new Error("Error while getting new users"); } }); exports.getUsers = getUsers; /** * * @param email - Email of the user to be queried * @returns - Users basic information */ const queryUserEmail = (email) => __awaiter(void 0, void 0, void 0, function* () { try { const result = yield database.read('email', email, 'Users'); if (result.length < 1) { return false; } else { const data = { name: result[0].name, email: result[0].email, did: result[0].did, }; return data; } } catch (err) { throw new Error("Error while querying user"); } }); exports.queryUserEmail = queryUserEmail; /** * * @param did - DID of the user being queried * @returns - User data for that did */ const queryUserDid = (did) => __awaiter(void 0, void 0, void 0, function* () { try { const result = yield database.read('did', did, 'Users'); if (result.length < 1) { return []; } else { return result; } } catch (err) { throw new Error("Error while querying user"); } }); exports.queryUserDid = queryUserDid; /** * * @param creatorDID - Did of the safe creator * @param beneficiaryDID - Did of the beneficiary * @returns - Array of guardians did */ const generateRandomGuardians = (creatorDID, beneficiaryDID) => __awaiter(void 0, void 0, void 0, function* () { try { const guardiansUsers = yield database.read('guardian', true, 'Users'); let guardians = []; let guardiansDid = []; let guardianIndex = 0; if (guardiansUsers.length <= 3) { while (guardianIndex <= 2) { const index = Math.floor(Math.random() * guardiansUsers.length); let randomGuardian = guardiansUsers[index]; if (creatorDID !== randomGuardian.did && beneficiaryDID !== randomGuardian.did && randomGuardian.guardian === true && !guardiansDid.includes(randomGuardian.did)) { guardians.push(randomGuardian); guardiansDid.push(randomGuardian.did); guardianIndex = guardianIndex + 1; } else { guardianIndex = guardians.length; } } return guardians; } else { throw new Error("Not enough guardians on the network"); } } catch (err) { throw new Error(`Couldn't fetch random guardians, ${err}`); } }); exports.generateRandomGuardians = generateRandomGuardians; /** * * @param safeData - Safe data * @returns - Database Id of the safe data */ const createSafe = (safeData) => __awaiter(void 0, void 0, void 0, function* () { try { const safe = yield database.create(safeData, 'Safes'); return safe; } catch (err) { throw new Error("Error while creating safe"); } }); exports.createSafe = createSafe; /** * * @param safeId - Safe id * @returns - Safe data */ const getSafeData = (safeId) => __awaiter(void 0, void 0, void 0, function* () { try { const result = yield database.read('', safeId, 'Safes'); if (result.length !== 0) { return result[0]; } else { throw new Error("Safe does not exist"); } } catch (err) { throw new Error("Error while fetching safe data"); } }); exports.getSafeData = getSafeData; /** * * @param safeId - Safe id of the safe being updated * @param claimStage - Claim stage being updated * @param safeStage - Safe stage being updated * @returns - Boolean value */ const updateStage = (safeId, claimStage, safeStage) => __awaiter(void 0, void 0, void 0, function* () { try { const safe = yield (0, exports.getSafeData)(safeId); safe.stage = safeStage; safe.claims[0].claimStatus = claimStage; yield database.save(safe, 'Safes'); return true; } catch (err) { throw new Error(`Error while updating a stage ${err}`); } }); exports.updateStage = updateStage; const createMetaData = (safientContractAddress, address) => __awaiter(void 0, void 0, void 0, function* () { try { const metaevidenceObj = { fileURI: safientAgreementURI, fileHash: 'QmPMdGmenYuh9kzhU6WkEvRsWpr1B8T7nVWA52u6yoJu13', fileTypeExtension: 'png', category: 'Safex Claims', title: 'Provide a convenient and safe way to propose and claim the inheritance and safekeeping mechanism', description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', aliases: { [safientContractAddress]: 'SafexMain', [address]: [address], }, question: 'Does the claimer qualify for inheritence?', rulingOptions: { type: 'single-select', titles: ['Yes', 'No'], descriptions: ['The claimer is qualified for inheritence', 'The claimer is not qualified for inheritence'], }, }; const cid = yield storage.add(JSON.stringify(metaevidenceObj), 'metaEvidence.json'); const metaevidenceURI = `/ipfs/${cid[1].hash}${cid[0].path}`; return metaevidenceURI; } catch (err) { throw new Error(`Error while creating metadata, ${err}`); } }); exports.createMetaData = createMetaData; const createClaimEvidenceUri = (file, evidenceName, description) => __awaiter(void 0, void 0, void 0, function* () { try { let evidenceURI = ''; let buffer; let evidenceObj; let cid; if (file && file.name.split('.')[1]) { const fileName = file.name; const fileExtension = file.name.split('.')[1]; if (environment.isBrowser) { const reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onloadend = () => { buffer = Buffer.from(reader.result); }; const fileCid = yield storage.add(buffer, fileName); const fileURI = `/ipfs/${fileCid[1].hash}${fileCid[0].path}`; evidenceObj = { fileURI, fileHash: fileCid[1].hash, fileTypeExtension: fileExtension, name: evidenceName, description: description, }; cid = yield storage.add(JSON.stringify(evidenceObj), 'evidence.json'); evidenceURI = `/ipfs/${cid[1].hash}${cid[0].path}`; } if (environment.isNode) { evidenceObj = { fileURI: `https://ipfs.kleros.io/ipfs/QmXK5Arf1jWtox5gwVLX2jvoiJvdwiVsqAA2rTu7MUGBDF/signature.jpg`, fileHash: 'QmXK5Arf1jWtox5gwVLX2jvoiJvdwiVsqAA2rTu7MUGBDF', fileTypeExtension: fileExtension, name: evidenceName, description: description, }; //evidenceURI = `ipfs/QmXK5Arf1jWtox5gwVLX2jvoiJvdwiVsqAA2rTu7MUGBDF/signature.jpg` cid = yield storage.add(JSON.stringify(evidenceObj), 'evidence.json'); evidenceURI = `/ipfs/${cid[1].hash}${cid[0].path}`; } } else { evidenceURI = "NULL"; } return evidenceURI; } catch (e) { throw new Error(`Error while creating evidence, ${e}`); } }); exports.createClaimEvidenceUri = createClaimEvidenceUri; const createIpfsSafeLink = (safeData) => __awaiter(void 0, void 0, void 0, function* () { try { const cid = yield storage.create(JSON.stringify(safeData)); const safeLink = `https://ipfs.safient.io/ipfs/${cid.path}`; return safeLink; } catch (err) { throw new Error(`Error while creating IPFS Safe Link, ${err}`); } }); exports.createIpfsSafeLink = createIpfsSafeLink; const updateDecShard = (did, safeId, decShard) => __awaiter(void 0, void 0, void 0, function* () { try { const user = yield (0, exports.getUser)({ did: did }); if (user) { for (let safeIndex = 0; safeIndex < user.safes.length; safeIndex++) { if (user.safes[safeIndex].safeId === safeId) { user.safes[safeIndex].decShard = decShard; yield database.save(user, 'Users'); } } } return true; } catch (err) { throw new Error(`Error while updating a decShard for user ${err}`); } }); exports.updateDecShard = updateDecShard; const deleteDecShard = (guardianDid, safeId) => __awaiter(void 0, void 0, void 0, function* () { try { for (let guardianIndex = 0; guardianIndex < guardianDid.length; guardianIndex++) { const gurdian = yield (0, exports.getUser)({ did: guardianDid[guardianIndex] }); if (gurdian) { for (let safeIndex = 0; safeIndex < gurdian.safes.length; safeIndex++) { if (gurdian.safes[safeIndex].safeId === safeId) { gurdian.safes[safeIndex].decShard = null; yield database.save(gurdian, 'Users'); } } } } return true; } catch (err) { throw new Error(`Error while updating a decShard for user ${err}`); } }); exports.deleteDecShard = deleteDecShard; const getDecShards = (guardianDid, safeId) => __awaiter(void 0, void 0, void 0, function* () { try { let shards = []; for (let guardianIndex = 0; guardianIndex < guardianDid.length; guardianIndex++) { const gurdian = yield (0, exports.getUser)({ did: guardianDid[guardianIndex] }); gurdian === null || gurdian === void 0 ? void 0 : gurdian.safes.map(safe => { if (safe.safeId === safeId && safe.decShard) { shards.push(safe.decShard); } }); } return shards; } catch (err) { throw new Error(`${err}`); } }); exports.getDecShards = getDecShards;