Index: third_party/grpc/src/python/grpcio/grpc/framework/interfaces/links/links.py |
diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/links/links.py b/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/links/links.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..24f0e3b354517f90bb25ce53e1fd4e981c8a71be |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/links/links.py |
@@ -0,0 +1,142 @@ |
+# Copyright 2015, Google Inc. |
+# All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+"""The low-level ticket-exchanging-links interface of RPC Framework.""" |
+ |
+import abc |
+import collections |
+import enum |
+ |
+ |
+class Protocol(collections.namedtuple('Protocol', ('kind', 'value',))): |
+ """A sum type for handles to a system that transmits tickets. |
+ |
+ Attributes: |
+ kind: A Kind value identifying the kind of value being passed. |
+ value: The value being passed between the high-level application and the |
+ system affording ticket transport. |
+ """ |
+ |
+ @enum.unique |
+ class Kind(enum.Enum): |
+ CALL_OPTION = 'call option' |
+ SERVICER_CONTEXT = 'servicer context' |
+ INVOCATION_CONTEXT = 'invocation context' |
+ |
+ |
+class Ticket( |
+ collections.namedtuple( |
+ 'Ticket', |
+ ('operation_id', 'sequence_number', 'group', 'method', 'subscription', |
+ 'timeout', 'allowance', 'initial_metadata', 'payload', |
+ 'terminal_metadata', 'code', 'message', 'termination', 'protocol',))): |
+ """A sum type for all values sent from a front to a back. |
+ |
+ Attributes: |
+ operation_id: A unique-with-respect-to-equality hashable object identifying |
+ a particular operation. |
+ sequence_number: A zero-indexed integer sequence number identifying the |
+ ticket's place in the stream of tickets sent in one direction for the |
+ particular operation. |
+ group: The group to which the method of the operation belongs. Must be |
+ present in the first ticket from invocation side to service side. Ignored |
+ for all other tickets exchanged during the operation. |
+ method: The name of an operation. Must be present in the first ticket from |
+ invocation side to service side. Ignored for all other tickets exchanged |
+ during the operation. |
+ subscription: A Subscription value describing the interest one side has in |
+ receiving information from the other side. Must be present in the first |
+ ticket from either side. Ignored for all other tickets exchanged during |
+ the operation. |
+ timeout: A nonzero length of time (measured from the beginning of the |
+ operation) to allow for the entire operation. Must be present in the first |
+ ticket from invocation side to service side. Optional for all other |
+ tickets exchanged during the operation. Receipt of a value from the other |
+ side of the operation indicates the value in use by that side. Setting a |
+ value on a later ticket allows either side to request time extensions (or |
+ even time reductions!) on in-progress operations. |
+ allowance: A positive integer granting permission for a number of payloads |
+ to be transmitted to the communicating side of the operation, or None if |
+ no additional allowance is being granted with this ticket. |
+ initial_metadata: An optional metadata value communicated from one side to |
+ the other at the beginning of the operation. May be non-None in at most |
+ one ticket from each side. Any non-None value must appear no later than |
+ the first payload value. |
+ payload: A customer payload object. May be None. |
+ terminal_metadata: A metadata value comminicated from one side to the other |
+ at the end of the operation. May be non-None in the same ticket as |
+ the code and message, but must be None for all earlier tickets. |
+ code: A value communicated at operation completion. May be None. |
+ message: A value communicated at operation completion. May be None. |
+ termination: A Termination value describing the end of the operation, or |
+ None if the operation has not yet terminated. If set, no further tickets |
+ may be sent in the same direction. |
+ protocol: A Protocol value or None, with further semantics being a matter |
+ between high-level application and underlying ticket transport. |
+ """ |
+ |
+ @enum.unique |
+ class Subscription(enum.Enum): |
+ """Identifies the level of subscription of a side of an operation.""" |
+ |
+ NONE = 'none' |
+ TERMINATION = 'termination' |
+ FULL = 'full' |
+ |
+ @enum.unique |
+ class Termination(enum.Enum): |
+ """Identifies the termination of an operation.""" |
+ |
+ COMPLETION = 'completion' |
+ CANCELLATION = 'cancellation' |
+ EXPIRATION = 'expiration' |
+ SHUTDOWN = 'shutdown' |
+ RECEPTION_FAILURE = 'reception failure' |
+ TRANSMISSION_FAILURE = 'transmission failure' |
+ LOCAL_FAILURE = 'local failure' |
+ REMOTE_FAILURE = 'remote failure' |
+ |
+ |
+class Link(object): |
+ """Accepts and emits tickets.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def accept_ticket(self, ticket): |
+ """Accept a Ticket. |
+ |
+ Args: |
+ ticket: Any Ticket. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def join_link(self, link): |
+ """Mates this object with a peer with which it will exchange tickets.""" |
+ raise NotImplementedError() |