Skip to content

Commit 4d5de7b

Browse files
committed
Browser sourcemaps + async plugins
1 parent 5ffdeb4 commit 4d5de7b

27 files changed

+295
-297
lines changed

.vscode/settings.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
"jsdelivr",
2323
"lage",
2424
"maxcdn",
25-
"tracekit",
2625
"tsproject",
2726
"webcompat"
2827
],

package-lock.json

Lines changed: 97 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/browser/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@
4545
},
4646
"dependencies": {
4747
"@exceptionless/core": "2.0.0-pre",
48-
"tracekit": "0.4.6"
48+
"stacktrace-js": "2.0.2"
4949
}
5050
}

packages/browser/src/index.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import {
66
SettingsManager
77
} from "@exceptionless/core";
88

9-
import * as TraceKit from 'TraceKit';
10-
119
import { DefaultErrorParser } from './services/DefaultErrorParser.js';
1210
import { DefaultModuleCollector } from './services/DefaultModuleCollector.js';
1311
import { DefaultRequestInfoCollector } from './services/DefaultRequestInfoCollector.js';
@@ -30,11 +28,11 @@ function init() {
3028
return null;
3129
}
3230

33-
function processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {
34-
const builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');
35-
builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;
36-
builder.submit();
37-
}
31+
//function processUnhandledException(stackTrace: TraceKit.StackTrace, options?: any): void {
32+
// const builder = ExceptionlessClient.default.createUnhandledException(new Error(stackTrace.message || (options || {}).status || 'Script error'), 'onerror');
33+
// builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace;
34+
// builder.submit();
35+
//}
3836

3937
if (typeof document === 'undefined') {
4038
return;
@@ -86,8 +84,8 @@ function init() {
8684
defaults.requestInfoCollector = new DefaultRequestInfoCollector();
8785
defaults.submissionAdapter = new DefaultSubmissionAdapter();
8886

89-
TraceKit.report.subscribe(processUnhandledException);
90-
TraceKit.extendToAsynchronousCallbacks();
87+
//TraceKit.report.subscribe(processUnhandledException);
88+
//TraceKit.extendToAsynchronousCallbacks();
9189

9290
// window && window.addEventListener && window.addEventListener('beforeunload', function () {
9391
// ExceptionlessClient.default.config.queue.process(true);

packages/browser/src/services/DefaultErrorParser.ts

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,53 +6,55 @@ import {
66
IStackFrame
77
} from '@exceptionless/core';
88

9-
import * as TraceKit from 'TraceKit';
9+
import {
10+
fromError,
11+
StackFrame
12+
} from 'stacktrace-js';
1013

1114
export class DefaultErrorParser implements IErrorParser {
12-
public parse(context: EventPluginContext, exception: Error): IError {
15+
public async parse(context: EventPluginContext, exception: Error): Promise<IError> {
1316
function getParameters(parameters: string | string[]): IParameter[] {
1417
const params: string[] = (typeof parameters === 'string' ? [parameters] : parameters) || [];
1518

16-
const result: IParameter[] = [];
19+
const items: IParameter[] = [];
1720
for (const param of params) {
18-
result.push({ name: param });
21+
items.push({ name: param });
1922
}
2023

21-
return result;
24+
return items;
2225
}
2326

24-
function getStackFrames(stackFrames: TraceKit.StackFrame[]): IStackFrame[] {
27+
function getStackFrames(stackFrames: StackFrame[]): IStackFrame[] {
2528
const ANONYMOUS: string = '<anonymous>';
2629
const frames: IStackFrame[] = [];
2730

2831
for (const frame of stackFrames) {
32+
const fileName: string = frame.getFileName();
2933
frames.push({
30-
name: (frame.func || ANONYMOUS).replace('?', ANONYMOUS),
31-
parameters: getParameters(frame.args),
32-
file_name: frame.url,
33-
line_number: frame.line || 0,
34-
column: frame.column || 0
34+
name: (frame.getFunctionName() || ANONYMOUS).replace('?', ANONYMOUS),
35+
parameters: getParameters(frame.getArgs()),
36+
file_name: fileName,
37+
line_number: frame.getLineNumber() || 0,
38+
column: frame.getColumnNumber() || 0,
39+
data: {
40+
is_native: frame.getIsNative() || (fileName && fileName[0] !== '/' && fileName[0] !== '.')
41+
}
3542
});
3643
}
3744

3845
return frames;
3946
}
4047

41-
const TRACEKIT_STACK_TRACE_KEY: string = '@@_TraceKit.StackTrace'; // optimization for minifier.
42-
43-
const stackTrace: TraceKit.StackTrace = context.contextData[TRACEKIT_STACK_TRACE_KEY]
44-
? context.contextData[TRACEKIT_STACK_TRACE_KEY]
45-
: TraceKit.computeStackTrace(exception, 25);
46-
47-
if (!stackTrace) {
48-
throw new Error('Unable to parse the exceptions stack trace.');
48+
const result: StackFrame[] = await fromError(exception);
49+
if (!result) {
50+
throw new Error('Unable to parse the exception stack trace.');
4951
}
5052

51-
const message = typeof (exception) === 'string' ? exception as any : undefined;
52-
return {
53-
type: stackTrace.name || 'Error',
54-
message: stackTrace.message || exception.message || message,
55-
stack_trace: getStackFrames(stackTrace.stack || [])
56-
};
53+
// TODO: Test with reference error.
54+
return Promise.resolve({
55+
type: exception.name || 'Error',
56+
message: exception.message,
57+
stack_trace: getStackFrames(result || [])
58+
});
5759
}
5860
}

packages/core/src/EventBuilder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ export class EventBuilder {
202202
return this;
203203
}
204204

205-
public submit(callback?: (context: EventPluginContext) => void): void {
206-
this.client.submitEvent(this.target, this.pluginContextData, callback);
205+
public submit(): Promise<EventPluginContext> {
206+
return this.client.submitEvent(this.target, this.pluginContextData);
207207
}
208208

209209
private isValidIdentifier(value: string): boolean {

0 commit comments

Comments
 (0)