import World from '@/core/domain/World'; import Server from '../../../core/interface/server/Server'; import GameConnection from '@/game/interface/networking/GameConnection'; import { Socket } from 'net'; import { Logger } from 'winston'; import { GameConfig } from '@/game/infra/config/GameConfig'; import { PacketMapValue } from '@/core/interface/networking/packets/Packets'; export default class GameServer extends Server { private readonly world: World; constructor(container: { logger: Logger; config: GameConfig; packets: Map>; world: World; }) { super(container); this.world = container.world; } async onData(connection: GameConnection, data: Buffer) { this.container.containerInstance.createScope(); this.logger.debug(`[IN][DATA SOCKET EVENT] Data received from ID: ${connection.getId()}`); const header = data[0]; const packetBuilder = this.packets.get(header); if (!packetBuilder) { this.logger.info(`[IN][PACKET] Unknown header packet: ${data[0]}`); return; } const { createPacket, createHandler } = packetBuilder; const packet = createPacket({}); const handler = createHandler(this.container); this.logger.debug(`[IN][PACKET] processing packet: ${handler.constructor.name}`); connection.cork(); await handler .execute(connection, packet.unpack(data)) .catch((err) => this.logger.error(err)) .finally(() => { connection.uncork(); }); } createConnection(socket: Socket) { return new GameConnection({ socket, logger: this.logger, }); } async close(): Promise { await this.world.close(); return super.close(); } }