3个不稳定版本
新 0.2.0-alpha | 2024年8月9日 |
---|---|
0.1.0-alpha.1 | 2024年5月20日 |
0.1.0-alpha | 2024年1月17日 |
#2209 in 异步
1,970 每月下载量
用于 2 crate
755KB
15K SLoC
通用(流)协议
本模块提供了一个用于流式协议的通用 NetworkBehaviour
。流是libp2p的基本原语,所有其他协议都是使用流实现的。与其他 NetworkBehaviour
相比,本模块采用不同的设计方法。所有交互都通过一个 Control
进行,该 Behaviour::new_control
可获得。 Control
可以克隆,因此可以在您的应用程序中共享。
入站
要使用此模块接受特定 StreamProtocol
的流,请使用 Control::accept
示例
# fn main() {
# use libp2p_swarm::{Swarm, StreamProtocol};
# use libp2p_stream as stream;
# use futures::StreamExt as _;
let mut swarm: Swarm<stream::Behaviour> = todo!();
let mut control = swarm.behaviour().new_control();
let mut incoming = control.accept(StreamProtocol::new("/my-protocol")).unwrap();
let handler_future = async move {
while let Some((peer, stream)) = incoming.next().await {
// Execute your protocol using `stream`.
}
};
# }
资源管理
Control::accept
返回一个 IncomingStreams
实例。此结构体实现了 Stream
,与其他流一样,是懒加载的。你必须不断轮询它以使其取得进展。在上面的例子中,这是通过使用 StreamExt::next
辅助函数来完成的。
内部,如果您的应用程序在处理这些传入流时落后,我们将丢弃流,即如果调用 .next()
的循环不够快。
丢弃
一旦丢弃 IncomingStreams
,协议将被注销。任何远程节点尝试使用提供的协议打开流的进一步尝试都将导致协商错误。
出站
要为特定协议打开新的出站流,请使用 Control::open_stream
。
示例
# fn main() {
# use libp2p_swarm::{Swarm, StreamProtocol};
# use libp2p_stream as stream;
# use libp2p_identity::PeerId;
let mut swarm: Swarm<stream::Behaviour> = todo!();
let peer_id: PeerId = todo!();
let mut control = swarm.behaviour().new_control();
let protocol_future = async move {
let stream = control.open_stream(peer_id, StreamProtocol::new("/my-protocol")).await.unwrap();
// Execute your protocol here using `stream`.
};
# }
依赖
~8–16MB
~206K SLoC