const ClientHelloMessage = require("./Messages/ClientHelloMessage") const LoginMessage = require("./Messages/LoginMessage") const KeepAliveMessage = require("./Messages/KeepAliveMessage") const HeartbeatMessage = require("./Messages/HeartbeatMessage") class MessageFactory { constructor(config, crypto, logger) { this.config = config this.crypto = crypto this.logger = logger this.messageTypes = { 10100: ClientHelloMessage, 10101: LoginMessage, 20108: KeepAliveMessage, 0: HeartbeatMessage, // 6076: CustomMessage, } } createMessage(type, data = null) { const MessageClass = this.messageTypes[type] if (!MessageClass) { throw new Error(`Unknown message type: ${type}`) } return new MessageClass(this.config, this.crypto, this.logger, data) } parseMessage(buffer) { try { const ByteStream = require("../ByteStream/ByteStream") const stream = new ByteStream(buffer) const messageType = stream.readUInt16() const length = stream.readUInt24() const payload = stream.readBytes(length) this.logger.packet("in", messageType, length, { payload: payload.toString("hex") }) return { type: messageType, length: length, payload: payload, } } catch (error) { this.logger.error("Failed to parse message:", error.message) throw error } } createPacketHeader(messageType, payload) { const ByteStream = require("../ByteStream/ByteStream") const stream = new ByteStream() stream.writeUInt16(messageType) stream.writeUInt24(payload.length) const header = stream.getBuffer() const packet = Buffer.concat([header, payload]) this.logger.packet("out", messageType, packet.length, { payload: payload.toString("hex") }) return packet } } module.exports = MessageFactory