import { hostEmitter, createCommands, BaseError } from '@jolibox/common'; import { trackError } from './utils/event-tracker'; document.addEventListener('DOMContentLoaded', () => hostEmitter.emit('onDocumentReady', timeline.startTime)); const timelineFactory = () => { let _beginLoad = 0; return { set startTime(time: number) { _beginLoad = time; }, get startTime(): number { return _beginLoad; } }; }; export const timeline = timelineFactory(); const commands = createCommands(); const rejectHandler = (event: PromiseRejectionEvent | ErrorEvent | BaseError) => { let errorInfo; if (event instanceof ErrorEvent) { errorInfo = { message: event.message, source: event.filename, lineno: event.lineno, colno: event.colno, error: event.error ? event.error.stack || event.error.toString() : null }; } else if ('reason' in event) { // PromiseRejectionEvent const reason = event.reason; errorInfo = { message: reason instanceof Error ? reason.message : String(reason), stack: reason instanceof Error ? reason.stack : null, type: 'unhandledrejection' }; } else if (event instanceof BaseError) { errorInfo = { message: event.message, name: event.name, stack: event.stack }; } else { errorInfo = { unknownError: true }; } commands .executeCommand('ReportSDK.traceSystem', { event: 'globalJsError', info: { err: JSON.stringify(errorInfo) } }) .catch((e) => { // 兜底上报 console.error(`Fallback report: ${e} ${JSON.stringify(errorInfo)}`); trackError({ err: JSON.stringify(errorInfo) }); }); }; export const reportError = rejectHandler; window.addEventListener('unhandledrejection', rejectHandler.bind(this)); window.addEventListener('error', rejectHandler.bind(this)); window.onerror = (message, source, lineno, colno, error) => { const errorInfo = { message, source, lineno, colno, stack: error?.stack, errorString: error?.toString() }; commands .executeCommand('ReportSDK.traceSystem', { event: 'globalJsError', info: { err: JSON.stringify(errorInfo) } }) .catch((e) => { // 兜底上报 trackError({ err: JSON.stringify(errorInfo) }); }); };