Skip to main content

wrpc_transport/
value.rs

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
37/// Size of chunks read from byte streams
38pub 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/// Borrowed resource handle, represented as an opaque byte blob
51#[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    /// Constructs a new borrowed resource handle
124    pub fn new(repr: impl Into<Bytes>) -> Self {
125        Self::from(repr.into())
126    }
127}
128
129/// Owned resource handle, represented as an opaque byte blob
130#[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    /// Constructs a new owned resource handle
212    pub fn new(repr: impl Into<Bytes>) -> Self {
213        Self::from(repr.into())
214    }
215
216    /// Returns the owned handle as [`ResourceBorrow`]
217    pub fn as_borrow(&self) -> ResourceBorrow<T> {
218        ResourceBorrow {
219            repr: self.repr.clone(),
220            _ty: PhantomData,
221        }
222    }
223}
224
225/// Deferred operation used for async value processing
226pub type DeferredFn<T> = Box<
227    dyn FnOnce(T, Vec<usize>) -> Pin<Box<dyn Future<Output = std::io::Result<()>> + Send>> + Send,
228>;
229
230/// Handles async processing state for codecs
231pub trait Deferred<T> {
232    /// Takes a deferred async processing operation, if any
233    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
304/// Codec for synchronous values
305///
306/// This is a wrapper struct, which provides a no-op [Deferred] implementation
307/// for any codec.
308pub 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
373/// Multiplexes asynchronous value transmission using a structural `path`
374pub trait Index: Sized {
375    /// Index the entity using a structural `path`
376    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
391/// Target of deferred transmission of asynchronous values, encoded by [Encode]
392///
393/// `offset` is the position of the byte written by the encoder of the asynchronous value
394/// in the buffer the value was encoded into.
395pub trait Sink: Index + Send + 'static {
396    /// Transmits the value of a `future<T>`
397    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    /// Transmits the elements of a `stream<T>`
407    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    /// Transmits the elements of a `stream<u8>` from a [Stream] of [Bytes]
417    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    /// Transmits the elements of a `stream<u8>` from `ready` followed by an [AsyncRead]
424    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
617/// Defines value encoding
618pub trait Encode<W: Sink = Outgoing>: Sized {
619    /// Encoder used to encode the value
620    type Encoder: tokio_util::codec::Encoder<Self> + Deferred<W> + Default + Send;
621
622    /// Convenience function for encoding a value
623    #[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    /// Encode an iterator of owned values
635    #[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    /// Encode an iterator of value references
662    #[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    /// Encode a list of owned values
690    #[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    /// Encode a list of value references
705    #[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
722/// Defines value decoding
723pub trait Decode: Sized {
724    /// Decoder used to decode value
725    type Decoder: tokio_util::codec::Decoder<Item = Self>
726        + Deferred<BufferedIncoming>
727        + Default
728        + Send
729        + 'static;
730    /// Decoder used to decode lists of value
731    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
851/// Encoder for `list<T>`
852pub 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
960/// Decoder for `list<T>`
961pub 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    /// Constructs a new list decoder
976    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
1168// The Component Model canonical ABI mandates a single canonical `NaN`
1169// representation for floating point values. Encoding canonicalizes `NaN`s to
1170// match; decoding is lenient and accepts any `NaN` representation.
1171//
1172// See `canonicalize_nan{32,64}` in
1173// <https://github.com/WebAssembly/component-model/blob/main/design/mvp/canonical-abi/definitions.py>.
1174const CANONICAL_NAN_F32: u32 = 0x7fc0_0000;
1175const CANONICAL_NAN_F64: u64 = 0x7ff8_0000_0000_0000;
1176
1177/// Defines a floating-point codec that canonicalizes `NaN` values on encode to
1178/// match the Component Model canonical ABI, delegating the actual byte encoding
1179/// and decoding to the wrapped `wasm-tokio` codec.
1180macro_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/// Decoder for `list<u8>`
1342#[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/// Encoder for `resource` types
1399#[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/// Decoder for borrowed resource types
1456#[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/// Decoder for owned resource types
1501#[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/// Codec for `()`
1546#[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
1578/// Marker trait for [Encode] tuple types
1579pub trait TupleEncode<W: Sink = Outgoing>: Encode<W> {}
1580
1581/// Marker trait for [Decode] tuple types
1582pub 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
1797/// Encoder for `future<T>`
1798pub 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
1859/// Decoder for `future<T>`
1860pub 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        // future is pending
1910        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
1961/// Encoder for `stream<T>`
1962pub 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
2032/// Encoder for `stream<list<u8>>`
2033pub 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
2087/// Encoder for `stream<list<u8>>` with [`AsyncRead`] support
2088///
2089/// At most `MAX_READY` bytes are read from the stream on encode, any remaining
2090/// bytes are transmitted asynchronously.
2091pub 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
2186/// Decoder for `stream<T>`
2187pub 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        // stream is pending
2314        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/// Decoder for `stream<list<u8>>`
2336#[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        // stream is pending
2365        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/// Decoder for `stream<list<u8>>` with [`AsyncRead`] support
2402#[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        // stream is pending
2428        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        // A non-canonical (e.g. signalling) `NaN` is canonicalized on encode.
2739        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        // A negative `NaN` is canonicalized to the (positive) canonical `NaN`.
2744        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        // Non-`NaN` values are encoded unchanged.
2749        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}