Async/streaming gRPC client/server proto

This experiment was to fine-tune how we can implement
async gRPC client and server code inside a Twisted
python app.

Change-Id: I945014e27f4b9d6ed624666e0284cc298548adb3
diff --git a/experiments/streaming_pb2.py b/experiments/streaming_pb2.py
new file mode 100644
index 0000000..33fe7eb
--- /dev/null
+++ b/experiments/streaming_pb2.py
@@ -0,0 +1,380 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: streaming.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='streaming.proto',
+  package='experiment',
+  syntax='proto3',
+  serialized_pb=_b('\n\x0fstreaming.proto\x12\nexperiment\x1a\x1bgoogle/protobuf/empty.proto\"\x92\x01\n\nAsyncEvent\x12\x0b\n\x03seq\x18\x01 \x01(\x05\x12.\n\x04type\x18\x02 \x01(\x0e\x32 .experiment.AsyncEvent.EventType\x12\x0f\n\x07\x64\x65tails\x18\x03 \x01(\t\"6\n\tEventType\x12\x0c\n\x08\x42IG_BANG\x10\x00\x12\x0e\n\nSMALL_BANG\x10\x01\x12\x0b\n\x07NO_BANG\x10\x02\")\n\x06Packet\x12\x0e\n\x06source\x18\x01 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"\"\n\x04\x45\x63ho\x12\x0b\n\x03msg\x18\x01 \x01(\t\x12\r\n\x05\x64\x65lay\x18\x02 \x01(\x02\x32\x8c\x02\n\x13\x45xperimentalService\x12-\n\x07GetEcho\x12\x10.experiment.Echo\x1a\x10.experiment.Echo\x12I\n\x15ReceiveStreamedEvents\x12\x16.google.protobuf.Empty\x1a\x16.experiment.AsyncEvent0\x01\x12>\n\x0eReceivePackets\x12\x16.google.protobuf.Empty\x1a\x12.experiment.Packet0\x01\x12;\n\x0bSendPackets\x12\x12.experiment.Packet\x1a\x16.google.protobuf.Empty(\x01\x62\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+_ASYNCEVENT_EVENTTYPE = _descriptor.EnumDescriptor(
+  name='EventType',
+  full_name='experiment.AsyncEvent.EventType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='BIG_BANG', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SMALL_BANG', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NO_BANG', index=2, number=2,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=153,
+  serialized_end=207,
+)
+_sym_db.RegisterEnumDescriptor(_ASYNCEVENT_EVENTTYPE)
+
+
+_ASYNCEVENT = _descriptor.Descriptor(
+  name='AsyncEvent',
+  full_name='experiment.AsyncEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='seq', full_name='experiment.AsyncEvent.seq', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='experiment.AsyncEvent.type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='details', full_name='experiment.AsyncEvent.details', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _ASYNCEVENT_EVENTTYPE,
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=61,
+  serialized_end=207,
+)
+
+
+_PACKET = _descriptor.Descriptor(
+  name='Packet',
+  full_name='experiment.Packet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='source', full_name='experiment.Packet.source', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='content', full_name='experiment.Packet.content', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=209,
+  serialized_end=250,
+)
+
+
+_ECHO = _descriptor.Descriptor(
+  name='Echo',
+  full_name='experiment.Echo',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='msg', full_name='experiment.Echo.msg', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='delay', full_name='experiment.Echo.delay', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=252,
+  serialized_end=286,
+)
+
+_ASYNCEVENT.fields_by_name['type'].enum_type = _ASYNCEVENT_EVENTTYPE
+_ASYNCEVENT_EVENTTYPE.containing_type = _ASYNCEVENT
+DESCRIPTOR.message_types_by_name['AsyncEvent'] = _ASYNCEVENT
+DESCRIPTOR.message_types_by_name['Packet'] = _PACKET
+DESCRIPTOR.message_types_by_name['Echo'] = _ECHO
+
+AsyncEvent = _reflection.GeneratedProtocolMessageType('AsyncEvent', (_message.Message,), dict(
+  DESCRIPTOR = _ASYNCEVENT,
+  __module__ = 'streaming_pb2'
+  # @@protoc_insertion_point(class_scope:experiment.AsyncEvent)
+  ))
+_sym_db.RegisterMessage(AsyncEvent)
+
+Packet = _reflection.GeneratedProtocolMessageType('Packet', (_message.Message,), dict(
+  DESCRIPTOR = _PACKET,
+  __module__ = 'streaming_pb2'
+  # @@protoc_insertion_point(class_scope:experiment.Packet)
+  ))
+_sym_db.RegisterMessage(Packet)
+
+Echo = _reflection.GeneratedProtocolMessageType('Echo', (_message.Message,), dict(
+  DESCRIPTOR = _ECHO,
+  __module__ = 'streaming_pb2'
+  # @@protoc_insertion_point(class_scope:experiment.Echo)
+  ))
+_sym_db.RegisterMessage(Echo)
+
+
+import grpc
+from grpc.beta import implementations as beta_implementations
+from grpc.beta import interfaces as beta_interfaces
+from grpc.framework.common import cardinality
+from grpc.framework.interfaces.face import utilities as face_utilities
+
+
+class ExperimentalServiceStub(object):
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.GetEcho = channel.unary_unary(
+        '/experiment.ExperimentalService/GetEcho',
+        request_serializer=Echo.SerializeToString,
+        response_deserializer=Echo.FromString,
+        )
+    self.ReceiveStreamedEvents = channel.unary_stream(
+        '/experiment.ExperimentalService/ReceiveStreamedEvents',
+        request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+        response_deserializer=AsyncEvent.FromString,
+        )
+    self.ReceivePackets = channel.unary_stream(
+        '/experiment.ExperimentalService/ReceivePackets',
+        request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+        response_deserializer=Packet.FromString,
+        )
+    self.SendPackets = channel.stream_unary(
+        '/experiment.ExperimentalService/SendPackets',
+        request_serializer=Packet.SerializeToString,
+        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+        )
+
+
+class ExperimentalServiceServicer(object):
+
+  def GetEcho(self, request, context):
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ReceiveStreamedEvents(self, request, context):
+    """For server to send async stream to client
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def ReceivePackets(self, request, context):
+    """For server to send async packets to client
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def SendPackets(self, request_iterator, context):
+    """For client to send async packets to server
+    """
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_ExperimentalServiceServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'GetEcho': grpc.unary_unary_rpc_method_handler(
+          servicer.GetEcho,
+          request_deserializer=Echo.FromString,
+          response_serializer=Echo.SerializeToString,
+      ),
+      'ReceiveStreamedEvents': grpc.unary_stream_rpc_method_handler(
+          servicer.ReceiveStreamedEvents,
+          request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+          response_serializer=AsyncEvent.SerializeToString,
+      ),
+      'ReceivePackets': grpc.unary_stream_rpc_method_handler(
+          servicer.ReceivePackets,
+          request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+          response_serializer=Packet.SerializeToString,
+      ),
+      'SendPackets': grpc.stream_unary_rpc_method_handler(
+          servicer.SendPackets,
+          request_deserializer=Packet.FromString,
+          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'experiment.ExperimentalService', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
+
+
+class BetaExperimentalServiceServicer(object):
+  def GetEcho(self, request, context):
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ReceiveStreamedEvents(self, request, context):
+    """For server to send async stream to client
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def ReceivePackets(self, request, context):
+    """For server to send async packets to client
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+  def SendPackets(self, request_iterator, context):
+    """For client to send async packets to server
+    """
+    context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+class BetaExperimentalServiceStub(object):
+  def GetEcho(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    raise NotImplementedError()
+  GetEcho.future = None
+  def ReceiveStreamedEvents(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """For server to send async stream to client
+    """
+    raise NotImplementedError()
+  def ReceivePackets(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+    """For server to send async packets to client
+    """
+    raise NotImplementedError()
+  def SendPackets(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
+    """For client to send async packets to server
+    """
+    raise NotImplementedError()
+  SendPackets.future = None
+
+
+def beta_create_ExperimentalService_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+  request_deserializers = {
+    ('experiment.ExperimentalService', 'GetEcho'): Echo.FromString,
+    ('experiment.ExperimentalService', 'ReceivePackets'): google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+    ('experiment.ExperimentalService', 'ReceiveStreamedEvents'): google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+    ('experiment.ExperimentalService', 'SendPackets'): Packet.FromString,
+  }
+  response_serializers = {
+    ('experiment.ExperimentalService', 'GetEcho'): Echo.SerializeToString,
+    ('experiment.ExperimentalService', 'ReceivePackets'): Packet.SerializeToString,
+    ('experiment.ExperimentalService', 'ReceiveStreamedEvents'): AsyncEvent.SerializeToString,
+    ('experiment.ExperimentalService', 'SendPackets'): google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+  }
+  method_implementations = {
+    ('experiment.ExperimentalService', 'GetEcho'): face_utilities.unary_unary_inline(servicer.GetEcho),
+    ('experiment.ExperimentalService', 'ReceivePackets'): face_utilities.unary_stream_inline(servicer.ReceivePackets),
+    ('experiment.ExperimentalService', 'ReceiveStreamedEvents'): face_utilities.unary_stream_inline(servicer.ReceiveStreamedEvents),
+    ('experiment.ExperimentalService', 'SendPackets'): face_utilities.stream_unary_inline(servicer.SendPackets),
+  }
+  server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+  return beta_implementations.server(method_implementations, options=server_options)
+
+
+def beta_create_ExperimentalService_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+  request_serializers = {
+    ('experiment.ExperimentalService', 'GetEcho'): Echo.SerializeToString,
+    ('experiment.ExperimentalService', 'ReceivePackets'): google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+    ('experiment.ExperimentalService', 'ReceiveStreamedEvents'): google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+    ('experiment.ExperimentalService', 'SendPackets'): Packet.SerializeToString,
+  }
+  response_deserializers = {
+    ('experiment.ExperimentalService', 'GetEcho'): Echo.FromString,
+    ('experiment.ExperimentalService', 'ReceivePackets'): Packet.FromString,
+    ('experiment.ExperimentalService', 'ReceiveStreamedEvents'): AsyncEvent.FromString,
+    ('experiment.ExperimentalService', 'SendPackets'): google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+  }
+  cardinalities = {
+    'GetEcho': cardinality.Cardinality.UNARY_UNARY,
+    'ReceivePackets': cardinality.Cardinality.UNARY_STREAM,
+    'ReceiveStreamedEvents': cardinality.Cardinality.UNARY_STREAM,
+    'SendPackets': cardinality.Cardinality.STREAM_UNARY,
+  }
+  stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+  return beta_implementations.dynamic_stub(channel, 'experiment.ExperimentalService', cardinalities, options=stub_options)
+# @@protoc_insertion_point(module_scope)