avoid dependency on iconv. makes it easier to use on windows. see

This commit is contained in:
Andrew Kelley 2013-01-04 19:04:06 -05:00
parent bfb392ea19
commit 8096a08afd
3 changed files with 37 additions and 24 deletions

View file

@ -1,15 +1,17 @@
var Iconv = require('iconv').Iconv
, assert = require('assert')
, toUcs2 = new Iconv('UTF-8', 'utf16be')
, fromUcs2 = new Iconv('utf16be', 'UTF-8')
var assert = require('assert');
var STRING_MAX_LENGTH = 240;
exports.version = 51;
exports.minecraftVersion = '1.4.6';
exports.sessionVersion = 13;
exports.parsePacket = parsePacket;
exports.createPacketBuffer = createPacketBuffer;
module.exports = {
version: 51,
minecraftVersion: '1.4.6',
sessionVersion: 13,
parsePacket: parsePacket,
createPacketBuffer: createPacketBuffer,
constants: {
STRING_MAX_LENGTH: STRING_MAX_LENGTH,
},
};
var packets = {
0x00: [
@ -681,18 +683,20 @@ function readAscii (buffer, offset) {
}
function readString (buffer, offset) {
var results = readShort(buffer, offset);
if (! results) return null;
var strBegin = offset + results.size;
var strLen = results.value;
var strEnd = strBegin + strLen * 2;
var cursor = offset + 2;
if (cursor > buffer.length) return null;
var stringLength = buffer.readInt16BE(offset);
var strEnd = cursor + stringLength * 2;
if (strEnd > buffer.length) return null;
var str = fromUcs2.convert(buffer.slice(strBegin, strEnd)).toString('utf8');
var value = '';
for (var i = 0; i < stringLength; ++i) {
value += String.fromCharCode(buffer.readUInt16BE(cursor));
cursor += 2;
}
return {
value: str,
size: strEnd - offset,
value: value,
size: cursor - offset,
};
}
@ -878,14 +882,20 @@ SlotWriter.prototype.write = function(buffer, offset) {
};
function StringWriter(value) {
assert.ok(value.length < STRING_MAX_LENGTH, "string greater than max length");
this.value = value;
this.encoded = toUcs2.convert(value);
this.size = 2 + this.encoded.length;
this.size = 2 + 2 * value.length;
}
StringWriter.prototype.write = function(buffer, offset) {
buffer.writeInt16BE(this.value.length, offset);
this.encoded.copy(buffer, offset + 2);
var cursor = offset;
buffer.writeInt16BE(this.value.length, cursor);
cursor += 2;
for (var i = 0; i < this.value.length; ++i) {
buffer.writeUInt16BE(this.value.charCodeAt(i), cursor);
cursor += 2;
}
};
function ByteArray16Writer(value) {

View file

@ -33,7 +33,6 @@
"dependencies": {
"ursa": "~0.8.0",
"superagent": "~0.10.0",
"iconv": "~1.2.4",
"batch": "~0.2.1"
}
}

View file

@ -40,7 +40,7 @@ var defaultServerProps = {
'motd': 'A Minecraft Server',
};
describe("minecraft protocol", function() {
describe("client", function() {
this.timeout(20000);
var mcServer;
@ -213,3 +213,7 @@ describe("minecraft protocol", function() {
});
});
});
describe("server", function() {
it("kicks clients that do not emit keep alive");
it("responds to ping requests");
});