Skip to content

Commit d6fe7c6

Browse files
committed
WIP - Removed error parser service, Added default plugin for Simple Errors
1 parent 9ad0d13 commit d6fe7c6

16 files changed

+172
-122
lines changed

packages/browser/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"scripts": {
4848
"build": "tsc -p tsconfig.json && esbuild src/index.ts --bundle --sourcemap --target=es2017 --format=esm --outfile=dist/index.bundle.js && esbuild src/index.ts --bundle --minify --sourcemap --target=es2019 --format=esm --outfile=dist/index.bundle.min.js",
4949
"watch": "tsc -p ../core/tsconfig.json -w --preserveWatchOutput & tsc -p tsconfig.json -w --preserveWatchOutput & esbuild src/index.ts --bundle --sourcemap --target=es2017 --format=esm --watch --outfile=dist/index.bundle.js",
50-
"test": ""
50+
"test": "jest"
5151
},
5252
"sideEffects": false,
5353
"publishConfig": {

packages/browser/src/BrowserExceptionlessClient.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { Configuration, ExceptionlessClient } from "@exceptionless/core";
1+
import { Configuration, ExceptionlessClient, SimpleErrorPlugin } from "@exceptionless/core";
22

3+
import { BrowserErrorPlugin } from "./plugins/BrowserErrorPlugin.js";
34
import { BrowserGlobalHandlerPlugin } from "./plugins/BrowserGlobalHandlerPlugin.js";
45
import { BrowserLifeCyclePlugin } from "./plugins/BrowserLifeCyclePlugin.js";
56
import { BrowserModuleInfoPlugin } from "./plugins/BrowserModuleInfoPlugin.js";
67
import { BrowserRequestInfoPlugin } from "./plugins/BrowserRequestInfoPlugin.js";
78
import { BrowserWrapFunctions } from "./plugins/BrowserWrapFunctions.js";
8-
import { BrowserErrorParser } from "./services/BrowserErrorParser.js";
99

1010
export class BrowserExceptionlessClient extends ExceptionlessClient {
1111
public async startup(
@@ -14,13 +14,15 @@ export class BrowserExceptionlessClient extends ExceptionlessClient {
1414
const config = this.config;
1515
if (configurationOrApiKey) {
1616
config.useLocalStorage();
17-
config.services.errorParser = new BrowserErrorParser();
1817

1918
config.addPlugin(new BrowserGlobalHandlerPlugin());
2019
config.addPlugin(new BrowserLifeCyclePlugin());
2120
config.addPlugin(new BrowserModuleInfoPlugin());
2221
config.addPlugin(new BrowserRequestInfoPlugin());
2322
config.addPlugin(new BrowserWrapFunctions());
23+
24+
config.removePlugin(new SimpleErrorPlugin());
25+
config.addPlugin(new BrowserErrorPlugin());
2426
}
2527

2628
await super.startup(configurationOrApiKey);

packages/browser/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
export { BrowserErrorPlugin } from "./plugins/BrowserErrorPlugin.js"
12
export { BrowserGlobalHandlerPlugin } from "./plugins/BrowserGlobalHandlerPlugin.js";
23
export { BrowserLifeCyclePlugin } from "./plugins/BrowserLifeCyclePlugin.js";
34
export { BrowserModuleInfoPlugin } from "./plugins/BrowserModuleInfoPlugin.js";
45
export { BrowserRequestInfoPlugin } from "./plugins/BrowserRequestInfoPlugin.js";
56
export { BrowserWrapFunctions } from "./plugins/BrowserWrapFunctions.js";
6-
export { BrowserErrorParser } from "./services/BrowserErrorParser.js";
77
export { BrowserExceptionlessClient } from "./BrowserExceptionlessClient.js";
88

99
import { BrowserExceptionlessClient } from "./BrowserExceptionlessClient.js";

packages/browser/src/services/BrowserErrorParser.ts renamed to packages/browser/src/plugins/BrowserErrorPlugin.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,48 @@
11
import {
2-
EventPluginContext,
32
ErrorInfo,
4-
IErrorParser,
3+
EventPluginContext,
4+
IEventPlugin,
5+
IgnoredErrorProperties,
6+
KnownEventDataKeys,
57
ParameterInfo,
6-
StackFrameInfo
8+
StackFrameInfo,
9+
stringify,
10+
isEmpty
711
} from "@exceptionless/core";
812

913
import {
1014
fromError,
1115
StackFrame
1216
} from "stacktrace-js";
1317

14-
export class BrowserErrorParser implements IErrorParser {
15-
public async parse(context: EventPluginContext, exception: Error): Promise<ErrorInfo> {
18+
export class BrowserErrorPlugin implements IEventPlugin {
19+
public priority = 30;
20+
public name = "BrowserErrorPlugin";
21+
22+
public async run(context: EventPluginContext): Promise<void> {
23+
const exception = context.eventContext.getException();
24+
if (exception) {
25+
context.event.type = "error";
26+
27+
if (!context.event.data[KnownEventDataKeys.Error]) {
28+
const result = await this.parse(exception);
29+
if (result) {
30+
const exclusions = context.client.config.dataExclusions.concat(IgnoredErrorProperties);
31+
const additionalData = JSON.parse(stringify(exception, exclusions));
32+
if (!isEmpty(additionalData)) {
33+
if (!result.data) {
34+
result.data = {};
35+
}
36+
result.data["@ext"] = additionalData;
37+
}
38+
39+
context.event.data[KnownEventDataKeys.Error] = result;
40+
}
41+
}
42+
}
43+
}
44+
45+
private async parse(exception: Error): Promise<ErrorInfo> {
1646
function getParameters(parameters: string | string[]): ParameterInfo[] {
1747
const params: string[] = (typeof parameters === "string" ? [parameters] : parameters) || [];
1848

packages/core/test/plugins/default/ErrorPlugin.test.ts renamed to packages/browser/test/plugins/BrowserErrorPlugin.test.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { ErrorPlugin } from "../../../src/plugins/default/ErrorPlugin.js";
2-
import { EventPluginContext } from "../../../src/plugins/EventPluginContext.js";
3-
import { Event, KnownEventDataKeys } from "../../../src/models/Event.js";
4-
import { CapturedExceptions } from "./exceptions.js";
5-
import { createFixture } from "./EventPluginTestFixture.js";
6-
import { ErrorInfo } from "../../../src/models/data/ErrorInfo.js";
1+
import { BrowserErrorPlugin } from "../../src/plugins/BrowserErrorPlugin.js";
2+
import { EventPluginContext } from "./../../../core/src/plugins/EventPluginContext.js";
3+
import { Event, KnownEventDataKeys } from "./../../../core/src/models/Event.js";
4+
import { CapturedExceptions } from "./../../../core/test/plugins/default/exceptions.js";
5+
import { ErrorInfo } from "./../../../core/src/models/data/ErrorInfo.js";
76

87
function BaseTestError() {
98
this.name = "NotImplementedError";
@@ -18,8 +17,8 @@ function DerivedTestError() {
1817

1918
DerivedTestError.prototype = new BaseTestError();
2019

21-
describe("ErrorPlugin", () => {
22-
const target = new ErrorPlugin();
20+
describe("BrowserErrorPlugin", () => {
21+
const target = new BrowserErrorPlugin();
2322
let context: EventPluginContext;
2423

2524
beforeEach(() => {
@@ -110,3 +109,21 @@ function throwAndCatch(error: any): Error {
110109
return exception;
111110
}
112111
}
112+
113+
function createFixture(): EventPluginContext {
114+
const errorParser: IErrorParser = {
115+
parse: (c: EventPluginContext, exception: Error) => Promise.resolve({
116+
type: exception.name,
117+
message: exception.message,
118+
stack_trace: null
119+
})
120+
};
121+
const client: ExceptionlessClient = new ExceptionlessClient();
122+
client.config.services.errorParser = errorParser;
123+
124+
const event: Event = {
125+
data: {}
126+
};
127+
128+
return new EventPluginContext(client, event);
129+
}

packages/core/src/configuration/Configuration.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { EventPluginContext } from "../plugins/EventPluginContext.js";
1010
import { IEventPlugin } from "../plugins/IEventPlugin.js";
1111
import { DefaultEventQueue } from "../queue/DefaultEventQueue.js";
1212
import { IEventQueue } from "../queue/IEventQueue.js";
13-
import { IErrorParser } from "../services/IErrorParser.js";
1413
import { ISubmissionClient } from "../submission/ISubmissionClient.js";
1514
import { DefaultSubmissionClient } from "../submission/DefaultSubmissionClient.js";
1615
import { guid } from "../Utils.js";
@@ -543,7 +542,6 @@ export class Configuration {
543542
}
544543

545544
interface IConfigurationServices {
546-
errorParser?: IErrorParser;
547545
lastReferenceIdManager: ILastReferenceIdManager;
548546
log: ILog;
549547
submissionClient: ISubmissionClient;

packages/core/src/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ export type {
2727

2828
export { ConfigurationDefaultsPlugin } from "./plugins/default/ConfigurationDefaultsPlugin.js";
2929
export { DuplicateCheckerPlugin } from "./plugins/default/DuplicateCheckerPlugin.js";
30-
export { ErrorPlugin } from "./plugins/default/ErrorPlugin.js";
3130
export { EventExclusionPlugin } from "./plugins/default/EventExclusionPlugin.js";
3231
export { HeartbeatPlugin } from "./plugins/default/HeartbeatPlugin.js";
3332
export { ReferenceIdPlugin } from "./plugins/default/ReferenceIdPlugin.js";
33+
export { IgnoredErrorProperties, SimpleErrorPlugin } from "./plugins/default/SimpleErrorPlugin.js"
3434
export { SubmissionMethodPlugin } from "./plugins/default/SubmissionMethodPlugin.js";
3535
export { EventContext as ContextData } from "./models/EventContext.js";
3636
export { PluginContext } from "./plugins/PluginContext.js";
@@ -41,8 +41,6 @@ export type { IEventPlugin } from "./plugins/IEventPlugin.js";
4141
export { DefaultEventQueue } from "./queue/DefaultEventQueue.js";
4242
export type { IEventQueue } from "./queue/IEventQueue.js";
4343

44-
export type { IErrorParser } from "./services/IErrorParser.js";
45-
4644
export { InMemoryStorage } from "./storage/InMemoryStorage.js";
4745
export { LocalStorage } from "./storage/LocalStorage.js";
4846
export type { IStorage } from "./storage/IStorage.js";

packages/core/src/plugins/EventPluginManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Configuration } from "../configuration/Configuration.js";
22
import { ConfigurationDefaultsPlugin } from "./default/ConfigurationDefaultsPlugin.js";
33
import { DuplicateCheckerPlugin } from "./default/DuplicateCheckerPlugin.js";
4-
import { ErrorPlugin } from "./default/ErrorPlugin.js";
4+
import { SimpleErrorPlugin } from "./default/SimpleErrorPlugin.js";
55
import { EventExclusionPlugin } from "./default/EventExclusionPlugin.js";
66
import { SubmissionMethodPlugin } from "./default/SubmissionMethodPlugin.js";
77
import { EventPluginContext } from "./EventPluginContext.js";
@@ -57,7 +57,7 @@ export class EventPluginManager {
5757

5858
public static addDefaultPlugins(config: Configuration): void {
5959
config.addPlugin(new ConfigurationDefaultsPlugin());
60-
config.addPlugin(new ErrorPlugin());
60+
config.addPlugin(new SimpleErrorPlugin());
6161
config.addPlugin(new DuplicateCheckerPlugin());
6262
config.addPlugin(new EventExclusionPlugin());
6363
config.addPlugin(new SubmissionMethodPlugin());

packages/core/src/plugins/default/ErrorPlugin.ts

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
2+
import { EventPluginContext } from "../EventPluginContext.js";
3+
import { IEventPlugin } from "../IEventPlugin.js";
4+
import { isEmpty, stringify } from "../../Utils.js";
5+
import { SimpleError } from "../../models/data/ErrorInfo.js";
6+
import { KnownEventDataKeys } from "../../models/Event.js";
7+
8+
export const IgnoredErrorProperties: string[] = [
9+
"arguments",
10+
"column",
11+
"columnNumber",
12+
"description",
13+
"fileName",
14+
"message",
15+
"name",
16+
"number",
17+
"line",
18+
"lineNumber",
19+
"opera#sourceloc",
20+
"sourceId",
21+
"sourceURL",
22+
"stack",
23+
"stackArray",
24+
"stacktrace"
25+
];
26+
27+
export class SimpleErrorPlugin implements IEventPlugin {
28+
public priority = 30;
29+
public name = "SimpleErrorPlugin";
30+
31+
public async run(context: EventPluginContext): Promise<void> {
32+
const exception = context.eventContext.getException();
33+
if (exception) {
34+
context.event.type = "error";
35+
36+
if (!context.event.data[KnownEventDataKeys.SimpleError]) {
37+
const error = <SimpleError>{
38+
type: exception.name || "Error",
39+
message: exception.message,
40+
stack_trace: exception.stack,
41+
data: {}
42+
}
43+
44+
const exclusions = context.client.config.dataExclusions.concat(IgnoredErrorProperties);
45+
const additionalData = JSON.parse(stringify(exception, exclusions));
46+
if (!isEmpty(additionalData)) {
47+
error.data["@ext"] = additionalData;
48+
}
49+
50+
context.event.data[KnownEventDataKeys.SimpleError] = error;
51+
}
52+
}
53+
54+
return Promise.resolve();
55+
}
56+
}

packages/core/src/services/IErrorParser.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/core/test/plugins/default/EventExclusionPlugin.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Configuration } from "../../../src/configuration/Configuration.js";
21
import { ExceptionlessClient } from "../../../src/ExceptionlessClient.js";
32
import { Event, KnownEventDataKeys } from "../../../src/models/Event.js";
43
import { InnerErrorInfo } from "../../../src/models/data/ErrorInfo.js";

packages/core/test/plugins/default/EventPluginTestFixture.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)