Skip to content

Commit

Permalink
[console-plugin] Feat: Record unhandledrejection event (#1104)
Browse files Browse the repository at this point in the history
* feat/console-plugin/add-unhandledrejection-handler

* better error

* change the window object to the passed in 'win'

* empty

* improve serialized error messages

---------

Co-authored-by: Yun Feng <yun.feng0817@gmail.com>
  • Loading branch information
jlalmes and YunFeng0817 authored Feb 6, 2023
1 parent 7e002b9 commit a77e302
Showing 1 changed file with 47 additions and 18 deletions.
65 changes: 47 additions & 18 deletions packages/rrweb/src/plugins/console/record/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,25 +114,54 @@ function initLogObserver(
const cancelHandlers: listenerHandler[] = [];
// add listener to thrown errors
if (logOptions.level.includes('error')) {
if (window) {
const errorHandler = (event: ErrorEvent) => {
const message = event.message,
error = event.error as Error;
const trace: string[] = ErrorStackParser.parse(
error,
).map((stackFrame: StackFrame) => stackFrame.toString());
const payload = [stringify(message, logOptions.stringifyOptions)];
cb({
level: 'error',
trace,
payload,
});
};
window.addEventListener('error', errorHandler);
cancelHandlers.push(() => {
if (window) window.removeEventListener('error', errorHandler);
const errorHandler = (event: ErrorEvent) => {
const message = event.message,
error = event.error as Error;
const trace: string[] = ErrorStackParser.parse(
error,
).map((stackFrame: StackFrame) => stackFrame.toString());
const payload = [stringify(message, logOptions.stringifyOptions)];
cb({
level: 'error',
trace,
payload,
});
}
};
win.addEventListener('error', errorHandler);
cancelHandlers.push(() => {
win.removeEventListener('error', errorHandler);
});
const unhandledrejectionHandler = (event: PromiseRejectionEvent) => {
let error: Error;
let payload: string[];
if (event.reason instanceof Error) {
error = event.reason;
payload = [
stringify(
`Uncaught (in promise) ${error.name}: ${error.message}`,
logOptions.stringifyOptions,
),
];
} else {
error = new Error();
payload = [
stringify('Uncaught (in promise)', logOptions.stringifyOptions),
stringify(event.reason, logOptions.stringifyOptions),
];
}
const trace: string[] = ErrorStackParser.parse(
error,
).map((stackFrame: StackFrame) => stackFrame.toString());
cb({
level: 'error',
trace,
payload,
});
};
win.addEventListener('unhandledrejection', unhandledrejectionHandler);
cancelHandlers.push(() => {
win.removeEventListener('unhandledrejection', unhandledrejectionHandler);
});
}
for (const levelType of logOptions.level) {
cancelHandlers.push(replace(logger, levelType));
Expand Down

0 comments on commit a77e302

Please sign in to comment.