oxigdal_ws/lib.rs
1//! OxiGDAL WebSocket Streaming
2//!
3//! This crate provides WebSocket support for real-time geospatial data streaming.
4//!
5//! # Features
6//!
7//! - **WebSocket Server**: Axum-based WebSocket server with connection management
8//! - **WebSocket Client**: Async client with reconnection support
9//! - **Message Protocol**: Multiple formats (JSON, MessagePack, Binary) with compression
10//! - **Tile Streaming**: Real-time map tile delivery with delta encoding
11//! - **Feature Streaming**: GeoJSON feature updates with change detection
12//! - **Event Streaming**: System events, progress updates, and notifications
13//! - **Subscription Management**: Spatial, temporal, and attribute-based filtering
14//! - **Backpressure Control**: Automatic throttling and flow control
15//!
16//! # Examples
17//!
18//! ## Server
19//!
20//! ```rust,no_run
21//! use oxigdal_ws::server::WebSocketServer;
22//!
23//! #[tokio::main]
24//! async fn main() -> oxigdal_ws::error::Result<()> {
25//! let server = WebSocketServer::builder()
26//! .bind("0.0.0.0:9001")?
27//! .max_connections(10000)
28//! .build();
29//!
30//! server.run().await?;
31//! Ok(())
32//! }
33//! ```
34//!
35//! ## Client
36//!
37//! ```rust,no_run
38//! use oxigdal_ws::client::WebSocketClient;
39//!
40//! #[tokio::main]
41//! async fn main() -> oxigdal_ws::error::Result<()> {
42//! let mut client = WebSocketClient::connect("ws://localhost:9001/ws").await?;
43//!
44//! // Subscribe to tiles
45//! let sub_id = client.subscribe_tiles(
46//! [-122.5, 37.5, -122.0, 38.0],
47//! 10..14
48//! ).await?;
49//!
50//! // Get tile stream
51//! let mut tiles = client.tile_stream();
52//! while let Some(tile) = tiles.next_tile().await {
53//! println!("Received tile: {:?}", tile.coords());
54//! }
55//!
56//! Ok(())
57//! }
58//! ```
59
60#![deny(missing_docs)]
61#![warn(clippy::unwrap_used)]
62
63pub mod client;
64pub mod error;
65pub mod protocol;
66pub mod server;
67pub mod stream;
68pub mod subscription;
69
70/// WebSocket handlers
71pub mod handlers {
72 /// Event streaming handler
73 pub mod events;
74 /// Feature streaming handler
75 pub mod features;
76 /// Tile streaming handler
77 pub mod tiles;
78}
79
80// Re-export commonly used types
81pub use client::{ClientConfig, WebSocketClient};
82pub use error::{Error, Result};
83pub use protocol::{
84 ChangeType, Compression, EventType, Message, MessageFormat, SubscriptionFilter,
85};
86pub use server::{ServerConfig, WebSocketServer};
87pub use stream::{
88 BackpressureController, BackpressureState, DeltaEncoder, EventData, EventStream, FeatureData,
89 FeatureStream, MessageStream, TileData, TileStream,
90};
91pub use subscription::{Subscription, SubscriptionManager, SubscriptionType};
92
93/// Prelude module for convenient imports
94pub mod prelude {
95 pub use crate::client::{ClientConfig, WebSocketClient};
96 pub use crate::error::{Error, Result};
97 pub use crate::protocol::{
98 ChangeType, Compression, EventType, Message, MessageFormat, SubscriptionFilter,
99 };
100 pub use crate::server::{ServerConfig, WebSocketServer};
101 pub use crate::stream::{
102 BackpressureController, BackpressureState, DeltaEncoder, EventData, EventStream,
103 FeatureData, FeatureStream, MessageStream, TileData, TileStream,
104 };
105 pub use crate::subscription::{Subscription, SubscriptionManager, SubscriptionType};
106}
107
108#[cfg(test)]
109mod tests {
110 use super::*;
111
112 #[test]
113 fn test_exports() {
114 // Just verify that key types are exported
115 let _: Option<Error> = None;
116 let _: Option<Message> = None;
117 }
118}