@vechain/connex.driver-nodejs
Version:
Connex framework driver implementation in NodeJS
169 lines • 12.1 kB
JavaScript
;
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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