diff --git a/src/datatypes/structures.js b/src/datatypes/structures.js index 4cb7c04..8e3b13d 100644 --- a/src/datatypes/structures.js +++ b/src/datatypes/structures.js @@ -97,17 +97,14 @@ function sizeOfArray(value, typeArgs, rootNode) { } -function readContainer(buffer, offset, typeArgs, rootNode) { +function readContainer(buffer, offset, typeArgs, context) { var results = { - value: {}, + value: { "..": context }, size: 0 }; - var backupThis = rootNode.this; - rootNode.this = results.value; typeArgs.forEach((typeArg) => { - var readResults; tryCatch(() => { - readResults = this.read(buffer, offset, typeArg.type, rootNode); + var readResults = this.read(buffer, offset, typeArg.type, results.value); results.size += readResults.size; offset += readResults.size; if (typeArg.anon) { @@ -124,19 +121,18 @@ function readContainer(buffer, offset, typeArgs, rootNode) { throw e; }); }); - rootNode.this = backupThis; + delete results.value[".."]; return results; } -function writeContainer(value, buffer, offset, typeArgs, rootNode) { - var backupThis = rootNode.this; - rootNode.this = value; +function writeContainer(value, buffer, offset, typeArgs, context) { + value[".."] = context; typeArgs.forEach((typeArg) => { tryCatch(() => { if (typeArg.anon) - offset = this.write(value, buffer, offset, typeArg.type, rootNode); + offset = this.write(value, buffer, offset, typeArg.type, value); else - offset = this.write(value[typeArg.name], buffer, offset, typeArg.type, rootNode); + offset = this.write(value[typeArg.name], buffer, offset, typeArg.type, value); }, (e) => { if (typeArgs && typeArg && typeArg.name) addErrorField(e, typeArg.name); @@ -145,20 +141,19 @@ function writeContainer(value, buffer, offset, typeArgs, rootNode) { throw e; }); }); - rootNode.this = backupThis; + delete value[".."]; return offset; } -function sizeOfContainer(value, typeArgs, rootNode) { +function sizeOfContainer(value, typeArgs, context) { + value[".."] = context; var size = 0; - var backupThis = rootNode.this; - rootNode.this = value; typeArgs.forEach((typeArg) => { tryCatch(() => { if (typeArg.anon) - size += this.sizeOf(value, typeArg.type, rootNode); + size += this.sizeOf(value, typeArg.type, value); else - size += this.sizeOf(value[typeArg.name], typeArg.type, rootNode); + size += this.sizeOf(value[typeArg.name], typeArg.type, value); }, (e) => { if (typeArgs && typeArg && typeArg.name) addErrorField(e, typeArg.name); @@ -167,7 +162,7 @@ function sizeOfContainer(value, typeArgs, rootNode) { throw e; }); }); - rootNode.this = backupThis; + delete value[".."]; return size; } diff --git a/src/transforms/serializer.js b/src/transforms/serializer.js index 2e8334e..0f2dd6f 100644 --- a/src/transforms/serializer.js +++ b/src/transforms/serializer.js @@ -63,7 +63,7 @@ var packetStates = packetIndexes.packetStates; function createPacketBuffer(packetName, state, params, isServer) { var direction = !isServer ? 'toServer' : 'toClient'; var packetId = packetIds[state][direction][packetName]; - assert.notEqual(packetId, undefined); + assert.notEqual(packetId, undefined, `${state}.${isServer}.${packetName} : ${packetId}`); var packet = get(packetName, state, !isServer); assert.notEqual(packet, null); @@ -140,7 +140,8 @@ function parsePacketData(buffer, state, isServer, packetsToParse = {"packet": tr results.data = res.value; cursor += res.size; if(buffer.length > cursor) - throw new Error(`Read error for ${packetName} : Packet data not entirely read`); + throw new Error(`Read error for ${packetName} : Packet data not entirely read : + ${JSON.stringify(results)}`); debug(results); return results; } diff --git a/src/utils.js b/src/utils.js index d380577..03d2e42 100644 --- a/src/utils.js +++ b/src/utils.js @@ -5,13 +5,18 @@ module.exports = { tryCatch: tryCatch, }; -function getField(countField, rootNode) { - var countFieldArr = countField.split("."); - var count = rootNode; - for(var index = 0; index < countFieldArr.length; index++) { - count = count[countFieldArr[index]]; +function getField(countField, context) { + var countFieldArr = countField.split("/"); + var i = 0; + if (countFieldArr[i] === "") { + while (context.hasOwnProperty("..")) + context = context[".."]; + i++; } - return count; + for(; i < countFieldArr.length; i++) { + context = context[countFieldArr[i]]; + } + return context; } function getFieldInfo(fieldInfo) {