1mod bounds;
2
3use std::future::Future;
4
5pub use crate::bounds::{MaybeSend, MaybeSync};
6use bytes::{Buf, BufMut, Bytes, BytesMut};
7
8pub trait Error: std::error::Error + MaybeSend + MaybeSync + 'static {
12 fn session_error(&self) -> Option<(u32, String)>;
16
17 fn stream_error(&self) -> Option<u32> {
19 None
20 }
21}
22
23pub trait Session: Clone + MaybeSend + MaybeSync + 'static {
28 type SendStream: SendStream;
29 type RecvStream: RecvStream;
30 type Error: Error;
31
32 fn accept_uni(&self)
34 -> impl Future<Output = Result<Self::RecvStream, Self::Error>> + MaybeSend;
35
36 fn accept_bi(
38 &self,
39 ) -> impl Future<Output = Result<(Self::SendStream, Self::RecvStream), Self::Error>> + MaybeSend;
40
41 fn open_bi(
43 &self,
44 ) -> impl Future<Output = Result<(Self::SendStream, Self::RecvStream), Self::Error>> + MaybeSend;
45
46 fn open_uni(&self) -> impl Future<Output = Result<Self::SendStream, Self::Error>> + MaybeSend;
48
49 fn send_datagram(&self, payload: Bytes) -> Result<(), Self::Error>;
59
60 fn recv_datagram(&self) -> impl Future<Output = Result<Bytes, Self::Error>> + MaybeSend;
62
63 fn max_datagram_size(&self) -> usize;
65
66 fn close(&self, code: u32, reason: &str);
68
69 fn closed(&self) -> impl Future<Output = Self::Error> + MaybeSend;
71}
72
73pub trait SendStream: MaybeSend {
78 type Error: Error;
79
80 fn write(&mut self, buf: &[u8])
82 -> impl Future<Output = Result<usize, Self::Error>> + MaybeSend;
83
84 fn write_buf<B: Buf + MaybeSend>(
86 &mut self,
87 buf: &mut B,
88 ) -> impl Future<Output = Result<usize, Self::Error>> + MaybeSend {
89 async move {
90 let chunk = buf.chunk();
91 let size = self.write(chunk).await?;
92 buf.advance(size);
93 Ok(size)
94 }
95 }
96
97 fn write_chunk(
99 &mut self,
100 chunk: Bytes,
101 ) -> impl Future<Output = Result<(), Self::Error>> + MaybeSend {
102 async move {
103 let mut c = chunk;
105 self.write_buf(&mut c).await?;
106 Ok(())
107 }
108 }
109
110 fn write_all(
112 &mut self,
113 buf: &[u8],
114 ) -> impl Future<Output = Result<(), Self::Error>> + MaybeSend {
115 async move {
116 let mut pos = 0;
117 while pos < buf.len() {
118 pos += self.write(&buf[pos..]).await?;
119 }
120 Ok(())
121 }
122 }
123
124 fn write_all_buf<B: Buf + MaybeSend>(
126 &mut self,
127 buf: &mut B,
128 ) -> impl Future<Output = Result<(), Self::Error>> + MaybeSend {
129 async move {
130 while buf.has_remaining() {
131 self.write_buf(buf).await?;
132 }
133 Ok(())
134 }
135 }
136
137 fn set_priority(&mut self, order: u8);
141
142 fn finish(&mut self) -> Result<(), Self::Error>;
150
151 fn reset(&mut self, code: u32);
156
157 fn closed(&mut self) -> impl Future<Output = Result<(), Self::Error>> + MaybeSend;
168}
169
170pub trait RecvStream: MaybeSend {
175 type Error: Error;
176
177 fn read(
181 &mut self,
182 dst: &mut [u8],
183 ) -> impl Future<Output = Result<Option<usize>, Self::Error>> + MaybeSend;
184
185 fn read_buf<B: BufMut + MaybeSend>(
190 &mut self,
191 buf: &mut B,
192 ) -> impl Future<Output = Result<Option<usize>, Self::Error>> + MaybeSend {
193 async move {
194 let dst = unsafe {
195 std::mem::transmute::<&mut bytes::buf::UninitSlice, &mut [u8]>(buf.chunk_mut())
196 };
197 let size = match self.read(dst).await? {
198 Some(size) => size,
199 None => return Ok(None),
200 };
201
202 unsafe { buf.advance_mut(size) };
203
204 Ok(Some(size))
205 }
206 }
207
208 fn read_chunk(
212 &mut self,
213 max: usize,
214 ) -> impl Future<Output = Result<Option<Bytes>, Self::Error>> + MaybeSend {
215 async move {
216 let mut buf = BytesMut::with_capacity(max.min(8 * 1024));
218
219 Ok(self.read_buf(&mut buf).await?.map(|_| buf.freeze()))
220 }
221 }
222
223 fn stop(&mut self, code: u32);
228
229 fn closed(&mut self) -> impl Future<Output = Result<(), Self::Error>> + MaybeSend;
236
237 fn read_all(&mut self) -> impl Future<Output = Result<Bytes, Self::Error>> + MaybeSend {
239 async move {
240 let mut buf = BytesMut::new();
241 self.read_all_buf(&mut buf).await?;
242 Ok(buf.freeze())
243 }
244 }
245
246 fn read_all_buf<B: BufMut + MaybeSend>(
248 &mut self,
249 buf: &mut B,
250 ) -> impl Future<Output = Result<usize, Self::Error>> + MaybeSend {
251 async move {
252 let mut size = 0;
253 while buf.has_remaining_mut() {
254 match self.read_buf(buf).await? {
255 Some(n) => size += n,
256 None => break,
257 }
258 }
259 Ok(size)
260 }
261 }
262}
263
264#[cfg(test)]
265mod tests {
266 use super::{Error, MaybeSend, RecvStream};
267 use bytes::{Bytes, BytesMut};
268 use futures::executor::block_on;
269 use std::fmt;
270
271 #[derive(Debug)]
272 struct TestError;
273
274 impl fmt::Display for TestError {
275 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
276 write!(f, "test error")
277 }
278 }
279
280 impl std::error::Error for TestError {}
281
282 impl Error for TestError {
283 fn session_error(&self) -> Option<(u32, String)> {
284 None
285 }
286 }
287
288 struct TestRecvStream {
289 data: Vec<u8>,
290 pos: usize,
291 }
292
293 impl TestRecvStream {
294 fn new(data: &[u8]) -> Self {
295 Self {
296 data: data.to_vec(),
297 pos: 0,
298 }
299 }
300 }
301
302 impl RecvStream for TestRecvStream {
303 type Error = TestError;
304
305 fn read(
306 &mut self,
307 dst: &mut [u8],
308 ) -> impl std::future::Future<Output = Result<Option<usize>, Self::Error>> + MaybeSend
309 {
310 async move {
311 let available = self.data.len().saturating_sub(self.pos);
312 if available == 0 {
313 return Ok(None);
314 }
315
316 let size = available.min(dst.len());
317 let end = self.pos + size;
318 dst[..size].copy_from_slice(&self.data[self.pos..end]);
319 self.pos = end;
320
321 Ok(Some(size))
322 }
323 }
324
325 fn stop(&mut self, _code: u32) {}
326
327 fn closed(
328 &mut self,
329 ) -> impl std::future::Future<Output = Result<(), Self::Error>> + MaybeSend {
330 async { Ok(()) }
331 }
332 }
333
334 #[test]
335 fn read_chunk_respects_max_and_eof() {
336 let mut stream = TestRecvStream::new(b"hello world");
337
338 let first = block_on(stream.read_chunk(5)).unwrap().unwrap();
339 assert_eq!(first, Bytes::from_static(b"hello"));
340
341 let second = block_on(stream.read_chunk(1024)).unwrap().unwrap();
342 assert_eq!(second, Bytes::from_static(b" world"));
343
344 let end = block_on(stream.read_chunk(1)).unwrap();
345 assert!(end.is_none());
346 }
347
348 #[test]
349 fn read_buf_advances_buffer() {
350 let mut stream = TestRecvStream::new(b"test");
351 let mut buf = BytesMut::with_capacity(4);
352
353 let size = block_on(stream.read_buf(&mut buf)).unwrap().unwrap();
354 assert_eq!(size, 4);
355 assert_eq!(&buf[..], b"test");
356 }
357}