3131 runtime_checkable ,
3232)
3333
34- from ..utils .async_tools import async_event , create_sub_future , create_sub_task
34+ from ..utils .async_tools import (
35+ HasThreaded ,
36+ async_event ,
37+ create_sub_future ,
38+ create_sub_task ,
39+ run_coroutine_in_thread ,
40+ )
3541from ..utils .dataclasses import as_json , from_dict
3642from ..utils .inspect import ensure_coroutine , iter_methods
3743from ..utils .logging import LoggingDescriptor
@@ -70,6 +76,8 @@ class JsonRPCErrors:
7076 SERVER_ERROR_START = - 32000
7177 SERVER_ERROR_END = - 32099
7278
79+ REQUEST_CANCELLED = - 32800
80+
7381
7482PROTOCOL_VERSION = "2.0"
7583
@@ -674,10 +682,13 @@ def handle_request(self, message: JsonRPCRequest) -> Optional[asyncio.Task[_T]]:
674682
675683 params = self ._convert_params (e .method , e .param_type , message .params )
676684
677- task = create_sub_task (
678- ensure_coroutine (e .method )(* params [0 ], ** params [1 ]),
679- name = message .method ,
680- )
685+ if isinstance (e .method , HasThreaded ) and cast (HasThreaded , e .method ).__threaded__ :
686+ task = run_coroutine_in_thread (ensure_coroutine (e .method ), * params [0 ], ** params [1 ])
687+ else :
688+ task = create_sub_task (
689+ ensure_coroutine (e .method )(* params [0 ], ** params [1 ]),
690+ name = message .method ,
691+ )
681692 with self ._received_request_lock :
682693 self ._received_request [message .id ] = ReceivedRequestEntry (task , message , e .cancelable )
683694
@@ -686,6 +697,7 @@ def done(t: asyncio.Task[Any]) -> None:
686697 self .send_response (message .id , t .result ())
687698 except asyncio .CancelledError :
688699 self ._logger .debug (f"request message { repr (message )} canceled" )
700+ self .send_error (JsonRPCErrors .REQUEST_CANCELLED , "Request canceled." , id = message .id )
689701 except (SystemExit , KeyboardInterrupt ):
690702 raise
691703 except JsonRPCErrorException as ex :
0 commit comments