From 1c3baad5da83b1f3aab5a1622a428fd61a9765b7 Mon Sep 17 00:00:00 2001 From: extremeheat Date: Wed, 4 Dec 2024 23:17:06 -0500 Subject: [PATCH 1/5] Continued updates --- src/datatypes/compiler-minecraft.js | 114 ---------------------------- src/datatypes/minecraft.js | 36 +-------- 2 files changed, 1 insertion(+), 149 deletions(-) diff --git a/src/datatypes/compiler-minecraft.js b/src/datatypes/compiler-minecraft.js index 864b269f..33598b2a 100644 --- a/src/datatypes/compiler-minecraft.js +++ b/src/datatypes/compiler-minecraft.js @@ -42,48 +42,6 @@ module.exports = { code += '}' return compiler.wrapCode(code) }], - arrayWithLengthOffset: ['parametrizable', (compiler, array) => { // TODO: remove - let code = '' - if (array.countType) { - code += 'const { value: count, size: countSize } = ' + compiler.callType(array.countType) + '\n' - } else if (array.count) { - code += 'const count = ' + array.count + '\n' - code += 'const countSize = 0\n' - } else { - throw new Error('Array must contain either count or countType') - } - code += 'if (count > 0xffffff) throw new Error("array size is abnormally large, not reading: " + count)\n' - code += 'const data = []\n' - code += 'let size = countSize\n' - code += `for (let i = 0; i < count + ${array.lengthOffset}; i++) {\n` - code += ' const elem = ' + compiler.callType(array.type, 'offset + size') + '\n' - code += ' data.push(elem.value)\n' - code += ' size += elem.size\n' - code += '}\n' - code += 'return { value: data, size }' - return compiler.wrapCode(code) - }], - bitflags: ['parametrizable', (compiler, { type, flags, shift, big }) => { - let fstr = JSON.stringify(flags) - if (Array.isArray(flags)) { - fstr = '{' - for (const [k, v] of Object.entries(flags)) fstr += `"${v}": ${big ? (1n << BigInt(k)) : (1 << k)}` + (big ? 'n,' : ',') - fstr += '}' - } else if (shift) { - fstr = '{' - for (const key in flags) fstr += `"${key}": ${1 << flags[key]},` - fstr += '}' - } - return compiler.wrapCode(` - const { value: _value, size } = ${compiler.callType(type, 'offset')} - const value = { _value } - const flags = ${fstr} - for (const key in flags) { - value[key] = (_value & flags[key]) == flags[key] - } - return { value, size } - `.trim()) - }], registryEntryHolder: ['parametrizable', (compiler, opts) => { return compiler.wrapCode(` const { value: n, size: nSize } = ${compiler.callType('varint')} @@ -145,39 +103,6 @@ if (n !== 0) { code += 'return offset' return compiler.wrapCode(code) }], - arrayWithLengthOffset: ['parametrizable', (compiler, array) => { - let code = '' - if (array.countType) { - code += 'offset = ' + compiler.callType('value.length', array.countType) + '\n' - } else if (array.count === null) { - throw new Error('Array must contain either count or countType') - } - code += 'for (let i = 0; i < value.length; i++) {\n' - code += ' offset = ' + compiler.callType('value[i]', array.type) + '\n' - code += '}\n' - code += 'return offset' - return compiler.wrapCode(code) - }], - bitflags: ['parametrizable', (compiler, { type, flags, shift, big }) => { - let fstr = JSON.stringify(flags) - if (Array.isArray(flags)) { - fstr = '{' - for (const [k, v] of Object.entries(flags)) fstr += `"${v}": ${big ? (1n << BigInt(k)) : (1 << k)}` + (big ? 'n,' : ',') - fstr += '}' - } else if (shift) { - fstr = '{' - for (const key in flags) fstr += `"${key}": ${1 << flags[key]},` - fstr += '}' - } - return compiler.wrapCode(` - const flags = ${fstr} - let val = value._value ${big ? '|| 0n' : ''} - for (const key in flags) { - if (value[key]) val |= flags[key] - } - return (ctx.${type})(val, buffer, offset) - `.trim()) - }], registryEntryHolder: ['parametrizable', (compiler, opts) => { const baseName = `value.${opts.baseName}` const otherwiseName = `value.${opts.otherwise.name}` @@ -234,45 +159,6 @@ return offset code += 'return size' return compiler.wrapCode(code) }], - arrayWithLengthOffset: ['parametrizable', (compiler, array) => { - let code = '' - if (array.countType) { - code += 'let size = ' + compiler.callType('value.length', array.countType) + '\n' - } else if (array.count) { - code += 'let size = 0\n' - } else { - throw new Error('Array must contain either count or countType') - } - if (!isNaN(compiler.callType('value[i]', array.type))) { - code += 'size += value.length * ' + compiler.callType('value[i]', array.type) + '\n' - } else { - code += 'for (let i = 0; i < value.length; i++) {\n' - code += ' size += ' + compiler.callType('value[i]', array.type) + '\n' - code += '}\n' - } - code += 'return size' - return compiler.wrapCode(code) - }], - bitflags: ['parametrizable', (compiler, { type, flags, shift, big }) => { - let fstr = JSON.stringify(flags) - if (Array.isArray(flags)) { - fstr = '{' - for (const [k, v] of Object.entries(flags)) fstr += `"${v}": ${big ? (1n << BigInt(k)) : (1 << k)}` + (big ? 'n,' : ',') - fstr += '}' - } else if (shift) { - fstr = '{' - for (const key in flags) fstr += `"${key}": ${1 << flags[key]},` - fstr += '}' - } - return compiler.wrapCode(` - const flags = ${fstr} - let val = value._value ${big ? '|| 0n' : ''} - for (const key in flags) { - if (value[key]) val |= flags[key] - } - return (ctx.${type})(val) - `.trim()) - }], registryEntryHolder: ['parametrizable', (compiler, opts) => { const baseName = `value.${opts.baseName}` const otherwiseName = `value.${opts.otherwise.name}` diff --git a/src/datatypes/minecraft.js b/src/datatypes/minecraft.js index 39f5d867..09e90355 100644 --- a/src/datatypes/minecraft.js +++ b/src/datatypes/minecraft.js @@ -11,8 +11,7 @@ module.exports = { compressedNbt: [readCompressedNbt, writeCompressedNbt, sizeOfCompressedNbt], restBuffer: [readRestBuffer, writeRestBuffer, sizeOfRestBuffer], entityMetadataLoop: [readEntityMetadata, writeEntityMetadata, sizeOfEntityMetadata], - topBitSetTerminatedArray: [readTopBitSetTerminatedArray, writeTopBitSetTerminatedArray, sizeOfTopBitSetTerminatedArray], - arrayWithLengthOffset: [readArrayWithLengthOffset, writeArrayWithLengthOffset, sizeOfArrayWithLengthOffset] + topBitSetTerminatedArray: [readTopBitSetTerminatedArray, writeTopBitSetTerminatedArray, sizeOfTopBitSetTerminatedArray] } const PartialReadError = require('protodef').utils.PartialReadError @@ -181,36 +180,3 @@ function sizeOfTopBitSetTerminatedArray (value, { type }) { } return size } - -// -const { getCount, sendCount, calcCount, tryDoc } = require('protodef/src/utils') - -function readArrayWithLengthOffset (buffer, offset, typeArgs, rootNode) { - const results = { - value: [], - size: 0 - } - let value - let { count, size } = getCount.call(this, buffer, offset, typeArgs, rootNode) - offset += size - results.size += size - for (let i = 0; i < count + typeArgs.lengthOffset; i++) { - ({ size, value } = tryDoc(() => this.read(buffer, offset, typeArgs.type, rootNode), i)) - results.size += size - offset += size - results.value.push(value) - } - return results -} - -// no changes -function writeArrayWithLengthOffset (value, buffer, offset, typeArgs, rootNode) { - offset = sendCount.call(this, value.length, buffer, offset, typeArgs, rootNode) - return value.reduce((offset, v, index) => tryDoc(() => this.write(v, buffer, offset, typeArgs.type, rootNode), index), offset) -} - -function sizeOfArrayWithLengthOffset (value, typeArgs, rootNode) { - let size = calcCount.call(this, value.length, typeArgs, rootNode) - size = value.reduce((size, v, index) => tryDoc(() => size + this.sizeOf(v, typeArgs.type, rootNode), index), size) - return size + typeArgs -} From fb43416d50bd386ff645afb354e13398971dcda4 Mon Sep 17 00:00:00 2001 From: extremeheat Date: Sat, 21 Dec 2024 20:09:54 -0500 Subject: [PATCH 2/5] bail tests early on failure --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40a222ac..36c43b9d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "scripts": { "test": "npm run mochaTest", - "mochaTest": "mocha --recursive --reporter spec --exit", + "mochaTest": "mocha --recursive --reporter spec --exit --bail", "lint": "standard", "fix": "standard --fix", "pretest": "npm run lint", From 4905ca9451f5656d3550219936a4fa5afb676eef Mon Sep 17 00:00:00 2001 From: extremeheat Date: Sun, 22 Dec 2024 00:15:53 -0500 Subject: [PATCH 3/5] improve deserialization errors to include packet headers --- src/client.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/client.js b/src/client.js index 5b63c295..c62c0128 100644 --- a/src/client.js +++ b/src/client.js @@ -66,14 +66,15 @@ class Client extends EventEmitter { }) this.deserializer.on('error', (e) => { - let parts + let parts = [] if (e.field) { parts = e.field.split('.') parts.shift() - } else { parts = [] } + } const deserializerDirection = this.isServer ? 'toServer' : 'toClient' e.field = [this.protocolState, deserializerDirection].concat(parts).join('.') - e.message = `Deserialization error for ${e.field} : ${e.message}` + // "Parse error for play.toClient (22 bytes, 1a1316...) : varint too big" + e.message = `Parse error for ${e.field} (${e.buffer.length} bytes, ${e.buffer.toString('hex').slice(0, 6)}...) : ${e.message}` if (!this.compressor) { this.splitter.pipe(this.deserializer) } else { this.decompressor.pipe(this.deserializer) } this.emit('error', e) }) From 91701155a44ce9a12cb788c85ebd4d0963d8e9fb Mon Sep 17 00:00:00 2001 From: extremeheat Date: Tue, 24 Dec 2024 13:40:43 -0500 Subject: [PATCH 4/5] Update play.js --- src/client/play.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client/play.js b/src/client/play.js index 6e06dc15..559607f3 100644 --- a/src/client/play.js +++ b/src/client/play.js @@ -66,7 +66,6 @@ module.exports = function (client, options) { } function onReady () { - client.emit('playerJoin') if (mcData.supportFeature('signedChat')) { if (options.disableChatSigning && client.serverFeatures.enforcesSecureChat) { throw new Error('"disableChatSigning" was enabled in client options, but server is enforcing secure chat') @@ -86,8 +85,8 @@ module.exports = function (client, options) { function unsignedChat (message) { client.write('chat', { message }) } - client.chat = client._signedChat || unsignedChat + client.emit('playerJoin') } } } From 7151b22c04aad73b2b3943c6f3c01594a7bfe04e Mon Sep 17 00:00:00 2001 From: extremeheat Date: Mon, 6 Jan 2025 18:19:47 -0500 Subject: [PATCH 5/5] Update server.js --- src/server.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server.js b/src/server.js index 46df1042..01dc52d8 100644 --- a/src/server.js +++ b/src/server.js @@ -34,7 +34,8 @@ class Server extends EventEmitter { : JSON.stringify({ text: endReason }) client.write('kick_disconnect', { reason: fullReason }) } else if (client.state === states.LOGIN) { - client.write('disconnect', { reason: fullReason || endReason }) + fullReason ||= JSON.stringify({ text: endReason }) + client.write('disconnect', { reason: fullReason }) } client._end(endReason) }