2 use tokio::timer::Delay;
4 use std::time::{Duration, Instant};
6 pub struct TimeoutStream<S> where S : Stream {
12 impl<S> TimeoutStream<S> where S : Stream {
13 pub fn new(stream: S, timeout: Duration) -> Self {
14 let next_deadline = Delay::new(Instant::now() + timeout);
23 impl<S> Stream for TimeoutStream<S> where S : Stream {
25 type Error = S::Error;
26 fn poll(&mut self) -> Result<Async<Option<S::Item>>, S::Error> {
27 match self.next_deadline.poll() {
28 Ok(Async::Ready(_)) => Ok(Async::Ready(None)),
29 Ok(Async::NotReady) => {
30 match self.stream.poll() {
31 Ok(Async::Ready(v)) => {
32 self.next_deadline.reset(Instant::now() + self.timeout);
35 Ok(Async::NotReady) => Ok(Async::NotReady),
39 Err(_) => Ok(Async::Ready(None)), // TODO: If I want to upstream TimeoutStream this is gonna need some love