UNPKG

@kadena/hardhat-chainweb

Version:
122 lines 4.93 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChainwebJsonRpcServer = void 0; const http_1 = __importDefault(require("http")); const ws_1 = require("ws"); const handler_1 = require("hardhat/internal/hardhat-network/jsonrpc/handler"); const pluginRouter_1 = require("./pluginRouter"); const picocolors_1 = __importDefault(require("picocolors")); const log = (msg) => { console.log(msg); }; class ChainwebJsonRpcServer { constructor(config) { this.listen = () => { return new Promise((resolve, reject) => { const errorHandler = (err) => { if ('code' in err) { console.log(picocolors_1.default.bgRedBright(` ${err.code} `), picocolors_1.default.redBright(err.message)); process.exit(1); } else { console.log(picocolors_1.default.redBright(err.message)); } reject(err); }; this._httpServer.on('error', errorHandler); this._wsServer.on('error', errorHandler); this._httpServer.listen(this._config.port, this._config.hostname, () => { // We get the address and port directly from the server in order to handle random port allocation with `0`. const address = this._httpServer.address(); // TCP sockets return AddressInfo resolve(address); }); }); }; this.waitUntilClosed = async () => { const httpServerClosed = new Promise((resolve) => { this._httpServer.once('close', resolve); }); const wsServerClosed = new Promise((resolve) => { this._wsServer.once('close', resolve); }); await Promise.all([httpServerClosed, wsServerClosed]); }; this.close = async () => { await Promise.all([ new Promise((resolve, reject) => { log('Closing JSON-RPC server'); this._httpServer.close((err) => { if (err !== null && err !== undefined) { log('Failed to close JSON-RPC server'); reject(err); return; } log('JSON-RPC server closed'); resolve(); }); }), new Promise((resolve, reject) => { log('Closing websocket server'); this._wsServer.close((err) => { if (err !== null && err !== undefined) { log('Failed to close websocket server'); reject(err); return; } log('Websocket server closed'); resolve(); }); }), ]); }; this._config = config; this._httpServer = http_1.default.createServer(); this._wsServer = new ws_1.Server({ server: this._httpServer, }); this.configureRouters({ httpServer: this._httpServer, wsServer: this._wsServer, handlers: config.providers.map(([chainId, provider]) => [chainId, new handler_1.JsonRpcHandler(provider)]), }); } configureRouters({ httpServer, wsServer, handlers, }) { httpServer.on('request', async (req, res) => { pluginRouter_1.pluginRouter.execute(req.url, { success: (msg, mimeType) => { res.writeHead(200, { 'Content-Type': mimeType }); res.end(msg); }, failure: (msg, code) => { res.writeHead(code); res.end(msg); }, proxy: (handler) => { handler.handleHttp(req, res); }, }, { handlers, }, 'http'); }); wsServer.on('connection', async (ws, request) => { pluginRouter_1.pluginRouter.execute(request.url, { success: (msg) => { ws.send(msg); }, failure: (error) => { ws.send(JSON.stringify({ error })); }, proxy: (handler) => { handler.handleWs(ws); }, }, { handlers, }, 'ws'); }); } } exports.ChainwebJsonRpcServer = ChainwebJsonRpcServer; //# sourceMappingURL=server.js.map