UNPKG

@reclaimprotocol/attestor-core

Version:

<div> <div> <img src="https://raw.githubusercontent.com/reclaimprotocol/.github/main/assets/banners/Attestor-Core.png" /> </div> </div>

260 lines 20.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupWindowRpc = setupWindowRpc; const tls_1 = require("@reclaimprotocol/tls"); const create_claim_on_avs_1 = require("../avs/client/create-claim-on-avs"); const client_1 = require("../client"); const utils_1 = require("../providers/http/utils"); const utils_2 = require("../utils"); const b64_json_1 = require("../utils/b64-json"); const benchmark_1 = require("../utils/benchmark"); const utils_3 = require("../window-rpc/utils"); const window_rpc_zk_1 = require("../window-rpc/window-rpc-zk"); class WindowRPCEvent extends Event { constructor(data) { super('message'); this.data = data; } } const VALID_MODULES = [ 'attestor-core', 'witness-sdk' ]; let logger = utils_2.logger; /** * Sets up the current window to listen for RPC requests * from React Native or other windows */ function setupWindowRpc() { logger = (0, utils_2.makeLogger)(true); window.addEventListener('message', handleMessage, false); const windowMsgs = new EventTarget(); const defaultUrl = (0, utils_3.getWsApiUrlFromLocation)(); logger.info({ defaultUrl }, 'window RPC setup'); async function handleMessage(event) { let id = ''; let channel = ''; try { if (!event.data) { return; } const req = (typeof event.data === 'string' ? JSON.parse(event.data, b64_json_1.B64_JSON_REVIVER) : event.data); logger.debug({ req, origin: event.origin }, 'recv RPC message'); // ignore any messages not for us if (!VALID_MODULES.includes(req.module)) { return; } id = req.id; channel = req.channel || ''; windowMsgs.dispatchEvent(new WindowRPCEvent(req)); // ignore response messages if (('isResponse' in req && req.isResponse)) { return; } if (!req.id) { logger.warn({ req }, 'Window RPC request missing ID'); return; } logger.info({ req, origin: event.origin }, 'processing RPC request'); switch (req.type) { case 'createClaim': const claimTunnelRes = await (0, client_1.createClaimOnAttestor)({ ...req.request, context: req.request.context ? JSON.parse(req.request.context) : undefined, zkOperators: getZkOperators(req.request.zkOperatorMode, req.request.zkEngine), oprfOperators: getOprfOperators(req.request.zkOperatorMode, req.request.zkEngine), client: { url: defaultUrl, authRequest: req.request.authRequest }, logger, onStep(step) { sendMessage({ type: 'createClaimStep', step: { name: req.module.includes('witness') // backwards compatibility ? 'witness-progress' : 'attestor-progress', step, }, module: req.module, id: req.id, }); }, updateProviderParams: req.request.updateProviderParams ? updateProviderParams : undefined }); const response = (0, utils_3.mapToCreateClaimResponse)(claimTunnelRes); respond({ type: 'createClaimDone', response, }); break; case 'createClaimOnAvs': const avsRes = await (0, create_claim_on_avs_1.createClaimOnAvs)({ ...req.request, payer: req.request.payer === 'attestor' ? { attestor: defaultUrl } : undefined, context: req.request.context ? JSON.parse(req.request.context) : undefined, zkOperators: getZkOperators(req.request.zkOperatorMode, req.request.zkEngine), oprfOperators: getOprfOperators(req.request.zkOperatorMode, req.request.zkEngine), logger, onStep(step) { sendMessage({ type: 'createClaimOnAvsStep', step, module: req.module, id: req.id, }); }, }); respond({ type: 'createClaimOnAvsDone', response: avsRes, }); break; case 'extractHtmlElement': respond({ type: 'extractHtmlElementDone', response: (0, utils_1.extractHTMLElement)(req.request.html, req.request.xpathExpression, req.request.contentsOnly), }); break; case 'extractJSONValueIndex': respond({ type: 'extractJSONValueIndexDone', response: (0, utils_1.extractJSONValueIndex)(req.request.json, req.request.jsonPath), }); break; case 'getCurrentMemoryUsage': respond({ type: 'getCurrentMemoryUsageDone', response: await (0, utils_3.getCurrentMemoryUsage)(), }); break; case 'setLogLevel': logger = (0, utils_2.makeLogger)(true, req.request.logLevel, req.request.sendLogsToApp ? (level, message) => (sendMessage({ type: 'log', level, message, module: req.module, id: req.id, })) : undefined); respond({ type: 'setLogLevelDone', response: undefined }); break; case 'benchmarkZK': respond({ type: 'benchmarkZKDone', response: await (0, benchmark_1.Benchmark)(), }); break; default: break; } } catch (err) { logger.error({ msg: err.message, err, data: event.data }, 'error in RPC'); respond({ type: 'error', data: { message: err.message, stack: err.stack, } }); } function getZkOperators(mode = 'default', zkEngine = 'snarkjs') { // use default snarkJS ops if (mode === 'default') { return; } // the native app/window calling implements // a ZK operator & wants to use it const operators = {}; for (const alg of window_rpc_zk_1.ALL_ENC_ALGORITHMS) { operators[alg] = (0, window_rpc_zk_1.makeWindowRpcZkOperator)(alg, makeCommunicationBridge(), zkEngine); } return operators; } function getOprfOperators(mode = 'default', zkEngine = 'snarkjs') { // use default webview ops if (mode === 'default') { return; } // the native app/window calling implements // a ZK operator & wants to use it const operators = {}; for (const alg of window_rpc_zk_1.ALL_ENC_ALGORITHMS) { operators[alg] = (0, window_rpc_zk_1.makeWindowRpcOprfOperator)(alg, makeCommunicationBridge(), zkEngine); } return operators; } function makeCommunicationBridge() { return { send: sendMessage, onMessage(cb) { windowMsgs.addEventListener('message', handle); return () => { windowMsgs.removeEventListener('message', handle); }; function handle(msg) { cb(msg.data); } }, }; } function respond(data) { const res = { ...data, id, module: 'attestor-core', isResponse: true }; return sendMessage(res); } function sendMessage(data) { var _a; const str = JSON.stringify(data, b64_json_1.B64_JSON_REPLACER); if (channel) { (_a = window[channel]) === null || _a === void 0 ? void 0 : _a.postMessage(str); } else { event.source.postMessage(str); } } async function updateProviderParams(transcript, tlsVersion) { const { req, res } = (0, utils_1.generateRequstAndResponseFromTranscript)(transcript, tlsVersion); const bridge = makeCommunicationBridge(); const id = (0, utils_3.generateRpcRequestId)(); const waitForRes = (0, utils_3.waitForResponse)('updateProviderParams', id, bridge); bridge.send({ type: 'updateProviderParams', id, request: { request: { ...req, body: req.body ? (0, tls_1.uint8ArrayToStr)(req.body) : undefined }, response: { ...res, body: (0, tls_1.uint8ArrayToStr)(res.body) }, }, module: 'attestor-core' }); return await waitForRes; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtd2luZG93LXJwYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aW5kb3ctcnBjL3NldHVwLXdpbmRvdy1ycGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsd0NBdVRDO0FBclZELDhDQUFzRDtBQUV0RCw0RUFBcUU7QUFDckUsdUNBQWtEO0FBQ2xELG9EQUE2SDtBQUU3SCxxQ0FBd0Q7QUFDeEQsaURBQXdFO0FBQ3hFLG1EQUErQztBQUUvQyxnREFBc0o7QUFDdEosZ0VBQXFIO0FBRXJILE1BQU0sY0FBZSxTQUFRLEtBQUs7SUFDakMsWUFBNEIsSUFBMEI7UUFDckQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRFcsU0FBSSxHQUFKLElBQUksQ0FBc0I7SUFFdEQsQ0FBQztDQUNEO0FBRUQsTUFBTSxhQUFhLEdBQUc7SUFDckIsZUFBZTtJQUNmLGFBQWE7Q0FDYixDQUFBO0FBRUQsSUFBSSxNQUFNLEdBQUcsY0FBTSxDQUFBO0FBRW5COzs7R0FHRztBQUNILFNBQWdCLGNBQWM7SUFDN0IsTUFBTSxHQUFHLElBQUEsa0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO0lBRXBDLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQXVCLEdBQUUsQ0FBQTtJQUU1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtJQUUvQyxLQUFLLFVBQVUsYUFBYSxDQUFDLEtBQXdCO1FBQ3BELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUNYLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUNoQixJQUFJLENBQUM7WUFDSixJQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFD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