move ProtocolManager into its own unit
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
27
cvmts/src/protocol/Manager.ts
Normal file
27
cvmts/src/protocol/Manager.ts
Normal file
@@ -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<String, () => 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();
|
||||
@@ -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<String, () => 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();
|
||||
|
||||
Reference in New Issue
Block a user