forked from exceptionless/Exceptionless.JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexceptionless.node.ts
More file actions
163 lines (140 loc) · 5.96 KB
/
exceptionless.node.ts
File metadata and controls
163 lines (140 loc) · 5.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import { Configuration } from './configuration/Configuration';
import { IConfigurationSettings } from './configuration/IConfigurationSettings';
import { SettingsManager } from './configuration/SettingsManager';
import { ILastReferenceIdManager } from './lastReferenceIdManager/ILastReferenceIdManager';
import { DefaultLastReferenceIdManager } from './lastReferenceIdManager/DefaultLastReferenceIdManager';
import { ConsoleLog } from './logging/ConsoleLog';
import { ILog } from './logging/ILog';
import { NullLog } from './logging/NullLog';
import { IClientConfiguration } from './models/IClientConfiguration';
import { IEnvironmentInfo } from './models/IEnvironmentInfo';
import { IError } from './models/IError';
import { IEvent } from './models/IEvent';
import { IInnerError } from './models/IInnerError';
import { IMethod } from './models/IMethod';
import { IModule } from './models/IModule';
import { IParameter } from './models/IParameter';
import { IRequestInfo } from './models/IRequestInfo';
import { IStackFrame } from './models/IStackFrame';
import { IUserDescription } from './models/IUserDescription';
import { IUserInfo } from './models/IUserInfo';
import { ContextData } from './plugins/ContextData';
import { EventPluginContext } from './plugins/EventPluginContext';
import { EventPluginManager } from './plugins/EventPluginManager';
import { IEventPlugin } from './plugins/IEventPlugin';
import { ConfigurationDefaultsPlugin } from './plugins/default/ConfigurationDefaultsPlugin';
import { ErrorPlugin } from './plugins/default/ErrorPlugin';
import { ModuleInfoPlugin } from './plugins/default/ModuleInfoPlugin';
import { ReferenceIdPlugin } from './plugins/default/ReferenceIdPlugin';
import { RequestInfoPlugin } from './plugins/default/RequestInfoPlugin';
import { EnvironmentInfoPlugin } from './plugins/default/EnvironmentInfoPlugin';
import { SubmissionMethodPlugin } from './plugins/default/SubmissionMethodPlugin';
import { DefaultEventQueue } from './queue/DefaultEventQueue';
import { IEventQueue } from './queue/IEventQueue';
import { IEnvironmentInfoCollector } from './services/IEnvironmentInfoCollector';
import { IErrorParser } from './services/IErrorParser';
import { IModuleCollector } from './services/IModuleCollector';
import { IRequestInfoCollector } from './services/IRequestInfoCollector';
import { NodeEnvironmentInfoCollector } from './services/NodeEnvironmentInfoCollector';
import { NodeErrorParser } from './services/NodeErrorParser';
import { NodeModuleCollector } from './services/NodeModuleCollector';
import { NodeRequestInfoCollector } from './services/NodeRequestInfoCollector';
import { InMemoryStorage } from './storage/InMemoryStorage';
import { IStorage } from './storage/IStorage';
import { IStorageItem } from './storage/IStorageItem';
import { NodeSubmissionAdapter } from './submission/NodeSubmissionAdapter';
import { SettingsResponse } from './submission/SettingsResponse';
import { SubmissionResponse } from './submission/SubmissionResponse';
import { EventBuilder } from './EventBuilder';
import { ExceptionlessClient } from './ExceptionlessClient';
import { Utils } from './Utils';
const EXIT: string = 'exit';
const UNCAUGHT_EXCEPTION: string = 'uncaughtException';
const SIGINT: string = 'SIGINT';
const SIGINT_CODE: number = 2;
let defaults = Configuration.defaults;
defaults.environmentInfoCollector = new NodeEnvironmentInfoCollector();
defaults.errorParser = new NodeErrorParser();
defaults.moduleCollector = new NodeModuleCollector();
defaults.requestInfoCollector = new NodeRequestInfoCollector();
defaults.submissionAdapter = new NodeSubmissionAdapter();
function getListenerCount(emitter, event:string): number {
if (emitter.listenerCount) {
return emitter.listenerCount(event);
}
return require('events').listenerCount(emitter, event);
}
/*
* Adding a event handler for 'uncaughtException' modifies the default
* Node behavior, so it won't exit or log to the console. Instead,
* we hijack the event emitter and forward the exception to the callback.
*/
function onUncaughtException(callback: (error: Error) => void) {
let originalEmit = process.emit;
process.emit = function(type: string, error: Error) {
if (type === UNCAUGHT_EXCEPTION) {
callback(error);
}
return originalEmit.apply(this, arguments);
};
}
onUncaughtException(function(error: Error) {
ExceptionlessClient.default.submitUnhandledException(error, UNCAUGHT_EXCEPTION);
});
/*
* We cannot hijack SIGINT, so if there are no other handlers,
* we just reproduce default Node.js behavior by exiting.
*/
process.on(SIGINT, function() {
if (getListenerCount(process, SIGINT) <= 1) {
process.exit(128 + SIGINT_CODE);
}
});
process.on(EXIT, function(code: number) {
/**
* exit codes: https://nodejs.org/api/process.html#process_event_exit
* From now on, only synchronous code may run. As soon as this method
* ends, the application inevitably will exit.
*/
function getExitCodeReason(exitCode: number): string {
if (exitCode === 1) {
return 'Uncaught Fatal Exception';
}
if (exitCode === 3) {
return 'Internal JavaScript Parse Error';
}
if (exitCode === 4) {
return 'Internal JavaScript Evaluation Failure';
}
if (exitCode === 5) {
return 'Fatal Exception';
}
if (exitCode === 6) {
return 'Non-function Internal Exception Handler ';
}
if (exitCode === 7) {
return 'Internal Exception Handler Run-Time Failure';
}
if (exitCode === 8) {
return 'Uncaught Exception';
}
if (exitCode === 9) {
return 'Invalid Argument';
}
if (exitCode === 10) {
return 'Internal JavaScript Run-Time Failure';
}
if (exitCode === 12) {
return 'Invalid Debug Argument';
}
return null;
}
let client = ExceptionlessClient.default;
let message = getExitCodeReason(code);
if (message !== null) {
client.submitLog(EXIT, message, 'Error');
}
client.config.queue.process(true);
// Application will now exit.
});
(<any>Error).stackTraceLimit = Infinity;