diff --git a/src/packet/packet.js b/src/packet/packet.js index a1e646c8..4dfcfa9f 100644 --- a/src/packet/packet.js +++ b/src/packet/packet.js @@ -286,6 +286,18 @@ export class UnknownPacketError extends UnsupportedError { } } +export class MalformedPacketError extends UnsupportedError { + constructor(...params) { + super(...params); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, UnsupportedError); + } + + this.name = 'MalformedPacketError'; + } +} + export class UnparseablePacket { constructor(tag, rawContent) { this.tag = tag; diff --git a/src/packet/packetlist.js b/src/packet/packetlist.js index e48677b9..a7ab8eb0 100644 --- a/src/packet/packetlist.js +++ b/src/packet/packetlist.js @@ -5,7 +5,8 @@ import { writePartialLength, writeSimpleLength, UnparseablePacket, UnsupportedError, - UnknownPacketError + UnknownPacketError, + MalformedPacketError } from './packet'; import util from '../util'; import enums from '../enums'; @@ -102,7 +103,7 @@ class PacketList extends Array { await packet.read(parsed.packet, config); } catch (e) { if (!(e instanceof UnsupportedError)) { - e.name = 'MalformedPacketError'; + throw util.wrapError(new MalformedPacketError(`Parsing ${packet.constructor.name} failed`), e); } throw e; } @@ -123,7 +124,7 @@ class PacketList extends Array { // In case of packet parsing errors, e.name was set to 'MalformedPacketError' above. // By default, we throw for these errors. const throwMalformedPacketError = - e.name === 'MalformedPacketError' && + e instanceof MalformedPacketError && !config.ignoreMalformedPackets; // The packets that support streaming are the ones that contain message data. // Those are also the ones we want to be more strict about and throw on all errors @@ -133,7 +134,7 @@ class PacketList extends Array { const throwOtherError = !( e instanceof UnknownPacketError || e instanceof UnsupportedError || - e.name === 'MalformedPacketError' + e instanceof MalformedPacketError ); if ( throwUnknownPacketError || diff --git a/src/util.js b/src/util.js index c57ea431..3c6bf707 100644 --- a/src/util.js +++ b/src/util.js @@ -593,17 +593,23 @@ const util = { }).join('\n'); }, - wrapError: function(message, error) { - if (!error) { - return new Error(message); + wrapError: function(error, cause) { + if (!cause) { + if (error instanceof Error) { + return error; + } + return new Error(error); } - // update error message - try { - error.message = message + ': ' + error.message; - } catch (e) {} - - return error; + if (error instanceof Error) { + // update error message + try { + error.message += ': ' + cause.message; + error.cause = cause; + } catch (e) {} + return error; + } + return new Error(error + ': ' + cause.message, { cause }); }, /**