UNPKG

@vechain/connex.driver-nodejs

Version:

Connex framework driver implementation in NodeJS

169 lines 12.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const json_rpc_1 = require("@vechain/json-rpc"); const WebSocket = require("isomorphic-ws"); const common_1 = require("./common"); const options_1 = require("./options"); function openWebSocket(url) { return new Promise((resolve, reject) => { const ws = new WebSocket(url); ws.onopen = () => { offWebSocket(ws); resolve(ws); }; ws.onclose = ev => { offWebSocket(ws); reject(new Error(`websocket closed: ${ev.reason} (${ev.code})`)); }; ws.onerror = ev => { offWebSocket(ws); reject(ev.error || new Error('websocket error')); ws.close(); }; }); } function offWebSocket(ws) { ws.onclose = null; ws.onerror = null; ws.onmessage = null; ws.onopen = null; } function setupRPC(ws) { return __awaiter(this, void 0, void 0, function* () { const rpc = new json_rpc_1.JSONRPC((data, isRequest) => { if (!isRequest) { data = ' ' + data; } ws.send(data); return Promise.resolve(); }); ws.onmessage = ev => { const isRequest = ev.data[0] !== ' '; rpc.receive(ev.data, isRequest) .catch(err => { if (!options_1.options.disableErrorLog) { // tslint:disable-next-line: no-console console.warn('receive jsonrpc payload: ', err); } }); }; ws.onclose = () => { offWebSocket(ws); rpc.setError(new Error('closed')); }; ws.onerror = ev => { offWebSocket(ws); rpc.setError(ev.error); ws.close(); }; return rpc; }); } function _connect(url, genesisId) { return __awaiter(this, void 0, void 0, function* () { const ws = yield openWebSocket(url); const rpc = yield setupRPC(ws); try { const info = yield rpc.call('connect', genesisId); return { ws, rpc, genesis: info.genesis, initHead: info.head }; } catch (err) { ws.close(); throw err; } }); } function connect(url) { return __awaiter(this, void 0, void 0, function* () { let conn = yield _connect(url); const genesisId = conn.genesis.id; const reconnect = () => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { try { conn = yield _connect(url, genesisId); } catch (err) { reconnect(); } }), 10 * 1000); }; const rpcCall = (method, ...args) => { if (conn) { if (conn.ws.readyState === WebSocket.OPEN) { return conn.rpc.call(method, ...args); } conn = null; reconnect(); } return Promise.reject(new Error('closed')); }; let currentHead = conn.initHead; return { genesis: conn.genesis, get head() { return currentHead; }, pollHead: () => __awaiter(this, void 0, void 0, function* () { for (;;) { try { const newHead = yield rpcCall('pollHead'); currentHead = newHead; return newHead; } catch (_a) { yield common_1.sleep(5 * 1000); } } }), getBlock: rev => { return rpcCall('getBlock', rev); }, getTransaction: id => { return rpcCall('getTransaction', id); }, getReceipt: id => { return rpcCall('getReceipt', id); }, getAccount: (addr, rev) => { return rpcCall('getAccount', addr, rev); }, getCode: (addr, rev) => { return rpcCall('getCode', addr, rev); }, getStorage: (addr, key, rev) => { return rpcCall('getStorage', addr, key, rev); }, explain: (arg, rev, cacheTies) => { return rpcCall('explain', arg, rev, cacheTies); }, filterEventLogs: arg => { return rpcCall('filterEventLogs', arg); }, filterTransferLogs: arg => { return rpcCall('filterTransferLogs', arg); }, signTx: (msg, opt) => { return rpcCall('signTx', msg, opt); }, signCert: (msg, opt) => { return rpcCall('signCert', msg, opt); }, isAddressOwned: addr => { return rpcCall('isAddressOwned', addr); } }; }); } exports.connect = connect; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmlydHVhbC1kcml2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLGdEQUEyQztBQUMzQywyQ0FBMEM7QUFDMUMscUNBQWdDO0FBQ2hDLHVDQUFtQztBQUVuQyxTQUFTLGFBQWEsQ0FBQyxHQUFXO0lBQzlCLE9BQU8sSUFBSSxPQUFPLENBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDOUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDN0IsRUFBRSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDYixZQUFZLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDaEIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFBO1FBQ0QsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRTtZQUNkLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNwRSxDQUFDLENBQUE7UUFDRCxFQUFFLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFO1lBQ2QsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2hCLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtZQUNoRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDZCxDQUFDLENBQUE7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxFQUFhO0lBQy9CLEVBQUUsQ0FBQyxPQUFPLEdBQUcsSUFBVyxDQUFBO0lBQ3hCLEVBQUUsQ0FBQyxP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