UNPKG

@deepkit/rpc-tcp

Version:

113 lines 4.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RpcWebSocketServer = exports.RpcTcpServer = void 0; const core_1 = require("@deepkit/core"); const fs_1 = require("fs"); const net_1 = require("net"); const ws_1 = require("ws"); const path_1 = require("path"); /** * Uses the node `net` module to create a server. Supports unix sockets. */ class RpcTcpServer { constructor(kernel, host) { this.kernel = kernel; this.host = (0, core_1.parseHost)(host); if (this.host.isUnixSocket) { if ((0, fs_1.existsSync)(this.host.unixSocket)) (0, fs_1.unlinkSync)(this.host.unixSocket); (0, fs_1.mkdirSync)((0, path_1.dirname)(this.host.unixSocket), { recursive: true }); } } start() { return (0, core_1.asyncOperation)((resolve, reject) => { this.server = (0, net_1.createServer)(); this.server.on('listening', () => { resolve(true); }); this.server.on('error', (err) => { reject(new Error('Could not start broker server: ' + err)); }); this.server.on('connection', (socket) => { const connection = this.kernel?.createConnection({ write(b) { connection.sendBinary(b, (data) => socket.write(data)); }, clientAddress() { return socket.remoteAddress || ''; }, close() { socket.destroy(); }, bufferedAmount() { return socket.writableLength || 0; }, }); socket.on('data', (data) => { connection.feed(data); }); socket.on('close', () => { connection.close(); }); socket.on('error', (error) => { connection.close(error); }); }); if (this.host.isUnixSocket) { this.server.listen(this.host.unixSocket); } else { this.server.listen(this.host.port || 8811, this.host.host); } }); } close() { this.server?.close(); } } exports.RpcTcpServer = RpcTcpServer; class RpcWebSocketServer { constructor(kernel, host) { this.kernel = kernel; this.host = (0, core_1.parseHost)(host); if (this.host.isUnixSocket && (0, fs_1.existsSync)(this.host.unixSocket)) { if ((0, fs_1.existsSync)(this.host.unixSocket)) (0, fs_1.unlinkSync)(this.host.unixSocket); (0, fs_1.mkdirSync)((0, path_1.dirname)(this.host.unixSocket), { recursive: true }); } } close() { this.server?.close(); } start(options) { const defaultOptions = { host: this.host.host, port: this.host.port }; this.server = new ws_1.WebSocketServer({ ...defaultOptions, ...options }); this.server.on('connection', (ws, req) => { const connection = this.kernel?.createConnection({ writeBinary(message) { ws.send(message); }, close() { ws.close(); }, bufferedAmount() { return ws.bufferedAmount; }, clientAddress() { return req.socket.remoteAddress || ''; }, }); ws.on('message', (message) => { connection.feed(message); }); ws.on('close', () => { connection.close(); }); ws.on('error', (error) => { connection.close(error); }); }); } } exports.RpcWebSocketServer = RpcWebSocketServer; //# sourceMappingURL=server.js.map