Skip to content

Commit f512fad

Browse files
committed
node: Use syntheticException in the same was as we do in the browser
1 parent 673b65c commit f512fad

File tree

3 files changed

+21
-38
lines changed

3 files changed

+21
-38
lines changed

packages/browser/src/parsers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ export function prepareFramesForEvent(stack: TraceKitStackFrame[]): StackFrame[]
5858
}
5959

6060
let localStack = stack;
61+
const firstFrameFunction = localStack[0].func || '';
6162

6263
// TODO: This could be smarter
63-
if (localStack[0].func.includes('captureMessage') || localStack[0].func.includes('captureException')) {
64+
if (firstFrameFunction.includes('captureMessage') || firstFrameFunction.includes('captureException')) {
6465
localStack = localStack.slice(1);
6566
}
6667

packages/node/src/backend.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { SentryEvent, SentryResponse } from '@sentry/types';
44
import { isError, isPlainObject } from '@sentry/utils/is';
55
import { limitObjectDepthToSize, serializeKeysToEventMessage } from '@sentry/utils/object';
66
import * as md5 from 'md5';
7-
import * as stacktrace from 'stack-trace';
8-
import { parseError, parseStack, prepareFramesForEvent } from './parsers';
7+
import { extractStackFromError, parseError, parseStack, prepareFramesForEvent } from './parsers';
98
import { HTTPSTransport, HTTPTransport } from './transports';
109

1110
/**
@@ -26,8 +25,7 @@ export class NodeBackend implements Backend {
2625
* @inheritDoc
2726
*/
2827
public async eventFromException(exception: any, syntheticException: Error | null): Promise<SentryEvent> {
29-
let stack: stacktrace.StackFrame[] | undefined;
30-
let ex: any = exception;
28+
let ex: Error = exception;
3129

3230
if (!isError(exception)) {
3331
if (isPlainObject(exception)) {
@@ -42,18 +40,16 @@ export class NodeBackend implements Backend {
4240
scope.setFingerprint([md5(keys.join(''))]);
4341
});
4442

45-
// TODO: Use syntheticException here as well
46-
ex = new Error(message);
43+
ex = syntheticException || new Error(message);
44+
ex.message = message;
4745
} else {
4846
// This handles when someone does: `throw "something awesome";`
4947
// We use synthesized Error here so we can extract a (rough) stack trace.
5048
ex = syntheticException || new Error(exception as string);
5149
}
52-
53-
stack = stacktrace.get();
5450
}
5551

56-
const event: SentryEvent = stack ? await parseError(ex as Error, stack) : await parseError(ex as Error);
52+
const event: SentryEvent = await parseError(ex);
5753

5854
return event;
5955
}
@@ -62,13 +58,9 @@ export class NodeBackend implements Backend {
6258
* @inheritDoc
6359
*/
6460
public async eventFromMessage(message: string, syntheticException: Error | null): Promise<SentryEvent> {
65-
// TODO: Use syntheticException to get a stack
66-
const stack = stacktrace.get();
61+
const stack = syntheticException ? await extractStackFromError(syntheticException) : [];
6762
const frames = await parseStack(stack);
6863
const event: SentryEvent = {
69-
extra: {
70-
TODOmakeLinterHappyAKARemoveIt: syntheticException,
71-
},
7264
message,
7365
stacktrace: {
7466
frames: prepareFramesForEvent(frames),

packages/node/src/parsers.ts

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,7 @@ async function readSourceFiles(
101101
*/
102102
export async function extractStackFromError(error: Error): Promise<stacktrace.StackFrame[]> {
103103
const stack = stacktrace.parse(error);
104-
if (!stack || !Array.isArray(stack) || !stack.length || !stack[0].getFileName) {
105-
// the stack is not the useful thing we were expecting :/
104+
if (!stack) {
106105
return [];
107106
}
108107
return stack;
@@ -174,9 +173,9 @@ export async function parseStack(stack: stacktrace.StackFrame[]): Promise<StackF
174173
/**
175174
* TODO
176175
*/
177-
export async function parseError(error: ExtendedError, ownStack?: stacktrace.StackFrame[]): Promise<SentryEvent> {
176+
export async function parseError(error: ExtendedError): Promise<SentryEvent> {
178177
const name = error.name || error.constructor.name;
179-
const stack = ownStack || (await extractStackFromError(error));
178+
const stack = await extractStackFromError(error);
180179
const frames = await parseStack(stack);
181180
const event: SentryEvent = {
182181
exception: {
@@ -220,29 +219,20 @@ export async function parseError(error: ExtendedError, ownStack?: stacktrace.Sta
220219
/**
221220
* TODO
222221
*/
223-
export function prepareFramesForEvent(frames: StackFrame[]): StackFrame[] {
224-
let filteredFrames: StackFrame[] = frames;
225-
226-
// Remove frames that don't have filename, colno and lineno.
227-
// Things like `new Promise` called by generated code
228-
// eg. async/await from regenerator
229-
filteredFrames = filteredFrames.filter(frame => !(!frame.filename && !frame.colno && !frame.lineno));
230-
231-
// TODO: REMOVE ME, TESTING ONLY
232-
for (const frame of filteredFrames) {
233-
if (frame.filename && frame.filename.includes('/dist/')) {
234-
frame.in_app = false;
235-
}
222+
export function prepareFramesForEvent(stack: StackFrame[]): StackFrame[] {
223+
if (!stack) {
224+
return [];
236225
}
237226

238-
const firstInAppFrameIndex = filteredFrames.findIndex(frame => frame.in_app === true);
227+
let localStack = stack;
228+
const firstFrameFunction = localStack[0].function || '';
239229

240-
// Remove every frame that happened after our first in_app call
241-
// which basically means all the internal async stuff
242-
if (firstInAppFrameIndex !== -1) {
243-
filteredFrames = filteredFrames.slice(firstInAppFrameIndex);
230+
// TODO: This could be smarter
231+
if (firstFrameFunction.includes('captureMessage') || firstFrameFunction.includes('captureException')) {
232+
localStack = localStack.slice(1);
244233
}
245234

235+
return localStack;
246236
// Sentry expects the stack trace to be oldest -> newest, v8 provides newest -> oldest
247-
return filteredFrames.reverse();
237+
// return filteredFrames.reverse();
248238
}

0 commit comments

Comments
 (0)