add generic transport trait
This commit is contained in:
parent
cf2a80b323
commit
9d48201504
|
@ -4,4 +4,5 @@ members = [
|
||||||
"moq-transport-quinn",
|
"moq-transport-quinn",
|
||||||
"moq-demo",
|
"moq-demo",
|
||||||
"moq-warp",
|
"moq-warp",
|
||||||
|
"transport",
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
[package]
|
||||||
|
name = "moq-generic-transport"
|
||||||
|
description = "Media over QUIC"
|
||||||
|
authors = [ "Luke Curley" ]
|
||||||
|
repository = "https://github.com/kixelated/moq-rs"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
keywords = [ "quic", "http3", "webtransport", "media", "live" ]
|
||||||
|
categories = [ "multimedia", "network-programming", "web-programming" ]
|
||||||
|
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bytes = "1"
|
||||||
|
thiserror = "1.0.21"
|
||||||
|
log = "0.4"
|
||||||
|
|
||||||
|
anyhow = "1.0.70"
|
|
@ -0,0 +1,174 @@
|
||||||
|
// Coming from https://github.com/hyperium/h3, the goal is to
|
||||||
|
// do a PR with the changes afterwards
|
||||||
|
|
||||||
|
use std::task::{self, Poll};
|
||||||
|
use bytes::Buf;
|
||||||
|
use anyhow::Error;
|
||||||
|
|
||||||
|
type ErrorCode = u64;
|
||||||
|
type StreamId = u64;
|
||||||
|
|
||||||
|
/// Trait representing a QUIC connection.
|
||||||
|
pub trait Connection<B: Buf> {
|
||||||
|
/// The type produced by `poll_accept_bidi()`
|
||||||
|
type BidiStream: SendStream + RecvStream;
|
||||||
|
/// The type of the sending part of `BidiStream`
|
||||||
|
type SendStream: SendStream;
|
||||||
|
/// The type produced by `poll_accept_recv()`
|
||||||
|
type RecvStream: RecvStream;
|
||||||
|
/// A producer of outgoing Unidirectional and Bidirectional streams.
|
||||||
|
type OpenStreams: OpenStreams<
|
||||||
|
B,
|
||||||
|
SendStream = Self::SendStream,
|
||||||
|
RecvStream = Self::RecvStream,
|
||||||
|
BidiStream = Self::BidiStream,
|
||||||
|
>;
|
||||||
|
/// Error type yielded by this trait methods
|
||||||
|
type Error: Into<Box<Error>>;
|
||||||
|
|
||||||
|
/// Accept an incoming unidirectional stream
|
||||||
|
///
|
||||||
|
/// Returning `None` implies the connection is closing or closed.
|
||||||
|
fn poll_accept_recv(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Option<Self::RecvStream>, Self::Error>>;
|
||||||
|
|
||||||
|
/// Accept an incoming bidirectional stream
|
||||||
|
///
|
||||||
|
/// Returning `None` implies the connection is closing or closed.
|
||||||
|
fn poll_accept_bidi(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Option<Self::BidiStream>, Self::Error>>;
|
||||||
|
|
||||||
|
/// Poll the connection to create a new bidirectional stream.
|
||||||
|
fn poll_open_bidi(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Self::BidiStream, Self::Error>>;
|
||||||
|
|
||||||
|
/// Poll the connection to create a new unidirectional stream.
|
||||||
|
fn poll_open_send(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Self::SendStream, Self::Error>>;
|
||||||
|
|
||||||
|
/// Get an object to open outgoing streams.
|
||||||
|
fn opener(&self) -> Self::OpenStreams;
|
||||||
|
|
||||||
|
/// Close the connection immediately
|
||||||
|
fn close(&mut self, code: ErrorCode, reason: &[u8]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Extends the `Connection` trait for receiving datagrams
|
||||||
|
///
|
||||||
|
/// See: <https://www.rfc-editor.org/rfc/rfc9297>
|
||||||
|
pub trait RecvDatagramExt {
|
||||||
|
/// The type of `Buf` for *raw* datagrams (without the stream_id decoded)
|
||||||
|
type Buf: Buf;
|
||||||
|
/// The error type that can occur when receiving a datagram
|
||||||
|
type Error: Into<Box<Error>>;
|
||||||
|
|
||||||
|
/// Poll the connection for incoming datagrams.
|
||||||
|
fn poll_accept_datagram(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Option<Self::Buf>, Self::Error>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Trait for opening outgoing streams
|
||||||
|
pub trait OpenStreams<B: Buf> {
|
||||||
|
/// The type produced by `poll_open_bidi()`
|
||||||
|
type BidiStream: SendStream + RecvStream;
|
||||||
|
/// The type produced by `poll_open_send()`
|
||||||
|
type SendStream: SendStream;
|
||||||
|
/// The type of the receiving part of `BidiStream`
|
||||||
|
type RecvStream: RecvStream;
|
||||||
|
/// Error type yielded by these trait methods
|
||||||
|
type Error: Into<Box<Error>>;
|
||||||
|
|
||||||
|
/// Poll the connection to create a new bidirectional stream.
|
||||||
|
fn poll_open_bidi(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Self::BidiStream, Self::Error>>;
|
||||||
|
|
||||||
|
/// Poll the connection to create a new unidirectional stream.
|
||||||
|
fn poll_open_send(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Self::SendStream, Self::Error>>;
|
||||||
|
|
||||||
|
/// Close the connection immediately
|
||||||
|
fn close(&mut self, code: ErrorCode, reason: &[u8]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A trait describing the "send" actions of a QUIC stream.
|
||||||
|
pub trait SendStream {
|
||||||
|
/// The error type returned by fallible send methods.
|
||||||
|
type Error: Into<Box<Error>>;
|
||||||
|
|
||||||
|
/// Polls if the stream can send more data.
|
||||||
|
fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>>;
|
||||||
|
|
||||||
|
/// Send more data on the stream.
|
||||||
|
fn send_data<T: Buf>(&mut self, data: T) -> Result<(), Self::Error>;
|
||||||
|
|
||||||
|
/// Poll to finish the sending side of the stream.
|
||||||
|
fn poll_finish(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>>;
|
||||||
|
|
||||||
|
/// Send a QUIC reset code.
|
||||||
|
fn reset(&mut self, reset_code: u64);
|
||||||
|
|
||||||
|
/// Get QUIC send stream id
|
||||||
|
fn send_id(&self) -> StreamId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allows sending unframed pure bytes to a stream. Similar to [`AsyncWrite`](https://docs.rs/tokio/latest/tokio/io/trait.AsyncWrite.html)
|
||||||
|
pub trait SendStreamUnframed<B: Buf>: SendStream {
|
||||||
|
/// Attempts write data into the stream.
|
||||||
|
///
|
||||||
|
/// Returns the number of bytes written.
|
||||||
|
///
|
||||||
|
/// `buf` is advanced by the number of bytes written.
|
||||||
|
fn poll_send<D: Buf>(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
buf: &mut D,
|
||||||
|
) -> Poll<Result<usize, Self::Error>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A trait describing the "receive" actions of a QUIC stream.
|
||||||
|
pub trait RecvStream {
|
||||||
|
/// The type of `Buf` for data received on this stream.
|
||||||
|
type Buf: Buf;
|
||||||
|
/// The error type that can occur when receiving data.
|
||||||
|
type Error: Into<Box<Error>>;
|
||||||
|
|
||||||
|
/// Poll the stream for more data.
|
||||||
|
///
|
||||||
|
/// When the receive side will no longer receive more data (such as because
|
||||||
|
/// the peer closed their sending side), this should return `None`.
|
||||||
|
fn poll_data(
|
||||||
|
&mut self,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> Poll<Result<Option<Self::Buf>, Self::Error>>;
|
||||||
|
|
||||||
|
/// Send a `STOP_SENDING` QUIC code.
|
||||||
|
fn stop_sending(&mut self, error_code: u64);
|
||||||
|
|
||||||
|
/// Get QUIC send stream id
|
||||||
|
fn recv_id(&self) -> StreamId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Optional trait to allow "splitting" a bidirectional stream into two sides.
|
||||||
|
pub trait BidiStream<B: Buf>: SendStream + RecvStream {
|
||||||
|
/// The type for the send half.
|
||||||
|
type SendStream: SendStream;
|
||||||
|
/// The type for the receive half.
|
||||||
|
type RecvStream: RecvStream;
|
||||||
|
|
||||||
|
/// Split this stream into two halves.
|
||||||
|
fn split(self) -> (Self::SendStream, Self::RecvStream);
|
||||||
|
}
|
Loading…
Reference in New Issue