Circle WebSocket Client (circle_client_ws)
This crate provides a WebSocket client (CircleWsClient) designed to interact with a server that expects JSON-RPC messages, specifically for executing Rhai scripts.
It is designed to be compatible with both WebAssembly (WASM) environments (e.g., web browsers) and native Rust applications.
Features
- Cross-Platform: Works in WASM and native environments.
- Uses
gloo-netfor WebSockets in WASM. - Uses
tokio-tungstenitefor WebSockets in native applications.
- Uses
- JSON-RPC Communication: Implements client-side JSON-RPC 2.0 request and response handling.
- Rhai Script Execution: Provides a
play(script: String)method to send Rhai scripts to the server for execution and receive their output. - Asynchronous Operations: Leverages
async/awaitandfuturesfor non-blocking communication. - Connection Management: Supports connecting to and disconnecting from a WebSocket server.
- Error Handling: Defines a comprehensive
CircleWsClientErrorenum for various client-side errors.
Core Component
CircleWsClient: The main client struct.new(ws_url: String): Creates a new client instance targeting the given WebSocket URL.connect(): Establishes the WebSocket connection.play(script: String): Sends a Rhai script to the server for execution and returns the result.disconnect(): Closes the WebSocket connection.
Usage Example (Conceptual)
use circle_client_ws::CircleWsClient;
async fn run_client() {
let mut client = CircleWsClient::new("ws://localhost:8080/ws".to_string());
if let Err(e) = client.connect().await {
eprintln!("Failed to connect: {}", e);
return;
}
let script = "print(\"Hello from Rhai via WebSocket!\"); 40 + 2".to_string();
match client.play(script).await {
Ok(result) => {
println!("Script output: {}", result.output);
}
Err(e) => {
eprintln!("Error during play: {}", e);
}
}
client.disconnect().await;
}
// To run this example, you'd need an async runtime like tokio for native
// or wasm-bindgen-test for WASM.
Building
Native
cargo build
WASM
cargo build --target wasm32-unknown-unknown
Dependencies
Key dependencies include:
serde,serde_json: For JSON serialization/deserialization.futures-channel,futures-util: For asynchronous stream and sink handling.uuid: For generating unique request IDs.log: For logging.thiserror: For error type definitions.
WASM-specific:
gloo-net: For WebSocket communication in WASM.wasm-bindgen-futures: To bridge Rust futures with JavaScript promises.
Native-specific:
tokio-tungstenite: For WebSocket communication in native environments.tokio: Asynchronous runtime for native applications.url: For URL parsing.