@exceptionless/node
Version:
JavaScript client for Exceptionless
57 lines • 2.42 kB
JavaScript
import { KnownEventDataKeys, IgnoredErrorProperties, isEmpty, stringify } from "@exceptionless/core";
import { parse as fromError } from "stack-trace";
export class NodeErrorPlugin {
priority = 30;
name = "NodeErrorPlugin";
async run(context) {
const exception = context.eventContext.getException();
if (exception) {
if (!context.event.type) {
context.event.type = "error";
}
if (context.event.data && !context.event.data[KnownEventDataKeys.Error]) {
const result = await this.parse(exception);
if (result) {
const exclusions = context.client.config.dataExclusions.concat(IgnoredErrorProperties);
const additionalData = stringify(exception, exclusions);
if (!isEmpty(additionalData)) {
if (!result.data) {
result.data = {};
}
result.data["@ext"] = JSON.parse(additionalData);
}
context.event.data[KnownEventDataKeys.Error] = result;
}
}
}
}
parse(exception) {
function getStackFrames(stackFrames) {
const frames = [];
for (const frame of stackFrames) {
frames.push({
name: frame.methodName || frame.functionName,
parameters: [], // TODO: See if there is a way to get this.
file_name: frame.fileName,
line_number: frame.lineNumber || 0,
column: frame.columnNumber || 0,
declaring_type: frame.typeName,
data: {
is_native: frame.native || (frame.fileName && frame.fileName[0] !== "/" && frame.fileName[0] !== ".")
}
});
}
return frames;
}
const result = exception.stack ? fromError(exception) : [];
if (!result) {
throw new Error("Unable to parse the exception stack trace");
}
return Promise.resolve({
type: exception.name || "Error",
message: exception.message,
stack_trace: getStackFrames(result || []) // TODO: Update type definition.
});
}
}
//# sourceMappingURL=NodeErrorPlugin.js.map