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

View file

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

View file

@ -40,7 +40,7 @@ var defaultServerProps = {
'motd': 'A Minecraft Server', 'motd': 'A Minecraft Server',
}; };
describe("minecraft protocol", function() { describe("client", function() {
this.timeout(20000); this.timeout(20000);
var mcServer; 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");
});