use std::cell::RefCell; use std::rc::Rc; use std::task::{Context, Poll}; use actix_service::Service; #[doc(hidden)] /// Service that allows to turn non-clone service to a service with `Clone` impl /// /// # Panics /// CloneableService might panic with some creative use of thread local storage. /// See https://github.com/actix/actix-web/issues/1295 for example pub(crate) struct CloneableService(Rc>); impl CloneableService { pub(crate) fn new(service: T) -> Self { Self(Rc::new(RefCell::new(service))) } } impl Clone for CloneableService { fn clone(&self) -> Self { Self(self.0.clone()) } } impl Service for CloneableService { type Request = T::Request; type Response = T::Response; type Error = T::Error; type Future = T::Future; fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { self.0.borrow_mut().poll_ready(cx) } fn call(&mut self, req: T::Request) -> Self::Future { self.0.borrow_mut().call(req) } }