diff --git a/lib/client.js b/lib/client.js index 3166a6c..afa8ed0 100644 --- a/lib/client.js +++ b/lib/client.js @@ -29,6 +29,11 @@ Client.prototype.setSocket = function(socket) { while (true) { parsed = parsePacket(incomingBuffer, self.isServer); if (! parsed) break; + if (parsed.error) { + this.emit('error', parsed.error); + this.end("ProtocolError"); + return; + } packet = parsed.results; incomingBuffer = incomingBuffer.slice(parsed.size); self.emit(packet.id, packet); diff --git a/lib/protocol.js b/lib/protocol.js index 6d3148c..2c5598c 100644 --- a/lib/protocol.js +++ b/lib/protocol.js @@ -727,9 +727,17 @@ function readEntityMetadata(buffer, offset) { type = item >> 5; typeName = entityMetadataTypes[type]; dataType = types[typeName]; - assert.ok(dataType, "unrecognized entity metadata type " + type); + if (!dataType) { + return { + error: new Error("unrecognized entity metadata type " + type) + } + } reader = dataType[0]; - assert.ok(reader, "missing reader for entity metadata type " + type); + if (!reader) { + return { + error: new Error("missing reader for entity metadata type " + type) + } + } results = reader(buffer, cursor); if (! results) return null; metadata.push({ @@ -808,7 +816,11 @@ function readMapChunkBulk (buffer, offset) { }); } - assert.strictEqual(chunkColumnCount, meta.length); + if (chunkColumnCount !== meta.length) { + return { + error: new Error("ChunkColumnCount different from length of meta") + } + } return { value: { @@ -1163,7 +1175,9 @@ LongWriter.prototype.write = function(buffer, offset) { function get(packetId, toServer) { var packetInfo = packets[packetId]; - assert.ok(packetInfo, "unrecognized packet id: " + packetId); + if (!packetInfo) { + return null; + } return Array.isArray(packetInfo) ? packetInfo : toServer ? @@ -1175,6 +1189,7 @@ function createPacketBuffer(packetId, params, isServer) { var size = 1; var fields = [ new UByteWriter(packetId) ]; var packet = get(packetId, !isServer); + assert.notEqual(packet, null); packet.forEach(function(fieldInfo) { var value = params[fieldInfo.name]; var Writer = types[fieldInfo.type][1]; @@ -1198,14 +1213,28 @@ function parsePacket(buffer, isServer) { var size = 1; var results = { id: packetId }; var packetInfo = get(packetId, isServer); - assert.ok(packetInfo, "Unrecognized packetId: " + packetId); + if (packetInfo == null) { + return { + error: new Error("Unrecognized packetId: " + packetId) + } + } var i, fieldInfo, read, readResults; for (i = 0; i < packetInfo.length; ++i) { fieldInfo = packetInfo[i]; read = types[fieldInfo.type][0]; - assert.ok(read, "missing reader for data type: " + fieldInfo.type); + if (!read) { + return { + error: new Error("missing reader for data type: " + fieldInfo.type) + } + } readResults = read(buffer, size); if (readResults) { + // if readResults.error is undef, error stays undef'd + if (readResults.error) { + return { + error: readResults.error + } + } results[fieldInfo.name] = readResults.value; size += readResults.size; } else {