@nucypher/shared
Version:
## [`nucypher/taco-web`](../../README.md)
185 lines • 7.33 kB
JavaScript
;
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