diff --git a/client/rpc/utils/utils.go b/client/rpc/utils/utils.go index c9f0fa9..c5c220d 100644 --- a/client/rpc/utils/utils.go +++ b/client/rpc/utils/utils.go @@ -19,10 +19,15 @@ import ( "encoding/binary" "github.com/golang/protobuf/proto" "io" + "math" ) const ( maxRequestSize = 1048576 // 1MB + + varintTwoBytes = 0xfd + varintFourBytes = 0xfe + varintEightBytes = 0xff ) @@ -41,7 +46,7 @@ func ReadProtoMessage(msg proto.Message, r io.Reader) error { if !ok { reader = bufio.NewReader(r) } - length64, err := binary.ReadVarint(reader) + length64, err := ReadVarUintSimple(reader) if err != nil { return err } @@ -61,7 +66,7 @@ func ReadProtoMessage(msg proto.Message, r io.Reader) error { // Apache 2.0 license func encodeByteSlice(w io.Writer, bz []byte) (err error) { - err = encodeVarint(w, int64(len(bz))) + err = encodeVarint(w, uint64(len(bz))) if err != nil { return } @@ -69,9 +74,77 @@ func encodeByteSlice(w io.Writer, bz []byte) (err error) { return } -func encodeVarint(w io.Writer, i int64) (err error) { +func encodeVarint(w io.Writer, i uint64) (err error) { var buf [10]byte - n := binary.PutVarint(buf[:], i) + n := PutVarUintSimple(buf[:], i) _, err = w.Write(buf[0:n]) return -} \ No newline at end of file +} + +// Bitcoin-style variable uints +// https://learnmeabitcoin.com/guide/varint + +func PutVarUintSimple(buffer []byte, value uint64) uint { + if value < varintTwoBytes { + buffer[0] = uint8(value) + return 1 + } else if value <= math.MaxUint16 { + buffer[0] = uint8(varintTwoBytes) + binary.BigEndian.PutUint16(buffer[1:], uint16(value)) + return 3 + } else if value <= math.MaxUint32 { + buffer[0] = uint8(varintFourBytes) + binary.BigEndian.PutUint32(buffer[1:], uint32(value)) + return 5 + } else { + buffer[0] = uint8(varintEightBytes) + binary.BigEndian.PutUint64(buffer[1:], uint64(value)) + return 9 + } +} + +func ReadNBytes(reader io.ByteReader, buffer []byte, number_bytes int) error { + for i := 0; i < number_bytes; i++ { + value, err := reader.ReadByte() + if err != nil { + return err + } + buffer[i] = value + } + return nil +} + +func ReadVarUintSimple(reader io.ByteReader) (uint64, error) { + value, err := reader.ReadByte() + if err != nil { + return 0, err + } + + switch value { + case varintEightBytes: + buffer := make([]byte, 8) + err = ReadNBytes(reader, buffer, 8) + if err != nil { + return 0, err + } + return binary.BigEndian.Uint64(buffer), nil + case varintFourBytes: + buffer := make([]byte, 4) + err = ReadNBytes(reader, buffer, 4) + if err != nil { + return 0, err + } + return uint64(binary.BigEndian.Uint32(buffer)), nil + case varintTwoBytes: + buffer := make([]byte, 2) + err = ReadNBytes(reader, buffer, 2) + if err != nil { + return 0, err + } + return uint64(binary.BigEndian.Uint16(buffer)), nil + default: + return uint64(value), nil + } + return 0, nil +} + diff --git a/extern/python-tcp-example/proto/__init__.py b/extern/python-tcp-example/proto/__init__.py new file mode 100644 index 0000000..7973c8d --- /dev/null +++ b/extern/python-tcp-example/proto/__init__.py @@ -0,0 +1,4 @@ +import proto.structs_pb2 as config +import proto.types_pb2 as types +import proto.message_pb2 as message + diff --git a/extern/python-tcp-example/proto/message.proto b/extern/python-tcp-example/proto/message.proto new file mode 100644 index 0000000..458f27f --- /dev/null +++ b/extern/python-tcp-example/proto/message.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package message; + +// fields are actually ordered in the order of priority for implementation +message ChatMessage { + bytes Content = 1; + bytes SenderPublicKey = 2; + bytes SenderProviderPublicKey = 3; + int64 MessageNonce = 4; + int64 SenderTimestamp = 5; // in unix nano + bytes Signature = 6; +} \ No newline at end of file diff --git a/extern/python-tcp-example/proto/message_pb2.py b/extern/python-tcp-example/proto/message_pb2.py new file mode 100644 index 0000000..e254114 --- /dev/null +++ b/extern/python-tcp-example/proto/message_pb2.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: message.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='message.proto', + package='message', + syntax='proto3', + serialized_options=None, + serialized_pb=_b('\n\rmessage.proto\x12\x07message\"\x9a\x01\n\x0b\x43hatMessage\x12\x0f\n\x07\x43ontent\x18\x01 \x01(\x0c\x12\x17\n\x0fSenderPublicKey\x18\x02 \x01(\x0c\x12\x1f\n\x17SenderProviderPublicKey\x18\x03 \x01(\x0c\x12\x14\n\x0cMessageNonce\x18\x04 \x01(\x03\x12\x17\n\x0fSenderTimestamp\x18\x05 \x01(\x03\x12\x11\n\tSignature\x18\x06 \x01(\x0c\x62\x06proto3') +) + + + + +_CHATMESSAGE = _descriptor.Descriptor( + name='ChatMessage', + full_name='message.ChatMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Content', full_name='message.ChatMessage.Content', 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='SenderPublicKey', full_name='message.ChatMessage.SenderPublicKey', 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='SenderProviderPublicKey', full_name='message.ChatMessage.SenderProviderPublicKey', 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='MessageNonce', full_name='message.ChatMessage.MessageNonce', index=3, + number=4, type=3, cpp_type=2, 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='SenderTimestamp', full_name='message.ChatMessage.SenderTimestamp', index=4, + number=5, type=3, cpp_type=2, 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='Signature', full_name='message.ChatMessage.Signature', 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='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=27, + serialized_end=181, +) + +DESCRIPTOR.message_types_by_name['ChatMessage'] = _CHATMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ChatMessage = _reflection.GeneratedProtocolMessageType('ChatMessage', (_message.Message,), { + 'DESCRIPTOR' : _CHATMESSAGE, + '__module__' : 'message_pb2' + # @@protoc_insertion_point(class_scope:message.ChatMessage) + }) +_sym_db.RegisterMessage(ChatMessage) + + +# @@protoc_insertion_point(module_scope) diff --git a/extern/python-tcp-example/proto/structs.proto b/extern/python-tcp-example/proto/structs.proto new file mode 100644 index 0000000..1fc950a --- /dev/null +++ b/extern/python-tcp-example/proto/structs.proto @@ -0,0 +1,35 @@ +syntax = "proto3"; +package config; + +option go_package = "github.com/nymtech/nym-mixnet/config"; + +message MixConfig { + string Id = 1; + string Host = 2; + string Port = 3; + bytes PubKey = 4; + uint64 Layer = 5; +} + +message ClientConfig { + string Id = 1; + string Host = 2; + string Port = 3; + bytes PubKey = 4; + MixConfig Provider = 5; +} + +message GeneralPacket { + bytes Flag = 1; + bytes Data = 2; +} + +message ProviderResponse { + uint64 NumberOfPackets = 1; + repeated bytes Packets = 2; +} + +message PullRequest { + bytes Token = 1; + bytes ClientPublicKey = 2; +} diff --git a/extern/python-tcp-example/proto/structs_pb2.py b/extern/python-tcp-example/proto/structs_pb2.py new file mode 100644 index 0000000..ccfa19e --- /dev/null +++ b/extern/python-tcp-example/proto/structs_pb2.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: structs.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='structs.proto', + package='config', + syntax='proto3', + serialized_options=_b('Z$github.com/nymtech/nym-mixnet/config'), + serialized_pb=_b('\n\rstructs.proto\x12\x06\x63onfig\"R\n\tMixConfig\x12\n\n\x02Id\x18\x01 \x01(\t\x12\x0c\n\x04Host\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\t\x12\x0e\n\x06PubKey\x18\x04 \x01(\x0c\x12\r\n\x05Layer\x18\x05 \x01(\x04\"k\n\x0c\x43lientConfig\x12\n\n\x02Id\x18\x01 \x01(\t\x12\x0c\n\x04Host\x18\x02 \x01(\t\x12\x0c\n\x04Port\x18\x03 \x01(\t\x12\x0e\n\x06PubKey\x18\x04 \x01(\x0c\x12#\n\x08Provider\x18\x05 \x01(\x0b\x32\x11.config.MixConfig\"+\n\rGeneralPacket\x12\x0c\n\x04\x46lag\x18\x01 \x01(\x0c\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\"<\n\x10ProviderResponse\x12\x17\n\x0fNumberOfPackets\x18\x01 \x01(\x04\x12\x0f\n\x07Packets\x18\x02 \x03(\x0c\"5\n\x0bPullRequest\x12\r\n\x05Token\x18\x01 \x01(\x0c\x12\x17\n\x0f\x43lientPublicKey\x18\x02 \x01(\x0c\x42&Z$github.com/nymtech/nym-mixnet/configb\x06proto3') +) + + + + +_MIXCONFIG = _descriptor.Descriptor( + name='MixConfig', + full_name='config.MixConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='config.MixConfig.Id', 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='Host', full_name='config.MixConfig.Host', 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), + _descriptor.FieldDescriptor( + name='Port', full_name='config.MixConfig.Port', 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, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='PubKey', full_name='config.MixConfig.PubKey', index=3, + number=4, 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='Layer', full_name='config.MixConfig.Layer', index=4, + number=5, type=4, cpp_type=4, 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=25, + serialized_end=107, +) + + +_CLIENTCONFIG = _descriptor.Descriptor( + name='ClientConfig', + full_name='config.ClientConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='config.ClientConfig.Id', 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='Host', full_name='config.ClientConfig.Host', 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), + _descriptor.FieldDescriptor( + name='Port', full_name='config.ClientConfig.Port', 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, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='PubKey', full_name='config.ClientConfig.PubKey', index=3, + number=4, 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='Provider', full_name='config.ClientConfig.Provider', index=4, + number=5, 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=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=109, + serialized_end=216, +) + + +_GENERALPACKET = _descriptor.Descriptor( + name='GeneralPacket', + full_name='config.GeneralPacket', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Flag', full_name='config.GeneralPacket.Flag', 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='config.GeneralPacket.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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=218, + serialized_end=261, +) + + +_PROVIDERRESPONSE = _descriptor.Descriptor( + name='ProviderResponse', + full_name='config.ProviderResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='NumberOfPackets', full_name='config.ProviderResponse.NumberOfPackets', index=0, + number=1, type=4, cpp_type=4, 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='Packets', full_name='config.ProviderResponse.Packets', 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=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=263, + serialized_end=323, +) + + +_PULLREQUEST = _descriptor.Descriptor( + name='PullRequest', + full_name='config.PullRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Token', full_name='config.PullRequest.Token', 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='ClientPublicKey', full_name='config.PullRequest.ClientPublicKey', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=325, + serialized_end=378, +) + +_CLIENTCONFIG.fields_by_name['Provider'].message_type = _MIXCONFIG +DESCRIPTOR.message_types_by_name['MixConfig'] = _MIXCONFIG +DESCRIPTOR.message_types_by_name['ClientConfig'] = _CLIENTCONFIG +DESCRIPTOR.message_types_by_name['GeneralPacket'] = _GENERALPACKET +DESCRIPTOR.message_types_by_name['ProviderResponse'] = _PROVIDERRESPONSE +DESCRIPTOR.message_types_by_name['PullRequest'] = _PULLREQUEST +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +MixConfig = _reflection.GeneratedProtocolMessageType('MixConfig', (_message.Message,), { + 'DESCRIPTOR' : _MIXCONFIG, + '__module__' : 'structs_pb2' + # @@protoc_insertion_point(class_scope:config.MixConfig) + }) +_sym_db.RegisterMessage(MixConfig) + +ClientConfig = _reflection.GeneratedProtocolMessageType('ClientConfig', (_message.Message,), { + 'DESCRIPTOR' : _CLIENTCONFIG, + '__module__' : 'structs_pb2' + # @@protoc_insertion_point(class_scope:config.ClientConfig) + }) +_sym_db.RegisterMessage(ClientConfig) + +GeneralPacket = _reflection.GeneratedProtocolMessageType('GeneralPacket', (_message.Message,), { + 'DESCRIPTOR' : _GENERALPACKET, + '__module__' : 'structs_pb2' + # @@protoc_insertion_point(class_scope:config.GeneralPacket) + }) +_sym_db.RegisterMessage(GeneralPacket) + +ProviderResponse = _reflection.GeneratedProtocolMessageType('ProviderResponse', (_message.Message,), { + 'DESCRIPTOR' : _PROVIDERRESPONSE, + '__module__' : 'structs_pb2' + # @@protoc_insertion_point(class_scope:config.ProviderResponse) + }) +_sym_db.RegisterMessage(ProviderResponse) + +PullRequest = _reflection.GeneratedProtocolMessageType('PullRequest', (_message.Message,), { + 'DESCRIPTOR' : _PULLREQUEST, + '__module__' : 'structs_pb2' + # @@protoc_insertion_point(class_scope:config.PullRequest) + }) +_sym_db.RegisterMessage(PullRequest) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/extern/python-tcp-example/proto/types.proto b/extern/python-tcp-example/proto/types.proto new file mode 100644 index 0000000..5f1eac1 --- /dev/null +++ b/extern/python-tcp-example/proto/types.proto @@ -0,0 +1,64 @@ +syntax = "proto3"; +package types; + +import "structs.proto"; + +message Request { + oneof value { + RequestSendMessage send = 2; + RequestFetchMessages fetch = 3; + RequestGetClients clients = 4; + RequestOwnDetails details = 5; + RequestFlush flush = 6; + } +} + +message RequestSendMessage { + bytes message = 1; + config.ClientConfig recipient = 2; +} + +message RequestFetchMessages { +} + +message RequestGetClients { +} + +message RequestOwnDetails { +} + +message RequestFlush { +} + +message Response { + oneof value { + ResponseException exception = 1; + ResponseSendMessage send = 2; + ResponseFetchMessages fetch = 3; + ResponseGetClients clients = 4; + ResponseOwnDetails details = 5; + ResponseFlush flush = 6; + } +} + +message ResponseException { + string error = 1; +} + +message ResponseSendMessage { +} + +message ResponseGetClients { + repeated config.ClientConfig clients = 1; +} + +message ResponseOwnDetails { + config.ClientConfig details = 1; +} + +message ResponseFlush { +} + +message ResponseFetchMessages { + repeated bytes messages = 1; // the message is implementation specific; it might be marshaled 'ChatMessage' or something completely else +} diff --git a/extern/python-tcp-example/proto/types_pb2.py b/extern/python-tcp-example/proto/types_pb2.py new file mode 100644 index 0000000..06caaf6 --- /dev/null +++ b/extern/python-tcp-example/proto/types_pb2.py @@ -0,0 +1,621 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: types.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() + + +import proto.structs_pb2 as structs__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='types.proto', + package='types', + syntax='proto3', + serialized_options=None, + serialized_pb=_b('\n\x0btypes.proto\x12\x05types\x1a\rstructs.proto\"\xeb\x01\n\x07Request\x12)\n\x04send\x18\x02 \x01(\x0b\x32\x19.types.RequestSendMessageH\x00\x12,\n\x05\x66\x65tch\x18\x03 \x01(\x0b\x32\x1b.types.RequestFetchMessagesH\x00\x12+\n\x07\x63lients\x18\x04 \x01(\x0b\x32\x18.types.RequestGetClientsH\x00\x12+\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x18.types.RequestOwnDetailsH\x00\x12$\n\x05\x66lush\x18\x06 \x01(\x0b\x32\x13.types.RequestFlushH\x00\x42\x07\n\x05value\"N\n\x12RequestSendMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\'\n\trecipient\x18\x02 \x01(\x0b\x32\x14.config.ClientConfig\"\x16\n\x14RequestFetchMessages\"\x13\n\x11RequestGetClients\"\x13\n\x11RequestOwnDetails\"\x0e\n\x0cRequestFlush\"\xa0\x02\n\x08Response\x12-\n\texception\x18\x01 \x01(\x0b\x32\x18.types.ResponseExceptionH\x00\x12*\n\x04send\x18\x02 \x01(\x0b\x32\x1a.types.ResponseSendMessageH\x00\x12-\n\x05\x66\x65tch\x18\x03 \x01(\x0b\x32\x1c.types.ResponseFetchMessagesH\x00\x12,\n\x07\x63lients\x18\x04 \x01(\x0b\x32\x19.types.ResponseGetClientsH\x00\x12,\n\x07\x64\x65tails\x18\x05 \x01(\x0b\x32\x19.types.ResponseOwnDetailsH\x00\x12%\n\x05\x66lush\x18\x06 \x01(\x0b\x32\x14.types.ResponseFlushH\x00\x42\x07\n\x05value\"\"\n\x11ResponseException\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"\x15\n\x13ResponseSendMessage\";\n\x12ResponseGetClients\x12%\n\x07\x63lients\x18\x01 \x03(\x0b\x32\x14.config.ClientConfig\";\n\x12ResponseOwnDetails\x12%\n\x07\x64\x65tails\x18\x01 \x01(\x0b\x32\x14.config.ClientConfig\"\x0f\n\rResponseFlush\")\n\x15ResponseFetchMessages\x12\x10\n\x08messages\x18\x01 \x03(\x0c\x62\x06proto3') + , + dependencies=[structs__pb2.DESCRIPTOR,]) + + + + +_REQUEST = _descriptor.Descriptor( + name='Request', + full_name='types.Request', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='send', full_name='types.Request.send', index=0, + 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='fetch', full_name='types.Request.fetch', index=1, + 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), + _descriptor.FieldDescriptor( + name='clients', full_name='types.Request.clients', index=2, + number=4, 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='details', full_name='types.Request.details', index=3, + number=5, 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='flush', full_name='types.Request.flush', index=4, + number=6, 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=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='value', full_name='types.Request.value', + index=0, containing_type=None, fields=[]), + ], + serialized_start=38, + serialized_end=273, +) + + +_REQUESTSENDMESSAGE = _descriptor.Descriptor( + name='RequestSendMessage', + full_name='types.RequestSendMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='types.RequestSendMessage.message', 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='recipient', full_name='types.RequestSendMessage.recipient', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=275, + serialized_end=353, +) + + +_REQUESTFETCHMESSAGES = _descriptor.Descriptor( + name='RequestFetchMessages', + full_name='types.RequestFetchMessages', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=355, + serialized_end=377, +) + + +_REQUESTGETCLIENTS = _descriptor.Descriptor( + name='RequestGetClients', + full_name='types.RequestGetClients', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=379, + serialized_end=398, +) + + +_REQUESTOWNDETAILS = _descriptor.Descriptor( + name='RequestOwnDetails', + full_name='types.RequestOwnDetails', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=400, + serialized_end=419, +) + + +_REQUESTFLUSH = _descriptor.Descriptor( + name='RequestFlush', + full_name='types.RequestFlush', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=421, + serialized_end=435, +) + + +_RESPONSE = _descriptor.Descriptor( + name='Response', + full_name='types.Response', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='exception', full_name='types.Response.exception', index=0, + number=1, 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='send', full_name='types.Response.send', 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='fetch', full_name='types.Response.fetch', 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), + _descriptor.FieldDescriptor( + name='clients', full_name='types.Response.clients', index=3, + number=4, 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='details', full_name='types.Response.details', index=4, + number=5, 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='flush', full_name='types.Response.flush', index=5, + number=6, 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=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='value', full_name='types.Response.value', + index=0, containing_type=None, fields=[]), + ], + serialized_start=438, + serialized_end=726, +) + + +_RESPONSEEXCEPTION = _descriptor.Descriptor( + name='ResponseException', + full_name='types.ResponseException', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='error', full_name='types.ResponseException.error', 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='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=728, + serialized_end=762, +) + + +_RESPONSESENDMESSAGE = _descriptor.Descriptor( + name='ResponseSendMessage', + full_name='types.ResponseSendMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=764, + serialized_end=785, +) + + +_RESPONSEGETCLIENTS = _descriptor.Descriptor( + name='ResponseGetClients', + full_name='types.ResponseGetClients', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='clients', full_name='types.ResponseGetClients.clients', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=787, + serialized_end=846, +) + + +_RESPONSEOWNDETAILS = _descriptor.Descriptor( + name='ResponseOwnDetails', + full_name='types.ResponseOwnDetails', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='details', full_name='types.ResponseOwnDetails.details', index=0, + number=1, 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=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=848, + serialized_end=907, +) + + +_RESPONSEFLUSH = _descriptor.Descriptor( + name='ResponseFlush', + full_name='types.ResponseFlush', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=909, + serialized_end=924, +) + + +_RESPONSEFETCHMESSAGES = _descriptor.Descriptor( + name='ResponseFetchMessages', + full_name='types.ResponseFetchMessages', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='messages', full_name='types.ResponseFetchMessages.messages', index=0, + number=1, 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=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=926, + serialized_end=967, +) + +_REQUEST.fields_by_name['send'].message_type = _REQUESTSENDMESSAGE +_REQUEST.fields_by_name['fetch'].message_type = _REQUESTFETCHMESSAGES +_REQUEST.fields_by_name['clients'].message_type = _REQUESTGETCLIENTS +_REQUEST.fields_by_name['details'].message_type = _REQUESTOWNDETAILS +_REQUEST.fields_by_name['flush'].message_type = _REQUESTFLUSH +_REQUEST.oneofs_by_name['value'].fields.append( + _REQUEST.fields_by_name['send']) +_REQUEST.fields_by_name['send'].containing_oneof = _REQUEST.oneofs_by_name['value'] +_REQUEST.oneofs_by_name['value'].fields.append( + _REQUEST.fields_by_name['fetch']) +_REQUEST.fields_by_name['fetch'].containing_oneof = _REQUEST.oneofs_by_name['value'] +_REQUEST.oneofs_by_name['value'].fields.append( + _REQUEST.fields_by_name['clients']) +_REQUEST.fields_by_name['clients'].containing_oneof = _REQUEST.oneofs_by_name['value'] +_REQUEST.oneofs_by_name['value'].fields.append( + _REQUEST.fields_by_name['details']) +_REQUEST.fields_by_name['details'].containing_oneof = _REQUEST.oneofs_by_name['value'] +_REQUEST.oneofs_by_name['value'].fields.append( + _REQUEST.fields_by_name['flush']) +_REQUEST.fields_by_name['flush'].containing_oneof = _REQUEST.oneofs_by_name['value'] +_REQUESTSENDMESSAGE.fields_by_name['recipient'].message_type = structs__pb2._CLIENTCONFIG +_RESPONSE.fields_by_name['exception'].message_type = _RESPONSEEXCEPTION +_RESPONSE.fields_by_name['send'].message_type = _RESPONSESENDMESSAGE +_RESPONSE.fields_by_name['fetch'].message_type = _RESPONSEFETCHMESSAGES +_RESPONSE.fields_by_name['clients'].message_type = _RESPONSEGETCLIENTS +_RESPONSE.fields_by_name['details'].message_type = _RESPONSEOWNDETAILS +_RESPONSE.fields_by_name['flush'].message_type = _RESPONSEFLUSH +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['exception']) +_RESPONSE.fields_by_name['exception'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['send']) +_RESPONSE.fields_by_name['send'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['fetch']) +_RESPONSE.fields_by_name['fetch'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['clients']) +_RESPONSE.fields_by_name['clients'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['details']) +_RESPONSE.fields_by_name['details'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSE.oneofs_by_name['value'].fields.append( + _RESPONSE.fields_by_name['flush']) +_RESPONSE.fields_by_name['flush'].containing_oneof = _RESPONSE.oneofs_by_name['value'] +_RESPONSEGETCLIENTS.fields_by_name['clients'].message_type = structs__pb2._CLIENTCONFIG +_RESPONSEOWNDETAILS.fields_by_name['details'].message_type = structs__pb2._CLIENTCONFIG +DESCRIPTOR.message_types_by_name['Request'] = _REQUEST +DESCRIPTOR.message_types_by_name['RequestSendMessage'] = _REQUESTSENDMESSAGE +DESCRIPTOR.message_types_by_name['RequestFetchMessages'] = _REQUESTFETCHMESSAGES +DESCRIPTOR.message_types_by_name['RequestGetClients'] = _REQUESTGETCLIENTS +DESCRIPTOR.message_types_by_name['RequestOwnDetails'] = _REQUESTOWNDETAILS +DESCRIPTOR.message_types_by_name['RequestFlush'] = _REQUESTFLUSH +DESCRIPTOR.message_types_by_name['Response'] = _RESPONSE +DESCRIPTOR.message_types_by_name['ResponseException'] = _RESPONSEEXCEPTION +DESCRIPTOR.message_types_by_name['ResponseSendMessage'] = _RESPONSESENDMESSAGE +DESCRIPTOR.message_types_by_name['ResponseGetClients'] = _RESPONSEGETCLIENTS +DESCRIPTOR.message_types_by_name['ResponseOwnDetails'] = _RESPONSEOWNDETAILS +DESCRIPTOR.message_types_by_name['ResponseFlush'] = _RESPONSEFLUSH +DESCRIPTOR.message_types_by_name['ResponseFetchMessages'] = _RESPONSEFETCHMESSAGES +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Request = _reflection.GeneratedProtocolMessageType('Request', (_message.Message,), { + 'DESCRIPTOR' : _REQUEST, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.Request) + }) +_sym_db.RegisterMessage(Request) + +RequestSendMessage = _reflection.GeneratedProtocolMessageType('RequestSendMessage', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTSENDMESSAGE, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.RequestSendMessage) + }) +_sym_db.RegisterMessage(RequestSendMessage) + +RequestFetchMessages = _reflection.GeneratedProtocolMessageType('RequestFetchMessages', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTFETCHMESSAGES, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.RequestFetchMessages) + }) +_sym_db.RegisterMessage(RequestFetchMessages) + +RequestGetClients = _reflection.GeneratedProtocolMessageType('RequestGetClients', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTGETCLIENTS, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.RequestGetClients) + }) +_sym_db.RegisterMessage(RequestGetClients) + +RequestOwnDetails = _reflection.GeneratedProtocolMessageType('RequestOwnDetails', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTOWNDETAILS, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.RequestOwnDetails) + }) +_sym_db.RegisterMessage(RequestOwnDetails) + +RequestFlush = _reflection.GeneratedProtocolMessageType('RequestFlush', (_message.Message,), { + 'DESCRIPTOR' : _REQUESTFLUSH, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.RequestFlush) + }) +_sym_db.RegisterMessage(RequestFlush) + +Response = _reflection.GeneratedProtocolMessageType('Response', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSE, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.Response) + }) +_sym_db.RegisterMessage(Response) + +ResponseException = _reflection.GeneratedProtocolMessageType('ResponseException', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEEXCEPTION, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseException) + }) +_sym_db.RegisterMessage(ResponseException) + +ResponseSendMessage = _reflection.GeneratedProtocolMessageType('ResponseSendMessage', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSESENDMESSAGE, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseSendMessage) + }) +_sym_db.RegisterMessage(ResponseSendMessage) + +ResponseGetClients = _reflection.GeneratedProtocolMessageType('ResponseGetClients', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEGETCLIENTS, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseGetClients) + }) +_sym_db.RegisterMessage(ResponseGetClients) + +ResponseOwnDetails = _reflection.GeneratedProtocolMessageType('ResponseOwnDetails', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEOWNDETAILS, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseOwnDetails) + }) +_sym_db.RegisterMessage(ResponseOwnDetails) + +ResponseFlush = _reflection.GeneratedProtocolMessageType('ResponseFlush', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEFLUSH, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseFlush) + }) +_sym_db.RegisterMessage(ResponseFlush) + +ResponseFetchMessages = _reflection.GeneratedProtocolMessageType('ResponseFetchMessages', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEFETCHMESSAGES, + '__module__' : 'types_pb2' + # @@protoc_insertion_point(class_scope:types.ResponseFetchMessages) + }) +_sym_db.RegisterMessage(ResponseFetchMessages) + + +# @@protoc_insertion_point(module_scope) diff --git a/extern/python-tcp-example/test.py b/extern/python-tcp-example/test.py new file mode 100644 index 0000000..85becc7 --- /dev/null +++ b/extern/python-tcp-example/test.py @@ -0,0 +1,99 @@ +import asyncio +import proto +import util + +async def send(writer, message): + data = message.SerializeToString() + size_data = util.varint_to_bytes(len(data)) + writer.write(size_data + data) + +async def read_response(reader): + data_size = await util.read_varint(reader) + data = await reader.read(data_size) + #print("Data size:", data_size) + #print("Received:", data) + + response = proto.types.Response() + response.ParseFromString(data) + return response + +class NymProxy: + + def __init__(self, hostname="127.0.0.1", port=9001): + self._hostname = hostname + self._port = port + + async def start(self): + self._reader, self._writer = await asyncio.open_connection( + self._hostname, self._port) + + async def send(self, message, recipient): + request = proto.types.Request( + send=proto.types.RequestSendMessage( + message=message, recipient=recipient)) + await self._send(request) + + return await self._flush_collect('send') + + async def fetch(self): + request = proto.types.Request( + fetch=proto.types.RequestFetchMessages()) + await self._send(request) + + response = await self._flush_collect('fetch') + return response.fetch.messages + + async def clients(self): + request = proto.types.Request( + clients=proto.types.RequestGetClients()) + await self._send(request) + + response = await self._flush_collect('clients') + return response.clients.clients + + async def details(self): + request = proto.types.Request( + details=proto.types.RequestOwnDetails()) + await self._send(request) + + response = await self._flush_collect('details') + return response.details.details + + async def _do_flush(self): + flush_request = proto.types.Request( + flush=proto.types.RequestFlush()) + await self._send(flush_request) + + async def _collect_response(self, request_type, number_responses): + responses = [await self._read() for i in range(number_responses)] + #print("Responses:", responses) + return next(response for response in responses + if response.WhichOneof('value') == request_type) + + async def _flush_collect(self, request_type): + await self._do_flush() + return await self._collect_response(request_type, 2) + + async def _read(self): + return await read_response(self._reader) + async def _send(self, request): + await send(self._writer, request) + +async def run_client(): + nym = NymProxy() + await nym.start() + + my_details = await nym.details() + print(my_details) + await nym.send(b'fooompdd', my_details) + messages = await nym.fetch() + print("Messages:", messages) + print() + + clients = await nym.clients() + print("Client #4:", clients[4]) + + print('Finished') + +asyncio.run(run_client()) + diff --git a/extern/python-tcp-example/util.py b/extern/python-tcp-example/util.py new file mode 100644 index 0000000..dff2c67 --- /dev/null +++ b/extern/python-tcp-example/util.py @@ -0,0 +1,37 @@ +VARINT_TWO_BYTES = 0xfd +VARINT_FOUR_BYTES = 0xfe +VARINT_EIGHT_BYTES = 0xff +MAX_UINT16 = 2**16 - 1 +MAX_UINT32 = 2**32 - 1 +MAX_UINT64 = 2**64 - 1 +assert MAX_UINT16 == 0xffff +assert MAX_UINT32 == 0xffffffff +assert MAX_UINT64 == 0xffffffffffffffff + +def varint_to_bytes(value): + if value < VARINT_TWO_BYTES: + return bytes([value]) + elif value <= MAX_UINT16: + return (bytes([VARINT_TWO_BYTES]) + + value.to_bytes(2, byteorder="big")) + elif value <= MAX_UINT32: + return (bytes([VARINT_FOUR_BYTES]) + + value.to_bytes(4, byteorder="big")) + elif value <= MAX_UINT64: + return (bytes([VARINT_EIGHT_BYTES]) + + value.to_bytes(8, byteorder="big")) + +async def read_varint(reader): + value = await reader.read(1) + value = int.from_bytes(value, byteorder="big") + #print("value", value) + if value < VARINT_TWO_BYTES: + return value + elif value <= MAX_UINT16: + data = await reader.read(2) + elif value <= MAX_UINT32: + data = await reader.read(4) + elif value <= MAX_UINT64: + data = await reader.read(8) + return int.from_bytes(data, byteorder="big") +