Expand description
§ws-kit
Generic authenticated typed WebSocket toolkit.
Provides:
config::WsConfig— heartbeat, broadcast capacity, connection limits, Origin allow-list with builder.hub::BroadcastHub— typedbroadcast::Sender<T>wrapper with connection counting, generic overT: Clone + Serialize.room::RoomManager/room::Room— DashMap-backed room isolation with participant tracking, over thecodec::Framemessage model (text and binary).room::RoomRegistry— the room-collection trait; swap the in-memory manager for a multi-node backend.extractor::TokenExtractor— configurable token extraction (Authorization: Bearer,?token=,?access_token=,Cookie).origin_allowed_in_parts— Origin validation for the upgrade handshake (CSWSH defense, REQ-WSKIT-200).codec::Codec/codec::JsonCodec— JSON encode/decode via serde.stats::StatsRecorder— backpressure/traffic counters (connections, rooms, bytes/messages in/out, drops), global + per-room, optionalmetrics-facade emission.- With
compression:compression::FrameCompressor— application-layer DEFLATE forFrames (notpermessage-deflate; the module docs explain why). - With
redis:redis_rooms::RedisRoomRegistry— multi-node room fan-out over Redis pub/sub (at-most-once; the module docs explain the topology).
§Quick start
use ws_kit::{config::WsConfig, hub::BroadcastHub, room::RoomManager, codec::Codec};
use serde::{Serialize, Deserialize};
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
struct ChatMsg { user: String, body: String }
let hub = BroadcastHub::<ChatMsg>::new(1024);
let mut rx = hub.subscribe();
hub.broadcast(ChatMsg { user: "alice".into(), body: "hi".into() }).unwrap();
let msg = rx.recv().await.unwrap();
assert_eq!(msg.user, "alice");§Binary messages (0.4.0)
use ws_kit::codec::Frame;
use ws_kit::room::RoomManager;
let m = RoomManager::new();
let room = m.get_or_create("media");
let mut rx = room.subscribe();
room.broadcast(Frame::binary(vec![0xde_u8, 0xad, 0xbe, 0xef])).unwrap();
assert!(rx.recv().await.unwrap().is_binary());Binary payloads are carried opaquely — ws-kit never parses them as
text/JSON; codec::Frame::Text and codec::Frame::Binary are kept
distinct end to end. Authentication (TokenExtractor) operates on the
HTTP upgrade request and is frame-kind-agnostic.
§Features
axum(default): enablesaxumWebSocket andtowerdeps, andTokenExtractor::extract_token(&Parts, _)compression: application-layer DEFLATE forFramepayloads (seecompressionfor the layer assessment)redis: multi-node room fan-out viaredis_rooms::RedisRoomRegistry(at-most-once pub/sub)metrics: emitstatscounters through themetricsfacadetracing: deprecated no-op kept for 0.3.x compatibility
Re-exports§
pub use codec::Codec;pub use codec::Frame;pub use codec::JsonCodec;pub use config::WsConfig;pub use config::WsConfigBuilder;pub use error::WsError;pub use extractor::TokenExtractor;pub use extractor::TokenSourceKind;pub use extractor::WsAuthError;pub use hub::BroadcastHub;pub use origin::normalize_origin;pub use origin::origin_allowed;pub use room::Room;pub use room::RoomManager;pub use room::RoomRegistry;pub use stats::RoomStats;pub use stats::Stats;pub use stats::StatsRecorder;pub use origin::origin_allowed_in_parts;axumpub use compression::extension_accepted;compressionpub use compression::CompressionConfig;compressionpub use compression::FrameCompressor;compressionpub use redis_rooms::RedisRoomRegistry;redis
Modules§
- codec
- Message codec.
- compression
compression - Application-layer payload compression.
- config
- Configuration for WebSocket infrastructure.
- error
- Error types for
ws-kit. - extractor
- Token extraction for WebSocket authentication.
- hub
- Generic broadcast hub.
- origin
- Origin validation for WebSocket upgrades (Cross-Site WebSocket Hijacking defense).
- redis_
rooms redis - Multi-node room fan-out over Redis pub/sub (
redisfeature, off by default). - room
- Room-based group messaging.
- stats
- Backpressure and traffic metrics.