@@ -403,6 +403,17 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id:
403403 if ( ! enableSSE ) {
404404 logger . info ( `[${ requestId } ] Using non-SSE execution (direct JSON response)` )
405405 const syncTimeout = preprocessResult . executionTimeout ?. sync
406+ const abortController = new AbortController ( )
407+ let isTimedOut = false
408+ let timeoutId : NodeJS . Timeout | undefined
409+
410+ if ( syncTimeout ) {
411+ timeoutId = setTimeout ( ( ) => {
412+ isTimedOut = true
413+ abortController . abort ( )
414+ } , syncTimeout )
415+ }
416+
406417 try {
407418 const metadata : ExecutionMetadata = {
408419 requestId,
@@ -436,9 +447,33 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id:
436447 includeFileBase64,
437448 base64MaxBytes,
438449 stopAfterBlockId,
439- abortSignal : syncTimeout ? AbortSignal . timeout ( syncTimeout ) : undefined ,
450+ abortSignal : abortController . signal ,
440451 } )
441452
453+ if ( result . status === 'cancelled' && isTimedOut && syncTimeout ) {
454+ const timeoutErrorMessage = getTimeoutErrorMessage ( null , syncTimeout )
455+ logger . info ( `[${ requestId } ] Non-SSE execution timed out` , { timeoutMs : syncTimeout } )
456+ await loggingSession . markAsFailed ( timeoutErrorMessage )
457+
458+ await cleanupExecutionBase64Cache ( executionId )
459+
460+ return NextResponse . json (
461+ {
462+ success : false ,
463+ output : result . output ,
464+ error : timeoutErrorMessage ,
465+ metadata : result . metadata
466+ ? {
467+ duration : result . metadata . duration ,
468+ startTime : result . metadata . startTime ,
469+ endTime : result . metadata . endTime ,
470+ }
471+ : undefined ,
472+ } ,
473+ { status : 408 }
474+ )
475+ }
476+
442477 const outputWithBase64 = includeFileBase64
443478 ? ( ( await hydrateUserFilesWithBase64 ( result . output , {
444479 requestId,
@@ -472,14 +507,9 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id:
472507
473508 return NextResponse . json ( filteredResult )
474509 } catch ( error : unknown ) {
475- const isTimeout = isTimeoutError ( error )
476- const errorMessage = isTimeout
477- ? getTimeoutErrorMessage ( error , syncTimeout )
478- : error instanceof Error
479- ? error . message
480- : 'Unknown error'
510+ const errorMessage = error instanceof Error ? error . message : 'Unknown error'
481511
482- logger . error ( `[${ requestId } ] Non-SSE execution failed: ${ errorMessage } ` , { isTimeout } )
512+ logger . error ( `[${ requestId } ] Non-SSE execution failed: ${ errorMessage } ` )
483513
484514 const executionResult = hasExecutionResult ( error ) ? error . executionResult : undefined
485515
@@ -502,8 +532,10 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id:
502532 }
503533 : undefined ,
504534 } ,
505- { status : isTimeout ? 408 : 500 }
535+ { status : 500 }
506536 )
537+ } finally {
538+ if ( timeoutId ) clearTimeout ( timeoutId )
507539 }
508540 }
509541
0 commit comments