@kadena/hardhat-chainweb
Version:
Hardhat plugin for Kadena's Chainweb network
122 lines • 4.93 kB
JavaScript
;
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