2024-06-22 21:26:49 -04:00
|
|
|
import EventEmitter from 'events';
|
|
|
|
|
import NetworkServer from '../NetworkServer.js';
|
|
|
|
|
import { Server, Socket } from 'net';
|
|
|
|
|
import IConfig from '../IConfig.js';
|
|
|
|
|
import TCPClient from './TCPClient.js';
|
|
|
|
|
import { IPDataManager } from '../IPData.js';
|
|
|
|
|
import { User } from '../User.js';
|
2024-07-16 08:29:52 -04:00
|
|
|
import pino from 'pino';
|
2024-07-31 16:34:42 -04:00
|
|
|
import { BanManager } from '../BanManager.js';
|
2024-05-27 00:06:05 -04:00
|
|
|
|
|
|
|
|
export default class TCPServer extends EventEmitter implements NetworkServer {
|
2024-06-22 21:26:49 -04:00
|
|
|
listener: Server;
|
|
|
|
|
Config: IConfig;
|
2024-07-16 08:29:52 -04:00
|
|
|
logger = pino({name: 'CVMTS.TCPServer'});
|
2024-06-22 21:26:49 -04:00
|
|
|
clients: TCPClient[];
|
2024-07-31 16:34:42 -04:00
|
|
|
private banmgr: BanManager;
|
2024-05-27 00:06:05 -04:00
|
|
|
|
2024-07-31 16:34:42 -04:00
|
|
|
constructor(config: IConfig, banmgr: BanManager) {
|
2024-06-22 21:26:49 -04:00
|
|
|
super();
|
|
|
|
|
this.Config = config;
|
|
|
|
|
this.listener = new Server();
|
|
|
|
|
this.clients = [];
|
|
|
|
|
this.listener.on('connection', (socket) => this.onConnection(socket));
|
2024-07-31 16:34:42 -04:00
|
|
|
this.banmgr = banmgr;
|
2024-06-22 21:26:49 -04:00
|
|
|
}
|
2024-05-27 00:06:05 -04:00
|
|
|
|
2024-07-31 16:34:42 -04:00
|
|
|
private async onConnection(socket: Socket) {
|
2024-07-16 08:29:52 -04:00
|
|
|
this.logger.info(`New TCP connection from ${socket.remoteAddress}`);
|
2024-07-31 16:34:42 -04:00
|
|
|
if (await this.banmgr.isIPBanned(socket.remoteAddress!)) {
|
|
|
|
|
socket.write("6.banned;");
|
|
|
|
|
socket.destroy();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-06-22 21:26:49 -04:00
|
|
|
var client = new TCPClient(socket);
|
|
|
|
|
this.clients.push(client);
|
|
|
|
|
this.emit('connect', new User(client, IPDataManager.GetIPData(client.getIP()), this.Config));
|
|
|
|
|
}
|
2024-05-27 00:06:05 -04:00
|
|
|
|
2024-06-22 21:26:49 -04:00
|
|
|
start(): void {
|
|
|
|
|
this.listener.listen(this.Config.tcp.port, this.Config.tcp.host, () => {
|
2024-07-16 08:29:52 -04:00
|
|
|
this.logger.info(`TCP server listening on ${this.Config.tcp.host}:${this.Config.tcp.port}`);
|
2024-06-22 21:26:49 -04:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
stop(): void {
|
|
|
|
|
this.listener.close();
|
|
|
|
|
}
|
|
|
|
|
}
|