@@ -54,36 +54,52 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
5454 } )
5555 }
5656 function sendStdout ( taskId : string ) {
57- const buffer = stdoutBuffer . get ( taskId )
58- if ( ! buffer )
59- return
60- const content = buffer . map ( i => String ( i ) ) . join ( '' )
61- const timer = timers . get ( taskId ) !
62- state ( ) . rpc . onUserConsoleLog ( {
63- type : 'stdout' ,
64- content : content || '<empty line>' ,
65- taskId,
66- time : timer . stdoutTime || RealDate . now ( ) ,
67- size : buffer . length ,
68- } )
69- stdoutBuffer . set ( taskId , [ ] )
70- timer . stdoutTime = 0
57+ sendBuffer ( 'stdout' , taskId )
7158 }
59+
7260 function sendStderr ( taskId : string ) {
73- const buffer = stderrBuffer . get ( taskId )
61+ sendBuffer ( 'stderr' , taskId )
62+ }
63+
64+ function sendBuffer ( type : 'stdout' | 'stderr' , taskId : string ) {
65+ const buffers = type === 'stdout' ? stdoutBuffer : stderrBuffer
66+ const buffer = buffers . get ( taskId )
7467 if ( ! buffer )
7568 return
76- const content = buffer . map ( i => String ( i ) ) . join ( '' )
69+ if ( state ( ) . config . printConsoleTrace ) {
70+ buffer . forEach ( ( [ buffer , origin ] ) => {
71+ sendLog ( type , taskId , String ( buffer ) , buffer . length , origin )
72+ } )
73+ }
74+ else {
75+ const content = buffer . map ( i => String ( i [ 0 ] ) ) . join ( '' )
76+ sendLog ( type , taskId , content , buffer . length )
77+ }
7778 const timer = timers . get ( taskId ) !
79+ buffers . set ( taskId , [ ] )
80+ if ( type === 'stderr' )
81+ timer . stderrTime = 0
82+ else
83+ timer . stdoutTime = 0
84+ }
85+
86+ function sendLog (
87+ type : 'stderr' | 'stdout' ,
88+ taskId : string ,
89+ content : string ,
90+ size : number ,
91+ origin ?: string ,
92+ ) {
93+ const timer = timers . get ( taskId ) !
94+ const time = type === 'stderr' ? timer . stderrTime : timer . stdoutTime
7895 state ( ) . rpc . onUserConsoleLog ( {
79- type : 'stderr' ,
96+ type,
8097 content : content || '<empty line>' ,
8198 taskId,
82- time : timer . stderrTime || RealDate . now ( ) ,
83- size : buffer . length ,
99+ time : time || RealDate . now ( ) ,
100+ size,
101+ origin,
84102 } )
85- stderrBuffer . set ( taskId , [ ] )
86- timer . stderrTime = 0
87103 }
88104
89105 const stdout = new Writable ( {
@@ -103,7 +119,17 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
103119 buffer = [ ]
104120 stdoutBuffer . set ( id , buffer )
105121 }
106- buffer . push ( data )
122+ if ( state ( ) . config . printConsoleTrace ) {
123+ const limit = Error . stackTraceLimit
124+ Error . stackTraceLimit = limit + 6
125+ const stack = new Error ( 'STACK_TRACE' ) . stack
126+ const trace = stack ?. split ( '\n' ) . slice ( 7 ) . join ( '\n' )
127+ Error . stackTraceLimit = limit
128+ buffer . push ( [ data , trace ] )
129+ }
130+ else {
131+ buffer . push ( [ data , undefined ] )
132+ }
107133 schedule ( id )
108134 callback ( )
109135 } ,
@@ -125,7 +151,24 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
125151 buffer = [ ]
126152 stderrBuffer . set ( id , buffer )
127153 }
128- buffer . push ( data )
154+ if ( state ( ) . config . printConsoleTrace ) {
155+ const limit = Error . stackTraceLimit
156+ Error . stackTraceLimit = limit + 6
157+ const stack = new Error ( 'STACK_TRACE' ) . stack ?. split ( '\n' )
158+ Error . stackTraceLimit = limit
159+ const isTrace = stack ?. some ( line => line . includes ( 'at Console.trace' ) )
160+ if ( isTrace ) {
161+ buffer . push ( [ data , undefined ] )
162+ }
163+ else {
164+ const trace = stack ?. slice ( 7 ) . join ( '\n' )
165+ Error . stackTraceLimit = limit
166+ buffer . push ( [ data , trace ] )
167+ }
168+ }
169+ else {
170+ buffer . push ( [ data , undefined ] )
171+ }
129172 schedule ( id )
130173 callback ( )
131174 } ,
0 commit comments