@@ -143,6 +143,7 @@ class RpcMethodEntry(NamedTuple):
143143 name : str
144144 method : Callable [..., Any ]
145145 param_type : Optional [Type [Any ]]
146+ cancelable : bool
146147
147148
148149@runtime_checkable
@@ -159,12 +160,18 @@ def rpc_method(_func: _F) -> _F:
159160
160161
161162@overload
162- def rpc_method (* , name : Optional [str ] = None , param_type : Optional [Type [Any ]] = None ) -> Callable [[_F ], _F ]:
163+ def rpc_method (
164+ * , name : Optional [str ] = None , param_type : Optional [Type [Any ]] = None , cancelable : bool = True
165+ ) -> Callable [[_F ], _F ]:
163166 ...
164167
165168
166169def rpc_method (
167- _func : Optional [_F ] = None , * , name : Optional [str ] = None , param_type : Optional [Type [Any ]] = None
170+ _func : Optional [_F ] = None ,
171+ * ,
172+ name : Optional [str ] = None ,
173+ param_type : Optional [Type [Any ]] = None ,
174+ cancelable : bool = True ,
168175) -> Callable [[_F ], _F ]:
169176 def _decorator (func : _F ) -> Callable [[_F ], _F ]:
170177
@@ -182,7 +189,7 @@ def _decorator(func: _F) -> Callable[[_F], _F]:
182189 if real_name is None or not real_name :
183190 raise ValueError ("name is empty." )
184191
185- cast (RpcMethod , f ).__rpc_method__ = RpcMethodEntry (real_name , f , param_type )
192+ cast (RpcMethod , f ).__rpc_method__ = RpcMethodEntry (real_name , f , param_type , cancelable )
186193 return func
187194
188195 if _func is None :
@@ -248,6 +255,7 @@ def get_methods(obj: Any) -> Dict[str, RpcMethodEntry]:
248255 rpc_method .__rpc_method__ .name ,
249256 method ,
250257 rpc_method .__rpc_method__ .param_type ,
258+ rpc_method .__rpc_method__ .cancelable ,
251259 )
252260 for method , rpc_method in map (
253261 lambda m1 : (m1 , cast (RpcMethod , m1 )),
@@ -288,10 +296,12 @@ def methods(self) -> Dict[str, RpcMethodEntry]:
288296
289297 return self .__methods
290298
291- def add_method (self , name : str , func : Callable [..., Any ], param_type : Optional [Type [Any ]] = None ) -> None :
299+ def add_method (
300+ self , name : str , func : Callable [..., Any ], param_type : Optional [Type [Any ]] = None , cancelable : bool = True
301+ ) -> None :
292302 self .__ensure_initialized ()
293303
294- self .__methods [name ] = RpcMethodEntry (name , func , param_type )
304+ self .__methods [name ] = RpcMethodEntry (name , func , param_type , cancelable )
295305
296306 def remove_method (self , name : str ) -> Optional [RpcMethodEntry ]:
297307 self .__ensure_initialized ()
@@ -323,6 +333,7 @@ class ReceivedRequestEntry(NamedTuple):
323333 future : asyncio .Future [Any ]
324334 request : Optional [Any ]
325335 cancel_token : CancelationToken
336+ cancelable : bool
326337
327338
328339class JsonRPCProtocolBase (asyncio .Protocol , ABC ):
@@ -650,10 +661,13 @@ def handle_request(self, message: JsonRPCRequest) -> Optional[asyncio.Task[_T]]:
650661 cancel_token = CancelationToken ()
651662
652663 task = create_sub_task (
653- ensure_coroutine (e .method )(* params [0 ], cancel_token = cancel_token , ** params [1 ]), name = message .method
664+ ensure_coroutine (e .method )(
665+ * params [0 ], ** ({"cancel_token" : cancel_token } if e .cancelable else {}), ** params [1 ]
666+ ),
667+ name = message .method ,
654668 )
655669 with self ._received_request_lock :
656- self ._received_request [message .id ] = ReceivedRequestEntry (task , message , cancel_token )
670+ self ._received_request [message .id ] = ReceivedRequestEntry (task , message , cancel_token , e . cancelable )
657671
658672 def done (t : asyncio .Task [Any ]) -> None :
659673 try :
@@ -663,7 +677,6 @@ def done(t: asyncio.Task[Any]) -> None:
663677 except (SystemExit , KeyboardInterrupt ):
664678 raise
665679 except JsonRPCErrorException as ex :
666- self ._logger .exception (ex )
667680 self .send_error (ex .code , ex .message , id = message .id , data = ex .data )
668681 except BaseException as e :
669682 self ._logger .exception (e )
@@ -689,8 +702,9 @@ def cancel_request(self, id: Union[int, str, None]) -> None:
689702 @_logger .call
690703 async def cancel_all_received_request (self ) -> None :
691704 for entry in self ._received_request .values ():
692- if entry is not None and entry .future is not None and not entry .future .cancelled ():
693- entry .cancel_token .cancel ()
705+ if entry is not None and entry .cancelable and entry .future is not None and not entry .future .cancelled ():
706+ if entry .cancel_token :
707+ entry .cancel_token .cancel ()
694708 entry .future .cancel ()
695709
696710 @_logger .call
0 commit comments