openbrawl-client/Protocol/MessageFactory.js
2025-06-21 00:41:45 +03:00

70 lines
1.8 KiB
JavaScript

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