[console-plugin] Feat: Record unhandledrejection event (#1104)

* 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>
This commit is contained in:
James Berry
2026-04-01 12:00:00 +08:00
committed by GitHub
parent 396de714f6
commit 8af769934f

View File

@@ -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));