@@ -315,6 +315,11 @@ class SendedRequestEntry(NamedTuple):
315
315
result_type : Optional [Type [Any ]]
316
316
317
317
318
+ class ReceivedRequestEntry (NamedTuple ):
319
+ future : asyncio .Future [Any ]
320
+ request : Optional [Any ]
321
+
322
+
318
323
class JsonRPCProtocolBase (asyncio .Protocol , ABC ):
319
324
320
325
_logger = LoggingDescriptor ()
@@ -405,7 +410,7 @@ def __init__(self) -> None:
405
410
self ._sended_request : OrderedDict [Union [str , int ], SendedRequestEntry ] = OrderedDict ()
406
411
self ._sended_request_count = 0
407
412
self ._received_request_lock = threading .RLock ()
408
- self ._received_request : OrderedDict [Union [str , int , None ], asyncio . Future [ Any ] ] = OrderedDict ()
413
+ self ._received_request : OrderedDict [Union [str , int , None ], ReceivedRequestEntry ] = OrderedDict ()
409
414
410
415
@staticmethod
411
416
def _generate_json_rpc_messages_from_dict (
@@ -641,7 +646,7 @@ async def handle_request(self, message: JsonRPCRequest) -> None:
641
646
result = asyncio .create_task (ensure_coroutine (e .method )(* params [0 ], ** params [1 ]))
642
647
643
648
with self ._received_request_lock :
644
- self ._received_request [message .id ] = result
649
+ self ._received_request [message .id ] = ReceivedRequestEntry ( result , message )
645
650
646
651
try :
647
652
self .send_response (message .id , await result )
@@ -660,16 +665,17 @@ async def handle_request(self, message: JsonRPCRequest) -> None:
660
665
self ._logger .exception (e )
661
666
self .send_error (JsonRPCErrors .INTERNAL_ERROR , f"{ type (e ).__name__ } : { e } " , id = message .id )
662
667
663
- async def cancel_received_request (self , id : Union [int , str , None ]) -> None :
668
+ async def cancel_request (self , id : Union [int , str , None ]) -> None :
664
669
with self ._received_request_lock :
665
- future = self ._received_request .get (id , None )
666
- if future is not None and not future .cancelled ():
667
- future .cancel ()
670
+ entry = self ._received_request .get (id , None )
671
+ if entry is not None and entry .future is not None and not entry .future .cancelled ():
672
+ self ._logger .debug (f"try to cancel request { entry .request } " )
673
+ entry .future .cancel ()
668
674
669
675
async def cancel_all_received_request (self ) -> None :
670
- for future in self ._received_request .values ():
671
- if future is not None and not future .cancelled ():
672
- future .cancel ()
676
+ for entry in self ._received_request .values ():
677
+ if entry is not None and entry . future is not None and not entry . future .cancelled ():
678
+ entry . future .cancel ()
673
679
674
680
async def handle_notification (self , message : JsonRPCNotification ) -> None :
675
681
e = self .registry .get_entry (message .method )
0 commit comments