Skip to content

Commit 7336608

Browse files
committed
Added a callback for event submission
1 parent 1038b04 commit 7336608

File tree

5 files changed

+66
-45
lines changed

5 files changed

+66
-45
lines changed

src/EventBuilder.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ExceptionlessClient } from './ExceptionlessClient';
33
import { IEvent } from './models/IEvent';
44
import { IUserInfo } from './models/IUserInfo';
55
import { ContextData } from './plugins/ContextData';
6+
import { EventPluginContext } from './plugins/EventPluginContext';
67
import { Utils } from 'Utils';
78

89
export class EventBuilder {
@@ -138,8 +139,8 @@ export class EventBuilder {
138139
return this;
139140
}
140141

141-
public submit(): void {
142-
this.client.submitEvent(this.target, this.pluginContextData);
142+
public submit(callback?:(context:EventPluginContext) => void): void {
143+
this.client.submitEvent(this.target, this.pluginContextData, callback);
143144
}
144145

145146
private isValidIdentifier(value:string): boolean {

src/ExceptionlessClient-spec.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
import { ExceptionlessClient } from 'ExceptionlessClient';
2-
/*
2+
import { EventPluginContext } from './plugins/EventPluginContext';
3+
34
describe('ExceptionlessClient', () => {
45
it('should use event reference ids', (done) => {
56
var error = new Error('From Unit Test');
67

78
var client = new ExceptionlessClient('LhhP1C9gijpSKCslHHCvwdSIz298twx271n1l6xw', 'http://localhost:50000');
89
expect(client.config.lastReferenceIdManager.getLast()).toBe(null);
9-
client.submitException(error).then(
10-
() => expect(client.config.lastReferenceIdManager.getLast()).toBe(null),
11-
() => expect(client.config.lastReferenceIdManager.getLast()).toBe(null)
12-
);
10+
client.submitException(error, (context:EventPluginContext) => {
11+
expect(client.config.lastReferenceIdManager.getLast()).toBe(null);
12+
});
1313

1414
var numberOfPlugins = client.config.plugins.length;
1515
client.config.useReferenceIds();
1616
expect(client.config.plugins.length).toBe(numberOfPlugins + 1);
1717

18-
client.submitException(error)
19-
.then(
20-
() => expect(client.config.lastReferenceIdManager.getLast()).not.toBe(null),
21-
() => expect(client.config.lastReferenceIdManager.getLast()).toBe(null))
22-
.then(done);
18+
client.submitException(error, (context:EventPluginContext) => {
19+
if (!context.cancelled) {
20+
expect(client.config.lastReferenceIdManager.getLast()).not.toBe(null);
21+
} else {
22+
expect(client.config.lastReferenceIdManager.getLast()).toBe(null);
23+
}
24+
25+
done();
26+
});
2327
}, 5000);
2428
});
25-
*/

src/ExceptionlessClient.ts

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export class ExceptionlessClient {
3030
return this.createEvent(pluginContextData).setType('error');
3131
}
3232

33-
public submitException(exception:Error): void {
34-
this.createException(exception).submit();
33+
public submitException(exception:Error, callback?:(context:EventPluginContext) => void): void {
34+
this.createException(exception).submit(callback);
3535
}
3636

3737
public createUnhandledException(exception:Error, submissionMethod?:string): EventBuilder {
@@ -42,16 +42,16 @@ export class ExceptionlessClient {
4242
return builder;
4343
}
4444

45-
public submitUnhandledException(exception:Error, submissionMethod?:string) {
46-
this.createUnhandledException(exception, submissionMethod).submit();
45+
public submitUnhandledException(exception:Error, submissionMethod?:string, callback?:(context:EventPluginContext) => void) {
46+
this.createUnhandledException(exception, submissionMethod).submit(callback);
4747
}
4848

4949
public createFeatureUsage(feature:string): EventBuilder {
5050
return this.createEvent().setType('usage').setSource(feature);
5151
}
5252

53-
public submitFeatureUsage(feature:string): void {
54-
this.createFeatureUsage(feature).submit();
53+
public submitFeatureUsage(feature:string, callback?:(context:EventPluginContext) => void): void {
54+
this.createFeatureUsage(feature).submit(callback);
5555
}
5656

5757
public createLog(message:string): EventBuilder;
@@ -75,40 +75,40 @@ export class ExceptionlessClient {
7575

7676
public submitLog(message:string): void;
7777
public submitLog(source:string, message:string): void;
78-
public submitLog(source:string, message:string, level:string): void;
79-
public submitLog(sourceOrMessage:string, message?:string, level?:string): void {
80-
this.createLog(sourceOrMessage, message, level).submit();
78+
public submitLog(source:string, message:string, level:string, callback?:(context:EventPluginContext) => void): void;
79+
public submitLog(sourceOrMessage:string, message?:string, level?:string, callback?:(context:EventPluginContext) => void): void {
80+
this.createLog(sourceOrMessage, message, level).submit(callback);
8181
}
8282

8383
public createNotFound(resource:string): EventBuilder {
8484
return this.createEvent().setType('404').setSource(resource);
8585
}
8686

87-
public submitNotFound(resource:string): void {
88-
this.createNotFound(resource).submit();
87+
public submitNotFound(resource:string, callback?:(context:EventPluginContext) => void): void {
88+
this.createNotFound(resource).submit(callback);
8989
}
9090

9191
public createSessionStart(sessionId:string): EventBuilder {
9292
return this.createEvent().setType('start').setSessionId(sessionId);
9393
}
9494

95-
public submitSessionStart(sessionId:string): void {
96-
this.createSessionStart(sessionId).submit();
95+
public submitSessionStart(sessionId:string, callback?:(context:EventPluginContext) => void): void {
96+
this.createSessionStart(sessionId).submit(callback);
9797
}
9898

9999
public createSessionEnd(sessionId:string): EventBuilder {
100100
return this.createEvent().setType('end').setSessionId(sessionId);
101101
}
102102

103-
public submitSessionEnd(sessionId:string): void {
104-
this.createSessionEnd(sessionId).submit();
103+
public submitSessionEnd(sessionId:string, callback?:(context:EventPluginContext) => void): void {
104+
this.createSessionEnd(sessionId).submit(callback);
105105
}
106106

107107
public createEvent(pluginContextData?:ContextData): EventBuilder {
108108
return new EventBuilder({ date: new Date() }, this, pluginContextData);
109109
}
110110

111-
public submitEvent(event:IEvent, pluginContextData?:ContextData): void {
111+
public submitEvent(event:IEvent, pluginContextData?:ContextData, callback?:(context:EventPluginContext) => void): void {
112112
if (!event) {
113113
return;
114114
}
@@ -126,21 +126,27 @@ export class ExceptionlessClient {
126126
}
127127

128128
var context = new EventPluginContext(this, event, pluginContextData);
129-
return EventPluginManager.run(context, () => {
130-
// ensure all required data
131-
if (!event.type || event.type.length === 0) {
132-
event.type = 'log';
129+
return EventPluginManager.run(context, (context:EventPluginContext) => {
130+
if (!context.cancelled) {
131+
// ensure all required data
132+
if (!event.type || event.type.length === 0) {
133+
event.type = 'log';
134+
}
135+
136+
if (!event.date) {
137+
event.date = new Date();
138+
}
139+
140+
this.config.queue.enqueue(event);
141+
142+
if (event.reference_id && event.reference_id.length > 0) {
143+
this.config.log.info(`Setting last reference id '${event.reference_id}'`);
144+
this.config.lastReferenceIdManager.setLast(event.reference_id);
145+
}
133146
}
134147

135-
if (!event.date) {
136-
event.date = new Date();
137-
}
138-
139-
this.config.queue.enqueue(event);
140-
141-
if (event.reference_id && event.reference_id.length > 0) {
142-
this.config.log.info(`Setting last reference id '${event.reference_id}'`);
143-
this.config.lastReferenceIdManager.setLast(event.reference_id);
148+
if (!!callback) {
149+
callback(context);
144150
}
145151
});
146152
}

src/plugins/EventPluginContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IEventPlugin } from './IEventPlugin';
55
import { ILog } from '../logging/ILog';
66

77
export class EventPluginContext {
8+
public cancelled:boolean;
89
public client:ExceptionlessClient;
910
public event:IEvent;
1011
public contextData:ContextData;

src/plugins/EventPluginManager.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,29 @@ import { EnvironmentInfoPlugin } from './default/EnvironmentInfoPlugin';
1010
import { SubmissionMethodPlugin } from './default/SubmissionMethodPlugin';
1111

1212
export class EventPluginManager {
13-
public static run(context:EventPluginContext, callback:() => void): void {
13+
public static run(context:EventPluginContext, callback:(context?:EventPluginContext, error?:Error) => void): void {
1414
var wrap = function (plugin:IEventPlugin, next?:() => void): () => void {
1515
return function () {
1616
try {
17-
plugin.run(context, next);
17+
if (!context.cancelled) {
18+
plugin.run(context, next);
19+
}
1820
} catch (ex) {
21+
context.cancelled = true;
1922
context.log.error(`Error while running plugin '${plugin.name}': ${ex.message}. This event will be discarded.`);
23+
}
2024

25+
if (context.cancelled && !!callback) {
26+
callback(context);
2127
}
2228
};
2329
};
2430

25-
var plugins:any[] = context.client.config.plugins.concat({ name: 'callback', priority: 9007199254740992, run: callback });
31+
var plugins:any[] = context.client.config.plugins;
32+
if (!!callback) {
33+
plugins.push({ name: 'callback', priority: 9007199254740992, run: callback });
34+
}
35+
2636
for (var index = plugins.length - 1; index > -1; index--) {
2737
plugins[index] = wrap(plugins[index], index < plugins.length - 1 ? plugins[index + 1] : null);
2838
}

0 commit comments

Comments
 (0)