|
|
|
@ -15,19 +15,30 @@ |
|
|
|
|
|
|
|
|
|
import collections |
|
|
|
|
import sys |
|
|
|
|
import types |
|
|
|
|
from typing import Any, Callable, Optional, Sequence, Tuple, Union |
|
|
|
|
|
|
|
|
|
import grpc |
|
|
|
|
|
|
|
|
|
from ._typing import DeserializingFunction |
|
|
|
|
from ._typing import DoneCallbackType |
|
|
|
|
from ._typing import MetadataType |
|
|
|
|
from ._typing import RequestIterableType |
|
|
|
|
from ._typing import SerializingFunction |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _ServicePipeline(object): |
|
|
|
|
interceptors: Tuple[grpc.ServerInterceptor] |
|
|
|
|
|
|
|
|
|
def __init__(self, interceptors): |
|
|
|
|
def __init__(self, interceptors: Sequence[grpc.ServerInterceptor]): |
|
|
|
|
self.interceptors = tuple(interceptors) |
|
|
|
|
|
|
|
|
|
def _continuation(self, thunk, index): |
|
|
|
|
def _continuation(self, thunk: Callable, index: int) -> Callable: |
|
|
|
|
return lambda context: self._intercept_at(thunk, index, context) |
|
|
|
|
|
|
|
|
|
def _intercept_at(self, thunk, index, context): |
|
|
|
|
def _intercept_at( |
|
|
|
|
self, thunk: Callable, index: int, |
|
|
|
|
context: grpc.HandlerCallDetails) -> grpc.RpcMethodHandler: |
|
|
|
|
if index < len(self.interceptors): |
|
|
|
|
interceptor = self.interceptors[index] |
|
|
|
|
thunk = self._continuation(thunk, index + 1) |
|
|
|
@ -35,11 +46,14 @@ class _ServicePipeline(object): |
|
|
|
|
else: |
|
|
|
|
return thunk(context) |
|
|
|
|
|
|
|
|
|
def execute(self, thunk, context): |
|
|
|
|
def execute(self, thunk: Callable, |
|
|
|
|
context: grpc.HandlerCallDetails) -> grpc.RpcMethodHandler: |
|
|
|
|
return self._intercept_at(thunk, 0, context) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def service_pipeline(interceptors): |
|
|
|
|
def service_pipeline( |
|
|
|
|
interceptors: Optional[Sequence[grpc.ServerInterceptor]] |
|
|
|
|
) -> Optional[_ServicePipeline]: |
|
|
|
|
return _ServicePipeline(interceptors) if interceptors else None |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -51,90 +65,101 @@ class _ClientCallDetails( |
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _unwrap_client_call_details(call_details, default_details): |
|
|
|
|
def _unwrap_client_call_details( |
|
|
|
|
call_details: grpc.ClientCallDetails, |
|
|
|
|
default_details: grpc.ClientCallDetails |
|
|
|
|
) -> Tuple[str, float, MetadataType, grpc.CallCredentials, bool, |
|
|
|
|
grpc.Compression]: |
|
|
|
|
try: |
|
|
|
|
method = call_details.method |
|
|
|
|
method = call_details.method # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
method = default_details.method |
|
|
|
|
method = default_details.method # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
timeout = call_details.timeout |
|
|
|
|
timeout = call_details.timeout # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
timeout = default_details.timeout |
|
|
|
|
timeout = default_details.timeout # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
metadata = call_details.metadata |
|
|
|
|
metadata = call_details.metadata # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
metadata = default_details.metadata |
|
|
|
|
metadata = default_details.metadata # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
credentials = call_details.credentials |
|
|
|
|
credentials = call_details.credentials # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
credentials = default_details.credentials |
|
|
|
|
credentials = default_details.credentials # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
wait_for_ready = call_details.wait_for_ready |
|
|
|
|
wait_for_ready = call_details.wait_for_ready # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
wait_for_ready = default_details.wait_for_ready |
|
|
|
|
wait_for_ready = default_details.wait_for_ready # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
compression = call_details.compression |
|
|
|
|
compression = call_details.compression # pytype: disable=attribute-error |
|
|
|
|
except AttributeError: |
|
|
|
|
compression = default_details.compression |
|
|
|
|
compression = default_details.compression # pytype: disable=attribute-error |
|
|
|
|
|
|
|
|
|
return method, timeout, metadata, credentials, wait_for_ready, compression |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _FailureOutcome(grpc.RpcError, grpc.Future, grpc.Call): # pylint: disable=too-many-ancestors |
|
|
|
|
_exception: Exception |
|
|
|
|
_traceback: types.TracebackType |
|
|
|
|
|
|
|
|
|
def __init__(self, exception, traceback): |
|
|
|
|
def __init__(self, exception: Exception, traceback: types.TracebackType): |
|
|
|
|
super(_FailureOutcome, self).__init__() |
|
|
|
|
self._exception = exception |
|
|
|
|
self._traceback = traceback |
|
|
|
|
|
|
|
|
|
def initial_metadata(self): |
|
|
|
|
def initial_metadata(self) -> Optional[MetadataType]: |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def trailing_metadata(self): |
|
|
|
|
def trailing_metadata(self) -> Optional[MetadataType]: |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def code(self): |
|
|
|
|
def code(self) -> Optional[grpc.StatusCode]: |
|
|
|
|
return grpc.StatusCode.INTERNAL |
|
|
|
|
|
|
|
|
|
def details(self): |
|
|
|
|
def details(self) -> Optional[str]: |
|
|
|
|
return 'Exception raised while intercepting the RPC' |
|
|
|
|
|
|
|
|
|
def cancel(self): |
|
|
|
|
def cancel(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def cancelled(self): |
|
|
|
|
def cancelled(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def is_active(self): |
|
|
|
|
def is_active(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def time_remaining(self): |
|
|
|
|
def time_remaining(self) -> Optional[float]: |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def running(self): |
|
|
|
|
def running(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def done(self): |
|
|
|
|
def done(self) -> bool: |
|
|
|
|
return True |
|
|
|
|
|
|
|
|
|
def result(self, ignored_timeout=None): |
|
|
|
|
def result(self, ignored_timeout: Optional[float] = None): |
|
|
|
|
raise self._exception |
|
|
|
|
|
|
|
|
|
def exception(self, ignored_timeout=None): |
|
|
|
|
def exception( |
|
|
|
|
self, |
|
|
|
|
ignored_timeout: Optional[float] = None) -> Optional[Exception]: |
|
|
|
|
return self._exception |
|
|
|
|
|
|
|
|
|
def traceback(self, ignored_timeout=None): |
|
|
|
|
def traceback( |
|
|
|
|
self, |
|
|
|
|
ignored_timeout: Optional[float] = None |
|
|
|
|
) -> Optional[types.TracebackType]: |
|
|
|
|
return self._traceback |
|
|
|
|
|
|
|
|
|
def add_callback(self, unused_callback): |
|
|
|
|
def add_callback(self, unused_callback) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def add_done_callback(self, fn): |
|
|
|
|
def add_done_callback(self, fn: DoneCallbackType) -> None: |
|
|
|
|
fn(self) |
|
|
|
|
|
|
|
|
|
def __iter__(self): |
|
|
|
@ -148,71 +173,77 @@ class _FailureOutcome(grpc.RpcError, grpc.Future, grpc.Call): # pylint: disable |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _UnaryOutcome(grpc.Call, grpc.Future): |
|
|
|
|
_response: Any |
|
|
|
|
_call: grpc.Call |
|
|
|
|
|
|
|
|
|
def __init__(self, response, call): |
|
|
|
|
def __init__(self, response: Any, call: grpc.Call): |
|
|
|
|
self._response = response |
|
|
|
|
self._call = call |
|
|
|
|
|
|
|
|
|
def initial_metadata(self): |
|
|
|
|
def initial_metadata(self) -> Optional[MetadataType]: |
|
|
|
|
return self._call.initial_metadata() |
|
|
|
|
|
|
|
|
|
def trailing_metadata(self): |
|
|
|
|
def trailing_metadata(self) -> Optional[MetadataType]: |
|
|
|
|
return self._call.trailing_metadata() |
|
|
|
|
|
|
|
|
|
def code(self): |
|
|
|
|
def code(self) -> Optional[grpc.StatusCode]: |
|
|
|
|
return self._call.code() |
|
|
|
|
|
|
|
|
|
def details(self): |
|
|
|
|
def details(self) -> Optional[str]: |
|
|
|
|
return self._call.details() |
|
|
|
|
|
|
|
|
|
def is_active(self): |
|
|
|
|
def is_active(self) -> bool: |
|
|
|
|
return self._call.is_active() |
|
|
|
|
|
|
|
|
|
def time_remaining(self): |
|
|
|
|
def time_remaining(self) -> Optional[float]: |
|
|
|
|
return self._call.time_remaining() |
|
|
|
|
|
|
|
|
|
def cancel(self): |
|
|
|
|
def cancel(self) -> bool: |
|
|
|
|
return self._call.cancel() |
|
|
|
|
|
|
|
|
|
def add_callback(self, callback): |
|
|
|
|
def add_callback(self, callback) -> None: |
|
|
|
|
return self._call.add_callback(callback) |
|
|
|
|
|
|
|
|
|
def cancelled(self): |
|
|
|
|
def cancelled(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def running(self): |
|
|
|
|
def running(self) -> bool: |
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
def done(self): |
|
|
|
|
def done(self) -> bool: |
|
|
|
|
return True |
|
|
|
|
|
|
|
|
|
def result(self, ignored_timeout=None): |
|
|
|
|
def result(self, ignored_timeout: Optional[float] = None): |
|
|
|
|
return self._response |
|
|
|
|
|
|
|
|
|
def exception(self, ignored_timeout=None): |
|
|
|
|
def exception(self, ignored_timeout: Optional[float] = None): |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def traceback(self, ignored_timeout=None): |
|
|
|
|
def traceback(self, ignored_timeout: Optional[float] = None): |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def add_done_callback(self, fn): |
|
|
|
|
def add_done_callback(self, fn: DoneCallbackType) -> None: |
|
|
|
|
fn(self) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): |
|
|
|
|
_thunk: Callable |
|
|
|
|
_method: str |
|
|
|
|
_interceptor: grpc.UnaryUnaryClientInterceptor |
|
|
|
|
|
|
|
|
|
def __init__(self, thunk, method, interceptor): |
|
|
|
|
def __init__(self, thunk: Callable, method: str, |
|
|
|
|
interceptor: grpc.UnaryUnaryClientInterceptor): |
|
|
|
|
self._thunk = thunk |
|
|
|
|
self._method = method |
|
|
|
|
self._interceptor = interceptor |
|
|
|
|
|
|
|
|
|
def __call__(self, |
|
|
|
|
request, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request: Any, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None) -> Any: |
|
|
|
|
response, ignored_call = self._with_call(request, |
|
|
|
|
timeout=timeout, |
|
|
|
|
metadata=metadata, |
|
|
|
@ -221,13 +252,15 @@ class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): |
|
|
|
|
compression=compression) |
|
|
|
|
return response |
|
|
|
|
|
|
|
|
|
def _with_call(self, |
|
|
|
|
request, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
def _with_call( |
|
|
|
|
self, |
|
|
|
|
request: Any, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None |
|
|
|
|
) -> Tuple[Any, grpc.Call]: |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -256,13 +289,15 @@ class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): |
|
|
|
|
request) |
|
|
|
|
return call.result(), call |
|
|
|
|
|
|
|
|
|
def with_call(self, |
|
|
|
|
request, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
def with_call( |
|
|
|
|
self, |
|
|
|
|
request: Any, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None |
|
|
|
|
) -> Tuple[Any, grpc.Call]: |
|
|
|
|
return self._with_call(request, |
|
|
|
|
timeout=timeout, |
|
|
|
|
metadata=metadata, |
|
|
|
@ -271,12 +306,12 @@ class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): |
|
|
|
|
compression=compression) |
|
|
|
|
|
|
|
|
|
def future(self, |
|
|
|
|
request, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request: Any, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None) -> Any: |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -302,19 +337,23 @@ class _UnaryUnaryMultiCallable(grpc.UnaryUnaryMultiCallable): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _UnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable): |
|
|
|
|
_thunk: Callable |
|
|
|
|
_method: str |
|
|
|
|
_interceptor: grpc.UnaryStreamClientInterceptor |
|
|
|
|
|
|
|
|
|
def __init__(self, thunk, method, interceptor): |
|
|
|
|
def __init__(self, thunk: Callable, method: str, |
|
|
|
|
interceptor: grpc.UnaryStreamClientInterceptor): |
|
|
|
|
self._thunk = thunk |
|
|
|
|
self._method = method |
|
|
|
|
self._interceptor = interceptor |
|
|
|
|
|
|
|
|
|
def __call__(self, |
|
|
|
|
request, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request: Any, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None): |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -339,19 +378,23 @@ class _UnaryStreamMultiCallable(grpc.UnaryStreamMultiCallable): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): |
|
|
|
|
_thunk: Callable |
|
|
|
|
_method: str |
|
|
|
|
_interceptor: grpc.StreamUnaryClientInterceptor |
|
|
|
|
|
|
|
|
|
def __init__(self, thunk, method, interceptor): |
|
|
|
|
def __init__(self, thunk: Callable, method: str, |
|
|
|
|
interceptor: grpc.StreamUnaryClientInterceptor): |
|
|
|
|
self._thunk = thunk |
|
|
|
|
self._method = method |
|
|
|
|
self._interceptor = interceptor |
|
|
|
|
|
|
|
|
|
def __call__(self, |
|
|
|
|
request_iterator, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request_iterator: RequestIterableType, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None) -> Any: |
|
|
|
|
response, ignored_call = self._with_call(request_iterator, |
|
|
|
|
timeout=timeout, |
|
|
|
|
metadata=metadata, |
|
|
|
@ -360,13 +403,15 @@ class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): |
|
|
|
|
compression=compression) |
|
|
|
|
return response |
|
|
|
|
|
|
|
|
|
def _with_call(self, |
|
|
|
|
request_iterator, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
def _with_call( |
|
|
|
|
self, |
|
|
|
|
request_iterator: RequestIterableType, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None |
|
|
|
|
) -> Tuple[Any, grpc.Call]: |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -395,13 +440,15 @@ class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): |
|
|
|
|
request_iterator) |
|
|
|
|
return call.result(), call |
|
|
|
|
|
|
|
|
|
def with_call(self, |
|
|
|
|
request_iterator, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
def with_call( |
|
|
|
|
self, |
|
|
|
|
request_iterator: RequestIterableType, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None |
|
|
|
|
) -> Tuple[Any, grpc.Call]: |
|
|
|
|
return self._with_call(request_iterator, |
|
|
|
|
timeout=timeout, |
|
|
|
|
metadata=metadata, |
|
|
|
@ -410,12 +457,12 @@ class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): |
|
|
|
|
compression=compression) |
|
|
|
|
|
|
|
|
|
def future(self, |
|
|
|
|
request_iterator, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request_iterator: RequestIterableType, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None) -> Any: |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -441,19 +488,23 @@ class _StreamUnaryMultiCallable(grpc.StreamUnaryMultiCallable): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _StreamStreamMultiCallable(grpc.StreamStreamMultiCallable): |
|
|
|
|
_thunk: Callable |
|
|
|
|
_method: str |
|
|
|
|
_interceptor: grpc.StreamStreamClientInterceptor |
|
|
|
|
|
|
|
|
|
def __init__(self, thunk, method, interceptor): |
|
|
|
|
def __init__(self, thunk: Callable, method: str, |
|
|
|
|
interceptor: grpc.StreamStreamClientInterceptor): |
|
|
|
|
self._thunk = thunk |
|
|
|
|
self._method = method |
|
|
|
|
self._interceptor = interceptor |
|
|
|
|
|
|
|
|
|
def __call__(self, |
|
|
|
|
request_iterator, |
|
|
|
|
timeout=None, |
|
|
|
|
metadata=None, |
|
|
|
|
credentials=None, |
|
|
|
|
wait_for_ready=None, |
|
|
|
|
compression=None): |
|
|
|
|
request_iterator: RequestIterableType, |
|
|
|
|
timeout: Optional[float] = None, |
|
|
|
|
metadata: Optional[MetadataType] = None, |
|
|
|
|
credentials: Optional[grpc.CallCredentials] = None, |
|
|
|
|
wait_for_ready: Optional[bool] = None, |
|
|
|
|
compression: Optional[grpc.Compression] = None): |
|
|
|
|
client_call_details = _ClientCallDetails(self._method, timeout, |
|
|
|
|
metadata, credentials, |
|
|
|
|
wait_for_ready, compression) |
|
|
|
@ -478,21 +529,34 @@ class _StreamStreamMultiCallable(grpc.StreamStreamMultiCallable): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class _Channel(grpc.Channel): |
|
|
|
|
|
|
|
|
|
def __init__(self, channel, interceptor): |
|
|
|
|
_channel: grpc.Channel |
|
|
|
|
_interceptor: Union[grpc.UnaryUnaryClientInterceptor, |
|
|
|
|
grpc.UnaryStreamClientInterceptor, |
|
|
|
|
grpc.StreamStreamClientInterceptor, |
|
|
|
|
grpc.StreamUnaryClientInterceptor] |
|
|
|
|
|
|
|
|
|
def __init__(self, channel: grpc.Channel, |
|
|
|
|
interceptor: Union[grpc.UnaryUnaryClientInterceptor, |
|
|
|
|
grpc.UnaryStreamClientInterceptor, |
|
|
|
|
grpc.StreamStreamClientInterceptor, |
|
|
|
|
grpc.StreamUnaryClientInterceptor]): |
|
|
|
|
self._channel = channel |
|
|
|
|
self._interceptor = interceptor |
|
|
|
|
|
|
|
|
|
def subscribe(self, callback, try_to_connect=False): |
|
|
|
|
def subscribe(self, |
|
|
|
|
callback: Callable, |
|
|
|
|
try_to_connect: Optional[bool] = False): |
|
|
|
|
self._channel.subscribe(callback, try_to_connect=try_to_connect) |
|
|
|
|
|
|
|
|
|
def unsubscribe(self, callback): |
|
|
|
|
def unsubscribe(self, callback: Callable): |
|
|
|
|
self._channel.unsubscribe(callback) |
|
|
|
|
|
|
|
|
|
def unary_unary(self, |
|
|
|
|
method, |
|
|
|
|
request_serializer=None, |
|
|
|
|
response_deserializer=None): |
|
|
|
|
def unary_unary( |
|
|
|
|
self, |
|
|
|
|
method: str, |
|
|
|
|
request_serializer: Optional[SerializingFunction] = None, |
|
|
|
|
response_deserializer: Optional[DeserializingFunction] = None |
|
|
|
|
) -> grpc.UnaryUnaryMultiCallable: |
|
|
|
|
thunk = lambda m: self._channel.unary_unary(m, request_serializer, |
|
|
|
|
response_deserializer) |
|
|
|
|
if isinstance(self._interceptor, grpc.UnaryUnaryClientInterceptor): |
|
|
|
@ -500,10 +564,12 @@ class _Channel(grpc.Channel): |
|
|
|
|
else: |
|
|
|
|
return thunk(method) |
|
|
|
|
|
|
|
|
|
def unary_stream(self, |
|
|
|
|
method, |
|
|
|
|
request_serializer=None, |
|
|
|
|
response_deserializer=None): |
|
|
|
|
def unary_stream( |
|
|
|
|
self, |
|
|
|
|
method: str, |
|
|
|
|
request_serializer: Optional[SerializingFunction] = None, |
|
|
|
|
response_deserializer: Optional[DeserializingFunction] = None |
|
|
|
|
) -> grpc.UnaryStreamMultiCallable: |
|
|
|
|
thunk = lambda m: self._channel.unary_stream(m, request_serializer, |
|
|
|
|
response_deserializer) |
|
|
|
|
if isinstance(self._interceptor, grpc.UnaryStreamClientInterceptor): |
|
|
|
@ -511,10 +577,12 @@ class _Channel(grpc.Channel): |
|
|
|
|
else: |
|
|
|
|
return thunk(method) |
|
|
|
|
|
|
|
|
|
def stream_unary(self, |
|
|
|
|
method, |
|
|
|
|
request_serializer=None, |
|
|
|
|
response_deserializer=None): |
|
|
|
|
def stream_unary( |
|
|
|
|
self, |
|
|
|
|
method: str, |
|
|
|
|
request_serializer: Optional[SerializingFunction] = None, |
|
|
|
|
response_deserializer: Optional[DeserializingFunction] = None |
|
|
|
|
) -> grpc.StreamUnaryMultiCallable: |
|
|
|
|
thunk = lambda m: self._channel.stream_unary(m, request_serializer, |
|
|
|
|
response_deserializer) |
|
|
|
|
if isinstance(self._interceptor, grpc.StreamUnaryClientInterceptor): |
|
|
|
@ -522,10 +590,12 @@ class _Channel(grpc.Channel): |
|
|
|
|
else: |
|
|
|
|
return thunk(method) |
|
|
|
|
|
|
|
|
|
def stream_stream(self, |
|
|
|
|
method, |
|
|
|
|
request_serializer=None, |
|
|
|
|
response_deserializer=None): |
|
|
|
|
def stream_stream( |
|
|
|
|
self, |
|
|
|
|
method: str, |
|
|
|
|
request_serializer: Optional[SerializingFunction] = None, |
|
|
|
|
response_deserializer: Optional[DeserializingFunction] = None |
|
|
|
|
) -> grpc.StreamStreamMultiCallable: |
|
|
|
|
thunk = lambda m: self._channel.stream_stream(m, request_serializer, |
|
|
|
|
response_deserializer) |
|
|
|
|
if isinstance(self._interceptor, grpc.StreamStreamClientInterceptor): |
|
|
|
@ -547,7 +617,13 @@ class _Channel(grpc.Channel): |
|
|
|
|
self._channel.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def intercept_channel(channel, *interceptors): |
|
|
|
|
def intercept_channel( |
|
|
|
|
channel: grpc.Channel, |
|
|
|
|
*interceptors: Optional[Sequence[Union[grpc.UnaryUnaryClientInterceptor, |
|
|
|
|
grpc.UnaryStreamClientInterceptor, |
|
|
|
|
grpc.StreamStreamClientInterceptor, |
|
|
|
|
grpc.StreamUnaryClientInterceptor]]] |
|
|
|
|
) -> grpc.Channel: |
|
|
|
|
for interceptor in reversed(list(interceptors)): |
|
|
|
|
if not isinstance(interceptor, grpc.UnaryUnaryClientInterceptor) and \ |
|
|
|
|
not isinstance(interceptor, grpc.UnaryStreamClientInterceptor) and \ |
|
|
|
|