GithubHelp home page GithubHelp logo

gmh5225 / websockets-wsmq-rs Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ntoskrnl7/wsmq-rs

0.0 1.0 0.0 104 KB

A simple messaging library based on websockets and protocol buffers.

License: MIT License

Rust 100.00%

websockets-wsmq-rs's Introduction

wsmq-rs

Rust

A simple websocket messaging library based on protocol buffers.

Example

Basic

Server

wsmq::server::run("0.0.0.0:8080", |addr, res, _| {
    let mut recieved = res.to_vec().clone();
    tokio::spawn(async move {
        recieved.extend(&addr.port().to_le_bytes());
        res.reply(recieved).await;
    });
})
.await
.unwrap();

Client

let client = wsmq::client::connect("ws://127.0.0.1:8080")
    .await
    .unwrap();
client.send(vec![1, 2, 3, 4, 5]).unwrap();

let res = client.send(vec![1, 2, 3, 4, 5]).unwrap().await.unwrap();
let recieved = res.to_vec();
println!("{:?}", recieved);

With protocol buffers

Protocol buffers

syntax = "proto3";

message RequestMessage {
    string text = 1;
}
message ResponseMessage {
    string text = 1;
    bytes payload = 2;
}

Server with protocol buffers

wsmq::server::run("0.0.0.0:8080", |addr, res, _| {
    let mut message = res.to_message::<RequestMessage>().expect("[server] Failed to to_message");
    tokio::spawn(async move {
        let mut response_message = ResponseMessage::new();
        response_message.set_text("response text".to_string());
        response_message.set_payload(message.get_text().as_bytes().to_vec());
        res.reply_message(&response_message).await;
    });
})
.await
.expect("[server] Failed to run");

Client with protocol buffers

let client = wsmq::client::connect("ws://127.0.0.1:8080")
    .await
    .expect("[client] Failed to connect");

let mut message = RequestMessage::new();
message.set_text("request text".to_string());

let res = client.send_message(&message)
    .expect("[client] Failed to send_message");
    .await
    .expect("[client] Failed to send_message");

let message = res.to_message::<ResponseMessage>()
    .expect("[client] Failed to to_message");

println!("{:?}", message);

With config

Server with config

wsmq::server::run_with_config(
    "0.0.0.0:8080",
    |addr, res, _| {
        let mut recieved = res.to_vec().clone();
        tokio::spawn(async move {
            recieved.extend(&addr.port().to_le_bytes());
            res.reply(recieved).await;
        });
    },
    wsmq::server::Config::<()>::new().set_bandwidth(1024 * 1024 * 6),
)
.await
.unwrap();

Client with config

let client = wsmq::client::connect_with_config(
    "ws://127.0.0.1:8080",
    wsmq::client::Config::new().set_bandwidth(1024 * 1024 * 6),
)
.await
.unwrap();
client.send(vec![1, 2, 3, 4, 5]).unwrap();

let res = client.send(vec![1, 2, 3, 4, 5]).unwrap().await.unwrap();
let recieved = res.to_vec();
println!("{:?}", recieved);

With context

Server with context

#[derive(Debug)]
struct Context {
    port: u16,
    sent: usize,
    recieved: usize,
}

wsmq::server::run_with_config(
    "0.0.0.0:8080",
    |addr, res, context| {
        context.recieved += 1;
        let mut recieved = res.to_vec().clone();
        recieved.extend(&addr.port().to_le_bytes());
        if let Ok(_) = block_on(res.reply(recieved)) {
            context.sent += 1;
        }
    },
    wsmq::server::Config::new()
        set_bandwidth(1024),
        .on_connect(Box::new(|addr| {
            println!("connected ({})", addr);
            Context {
                port: addr.port(),
                sent: 0,
                recieved: 0,
            }
        }))
        .on_disconnect(Box::new(|addr, context| {
            assert_eq!(addr.port(), context.port);
            println!("disconnected({}): {:?}", addr, context);
        }))
        .on_started(Box::new(|| {
            println!("started");
        }))
        .on_error(Box::new(|err, ctx| {
            if let Some(ctx) = ctx {
                println!("error({:?}) : {}", ctx, err);
            } else {
                println!("error : {}", err);
            }
        }))
        .on_progress(Box::new(|pctx, ctx| {
            println!("progress ({:?}) : {:?}", ctx, pctx);
        })),
)
.await
.unwrap();

Client with context

let client = wsmq::client::connect_with_config(
    "ws://127.0.0.1:8080",
    wsmq::client::Config::new().set_bandwidth(1024),
)
.await
.unwrap();
client.send(vec![1, 2, 3, 4, 5]).unwrap();
let res = client.send(vec![1, 2, 3, 4, 5]).unwrap().await.unwrap();
let recieved = res.to_vec();
println!("{:?}", recieved);

websockets-wsmq-rs's People

Contributors

ntoskrnl7 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.