70 lines
1.8 KiB
JavaScript
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
|