Add delim_encode and delim_read

- Add `StreamCommunicator` and `RawConnectionCommunicator`, read/write
messages with delim codec, with `IMuxedStream` and `IRawConnection`
respectively.
- Use it in `Multiselect` and `MultiselectClient`.
This commit is contained in:
mhchia
2019-08-15 23:31:26 +08:00
committed by Kevin Mai-Husan Chia
parent 8cd23abfe2
commit 86d4ce1da8
11 changed files with 74 additions and 64 deletions

View File

@ -14,6 +14,8 @@ Relevant go repo: https://github.com/libp2p/go-conn-security/blob/master/interfa
class AbstractSecureConn(ABC):
conn: IRawConnection
@abstractmethod
def get_local_peer(self) -> ID:
pass

View File

@ -7,6 +7,7 @@ from libp2p.protocol_muxer.multiselect import Multiselect
from libp2p.protocol_muxer.multiselect_client import MultiselectClient
from libp2p.security.secure_conn_interface import ISecureConn
from libp2p.security.secure_transport_interface import ISecureTransport
from libp2p.protocol_muxer.multiselect_communicator import RawConnectionCommunicator
from libp2p.typing import TProtocol
@ -74,14 +75,15 @@ class SecurityMultistream(ABC):
# instead of stream? In go repo, they pass in a raw conn
# (https://raw.githubusercontent.com/libp2p/go-conn-security-multistream/master/ssms.go)
protocol = None
protocol: TProtocol
communicator = RawConnectionCommunicator(conn)
if initiator:
# Select protocol if initiator
protocol = await self.multiselect_client.select_one_of(
list(self.transports.keys()), conn
list(self.transports.keys()), communicator
)
else:
# Select protocol if non-initiator
protocol, _ = await self.multiselect.negotiate(conn)
protocol, _ = await self.multiselect.negotiate(communicator)
# Return transport from protocol
return self.transports[protocol]