1use core::any::TypeId;
2use core::fmt::{self, Debug};
3use core::future::pending;
4use core::hash::{Hash, Hasher};
5use core::iter::zip;
6use core::marker::PhantomData;
7use core::mem;
8use core::ops::{Deref, DerefMut};
9use core::pin::Pin;
10
11use bytes::{BufMut as _, Bytes, BytesMut};
12use futures::stream::{self, FuturesUnordered};
13use futures::{FutureExt as _, Stream, StreamExt as _, TryStreamExt as _};
14use tokio::io::{AsyncRead, AsyncReadExt as _, AsyncWrite};
15use tokio::select;
16use tokio::sync::{mpsc, oneshot};
17use tokio::task::JoinSet;
18use tokio_stream::wrappers::ReceiverStream;
19use tokio_util::codec::{Encoder as _, FramedRead};
20use tokio_util::io::StreamReader;
21use tracing::{Instrument as _, Span, error, instrument, trace};
22use wasm_tokio::cm::{
23 BoolCodec, F32Codec, F64Codec, OptionDecoder, OptionEncoder, PrimValEncoder, ResultDecoder,
24 ResultEncoder, S8Codec, S16Codec, S32Codec, S64Codec, TupleDecoder, TupleEncoder, U8Codec,
25 U16Codec, U32Codec, U64Codec,
26};
27use wasm_tokio::{
28 CoreNameDecoder, CoreNameEncoder, CoreVecDecoder, CoreVecDecoderBytes, CoreVecEncoderBytes,
29 DEFAULT_MAX_INITIAL_CAPACITY, Leb128DecoderI8, Leb128DecoderI16, Leb128DecoderI32,
30 Leb128DecoderI64, Leb128DecoderI128, Leb128DecoderU8, Leb128DecoderU16, Leb128DecoderU32,
31 Leb128DecoderU64, Leb128DecoderU128, Leb128Encoder, Utf8Codec,
32};
33
34use crate::frame::Outgoing;
35use crate::{BufferedIncoming, copy_io_error, encode_ready_bytes_header, error_receiver_closed};
36
37pub const READ_CHUNK_SIZE: usize = 8192;
39
40fn encode_ready_bytes<T: AsRef<[u8]>>(chunks: &[T], dst: &mut BytesMut) -> std::io::Result<()> {
41 let n = chunks.iter().map(|chunk| chunk.as_ref().len()).sum();
42 encode_ready_bytes_header(n, dst)?;
43 dst.reserve(n);
44 for chunk in chunks {
45 dst.extend_from_slice(chunk.as_ref());
46 }
47 Ok(())
48}
49
50#[repr(transparent)]
52pub struct ResourceBorrow<T: ?Sized> {
53 repr: Bytes,
54 _ty: PhantomData<T>,
55}
56
57impl<T: ?Sized> From<Bytes> for ResourceBorrow<T> {
58 fn from(repr: Bytes) -> Self {
59 Self {
60 repr,
61 _ty: PhantomData,
62 }
63 }
64}
65
66impl<T: ?Sized> From<Vec<u8>> for ResourceBorrow<T> {
67 fn from(repr: Vec<u8>) -> Self {
68 Self {
69 repr: repr.into(),
70 _ty: PhantomData,
71 }
72 }
73}
74
75impl<T: ?Sized> From<ResourceBorrow<T>> for Bytes {
76 fn from(ResourceBorrow { repr, .. }: ResourceBorrow<T>) -> Self {
77 repr
78 }
79}
80
81impl<T: ?Sized> PartialEq for ResourceBorrow<T> {
82 fn eq(&self, other: &Self) -> bool {
83 self.repr == other.repr
84 }
85}
86
87impl<T: ?Sized> Eq for ResourceBorrow<T> {}
88
89impl<T: ?Sized> Hash for ResourceBorrow<T> {
90 fn hash<H: Hasher>(&self, state: &mut H) {
91 self.repr.hash(state);
92 }
93}
94
95impl<T: ?Sized> AsRef<[u8]> for ResourceBorrow<T> {
96 fn as_ref(&self) -> &[u8] {
97 &self.repr
98 }
99}
100
101impl<T: ?Sized> AsRef<Bytes> for ResourceBorrow<T> {
102 fn as_ref(&self) -> &Bytes {
103 &self.repr
104 }
105}
106
107impl<T: ?Sized + 'static> Debug for ResourceBorrow<T> {
108 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 write!(f, "borrow<{:?}>", TypeId::of::<T>())
110 }
111}
112
113impl<T: ?Sized> Clone for ResourceBorrow<T> {
114 fn clone(&self) -> Self {
115 Self {
116 repr: self.repr.clone(),
117 _ty: PhantomData,
118 }
119 }
120}
121
122impl<T: ?Sized> ResourceBorrow<T> {
123 pub fn new(repr: impl Into<Bytes>) -> Self {
125 Self::from(repr.into())
126 }
127}
128
129#[repr(transparent)]
131pub struct ResourceOwn<T: ?Sized> {
132 repr: Bytes,
133 _ty: PhantomData<T>,
134}
135
136impl<T: ?Sized> From<ResourceOwn<T>> for ResourceBorrow<T> {
137 fn from(ResourceOwn { repr, _ty }: ResourceOwn<T>) -> Self {
138 Self {
139 repr,
140 _ty: PhantomData,
141 }
142 }
143}
144
145impl<T: ?Sized> From<Bytes> for ResourceOwn<T> {
146 fn from(repr: Bytes) -> Self {
147 Self {
148 repr,
149 _ty: PhantomData,
150 }
151 }
152}
153
154impl<T: ?Sized> From<Vec<u8>> for ResourceOwn<T> {
155 fn from(repr: Vec<u8>) -> Self {
156 Self {
157 repr: repr.into(),
158 _ty: PhantomData,
159 }
160 }
161}
162
163impl<T: ?Sized> From<ResourceOwn<T>> for Bytes {
164 fn from(ResourceOwn { repr, .. }: ResourceOwn<T>) -> Self {
165 repr
166 }
167}
168
169impl<T: ?Sized> PartialEq for ResourceOwn<T> {
170 fn eq(&self, other: &Self) -> bool {
171 self.repr == other.repr
172 }
173}
174
175impl<T: ?Sized> Eq for ResourceOwn<T> {}
176
177impl<T: ?Sized> Hash for ResourceOwn<T> {
178 fn hash<H: Hasher>(&self, state: &mut H) {
179 self.repr.hash(state);
180 }
181}
182
183impl<T: ?Sized> AsRef<[u8]> for ResourceOwn<T> {
184 fn as_ref(&self) -> &[u8] {
185 &self.repr
186 }
187}
188
189impl<T: ?Sized> AsRef<Bytes> for ResourceOwn<T> {
190 fn as_ref(&self) -> &Bytes {
191 &self.repr
192 }
193}
194
195impl<T: ?Sized + 'static> Debug for ResourceOwn<T> {
196 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
197 write!(f, "own<{:?}>", TypeId::of::<T>())
198 }
199}
200
201impl<T: ?Sized> Clone for ResourceOwn<T> {
202 fn clone(&self) -> Self {
203 Self {
204 repr: self.repr.clone(),
205 _ty: PhantomData,
206 }
207 }
208}
209
210impl<T: ?Sized> ResourceOwn<T> {
211 pub fn new(repr: impl Into<Bytes>) -> Self {
213 Self::from(repr.into())
214 }
215
216 pub fn as_borrow(&self) -> ResourceBorrow<T> {
218 ResourceBorrow {
219 repr: self.repr.clone(),
220 _ty: PhantomData,
221 }
222 }
223}
224
225pub type DeferredFn<T> = Box<
227 dyn FnOnce(T, Vec<usize>) -> Pin<Box<dyn Future<Output = std::io::Result<()>> + Send>> + Send,
228>;
229
230pub trait Deferred<T> {
232 fn take_deferred(&mut self) -> Option<DeferredFn<T>>;
234}
235
236macro_rules! impl_deferred_sync {
237 ($t:ty) => {
238 impl<T> Deferred<T> for $t {
239 fn take_deferred(&mut self) -> Option<DeferredFn<T>> {
240 None
241 }
242 }
243 };
244}
245
246impl_deferred_sync!(BoolCodec);
247impl_deferred_sync!(S8Codec);
248impl_deferred_sync!(U8Codec);
249impl_deferred_sync!(S16Codec);
250impl_deferred_sync!(U16Codec);
251impl_deferred_sync!(S32Codec);
252impl_deferred_sync!(U32Codec);
253impl_deferred_sync!(S64Codec);
254impl_deferred_sync!(U64Codec);
255impl_deferred_sync!(F32Codec);
256impl_deferred_sync!(F64Codec);
257impl_deferred_sync!(CoreNameDecoder);
258impl_deferred_sync!(CoreNameEncoder);
259impl_deferred_sync!(CoreVecDecoderBytes);
260impl_deferred_sync!(CoreVecEncoderBytes);
261impl_deferred_sync!(Utf8Codec);
262impl_deferred_sync!(PrimValEncoder);
263impl_deferred_sync!(Leb128Encoder);
264impl_deferred_sync!(Leb128DecoderI8);
265impl_deferred_sync!(Leb128DecoderU8);
266impl_deferred_sync!(Leb128DecoderI16);
267impl_deferred_sync!(Leb128DecoderU16);
268impl_deferred_sync!(Leb128DecoderI32);
269impl_deferred_sync!(Leb128DecoderU32);
270impl_deferred_sync!(Leb128DecoderI64);
271impl_deferred_sync!(Leb128DecoderU64);
272impl_deferred_sync!(Leb128DecoderI128);
273impl_deferred_sync!(Leb128DecoderU128);
274impl_deferred_sync!(ResourceEncoder);
275impl_deferred_sync!(UnitCodec);
276impl_deferred_sync!(ListDecoderU8);
277
278impl_deferred_sync!(CoreVecDecoder<BoolCodec>);
279impl_deferred_sync!(CoreVecDecoder<S8Codec>);
280impl_deferred_sync!(CoreVecDecoder<U8Codec>);
281impl_deferred_sync!(CoreVecDecoder<S16Codec>);
282impl_deferred_sync!(CoreVecDecoder<U16Codec>);
283impl_deferred_sync!(CoreVecDecoder<S32Codec>);
284impl_deferred_sync!(CoreVecDecoder<U32Codec>);
285impl_deferred_sync!(CoreVecDecoder<S64Codec>);
286impl_deferred_sync!(CoreVecDecoder<U64Codec>);
287impl_deferred_sync!(CoreVecDecoder<F32Codec>);
288impl_deferred_sync!(CoreVecDecoder<F64Codec>);
289impl_deferred_sync!(CoreVecDecoder<CoreNameDecoder>);
290impl_deferred_sync!(CoreVecDecoder<CoreVecDecoderBytes>);
291impl_deferred_sync!(CoreVecDecoder<Utf8Codec>);
292impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI8>);
293impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU8>);
294impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI16>);
295impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU16>);
296impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI32>);
297impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU32>);
298impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI64>);
299impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU64>);
300impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI128>);
301impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU128>);
302impl_deferred_sync!(CoreVecDecoder<UnitCodec>);
303
304pub struct SyncCodec<T>(pub T);
309
310impl<T> Deref for SyncCodec<T> {
311 type Target = T;
312
313 fn deref(&self) -> &Self::Target {
314 &self.0
315 }
316}
317
318impl<T> DerefMut for SyncCodec<T> {
319 fn deref_mut(&mut self) -> &mut Self::Target {
320 &mut self.0
321 }
322}
323
324impl<T, C> Deferred<T> for SyncCodec<C> {
325 fn take_deferred(&mut self) -> Option<DeferredFn<T>> {
326 None
327 }
328}
329
330impl<T: Default> Default for SyncCodec<T> {
331 fn default() -> Self {
332 Self(T::default())
333 }
334}
335
336impl<T, I> tokio_util::codec::Encoder<I> for SyncCodec<T>
337where
338 T: tokio_util::codec::Encoder<I>,
339{
340 type Error = T::Error;
341
342 fn encode(&mut self, item: I, dst: &mut BytesMut) -> Result<(), Self::Error> {
343 self.0.encode(item, dst)
344 }
345}
346
347impl<T> tokio_util::codec::Decoder for SyncCodec<T>
348where
349 T: tokio_util::codec::Decoder,
350{
351 type Item = T::Item;
352 type Error = T::Error;
353
354 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
355 self.0.decode(src)
356 }
357
358 fn decode_eof(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
359 self.0.decode_eof(buf)
360 }
361
362 fn framed<IO: AsyncRead + AsyncWrite + Sized>(
363 self,
364 io: IO,
365 ) -> tokio_util::codec::Framed<IO, Self>
366 where
367 Self: Sized,
368 {
369 self.0.framed(io).map_codec(Self)
370 }
371}
372
373pub trait Index: Sized {
375 fn index(&self, path: &[usize]) -> std::io::Result<Self>;
377}
378
379impl Index for Outgoing {
380 fn index(&self, path: &[usize]) -> std::io::Result<Self> {
381 Self::index(self, path)
382 }
383}
384
385impl Index for BufferedIncoming {
386 fn index(&self, path: &[usize]) -> std::io::Result<Self> {
387 Self::index(self, path).map_err(std::io::Error::other)
388 }
389}
390
391pub trait Sink: Index + Send + 'static {
396 fn write_future<T>(
398 self,
399 offset: usize,
400 item: impl Future<Output = T> + Send + 'static,
401 ) -> impl Future<Output = std::io::Result<()>> + Send
402 where
403 T: Encode<Self>,
404 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>;
405
406 fn write_stream<T>(
408 self,
409 offset: usize,
410 items: impl Stream<Item = Vec<T>> + Send + Unpin + 'static,
411 ) -> impl Future<Output = std::io::Result<()>> + Send
412 where
413 T: Encode<Self> + Send + 'static,
414 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>;
415
416 fn write_stream_bytes(
418 self,
419 offset: usize,
420 items: impl Stream<Item = Bytes> + Send + Unpin + 'static,
421 ) -> impl Future<Output = std::io::Result<()>> + Send;
422
423 fn write_stream_read(
425 self,
426 offset: usize,
427 ready: BytesMut,
428 items: impl AsyncRead + Send + Unpin + 'static,
429 ) -> impl Future<Output = std::io::Result<()>> + Send;
430}
431
432impl Sink for Outgoing {
433 async fn write_future<T>(
434 mut self,
435 _offset: usize,
436 item: impl Future<Output = T> + Send + 'static,
437 ) -> std::io::Result<()>
438 where
439 T: Encode<Self>,
440 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
441 {
442 let item = item.await;
443 let mut enc = T::Encoder::default();
444 let mut buf = BytesMut::default();
445 enc.encode(item, &mut buf)?;
446 self.write_bytes(buf.freeze()).await?;
447 match enc.take_deferred() {
448 Some(f) => f(self, Vec::default()).await,
449 _ => Ok(()),
450 }
451 }
452
453 async fn write_stream<T>(
454 mut self,
455 _offset: usize,
456 mut items: impl Stream<Item = Vec<T>> + Send + Unpin + 'static,
457 ) -> std::io::Result<()>
458 where
459 T: Encode<Self> + Send + 'static,
460 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
461 {
462 let mut enc = T::Encoder::default();
463 let mut buf = BytesMut::default();
464 let mut tasks = JoinSet::default();
465 let mut i = 0_u64;
466 loop {
467 select! {
468 chunk = items.next() => {
469 let Some(chunk) = chunk else {
470 trace!("writing stream end");
471 buf.reserve(1);
472 buf.put_u8(0x00);
473 self.write_bytes(buf.split().freeze()).await?;
474 while let Some(res) = tasks.join_next().await {
475 trace!(?res, "receiver task finished");
476 res??;
477 }
478 return Ok(())
479 };
480 if chunk.is_empty() {
481 continue;
482 }
483 let n = u32::try_from(chunk.len()).map_err(|err| {
484 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
485 })?;
486 let end = i.checked_add(n.into()).ok_or_else(|| {
487 std::io::Error::new(
488 std::io::ErrorKind::InvalidInput,
489 "stream element index would overflow u64",
490 )
491 })?;
492 trace!(n, "encoding chunk length");
493 Leb128Encoder.encode(n, &mut buf)?;
494 trace!(i, buf = format!("{buf:02x?}"), "writing stream chunk items");
495
496 buf.reserve(chunk.len());
497 for (i, item) in zip(i.., chunk) {
498 enc.encode(item, &mut buf)?;
499 if let Some(f) = enc.take_deferred() {
500 let i = usize::try_from(i)
501 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
502 let w = self.index(&[i])?;
503 trace!("spawning transmit task");
504 tasks.spawn(f(w, Vec::default()));
505 }
506 }
507 i = end;
508 }
509 Some(res) = tasks.join_next() => {
510 trace!(?res, "receiver task finished");
511 res??;
512 }
513 res = self.reserve(), if !buf.is_empty() => {
514 res?;
515 trace!(?buf, "writing bytes from buffer");
516 self.send_reserved(buf.split().freeze())?;
517 }
518 }
519 }
520 }
521
522 async fn write_stream_bytes(
523 mut self,
524 _offset: usize,
525 mut items: impl Stream<Item = Bytes> + Send + Unpin + 'static,
526 ) -> std::io::Result<()> {
527 let mut buf = BytesMut::default();
528 loop {
529 select! {
530 chunk = items.next() => {
531 let Some(chunk) = chunk else {
532 trace!("writing stream end");
533 buf.reserve(1);
534 buf.put_u8(0x00);
535 return self.write_bytes(buf.split().freeze()).await
536 };
537 if chunk.is_empty() {
538 continue;
539 }
540 let n = u32::try_from(chunk.len()).map_err(|err| {
541 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
542 })?;
543 trace!(n, "encoding chunk length");
544 Leb128Encoder.encode(n, &mut buf)?;
545 buf.extend_from_slice(&chunk);
546 }
547 res = self.reserve(), if !buf.is_empty() => {
548 res?;
549 self.send_reserved(buf.split().freeze())?;
550 }
551 }
552 }
553 }
554
555 async fn write_stream_read(
556 mut self,
557 _offset: usize,
558 mut buf: BytesMut,
559 mut items: impl AsyncRead + Send + Unpin + 'static,
560 ) -> std::io::Result<()> {
561 if !buf.is_empty() {
562 let n = u32::try_from(buf.len())
563 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
564 trace!(n, "writing ready chunk length");
565 let mut header = BytesMut::default();
566 Leb128Encoder.encode(n, &mut header)?;
567 self.write_bytes(header.freeze()).await?;
568 }
569 let mut chunk = BytesMut::with_capacity(READ_CHUNK_SIZE);
570 loop {
571 select! {
572 res = items.read_buf(&mut chunk) => {
573 let n = res?;
574 if n == 0 {
575 trace!("writing stream end");
576 buf.reserve(1);
577 buf.put_u8(0x00);
578 return self.write_bytes(buf.split().freeze()).await
579 }
580 let n = u32::try_from(n).map_err(|err| {
581 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
582 })?;
583 trace!(n, "encoding chunk length");
584 Leb128Encoder.encode(n, &mut buf)?;
585 buf.extend_from_slice(&chunk);
586 chunk.clear();
587 }
588 res = self.reserve(), if !buf.is_empty() => {
589 res?;
590 self.send_reserved(buf.split().freeze())?;
591 }
592 }
593 }
594 }
595}
596
597#[instrument(level = "trace", skip(w, deferred))]
598async fn handle_deferred<T, I>(w: T, deferred: I, mut path: Vec<usize>) -> std::io::Result<()>
599where
600 T: Index,
601 I: IntoIterator<Item = Option<DeferredFn<T>>>,
602 I::IntoIter: ExactSizeIterator,
603{
604 let mut futs = FuturesUnordered::default();
605 for (i, f) in zip(0.., deferred) {
606 if let Some(f) = f {
607 path.push(i);
608 let w = w.index(&path)?;
609 path.pop();
610 futs.push(f(w, Vec::default()));
611 }
612 }
613 while let Some(()) = futs.try_next().await? {}
614 Ok(())
615}
616
617pub trait Encode<W: Sink = Outgoing>: Sized {
619 type Encoder: tokio_util::codec::Encoder<Self> + Deferred<W> + Default + Send;
621
622 #[instrument(level = "trace", skip(self, enc))]
624 fn encode(
625 self,
626 enc: &mut Self::Encoder,
627 dst: &mut BytesMut,
628 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
629 {
630 enc.encode(self, dst)?;
631 Ok(enc.take_deferred())
632 }
633
634 #[instrument(level = "trace", skip(items, enc))]
636 fn encode_iter_own<I>(
637 items: I,
638 enc: &mut Self::Encoder,
639 dst: &mut BytesMut,
640 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
641 where
642 I: IntoIterator<Item = Self>,
643 I::IntoIter: ExactSizeIterator,
644 {
645 let items = items.into_iter();
646 dst.reserve(items.len());
647 let mut deferred = Vec::with_capacity(items.len());
648 for item in items {
649 enc.encode(item, dst)?;
650 deferred.push(enc.take_deferred());
651 }
652 if deferred.iter().any(Option::is_some) {
653 Ok(Some(Box::new(move |w, path| {
654 Box::pin(handle_deferred(w, deferred, path))
655 })))
656 } else {
657 Ok(None)
658 }
659 }
660
661 #[instrument(level = "trace", skip(items, enc))]
663 fn encode_iter_ref<'a, I>(
664 items: I,
665 enc: &mut Self::Encoder,
666 dst: &mut BytesMut,
667 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error>
668 where
669 I: IntoIterator<Item = &'a Self>,
670 I::IntoIter: ExactSizeIterator,
671 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
672 {
673 let items = items.into_iter();
674 dst.reserve(items.len());
675 let mut deferred = Vec::with_capacity(items.len());
676 for item in items {
677 enc.encode(item, dst)?;
678 deferred.push(enc.take_deferred());
679 }
680 if deferred.iter().any(Option::is_some) {
681 Ok(Some(Box::new(move |w, path| {
682 Box::pin(handle_deferred(w, deferred, path))
683 })))
684 } else {
685 Ok(None)
686 }
687 }
688
689 #[instrument(level = "trace", skip(items, enc), fields(ty = "list"))]
691 fn encode_list_own(
692 items: Vec<Self>,
693 enc: &mut Self::Encoder,
694 dst: &mut BytesMut,
695 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
696 {
697 let n = u32::try_from(items.len())
698 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
699 dst.reserve(5 + items.len());
700 Leb128Encoder.encode(n, dst)?;
701 Self::encode_iter_own(items, enc, dst)
702 }
703
704 #[instrument(level = "trace", skip(items, enc), fields(ty = "list"))]
706 fn encode_list_ref<'a>(
707 items: &'a [Self],
708 enc: &mut Self::Encoder,
709 dst: &mut BytesMut,
710 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error>
711 where
712 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
713 {
714 let n = u32::try_from(items.len())
715 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
716 dst.reserve(5 + items.len());
717 Leb128Encoder.encode(n, dst)?;
718 Self::encode_iter_ref(items, enc, dst)
719 }
720}
721
722pub trait Decode: Sized {
724 type Decoder: tokio_util::codec::Decoder<Item = Self>
726 + Deferred<BufferedIncoming>
727 + Default
728 + Send
729 + 'static;
730 type ListDecoder: tokio_util::codec::Decoder<Item = Vec<Self>> + Default + 'static;
732}
733
734impl<T, W> Deferred<W> for OptionEncoder<T>
735where
736 T: Deferred<W>,
737{
738 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
739 self.0.take_deferred()
740 }
741}
742
743impl<T, W: Sink> Encode<W> for Option<T>
744where
745 T: Encode<W>,
746{
747 type Encoder = OptionEncoder<T::Encoder>;
748}
749
750impl<'a, T, W: Sink> Encode<W> for &'a Option<T>
751where
752 T: Encode<W>,
753 T::Encoder: tokio_util::codec::Encoder<&'a T>,
754{
755 type Encoder = OptionEncoder<T::Encoder>;
756}
757
758impl<T, W> Deferred<W> for OptionDecoder<T>
759where
760 T: Deferred<W> + Default,
761{
762 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
763 mem::take(self).into_inner().take_deferred()
764 }
765}
766
767impl<T> Decode for Option<T>
768where
769 T: Decode,
770{
771 type Decoder = OptionDecoder<T::Decoder>;
772 type ListDecoder = ListDecoder<Self::Decoder>;
773}
774
775impl<O, E, W> Deferred<W> for ResultEncoder<O, E>
776where
777 O: Deferred<W>,
778 E: Deferred<W>,
779{
780 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
781 match (self.ok.take_deferred(), self.err.take_deferred()) {
782 (None, None) => None,
783 (Some(ok), None) => Some(ok),
784 (None, Some(err)) => Some(err),
785 (Some(ok), Some(_)) => {
786 if cfg!(debug_assertions) {
787 panic!("both `result::ok` and `result::err` deferred function set");
788 } else {
789 Some(ok)
790 }
791 }
792 }
793 }
794}
795
796impl<O, E, W: Sink> Encode<W> for Result<O, E>
797where
798 O: Encode<W>,
799 E: Encode<W>,
800 std::io::Error: From<<O::Encoder as tokio_util::codec::Encoder<O>>::Error>,
801 std::io::Error: From<<E::Encoder as tokio_util::codec::Encoder<E>>::Error>,
802{
803 type Encoder = ResultEncoder<O::Encoder, E::Encoder>;
804}
805
806impl<'a, O, E, W: Sink> Encode<W> for &'a Result<O, E>
807where
808 O: Encode<W>,
809 O::Encoder: tokio_util::codec::Encoder<&'a O>,
810 E: Encode<W>,
811 E::Encoder: tokio_util::codec::Encoder<&'a E>,
812 std::io::Error: From<<O::Encoder as tokio_util::codec::Encoder<&'a O>>::Error>,
813 std::io::Error: From<<E::Encoder as tokio_util::codec::Encoder<&'a E>>::Error>,
814{
815 type Encoder = ResultEncoder<O::Encoder, E::Encoder>;
816}
817
818impl<O, E, W> Deferred<W> for ResultDecoder<O, E>
819where
820 O: Deferred<W> + Default,
821 E: Deferred<W> + Default,
822{
823 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
824 let (mut ok, mut err) = mem::take(self).into_inner();
825 match (ok.take_deferred(), err.take_deferred()) {
826 (None, None) => None,
827 (Some(ok), None) => Some(ok),
828 (None, Some(err)) => Some(err),
829 (Some(ok), Some(_)) => {
830 if cfg!(debug_assertions) {
831 panic!("both `result::ok` and `result::err` deferred function set");
832 } else {
833 Some(ok)
834 }
835 }
836 }
837 }
838}
839
840impl<O, E> Decode for Result<O, E>
841where
842 O: Decode,
843 E: Decode,
844 std::io::Error: From<<O::Decoder as tokio_util::codec::Decoder>::Error>,
845 std::io::Error: From<<E::Decoder as tokio_util::codec::Decoder>::Error>,
846{
847 type Decoder = ResultDecoder<O::Decoder, E::Decoder>;
848 type ListDecoder = ListDecoder<Self::Decoder>;
849}
850
851pub struct ListEncoder<W = Outgoing> {
853 deferred: Option<DeferredFn<W>>,
854}
855
856impl<W> Default for ListEncoder<W> {
857 fn default() -> Self {
858 Self { deferred: None }
859 }
860}
861
862impl<W> Deferred<W> for ListEncoder<W> {
863 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
864 self.deferred.take()
865 }
866}
867
868impl<T, W: Sink> tokio_util::codec::Encoder<Vec<T>> for ListEncoder<W>
869where
870 T: Encode<W>,
871{
872 type Error = <T::Encoder as tokio_util::codec::Encoder<T>>::Error;
873
874 fn encode(&mut self, items: Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
875 let mut enc = T::Encoder::default();
876 self.deferred = T::encode_list_own(items, &mut enc, dst)?;
877 Ok(())
878 }
879}
880
881impl<'a, T, W: Sink> tokio_util::codec::Encoder<&'a Vec<T>> for ListEncoder<W>
882where
883 T: Encode<W>,
884 T::Encoder: tokio_util::codec::Encoder<&'a T>,
885{
886 type Error = <T::Encoder as tokio_util::codec::Encoder<&'a T>>::Error;
887
888 fn encode(&mut self, items: &'a Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
889 let mut enc = T::Encoder::default();
890 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
891 Ok(())
892 }
893}
894
895impl<'a, 'b, T, W: Sink> tokio_util::codec::Encoder<&'a &'b Vec<T>> for ListEncoder<W>
896where
897 T: Encode<W>,
898 T::Encoder: tokio_util::codec::Encoder<&'b T>,
899{
900 type Error = <T::Encoder as tokio_util::codec::Encoder<&'b T>>::Error;
901
902 fn encode(&mut self, items: &'a &'b Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
903 let mut enc = T::Encoder::default();
904 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
905 Ok(())
906 }
907}
908
909impl<'a, T, W: Sink> tokio_util::codec::Encoder<&'a [T]> for ListEncoder<W>
910where
911 T: Encode<W>,
912 T::Encoder: tokio_util::codec::Encoder<&'a T>,
913{
914 type Error = <T::Encoder as tokio_util::codec::Encoder<&'a T>>::Error;
915
916 fn encode(&mut self, items: &'a [T], dst: &mut BytesMut) -> Result<(), Self::Error> {
917 let mut enc = T::Encoder::default();
918 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
919 Ok(())
920 }
921}
922
923impl<'a, 'b, T, W: Sink> tokio_util::codec::Encoder<&'a &'b [T]> for ListEncoder<W>
924where
925 T: Encode<W>,
926 T::Encoder: tokio_util::codec::Encoder<&'b T>,
927{
928 type Error = <T::Encoder as tokio_util::codec::Encoder<&'b T>>::Error;
929
930 fn encode(&mut self, items: &'a &'b [T], dst: &mut BytesMut) -> Result<(), Self::Error> {
931 let mut enc = T::Encoder::default();
932 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
933 Ok(())
934 }
935}
936
937impl<T, W: Sink> Encode<W> for Vec<T>
938where
939 T: Encode<W>,
940{
941 type Encoder = ListEncoder<W>;
942}
943
944impl<'a, T, W: Sink> Encode<W> for &'a Vec<T>
945where
946 T: Encode<W>,
947 T::Encoder: tokio_util::codec::Encoder<&'a T>,
948{
949 type Encoder = ListEncoder<W>;
950}
951
952impl<'a, T, W: Sink> Encode<W> for &'a [T]
953where
954 T: Encode<W>,
955 T::Encoder: tokio_util::codec::Encoder<&'a T>,
956{
957 type Encoder = ListEncoder<W>;
958}
959
960pub struct ListDecoder<T>
962where
963 T: tokio_util::codec::Decoder,
964{
965 dec: T,
966 ret: Vec<T::Item>,
967 cap: usize,
968 deferred: Vec<Option<DeferredFn<BufferedIncoming>>>,
969}
970
971impl<T> ListDecoder<T>
972where
973 T: tokio_util::codec::Decoder,
974{
975 pub fn new(dec: T) -> Self {
977 Self {
978 dec,
979 ret: Vec::default(),
980 cap: 0,
981 deferred: vec![],
982 }
983 }
984}
985
986impl<T> Default for ListDecoder<T>
987where
988 T: tokio_util::codec::Decoder + Default,
989{
990 fn default() -> Self {
991 Self::new(T::default())
992 }
993}
994
995impl<T> Deferred<BufferedIncoming> for ListDecoder<T>
996where
997 T: tokio_util::codec::Decoder,
998{
999 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1000 let deferred = mem::take(&mut self.deferred);
1001 if deferred.iter().any(Option::is_some) {
1002 Some(Box::new(|r, path| {
1003 Box::pin(handle_deferred(r, deferred, path))
1004 }))
1005 } else {
1006 None
1007 }
1008 }
1009}
1010
1011impl<T> tokio_util::codec::Decoder for ListDecoder<T>
1012where
1013 T: tokio_util::codec::Decoder + Deferred<BufferedIncoming>,
1014{
1015 type Item = Vec<T::Item>;
1016 type Error = T::Error;
1017
1018 #[instrument(level = "trace", skip(self), fields(ty = "list"))]
1019 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1020 if self.cap == 0 {
1021 let Some(len) = Leb128DecoderU32.decode(src)? else {
1022 return Ok(None);
1023 };
1024 if len == 0 {
1025 return Ok(Some(Vec::default()));
1026 }
1027 let len = usize::try_from(len)
1028 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
1029 self.ret = Vec::with_capacity(
1030 len.min(DEFAULT_MAX_INITIAL_CAPACITY / mem::size_of::<T::Item>().max(1)),
1031 );
1032 self.deferred = Vec::with_capacity(len.min(
1033 DEFAULT_MAX_INITIAL_CAPACITY
1034 / mem::size_of::<Option<DeferredFn<BufferedIncoming>>>(),
1035 ));
1036 self.cap = len;
1037 }
1038 while self.cap > 0 {
1039 let v = match self.dec.decode(src) {
1040 Ok(Some(v)) => v,
1041 Ok(None) => return Ok(None),
1042 Err(err) => {
1043 self.cap = 0;
1044 self.ret.clear();
1045 self.deferred.clear();
1046 return Err(err);
1047 }
1048 };
1049 self.ret.push(v);
1050 self.deferred.push(self.dec.take_deferred());
1051 self.cap -= 1;
1052 }
1053 Ok(Some(mem::take(&mut self.ret)))
1054 }
1055}
1056
1057impl<T> Decode for Vec<T>
1058where
1059 T: Decode + Send,
1060 T::ListDecoder: Deferred<BufferedIncoming> + Send,
1061{
1062 type Decoder = T::ListDecoder;
1063 type ListDecoder = ListDecoder<Self::Decoder>;
1064}
1065
1066macro_rules! impl_copy_codec {
1067 ($t:ty, $c:tt) => {
1068 impl<W: Sink> Encode<W> for $t {
1069 type Encoder = $c;
1070
1071 #[instrument(level = "trace", skip(items))]
1072 fn encode_iter_own<I>(
1073 items: I,
1074 enc: &mut Self::Encoder,
1075 dst: &mut BytesMut,
1076 ) -> Result<
1077 Option<DeferredFn<W>>,
1078 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
1079 >
1080 where
1081 I: IntoIterator<Item = Self>,
1082 I::IntoIter: ExactSizeIterator,
1083 {
1084 let items = items.into_iter();
1085 dst.reserve(items.len());
1086 for item in items {
1087 enc.encode(item, dst)?;
1088 }
1089 Ok(None)
1090 }
1091
1092 #[instrument(level = "trace", skip(items))]
1093 fn encode_iter_ref<'a, I>(
1094 items: I,
1095 enc: &mut Self::Encoder,
1096 dst: &mut BytesMut,
1097 ) -> Result<
1098 Option<DeferredFn<W>>,
1099 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
1100 >
1101 where
1102 I: IntoIterator<Item = &'a Self>,
1103 I::IntoIter: ExactSizeIterator,
1104 {
1105 let items = items.into_iter();
1106 dst.reserve(items.len());
1107 for item in items {
1108 enc.encode(*item, dst)?;
1109 }
1110 Ok(None)
1111 }
1112 }
1113
1114 impl<'b, W: Sink> Encode<W> for &'b $t {
1115 type Encoder = $c;
1116
1117 #[instrument(level = "trace", skip(items))]
1118 fn encode_iter_own<I>(
1119 items: I,
1120 enc: &mut Self::Encoder,
1121 dst: &mut BytesMut,
1122 ) -> Result<
1123 Option<DeferredFn<W>>,
1124 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
1125 >
1126 where
1127 I: IntoIterator<Item = Self>,
1128 I::IntoIter: ExactSizeIterator,
1129 {
1130 let items = items.into_iter();
1131 dst.reserve(items.len());
1132 for item in items {
1133 enc.encode(*item, dst)?;
1134 }
1135 Ok(None)
1136 }
1137
1138 #[instrument(level = "trace", skip(items))]
1139 fn encode_iter_ref<'a, I>(
1140 items: I,
1141 enc: &mut Self::Encoder,
1142 dst: &mut BytesMut,
1143 ) -> Result<
1144 Option<DeferredFn<W>>,
1145 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
1146 >
1147 where
1148 I: IntoIterator<Item = &'a Self>,
1149 I::IntoIter: ExactSizeIterator,
1150 'b: 'a,
1151 {
1152 let items = items.into_iter();
1153 dst.reserve(items.len());
1154 for item in items {
1155 enc.encode(item, dst)?;
1156 }
1157 Ok(None)
1158 }
1159 }
1160
1161 impl Decode for $t {
1162 type Decoder = $c;
1163 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1164 }
1165 };
1166}
1167
1168const CANONICAL_NAN_F32: u32 = 0x7fc0_0000;
1175const CANONICAL_NAN_F64: u64 = 0x7ff8_0000_0000_0000;
1176
1177macro_rules! impl_canonical_nan_codec {
1181 ($name:ident, $inner:ty, $t:ty, $canon:expr_2021) => {
1182 #[doc = concat!("Canonicalizes `NaN`s on encode, wrapping [`", stringify!($inner), "`].")]
1183 #[derive(Debug, Default)]
1184 pub struct $name($inner);
1185
1186 impl tokio_util::codec::Encoder<$t> for $name {
1187 type Error = std::io::Error;
1188
1189 fn encode(&mut self, item: $t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1190 let item = if item.is_nan() {
1191 <$t>::from_bits($canon)
1192 } else {
1193 item
1194 };
1195 self.0.encode(item, dst)
1196 }
1197 }
1198
1199 impl tokio_util::codec::Encoder<&$t> for $name {
1200 type Error = std::io::Error;
1201
1202 fn encode(&mut self, item: &$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1203 tokio_util::codec::Encoder::<$t>::encode(self, *item, dst)
1204 }
1205 }
1206
1207 impl tokio_util::codec::Encoder<&&$t> for $name {
1208 type Error = std::io::Error;
1209
1210 fn encode(&mut self, item: &&$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
1211 tokio_util::codec::Encoder::<$t>::encode(self, **item, dst)
1212 }
1213 }
1214
1215 impl tokio_util::codec::Decoder for $name {
1216 type Item = $t;
1217 type Error = std::io::Error;
1218
1219 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<$t>, Self::Error> {
1220 self.0.decode(src)
1221 }
1222 }
1223
1224 impl_deferred_sync!($name);
1225 impl_deferred_sync!(CoreVecDecoder<$name>);
1226 };
1227}
1228
1229impl_canonical_nan_codec!(CanonicalNanF32Codec, F32Codec, f32, CANONICAL_NAN_F32);
1230impl_canonical_nan_codec!(CanonicalNanF64Codec, F64Codec, f64, CANONICAL_NAN_F64);
1231
1232impl_copy_codec!(bool, BoolCodec);
1233impl_copy_codec!(i8, S8Codec);
1234impl_copy_codec!(i16, S16Codec);
1235impl_copy_codec!(u16, U16Codec);
1236impl_copy_codec!(i32, S32Codec);
1237impl_copy_codec!(u32, U32Codec);
1238impl_copy_codec!(i64, S64Codec);
1239impl_copy_codec!(u64, U64Codec);
1240impl_copy_codec!(f32, CanonicalNanF32Codec);
1241impl_copy_codec!(f64, CanonicalNanF64Codec);
1242impl_copy_codec!(char, Utf8Codec);
1243
1244impl<W: Sink> Encode<W> for u8 {
1245 type Encoder = U8Codec;
1246
1247 #[instrument(level = "trace", skip(items))]
1248 fn encode_iter_own<I>(
1249 items: I,
1250 enc: &mut Self::Encoder,
1251 dst: &mut BytesMut,
1252 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
1253 where
1254 I: IntoIterator<Item = Self>,
1255 I::IntoIter: ExactSizeIterator,
1256 {
1257 let items = items.into_iter();
1258 dst.reserve(items.len());
1259 dst.extend(items);
1260 Ok(None)
1261 }
1262
1263 #[instrument(level = "trace", skip(items))]
1264 fn encode_iter_ref<'a, I>(
1265 items: I,
1266 enc: &mut Self::Encoder,
1267 dst: &mut BytesMut,
1268 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error>
1269 where
1270 I: IntoIterator<Item = &'a Self>,
1271 I::IntoIter: ExactSizeIterator,
1272 {
1273 let items = items.into_iter();
1274 dst.reserve(items.len());
1275 dst.extend(items);
1276 Ok(None)
1277 }
1278
1279 #[instrument(level = "trace", skip(items), fields(ty = "list<u8>"))]
1280 fn encode_list_own(
1281 items: Vec<Self>,
1282 enc: &mut Self::Encoder,
1283 dst: &mut BytesMut,
1284 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
1285 {
1286 CoreVecEncoderBytes.encode(items, dst)?;
1287 Ok(None)
1288 }
1289
1290 #[instrument(level = "trace", skip(items), fields(ty = "list<u8>"))]
1291 fn encode_list_ref<'a>(
1292 items: &'a [Self],
1293 enc: &mut Self::Encoder,
1294 dst: &mut BytesMut,
1295 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error>
1296 where
1297 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
1298 {
1299 CoreVecEncoderBytes.encode(items, dst)?;
1300 Ok(None)
1301 }
1302}
1303
1304impl<'b, W: Sink> Encode<W> for &'b u8 {
1305 type Encoder = U8Codec;
1306
1307 #[instrument(level = "trace", skip(items))]
1308 fn encode_iter_own<I>(
1309 items: I,
1310 enc: &mut Self::Encoder,
1311 dst: &mut BytesMut,
1312 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error>
1313 where
1314 I: IntoIterator<Item = Self>,
1315 I::IntoIter: ExactSizeIterator,
1316 {
1317 let items = items.into_iter();
1318 dst.reserve(items.len());
1319 dst.extend(items);
1320 Ok(None)
1321 }
1322
1323 #[instrument(level = "trace", skip(items))]
1324 fn encode_iter_ref<'a, I>(
1325 items: I,
1326 enc: &mut Self::Encoder,
1327 dst: &mut BytesMut,
1328 ) -> Result<Option<DeferredFn<W>>, <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error>
1329 where
1330 I: IntoIterator<Item = &'a Self>,
1331 I::IntoIter: ExactSizeIterator,
1332 'b: 'a,
1333 {
1334 let items = items.into_iter();
1335 dst.reserve(items.len());
1336 dst.extend(items.map(|b| **b));
1337 Ok(None)
1338 }
1339}
1340
1341#[derive(Debug, Default)]
1343#[repr(transparent)]
1344pub struct ListDecoderU8(CoreVecDecoderBytes);
1345
1346impl tokio_util::codec::Decoder for ListDecoderU8 {
1347 type Item = Vec<u8>;
1348 type Error = <CoreVecDecoderBytes as tokio_util::codec::Decoder>::Error;
1349
1350 #[instrument(level = "trace", skip(self), fields(ty = "list<u8>"))]
1351 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1352 let Some(buf) = self.0.decode(src)? else {
1353 return Ok(None);
1354 };
1355 Ok(Some(buf.into()))
1356 }
1357}
1358
1359impl Decode for u8 {
1360 type Decoder = U8Codec;
1361 type ListDecoder = ListDecoderU8;
1362}
1363
1364impl<W: Sink> Encode<W> for &str {
1365 type Encoder = CoreNameEncoder;
1366}
1367
1368impl<W: Sink> Encode<W> for &&str {
1369 type Encoder = CoreNameEncoder;
1370}
1371
1372impl<W: Sink> Encode<W> for String {
1373 type Encoder = CoreNameEncoder;
1374}
1375
1376impl<W: Sink> Encode<W> for &String {
1377 type Encoder = CoreNameEncoder;
1378}
1379
1380impl Decode for String {
1381 type Decoder = CoreNameDecoder;
1382 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1383}
1384
1385impl<W: Sink> Encode<W> for Bytes {
1386 type Encoder = CoreVecEncoderBytes;
1387}
1388
1389impl<W: Sink> Encode<W> for &Bytes {
1390 type Encoder = CoreVecEncoderBytes;
1391}
1392
1393impl Decode for Bytes {
1394 type Decoder = CoreVecDecoderBytes;
1395 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1396}
1397
1398#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
1400#[repr(transparent)]
1401pub struct ResourceEncoder;
1402
1403impl<T: ?Sized> tokio_util::codec::Encoder<ResourceOwn<T>> for ResourceEncoder {
1404 type Error = std::io::Error;
1405
1406 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "own"))]
1407 fn encode(&mut self, item: ResourceOwn<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1408 CoreVecEncoderBytes.encode(item.repr, dst)
1409 }
1410}
1411
1412impl<T: ?Sized> tokio_util::codec::Encoder<&ResourceOwn<T>> for ResourceEncoder {
1413 type Error = std::io::Error;
1414
1415 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "own"))]
1416 fn encode(&mut self, item: &ResourceOwn<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1417 CoreVecEncoderBytes.encode(&item.repr, dst)
1418 }
1419}
1420
1421impl<T: ?Sized, W: Sink> Encode<W> for ResourceOwn<T> {
1422 type Encoder = ResourceEncoder;
1423}
1424
1425impl<T: ?Sized, W: Sink> Encode<W> for &ResourceOwn<T> {
1426 type Encoder = ResourceEncoder;
1427}
1428
1429impl<T: ?Sized> tokio_util::codec::Encoder<ResourceBorrow<T>> for ResourceEncoder {
1430 type Error = std::io::Error;
1431
1432 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "borrow"))]
1433 fn encode(&mut self, item: ResourceBorrow<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1434 CoreVecEncoderBytes.encode(item.repr, dst)
1435 }
1436}
1437
1438impl<T: ?Sized> tokio_util::codec::Encoder<&ResourceBorrow<T>> for ResourceEncoder {
1439 type Error = std::io::Error;
1440
1441 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "borrow"))]
1442 fn encode(&mut self, item: &ResourceBorrow<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1443 CoreVecEncoderBytes.encode(&item.repr, dst)
1444 }
1445}
1446
1447impl<T: ?Sized, W: Sink> Encode<W> for ResourceBorrow<T> {
1448 type Encoder = ResourceEncoder;
1449}
1450
1451impl<T: ?Sized, W: Sink> Encode<W> for &ResourceBorrow<T> {
1452 type Encoder = ResourceEncoder;
1453}
1454
1455#[derive(Debug)]
1457#[repr(transparent)]
1458pub struct ResourceBorrowDecoder<T: ?Sized> {
1459 dec: CoreVecDecoderBytes,
1460 _ty: PhantomData<T>,
1461}
1462
1463impl<T: ?Sized> Default for ResourceBorrowDecoder<T> {
1464 fn default() -> Self {
1465 Self {
1466 dec: CoreVecDecoderBytes::default(),
1467 _ty: PhantomData,
1468 }
1469 }
1470}
1471
1472impl<T: ?Sized> Deferred<BufferedIncoming> for ResourceBorrowDecoder<T> {
1473 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1474 None
1475 }
1476}
1477
1478impl<T: ?Sized> Deferred<BufferedIncoming> for CoreVecDecoder<ResourceBorrowDecoder<T>> {
1479 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1480 None
1481 }
1482}
1483
1484impl<T: ?Sized + Send + 'static> Decode for ResourceBorrow<T> {
1485 type Decoder = ResourceBorrowDecoder<T>;
1486 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1487}
1488
1489impl<T: ?Sized> tokio_util::codec::Decoder for ResourceBorrowDecoder<T> {
1490 type Item = ResourceBorrow<T>;
1491 type Error = std::io::Error;
1492
1493 #[instrument(level = "trace", skip(self), fields(ty = "borrow"))]
1494 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1495 let repr = self.dec.decode(src)?;
1496 Ok(repr.map(Self::Item::from))
1497 }
1498}
1499
1500#[derive(Debug)]
1502#[repr(transparent)]
1503pub struct ResourceOwnDecoder<T: ?Sized> {
1504 dec: CoreVecDecoderBytes,
1505 _ty: PhantomData<T>,
1506}
1507
1508impl<T: ?Sized> Default for ResourceOwnDecoder<T> {
1509 fn default() -> Self {
1510 Self {
1511 dec: CoreVecDecoderBytes::default(),
1512 _ty: PhantomData,
1513 }
1514 }
1515}
1516
1517impl<T: ?Sized> Deferred<BufferedIncoming> for ResourceOwnDecoder<T> {
1518 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1519 None
1520 }
1521}
1522
1523impl<T: ?Sized> Deferred<BufferedIncoming> for CoreVecDecoder<ResourceOwnDecoder<T>> {
1524 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1525 None
1526 }
1527}
1528
1529impl<T: ?Sized + Send + 'static> Decode for ResourceOwn<T> {
1530 type Decoder = ResourceOwnDecoder<T>;
1531 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1532}
1533
1534impl<T: ?Sized> tokio_util::codec::Decoder for ResourceOwnDecoder<T> {
1535 type Item = ResourceOwn<T>;
1536 type Error = std::io::Error;
1537
1538 #[instrument(level = "trace", skip(self), fields(ty = "own"))]
1539 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1540 let repr = self.dec.decode(src)?;
1541 Ok(repr.map(Self::Item::from))
1542 }
1543}
1544
1545#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
1547#[repr(transparent)]
1548pub struct UnitCodec;
1549
1550impl tokio_util::codec::Encoder<()> for UnitCodec {
1551 type Error = std::io::Error;
1552
1553 #[instrument(level = "trace", skip(self), ret)]
1554 fn encode(&mut self, (): (), dst: &mut BytesMut) -> std::io::Result<()> {
1555 Ok(())
1556 }
1557}
1558
1559impl tokio_util::codec::Encoder<&()> for UnitCodec {
1560 type Error = std::io::Error;
1561
1562 #[instrument(level = "trace", skip(self), ret)]
1563 fn encode(&mut self, (): &(), dst: &mut BytesMut) -> std::io::Result<()> {
1564 Ok(())
1565 }
1566}
1567
1568impl tokio_util::codec::Decoder for UnitCodec {
1569 type Item = ();
1570 type Error = std::io::Error;
1571
1572 #[instrument(level = "trace", skip(self))]
1573 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1574 Ok(Some(()))
1575 }
1576}
1577
1578pub trait TupleEncode<W: Sink = Outgoing>: Encode<W> {}
1580
1581pub trait TupleDecode: Decode {}
1583
1584impl<W: Sink> Encode<W> for () {
1585 type Encoder = UnitCodec;
1586}
1587
1588impl<W: Sink> TupleEncode<W> for () {}
1589
1590impl Decode for () {
1591 type Decoder = UnitCodec;
1592 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1593}
1594
1595impl TupleDecode for () {}
1596
1597macro_rules! impl_tuple_codec {
1598 ($($vn:ident),+; $($vt:ident),+; $($cn:ident),+; $($ct:ident),+) => {
1599 impl<W: Sink, $($ct),+> Deferred<W> for TupleEncoder::<($($ct),+,)>
1600 where
1601 $($ct: Deferred<W> + Default + 'static),+
1602 {
1603 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
1604 let Self(($(mut $cn),+,)) = mem::take(self);
1605 let deferred = [ $($cn.take_deferred()),+ ];
1606 if deferred.iter().any(Option::is_some) {
1607 Some(Box::new(|r, path| Box::pin(handle_deferred(r, deferred, path))))
1608 } else {
1609 None
1610 }
1611 }
1612 }
1613
1614 impl<E, W: Sink, $($vt),+> Encode<W> for ($($vt),+,)
1615 where
1616 E: From<std::io::Error>,
1617 $(
1618 $vt: Encode<W>,
1619 $vt::Encoder: tokio_util::codec::Encoder<$vt, Error = E> + 'static,
1620 )+
1621 {
1622 type Encoder = TupleEncoder::<($($vt::Encoder),+,)>;
1623 }
1624
1625 impl<E, W: Sink, $($vt),+> TupleEncode<W> for ($($vt),+,)
1626 where
1627 E: From<std::io::Error>,
1628 $(
1629 $vt: Encode<W>,
1630 $vt::Encoder: tokio_util::codec::Encoder<$vt, Error = E> + 'static,
1631 )+
1632 {
1633 }
1634
1635 impl<'a, E, W: Sink, $($vt),+> Encode<W> for &'a ($($vt),+,)
1636 where
1637 E: From<std::io::Error>,
1638 $(
1639 $vt: Encode<W>,
1640 $vt::Encoder: tokio_util::codec::Encoder<&'a $vt, Error = E> + 'static,
1641 )+
1642 {
1643 type Encoder = TupleEncoder::<($($vt::Encoder),+,)>;
1644 }
1645
1646 impl<$($vt),+> Deferred<BufferedIncoming> for TupleDecoder::<($($vt::Decoder),+,), ($(Option<$vt>),+,)>
1647 where
1648 $($vt: Decode),+
1649 {
1650 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1651 let ($(mut $cn),+,) = mem::take(self).into_inner();
1652 let deferred = [ $($cn.take_deferred()),+ ];
1653 if deferred.iter().any(Option::is_some) {
1654 Some(Box::new(|r, path| Box::pin(handle_deferred(r, deferred, path))))
1655 } else {
1656 None
1657 }
1658 }
1659 }
1660
1661 impl<E, $($vt),+> Decode for ($($vt),+,)
1662 where
1663 E: From<std::io::Error>,
1664 $(
1665 $vt: Decode + Send + 'static,
1666 $vt::Decoder: tokio_util::codec::Decoder<Error = E> + Send + 'static,
1667 )+
1668 {
1669 type Decoder = TupleDecoder::<($($vt::Decoder),+,), ($(Option<$vt>),+,)>;
1670 type ListDecoder = ListDecoder<Self::Decoder>;
1671 }
1672
1673 impl<E, $($vt),+> TupleDecode for ($($vt),+,)
1674 where
1675 E: From<std::io::Error>,
1676 $(
1677 $vt: Decode + Send + 'static,
1678 $vt::Decoder: tokio_util::codec::Decoder<Error = E> + Send + 'static,
1679 )+
1680 {
1681 }
1682 };
1683}
1684
1685impl_tuple_codec!(
1686 v0;
1687 V0;
1688 c0;
1689 C0
1690);
1691
1692impl_tuple_codec!(
1693 v0, v1;
1694 V0, V1;
1695 c0, c1;
1696 C0, C1
1697);
1698
1699impl_tuple_codec!(
1700 v0, v1, v2;
1701 V0, V1, V2;
1702 c0, c1, c2;
1703 C0, C1, C2
1704);
1705
1706impl_tuple_codec!(
1707 v0, v1, v2, v3;
1708 V0, V1, V2, V3;
1709 c0, c1, c2, c3;
1710 C0, C1, C2, C3
1711);
1712
1713impl_tuple_codec!(
1714 v0, v1, v2, v3, v4;
1715 V0, V1, V2, V3, V4;
1716 c0, c1, c2, c3, c4;
1717 C0, C1, C2, C3, C4
1718);
1719
1720impl_tuple_codec!(
1721 v0, v1, v2, v3, v4, v5;
1722 V0, V1, V2, V3, V4, V5;
1723 c0, c1, c2, c3, c4, c5;
1724 C0, C1, C2, C3, C4, C5
1725);
1726
1727impl_tuple_codec!(
1728 v0, v1, v2, v3, v4, v5, v6;
1729 V0, V1, V2, V3, V4, V5, V6;
1730 c0, c1, c2, c3, c4, c5, c6;
1731 C0, C1, C2, C3, C4, C5, C6
1732);
1733
1734impl_tuple_codec!(
1735 v0, v1, v2, v3, v4, v5, v6, v7;
1736 V0, V1, V2, V3, V4, V5, V6, V7;
1737 c0, c1, c2, c3, c4, c5, c6, c7;
1738 C0, C1, C2, C3, C4, C5, C6, C7
1739);
1740
1741impl_tuple_codec!(
1742 v0, v1, v2, v3, v4, v5, v6, v7, v8;
1743 V0, V1, V2, V3, V4, V5, V6, V7, V8;
1744 c0, c1, c2, c3, c4, c5, c6, c7, c8;
1745 C0, C1, C2, C3, C4, C5, C6, C7, C8
1746);
1747
1748impl_tuple_codec!(
1749 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9;
1750 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9;
1751 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9;
1752 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
1753);
1754
1755impl_tuple_codec!(
1756 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;
1757 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10;
1758 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10;
1759 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
1760);
1761
1762impl_tuple_codec!(
1763 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11;
1764 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11;
1765 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11;
1766 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
1767);
1768
1769impl_tuple_codec!(
1770 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12;
1771 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12;
1772 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12;
1773 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
1774);
1775
1776impl_tuple_codec!(
1777 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13;
1778 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13;
1779 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13;
1780 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
1781);
1782
1783impl_tuple_codec!(
1784 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14;
1785 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14;
1786 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14;
1787 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
1788);
1789
1790impl_tuple_codec!(
1791 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15;
1792 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15;
1793 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15;
1794 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
1795);
1796
1797pub struct FutureEncoder<W = Outgoing> {
1799 deferred: Option<DeferredFn<W>>,
1800}
1801
1802impl<W> Default for FutureEncoder<W> {
1803 fn default() -> Self {
1804 Self { deferred: None }
1805 }
1806}
1807
1808impl<W> Deferred<W> for FutureEncoder<W> {
1809 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
1810 self.deferred.take()
1811 }
1812}
1813
1814impl<T, W, Fut> tokio_util::codec::Encoder<Fut> for FutureEncoder<W>
1815where
1816 T: Encode<W>,
1817 W: Sink,
1818 Fut: Future<Output = T> + Send + Unpin + 'static,
1819 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1820{
1821 type Error = std::io::Error;
1822
1823 #[instrument(level = "trace", skip(self, item), fields(ty = "future"))]
1824 fn encode(&mut self, mut item: Fut, dst: &mut BytesMut) -> std::io::Result<()> {
1825 self.deferred = None;
1826 if let Some(item) = (&mut item).now_or_never() {
1827 dst.reserve(1);
1828 dst.put_u8(0x01);
1829 self.deferred = item.encode(&mut T::Encoder::default(), dst)?;
1830 return Ok(());
1831 }
1832 let offset = dst.len();
1833 dst.reserve(1);
1834 dst.put_u8(0x00);
1835 let span = Span::current();
1836 self.deferred = Some(Box::new(move |mut w, path| {
1837 Box::pin(
1838 async move {
1839 if !path.is_empty() {
1840 w = w.index(&path)?;
1841 }
1842 w.write_future(offset, item).await
1843 }
1844 .instrument(span),
1845 )
1846 }));
1847 Ok(())
1848 }
1849}
1850
1851impl<T, W: Sink> Encode<W> for Pin<Box<dyn Future<Output = T> + Send>>
1852where
1853 T: Encode<W> + 'static,
1854 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1855{
1856 type Encoder = FutureEncoder<W>;
1857}
1858
1859pub struct FutureDecoder<T>
1861where
1862 T: Decode,
1863{
1864 dec: OptionDecoder<T::Decoder>,
1865 deferred: Option<DeferredFn<BufferedIncoming>>,
1866 _ty: PhantomData<T>,
1867}
1868
1869impl<T> Default for FutureDecoder<T>
1870where
1871 T: Decode,
1872{
1873 fn default() -> Self {
1874 Self {
1875 dec: OptionDecoder::default(),
1876 deferred: None,
1877 _ty: PhantomData,
1878 }
1879 }
1880}
1881
1882impl<T> Deferred<BufferedIncoming> for FutureDecoder<T>
1883where
1884 T: Decode,
1885{
1886 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1887 self.deferred.take()
1888 }
1889}
1890
1891impl<T> tokio_util::codec::Decoder for FutureDecoder<T>
1892where
1893 T: Decode + Send + 'static,
1894 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
1895{
1896 type Item = Pin<Box<dyn Future<Output = T> + Send>>;
1897 type Error = <T::Decoder as tokio_util::codec::Decoder>::Error;
1898
1899 #[instrument(level = "trace", skip(self), fields(ty = "future"))]
1900 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1901 let Some(item) = self.dec.decode(src)? else {
1902 return Ok(None);
1903 };
1904 if let Some(item) = item {
1905 self.deferred = self.dec.take_deferred();
1906 return Ok(Some(Box::pin(async { item })));
1907 }
1908
1909 let (tx, rx) = oneshot::channel();
1911 let dec = mem::take(&mut self.dec).into_inner();
1912 let span = Span::current();
1913 self.deferred = Some(Box::new(|mut r, path| {
1914 Box::pin(
1915 async move {
1916 if !path.is_empty() {
1917 r = r.index(&path).map_err(std::io::Error::other)?;
1918 }
1919 let mut dec = FramedRead::new(r, dec);
1920 trace!(?path, "receiving future element");
1921 let Some(item) = dec.next().await else {
1922 return Err(std::io::ErrorKind::UnexpectedEof.into());
1923 };
1924 let item = item?;
1925 if tx.send(item).is_err() {
1926 return Err(error_receiver_closed());
1927 }
1928 if let Some(rx) = dec.decoder_mut().take_deferred() {
1929 let mut buf = mem::take(dec.read_buffer_mut());
1930 let mut r = dec.into_inner();
1931 buf.unsplit(mem::take(&mut r.buffer));
1932 r.buffer = buf;
1933 rx(r, Vec::default()).await?;
1934 } else {
1935 ensure_processed(&dec)?;
1936 }
1937 Ok(())
1938 }
1939 .instrument(span),
1940 )
1941 }));
1942 Ok(Some(Box::pin(async {
1943 let Ok(ret) = rx.await else {
1944 error!("future I/O dropped");
1945 return pending().await;
1946 };
1947 ret
1948 })))
1949 }
1950}
1951
1952impl<T> Decode for Pin<Box<dyn Future<Output = T> + Send>>
1953where
1954 T: Decode + Send + 'static,
1955 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
1956{
1957 type Decoder = FutureDecoder<T>;
1958 type ListDecoder = ListDecoder<Self::Decoder>;
1959}
1960
1961pub struct StreamEncoder<W = Outgoing> {
1963 deferred: Option<DeferredFn<W>>,
1964}
1965
1966impl<W> Default for StreamEncoder<W> {
1967 fn default() -> Self {
1968 Self { deferred: None }
1969 }
1970}
1971
1972impl<W> Deferred<W> for StreamEncoder<W> {
1973 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
1974 self.deferred.take()
1975 }
1976}
1977
1978impl<T, W, S> tokio_util::codec::Encoder<S> for StreamEncoder<W>
1979where
1980 T: Encode<W> + Send + 'static,
1981 W: Sink,
1982 S: Stream<Item = Vec<T>> + Send + Unpin + 'static,
1983 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1984{
1985 type Error = std::io::Error;
1986
1987 #[instrument(level = "trace", skip(self, items), fields(ty = "stream"))]
1988 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
1989 self.deferred = None;
1990 let mut ready = Vec::default();
1991 loop {
1992 match items.next().now_or_never() {
1993 Some(Some(chunk)) if ready.is_empty() => ready = chunk,
1994 Some(Some(chunk)) => ready.extend(chunk),
1995 Some(None) => {
1996 dst.reserve(1);
1997 dst.put_u8(0x01);
1998 self.deferred = ready.encode(&mut ListEncoder::default(), dst)?;
1999 return Ok(());
2000 }
2001 None => break,
2002 }
2003 }
2004 let items = stream::iter([ready]).chain(items);
2005 let offset = dst.len();
2006 dst.reserve(1);
2007 dst.put_u8(0x00);
2008 let span = Span::current();
2009 self.deferred = Some(Box::new(move |mut w, path| {
2010 Box::pin(
2011 async move {
2012 if !path.is_empty() {
2013 w = w.index(&path)?;
2014 }
2015 w.write_stream(offset, items).await
2016 }
2017 .instrument(span),
2018 )
2019 }));
2020 Ok(())
2021 }
2022}
2023
2024impl<T, W: Sink> Encode<W> for Pin<Box<dyn Stream<Item = Vec<T>> + Send>>
2025where
2026 T: Encode<W> + Send + 'static,
2027 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
2028{
2029 type Encoder = StreamEncoder<W>;
2030}
2031
2032pub struct StreamEncoderBytes<W = Outgoing> {
2034 deferred: Option<DeferredFn<W>>,
2035}
2036
2037impl<W> Default for StreamEncoderBytes<W> {
2038 fn default() -> Self {
2039 Self { deferred: None }
2040 }
2041}
2042
2043impl<W> Deferred<W> for StreamEncoderBytes<W> {
2044 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
2045 self.deferred.take()
2046 }
2047}
2048
2049impl<W, S> tokio_util::codec::Encoder<S> for StreamEncoderBytes<W>
2050where
2051 W: Sink,
2052 S: Stream<Item = Bytes> + Send + Unpin + 'static,
2053{
2054 type Error = std::io::Error;
2055
2056 #[instrument(level = "trace", skip(self, items), fields(ty = "stream<u8>"))]
2057 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
2058 self.deferred = None;
2059 let mut ready = Vec::default();
2060 loop {
2061 match items.next().now_or_never() {
2062 Some(Some(chunk)) => ready.push(chunk),
2063 Some(None) => return encode_ready_bytes(&ready, dst),
2064 None => break,
2065 }
2066 }
2067 let items = stream::iter(ready).chain(items);
2068 let offset = dst.len();
2069 dst.reserve(1);
2070 dst.put_u8(0x00);
2071 self.deferred = Some(Box::new(move |mut w, path| {
2072 Box::pin(async move {
2073 if !path.is_empty() {
2074 w = w.index(&path)?;
2075 }
2076 w.write_stream_bytes(offset, items).await
2077 })
2078 }));
2079 Ok(())
2080 }
2081}
2082
2083impl<W: Sink> Encode<W> for Pin<Box<dyn Stream<Item = Bytes> + Send>> {
2084 type Encoder = StreamEncoderBytes<W>;
2085}
2086
2087pub struct StreamEncoderRead<W = Outgoing, const MAX_READY: usize = { usize::MAX }> {
2092 deferred: Option<DeferredFn<W>>,
2093}
2094
2095impl<W, const MAX_READY: usize> Default for StreamEncoderRead<W, MAX_READY> {
2096 fn default() -> Self {
2097 Self { deferred: None }
2098 }
2099}
2100
2101impl<W, const MAX_READY: usize> Deferred<W> for StreamEncoderRead<W, MAX_READY> {
2102 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
2103 self.deferred.take()
2104 }
2105}
2106
2107impl<W, S, const MAX_READY: usize> tokio_util::codec::Encoder<S> for StreamEncoderRead<W, MAX_READY>
2108where
2109 W: Sink,
2110 S: AsyncRead + Send + Unpin + 'static,
2111{
2112 type Error = std::io::Error;
2113
2114 #[instrument(level = "trace", skip(self, items), fields(ty = "stream<u8>"))]
2115 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
2116 self.deferred = None;
2117 let mut ready = BytesMut::default();
2118 loop {
2119 let n = MAX_READY.saturating_sub(ready.len());
2120 if n == 0 {
2121 break;
2122 }
2123 ready.reserve(n.min(READ_CHUNK_SIZE));
2124 match items.read_buf(&mut (&mut ready).limit(n)).now_or_never() {
2125 Some(Ok(0)) => return encode_ready_bytes(&[ready], dst),
2126 Some(Ok(..)) => {}
2127 Some(Err(err)) => return Err(err),
2128 None => break,
2129 }
2130 }
2131 let offset = dst.len();
2132 dst.reserve(1);
2133 dst.put_u8(0x00);
2134 self.deferred = Some(Box::new(move |mut w, path| {
2135 Box::pin(async move {
2136 if !path.is_empty() {
2137 w = w.index(&path)?;
2138 }
2139 w.write_stream_read(offset, ready, items).await
2140 })
2141 }));
2142 Ok(())
2143 }
2144}
2145
2146impl<W: Sink> Encode<W> for Pin<Box<dyn AsyncRead + Send>> {
2147 type Encoder = StreamEncoderRead<W>;
2148}
2149
2150impl<T, W: Sink> Encode<W> for std::io::Cursor<T>
2151where
2152 T: AsRef<[u8]> + Send + Unpin + 'static,
2153{
2154 type Encoder = StreamEncoderRead<W>;
2155}
2156
2157impl<W: Sink> Encode<W> for tokio::io::Empty {
2158 type Encoder = StreamEncoderRead<W>;
2159}
2160
2161#[cfg(feature = "io-std")]
2162impl<W: Sink> Encode<W> for tokio::io::Stdin {
2163 type Encoder = StreamEncoderRead<W>;
2164}
2165
2166#[cfg(feature = "fs")]
2167impl<W: Sink> Encode<W> for tokio::fs::File {
2168 type Encoder = StreamEncoderRead<W>;
2169}
2170
2171#[cfg(feature = "net")]
2172impl<W: Sink> Encode<W> for tokio::net::TcpStream {
2173 type Encoder = StreamEncoderRead<W>;
2174}
2175
2176#[cfg(all(unix, feature = "net"))]
2177impl<W: Sink> Encode<W> for tokio::net::UnixStream {
2178 type Encoder = StreamEncoderRead<W>;
2179}
2180
2181#[cfg(all(unix, feature = "net"))]
2182impl<W: Sink> Encode<W> for tokio::net::unix::pipe::Receiver {
2183 type Encoder = StreamEncoderRead<W>;
2184}
2185
2186pub struct StreamDecoder<T>
2188where
2189 T: Decode,
2190{
2191 dec: OptionDecoder<T::ListDecoder>,
2192 deferred: Option<DeferredFn<BufferedIncoming>>,
2193 _ty: PhantomData<T>,
2194}
2195
2196impl<T> Default for StreamDecoder<T>
2197where
2198 T: Decode,
2199{
2200 fn default() -> Self {
2201 Self {
2202 dec: OptionDecoder::default(),
2203 deferred: None,
2204 _ty: PhantomData,
2205 }
2206 }
2207}
2208
2209impl<T> Deferred<BufferedIncoming> for StreamDecoder<T>
2210where
2211 T: Decode,
2212{
2213 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2214 self.deferred.take()
2215 }
2216}
2217
2218fn ensure_processed<D>(framed: &FramedRead<BufferedIncoming, D>) -> std::io::Result<()> {
2219 if framed.read_buffer().is_empty() && framed.get_ref().buffer.is_empty() {
2220 Ok(())
2221 } else {
2222 Err(std::io::Error::new(
2223 std::io::ErrorKind::InvalidData,
2224 "received data after value end",
2225 ))
2226 }
2227}
2228
2229#[instrument(level = "trace", skip(dec, r, tx), ret)]
2230async fn handle_deferred_stream<C, T>(
2231 dec: C,
2232 mut r: BufferedIncoming,
2233 path: Vec<usize>,
2234 tx: mpsc::Sender<Vec<T>>,
2235) -> std::io::Result<()>
2236where
2237 C: tokio_util::codec::Decoder<Item = T> + Deferred<BufferedIncoming>,
2238 std::io::Error: From<C::Error>,
2239{
2240 let dec = ListDecoder::new(dec);
2241 if !path.is_empty() {
2242 r = r.index(&path).map_err(std::io::Error::other)?;
2243 }
2244 let mut framed = FramedRead::new(r, dec);
2245 let mut tasks = JoinSet::new();
2246 let mut i = 0_usize;
2247 loop {
2248 trace!("receiving pending stream chunk");
2249 select! {
2250 Some(chunk) = framed.next() => {
2251 let chunk = chunk?;
2252 if chunk.is_empty() {
2253 trace!("received stream end");
2254 ensure_processed(&framed)?;
2255 while let Some(res) = tasks.join_next().await {
2256 res??;
2257 }
2258 return Ok(())
2259 }
2260 let end = i.checked_add(chunk.len()).ok_or_else(|| {
2261 std::io::Error::new(
2262 std::io::ErrorKind::InvalidInput,
2263 "stream element index would overflow usize",
2264 )
2265 })?;
2266 trace!(i, end, "received stream chunk");
2267 if tx.send(chunk).await.is_err() {
2268 return Err(error_receiver_closed());
2269 }
2270 for (i, deferred) in zip(i.., mem::take(&mut framed.decoder_mut().deferred)) {
2271 if let Some(deferred) = deferred {
2272 let r = framed.get_ref().index(&[i]).map_err(std::io::Error::other)?;
2273 trace!("spawning receive task");
2274 tasks.spawn(deferred(r, Vec::default()));
2275 }
2276 }
2277 i = end;
2278 },
2279 Some(res) = tasks.join_next() => {
2280 trace!(?res, "receiver task finished");
2281 res??;
2282 }
2283 else => {
2284 return Err(std::io::ErrorKind::UnexpectedEof.into());
2285 }
2286 }
2287 }
2288}
2289
2290impl<T> tokio_util::codec::Decoder for StreamDecoder<T>
2291where
2292 T: Decode + Send + 'static,
2293 T::ListDecoder: Deferred<BufferedIncoming>,
2294 <T::Decoder as tokio_util::codec::Decoder>::Error: Send,
2295 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
2296{
2297 type Item = Pin<Box<dyn Stream<Item = Vec<T>> + Send>>;
2298 type Error = <<T as Decode>::ListDecoder as tokio_util::codec::Decoder>::Error;
2299
2300 #[instrument(level = "trace", skip(self), fields(ty = "stream"))]
2301 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2302 let Some(chunk) = self.dec.decode(src)? else {
2303 return Ok(None);
2304 };
2305 if let Some(chunk) = chunk {
2306 self.deferred = self.dec.take_deferred();
2307 if chunk.is_empty() {
2308 return Ok(Some(Box::pin(stream::empty())));
2309 }
2310 return Ok(Some(Box::pin(stream::iter([chunk]))));
2311 }
2312
2313 let (tx, rx) = mpsc::channel(128);
2315 self.deferred = Some(Box::new(|r, path| {
2316 Box::pin(
2317 async move { handle_deferred_stream(T::Decoder::default(), r, path, tx).await },
2318 )
2319 }));
2320 Ok(Some(Box::pin(ReceiverStream::new(rx))))
2321 }
2322}
2323
2324impl<T> Decode for Pin<Box<dyn Stream<Item = Vec<T>> + Send>>
2325where
2326 T: Decode + Send + 'static,
2327 T::ListDecoder: Deferred<BufferedIncoming> + Send,
2328 <T::Decoder as tokio_util::codec::Decoder>::Error: Send,
2329 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
2330{
2331 type Decoder = StreamDecoder<T>;
2332 type ListDecoder = ListDecoder<Self::Decoder>;
2333}
2334
2335#[derive(Default)]
2337pub struct StreamDecoderBytes {
2338 dec: OptionDecoder<CoreVecDecoderBytes>,
2339 deferred: Option<DeferredFn<BufferedIncoming>>,
2340}
2341
2342impl Deferred<BufferedIncoming> for StreamDecoderBytes {
2343 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2344 self.deferred.take()
2345 }
2346}
2347
2348impl tokio_util::codec::Decoder for StreamDecoderBytes {
2349 type Item = Pin<Box<dyn Stream<Item = Bytes> + Send>>;
2350 type Error = std::io::Error;
2351
2352 #[instrument(level = "trace", skip(self), fields(ty = "stream<u8>"))]
2353 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2354 let Some(chunk) = self.dec.decode(src)? else {
2355 return Ok(None);
2356 };
2357 if let Some(chunk) = chunk {
2358 if chunk.is_empty() {
2359 return Ok(Some(Box::pin(stream::empty())));
2360 }
2361 return Ok(Some(Box::pin(stream::iter([chunk]))));
2362 }
2363
2364 let (tx, rx) = mpsc::channel(128);
2366 let dec = mem::take(&mut self.dec).into_inner();
2367 let span = Span::current();
2368 self.deferred = Some(Box::new(|mut r, path| {
2369 Box::pin(
2370 async move {
2371 if !path.is_empty() {
2372 r = r.index(&path).map_err(std::io::Error::other)?;
2373 }
2374 let mut framed = FramedRead::new(r, dec);
2375 trace!(?path, "receiving pending byte stream chunk");
2376 while let Some(chunk) = framed.next().await {
2377 let chunk = chunk?;
2378 if chunk.is_empty() {
2379 trace!("received stream end");
2380 return ensure_processed(&framed);
2381 }
2382 trace!(?chunk, "received pending byte stream chunk");
2383 if tx.send(chunk).await.is_err() {
2384 return Err(error_receiver_closed());
2385 }
2386 }
2387 Err(std::io::ErrorKind::UnexpectedEof.into())
2388 }
2389 .instrument(span),
2390 )
2391 }));
2392 Ok(Some(Box::pin(ReceiverStream::new(rx))))
2393 }
2394}
2395
2396impl Decode for Pin<Box<dyn Stream<Item = Bytes> + Send>> {
2397 type Decoder = StreamDecoderBytes;
2398 type ListDecoder = ListDecoder<Self::Decoder>;
2399}
2400
2401#[derive(Default)]
2403pub struct StreamDecoderRead {
2404 dec: OptionDecoder<CoreVecDecoderBytes>,
2405 deferred: Option<DeferredFn<BufferedIncoming>>,
2406}
2407
2408impl Deferred<BufferedIncoming> for StreamDecoderRead {
2409 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2410 self.deferred.take()
2411 }
2412}
2413
2414impl tokio_util::codec::Decoder for StreamDecoderRead {
2415 type Item = Pin<Box<dyn AsyncRead + Send>>;
2416 type Error = std::io::Error;
2417
2418 #[instrument(level = "trace", skip(self), fields(ty = "stream<u8>"))]
2419 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2420 let Some(chunk) = self.dec.decode(src)? else {
2421 return Ok(None);
2422 };
2423 if let Some(chunk) = chunk {
2424 return Ok(Some(Box::pin(std::io::Cursor::new(chunk))));
2425 }
2426
2427 let (tx, rx) = mpsc::channel(128);
2429 let (done_tx, done_rx) = oneshot::channel();
2430 let dec = mem::take(&mut self.dec).into_inner();
2431 self.deferred = Some(Box::new(|mut r, path| {
2432 Box::pin(async move {
2433 let res = async {
2434 if !path.is_empty() {
2435 r = r.index(&path).map_err(std::io::Error::other)?;
2436 }
2437 let mut framed = FramedRead::new(r, dec);
2438 trace!("receiving pending byte stream chunk");
2439 while let Some(chunk) = framed.next().await {
2440 let chunk = chunk?;
2441 if chunk.is_empty() {
2442 trace!("received stream end");
2443 return ensure_processed(&framed);
2444 }
2445 trace!(?chunk, "received byte stream chunk");
2446 if tx.send(chunk).await.is_err() {
2447 return Err(error_receiver_closed());
2448 }
2449 }
2450 Err(std::io::ErrorKind::UnexpectedEof.into())
2451 }
2452 .await;
2453 _ = done_tx.send(res.as_ref().copied().map_err(copy_io_error));
2454 res
2455 })
2456 }));
2457 let done = stream::once(done_rx).filter_map(|res| async move {
2458 match res {
2459 Ok(Ok(())) => None,
2460 Ok(Err(err)) => Some(Err(err)),
2461 Err(..) => Some(Err(std::io::ErrorKind::UnexpectedEof.into())),
2462 }
2463 });
2464 Ok(Some(Box::pin(StreamReader::new(
2465 ReceiverStream::new(rx).map(Ok).chain(done),
2466 ))))
2467 }
2468}
2469
2470impl Decode for Pin<Box<dyn AsyncRead + Send>> {
2471 type Decoder = StreamDecoderRead;
2472 type ListDecoder = ListDecoder<Self::Decoder>;
2473}
2474
2475#[cfg(test)]
2476mod tests {
2477 use std::io::ErrorKind;
2478
2479 use anyhow::{Context as _, bail};
2480 use tokio_util::codec::Decoder as _;
2481
2482 use super::*;
2483
2484 #[test_log::test(tokio::test)]
2485 async fn list_decoder_reset_on_error() -> anyhow::Result<()> {
2486 let mut dec = <Vec<Vec<String>> as Decode>::Decoder::default();
2487 let mut buf = BytesMut::from(&[0x02, 0x01, 0x01, b'a', 0x01, 0x01, 0xff][..]);
2488 assert!(tokio_util::codec::Decoder::decode(&mut dec, &mut buf).is_err());
2489 let mut buf = BytesMut::from(&[0x01, 0x01, 0x01, b'b'][..]);
2490 assert_eq!(
2491 tokio_util::codec::Decoder::decode(&mut dec, &mut buf)?,
2492 Some(vec![vec!["b".to_string()]])
2493 );
2494 Ok(())
2495 }
2496
2497 #[test_log::test(tokio::test)]
2498 async fn list_decoder_reset_deferred_on_error() -> anyhow::Result<()> {
2499 let mut dec =
2500 <Vec<Pin<Box<dyn Stream<Item = Bytes> + Send>>> as Decode>::Decoder::default();
2501 let mut buf = BytesMut::from(&[0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff][..]);
2502 assert!(tokio_util::codec::Decoder::decode(&mut dec, &mut buf).is_err());
2503 let mut buf = BytesMut::from(&[0x00][..]);
2504 let vs = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)?;
2505 assert!(vs.is_some_and(|vs| vs.is_empty()));
2506 if let Some(_f) = Deferred::<BufferedIncoming>::take_deferred(&mut dec) {
2507 bail!("no deferred read should have been returned");
2508 }
2509 Ok(())
2510 }
2511
2512 #[test_log::test(tokio::test)]
2513 async fn stream_decoder_ready() -> anyhow::Result<()> {
2514 let mut dec =
2515 <Pin<Box<dyn Stream<Item = Vec<String>> + Send>> as Decode>::Decoder::default();
2516 let mut buf = BytesMut::from(&b"\x01\x02\x03foo\x03bar\x01\x00"[..]);
2517 let Some(s) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2518 bail!("stream not decoded");
2519 };
2520 assert_eq!(s.concat().await, ["foo", "bar"]);
2521 let Some(s) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2522 bail!("stream not decoded");
2523 };
2524 assert_eq!(s.count().await, 0);
2525 if let Some(_f) = Deferred::<BufferedIncoming>::take_deferred(&mut dec) {
2526 bail!("no deferred read should have been returned");
2527 }
2528
2529 let mut dec = <Pin<Box<dyn Stream<Item = Bytes> + Send>> as Decode>::Decoder::default();
2530 let mut buf = BytesMut::from(&b"\x01\x03foo\x01\x00"[..]);
2531 let Some(s) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2532 bail!("stream not decoded");
2533 };
2534 assert_eq!(s.collect::<Vec<_>>().await, [Bytes::from("foo")]);
2535 let Some(s) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2536 bail!("stream not decoded");
2537 };
2538 assert_eq!(s.count().await, 0);
2539
2540 let mut dec = <Pin<Box<dyn AsyncRead + Send>> as Decode>::Decoder::default();
2541 let mut buf = BytesMut::from(&b"\x01\x03foo\x01\x00"[..]);
2542 let Some(mut r) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2543 bail!("stream not decoded");
2544 };
2545 let mut v = vec![];
2546 r.read_to_end(&mut v).await?;
2547 assert_eq!(v, b"foo");
2548 let Some(mut r) = tokio_util::codec::Decoder::decode(&mut dec, &mut buf)? else {
2549 bail!("stream not decoded");
2550 };
2551 let mut v = vec![];
2552 r.read_to_end(&mut v).await?;
2553 assert!(v.is_empty());
2554 Ok(())
2555 }
2556
2557 async fn read_frames(mut rx: impl AsyncRead + Unpin) -> anyhow::Result<Vec<u8>> {
2558 let mut buf = vec![];
2559 rx.read_to_end(&mut buf).await?;
2560 let mut buf = buf.as_slice();
2561 let mut data = vec![];
2562 while let [0x01, 0x00, n, rest @ ..] = buf {
2563 let (chunk, rest) = rest.split_at(usize::from(*n));
2564 data.extend_from_slice(chunk);
2565 buf = rest;
2566 }
2567 if !buf.is_empty() {
2568 bail!("unexpected trailing bytes: {buf:02x?}");
2569 }
2570 Ok(data)
2571 }
2572
2573 #[test]
2574 fn stream_ready_after_pending() -> anyhow::Result<()> {
2575 let mut buf = BytesMut::default();
2576 let mut enc = StreamEncoderBytes::<Outgoing>::default();
2577 enc.encode(stream::pending::<Bytes>(), &mut buf)?;
2578 enc.encode(stream::empty::<Bytes>(), &mut buf)?;
2579 assert!(enc.take_deferred().is_none());
2580
2581 let (_tx, rx) = tokio::io::duplex(1);
2582 let mut enc = StreamEncoderRead::<Outgoing>::default();
2583 enc.encode(rx, &mut buf)?;
2584 enc.encode(tokio::io::empty(), &mut buf)?;
2585 assert!(enc.take_deferred().is_none());
2586
2587 let mut enc = StreamEncoderRead::<Outgoing, 2>::default();
2588 enc.encode(b"fo".as_slice(), &mut buf)?;
2589 assert!(enc.take_deferred().is_some());
2590
2591 let mut enc = StreamEncoderRead::<Outgoing>::default();
2592 let (_tx, rx) = tokio::io::duplex(1);
2593 enc.encode(rx, &mut buf)?;
2594 let err = tokio_util::io::StreamReader::new(stream::iter([Err::<Bytes, _>(
2595 std::io::Error::from(ErrorKind::ConnectionReset),
2596 )]));
2597 assert!(enc.encode(err, &mut buf).is_err());
2598 assert!(enc.take_deferred().is_none());
2599 Ok(())
2600 }
2601
2602 #[test_log::test(tokio::test)]
2603 async fn outgoing_stream_ready() -> anyhow::Result<()> {
2604 for (ready, expected) in [("foo", &b"\x03foo\x03bar\x00"[..]), ("", b"\x03bar\x00")] {
2605 let (tx, rx) = tokio::io::duplex(1024);
2606 let w = Outgoing::new(tx, |_, _| async {}).index(&[0])?;
2607 w.write_stream_bytes(0, stream::iter([ready, "bar"].map(Bytes::from)))
2608 .await?;
2609 assert_eq!(read_frames(rx).await?, expected);
2610
2611 let (tx, rx) = tokio::io::duplex(1024);
2612 let w = Outgoing::new(tx, |_, _| async {}).index(&[0])?;
2613 w.write_stream_read(0, ready.into(), b"bar".as_slice())
2614 .await?;
2615 assert_eq!(read_frames(rx).await?, expected);
2616 }
2617 Ok(())
2618 }
2619
2620 fn buffered(buffer: &[u8]) -> BufferedIncoming {
2621 BufferedIncoming {
2622 buffer: BytesMut::from(buffer),
2623 inner: crate::frame::Incoming::new(
2624 tokio::io::empty(),
2625 Vec::<Vec<Option<usize>>>::default(),
2626 true,
2627 |_, _| async {},
2628 ),
2629 }
2630 }
2631
2632 type FutureBytes = Pin<Box<dyn Future<Output = Bytes> + Send>>;
2633 type StreamBytes = Pin<Box<dyn Stream<Item = Bytes> + Send>>;
2634
2635 fn pending<T: Decode>() -> (T, DeferredFn<BufferedIncoming>) {
2636 let mut dec = T::Decoder::default();
2637 let Ok(Some(v)) = dec.decode(&mut BytesMut::from(&[0x00][..])) else {
2638 panic!("value not decoded")
2639 };
2640 (v, dec.take_deferred().expect("deferred read missing"))
2641 }
2642
2643 #[test_log::test(tokio::test)]
2644 async fn future_rejects_unprocessed() {
2645 let (_fut, f) = pending::<FutureBytes>();
2646 let err = f(buffered(b"\x03foo\x2a"), Vec::default()).await;
2647 assert_eq!(err.unwrap_err().kind(), ErrorKind::InvalidData);
2648 }
2649
2650 #[test_log::test(tokio::test)]
2651 async fn future_rejects_unprocessed_buffered() {
2652 let data: Bytes = (0..2 * READ_CHUNK_SIZE).map(|i| i as u8).collect();
2653 let mut buffer = BytesMut::default();
2654 CoreVecEncoderBytes.encode(&data, &mut buffer).unwrap();
2655 buffer.extend_from_slice(&[0x2a; READ_CHUNK_SIZE]);
2656 let (_fut, f) = pending::<FutureBytes>();
2657 let err = f(buffered(&buffer), Vec::default()).await;
2658 assert_eq!(err.unwrap_err().kind(), ErrorKind::InvalidData);
2659 }
2660
2661 #[test_log::test(tokio::test)]
2662 async fn future_rejects_dropped_receiver() {
2663 let (fut, f) = pending::<FutureBytes>();
2664 drop(fut);
2665 let err = f(buffered(b"\x03foo"), Vec::default()).await;
2666 assert_eq!(err.unwrap_err().kind(), ErrorKind::BrokenPipe);
2667 }
2668
2669 #[test_log::test(tokio::test)]
2670 async fn stream_rejects_unprocessed() {
2671 let (_stream, f) = pending::<StreamBytes>();
2672 let err = f(buffered(b"\x03foo\x00\x2a"), Vec::default()).await;
2673 assert_eq!(err.unwrap_err().kind(), ErrorKind::InvalidData);
2674 }
2675
2676 #[test_log::test(tokio::test)]
2677 async fn stream_rejects_truncated() {
2678 let (_stream, f) = pending::<StreamBytes>();
2679 let err = f(buffered(b"\x03foo"), Vec::default()).await;
2680 assert_eq!(err.unwrap_err().kind(), ErrorKind::UnexpectedEof);
2681
2682 let (mut r, f) = pending::<Pin<Box<dyn AsyncRead + Send>>>();
2683 let err = f(buffered(b"\x03foo"), Vec::default()).await;
2684 assert_eq!(err.unwrap_err().kind(), ErrorKind::UnexpectedEof);
2685 let mut buf = Vec::default();
2686 let err = r.read_to_end(&mut buf).await;
2687 assert_eq!(err.unwrap_err().kind(), ErrorKind::UnexpectedEof);
2688 assert_eq!(buf, b"foo");
2689
2690 let (mut r, f) = pending::<Pin<Box<dyn AsyncRead + Send>>>();
2691 drop(f);
2692 let err = r.read_to_end(&mut Vec::default()).await;
2693 assert_eq!(err.unwrap_err().kind(), ErrorKind::UnexpectedEof);
2694 }
2695
2696 #[test_log::test(tokio::test)]
2697 async fn future_nested_buffered() -> anyhow::Result<()> {
2698 let data: Bytes = (0..2 * READ_CHUNK_SIZE).map(|i| i as u8).collect();
2699 let mut buffer = BytesMut::from(&[0x00][..]);
2700 CoreVecEncoderBytes.encode(&data, &mut buffer)?;
2701
2702 let mut dec = <Pin<
2703 Box<dyn Future<Output = Pin<Box<dyn Future<Output = Bytes> + Send>>> + Send>,
2704 > as Decode>::Decoder::default();
2705 let fut = dec.decode(&mut BytesMut::from(&[0x00][..]))?;
2706 let fut = fut.context("future not decoded")?;
2707 let f = dec.take_deferred().context("deferred read missing")?;
2708 let r = BufferedIncoming {
2709 buffer,
2710 inner: crate::frame::Incoming::new(
2711 tokio::io::empty(),
2712 Vec::<Vec<Option<usize>>>::default(),
2713 true,
2714 |_, _| async {},
2715 ),
2716 };
2717 f(r, Vec::default()).await?;
2718 assert_eq!(fut.await.await, data);
2719 Ok(())
2720 }
2721
2722 #[test_log::test(tokio::test)]
2723 async fn codec() -> anyhow::Result<()> {
2724 let mut buf = BytesMut::default();
2725 let mut enc = <(u8, u32) as Encode>::Encoder::default();
2726 enc.encode((0x42, 0x42), &mut buf)?;
2727 if let Some(_f) = Deferred::<Outgoing>::take_deferred(&mut enc) {
2728 bail!("no deferred write should have been returned");
2729 }
2730 assert_eq!(buf.as_ref(), b"\x42\x42");
2731 Ok(())
2732 }
2733
2734 #[test]
2735 fn canonical_nan_f32() {
2736 let mut enc = <f32 as Encode>::Encoder::default();
2737
2738 let mut buf = BytesMut::default();
2740 enc.encode(f32::from_bits(0x7f80_0001), &mut buf).unwrap();
2741 assert_eq!(buf.as_ref(), CANONICAL_NAN_F32.to_le_bytes());
2742
2743 let mut buf = BytesMut::default();
2745 enc.encode(f32::from_bits(0xffc0_0000), &mut buf).unwrap();
2746 assert_eq!(buf.as_ref(), CANONICAL_NAN_F32.to_le_bytes());
2747
2748 let mut buf = BytesMut::default();
2750 enc.encode(1.5_f32, &mut buf).unwrap();
2751 assert_eq!(buf.as_ref(), 1.5_f32.to_bits().to_le_bytes());
2752 }
2753
2754 #[test]
2755 fn canonical_nan_f64() {
2756 let mut enc = <f64 as Encode>::Encoder::default();
2757
2758 let mut buf = BytesMut::default();
2759 enc.encode(f64::from_bits(0x7ff0_0000_0000_0001), &mut buf)
2760 .unwrap();
2761 assert_eq!(buf.as_ref(), CANONICAL_NAN_F64.to_le_bytes());
2762
2763 let mut buf = BytesMut::default();
2764 enc.encode(f64::from_bits(0xfff8_0000_0000_0000), &mut buf)
2765 .unwrap();
2766 assert_eq!(buf.as_ref(), CANONICAL_NAN_F64.to_le_bytes());
2767
2768 let mut buf = BytesMut::default();
2769 enc.encode(1.5_f64, &mut buf).unwrap();
2770 assert_eq!(buf.as_ref(), 1.5_f64.to_bits().to_le_bytes());
2771 }
2772}