1+ import type { ReadableStreamDefaultReadResult } from 'stream/web' ;
12import type {
23 ClientHandlerImplementation ,
34 DuplexHandlerImplementation ,
@@ -442,7 +443,6 @@ class RPCServer extends EventTarget {
442443 } ) ;
443444 } ;
444445 abortController . signal . addEventListener ( 'abort' , handleAbort ) ;
445-
446446 const prom = ( async ( ) => {
447447 const headTransformStream = rpcUtilsMiddleware . binaryToJsonMessageStream (
448448 rpcUtils . parseJSONRPCRequest ,
@@ -469,30 +469,80 @@ class RPCServer extends EventTarget {
469469 await inputStream . cancel ( reason ) ;
470470 await rpcStream . writable . abort ( reason ) ;
471471 await inputStreamEndProm ;
472+ timer . cancel ( cleanupReason ) ;
473+ graceTimer ?. cancel ( cleanupReason ) ;
474+ await timer . catch ( ( ) => { } ) ;
475+ await graceTimer ?. catch ( ( ) => { } ) ;
472476 } ;
473477 // Read a single empty value to consume the first message
474478 const reader = headTransformStream . readable . getReader ( ) ;
475479 // Allows timing out when waiting for the first message
476- const headerMessage = await Promise . race ( [
477- reader . read ( ) ,
478- timer . then (
479- ( ) => undefined ,
480- ( ) => { } ,
481- ) ,
482- ] ) ;
480+ let headerMessage :
481+ | ReadableStreamDefaultReadResult < JSONRPCRequest >
482+ | undefined
483+ | void ;
484+ try {
485+ headerMessage = await Promise . race ( [
486+ reader . read ( ) ,
487+ timer . then (
488+ ( ) => undefined ,
489+ ( ) => { } ,
490+ ) ,
491+ ] ) ;
492+ } catch ( e ) {
493+ const newErr = new rpcErrors . ErrorRPCHandlerFailed (
494+ 'Stream failed waiting for header' ,
495+ { cause : e } ,
496+ ) ;
497+ await inputStreamEndProm ;
498+ timer . cancel ( cleanupReason ) ;
499+ graceTimer ?. cancel ( cleanupReason ) ;
500+ await timer . catch ( ( ) => { } ) ;
501+ await graceTimer ?. catch ( ( ) => { } ) ;
502+ this . dispatchEvent (
503+ new rpcEvents . RPCErrorEvent ( {
504+ detail : new rpcErrors . ErrorRPCOutputStreamError (
505+ 'Stream failed waiting for header' ,
506+ {
507+ cause : newErr ,
508+ } ,
509+ ) ,
510+ } ) ,
511+ ) ;
512+ return ;
513+ }
483514 // Downgrade back to the raw stream
484515 await reader . cancel ( ) ;
485516 // There are 2 conditions where we just end here
486517 // 1. The timeout timer resolves before the first message
487518 // 2. the stream ends before the first message
488519 if ( headerMessage == null ) {
489- await cleanUp (
490- new rpcErrors . ErrorRPCHandlerFailed ( 'Timed out waiting for header' ) ,
520+ const newErr = new rpcErrors . ErrorRPCHandlerFailed (
521+ 'Timed out waiting for header' ,
522+ ) ;
523+ await cleanUp ( newErr ) ;
524+ this . dispatchEvent (
525+ new rpcEvents . RPCErrorEvent ( {
526+ detail : new rpcErrors . ErrorRPCOutputStreamError (
527+ 'Timed out waiting for header' ,
528+ {
529+ cause : newErr ,
530+ } ,
531+ ) ,
532+ } ) ,
491533 ) ;
492534 return ;
493535 }
494536 if ( headerMessage . done ) {
495- await cleanUp ( new rpcErrors . ErrorRPCHandlerFailed ( 'Missing header' ) ) ;
537+ const newErr = new rpcErrors . ErrorRPCHandlerFailed ( 'Missing header' ) ;
538+ await cleanUp ( newErr ) ;
539+ this . dispatchEvent (
540+ new rpcEvents . RPCErrorEvent ( {
541+ detail : new rpcErrors . ErrorRPCOutputStreamError ( 'Missing header' , {
542+ cause : newErr ,
543+ } ) ,
544+ } ) ,
545+ ) ;
496546 return ;
497547 }
498548 const method = headerMessage . value . method ;
@@ -514,6 +564,7 @@ class RPCServer extends EventTarget {
514564 // Otherwise refresh
515565 timer . refresh ( ) ;
516566 }
567+ this . logger . info ( `Handling stream with method (${ method } )` ) ;
517568 const outputStream = handler (
518569 [ headerMessage . value , inputStream ] ,
519570 rpcStream . cancel ,
@@ -524,6 +575,7 @@ class RPCServer extends EventTarget {
524575 . pipeTo ( rpcStream . writable )
525576 . catch ( ( ) => { } ) ; // Ignore any errors, we only care that it finished
526577 await Promise . allSettled ( [ inputStreamEndProm , outputStreamEndProm ] ) ;
578+ this . logger . info ( `Handled stream with method (${ method } )` ) ;
527579 // Cleaning up abort and timer
528580 timer . cancel ( cleanupReason ) ;
529581 abortController . signal . removeEventListener ( 'abort' , handleAbort ) ;
0 commit comments