9个版本 (破坏性更新)

0.26.0 2021年8月1日
0.26.0-alpha.12021年4月17日
0.25.2 2021年1月7日
0.25.0 2020年12月2日
0.1.1 2017年10月26日

#614异步

Download history 1/week @ 2024-06-29 30/week @ 2024-07-06 247/week @ 2024-07-27

每月下载量277次

MIT 协议

135KB
3.5K SLoC

Queen

crates.io CI MIT licensed Released API docs

Queen是一个消息总线

功能

  • 订阅-发布 & 请求-响应
  • 一对一,一对多
  • 使用nson作为数据格式
  • 支持消息加密
  • ... 更多

示例

use std::time::Duration;

use queen::{Socket, Node, Port, NonHook};
use queen::net::{NsonCodec, KeepAlive};
use queen::dict::*;
use queen::nson::{MessageId, msg};
use queen::error::Code;

fn main() {
    let socket = Socket::new(MessageId::new(), NonHook).unwrap();

    // start wire 1
    let wire1 = socket.connect(MessageId::new(), false, msg!{}, None, None).unwrap();

    wire1.send(msg!{
        CHAN: PING
    }).unwrap();

    let ret = wire1.wait(Some(Duration::from_secs(1))).unwrap();
    println!("wire 1 ping ret: {:?}", ret);

    // start node
    let _node = Node::<NsonCodec>::new(
        socket.clone(),
        4,
        vec!["127.0.0.1:8888".parse().unwrap()],
        KeepAlive::default(),
        ()
    ).unwrap();

    // start port
    let port = Port::<NsonCodec>::new(KeepAlive::default()).unwrap();

    // start wire 2
    let wire2 = port.connect("127.0.0.1:8888", MessageId::new(), false, msg!{}, None, None).unwrap();

    wire2.send(msg!{
        CHAN: PING
    }).unwrap();

    let ret = wire2.wait(Some(Duration::from_secs(1))).unwrap();
    if let Some(err) = Code::get(&ret) {
        if err != Code::Ok {
            println!("wire 2 ping error: {:?}", err);
            return
        }
    }

    println!("wire 2 ping ret: {:?}", ret);

    // wire 1 attach
    wire1.send(msg!{
        CHAN: ATTACH,
        VALUE: "hello"
    }).unwrap();

    let ret = wire1.wait(Some(Duration::from_secs(1))).unwrap();
    println!("wire 1 attach ret: {:?}", ret);

    // wire 2 send
    wire2.send(msg!{
        ID: MessageId::new(),
        CHAN: "hello",
        "hello": "world"
    }).unwrap();

    // wire 1 recv
    let ret = wire1.wait(Some(Duration::from_secs(1))).unwrap();
    if let Some(err) = Code::get(&ret) {
        if err != Code::Ok {
            println!("wire 1 recv error: {:?}", err);
            return
        }
    }

    println!("wire 1 recv ret: {:?}", ret);
}

依赖

~8–11MB
~287K SLoC