3个不稳定版本

0.2.0-alpha 2024年8月9日
0.1.0-alpha.12024年5月20日
0.1.0-alpha2024年1月17日

#2209 in 异步

Download history 6972/week @ 2024-04-19 6830/week @ 2024-04-26 6878/week @ 2024-05-03 7107/week @ 2024-05-10 7317/week @ 2024-05-17 6988/week @ 2024-05-24 262/week @ 2024-05-31 1130/week @ 2024-06-07 4334/week @ 2024-06-14 455/week @ 2024-06-21 219/week @ 2024-06-28 134/week @ 2024-07-05 275/week @ 2024-07-12 624/week @ 2024-07-19 420/week @ 2024-07-26 591/week @ 2024-08-02

1,970 每月下载量
用于 2 crate

MIT 许可证

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