6个版本 (1个稳定版)

1.0.0 2022年11月25日
0.3.0 2022年11月25日
0.2.2 2022年1月23日
0.2.1 2021年1月6日
0.1.0 2021年1月6日

#101WebSocket

Download history 96/week @ 2024-03-17 58/week @ 2024-03-24 118/week @ 2024-03-31 4/week @ 2024-04-07 8/week @ 2024-04-14 78/week @ 2024-04-21 8/week @ 2024-04-28 35/week @ 2024-05-12 65/week @ 2024-05-19 73/week @ 2024-05-26 67/week @ 2024-06-02 66/week @ 2024-06-09 73/week @ 2024-06-16 63/week @ 2024-06-23 10/week @ 2024-06-30

每月222次下载

MIT 许可证

26KB
267 代码行

wasm-sockets

wasm-sockets 是一个仅适用于WASM的Rust WebSocket库,主要用于创建游戏。

此库提供2个(仅WASM)WebSocket客户端。提供的第一个客户端是 EventClient。此客户端基于事件,并提供了最大的控制权。

use console_error_panic_hook;
use console_log;
use log::{error, info, Level};
use std::panic;
use wasm_sockets::{self, WebSocketError};

fn main() -> Result<(), WebSocketError> {
    panic::set_hook(Box::new(console_error_panic_hook::hook));
    // console_log and log macros are used instead of println!
    // so that messages can be seen in the browser console
    console_log::init_with_level(Level::Trace).expect("Failed to enable logging");
    info!("Creating connection");

    let mut client = wasm_sockets::EventClient::new("wss://ws.ifelse.io")?;
    client.set_on_error(Some(Box::new(|error| {
        error!("{:#?}", error);
    })));
    client.set_on_connection(Some(Box::new(|client: &wasm_sockets::EventClient| {
        info!("{:#?}", client.status);
        info!("Sending message...");
        client.send_string("Hello, World!").unwrap();
        client.send_binary(vec![20]).unwrap();
    })));
    client.set_on_close(Some(Box::new(|_evt| {
        info!("Connection closed");
    })));
    client.set_on_message(Some(Box::new(
        |client: &wasm_sockets::EventClient, message: wasm_sockets::Message| {
            info!("New Message: {:#?}", message);
        },
    )));

    info!("Connection successfully created");
    Ok(())
}

提供的第二个客户端是 PollingClient。此客户端非常适合游戏,因为它设计为与循环一起使用。此客户端比 EventClient 更简单。但是,如果您想访问更底层的控制,可以访问它所使用的 EventClient

use console_error_panic_hook;
use log::{info, Level};
use std::cell::RefCell;
use std::panic;
use std::rc::Rc;
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
use wasm_sockets::{self, ConnectionStatus, WebSocketError};

fn main() -> Result<(), WebSocketError> {
    panic::set_hook(Box::new(console_error_panic_hook::hook));
    // console_log and log macros are used instead of println!
    // so that messages can be seen in the browser console
    console_log::init_with_level(Level::Trace).expect("Failed to enable logging");
    info!("Creating connection");

    // Client is wrapped in an Rc<RefCell<>> so it can be used within setInterval
    // This isn't required when being used within a game engine
    let client = Rc::new(RefCell::new(wasm_sockets::PollingClient::new(
        "wss://ws.ifelse.io",
    )?));

    let f = Closure::wrap(Box::new(move || {
        if client.borrow().status() == ConnectionStatus::Connected {
            info!("Sending message");
            client.borrow().send_string("Hello, World!").unwrap();
        }
        // receive() gives you all new websocket messages since receive() was last called
        info!("New messages: {:#?}", client.borrow_mut().receive());
    }) as Box<dyn Fn()>);

    // Start non-blocking game loop
    setInterval(&f, 100);
    f.forget();

    Ok(())
}
// Bind setInterval to make a basic game loop
#[wasm_bindgen]
extern "C" {
    fn setInterval(closure: &Closure<dyn Fn()>, time: u32) -> i32;
}

依赖项

~0.4–2.8MB
~58K SLoC