Skip to main content

wsio_server/
lib.rs

1#![cfg_attr(test, allow(clippy::expect_used, clippy::unwrap_used))]
2
3use std::sync::Arc;
4
5use anyhow::Result;
6use serde::Serialize;
7pub use wsio_core as core;
8
9pub mod builder;
10mod config;
11pub mod connection;
12pub mod namespace;
13mod request;
14pub mod request_adapters;
15mod runtime;
16
17#[cfg(feature = "tower")]
18use crate::request_adapters::tower::layer::WsIoServerLayer;
19use crate::{
20    builder::WsIoServerBuilder,
21    namespace::{
22        WsIoServerNamespace,
23        builder::WsIoServerNamespaceBuilder,
24    },
25    runtime::WsIoServerRuntime,
26};
27
28// Structs
29#[derive(Clone, Debug)]
30pub struct WsIoServer(Arc<WsIoServerRuntime>);
31
32impl WsIoServer {
33    // Public methods
34    /// Creates a server builder using the no-op packet transformer.
35    ///
36    /// Use [`WsIoServerBuilder::packet_transformer`] to configure the global
37    /// transformer. Namespace builders can override it individually.
38    pub fn builder() -> WsIoServerBuilder {
39        WsIoServerBuilder::new()
40    }
41
42    pub async fn close_all(&self) {
43        self.0.close_all().await;
44    }
45
46    #[inline]
47    pub fn connection_count(&self) -> usize {
48        self.0.connection_count()
49    }
50
51    pub async fn disconnect_all(&self) {
52        self.0.disconnect_all().await;
53    }
54
55    pub async fn emit<D: Serialize>(&self, event: impl AsRef<str>, data: Option<&D>) -> Result<()> {
56        self.0.emit(event.as_ref(), data).await
57    }
58
59    #[cfg(feature = "tower")]
60    pub fn layer(&self) -> WsIoServerLayer {
61        WsIoServerLayer::new(Arc::clone(&self.0))
62    }
63
64    #[inline]
65    pub fn of(&self, path: impl AsRef<str>) -> Option<Arc<WsIoServerNamespace>> {
66        self.0.get_namespace(path.as_ref())
67    }
68
69    #[inline]
70    pub fn namespace_count(&self) -> usize {
71        self.0.namespace_count()
72    }
73
74    #[inline]
75    pub fn new_namespace_builder(&self, path: impl AsRef<str>) -> WsIoServerNamespaceBuilder {
76        self.0.new_namespace_builder(path.as_ref())
77    }
78
79    pub async fn remove_namespace(&self, path: impl AsRef<str>) {
80        self.0.remove_namespace(path.as_ref()).await;
81    }
82
83    pub async fn shutdown(&self) {
84        self.0.shutdown().await;
85    }
86}