Much work

This commit is contained in:
Carl Lerche
2017-06-23 13:13:50 -07:00
parent a3950354aa
commit fa21970656
15 changed files with 531 additions and 77 deletions

View File

@@ -1,16 +1,22 @@
use ConnectionError;
use frame::{self, Frame};
use proto::ReadySink;
use futures::*;
pub struct Settings<T> {
// Upstream transport
inner: T,
// Our settings
local: frame::SettingSet,
// Peer settings
remote: frame::SettingSet,
// Number of acks remaining to send to the peer
remaining_acks: usize,
// True when the local settings must be flushed to the remote
is_dirty: bool,
}
@@ -30,17 +36,13 @@ impl<T> Settings<T>
local: local,
remote: frame::SettingSet::default(),
remaining_acks: 0,
is_dirty: false,
is_dirty: true,
}
}
fn has_pending_sends(&self) -> bool {
self.is_dirty || self.remaining_acks > 0
}
fn try_send_pending(&mut self) -> Poll<(), ConnectionError> {
if self.is_dirty {
let frame = frame::Settings::new(self.local.clone()).into();
let frame = frame::Settings::new(self.local.clone());
try_ready!(self.try_send(frame));
self.is_dirty = false;
@@ -56,8 +58,8 @@ impl<T> Settings<T>
Ok(Async::Ready(()))
}
fn try_send(&mut self, item: frame::Frame) -> Poll<(), ConnectionError> {
if let AsyncSink::NotReady(_) = try!(self.inner.start_send(item)) {
fn try_send(&mut self, item: frame::Settings) -> Poll<(), ConnectionError> {
if let AsyncSink::NotReady(_) = try!(self.inner.start_send(item.into())) {
// Ensure that call to `poll_complete` guarantee is called to satisfied
try!(self.inner.poll_complete());
@@ -110,3 +112,17 @@ impl<T> Sink for Settings<T>
self.inner.close()
}
}
impl<T> ReadySink for Settings<T>
where T: Stream<Item = Frame, Error = ConnectionError>,
T: Sink<SinkItem = Frame, SinkError = ConnectionError>,
T: ReadySink,
{
fn poll_ready(&mut self) -> Poll<(), ConnectionError> {
if try!(self.try_send_pending()).is_ready() {
return self.inner.poll_ready();
}
Ok(Async::NotReady)
}
}