Skip to main content

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}