diff --git a/cvmts/src/CollabVMServer.ts b/cvmts/src/CollabVMServer.ts index 61cbe8c..a1b4c17 100644 --- a/cvmts/src/CollabVMServer.ts +++ b/cvmts/src/CollabVMServer.ts @@ -173,9 +173,7 @@ export default class CollabVMServer implements IProtocolHandlers { } } - // TODO: we should probably just make this a buffer arg lol.. - user.socket.on('msg', (msg: string) => { - let buf = Buffer.from(msg); + user.socket.on('msg', (buf: Buffer, binary: boolean) => { try { user.protocol.processMessage(buf); } catch (err) { diff --git a/cvmts/src/NetworkClient.ts b/cvmts/src/NetworkClient.ts index 600356f..5bfd4e4 100644 --- a/cvmts/src/NetworkClient.ts +++ b/cvmts/src/NetworkClient.ts @@ -1,9 +1,14 @@ -export default interface NetworkClient { +import { EventEmitter } from "stream"; + +interface NetworkClientEvents extends EventEmitter { + on(event: 'msg', listener: (buf: Buffer, binary: boolean) => void): this; + on(event: 'disconnect', listener: () => void): this; +} + +export interface NetworkClient extends NetworkClientEvents { getIP(): string; send(msg: string): Promise; sendBinary(msg: Uint8Array): Promise; close(): void; - on(event: string, listener: (...args: any[]) => void): void; - off(event: string, listener: (...args: any[]) => void): void; isOpen(): boolean; } diff --git a/cvmts/src/NetworkServer.ts b/cvmts/src/NetworkServer.ts index 5fce6f6..1719354 100644 --- a/cvmts/src/NetworkServer.ts +++ b/cvmts/src/NetworkServer.ts @@ -1,6 +1,11 @@ -export default interface NetworkServer { +import { EventEmitter } from "stream"; +import { User } from "./User"; + +interface NetworkServerEvents extends EventEmitter { + on(event: 'connect', listener: (user: User) => void): this; +} + +export interface NetworkServer extends NetworkServerEvents { start(): void; stop(): void; - on(event: string, listener: (...args: any[]) => void): void; - off(event: string, listener: (...args: any[]) => void): void; } diff --git a/cvmts/src/TCP/TCPClient.ts b/cvmts/src/TCP/TCPClient.ts index 7d3ff9c..8275596 100644 --- a/cvmts/src/TCP/TCPClient.ts +++ b/cvmts/src/TCP/TCPClient.ts @@ -1,5 +1,5 @@ import EventEmitter from 'events'; -import NetworkClient from '../NetworkClient.js'; +import { NetworkClient } from '../NetworkClient.js'; import { Socket } from 'net'; const TextHeader = 0; diff --git a/cvmts/src/TCP/TCPServer.ts b/cvmts/src/TCP/TCPServer.ts index 04ec833..0277269 100644 --- a/cvmts/src/TCP/TCPServer.ts +++ b/cvmts/src/TCP/TCPServer.ts @@ -2,7 +2,7 @@ // struct msg { beu32 len; char data[len] } // (along with a length cap obviously) import EventEmitter from 'events'; -import NetworkServer from '../NetworkServer.js'; +import { NetworkServer } from '../NetworkServer.js'; import { Server, Socket } from 'net'; import IConfig from '../IConfig.js'; import TCPClient from './TCPClient.js'; diff --git a/cvmts/src/WebSocket/WSClient.ts b/cvmts/src/WebSocket/WSClient.ts index c2b0cbf..d0c0f04 100644 --- a/cvmts/src/WebSocket/WSClient.ts +++ b/cvmts/src/WebSocket/WSClient.ts @@ -1,23 +1,25 @@ import { WebSocket } from 'ws'; -import NetworkClient from '../NetworkClient.js'; +import { NetworkClient } from '../NetworkClient.js'; import EventEmitter from 'events'; export default class WSClient extends EventEmitter implements NetworkClient { socket: WebSocket; ip: string; + enforceTextOnly = true constructor(ws: WebSocket, ip: string) { super(); this.socket = ws; this.ip = ip; this.socket.on('message', (buf: Buffer, isBinary: boolean) => { - // Close the user's connection if they send a non-string message - if (isBinary) { + // Close the user's connection if they send a binary message + // when we are not expecting them yet. + if (isBinary && this.enforceTextOnly) { this.close(); return; } - this.emit('msg', buf.toString('utf-8')); + this.emit('msg', buf, isBinary); }); this.socket.on('close', () => { diff --git a/cvmts/src/WebSocket/WSServer.ts b/cvmts/src/WebSocket/WSServer.ts index 82e7a24..b549eb9 100644 --- a/cvmts/src/WebSocket/WSServer.ts +++ b/cvmts/src/WebSocket/WSServer.ts @@ -1,5 +1,5 @@ import * as http from 'http'; -import NetworkServer from '../NetworkServer.js'; +import { NetworkServer } from '../NetworkServer.js'; import EventEmitter from 'events'; import { WebSocketServer, WebSocket } from 'ws'; import internal from 'stream';