cvmts: Fix WebSocket errors causing process crashes

This commit is contained in:
modeco80
2024-08-30 20:30:17 -04:00
parent 3c4ddb72b8
commit fae4c6d146

View File

@@ -1,10 +1,12 @@
import { WebSocket } from 'ws'; import { WebSocket } from 'ws';
import NetworkClient from '../NetworkClient.js'; import NetworkClient from '../NetworkClient.js';
import EventEmitter from 'events'; import EventEmitter from 'events';
import pino from 'pino';
export default class WSClient extends EventEmitter implements NetworkClient { export default class WSClient extends EventEmitter implements NetworkClient {
socket: WebSocket; socket: WebSocket;
ip: string; ip: string;
private logger = pino({ name: "CVMTS.WebsocketClient" });
constructor(ws: WebSocket, ip: string) { constructor(ws: WebSocket, ip: string) {
super(); super();
@@ -20,6 +22,10 @@ export default class WSClient extends EventEmitter implements NetworkClient {
this.emit('msg', buf.toString('utf-8')); this.emit('msg', buf.toString('utf-8'));
}); });
this.socket.on('error', (err: Error) => {
this.logger.error(err, 'WebSocket recv error');
})
this.socket.on('close', () => { this.socket.on('close', () => {
this.emit('disconnect'); this.emit('disconnect');
}); });
@@ -35,11 +41,13 @@ export default class WSClient extends EventEmitter implements NetworkClient {
send(msg: string): Promise<void> { send(msg: string): Promise<void> {
return new Promise((res, rej) => { return new Promise((res, rej) => {
if (!this.isOpen()) res(); if (!this.isOpen()) return res();
this.socket.send(msg, (err) => { this.socket.send(msg, (err) => {
if (err) { if (err) {
rej(err); this.logger.error(err, 'WebSocket send error');
this.close();
res();
return; return;
} }
res(); res();
@@ -49,11 +57,13 @@ export default class WSClient extends EventEmitter implements NetworkClient {
sendBinary(msg: Uint8Array): Promise<void> { sendBinary(msg: Uint8Array): Promise<void> {
return new Promise((res, rej) => { return new Promise((res, rej) => {
if (!this.isOpen()) res(); if (!this.isOpen()) return res();
this.socket.send(msg, (err) => { this.socket.send(msg, (err) => {
if (err) { if (err) {
rej(err); this.logger.error(err, 'WebSocket send error');
this.close();
res();
return; return;
} }
res(); res();