@perion/net
Version:
A few networking utilities for MapleStory server development
50 lines • 1.67 kB
JavaScript
const Parser = require('./parser.js');
/**
* Provides encode and decode functions for MapleStory packets
* @class
* @memberof module:@perion/net
*/
class Encoder {
constructor({shanda, aes}) {
this.shanda = shanda;
this.aes = aes;
}
/**
* Encodes a packet using MapleStory encoding
* @param {Buffer} data The output data buffer
* @param {AES} aes The send AES instance
* @return {Buffer} Returns the encrypted Buffer
*/
encode(data) {
const header = this.aes.getPacketHeader(data.length);
data = this.shanda.encrypt(data);
data = this.aes.transform(data);
const encPacket = Buffer.concat([header, data]);
return encPacket;
}
/**
* Decodes a packet using MapleStory decoding
* @param {Buffer} data The input data Buffer
* @param {AES} aes The receive AES instance
* @return {Object} Returns an object with {header, data}
*/
decode(data, readOp=true) {
if (data.length < 4) throw new Error('Data needs atleast size of 4');
let dataNoHeader = data.slice(4);
let header = data.slice(0, 4);
// TODO: Debug getPacketLength
// const parsed = new Parser(header).int().collect(['header']);
// console.log(parsed);
// console.log(aes._getPacketLength(parsed.header));
dataNoHeader = this.aes.transform(dataNoHeader);
dataNoHeader = this.shanda.decrypt(dataNoHeader);
if (!readOp) {
return {header: header, data: dataNoHeader};
}
// console.log(dataNoHeader);
const opcode = Parser.from(dataNoHeader).short().get();
// console.log(dataNoHeader);
return {header: header, opcode, data: dataNoHeader.slice(2)};
}
}
module.exports = Encoder;