1use std::sync::Arc;
2
3use anyhow::Result;
4use serde::Serialize;
5pub use wsio_core as core;
6
7mod builder;
8mod config;
9pub mod connection;
10pub mod namespace;
11mod request;
12mod request_adapters;
13mod runtime;
14
15#[cfg(feature = "tower")]
16use crate::request_adapters::tower::layer::WsIoServerLayer;
17use crate::{
18 builder::WsIoServerBuilder,
19 namespace::{
20 WsIoServerNamespace,
21 builder::WsIoServerNamespaceBuilder,
22 },
23 runtime::WsIoServerRuntime,
24};
25
26#[derive(Clone)]
28pub struct WsIoServer(Arc<WsIoServerRuntime>);
29
30impl WsIoServer {
31 pub fn builder() -> WsIoServerBuilder {
33 WsIoServerBuilder::new()
34 }
35
36 #[inline]
37 pub fn connection_count(&self) -> usize {
38 self.0.connection_count()
39 }
40
41 pub async fn emit<D: Serialize>(&self, event: impl AsRef<str>, data: Option<&D>) -> Result<()> {
42 self.0.emit(event.as_ref(), data).await
43 }
44
45 #[cfg(feature = "tower")]
46 pub fn layer(&self) -> WsIoServerLayer {
47 WsIoServerLayer::new(self.0.clone())
48 }
49
50 #[inline]
51 pub fn of(&self, path: impl AsRef<str>) -> Option<Arc<WsIoServerNamespace>> {
52 self.0.get_namespace(path.as_ref())
53 }
54
55 #[inline]
56 pub fn namespace_count(&self) -> usize {
57 self.0.namespace_count()
58 }
59
60 #[inline]
61 pub fn new_namespace_builder(&self, path: impl AsRef<str>) -> Result<WsIoServerNamespaceBuilder> {
62 self.0.new_namespace_builder(path.as_ref())
63 }
64
65 pub async fn remove_namespace(&self, path: impl AsRef<str>) {
66 self.0.remove_namespace(path.as_ref()).await
67 }
68
69 pub async fn shutdown(&self) {
70 self.0.shutdown().await
71 }
72}