Spaces:
Running
Running
# Copyright 2020 The gRPC Authors | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
"""Abstract base classes for Channel objects and Multicallable objects.""" | |
import abc | |
from typing import Generic, Optional | |
import grpc | |
from . import _base_call | |
from ._typing import DeserializingFunction | |
from ._typing import MetadataType | |
from ._typing import RequestIterableType | |
from ._typing import RequestType | |
from ._typing import ResponseType | |
from ._typing import SerializingFunction | |
class UnaryUnaryMultiCallable(Generic[RequestType, ResponseType], abc.ABC): | |
"""Enables asynchronous invocation of a unary-call RPC.""" | |
def __call__( | |
self, | |
request: RequestType, | |
*, | |
timeout: Optional[float] = None, | |
metadata: Optional[MetadataType] = None, | |
credentials: Optional[grpc.CallCredentials] = None, | |
wait_for_ready: Optional[bool] = None, | |
compression: Optional[grpc.Compression] = None, | |
) -> _base_call.UnaryUnaryCall[RequestType, ResponseType]: | |
"""Asynchronously invokes the underlying RPC. | |
Args: | |
request: The request value for the RPC. | |
timeout: An optional duration of time in seconds to allow | |
for the RPC. | |
metadata: Optional :term:`metadata` to be transmitted to the | |
service-side of the RPC. | |
credentials: An optional CallCredentials for the RPC. Only valid for | |
secure Channel. | |
wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. | |
compression: An element of grpc.compression, e.g. | |
grpc.compression.Gzip. | |
Returns: | |
A UnaryUnaryCall object. | |
Raises: | |
RpcError: Indicates that the RPC terminated with non-OK status. The | |
raised RpcError will also be a Call for the RPC affording the RPC's | |
metadata, status code, and details. | |
""" | |
class UnaryStreamMultiCallable(Generic[RequestType, ResponseType], abc.ABC): | |
"""Enables asynchronous invocation of a server-streaming RPC.""" | |
def __call__( | |
self, | |
request: RequestType, | |
*, | |
timeout: Optional[float] = None, | |
metadata: Optional[MetadataType] = None, | |
credentials: Optional[grpc.CallCredentials] = None, | |
wait_for_ready: Optional[bool] = None, | |
compression: Optional[grpc.Compression] = None, | |
) -> _base_call.UnaryStreamCall[RequestType, ResponseType]: | |
"""Asynchronously invokes the underlying RPC. | |
Args: | |
request: The request value for the RPC. | |
timeout: An optional duration of time in seconds to allow | |
for the RPC. | |
metadata: Optional :term:`metadata` to be transmitted to the | |
service-side of the RPC. | |
credentials: An optional CallCredentials for the RPC. Only valid for | |
secure Channel. | |
wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. | |
compression: An element of grpc.compression, e.g. | |
grpc.compression.Gzip. | |
Returns: | |
A UnaryStreamCall object. | |
Raises: | |
RpcError: Indicates that the RPC terminated with non-OK status. The | |
raised RpcError will also be a Call for the RPC affording the RPC's | |
metadata, status code, and details. | |
""" | |
class StreamUnaryMultiCallable(abc.ABC): | |
"""Enables asynchronous invocation of a client-streaming RPC.""" | |
def __call__( | |
self, | |
request_iterator: Optional[RequestIterableType] = None, | |
timeout: Optional[float] = None, | |
metadata: Optional[MetadataType] = None, | |
credentials: Optional[grpc.CallCredentials] = None, | |
wait_for_ready: Optional[bool] = None, | |
compression: Optional[grpc.Compression] = None, | |
) -> _base_call.StreamUnaryCall: | |
"""Asynchronously invokes the underlying RPC. | |
Args: | |
request_iterator: An optional async iterable or iterable of request | |
messages for the RPC. | |
timeout: An optional duration of time in seconds to allow | |
for the RPC. | |
metadata: Optional :term:`metadata` to be transmitted to the | |
service-side of the RPC. | |
credentials: An optional CallCredentials for the RPC. Only valid for | |
secure Channel. | |
wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. | |
compression: An element of grpc.compression, e.g. | |
grpc.compression.Gzip. | |
Returns: | |
A StreamUnaryCall object. | |
Raises: | |
RpcError: Indicates that the RPC terminated with non-OK status. The | |
raised RpcError will also be a Call for the RPC affording the RPC's | |
metadata, status code, and details. | |
""" | |
class StreamStreamMultiCallable(abc.ABC): | |
"""Enables asynchronous invocation of a bidirectional-streaming RPC.""" | |
def __call__( | |
self, | |
request_iterator: Optional[RequestIterableType] = None, | |
timeout: Optional[float] = None, | |
metadata: Optional[MetadataType] = None, | |
credentials: Optional[grpc.CallCredentials] = None, | |
wait_for_ready: Optional[bool] = None, | |
compression: Optional[grpc.Compression] = None, | |
) -> _base_call.StreamStreamCall: | |
"""Asynchronously invokes the underlying RPC. | |
Args: | |
request_iterator: An optional async iterable or iterable of request | |
messages for the RPC. | |
timeout: An optional duration of time in seconds to allow | |
for the RPC. | |
metadata: Optional :term:`metadata` to be transmitted to the | |
service-side of the RPC. | |
credentials: An optional CallCredentials for the RPC. Only valid for | |
secure Channel. | |
wait_for_ready: An optional flag to enable :term:`wait_for_ready` mechanism. | |
compression: An element of grpc.compression, e.g. | |
grpc.compression.Gzip. | |
Returns: | |
A StreamStreamCall object. | |
Raises: | |
RpcError: Indicates that the RPC terminated with non-OK status. The | |
raised RpcError will also be a Call for the RPC affording the RPC's | |
metadata, status code, and details. | |
""" | |
class Channel(abc.ABC): | |
"""Enables asynchronous RPC invocation as a client. | |
Channel objects implement the Asynchronous Context Manager (aka. async | |
with) type, although they are not supportted to be entered and exited | |
multiple times. | |
""" | |
async def __aenter__(self): | |
"""Starts an asynchronous context manager. | |
Returns: | |
Channel the channel that was instantiated. | |
""" | |
async def __aexit__(self, exc_type, exc_val, exc_tb): | |
"""Finishes the asynchronous context manager by closing the channel. | |
Still active RPCs will be cancelled. | |
""" | |
async def close(self, grace: Optional[float] = None): | |
"""Closes this Channel and releases all resources held by it. | |
This method immediately stops the channel from executing new RPCs in | |
all cases. | |
If a grace period is specified, this method waits until all active | |
RPCs are finished or until the grace period is reached. RPCs that haven't | |
been terminated within the grace period are aborted. | |
If a grace period is not specified (by passing None for grace), | |
all existing RPCs are cancelled immediately. | |
This method is idempotent. | |
""" | |
def get_state( | |
self, try_to_connect: bool = False | |
) -> grpc.ChannelConnectivity: | |
"""Checks the connectivity state of a channel. | |
This is an EXPERIMENTAL API. | |
If the channel reaches a stable connectivity state, it is guaranteed | |
that the return value of this function will eventually converge to that | |
state. | |
Args: | |
try_to_connect: a bool indicate whether the Channel should try to | |
connect to peer or not. | |
Returns: A ChannelConnectivity object. | |
""" | |
async def wait_for_state_change( | |
self, | |
last_observed_state: grpc.ChannelConnectivity, | |
) -> None: | |
"""Waits for a change in connectivity state. | |
This is an EXPERIMENTAL API. | |
The function blocks until there is a change in the channel connectivity | |
state from the "last_observed_state". If the state is already | |
different, this function will return immediately. | |
There is an inherent race between the invocation of | |
"Channel.wait_for_state_change" and "Channel.get_state". The state can | |
change arbitrary many times during the race, so there is no way to | |
observe every state transition. | |
If there is a need to put a timeout for this function, please refer to | |
"asyncio.wait_for". | |
Args: | |
last_observed_state: A grpc.ChannelConnectivity object representing | |
the last known state. | |
""" | |
async def channel_ready(self) -> None: | |
"""Creates a coroutine that blocks until the Channel is READY.""" | |
def unary_unary( | |
self, | |
method: str, | |
request_serializer: Optional[SerializingFunction] = None, | |
response_deserializer: Optional[DeserializingFunction] = None, | |
_registered_method: Optional[bool] = False, | |
) -> UnaryUnaryMultiCallable: | |
"""Creates a UnaryUnaryMultiCallable for a unary-unary method. | |
Args: | |
method: The name of the RPC method. | |
request_serializer: Optional :term:`serializer` for serializing the request | |
message. Request goes unserialized in case None is passed. | |
response_deserializer: Optional :term:`deserializer` for deserializing the | |
response message. Response goes undeserialized in case None | |
is passed. | |
_registered_method: Implementation Private. Optional: A bool representing | |
whether the method is registered. | |
Returns: | |
A UnaryUnaryMultiCallable value for the named unary-unary method. | |
""" | |
def unary_stream( | |
self, | |
method: str, | |
request_serializer: Optional[SerializingFunction] = None, | |
response_deserializer: Optional[DeserializingFunction] = None, | |
_registered_method: Optional[bool] = False, | |
) -> UnaryStreamMultiCallable: | |
"""Creates a UnaryStreamMultiCallable for a unary-stream method. | |
Args: | |
method: The name of the RPC method. | |
request_serializer: Optional :term:`serializer` for serializing the request | |
message. Request goes unserialized in case None is passed. | |
response_deserializer: Optional :term:`deserializer` for deserializing the | |
response message. Response goes undeserialized in case None | |
is passed. | |
_registered_method: Implementation Private. Optional: A bool representing | |
whether the method is registered. | |
Returns: | |
A UnarySteramMultiCallable value for the named unary-stream method. | |
""" | |
def stream_unary( | |
self, | |
method: str, | |
request_serializer: Optional[SerializingFunction] = None, | |
response_deserializer: Optional[DeserializingFunction] = None, | |
_registered_method: Optional[bool] = False, | |
) -> StreamUnaryMultiCallable: | |
"""Creates a StreamUnaryMultiCallable for a stream-unary method. | |
Args: | |
method: The name of the RPC method. | |
request_serializer: Optional :term:`serializer` for serializing the request | |
message. Request goes unserialized in case None is passed. | |
response_deserializer: Optional :term:`deserializer` for deserializing the | |
response message. Response goes undeserialized in case None | |
is passed. | |
_registered_method: Implementation Private. Optional: A bool representing | |
whether the method is registered. | |
Returns: | |
A StreamUnaryMultiCallable value for the named stream-unary method. | |
""" | |
def stream_stream( | |
self, | |
method: str, | |
request_serializer: Optional[SerializingFunction] = None, | |
response_deserializer: Optional[DeserializingFunction] = None, | |
_registered_method: Optional[bool] = False, | |
) -> StreamStreamMultiCallable: | |
"""Creates a StreamStreamMultiCallable for a stream-stream method. | |
Args: | |
method: The name of the RPC method. | |
request_serializer: Optional :term:`serializer` for serializing the request | |
message. Request goes unserialized in case None is passed. | |
response_deserializer: Optional :term:`deserializer` for deserializing the | |
response message. Response goes undeserialized in case None | |
is passed. | |
_registered_method: Implementation Private. Optional: A bool representing | |
whether the method is registered. | |
Returns: | |
A StreamStreamMultiCallable value for the named stream-stream method. | |
""" | |