@@ -45,13 +45,21 @@ export interface MCPControllerHook {
4545
4646class InnerSSEServerTransport extends SSEServerTransport {
4747 async send ( message : JSONRPCMessage ) {
48- await super . send ( message ) ;
49- // eslint-disable-next-line @typescript-eslint/no-use-before-define
50- const map = MCPControllerRegister . instance ?. sseTransportsRequestMap . get ( this ) ;
51- if ( map && 'id' in message ) {
52- const resolve = map [ message . id ] ;
53- resolve ( null ) ;
54- delete map [ message . id ] ;
48+ let res : null | Error = null ;
49+ try {
50+ await super . send ( message ) ;
51+ } catch ( e ) {
52+ res = e as Error ;
53+ } finally {
54+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
55+ const map = MCPControllerRegister . instance ?. sseTransportsRequestMap . get ( this ) ;
56+ if ( map && 'id' in message ) {
57+ const { resolve, reject } = map [ message . id ] ?? { } ;
58+ if ( resolve ) {
59+ res ? reject ( res ) : resolve ( res ) ;
60+ delete map [ message . id ] ;
61+ }
62+ }
5563 }
5664 }
5765}
@@ -75,7 +83,10 @@ export class MCPControllerRegister implements ControllerRegister {
7583 // eslint-disable-next-line no-spaced-func
7684 sseTransportsRequestMap = new Map <
7785 InnerSSEServerTransport ,
78- Record < string , ( value : PromiseLike < null > | null ) => void
86+ Record < string , {
87+ resolve : ( value : PromiseLike < null > | null ) => void ,
88+ reject : ( reason ?: any ) => void ,
89+ }
7990 > > ( ) ;
8091 static hooks : MCPControllerHook [ ] = [ ] ;
8192
@@ -366,16 +377,18 @@ export class MCPControllerRegister implements ControllerRegister {
366377 }
367378
368379 sseCtxStorageRun ( ctx : Context , transport : SSEServerTransport ) {
380+ const self = this ;
369381 const mw = this . app . middleware . teggCtxLifecycleMiddleware ( ) ;
370382 const closeFunc = transport . onclose ;
371383 transport . onclose = ( ...args ) => {
372384 closeFunc ?.( ...args ) ;
385+ delete self . transports [ transport . sessionId ] ;
386+ self . sseTransportsRequestMap . delete ( transport ) ;
373387 } ;
374388 transport . onerror = error => {
375- this . app . logger . error ( 'session %s error %o' , transport . sessionId , error ) ;
389+ self . app . logger . error ( 'session %s error %o' , transport . sessionId , error ) ;
376390 } ;
377391 const messageFunc = transport . onmessage ;
378- const self = this ;
379392 self . sseTransportsRequestMap . set ( transport , { } ) ;
380393 transport . onmessage = async ( ...args : [ JSONRPCMessage ] ) => {
381394 // 这里需要 new 一个新的 ctx,否则 ContextProto 会未被初始化
@@ -394,9 +407,9 @@ export class MCPControllerRegister implements ControllerRegister {
394407 messageFunc ! ( ...args ) ;
395408 if ( isJSONRPCRequest ( args [ 0 ] ) ) {
396409 const map = self . sseTransportsRequestMap . get ( transport ) ! ;
397- const wait = new Promise < null > ( resolve => {
410+ const wait = new Promise < null > ( ( resolve , reject ) => {
398411 if ( 'id' in args [ 0 ] ) {
399- map [ args [ 0 ] . id ] = resolve ;
412+ map [ args [ 0 ] . id ] = { resolve, reject } ;
400413 }
401414 } ) ;
402415 await wait ;
0 commit comments