Allow passing an Error object to wrapError

This commit is contained in:
Daniel Huigens 2025-05-23 18:06:25 +02:00
parent 6df8687c9e
commit f1c6f9c4e4
No known key found for this signature in database
GPG Key ID: CB064A128FA90686
3 changed files with 32 additions and 13 deletions

View File

@ -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;

View File

@ -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 ||

View File

@ -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 });
},
/**