moq_lite/coding/
stream.rs

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