wip
This commit is contained in:
@@ -16,7 +16,8 @@ mod ping_pong;
|
||||
mod ready;
|
||||
mod settings;
|
||||
mod state;
|
||||
mod stream_tracker;
|
||||
mod stream_recv;
|
||||
mod stream_send;
|
||||
|
||||
pub use self::connection::Connection;
|
||||
pub use self::flow_control::FlowControl;
|
||||
@@ -26,7 +27,8 @@ pub use self::framed_write::FramedWrite;
|
||||
pub use self::ping_pong::PingPong;
|
||||
pub use self::ready::ReadySink;
|
||||
pub use self::settings::Settings;
|
||||
pub use self::stream_tracker::StreamTracker;
|
||||
pub use self::stream_recv::StreamRecv;
|
||||
pub use self::stream_send::StreamSend;
|
||||
|
||||
use self::state::{StreamMap, StreamState};
|
||||
|
||||
@@ -82,14 +84,19 @@ use self::state::{StreamMap, StreamState};
|
||||
///
|
||||
type Transport<T, P, B>=
|
||||
Settings<
|
||||
FlowControl<
|
||||
StreamTracker<
|
||||
PingPong<
|
||||
Framer<T, B>,
|
||||
B>,
|
||||
P>>>;
|
||||
Streams<
|
||||
PingPong<
|
||||
Codec<T, B>,
|
||||
B>,
|
||||
P>>;
|
||||
|
||||
type Framer<T, B> =
|
||||
type Streams<T, P> =
|
||||
StreamSend<
|
||||
FlowControl<
|
||||
StreamRecv<T, P>>,
|
||||
P>;
|
||||
|
||||
type Codec<T, B> =
|
||||
FramedRead<
|
||||
FramedWrite<T, B>>;
|
||||
|
||||
@@ -111,14 +118,22 @@ pub trait ApplySettings {
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct WindowUpdate(pub StreamId, pub WindowSize);
|
||||
pub struct WindowUpdate {
|
||||
stream_id: StreamId,
|
||||
increment: WindowSize
|
||||
}
|
||||
|
||||
impl WindowUpdate {
|
||||
pub fn new(stream_id: StreamId, increment: WindowSize) -> WindowUpdate {
|
||||
WindowUpdate { stream_id, increment }
|
||||
}
|
||||
|
||||
pub fn stream_id(&self) -> StreamId {
|
||||
self.0
|
||||
self.stream_id
|
||||
}
|
||||
|
||||
pub fn increment(&self) -> WindowSize {
|
||||
self.1
|
||||
self.increment
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,14 +154,35 @@ pub trait ControlFlow {
|
||||
/// Exposes stream states to "upper" layers of the transport (i.e. from StreamTracker up
|
||||
/// to Connection).
|
||||
pub trait ControlStreams {
|
||||
/// Accesses the map of all active streams.
|
||||
fn streams(&self)-> &StreamMap;
|
||||
fn is_valid_local_id(id: StreamId) -> bool;
|
||||
fn is_valid_remote_id(id: StreamId) -> bool {
|
||||
!id.is_zero() && !Self::is_valid_local_id(id)
|
||||
}
|
||||
|
||||
/// Mutably accesses the map of all active streams.
|
||||
fn streams_mut(&mut self) -> &mut StreamMap;
|
||||
fn get_active(&self, id: StreamId) -> Option<&StreamState> {
|
||||
self.streams(id).get_active(id)
|
||||
}
|
||||
|
||||
/// Checks whether a stream has been reset.
|
||||
fn stream_is_reset(&self, id: StreamId) -> Option<Reason>;
|
||||
fn get_active_mut(&mut self, id: StreamId) -> Option<&mut StreamState> {
|
||||
self.streams_mut(id).get_active_mut(id)
|
||||
}
|
||||
|
||||
|
||||
fn get_reset(&self, id: StreamId) -> Option<Reason> {
|
||||
self.streams(id).get_reset(id)
|
||||
}
|
||||
|
||||
fn reset(&mut self, id: StreamId, cause: Reason) {
|
||||
self.streams_mut(id).reset(id, cause);
|
||||
}
|
||||
|
||||
fn local_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState> {
|
||||
self.streams_mut(id).local_flow_controller(id)
|
||||
}
|
||||
|
||||
fn remote_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState> {
|
||||
self.streams_mut(id).remote_flow_controller(id)
|
||||
}
|
||||
}
|
||||
|
||||
pub type PingPayload = [u8; 8];
|
||||
@@ -206,26 +242,24 @@ pub fn from_server_handshaker<T, P, B>(settings: Settings<FramedWrite<T, B::Buf>
|
||||
// Replace Settings' writer with a full transport.
|
||||
let transport = settings.swap_inner(|io| {
|
||||
// Delimit the frames.
|
||||
let framer = length_delimited::Builder::new()
|
||||
let framed = length_delimited::Builder::new()
|
||||
.big_endian()
|
||||
.length_field_length(3)
|
||||
.length_adjustment(9)
|
||||
.num_skip(0) // Don't skip the header
|
||||
.new_read(io);
|
||||
|
||||
FlowControl::new(
|
||||
initial_local_window_size,
|
||||
StreamSend::new(
|
||||
initial_remote_window_size,
|
||||
StreamTracker::new(
|
||||
remote_max_concurrency,
|
||||
FlowControl::new(
|
||||
initial_local_window_size,
|
||||
initial_remote_window_size,
|
||||
local_max_concurrency,
|
||||
remote_max_concurrency,
|
||||
PingPong::new(
|
||||
FramedRead::new(framer)
|
||||
)
|
||||
)
|
||||
)
|
||||
StreamRecv::new(
|
||||
initial_local_window_size,
|
||||
local_max_concurrency,
|
||||
PingPong::new(
|
||||
FramedRead::new(framed)))))
|
||||
});
|
||||
|
||||
connection::new(transport)
|
||||
|
||||
Reference in New Issue
Block a user