@@ -109,15 +109,37 @@ function flushOutput() {
109109 }
110110 stderrBuffer = lines [ lines . length - 1 ] ;
111111 }
112- // Final flush if there's remaining text
113- if ( stdoutBuffer ) {
112+ // Final flush if there's remaining non-empty text
113+ if ( stdoutBuffer && stdoutBuffer . trim ( ) ) {
114114 rubyOutput . push ( { type : 'stdout' , message : stdoutBuffer } ) ;
115- stdoutBuffer = "" ;
116115 }
117- if ( stderrBuffer ) {
116+ stdoutBuffer = "" ;
117+
118+ if ( stderrBuffer && stderrBuffer . trim ( ) ) {
118119 rubyOutput . push ( { type : 'stderr' , message : stderrBuffer } ) ;
119- stderrBuffer = "" ;
120120 }
121+ stderrBuffer = "" ;
122+ }
123+
124+ function formatRubyError ( error ) {
125+ if ( ! ( error instanceof Error ) ) {
126+ return `予期せぬエラー: ${ String ( error ) . trim ( ) } ` ;
127+ }
128+
129+ let errorMessage = error . message ;
130+
131+ // Clean up Ruby error messages by filtering out internal eval lines
132+ if ( errorMessage . includes ( 'Traceback' ) || errorMessage . includes ( 'Error' ) ) {
133+ const lines = errorMessage . split ( '\n' ) ;
134+ // Keep lines that either don't contain (eval), or contain Error, or have line numbers
135+ errorMessage = lines . filter ( line =>
136+ ! line . includes ( '(eval)' ) ||
137+ line . includes ( 'Error' ) ||
138+ line . match ( / : \d + : / )
139+ ) . join ( '\n' ) . trim ( ) ;
140+ }
141+
142+ return errorMessage ;
121143}
122144
123145async function runRuby ( id , payload ) {
@@ -151,30 +173,10 @@ async function runRuby(id, payload) {
151173 console . log ( e ) ;
152174 flushOutput ( ) ;
153175
154- if ( e instanceof Error ) {
155- let errorMessage = e . message ;
156-
157- // Clean up Ruby error messages
158- if ( errorMessage . includes ( 'Traceback' ) || errorMessage . includes ( 'Error' ) ) {
159- const lines = errorMessage . split ( '\n' ) ;
160- // Filter out internal lines
161- errorMessage = lines . filter ( line =>
162- ! line . includes ( '(eval)' ) ||
163- line . includes ( 'Error' ) ||
164- line . match ( / : \d + : / )
165- ) . join ( '\n' ) . trim ( ) ;
166- }
167-
168- rubyOutput . push ( {
169- type : 'error' ,
170- message : errorMessage
171- } ) ;
172- } else {
173- rubyOutput . push ( {
174- type : 'error' ,
175- message : `予期せぬエラー: ${ String ( e ) . trim ( ) } `
176- } ) ;
177- }
176+ rubyOutput . push ( {
177+ type : 'error' ,
178+ message : formatRubyError ( e )
179+ } ) ;
178180 }
179181
180182 const updatedFiles = readAllFiles ( ) ;
@@ -222,28 +224,10 @@ async function runFile(id, payload) {
222224 console . log ( e ) ;
223225 flushOutput ( ) ;
224226
225- if ( e instanceof Error ) {
226- let errorMessage = e . message ;
227-
228- if ( errorMessage . includes ( 'Traceback' ) || errorMessage . includes ( 'Error' ) ) {
229- const lines = errorMessage . split ( '\n' ) ;
230- errorMessage = lines . filter ( line =>
231- ! line . includes ( '(eval)' ) ||
232- line . includes ( 'Error' ) ||
233- line . match ( / : \d + : / )
234- ) . join ( '\n' ) . trim ( ) ;
235- }
236-
237- rubyOutput . push ( {
238- type : 'error' ,
239- message : errorMessage
240- } ) ;
241- } else {
242- rubyOutput . push ( {
243- type : 'error' ,
244- message : `予期せぬエラー: ${ String ( e ) . trim ( ) } `
245- } ) ;
246- }
227+ rubyOutput . push ( {
228+ type : 'error' ,
229+ message : formatRubyError ( e )
230+ } ) ;
247231 }
248232
249233 const updatedFiles = readAllFiles ( ) ;
0 commit comments