chore: remove un-used tower.rs (#125)
Signed-off-by: nora-coder-dot <nora6677@gmail.com> Co-authored-by: nora-coder-dot <nora6677@gmail.com>
This commit is contained in:
parent
82239581ed
commit
9fc1cc0e0e
1 changed files with 0 additions and 174 deletions
|
|
@ -1,174 +0,0 @@
|
||||||
//! 写这一段原本是为了兼容官方sdk的tower-service这一套,但是想想还是算了,如果仅仅是请求-响应,都完成不了基本任务。要一个完成不了基本的任务的传输层干嘛?
|
|
||||||
|
|
||||||
use std::{collections::VecDeque, task::ready};
|
|
||||||
|
|
||||||
use crate::service::{RxJsonRpcMessage, ServiceRole, TxJsonRpcMessage};
|
|
||||||
|
|
||||||
use super::IntoTransport;
|
|
||||||
use futures::{Sink, Stream};
|
|
||||||
use tower_service::Service as TowerService;
|
|
||||||
pub enum TransportAdapterTower {}
|
|
||||||
|
|
||||||
impl<R, E, S> IntoTransport<R, E, TransportAdapterTower> for S
|
|
||||||
where
|
|
||||||
S: TowerService<TxJsonRpcMessage<R>, Response = RxJsonRpcMessage<R>, Error = E>
|
|
||||||
+ Unpin
|
|
||||||
+ Send
|
|
||||||
+ 'static,
|
|
||||||
R: ServiceRole,
|
|
||||||
E: std::error::Error + Send + 'static,
|
|
||||||
S::Future: Send + 'static,
|
|
||||||
S::Response: Send + 'static,
|
|
||||||
{
|
|
||||||
fn into_transport(
|
|
||||||
self,
|
|
||||||
) -> (
|
|
||||||
impl Sink<TxJsonRpcMessage<R>, Error = E> + Send + 'static,
|
|
||||||
impl Stream<Item = RxJsonRpcMessage<R>> + Send + 'static,
|
|
||||||
) {
|
|
||||||
let sink = TowerServiceSink {
|
|
||||||
service: self,
|
|
||||||
state: TowerServiceSinkState::Ready::<R, S>,
|
|
||||||
rx_wakers: VecDeque::new(),
|
|
||||||
tx_wakers: VecDeque::new(),
|
|
||||||
};
|
|
||||||
IntoTransport::<R, _, ()>::into_transport(sink)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pin_project_lite::pin_project! {
|
|
||||||
pub struct TowerServiceSink<R: ServiceRole, S: TowerService<TxJsonRpcMessage<R>>> {
|
|
||||||
#[pin]
|
|
||||||
service: S,
|
|
||||||
#[pin]
|
|
||||||
state: TowerServiceSinkState<R, S>,
|
|
||||||
rx_wakers: VecDeque<std::task::Waker>,
|
|
||||||
tx_wakers: VecDeque<std::task::Waker>,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pin_project_lite::pin_project! {
|
|
||||||
#[project = TowerServiceSinkStateProj]
|
|
||||||
pub enum TowerServiceSinkState<R: ServiceRole, S: TowerService<TxJsonRpcMessage<R>>> {
|
|
||||||
Ready,
|
|
||||||
Sending {
|
|
||||||
#[pin]
|
|
||||||
fut: S::Future,
|
|
||||||
},
|
|
||||||
Yield {
|
|
||||||
output: Option<S::Response>,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R, S> Sink<TxJsonRpcMessage<R>> for TowerServiceSink<R, S>
|
|
||||||
where
|
|
||||||
R: ServiceRole,
|
|
||||||
S: TowerService<TxJsonRpcMessage<R>> + Unpin,
|
|
||||||
S::Future: Send + 'static,
|
|
||||||
S::Response: Send + 'static,
|
|
||||||
S::Error: Send + 'static,
|
|
||||||
{
|
|
||||||
type Error = S::Error;
|
|
||||||
|
|
||||||
fn poll_ready(
|
|
||||||
mut self: std::pin::Pin<&mut Self>,
|
|
||||||
cx: &mut std::task::Context<'_>,
|
|
||||||
) -> std::task::Poll<Result<(), Self::Error>> {
|
|
||||||
let mut this = self.as_mut().project();
|
|
||||||
let service = this.service;
|
|
||||||
ready!(service.get_mut().poll_ready(cx)?);
|
|
||||||
match this.state.as_mut().project() {
|
|
||||||
TowerServiceSinkStateProj::Ready => std::task::Poll::Ready(Ok(())),
|
|
||||||
TowerServiceSinkStateProj::Sending { fut } => {
|
|
||||||
ready!(fut.poll(cx))?;
|
|
||||||
this.state.set(TowerServiceSinkState::Ready);
|
|
||||||
std::task::Poll::Ready(Ok(()))
|
|
||||||
}
|
|
||||||
TowerServiceSinkStateProj::Yield { .. } => {
|
|
||||||
this.state.set(TowerServiceSinkState::Ready);
|
|
||||||
this.rx_wakers.drain(..).for_each(|waker| waker.wake());
|
|
||||||
this.tx_wakers.push_back(cx.waker().clone());
|
|
||||||
std::task::Poll::Pending
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn start_send(
|
|
||||||
mut self: std::pin::Pin<&mut Self>,
|
|
||||||
item: TxJsonRpcMessage<R>,
|
|
||||||
) -> Result<(), Self::Error> {
|
|
||||||
let mut this = self.as_mut().project();
|
|
||||||
let service = this.service;
|
|
||||||
if let TxJsonRpcMessage::<R>::Request(req) = &item {
|
|
||||||
let fut = service.get_mut().call(item);
|
|
||||||
this.state.set(TowerServiceSinkState::Sending { fut });
|
|
||||||
} else {
|
|
||||||
tracing::debug!(message = ?item, "omit notification due to the transport layer limit");
|
|
||||||
this.state.set(TowerServiceSinkState::Ready);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn poll_flush(
|
|
||||||
mut self: std::pin::Pin<&mut Self>,
|
|
||||||
cx: &mut std::task::Context<'_>,
|
|
||||||
) -> std::task::Poll<Result<(), Self::Error>> {
|
|
||||||
let mut this = self.as_mut().project();
|
|
||||||
let service = this.service;
|
|
||||||
ready!(service.get_mut().poll_ready(cx)?);
|
|
||||||
loop {
|
|
||||||
match this.state.as_mut().project() {
|
|
||||||
TowerServiceSinkStateProj::Ready => return std::task::Poll::Ready(Ok(())),
|
|
||||||
TowerServiceSinkStateProj::Sending { fut } => {
|
|
||||||
let output = ready!(fut.poll(cx))?;
|
|
||||||
this.state.set(TowerServiceSinkState::Yield {
|
|
||||||
output: Some(output),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
TowerServiceSinkStateProj::Yield { .. } => {
|
|
||||||
this.state.set(TowerServiceSinkState::Ready);
|
|
||||||
this.rx_wakers.drain(..).for_each(|waker| waker.wake());
|
|
||||||
return std::task::Poll::Ready(Ok(()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn poll_close(
|
|
||||||
self: std::pin::Pin<&mut Self>,
|
|
||||||
cx: &mut std::task::Context<'_>,
|
|
||||||
) -> std::task::Poll<Result<(), Self::Error>> {
|
|
||||||
self.poll_flush(cx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R, S> Stream for TowerServiceSink<R, S>
|
|
||||||
where
|
|
||||||
R: ServiceRole,
|
|
||||||
S: TowerService<TxJsonRpcMessage<R>, Response = RxJsonRpcMessage<R>>,
|
|
||||||
{
|
|
||||||
type Item = S::Response;
|
|
||||||
|
|
||||||
fn poll_next(
|
|
||||||
mut self: std::pin::Pin<&mut Self>,
|
|
||||||
cx: &mut std::task::Context<'_>,
|
|
||||||
) -> std::task::Poll<Option<Self::Item>> {
|
|
||||||
let mut this = self.as_mut().project();
|
|
||||||
match this.state.as_mut().project() {
|
|
||||||
TowerServiceSinkStateProj::Ready => {
|
|
||||||
this.rx_wakers.push_back(cx.waker().clone());
|
|
||||||
std::task::Poll::Pending
|
|
||||||
}
|
|
||||||
TowerServiceSinkStateProj::Sending { .. } => {
|
|
||||||
this.rx_wakers.push_back(cx.waker().clone());
|
|
||||||
std::task::Poll::Pending
|
|
||||||
}
|
|
||||||
TowerServiceSinkStateProj::Yield { output } => {
|
|
||||||
this.tx_wakers.drain(..).for_each(|waker| waker.wake());
|
|
||||||
let output = output.take().expect("should have an output");
|
|
||||||
this.state.set(TowerServiceSinkState::Ready);
|
|
||||||
std::task::Poll::Ready(Some(output))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue