mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2025-10-27 06:01:29 +03:00
49 lines
1.0 KiB
TypeScript
49 lines
1.0 KiB
TypeScript
let handleError: (() => boolean) | undefined;
|
|
let lastTime = 0;
|
|
|
|
function createExpBackoffTimer(step: number) {
|
|
let count = 1;
|
|
return function (reset?: boolean) {
|
|
// Reset call
|
|
if (reset) {
|
|
count = 1;
|
|
return 0;
|
|
}
|
|
// Calculate next timeout
|
|
const timeout = Math.pow(2, count - 1);
|
|
if (count < 5) count += 1;
|
|
return timeout * step;
|
|
};
|
|
}
|
|
|
|
const nextErrorTimeout = createExpBackoffTimer(5000);
|
|
|
|
function postError(message: string) {
|
|
if (handleError && !handleError()) return;
|
|
window.postMessage(
|
|
{
|
|
source: '@devtools-page',
|
|
type: 'ERROR',
|
|
message: message,
|
|
},
|
|
'*',
|
|
);
|
|
}
|
|
|
|
function catchErrors(e: ErrorEvent) {
|
|
if (
|
|
(window.devToolsOptions && !window.devToolsOptions.shouldCatchErrors) ||
|
|
e.timeStamp - lastTime < nextErrorTimeout()
|
|
) {
|
|
return;
|
|
}
|
|
lastTime = e.timeStamp;
|
|
nextErrorTimeout(true);
|
|
postError(e.message);
|
|
}
|
|
|
|
export default function notifyErrors(onError?: () => boolean) {
|
|
handleError = onError;
|
|
window.addEventListener('error', catchErrors, false);
|
|
}
|