Refactoring more code. Fix writing bug

This commit is contained in:
roblabla 2015-02-22 00:41:41 +00:00
parent 863f329ac0
commit ab24877359
2 changed files with 42 additions and 37 deletions

View File

@ -8,6 +8,7 @@ var net = require('net')
, oldStylePacket = protocol.oldStylePacket , oldStylePacket = protocol.oldStylePacket
, newStylePacket = protocol.newStylePacket , newStylePacket = protocol.newStylePacket
, parsePacket = protocol.parsePacket , parsePacket = protocol.parsePacket
, parsePacketData = protocol.parsePacketData
, parseNewStylePacket = protocol.parseNewStylePacket , parseNewStylePacket = protocol.parseNewStylePacket
, packetIds = protocol.packetIds , packetIds = protocol.packetIds
, packetNames = protocol.packetNames , packetNames = protocol.packetNames
@ -89,7 +90,7 @@ Client.prototype.setSocket = function(socket) {
} }
if (! parsed) { return; } if (! parsed) { return; }
var packet = parsed.results; var packet = parsed.results;
incomingBuffer = incomingBuffer.slice(parsed.size); //incomingBuffer = incomingBuffer.slice(parsed.size); TODO: Already removed in prepare
var packetName = protocol.packetNames[self.state][self.isServer ? 'toServer' : 'toClient'][packet.id]; var packetName = protocol.packetNames[self.state][self.isServer ? 'toServer' : 'toClient'][packet.id];
self.emit(packetName, packet); self.emit(packetName, packet);
@ -100,10 +101,19 @@ Client.prototype.setSocket = function(socket) {
} }
function prepareParse() { function prepareParse() {
if(self.compressionThreshold == -2) var packetLengthField = protocol.types["varint"][0](incomingBuffer, 0);
afterParse(null, parsePacket(incomingBuffer, self.state, self.isServer, self.packetsToParse)); if (packetLengthField && packetLengthField.size + packetLengthField.value <= incomingBuffer.length)
else {
parseNewStylePacket(incomingBuffer, self.state, self.isServer, self.packetsToParse, afterParse); var buf = incomingBuffer.slice(packetLengthField.size, packetLengthField.size + packetLengthField.value);
// TODO : Slice as early as possible to avoid processing same data twice.
incomingBuffer = incomingBuffer.slice(packetLengthField.size + packetLengthField.value);
if (self.compressionThreshold == -2)
{
afterParse(null, parsePacketData(buf, self.state, self.isServer, self.packetsToParse));
} else {
parseNewStylePacket(buf, self.state, self.isServer, self.packetsToParse, afterParse);
}
}
} }
self.socket = socket; self.socket = socket;
@ -171,7 +181,12 @@ Client.prototype.write = function(packetId, params) {
packetId = packetIds[this.state][this.isServer ? "toClient" : "toServer"][packetId]; packetId = packetIds[this.state][this.isServer ? "toClient" : "toServer"][packetId];
var that = this; var that = this;
var finishWriting = function(buffer) { var finishWriting = function(err, buffer) {
if (err)
{
console.log(err);
throw err; // TODO : Handle errors gracefully, if possible
}
var packetName = packetNames[that.state][that.isServer ? "toClient" : "toServer"][packetId]; var packetName = packetNames[that.state][that.isServer ? "toClient" : "toServer"][packetId];
debug("writing packetId " + that.state + "." + packetName + " (0x" + packetId.toString(16) + ")"); debug("writing packetId " + that.state + "." + packetName + " (0x" + packetId.toString(16) + ")");
debug(params); debug(params);
@ -186,10 +201,10 @@ Client.prototype.write = function(packetId, params) {
compressPacketBuffer(buffer, finishWriting); compressPacketBuffer(buffer, finishWriting);
} else if (this.compressionThreshold >= -1) { } else if (this.compressionThreshold >= -1) {
debug("New-styling packet"); debug("New-styling packet");
finishWriting(newStylePacket(buffer)); newStylePacket(buffer, finishWriting);
} else { } else {
debug("Old-styling packet"); debug("Old-styling packet");
finishWriting(oldStylePacket(buffer)); oldStylePacket(buffer, finishWriting);
} }
}; };

View File

@ -1434,32 +1434,30 @@ function createPacketBuffer(packetId, state, params, isServer) {
function compressPacketBuffer(buffer, callback) { function compressPacketBuffer(buffer, callback) {
var dataLength = buffer.size; var dataLength = buffer.size;
zlib.deflate(buffer, function(compressedBuffer) { zlib.deflate(buffer, function(err, buf) {
var packetLength = sizeOfVarInt(dataLength) + compressedBuffer.length; if (err)
var size = sizeOfVarInt(packetLength) + packetLength; callback(err);
var packetBuffer = new Buffer(size); else
var offset = writeVarInt(packetLength, packetBuffer, 0); newStylePacket(buffer, callback);
offset = writeVarInt(dataLength, packetBuffer, offset);
writeBuffer(compressedBuffer, packetBuffer, offset);
callback(packetBuffer);
}); });
} }
function oldStylePacket(buffer) { function oldStylePacket(buffer, callback) {
var packet = new Buffer(sizeOfVarInt(buffer.length) + buffer.length); var packet = new Buffer(sizeOfVarInt(buffer.length) + buffer.length);
var cursor = writeVarInt(buffer.length, packet, 0); var cursor = writeVarInt(buffer.length, packet, 0);
writeBuffer(buffer, packet, cursor); writeBuffer(buffer, packet, cursor);
return packet; callback(null, packet);
} }
function newStylePacket(buffer) { function newStylePacket(buffer, callback) {
var sizeOfO = sizeOfVarInt(0); var sizeOfDataLength = sizeOfVarInt(0);
var size = sizeOfVarInt(buffer.length + sizeOfO) + sizeOfO + buffer.length; var sizeOfLength = sizeOfVarInt(buffer.length + sizeOfDataLength);
var size = sizeOfLength + sizeOfDataLength + buffer.length;
var packet = new Buffer(size); var packet = new Buffer(size);
var cursor = writeVarInt(buffer.length, packet, 0); var cursor = writeVarInt(size - sizeOfLength, packet, 0);
cursor = writeVarInt(0, packet, cursor); cursor = writeVarInt(0, packet, cursor);
writeBuffer(buffer, packet, cursor); writeBuffer(buffer, packet, cursor);
return packet; callback(null, packet);
} }
function parsePacketData(buffer, state, isServer, packetsToParse) { function parsePacketData(buffer, state, isServer, packetsToParse) {
@ -1536,29 +1534,19 @@ function parsePacket(buffer, state, isServer, packetsToParse) {
} }
function parseNewStylePacket(buffer, state, isServer, packetsToParse, cb) { function parseNewStylePacket(buffer, state, isServer, packetsToParse, cb) {
if (state == null) state = states.PLAY; var dataLengthField = readVarInt(buffer, 0);
var cursor = 0; var buf = buffer.slice(dataLengthField.size);
var lengthField = readVarInt(buffer, 0);
if (!!!lengthField) return null;
var length = lengthField.value;
cursor += lengthField.size;
if (length >= buffer.length - cursor) { return null };
var dataLengthField = readVarInt(buffer, cursor);
cursor += dataLengthField.size;
if(dataLengthField.value != 0) { if(dataLengthField.value != 0) {
var bufToDecompress = buffer.slice(cursor); zlib.inflate(buf, function(err, newbuf) {
zlib.inflate(bufToDecompress, function(err, newbuf) {
if (err) { if (err) {
console.log(err); console.log(err);
cb(err); cb(err);
} else { } else {
var result = parsePacketData(newbuf, state, isServer, packetsToParse);
result.size = lengthField.size + length;
cb(null, parsePacketData(newbuf, state, isServer, packetsToParse)); cb(null, parsePacketData(newbuf, state, isServer, packetsToParse));
} }
}); });
} else { } else {
cb(null, parsePacketData(buffer.slice(cursor, cursor + length), state, isServer, packetsToParse)); cb(null, parsePacketData(buf, state, isServer, packetsToParse));
} }
} }
@ -1567,6 +1555,7 @@ module.exports = {
minecraftVersion: '1.8.1', minecraftVersion: '1.8.1',
sessionVersion: 13, sessionVersion: 13,
parsePacket: parsePacket, parsePacket: parsePacket,
parsePacketData: parsePacketData,
parseNewStylePacket: parseNewStylePacket, parseNewStylePacket: parseNewStylePacket,
createPacketBuffer: createPacketBuffer, createPacketBuffer: createPacketBuffer,
compressPacketBuffer: compressPacketBuffer, compressPacketBuffer: compressPacketBuffer,
@ -1577,6 +1566,7 @@ module.exports = {
packetNames: packetNames, packetNames: packetNames,
packetFields: packetFields, packetFields: packetFields,
packetStates: packetStates, packetStates: packetStates,
types: types,
states: states, states: states,
get: get, get: get,
debug: debug, debug: debug,