UNPKG

@nucypher/shared

Version:

## [`nucypher/taco-web`](../../README.md)

185 lines 7.33 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PorterClient = exports.getPorterUrisFromSource = exports.getPorterUris = exports.getPorterUri = exports.domains = void 0; const nucypher_core_1 = require("@nucypher/nucypher-core"); const axios_1 = __importStar(require("axios")); const qs_1 = __importDefault(require("qs")); const utils_1 = require("./utils"); const defaultPorterUri = { mainnet: 'https://porter.nucypher.io', tapir: 'https://porter-tapir.nucypher.io', lynx: 'https://porter-lynx.nucypher.io', }; const porterUriSource = 'https://raw.githubusercontent.com/nucypher/nucypher-porter/main/porter_instances.json'; exports.domains = { DEVNET: 'lynx', TESTNET: 'tapir', MAINNET: 'mainnet', }; const getPorterUri = async (domain) => { return (await (0, exports.getPorterUris)(domain))[0]; }; exports.getPorterUri = getPorterUri; const getPorterUris = async (domain) => { const fullList = []; const uri = defaultPorterUri[domain]; if (!uri) { throw new Error(`No default Porter URI found for domain: ${domain}`); } fullList.push(uri); const urisFromSource = await (0, exports.getPorterUrisFromSource)(domain); fullList.push(...urisFromSource); return fullList; }; exports.getPorterUris = getPorterUris; const getPorterUrisFromSource = async (domain) => { const source = porterUriSource; if (!source) { return []; } try { const resp = await axios_1.default.get(porterUriSource, { responseType: 'blob', }); const uris = JSON.parse(resp.data); return uris[domain]; } catch (e) { return []; } }; exports.getPorterUrisFromSource = getPorterUrisFromSource; class PorterClient { porterUrls; constructor(porterUris) { if (porterUris instanceof Array) { this.porterUrls = porterUris.map((uri) => new URL(uri)); } else { this.porterUrls = [new URL(porterUris)]; } } async tryAndCall(config) { let resp; let lastError = undefined; for (const porterUrl of this.porterUrls) { const localConfig = { ...config, baseURL: porterUrl.toString() }; try { resp = await axios_1.default.request(localConfig); if (resp.status === axios_1.HttpStatusCode.Ok) { return resp; } } catch (e) { lastError = e; continue; } } if (lastError) { throw lastError; } throw new Error(`Porter returned bad response: ${resp.status} - ${resp.data}`); } async getUrsulas(quantity, excludeUrsulas = [], includeUrsulas = []) { const params = { quantity, exclude_ursulas: excludeUrsulas, include_ursulas: includeUrsulas, }; const resp = await this.tryAndCall({ url: '/get_ursulas', method: 'get', params: params, paramsSerializer: (params) => { return qs_1.default.stringify(params, { arrayFormat: 'comma' }); }, }); return resp.data.result.ursulas.map((u) => ({ checksumAddress: u.checksum_address, uri: u.uri, encryptingKey: nucypher_core_1.PublicKey.fromCompressedBytes((0, utils_1.fromHexString)(u.encrypting_key)), })); } async retrieveCFrags(treasureMap, retrievalKits, aliceVerifyingKey, bobEncryptingKey, bobVerifyingKey, conditionContextJSON = undefined) { const data = { treasure_map: (0, utils_1.toBase64)(treasureMap.toBytes()), retrieval_kits: retrievalKits.map((rk) => (0, utils_1.toBase64)(rk.toBytes())), alice_verifying_key: (0, utils_1.toHexString)(aliceVerifyingKey.toCompressedBytes()), bob_encrypting_key: (0, utils_1.toHexString)(bobEncryptingKey.toCompressedBytes()), bob_verifying_key: (0, utils_1.toHexString)(bobVerifyingKey.toCompressedBytes()), context: conditionContextJSON, }; const resp = await this.tryAndCall({ url: '/retrieve_cfrags', method: 'post', data: data, }); return resp.data.result.retrieval_results.map(({ cfrags, errors }) => { const parsed = Object.keys(cfrags).map((address) => [ address, nucypher_core_1.CapsuleFrag.fromBytes((0, utils_1.fromBase64)(cfrags[address])), ]); const cFrags = Object.fromEntries(parsed); return { cFrags, errors }; }); } async tacoDecrypt(encryptedRequests, threshold) { const data = { encrypted_decryption_requests: Object.fromEntries(Object.entries(encryptedRequests).map(([ursula, encryptedRequest]) => [ ursula, (0, utils_1.toBase64)(encryptedRequest.toBytes()), ])), threshold, }; const resp = await this.tryAndCall({ url: '/decrypt', method: 'post', data: data, }); const { encrypted_decryption_responses, errors } = resp.data.result.decryption_results; const decryptionResponses = Object.entries(encrypted_decryption_responses).map(([address, encryptedResponseBase64]) => { const encryptedResponse = nucypher_core_1.EncryptedThresholdDecryptionResponse.fromBytes((0, utils_1.fromBase64)(encryptedResponseBase64)); return [address, encryptedResponse]; }); const encryptedResponses = Object.fromEntries(decryptionResponses); return { encryptedResponses, errors }; } } exports.PorterClient = PorterClient; //# sourceMappingURL=porter.js.map