From a8d32f05550ebeca941711ddb8e93d534140195c Mon Sep 17 00:00:00 2001 From: modeco80 Date: Thu, 22 Aug 2024 04:29:17 -0400 Subject: [PATCH] move ProtocolManager into its own unit --- cvmts/src/CollabVMServer.ts | 14 +++++------ cvmts/src/User.ts | 3 ++- cvmts/src/index.ts | 2 +- cvmts/src/protocol/GuacamoleProtocol.ts | 2 +- cvmts/src/protocol/Manager.ts | 27 ++++++++++++++++++++ cvmts/src/protocol/Protocol.ts | 33 +++---------------------- 6 files changed, 42 insertions(+), 39 deletions(-) create mode 100644 cvmts/src/protocol/Manager.ts diff --git a/cvmts/src/CollabVMServer.ts b/cvmts/src/CollabVMServer.ts index 019e333..9e67275 100644 --- a/cvmts/src/CollabVMServer.ts +++ b/cvmts/src/CollabVMServer.ts @@ -17,7 +17,8 @@ import { ReaderModel } from '@maxmind/geoip2-node'; import { Size, Rect } from './Utilities.js'; import pino from 'pino'; import { BanManager } from './BanManager.js'; -import { IProtocolHandlers, ListEntry, ProtocolAddUser, ProtocolFlag, ProtocolRenameStatus, ProtocolUpgradeCapability, TheProtocolManager } from './protocol/Protocol.js'; +import { IProtocolMessageHandler, ListEntry, ProtocolAddUser, ProtocolFlag, ProtocolRenameStatus, ProtocolUpgradeCapability } from './protocol/Protocol.js'; +import { TheProtocolManager } from './protocol/Manager.js'; // Instead of strange hacks we can just use nodejs provided // import.meta properties, which have existed since LTS if not before @@ -37,7 +38,7 @@ type VoteTally = { no: number; }; -export default class CollabVMServer implements IProtocolHandlers { +export default class CollabVMServer implements IProtocolMessageHandler { private Config: IConfig; private clients: User[]; @@ -184,7 +185,7 @@ export default class CollabVMServer implements IProtocolHandlers { user.socket.on('disconnect', () => this.connectionClosed(user)); // Set ourselves as the handler - user.protocol.setHandler(this as IProtocolHandlers); + user.protocol.setHandler(this as IProtocolMessageHandler); if (this.Config.auth.enabled) { user.protocol.sendAuth(this.Config.auth.apiEndpoint); @@ -223,7 +224,7 @@ export default class CollabVMServer implements IProtocolHandlers { this.clients.forEach((c) => c.protocol.sendRemUser([user.username!])); } - // IProtocolHandlers + // Protocol message handlers // does auth check private authCheck(user: User, guestPermission: boolean) { @@ -318,7 +319,7 @@ export default class CollabVMServer implements IProtocolHandlers { user.Capabilities.bin = true; user.protocol.dispose(); user.protocol = TheProtocolManager.createProtocol('binary1', user); - user.protocol.setHandler(this as IProtocolHandlers); + user.protocol.setHandler(this as IProtocolMessageHandler); break; default: break; @@ -706,11 +707,10 @@ export default class CollabVMServer implements IProtocolHandlers { this.clients.forEach((c) => c.protocol.sendChatMessage('', message)); } - // end IProtocolHandlers + // end protocol message handlers getUsernameList(): string[] { var arr: string[] = []; - this.clients.filter((c) => c.username).forEach((c) => arr.push(c.username!)); return arr; } diff --git a/cvmts/src/User.ts b/cvmts/src/User.ts index 8a539a0..4efe2aa 100644 --- a/cvmts/src/User.ts +++ b/cvmts/src/User.ts @@ -8,7 +8,8 @@ import { NetworkClient } from './net/NetworkClient.js'; import { CollabVMCapabilities } from '@cvmts/collab-vm-1.2-binary-protocol'; import pino from 'pino'; import { BanManager } from './BanManager.js'; -import { IProtocol, TheProtocolManager } from './protocol/Protocol.js'; +import { IProtocol } from './protocol/Protocol.js'; +import { TheProtocolManager } from './protocol/Manager.js'; export class User { socket: NetworkClient; diff --git a/cvmts/src/index.ts b/cvmts/src/index.ts index 5cad003..26d89ed 100644 --- a/cvmts/src/index.ts +++ b/cvmts/src/index.ts @@ -16,7 +16,7 @@ import pino from 'pino'; import { Database } from './Database.js'; import { BanManager } from './BanManager.js'; import { QemuVMShim } from './vm/qemu.js'; -import { TheProtocolManager } from './protocol/Protocol.js'; +import { TheProtocolManager } from './protocol/Manager.js'; import { GuacamoleProtocol } from './protocol/GuacamoleProtocol.js'; import { BinRectsProtocol } from './protocol/BinRectsProtocol.js'; diff --git a/cvmts/src/protocol/GuacamoleProtocol.ts b/cvmts/src/protocol/GuacamoleProtocol.ts index 7dfb551..e5c1998 100644 --- a/cvmts/src/protocol/GuacamoleProtocol.ts +++ b/cvmts/src/protocol/GuacamoleProtocol.ts @@ -1,5 +1,5 @@ import pino from 'pino'; -import { IProtocol, IProtocolHandlers, ListEntry, ProtocolAddUser, ProtocolBase, ProtocolChatHistory, ProtocolFlag, ProtocolRenameStatus, ProtocolUpgradeCapability, ScreenRect } from './Protocol.js'; +import { IProtocol, IProtocolMessageHandler, ListEntry, ProtocolAddUser, ProtocolBase, ProtocolChatHistory, ProtocolFlag, ProtocolRenameStatus, ProtocolUpgradeCapability, ScreenRect } from './Protocol.js'; import { Rank, User } from '../User.js'; import * as cvm from '@cvmts/cvm-rs'; diff --git a/cvmts/src/protocol/Manager.ts b/cvmts/src/protocol/Manager.ts new file mode 100644 index 0000000..d61b003 --- /dev/null +++ b/cvmts/src/protocol/Manager.ts @@ -0,0 +1,27 @@ +import { IProtocol } from "./Protocol"; +import { User } from "../User"; + +// The protocol manager. Holds protocol factories, and provides the ability +// to create a protocol by name. Avoids direct dependency on a given list of protocols, +// and allows (relatively simple) expansion. +export class ProtocolManager { + private protocols = new Map IProtocol>(); + + // Registers a protocol with the given name. + registerProtocol(name: string, protocolFactory: () => IProtocol) { + if (!this.protocols.has(name)) this.protocols.set(name, protocolFactory); + } + + // Creates an instance of a given protocol for a user. + createProtocol(name: string, user: User): IProtocol { + if (!this.protocols.has(name)) throw new Error(`ProtocolManager does not have protocol \"${name}\"`); + + let factory = this.protocols.get(name)!; + let proto = factory(); + proto.init(user); + return proto; + } +} + +/// Global protocol manager +export let TheProtocolManager = new ProtocolManager(); diff --git a/cvmts/src/protocol/Protocol.ts b/cvmts/src/protocol/Protocol.ts index c7da3f8..e6fe4ef 100644 --- a/cvmts/src/protocol/Protocol.ts +++ b/cvmts/src/protocol/Protocol.ts @@ -40,7 +40,7 @@ export interface ProtocolFlag { } // Protocol handlers. This is implemented by a layer that wants to listen to CollabVM protocol messages. -export interface IProtocolHandlers { +export interface IProtocolMessageHandler { onNop(user: User): void; onNoFlag(user: User): void; @@ -95,7 +95,7 @@ export interface IProtocol { dispose(): void; // Sets handler object. - setHandler(handlers: IProtocolHandlers): void; + setHandler(handlers: IProtocolMessageHandler): void; // Protocol implementation stuff @@ -152,7 +152,7 @@ export interface IProtocol { // Base mixin for all concrete protocols to use. Inherit from this! export class ProtocolBase { - protected handlers: IProtocolHandlers | null = null; + protected handlers: IProtocolMessageHandler | null = null; protected user: User | null = null; init(u: User): void { @@ -164,32 +164,7 @@ export class ProtocolBase { this.handlers = null; } - setHandler(handlers: IProtocolHandlers): void { + setHandler(handlers: IProtocolMessageHandler): void { this.handlers = handlers; } } - -// The protocol manager. Holds protocol factories, and provides the ability -// to create a protocol by name. Avoids direct dependency on a given list of protocols, -// and allows (relatively simple) expansion. -export class ProtocolManager { - private protocols = new Map IProtocol>(); - - // Registers a protocol with the given name. - registerProtocol(name: string, protocolFactory: () => IProtocol) { - if (!this.protocols.has(name)) this.protocols.set(name, protocolFactory); - } - - // Creates an instance of a given protocol for a user. - createProtocol(name: string, user: User): IProtocol { - if (!this.protocols.has(name)) throw new Error(`ProtocolManager does not have protocol \"${name}\"`); - - let factory = this.protocols.get(name)!; - let proto = factory(); - proto.init(user); - return proto; - } -} - -/// Global protocol manager -export let TheProtocolManager = new ProtocolManager();