@@ -54,36 +54,52 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
54
54
} )
55
55
}
56
56
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 )
71
58
}
59
+
72
60
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 )
74
67
if ( ! buffer )
75
68
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
+ }
77
78
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
78
95
state ( ) . rpc . onUserConsoleLog ( {
79
- type : 'stderr' ,
96
+ type,
80
97
content : content || '<empty line>' ,
81
98
taskId,
82
- time : timer . stderrTime || RealDate . now ( ) ,
83
- size : buffer . length ,
99
+ time : time || RealDate . now ( ) ,
100
+ size,
101
+ origin,
84
102
} )
85
- stderrBuffer . set ( taskId , [ ] )
86
- timer . stderrTime = 0
87
103
}
88
104
89
105
const stdout = new Writable ( {
@@ -103,7 +119,17 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
103
119
buffer = [ ]
104
120
stdoutBuffer . set ( id , buffer )
105
121
}
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
+ }
107
133
schedule ( id )
108
134
callback ( )
109
135
} ,
@@ -125,7 +151,24 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) {
125
151
buffer = [ ]
126
152
stderrBuffer . set ( id , buffer )
127
153
}
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
+ }
129
172
schedule ( id )
130
173
callback ( )
131
174
} ,
0 commit comments