import { createConnection, Socket } from 'node:net'; export default class SocketClient { private client!: Socket; private data: Buffer = Buffer.from([]); private onData!: (data: Buffer) => void; async connect(host: string, port: number) { return new Promise((resolve, reject) => { this.client = createConnection({ host, port, timeout: 50000 }, () => { console.log(`Connected with server: ${host}:${port}`); resolve(this.client); }); this.client.on('data', (data: Buffer) => { this.data = Buffer.concat([this.data, data]); this.onData?.(data); }); this.client.on('error', (err: Error) => { console.error(`Connection error: ${err.message}`); reject(err); }); this.client.on('end', () => { console.log('Disconnected from server'); }); }); } nextMessage(length: number): Promise> { return new Promise((resolve) => { if (this.data.length >= length) { const data = this.data.subarray(0, length); this.data = this.data.subarray(length); return resolve(data); } const interval = setInterval(() => { if (this.data.length >= length) { clearInterval(interval); const data = this.data.subarray(0, length); this.data = this.data.subarray(length); resolve(data); } }, 50); }); } sendMessage(message: Buffer) { this.client.write(message); } getData() { return this.data; } async close(): Promise { return new Promise((resolve) => { this.client.end(() => resolve()); }); } flush() { this.data = Buffer.from([]); } setOnData(onData: (data: Buffer) => void) { this.onData = onData; } }