use std::sync::Arc;
use tower_layer::Layer;
use crate::{
SocketIoConfig,
adapter::{Adapter, LocalAdapter},
client::Client,
service::SocketIoService,
};
pub struct SocketIoLayer<A: Adapter = LocalAdapter> {
client: Arc<Client<A>>,
}
impl<A: Adapter> Clone for SocketIoLayer<A> {
fn clone(&self) -> Self {
Self {
client: self.client.clone(),
}
}
}
impl<A: Adapter> SocketIoLayer<A> {
pub(crate) fn from_config(
config: SocketIoConfig,
adapter_state: A::State,
#[cfg(feature = "state")] state: state::TypeMap![Send + Sync],
) -> (Self, Arc<Client<A>>) {
let client = Arc::new(Client::new(
config,
adapter_state,
#[cfg(feature = "state")]
state,
));
let layer = Self {
client: client.clone(),
};
(layer, client)
}
}
impl<S: Clone, A: Adapter> Layer<S> for SocketIoLayer<A> {
type Service = SocketIoService<S, A>;
fn layer(&self, inner: S) -> Self::Service {
SocketIoService::with_client(inner, self.client.clone())
}
}