11import type { ForwardConsolePayload } from '#types/customEvent'
2- import type { NormalizedModuleRunnerTransport } from './moduleRunnerTransport'
2+ import {
3+ type NormalizedModuleRunnerTransport ,
4+ SendBeforeConnectError ,
5+ } from './moduleRunnerTransport'
36
47export type ForwardConsoleLogLevel =
58 | 'error'
@@ -23,13 +26,14 @@ export interface ResolvedForwardConsoleOptions {
2326export function setupForwardConsoleHandler (
2427 transport : NormalizedModuleRunnerTransport ,
2528 options : ResolvedForwardConsoleOptions ,
29+ console : Console = globalThis . console ,
2630) : void {
2731 if ( ! options . enabled ) {
2832 return
2933 }
3034
31- function sendError ( type : 'error' | 'unhandled-rejection' , error : any ) {
32- transport . send ( {
35+ async function sendError ( type : 'error' | 'unhandled-rejection' , error : any ) {
36+ await transport . send ( {
3337 type : 'custom' ,
3438 event : 'vite:forward-console' ,
3539 data : {
@@ -43,20 +47,32 @@ export function setupForwardConsoleHandler(
4347 } )
4448 }
4549
46- function sendLog ( level : ForwardConsoleLogLevel , args : unknown [ ] ) {
47- transport . send ( {
48- type : 'custom' ,
49- event : 'vite:forward-console' ,
50- data : {
51- type : 'log' ,
50+ async function sendLog ( level : ForwardConsoleLogLevel , args : unknown [ ] ) {
51+ try {
52+ await transport . send ( {
53+ type : 'custom' ,
54+ event : 'vite:forward-console' ,
5255 data : {
53- level,
54- message : formatConsoleArgs ( args ) ,
55- } ,
56- } satisfies ForwardConsolePayload ,
57- } )
56+ type : 'log' ,
57+ data : {
58+ level,
59+ message : formatConsoleArgs ( args ) ,
60+ } ,
61+ } satisfies ForwardConsolePayload ,
62+ } )
63+ } catch ( err ) {
64+ try {
65+ await sendError ( 'unhandled-rejection' , err )
66+ } catch ( err ) {
67+ if ( ! ( err instanceof SendBeforeConnectError ) ) {
68+ originalConsoleError ( 'Failed to send error to Vite server:' , err )
69+ }
70+ }
71+ }
5872 }
5973
74+ const originalConsoleError = console . error
75+
6076 for ( const level of options . logLevels ) {
6177 const original = ( console as any ) [ level ]
6278 if ( typeof original !== 'function' ) {
@@ -69,18 +85,30 @@ export function setupForwardConsoleHandler(
6985 }
7086
7187 if ( options . unhandledErrors && typeof window !== 'undefined' ) {
72- window . addEventListener ( 'error' , ( event ) => {
88+ window . addEventListener ( 'error' , async ( event ) => {
7389 // `ErrorEvent` doesn't necessarily have `ErrorEvent.error`.
7490 // Use `ErrorEvent.message` as fallback e.g. for ResizeObserver error.
7591 // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent/error
7692 // https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors
7793 const error =
7894 event . error ?? ( event . message ? new Error ( event . message ) : event )
79- sendError ( 'error' , error )
95+ try {
96+ await sendError ( 'error' , error )
97+ } catch ( err ) {
98+ if ( ! ( err instanceof SendBeforeConnectError ) ) {
99+ originalConsoleError ( 'Failed to send error to Vite server:' , err )
100+ }
101+ }
80102 } )
81103
82- window . addEventListener ( 'unhandledrejection' , ( event ) => {
83- sendError ( 'unhandled-rejection' , event . reason )
104+ window . addEventListener ( 'unhandledrejection' , async ( event ) => {
105+ try {
106+ await sendError ( 'unhandled-rejection' , event . reason )
107+ } catch ( err ) {
108+ if ( ! ( err instanceof SendBeforeConnectError ) ) {
109+ originalConsoleError ( 'Failed to send error to Vite server:' , err )
110+ }
111+ }
84112 } )
85113 }
86114}
0 commit comments