18 个版本 (7 个破坏性更新)

0.11.1 2021 年 12 月 2 日
0.11.0 2021 年 11 月 21 日
0.10.0 2021 年 11 月 17 日
0.2.1 2021 年 5 月 11 日

#12 in #message-pack

每月 45 次下载

Apache-2.0

52KB
1K SLoC

rmp-ipc

通过 TCP 使用 Rust MessagePack 进行进程间通信。

使用方法

客户端

use rmp_ipc::{callback, Event, context::Context, IPCBuilder, error::Result};

/// Callback ping function
async fn handle_ping(ctx: &Context, event: Event) -> Result<()> {
    println!("Received ping event.");
    ctx.emitter.emit_response(event.id(), "pong", ()).await?;
    Ok(())
}

#[tokio::main]
async fn main() {
    // create the client
    let ctx = IPCBuilder::new()
        .address("127.0.0.1:2020")
        // register callback
        .on("ping", callback!(handle_ping))
        .build_client().await.unwrap();

// emit an initial event
    let response = ctx.emitter.emit("ping", ()).await?.await_response(&ctx).await?;
}

服务器

use rmp_ipc::{IPCBuilder, callback};
// create the server

#[tokio::main]
async fn main() {
    IPCBuilder::new()
        .address("127.0.0.1:2020")
        // register callback
        .on("ping", callback!(ctx, event, async move {
            println!("Received ping event.");
            Ok(())
        }))
        .build_server().await.unwrap();
}

命名空间

客户端

use rmp_ipc::IPCBuilder;
// create the client

#[tokio::main]
async fn main() {
    let ctx = IPCBuilder::new()
        .address("127.0.0.1:2020")
        // register namespace
        .namespace("mainspace-client")
        // register callback (without macro)
        .on("ping", |_ctx, _event| Box::pin(async move {
            println!("Received ping event.");
            Ok(())
        }))
        .build()
        .build_client().await.unwrap();

// emit an initial event
    let response = ctx.emitter.emit_to("mainspace-server", "ping", ()).await?
        .await_response(&ctx).await?;
}

服务器

use rmp_ipc::{IPCBuilder, EventHandler, namespace, command, Event, context::Context};
// create the server

pub struct MyNamespace;

impl MyNamespace {
     async fn ping(_ctx: &Context, _event: Event) -> Result<()> {
         println!("My namespace received a ping");
         Ok(())
     }
}

impl NamespaceProvider for MyNamespace {
     fn name() -> &'static str {"my_namespace"}
 
     fn register(handler: &mut EventHandler) {
         events!(handler, 
            "ping" => Self::ping
         );
     }
}

#[tokio::main]
async fn main() {
    IPCBuilder::new()
        .address("127.0.0.1:2020")
        // register namespace
        .namespace("mainspace-server")
        // register callback
        .on("ping", |_ctx, _event| Box::pin(async move {
            println!("Received ping event.");
            Ok(())
        }))
        .build()
        .add_namespace(namespace!(MyNamespace))
        .build_server().await.unwrap();
}

基准测试

基准测试在每个提交时生成。它们可以在这里进行审查。

许可证

Apache-2.0

依赖关系

~3–12MB
~122K SLoC