forked from codesandbox/codesandbox-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunhandledError.js
More file actions
50 lines (44 loc) · 1.33 KB
/
unhandledError.js
File metadata and controls
50 lines (44 loc) · 1.33 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
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
/* @flow */
let boundErrorHandler = null;
type ErrorCallback = (error: Error) => void;
function errorHandler(callback: ErrorCallback, e: Event): void {
if (!e.error) {
return;
}
// $FlowFixMe
const { error } = e;
if (error instanceof Error) {
callback(error);
} else {
// A non-error was thrown, we don't have a trace. :(
// Look in your browser's devtools for more information
callback(new Error(error));
}
}
function registerUnhandledError(target: EventTarget, callback: ErrorCallback) {
if (boundErrorHandler !== null) {
// Always add the listener, in case we rewrote the window
target.addEventListener('error', boundErrorHandler);
return;
}
boundErrorHandler = errorHandler.bind(undefined, callback);
}
function unregisterUnhandledError(target: EventTarget) {
if (boundErrorHandler === null) {
return;
}
target.removeEventListener('error', boundErrorHandler);
boundErrorHandler = null;
}
export {
registerUnhandledError as register,
unregisterUnhandledError as unregister,
};