UNPKG

@vechain/connex-wallet-buddy

Version:

to bridge connex sign request to wallet

136 lines 10.1 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.create = void 0; require("../../framework/dist/driver-interface"); const W = require("./wallet"); const DEFAULT_TOS_URL = 'https://tos.vecha.in:5678/'; const ACCEPTED_SUFFIX = '.accepted'; const RESP_SUFFIX = '.resp'; function submitRequest(rid, json, signal, tosUrl) { return __awaiter(this, void 0, void 0, function* () { const src = new URL(rid, tosUrl).href; for (let i = 0; i < 3 && !signal.done; i++) { try { return yield fetch(src, { method: 'POST', body: json, headers: new Headers({ 'Content-Type': 'application/json' }) }); } catch (_a) { yield new Promise(resolve => setTimeout(resolve, 2000)); } } throw new Error('failed to submit request'); }); } function pollResponse(rid, suffix, timeout, signal, tosUrl) { return __awaiter(this, void 0, void 0, function* () { let errCount = 0; const deadline = Date.now() + timeout; while (Date.now() < deadline && !signal.done) { try { const resp = yield fetch(new URL(`${rid}${suffix}?wait=1`, tosUrl).href); const text = yield resp.text(); if (text) { return text; } } catch (err) { if (++errCount > 2) { throw new Error('failed fetch response'); } yield new Promise(resolve => setTimeout(resolve, 3000)); } } throw new Error('timeout'); }); } function sign(type, msg, options, genesisId, nonce, blake2b256, tosUrl) { const onAccepted = options.onAccepted; const req = { type, gid: genesisId, payload: { message: msg, options: Object.assign(Object.assign({}, options), { onAccepted: undefined }) }, nonce: nonce() }; const json = JSON.stringify(req); const rid = blake2b256(json); const signal = { done: false }; return Promise.race([ // open wallet and watch wallet closing (() => __awaiter(this, void 0, void 0, function* () { try { const w = yield W.connect(new URL(rid, tosUrl).href); while (!signal.done) { if (w && w.closed) { throw new Error('wallet window closed'); } yield new Promise(resolve => setTimeout(resolve, 1000)); } } finally { signal.done = true; } }))(), // submit request and poll response (() => __awaiter(this, void 0, void 0, function* () { try { yield submitRequest(rid, json, signal, tosUrl); onAccepted && void (() => __awaiter(this, void 0, void 0, function* () { try { yield pollResponse(rid, ACCEPTED_SUFFIX, 60 * 1000, signal, tosUrl); !signal.done && onAccepted && onAccepted(); } catch (err) { console.warn(err); } }))(); const respJson = yield pollResponse(rid, RESP_SUFFIX, 10 * 60 * 1000, signal, tosUrl); const resp = JSON.parse(respJson); if (resp.error) { throw new Error(resp.error); } return resp.payload; } finally { signal.done = true; } }))() ]); } /** * create an instance of wallet buddy to help send signing requests to wallet app * @param genesisId the genesis id of requests binding to * @param nonce random bytes generator * @param blake2b256 blake2b256 hash function * @param tosUrl the optional customized tos url */ function create(genesisId, nonce, blake2b256, tosUrl) { return { signTx(msg, options) { return sign('tx', msg, options, genesisId, nonce, blake2b256, tosUrl || DEFAULT_TOS_URL); }, signCert(msg, options) { return sign('cert', msg, options, genesisId, nonce, blake2b256, tosUrl || DEFAULT_TOS_URL); } }; } exports.create = create; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsaURBQThDO0FBQzlDLDhCQUE2QjtBQUU3QixNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQTtBQUNwRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUE7QUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFBO0FBdUIzQixTQUFlLGFBQWEsQ0FBQyxHQUFXLEVBQUUsSUFBWSxFQUFFLE1BQWMsRUFBRSxNQUFjOztRQUNsRixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFBO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUk7Z0JBQ0EsT0FBTyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7b0JBQ3BCLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxJQUFJO29CQUNWLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQzt3QkFDakIsY0FBYyxFQUFFLGtCQUFrQjtxQkFDckMsQ0FBQztpQkFDTCxDQUFDLENBQUE7YUFDTDtZQUFDLFdBQU07Z0JBQ0osTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTthQUMxRDtTQUNKO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQy9DLENBQUM7Q0FBQTtBQUVELFNBQWUsWUFBWSxDQUFDLEdBQVcsRUFBRSxNQUFjLEVBQUUsT0FBZSxFQUFFLE1BQWMsRUFBRSxNQUFjOztRQUNwRyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUE7UUFD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