1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//! # wsrouter
//!
//! Fast and easy WebSocket message routing for servers and clients.
//!
//! ## Overview
//!
//! `wsrouter` provides a simple message-based routing layer for WebSocket
//! servers and clients using a lightweight parser.
//!
//! ## Features
//!
//! - `server` – Enables the WebSocket server
//! - `client` – Enables the client-side connector
//!
//!
//! ## Routing
//!
//! - `route(name:text, callback:|params, dispatcher|{})` – Registers a route handler.
//! - `dispatcher` - sends a response. on the server only responses to one client.
//! - `CONNECTED` - Have to be in a route() function. Called when a new connection is established. (only on server)
//! - `DISCONNECTED` - Have to be in a route() function. Called when a connection is closed. (only on server)
//! - `@` - Custom routes. Called when a client sends a message with the specified command.
//!
//! ## Authentication
//!
//! The uuid is always provided as a parameter in the callback functions.
//! This crate does not manage authentication or user state beyond providing this identifier.
//!
//! ## Example
//!
//! ### Server
//!
//! ```no_run
//! # #[tokio::main]
//! # async fn main() {
//! use wsrouter::server::Server;
//!
//! let mut server = Server::new("127.0.0.1:3000");
//! server.route("@PING", |_, dispatcher| {
//! dispatcher.send("@PONG");
//! });
//!
//! server.route("CONNECTED", |params, dispatcher| {
//! println!("New connection: {}", params.get("uuid").unwrap());
//! });
//!
//! server.route("DISCONNECTED", |params, dispatcher| {
//! println!("Connection closed: {}", params.get("uuid").unwrap());
//! });
//!
//!
//! server.serve().await;
//! # }
//! ```
//!
//! ### Client
//!
//! ```no_run
//! # #[tokio::main]
//! # async fn main() {
//! use wsrouter::client::Connector;
//!
//! let connector = Connector::new("ws://localhost:3000");
//! connector.route("@PING", |_, dispatcher| {
//! dispatcher.send("@PONG");
//! });
//!
//! let dispatcher = connector.connect().await;
//! dispatcher.send("@PING");
//! dispatcher.keep_alive().await;
//! # }
//! ```