Skip to main content

moq_lite/coding/
stream.rs

1use crate::Error;
2use crate::coding::{Reader, Writer};
3
4/// A [Writer] and [Reader] pair for a single stream.
5pub struct Stream<S: web_transport_trait::Session, V> {
6	pub writer: Writer<S::SendStream, V>,
7	pub reader: Reader<S::RecvStream, V>,
8}
9
10impl<S: web_transport_trait::Session, V> Stream<S, V> {
11	/// Open a new stream with the given version.
12	pub async fn open(session: &S, version: V) -> Result<Self, Error>
13	where
14		V: Clone,
15	{
16		let (send, recv) = session.open_bi().await.map_err(Error::from_transport)?;
17
18		let writer = Writer::new(send, version.clone());
19		let reader = Reader::new(recv, version);
20
21		Ok(Stream { writer, reader })
22	}
23
24	/// Accept a new stream with the given version.
25	pub async fn accept(session: &S, version: V) -> Result<Self, Error>
26	where
27		V: Clone,
28	{
29		let (send, recv) = session.accept_bi().await.map_err(Error::from_transport)?;
30
31		let writer = Writer::new(send, version.clone());
32		let reader = Reader::new(recv, version);
33
34		Ok(Stream { writer, reader })
35	}
36
37	/// Cast the stream to a different version, used during version negotiation.
38	pub fn with_version<V2: Clone>(self, version: V2) -> Stream<S, V2> {
39		Stream {
40			writer: self.writer.with_version(version.clone()),
41			reader: self.reader.with_version(version),
42		}
43	}
44}