Merge branch 'floodsub-rpc' of https://github.com/libp2p/py-libp2p into floodsub-rpc
This commit is contained in:
commit
9be1214c44
76
libp2p/pubsub/pb/rpc.proto
Normal file
76
libp2p/pubsub/pb/rpc.proto
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
package pubsub.pb;
|
||||||
|
|
||||||
|
message RPC {
|
||||||
|
repeated SubOpts subscriptions = 1;
|
||||||
|
repeated Message publish = 2;
|
||||||
|
|
||||||
|
message SubOpts {
|
||||||
|
optional bool subscribe = 1; // subscribe or unsubcribe
|
||||||
|
optional string topicid = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
optional ControlMessage control = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Message {
|
||||||
|
optional bytes from_id = 1;
|
||||||
|
optional bytes data = 2;
|
||||||
|
optional bytes seqno = 3;
|
||||||
|
repeated string topicIDs = 4;
|
||||||
|
optional bytes signature = 5;
|
||||||
|
optional bytes key = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControlMessage {
|
||||||
|
repeated ControlIHave ihave = 1;
|
||||||
|
repeated ControlIWant iwant = 2;
|
||||||
|
repeated ControlGraft graft = 3;
|
||||||
|
repeated ControlPrune prune = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControlIHave {
|
||||||
|
optional string topicID = 1;
|
||||||
|
repeated string messageIDs = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControlIWant {
|
||||||
|
repeated string messageIDs = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControlGraft {
|
||||||
|
optional string topicID = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControlPrune {
|
||||||
|
optional string topicID = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TopicDescriptor {
|
||||||
|
optional string name = 1;
|
||||||
|
optional AuthOpts auth = 2;
|
||||||
|
optional EncOpts enc = 3;
|
||||||
|
|
||||||
|
message AuthOpts {
|
||||||
|
optional AuthMode mode = 1;
|
||||||
|
repeated bytes keys = 2; // root keys to trust
|
||||||
|
|
||||||
|
enum AuthMode {
|
||||||
|
NONE = 0; // no authentication, anyone can publish
|
||||||
|
KEY = 1; // only messages signed by keys in the topic descriptor are accepted
|
||||||
|
WOT = 2; // web of trust, certificates can allow publisher set to grow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message EncOpts {
|
||||||
|
optional EncMode mode = 1;
|
||||||
|
repeated bytes keyHashes = 2; // the hashes of the shared keys used (salted)
|
||||||
|
|
||||||
|
enum EncMode {
|
||||||
|
NONE = 0; // no encryption, anyone can read
|
||||||
|
SHAREDKEY = 1; // messages are encrypted with shared key
|
||||||
|
WOT = 2; // web of trust, certificates can allow publisher set to grow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
638
libp2p/pubsub/pb/rpc_pb2.py
Normal file
638
libp2p/pubsub/pb/rpc_pb2.py
Normal file
|
@ -0,0 +1,638 @@
|
||||||
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
# source: rpc.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
|
||||||
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
_sym_db = _symbol_database.Default()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTOR = _descriptor.FileDescriptor(
|
||||||
|
name='rpc.proto',
|
||||||
|
package='pubsub.pb',
|
||||||
|
syntax='proto2',
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_pb=_b('\n\trpc.proto\x12\tpubsub.pb\"\xb4\x01\n\x03RPC\x12-\n\rsubscriptions\x18\x01 \x03(\x0b\x32\x16.pubsub.pb.RPC.SubOpts\x12#\n\x07publish\x18\x02 \x03(\x0b\x32\x12.pubsub.pb.Message\x12*\n\x07\x63ontrol\x18\x03 \x01(\x0b\x32\x19.pubsub.pb.ControlMessage\x1a-\n\x07SubOpts\x12\x11\n\tsubscribe\x18\x01 \x01(\x08\x12\x0f\n\x07topicid\x18\x02 \x01(\t\"i\n\x07Message\x12\x0f\n\x07\x66rom_id\x18\x01 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\r\n\x05seqno\x18\x03 \x01(\x0c\x12\x10\n\x08topicIDs\x18\x04 \x03(\t\x12\x11\n\tsignature\x18\x05 \x01(\x0c\x12\x0b\n\x03key\x18\x06 \x01(\x0c\"\xb0\x01\n\x0e\x43ontrolMessage\x12&\n\x05ihave\x18\x01 \x03(\x0b\x32\x17.pubsub.pb.ControlIHave\x12&\n\x05iwant\x18\x02 \x03(\x0b\x32\x17.pubsub.pb.ControlIWant\x12&\n\x05graft\x18\x03 \x03(\x0b\x32\x17.pubsub.pb.ControlGraft\x12&\n\x05prune\x18\x04 \x03(\x0b\x32\x17.pubsub.pb.ControlPrune\"3\n\x0c\x43ontrolIHave\x12\x0f\n\x07topicID\x18\x01 \x01(\t\x12\x12\n\nmessageIDs\x18\x02 \x03(\t\"\"\n\x0c\x43ontrolIWant\x12\x12\n\nmessageIDs\x18\x01 \x03(\t\"\x1f\n\x0c\x43ontrolGraft\x12\x0f\n\x07topicID\x18\x01 \x01(\t\"\x1f\n\x0c\x43ontrolPrune\x12\x0f\n\x07topicID\x18\x01 \x01(\t\"\x87\x03\n\x0fTopicDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x31\n\x04\x61uth\x18\x02 \x01(\x0b\x32#.pubsub.pb.TopicDescriptor.AuthOpts\x12/\n\x03\x65nc\x18\x03 \x01(\x0b\x32\".pubsub.pb.TopicDescriptor.EncOpts\x1a|\n\x08\x41uthOpts\x12:\n\x04mode\x18\x01 \x01(\x0e\x32,.pubsub.pb.TopicDescriptor.AuthOpts.AuthMode\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\"&\n\x08\x41uthMode\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03KEY\x10\x01\x12\x07\n\x03WOT\x10\x02\x1a\x83\x01\n\x07\x45ncOpts\x12\x38\n\x04mode\x18\x01 \x01(\x0e\x32*.pubsub.pb.TopicDescriptor.EncOpts.EncMode\x12\x11\n\tkeyHashes\x18\x02 \x03(\x0c\"+\n\x07\x45ncMode\x12\x08\n\x04NONE\x10\x00\x12\r\n\tSHAREDKEY\x10\x01\x12\x07\n\x03WOT\x10\x02')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS_AUTHMODE = _descriptor.EnumDescriptor(
|
||||||
|
name='AuthMode',
|
||||||
|
full_name='pubsub.pb.TopicDescriptor.AuthOpts.AuthMode',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
values=[
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='NONE', index=0, number=0,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='KEY', index=1, number=1,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='WOT', index=2, number=2,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
],
|
||||||
|
containing_type=None,
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_start=868,
|
||||||
|
serialized_end=906,
|
||||||
|
)
|
||||||
|
_sym_db.RegisterEnumDescriptor(_TOPICDESCRIPTOR_AUTHOPTS_AUTHMODE)
|
||||||
|
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS_ENCMODE = _descriptor.EnumDescriptor(
|
||||||
|
name='EncMode',
|
||||||
|
full_name='pubsub.pb.TopicDescriptor.EncOpts.EncMode',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
values=[
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='NONE', index=0, number=0,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='SHAREDKEY', index=1, number=1,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
_descriptor.EnumValueDescriptor(
|
||||||
|
name='WOT', index=2, number=2,
|
||||||
|
serialized_options=None,
|
||||||
|
type=None),
|
||||||
|
],
|
||||||
|
containing_type=None,
|
||||||
|
serialized_options=None,
|
||||||
|
serialized_start=997,
|
||||||
|
serialized_end=1040,
|
||||||
|
)
|
||||||
|
_sym_db.RegisterEnumDescriptor(_TOPICDESCRIPTOR_ENCOPTS_ENCMODE)
|
||||||
|
|
||||||
|
|
||||||
|
_RPC_SUBOPTS = _descriptor.Descriptor(
|
||||||
|
name='SubOpts',
|
||||||
|
full_name='pubsub.pb.RPC.SubOpts',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='subscribe', full_name='pubsub.pb.RPC.SubOpts.subscribe', index=0,
|
||||||
|
number=1, type=8, cpp_type=7, label=1,
|
||||||
|
has_default_value=False, default_value=False,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='topicid', full_name='pubsub.pb.RPC.SubOpts.topicid', index=1,
|
||||||
|
number=2, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=160,
|
||||||
|
serialized_end=205,
|
||||||
|
)
|
||||||
|
|
||||||
|
_RPC = _descriptor.Descriptor(
|
||||||
|
name='RPC',
|
||||||
|
full_name='pubsub.pb.RPC',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='subscriptions', full_name='pubsub.pb.RPC.subscriptions', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='publish', full_name='pubsub.pb.RPC.publish', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='control', full_name='pubsub.pb.RPC.control', index=2,
|
||||||
|
number=3, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_RPC_SUBOPTS, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=25,
|
||||||
|
serialized_end=205,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_MESSAGE = _descriptor.Descriptor(
|
||||||
|
name='Message',
|
||||||
|
full_name='pubsub.pb.Message',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='from_id', full_name='pubsub.pb.Message.from_id', index=0,
|
||||||
|
number=1, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='data', full_name='pubsub.pb.Message.data', 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='seqno', full_name='pubsub.pb.Message.seqno', index=2,
|
||||||
|
number=3, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='topicIDs', full_name='pubsub.pb.Message.topicIDs', index=3,
|
||||||
|
number=4, type=9, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='signature', full_name='pubsub.pb.Message.signature', index=4,
|
||||||
|
number=5, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='key', full_name='pubsub.pb.Message.key', index=5,
|
||||||
|
number=6, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=207,
|
||||||
|
serialized_end=312,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CONTROLMESSAGE = _descriptor.Descriptor(
|
||||||
|
name='ControlMessage',
|
||||||
|
full_name='pubsub.pb.ControlMessage',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='ihave', full_name='pubsub.pb.ControlMessage.ihave', index=0,
|
||||||
|
number=1, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='iwant', full_name='pubsub.pb.ControlMessage.iwant', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='graft', full_name='pubsub.pb.ControlMessage.graft', index=2,
|
||||||
|
number=3, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='prune', full_name='pubsub.pb.ControlMessage.prune', index=3,
|
||||||
|
number=4, type=11, cpp_type=10, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=315,
|
||||||
|
serialized_end=491,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CONTROLIHAVE = _descriptor.Descriptor(
|
||||||
|
name='ControlIHave',
|
||||||
|
full_name='pubsub.pb.ControlIHave',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='topicID', full_name='pubsub.pb.ControlIHave.topicID', 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='messageIDs', full_name='pubsub.pb.ControlIHave.messageIDs', index=1,
|
||||||
|
number=2, type=9, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=493,
|
||||||
|
serialized_end=544,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CONTROLIWANT = _descriptor.Descriptor(
|
||||||
|
name='ControlIWant',
|
||||||
|
full_name='pubsub.pb.ControlIWant',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='messageIDs', full_name='pubsub.pb.ControlIWant.messageIDs', index=0,
|
||||||
|
number=1, type=9, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=546,
|
||||||
|
serialized_end=580,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CONTROLGRAFT = _descriptor.Descriptor(
|
||||||
|
name='ControlGraft',
|
||||||
|
full_name='pubsub.pb.ControlGraft',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='topicID', full_name='pubsub.pb.ControlGraft.topicID', 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=582,
|
||||||
|
serialized_end=613,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_CONTROLPRUNE = _descriptor.Descriptor(
|
||||||
|
name='ControlPrune',
|
||||||
|
full_name='pubsub.pb.ControlPrune',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='topicID', full_name='pubsub.pb.ControlPrune.topicID', 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=615,
|
||||||
|
serialized_end=646,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS = _descriptor.Descriptor(
|
||||||
|
name='AuthOpts',
|
||||||
|
full_name='pubsub.pb.TopicDescriptor.AuthOpts',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='mode', full_name='pubsub.pb.TopicDescriptor.AuthOpts.mode', index=0,
|
||||||
|
number=1, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='keys', full_name='pubsub.pb.TopicDescriptor.AuthOpts.keys', index=1,
|
||||||
|
number=2, type=12, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS_AUTHMODE,
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=782,
|
||||||
|
serialized_end=906,
|
||||||
|
)
|
||||||
|
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS = _descriptor.Descriptor(
|
||||||
|
name='EncOpts',
|
||||||
|
full_name='pubsub.pb.TopicDescriptor.EncOpts',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='mode', full_name='pubsub.pb.TopicDescriptor.EncOpts.mode', index=0,
|
||||||
|
number=1, 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='keyHashes', full_name='pubsub.pb.TopicDescriptor.EncOpts.keyHashes', index=1,
|
||||||
|
number=2, type=12, cpp_type=9, label=3,
|
||||||
|
has_default_value=False, default_value=[],
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[],
|
||||||
|
enum_types=[
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS_ENCMODE,
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=909,
|
||||||
|
serialized_end=1040,
|
||||||
|
)
|
||||||
|
|
||||||
|
_TOPICDESCRIPTOR = _descriptor.Descriptor(
|
||||||
|
name='TopicDescriptor',
|
||||||
|
full_name='pubsub.pb.TopicDescriptor',
|
||||||
|
filename=None,
|
||||||
|
file=DESCRIPTOR,
|
||||||
|
containing_type=None,
|
||||||
|
fields=[
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='name', full_name='pubsub.pb.TopicDescriptor.name', 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,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='auth', full_name='pubsub.pb.TopicDescriptor.auth', index=1,
|
||||||
|
number=2, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
_descriptor.FieldDescriptor(
|
||||||
|
name='enc', full_name='pubsub.pb.TopicDescriptor.enc', index=2,
|
||||||
|
number=3, type=11, cpp_type=10, label=1,
|
||||||
|
has_default_value=False, default_value=None,
|
||||||
|
message_type=None, enum_type=None, containing_type=None,
|
||||||
|
is_extension=False, extension_scope=None,
|
||||||
|
serialized_options=None, file=DESCRIPTOR),
|
||||||
|
],
|
||||||
|
extensions=[
|
||||||
|
],
|
||||||
|
nested_types=[_TOPICDESCRIPTOR_AUTHOPTS, _TOPICDESCRIPTOR_ENCOPTS, ],
|
||||||
|
enum_types=[
|
||||||
|
],
|
||||||
|
serialized_options=None,
|
||||||
|
is_extendable=False,
|
||||||
|
syntax='proto2',
|
||||||
|
extension_ranges=[],
|
||||||
|
oneofs=[
|
||||||
|
],
|
||||||
|
serialized_start=649,
|
||||||
|
serialized_end=1040,
|
||||||
|
)
|
||||||
|
|
||||||
|
_RPC_SUBOPTS.containing_type = _RPC
|
||||||
|
_RPC.fields_by_name['subscriptions'].message_type = _RPC_SUBOPTS
|
||||||
|
_RPC.fields_by_name['publish'].message_type = _MESSAGE
|
||||||
|
_RPC.fields_by_name['control'].message_type = _CONTROLMESSAGE
|
||||||
|
_CONTROLMESSAGE.fields_by_name['ihave'].message_type = _CONTROLIHAVE
|
||||||
|
_CONTROLMESSAGE.fields_by_name['iwant'].message_type = _CONTROLIWANT
|
||||||
|
_CONTROLMESSAGE.fields_by_name['graft'].message_type = _CONTROLGRAFT
|
||||||
|
_CONTROLMESSAGE.fields_by_name['prune'].message_type = _CONTROLPRUNE
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS.fields_by_name['mode'].enum_type = _TOPICDESCRIPTOR_AUTHOPTS_AUTHMODE
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS.containing_type = _TOPICDESCRIPTOR
|
||||||
|
_TOPICDESCRIPTOR_AUTHOPTS_AUTHMODE.containing_type = _TOPICDESCRIPTOR_AUTHOPTS
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS.fields_by_name['mode'].enum_type = _TOPICDESCRIPTOR_ENCOPTS_ENCMODE
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS.containing_type = _TOPICDESCRIPTOR
|
||||||
|
_TOPICDESCRIPTOR_ENCOPTS_ENCMODE.containing_type = _TOPICDESCRIPTOR_ENCOPTS
|
||||||
|
_TOPICDESCRIPTOR.fields_by_name['auth'].message_type = _TOPICDESCRIPTOR_AUTHOPTS
|
||||||
|
_TOPICDESCRIPTOR.fields_by_name['enc'].message_type = _TOPICDESCRIPTOR_ENCOPTS
|
||||||
|
DESCRIPTOR.message_types_by_name['RPC'] = _RPC
|
||||||
|
DESCRIPTOR.message_types_by_name['Message'] = _MESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['ControlMessage'] = _CONTROLMESSAGE
|
||||||
|
DESCRIPTOR.message_types_by_name['ControlIHave'] = _CONTROLIHAVE
|
||||||
|
DESCRIPTOR.message_types_by_name['ControlIWant'] = _CONTROLIWANT
|
||||||
|
DESCRIPTOR.message_types_by_name['ControlGraft'] = _CONTROLGRAFT
|
||||||
|
DESCRIPTOR.message_types_by_name['ControlPrune'] = _CONTROLPRUNE
|
||||||
|
DESCRIPTOR.message_types_by_name['TopicDescriptor'] = _TOPICDESCRIPTOR
|
||||||
|
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
|
||||||
|
|
||||||
|
RPC = _reflection.GeneratedProtocolMessageType('RPC', (_message.Message,), dict(
|
||||||
|
|
||||||
|
SubOpts = _reflection.GeneratedProtocolMessageType('SubOpts', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _RPC_SUBOPTS,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.RPC.SubOpts)
|
||||||
|
))
|
||||||
|
,
|
||||||
|
DESCRIPTOR = _RPC,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.RPC)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(RPC)
|
||||||
|
_sym_db.RegisterMessage(RPC.SubOpts)
|
||||||
|
|
||||||
|
Message = _reflection.GeneratedProtocolMessageType('Message', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _MESSAGE,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.Message)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(Message)
|
||||||
|
|
||||||
|
ControlMessage = _reflection.GeneratedProtocolMessageType('ControlMessage', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _CONTROLMESSAGE,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.ControlMessage)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(ControlMessage)
|
||||||
|
|
||||||
|
ControlIHave = _reflection.GeneratedProtocolMessageType('ControlIHave', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _CONTROLIHAVE,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.ControlIHave)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(ControlIHave)
|
||||||
|
|
||||||
|
ControlIWant = _reflection.GeneratedProtocolMessageType('ControlIWant', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _CONTROLIWANT,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.ControlIWant)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(ControlIWant)
|
||||||
|
|
||||||
|
ControlGraft = _reflection.GeneratedProtocolMessageType('ControlGraft', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _CONTROLGRAFT,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.ControlGraft)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(ControlGraft)
|
||||||
|
|
||||||
|
ControlPrune = _reflection.GeneratedProtocolMessageType('ControlPrune', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _CONTROLPRUNE,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.ControlPrune)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(ControlPrune)
|
||||||
|
|
||||||
|
TopicDescriptor = _reflection.GeneratedProtocolMessageType('TopicDescriptor', (_message.Message,), dict(
|
||||||
|
|
||||||
|
AuthOpts = _reflection.GeneratedProtocolMessageType('AuthOpts', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _TOPICDESCRIPTOR_AUTHOPTS,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.TopicDescriptor.AuthOpts)
|
||||||
|
))
|
||||||
|
,
|
||||||
|
|
||||||
|
EncOpts = _reflection.GeneratedProtocolMessageType('EncOpts', (_message.Message,), dict(
|
||||||
|
DESCRIPTOR = _TOPICDESCRIPTOR_ENCOPTS,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.TopicDescriptor.EncOpts)
|
||||||
|
))
|
||||||
|
,
|
||||||
|
DESCRIPTOR = _TOPICDESCRIPTOR,
|
||||||
|
__module__ = 'rpc_pb2'
|
||||||
|
# @@protoc_insertion_point(class_scope:pubsub.pb.TopicDescriptor)
|
||||||
|
))
|
||||||
|
_sym_db.RegisterMessage(TopicDescriptor)
|
||||||
|
_sym_db.RegisterMessage(TopicDescriptor.AuthOpts)
|
||||||
|
_sym_db.RegisterMessage(TopicDescriptor.EncOpts)
|
||||||
|
|
||||||
|
|
||||||
|
# @@protoc_insertion_point(module_scope)
|
3
libp2p/pubsub/pb/rpc_pb2_grpc.py
Normal file
3
libp2p/pubsub/pb/rpc_pb2_grpc.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
||||||
|
import grpc
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
from .pb import rpc_pb2_grpc
|
||||||
|
from .pb import rpc_pb2
|
||||||
from .pubsub_notifee import PubsubNotifee
|
from .pubsub_notifee import PubsubNotifee
|
||||||
from .message import MessageSub
|
from .message import MessageSub
|
||||||
from .message import create_message_talk, create_message_sub
|
from .message import create_message_talk, create_message_sub
|
||||||
|
@ -7,37 +9,6 @@ from. message import generate_message_id
|
||||||
|
|
||||||
|
|
||||||
class Pubsub():
|
class Pubsub():
|
||||||
"""
|
|
||||||
For now, because I'm on a plane and don't have access to the go repo/protobuf stuff,
|
|
||||||
this is going to be the message format for the two types: subscription and talk
|
|
||||||
subscription indicates subscribing or unsubscribing from a topic
|
|
||||||
talk is sending a message on topic(s)
|
|
||||||
subscription format:
|
|
||||||
subscription
|
|
||||||
'from'
|
|
||||||
<one of 'sub', 'unsub'>:'topicid'
|
|
||||||
<one of 'sub', 'unsub'>:'topicid'
|
|
||||||
...
|
|
||||||
Ex.
|
|
||||||
subscription
|
|
||||||
msg_sender_peer_id
|
|
||||||
origin_peer_id
|
|
||||||
sub:topic1
|
|
||||||
sub:topic2
|
|
||||||
unsub:fav_topic
|
|
||||||
talk format:
|
|
||||||
talk
|
|
||||||
'from'
|
|
||||||
'origin'
|
|
||||||
[topic_ids comma-delimited]
|
|
||||||
'data'
|
|
||||||
Ex.
|
|
||||||
talk
|
|
||||||
msg_sender_peer_id
|
|
||||||
origin_peer_id
|
|
||||||
topic1,topics_are_cool,foo
|
|
||||||
I like tacos
|
|
||||||
"""
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
# pylint: disable=too-many-instance-attributes
|
||||||
|
|
||||||
def __init__(self, host, router, my_id):
|
def __init__(self, host, router, my_id):
|
||||||
|
@ -90,34 +61,37 @@ class Pubsub():
|
||||||
"""
|
"""
|
||||||
Generate subscription message with all topics we are subscribed to
|
Generate subscription message with all topics we are subscribed to
|
||||||
"""
|
"""
|
||||||
subs_map = {}
|
packet = rpc_pb2.RPC()
|
||||||
for topic in self.my_topics:
|
message = rpc_pb2.Message(
|
||||||
subs_map[topic] = True
|
from_id=str(self.host.get_id()).encode('utf-8'),
|
||||||
sub_msg = MessageSub(
|
seqno=str(generate_message_id()).encode('utf-8')
|
||||||
str(self.host.get_id()),\
|
|
||||||
str(self.host.get_id()), subs_map, generate_message_id()\
|
|
||||||
)
|
)
|
||||||
return sub_msg.to_str()
|
packet.publish.extend([message])
|
||||||
|
for topic_id in self.my_topics:
|
||||||
|
packet.subscriptions.extend([rpc_pb2.RPC.SubOpts(
|
||||||
|
subscribe=True, topicid=topic_id)])
|
||||||
|
|
||||||
|
return packet.SerializeToString()
|
||||||
|
|
||||||
async def continously_read_stream(self, stream):
|
async def continously_read_stream(self, stream):
|
||||||
"""
|
"""
|
||||||
Read from input stream in an infinite loop. Process
|
Read from input stream in an infinite loop. Process
|
||||||
messages from other nodes, which for now are considered MessageTalk
|
messages from other nodes, which for now are considered MessageTalk
|
||||||
and MessageSub messages.
|
and MessageSub messages.
|
||||||
TODO: Handle RPC messages instead of my Aspyn's own custom message format
|
|
||||||
:param stream: stream to continously read from
|
:param stream: stream to continously read from
|
||||||
"""
|
"""
|
||||||
while True:
|
while True:
|
||||||
incoming = (await stream.read()).decode()
|
incoming = (await stream.read())
|
||||||
msg_comps = incoming.split('\n')
|
rpc_incoming = rpc_pb2.RPC()
|
||||||
msg_type = msg_comps[0]
|
rpc_incoming.ParseFromString(incoming)
|
||||||
|
print (rpc_incoming.publish)
|
||||||
|
|
||||||
msg_sender = msg_comps[1]
|
# msg_type = msg_comps[0]
|
||||||
|
|
||||||
|
msg_sender = rpc_incoming.publish.from_id
|
||||||
# msg_origin = msg_comps[2]
|
# msg_origin = msg_comps[2]
|
||||||
msg_id = msg_comps[3]
|
msg_id = rpc_incoming.publish.seqno
|
||||||
print("HIT ME1")
|
|
||||||
if msg_id not in self.seen_messages:
|
if msg_id not in self.seen_messages:
|
||||||
print("HIT ME")
|
|
||||||
# Do stuff with incoming unseen message
|
# Do stuff with incoming unseen message
|
||||||
should_publish = True
|
should_publish = True
|
||||||
if msg_type == "subscription":
|
if msg_type == "subscription":
|
||||||
|
@ -161,7 +135,7 @@ class Pubsub():
|
||||||
|
|
||||||
# Send hello packet
|
# Send hello packet
|
||||||
hello = self.get_hello_packet()
|
hello = self.get_hello_packet()
|
||||||
await stream.write(hello.encode())
|
await stream.write(hello)
|
||||||
# Pass stream off to stream reader
|
# Pass stream off to stream reader
|
||||||
asyncio.ensure_future(self.continously_read_stream(stream))
|
asyncio.ensure_future(self.continously_read_stream(stream))
|
||||||
|
|
||||||
|
@ -187,7 +161,7 @@ class Pubsub():
|
||||||
|
|
||||||
# Send hello packet
|
# Send hello packet
|
||||||
hello = self.get_hello_packet()
|
hello = self.get_hello_packet()
|
||||||
await stream.write(hello.encode())
|
await stream.write(hello)
|
||||||
|
|
||||||
# Pass stream off to stream reader
|
# Pass stream off to stream reader
|
||||||
asyncio.ensure_future(self.continously_read_stream(stream))
|
asyncio.ensure_future(self.continously_read_stream(stream))
|
||||||
|
|
|
@ -3,3 +3,5 @@ codecov
|
||||||
pytest-cov
|
pytest-cov
|
||||||
pytest-asyncio
|
pytest-asyncio
|
||||||
pylint
|
pylint
|
||||||
|
grpcio
|
||||||
|
grpcio-tools
|
||||||
|
|
Loading…
Reference in New Issue
Block a user