1use core::any::TypeId;
2use core::fmt::{self, Debug};
3use core::future::{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::{Buf as _, BufMut as _, Bytes, BytesMut};
12use futures::stream::{self, FuturesUnordered};
13use futures::{Stream, StreamExt as _, TryStreamExt as _};
14use tokio::io::{AsyncRead, AsyncReadExt as _, AsyncWrite, AsyncWriteExt as _};
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, debug, 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 Leb128DecoderI8, Leb128DecoderI16, Leb128DecoderI32, Leb128DecoderI64, Leb128DecoderI128,
30 Leb128DecoderU8, Leb128DecoderU16, Leb128DecoderU32, Leb128DecoderU64, Leb128DecoderU128,
31 Leb128Encoder, Utf8Codec,
32};
33
34use crate::BufferedIncoming;
35use crate::frame::Outgoing;
36
37#[repr(transparent)]
39pub struct ResourceBorrow<T: ?Sized> {
40 repr: Bytes,
41 _ty: PhantomData<T>,
42}
43
44impl<T: ?Sized> From<Bytes> for ResourceBorrow<T> {
45 fn from(repr: Bytes) -> Self {
46 Self {
47 repr,
48 _ty: PhantomData,
49 }
50 }
51}
52
53impl<T: ?Sized> From<Vec<u8>> for ResourceBorrow<T> {
54 fn from(repr: Vec<u8>) -> Self {
55 Self {
56 repr: repr.into(),
57 _ty: PhantomData,
58 }
59 }
60}
61
62impl<T: ?Sized> From<ResourceBorrow<T>> for Bytes {
63 fn from(ResourceBorrow { repr, .. }: ResourceBorrow<T>) -> Self {
64 repr
65 }
66}
67
68impl<T: ?Sized> PartialEq for ResourceBorrow<T> {
69 fn eq(&self, other: &Self) -> bool {
70 self.repr == other.repr
71 }
72}
73
74impl<T: ?Sized> Eq for ResourceBorrow<T> {}
75
76impl<T: ?Sized> Hash for ResourceBorrow<T> {
77 fn hash<H: Hasher>(&self, state: &mut H) {
78 self.repr.hash(state);
79 }
80}
81
82impl<T: ?Sized> AsRef<[u8]> for ResourceBorrow<T> {
83 fn as_ref(&self) -> &[u8] {
84 &self.repr
85 }
86}
87
88impl<T: ?Sized> AsRef<Bytes> for ResourceBorrow<T> {
89 fn as_ref(&self) -> &Bytes {
90 &self.repr
91 }
92}
93
94impl<T: ?Sized + 'static> Debug for ResourceBorrow<T> {
95 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96 write!(f, "borrow<{:?}>", TypeId::of::<T>())
97 }
98}
99
100impl<T: ?Sized> Clone for ResourceBorrow<T> {
101 fn clone(&self) -> Self {
102 Self {
103 repr: self.repr.clone(),
104 _ty: PhantomData,
105 }
106 }
107}
108
109impl<T: ?Sized> ResourceBorrow<T> {
110 pub fn new(repr: impl Into<Bytes>) -> Self {
112 Self::from(repr.into())
113 }
114}
115
116#[repr(transparent)]
118pub struct ResourceOwn<T: ?Sized> {
119 repr: Bytes,
120 _ty: PhantomData<T>,
121}
122
123impl<T: ?Sized> From<ResourceOwn<T>> for ResourceBorrow<T> {
124 fn from(ResourceOwn { repr, _ty }: ResourceOwn<T>) -> Self {
125 Self {
126 repr,
127 _ty: PhantomData,
128 }
129 }
130}
131
132impl<T: ?Sized> From<Bytes> for ResourceOwn<T> {
133 fn from(repr: Bytes) -> Self {
134 Self {
135 repr,
136 _ty: PhantomData,
137 }
138 }
139}
140
141impl<T: ?Sized> From<Vec<u8>> for ResourceOwn<T> {
142 fn from(repr: Vec<u8>) -> Self {
143 Self {
144 repr: repr.into(),
145 _ty: PhantomData,
146 }
147 }
148}
149
150impl<T: ?Sized> From<ResourceOwn<T>> for Bytes {
151 fn from(ResourceOwn { repr, .. }: ResourceOwn<T>) -> Self {
152 repr
153 }
154}
155
156impl<T: ?Sized> PartialEq for ResourceOwn<T> {
157 fn eq(&self, other: &Self) -> bool {
158 self.repr == other.repr
159 }
160}
161
162impl<T: ?Sized> Eq for ResourceOwn<T> {}
163
164impl<T: ?Sized> Hash for ResourceOwn<T> {
165 fn hash<H: Hasher>(&self, state: &mut H) {
166 self.repr.hash(state);
167 }
168}
169
170impl<T: ?Sized> AsRef<[u8]> for ResourceOwn<T> {
171 fn as_ref(&self) -> &[u8] {
172 &self.repr
173 }
174}
175
176impl<T: ?Sized> AsRef<Bytes> for ResourceOwn<T> {
177 fn as_ref(&self) -> &Bytes {
178 &self.repr
179 }
180}
181
182impl<T: ?Sized + 'static> Debug for ResourceOwn<T> {
183 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
184 write!(f, "own<{:?}>", TypeId::of::<T>())
185 }
186}
187
188impl<T: ?Sized> Clone for ResourceOwn<T> {
189 fn clone(&self) -> Self {
190 Self {
191 repr: self.repr.clone(),
192 _ty: PhantomData,
193 }
194 }
195}
196
197impl<T: ?Sized> ResourceOwn<T> {
198 pub fn new(repr: impl Into<Bytes>) -> Self {
200 Self::from(repr.into())
201 }
202
203 pub fn as_borrow(&self) -> ResourceBorrow<T> {
205 ResourceBorrow {
206 repr: self.repr.clone(),
207 _ty: PhantomData,
208 }
209 }
210}
211
212pub type DeferredFn<T> = Box<
214 dyn FnOnce(T, Vec<usize>) -> Pin<Box<dyn Future<Output = std::io::Result<()>> + Send>> + Send,
215>;
216
217pub trait Deferred<T> {
219 fn take_deferred(&mut self) -> Option<DeferredFn<T>>;
221}
222
223macro_rules! impl_deferred_sync {
224 ($t:ty) => {
225 impl<T> Deferred<T> for $t {
226 fn take_deferred(&mut self) -> Option<DeferredFn<T>> {
227 None
228 }
229 }
230 };
231}
232
233impl_deferred_sync!(BoolCodec);
234impl_deferred_sync!(S8Codec);
235impl_deferred_sync!(U8Codec);
236impl_deferred_sync!(S16Codec);
237impl_deferred_sync!(U16Codec);
238impl_deferred_sync!(S32Codec);
239impl_deferred_sync!(U32Codec);
240impl_deferred_sync!(S64Codec);
241impl_deferred_sync!(U64Codec);
242impl_deferred_sync!(F32Codec);
243impl_deferred_sync!(F64Codec);
244impl_deferred_sync!(CoreNameDecoder);
245impl_deferred_sync!(CoreNameEncoder);
246impl_deferred_sync!(CoreVecDecoderBytes);
247impl_deferred_sync!(CoreVecEncoderBytes);
248impl_deferred_sync!(Utf8Codec);
249impl_deferred_sync!(PrimValEncoder);
250impl_deferred_sync!(Leb128Encoder);
251impl_deferred_sync!(Leb128DecoderI8);
252impl_deferred_sync!(Leb128DecoderU8);
253impl_deferred_sync!(Leb128DecoderI16);
254impl_deferred_sync!(Leb128DecoderU16);
255impl_deferred_sync!(Leb128DecoderI32);
256impl_deferred_sync!(Leb128DecoderU32);
257impl_deferred_sync!(Leb128DecoderI64);
258impl_deferred_sync!(Leb128DecoderU64);
259impl_deferred_sync!(Leb128DecoderI128);
260impl_deferred_sync!(Leb128DecoderU128);
261impl_deferred_sync!(ResourceEncoder);
262impl_deferred_sync!(UnitCodec);
263impl_deferred_sync!(ListDecoderU8);
264
265impl_deferred_sync!(CoreVecDecoder<BoolCodec>);
266impl_deferred_sync!(CoreVecDecoder<S8Codec>);
267impl_deferred_sync!(CoreVecDecoder<U8Codec>);
268impl_deferred_sync!(CoreVecDecoder<S16Codec>);
269impl_deferred_sync!(CoreVecDecoder<U16Codec>);
270impl_deferred_sync!(CoreVecDecoder<S32Codec>);
271impl_deferred_sync!(CoreVecDecoder<U32Codec>);
272impl_deferred_sync!(CoreVecDecoder<S64Codec>);
273impl_deferred_sync!(CoreVecDecoder<U64Codec>);
274impl_deferred_sync!(CoreVecDecoder<F32Codec>);
275impl_deferred_sync!(CoreVecDecoder<F64Codec>);
276impl_deferred_sync!(CoreVecDecoder<CoreNameDecoder>);
277impl_deferred_sync!(CoreVecDecoder<CoreVecDecoderBytes>);
278impl_deferred_sync!(CoreVecDecoder<Utf8Codec>);
279impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI8>);
280impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU8>);
281impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI16>);
282impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU16>);
283impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI32>);
284impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU32>);
285impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI64>);
286impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU64>);
287impl_deferred_sync!(CoreVecDecoder<Leb128DecoderI128>);
288impl_deferred_sync!(CoreVecDecoder<Leb128DecoderU128>);
289impl_deferred_sync!(CoreVecDecoder<UnitCodec>);
290
291pub struct SyncCodec<T>(pub T);
296
297impl<T> Deref for SyncCodec<T> {
298 type Target = T;
299
300 fn deref(&self) -> &Self::Target {
301 &self.0
302 }
303}
304
305impl<T> DerefMut for SyncCodec<T> {
306 fn deref_mut(&mut self) -> &mut Self::Target {
307 &mut self.0
308 }
309}
310
311impl<T, C> Deferred<T> for SyncCodec<C> {
312 fn take_deferred(&mut self) -> Option<DeferredFn<T>> {
313 None
314 }
315}
316
317impl<T: Default> Default for SyncCodec<T> {
318 fn default() -> Self {
319 Self(T::default())
320 }
321}
322
323impl<T, I> tokio_util::codec::Encoder<I> for SyncCodec<T>
324where
325 T: tokio_util::codec::Encoder<I>,
326{
327 type Error = T::Error;
328
329 fn encode(&mut self, item: I, dst: &mut BytesMut) -> Result<(), Self::Error> {
330 self.0.encode(item, dst)
331 }
332}
333
334impl<T> tokio_util::codec::Decoder for SyncCodec<T>
335where
336 T: tokio_util::codec::Decoder,
337{
338 type Item = T::Item;
339 type Error = T::Error;
340
341 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
342 self.0.decode(src)
343 }
344
345 fn decode_eof(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
346 self.0.decode_eof(buf)
347 }
348
349 fn framed<IO: AsyncRead + AsyncWrite + Sized>(
350 self,
351 io: IO,
352 ) -> tokio_util::codec::Framed<IO, Self>
353 where
354 Self: Sized,
355 {
356 self.0.framed(io).map_codec(Self)
357 }
358}
359
360macro_rules! impl_handle_deferred {
361 ($name:ident, $t:ty) => {
362 #[instrument(level = "trace", skip(w, deferred))]
363 async fn $name<I>(w: $t, deferred: I, mut path: Vec<usize>) -> std::io::Result<()>
364 where
365 I: IntoIterator<Item = Option<DeferredFn<$t>>>,
366 I::IntoIter: ExactSizeIterator,
367 {
368 let mut futs = FuturesUnordered::default();
369 for (i, f) in zip(0.., deferred) {
370 if let Some(f) = f {
371 path.push(i);
372 let w = w.index(&path).map_err(std::io::Error::other)?;
373 path.pop();
374 futs.push(f(w, Vec::default()));
375 }
376 }
377 while let Some(()) = futs.try_next().await? {}
378 Ok(())
379 }
380 };
381}
382
383impl_handle_deferred!(handle_deferred_tx, Outgoing);
384impl_handle_deferred!(handle_deferred_rx, BufferedIncoming);
385
386pub trait Encode: Sized {
388 type Encoder: tokio_util::codec::Encoder<Self> + Deferred<Outgoing> + Default + Send;
390
391 #[instrument(level = "trace", skip(self, enc))]
393 fn encode(
394 self,
395 enc: &mut Self::Encoder,
396 dst: &mut BytesMut,
397 ) -> Result<
398 Option<DeferredFn<Outgoing>>,
399 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
400 > {
401 enc.encode(self, dst)?;
402 Ok(enc.take_deferred())
403 }
404
405 #[instrument(level = "trace", skip(items, enc))]
407 fn encode_iter_own<I>(
408 items: I,
409 enc: &mut Self::Encoder,
410 dst: &mut BytesMut,
411 ) -> Result<
412 Option<DeferredFn<Outgoing>>,
413 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
414 >
415 where
416 I: IntoIterator<Item = Self>,
417 I::IntoIter: ExactSizeIterator,
418 {
419 let items = items.into_iter();
420 dst.reserve(items.len());
421 let mut deferred = Vec::with_capacity(items.len());
422 for item in items {
423 enc.encode(item, dst)?;
424 deferred.push(enc.take_deferred());
425 }
426 if deferred.iter().any(Option::is_some) {
427 Ok(Some(Box::new(move |w, path| {
428 Box::pin(handle_deferred_tx(w, deferred, path))
429 })))
430 } else {
431 Ok(None)
432 }
433 }
434
435 #[instrument(level = "trace", skip(items, enc))]
437 fn encode_iter_ref<'a, I>(
438 items: I,
439 enc: &mut Self::Encoder,
440 dst: &mut BytesMut,
441 ) -> Result<
442 Option<DeferredFn<Outgoing>>,
443 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
444 >
445 where
446 I: IntoIterator<Item = &'a Self>,
447 I::IntoIter: ExactSizeIterator,
448 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
449 {
450 let items = items.into_iter();
451 dst.reserve(items.len());
452 let mut deferred = Vec::with_capacity(items.len());
453 for item in items {
454 enc.encode(item, dst)?;
455 deferred.push(enc.take_deferred());
456 }
457 if deferred.iter().any(Option::is_some) {
458 Ok(Some(Box::new(move |w, path| {
459 Box::pin(handle_deferred_tx(w, deferred, path))
460 })))
461 } else {
462 Ok(None)
463 }
464 }
465
466 #[instrument(level = "trace", skip(items, enc), fields(ty = "list"))]
468 fn encode_list_own(
469 items: Vec<Self>,
470 enc: &mut Self::Encoder,
471 dst: &mut BytesMut,
472 ) -> Result<
473 Option<DeferredFn<Outgoing>>,
474 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
475 > {
476 let n = u32::try_from(items.len())
477 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
478 dst.reserve(5 + items.len());
479 Leb128Encoder.encode(n, dst)?;
480 Self::encode_iter_own(items, enc, dst)
481 }
482
483 #[instrument(level = "trace", skip(items, enc), fields(ty = "list"))]
485 fn encode_list_ref<'a>(
486 items: &'a [Self],
487 enc: &mut Self::Encoder,
488 dst: &mut BytesMut,
489 ) -> Result<
490 Option<DeferredFn<Outgoing>>,
491 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
492 >
493 where
494 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
495 {
496 let n = u32::try_from(items.len())
497 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
498 dst.reserve(5 + items.len());
499 Leb128Encoder.encode(n, dst)?;
500 Self::encode_iter_ref(items, enc, dst)
501 }
502}
503
504pub trait Decode: Sized {
506 type Decoder: tokio_util::codec::Decoder<Item = Self>
508 + Deferred<BufferedIncoming>
509 + Default
510 + Send
511 + 'static;
512 type ListDecoder: tokio_util::codec::Decoder<Item = Vec<Self>> + Default + 'static;
514}
515
516impl<T, W> Deferred<W> for OptionEncoder<T>
517where
518 T: Deferred<W>,
519{
520 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
521 self.0.take_deferred()
522 }
523}
524
525impl<T> Encode for Option<T>
526where
527 T: Encode,
528{
529 type Encoder = OptionEncoder<T::Encoder>;
530}
531
532impl<'a, T> Encode for &'a Option<T>
533where
534 T: Encode,
535 T::Encoder: tokio_util::codec::Encoder<&'a T>,
536{
537 type Encoder = OptionEncoder<T::Encoder>;
538}
539
540impl<T, W> Deferred<W> for OptionDecoder<T>
541where
542 T: Deferred<W> + Default,
543{
544 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
545 mem::take(self).into_inner().take_deferred()
546 }
547}
548
549impl<T> Decode for Option<T>
550where
551 T: Decode,
552{
553 type Decoder = OptionDecoder<T::Decoder>;
554 type ListDecoder = ListDecoder<Self::Decoder>;
555}
556
557impl<O, E, W> Deferred<W> for ResultEncoder<O, E>
558where
559 O: Deferred<W>,
560 E: Deferred<W>,
561{
562 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
563 match (self.ok.take_deferred(), self.err.take_deferred()) {
564 (None, None) => None,
565 (Some(ok), None) => Some(ok),
566 (None, Some(err)) => Some(err),
567 (Some(ok), Some(_)) => {
568 if cfg!(debug_assertions) {
569 panic!("both `result::ok` and `result::err` deferred function set");
570 } else {
571 Some(ok)
572 }
573 }
574 }
575 }
576}
577
578impl<O, E> Encode for Result<O, E>
579where
580 O: Encode,
581 E: Encode,
582 std::io::Error: From<<O::Encoder as tokio_util::codec::Encoder<O>>::Error>,
583 std::io::Error: From<<E::Encoder as tokio_util::codec::Encoder<E>>::Error>,
584{
585 type Encoder = ResultEncoder<O::Encoder, E::Encoder>;
586}
587
588impl<'a, O, E> Encode for &'a Result<O, E>
589where
590 O: Encode,
591 O::Encoder: tokio_util::codec::Encoder<&'a O>,
592 E: Encode,
593 E::Encoder: tokio_util::codec::Encoder<&'a E>,
594 std::io::Error: From<<O::Encoder as tokio_util::codec::Encoder<&'a O>>::Error>,
595 std::io::Error: From<<E::Encoder as tokio_util::codec::Encoder<&'a E>>::Error>,
596{
597 type Encoder = ResultEncoder<O::Encoder, E::Encoder>;
598}
599
600impl<O, E, W> Deferred<W> for ResultDecoder<O, E>
601where
602 O: Deferred<W> + Default,
603 E: Deferred<W> + Default,
604{
605 fn take_deferred(&mut self) -> Option<DeferredFn<W>> {
606 let (mut ok, mut err) = mem::take(self).into_inner();
607 match (ok.take_deferred(), err.take_deferred()) {
608 (None, None) => None,
609 (Some(ok), None) => Some(ok),
610 (None, Some(err)) => Some(err),
611 (Some(ok), Some(_)) => {
612 if cfg!(debug_assertions) {
613 panic!("both `result::ok` and `result::err` deferred function set");
614 } else {
615 Some(ok)
616 }
617 }
618 }
619 }
620}
621
622impl<O, E> Decode for Result<O, E>
623where
624 O: Decode,
625 E: Decode,
626 std::io::Error: From<<O::Decoder as tokio_util::codec::Decoder>::Error>,
627 std::io::Error: From<<E::Decoder as tokio_util::codec::Decoder>::Error>,
628{
629 type Decoder = ResultDecoder<O::Decoder, E::Decoder>;
630 type ListDecoder = ListDecoder<Self::Decoder>;
631}
632
633#[derive(Default)]
635pub struct ListEncoder {
636 deferred: Option<DeferredFn<Outgoing>>,
637}
638
639impl Deferred<Outgoing> for ListEncoder {
640 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
641 self.deferred.take()
642 }
643}
644
645impl<T> tokio_util::codec::Encoder<Vec<T>> for ListEncoder
646where
647 T: Encode,
648{
649 type Error = <T::Encoder as tokio_util::codec::Encoder<T>>::Error;
650
651 fn encode(&mut self, items: Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
652 let mut enc = T::Encoder::default();
653 self.deferred = T::encode_list_own(items, &mut enc, dst)?;
654 Ok(())
655 }
656}
657
658impl<'a, T> tokio_util::codec::Encoder<&'a Vec<T>> for ListEncoder
659where
660 T: Encode,
661 T::Encoder: tokio_util::codec::Encoder<&'a T>,
662{
663 type Error = <T::Encoder as tokio_util::codec::Encoder<&'a T>>::Error;
664
665 fn encode(&mut self, items: &'a Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
666 let mut enc = T::Encoder::default();
667 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
668 Ok(())
669 }
670}
671
672impl<'a, 'b, T> tokio_util::codec::Encoder<&'a &'b Vec<T>> for ListEncoder
673where
674 T: Encode,
675 T::Encoder: tokio_util::codec::Encoder<&'b T>,
676{
677 type Error = <T::Encoder as tokio_util::codec::Encoder<&'b T>>::Error;
678
679 fn encode(&mut self, items: &'a &'b Vec<T>, dst: &mut BytesMut) -> Result<(), Self::Error> {
680 let mut enc = T::Encoder::default();
681 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
682 Ok(())
683 }
684}
685
686impl<'a, T> tokio_util::codec::Encoder<&'a [T]> for ListEncoder
687where
688 T: Encode,
689 T::Encoder: tokio_util::codec::Encoder<&'a T>,
690{
691 type Error = <T::Encoder as tokio_util::codec::Encoder<&'a T>>::Error;
692
693 fn encode(&mut self, items: &'a [T], dst: &mut BytesMut) -> Result<(), Self::Error> {
694 let mut enc = T::Encoder::default();
695 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
696 Ok(())
697 }
698}
699
700impl<'a, 'b, T> tokio_util::codec::Encoder<&'a &'b [T]> for ListEncoder
701where
702 T: Encode,
703 T::Encoder: tokio_util::codec::Encoder<&'b T>,
704{
705 type Error = <T::Encoder as tokio_util::codec::Encoder<&'b T>>::Error;
706
707 fn encode(&mut self, items: &'a &'b [T], dst: &mut BytesMut) -> Result<(), Self::Error> {
708 let mut enc = T::Encoder::default();
709 self.deferred = T::encode_list_ref(items, &mut enc, dst)?;
710 Ok(())
711 }
712}
713
714impl<T> Encode for Vec<T>
715where
716 T: Encode,
717{
718 type Encoder = ListEncoder;
719}
720
721impl<'a, T> Encode for &'a Vec<T>
722where
723 T: Encode,
724 T::Encoder: tokio_util::codec::Encoder<&'a T>,
725{
726 type Encoder = ListEncoder;
727}
728
729impl<'a, T> Encode for &'a [T]
730where
731 T: Encode,
732 T::Encoder: tokio_util::codec::Encoder<&'a T>,
733{
734 type Encoder = ListEncoder;
735}
736
737pub struct ListDecoder<T>
739where
740 T: tokio_util::codec::Decoder,
741{
742 dec: T,
743 ret: Vec<T::Item>,
744 cap: usize,
745 deferred: Vec<Option<DeferredFn<BufferedIncoming>>>,
746}
747
748impl<T> ListDecoder<T>
749where
750 T: tokio_util::codec::Decoder,
751{
752 pub fn new(dec: T) -> Self {
754 Self {
755 dec,
756 ret: Vec::default(),
757 cap: 0,
758 deferred: vec![],
759 }
760 }
761}
762
763impl<T> Default for ListDecoder<T>
764where
765 T: tokio_util::codec::Decoder + Default,
766{
767 fn default() -> Self {
768 Self::new(T::default())
769 }
770}
771
772impl<T> Deferred<BufferedIncoming> for ListDecoder<T>
773where
774 T: tokio_util::codec::Decoder,
775{
776 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
777 let deferred = mem::take(&mut self.deferred);
778 if deferred.iter().any(Option::is_some) {
779 Some(Box::new(|r, path| {
780 Box::pin(handle_deferred_rx(r, deferred, path))
781 }))
782 } else {
783 None
784 }
785 }
786}
787
788impl<T> tokio_util::codec::Decoder for ListDecoder<T>
789where
790 T: tokio_util::codec::Decoder + Deferred<BufferedIncoming>,
791{
792 type Item = Vec<T::Item>;
793 type Error = T::Error;
794
795 #[instrument(level = "trace", skip(self), fields(ty = "list"))]
796 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
797 if self.cap == 0 {
798 let Some(len) = Leb128DecoderU32.decode(src)? else {
799 return Ok(None);
800 };
801 if len == 0 {
802 return Ok(Some(Vec::default()));
803 }
804 let len = len
805 .try_into()
806 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
807 self.ret = Vec::with_capacity(len);
808 self.deferred = Vec::with_capacity(len);
809 self.cap = len;
810 }
811 while self.cap > 0 {
812 let Some(v) = self.dec.decode(src)? else {
813 return Ok(None);
814 };
815 self.ret.push(v);
816 self.deferred.push(self.dec.take_deferred());
817 self.cap -= 1;
818 }
819 Ok(Some(mem::take(&mut self.ret)))
820 }
821}
822
823impl<T> Decode for Vec<T>
824where
825 T: Decode + Send,
826 T::ListDecoder: Deferred<BufferedIncoming> + Send,
827{
828 type Decoder = T::ListDecoder;
829 type ListDecoder = ListDecoder<Self::Decoder>;
830}
831
832macro_rules! impl_copy_codec {
833 ($t:ty, $c:tt) => {
834 impl Encode for $t {
835 type Encoder = $c;
836
837 #[instrument(level = "trace", skip(items))]
838 fn encode_iter_own<I>(
839 items: I,
840 enc: &mut Self::Encoder,
841 dst: &mut BytesMut,
842 ) -> Result<
843 Option<DeferredFn<Outgoing>>,
844 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
845 >
846 where
847 I: IntoIterator<Item = Self>,
848 I::IntoIter: ExactSizeIterator,
849 {
850 let items = items.into_iter();
851 dst.reserve(items.len());
852 for item in items {
853 enc.encode(item, dst)?;
854 }
855 Ok(None)
856 }
857
858 #[instrument(level = "trace", skip(items))]
859 fn encode_iter_ref<'a, I>(
860 items: I,
861 enc: &mut Self::Encoder,
862 dst: &mut BytesMut,
863 ) -> Result<
864 Option<DeferredFn<Outgoing>>,
865 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
866 >
867 where
868 I: IntoIterator<Item = &'a Self>,
869 I::IntoIter: ExactSizeIterator,
870 {
871 let items = items.into_iter();
872 dst.reserve(items.len());
873 for item in items {
874 enc.encode(*item, dst)?;
875 }
876 Ok(None)
877 }
878 }
879
880 impl<'b> Encode for &'b $t {
881 type Encoder = $c;
882
883 #[instrument(level = "trace", skip(items))]
884 fn encode_iter_own<I>(
885 items: I,
886 enc: &mut Self::Encoder,
887 dst: &mut BytesMut,
888 ) -> Result<
889 Option<DeferredFn<Outgoing>>,
890 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
891 >
892 where
893 I: IntoIterator<Item = Self>,
894 I::IntoIter: ExactSizeIterator,
895 {
896 let items = items.into_iter();
897 dst.reserve(items.len());
898 for item in items {
899 enc.encode(*item, dst)?;
900 }
901 Ok(None)
902 }
903
904 #[instrument(level = "trace", skip(items))]
905 fn encode_iter_ref<'a, I>(
906 items: I,
907 enc: &mut Self::Encoder,
908 dst: &mut BytesMut,
909 ) -> Result<
910 Option<DeferredFn<Outgoing>>,
911 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
912 >
913 where
914 I: IntoIterator<Item = &'a Self>,
915 I::IntoIter: ExactSizeIterator,
916 'b: 'a,
917 {
918 let items = items.into_iter();
919 dst.reserve(items.len());
920 for item in items {
921 enc.encode(item, dst)?;
922 }
923 Ok(None)
924 }
925 }
926
927 impl Decode for $t {
928 type Decoder = $c;
929 type ListDecoder = CoreVecDecoder<Self::Decoder>;
930 }
931 };
932}
933
934const CANONICAL_NAN_F32: u32 = 0x7fc0_0000;
941const CANONICAL_NAN_F64: u64 = 0x7ff8_0000_0000_0000;
942
943macro_rules! impl_canonical_nan_codec {
947 ($name:ident, $inner:ty, $t:ty, $canon:expr_2021) => {
948 #[doc = concat!("Canonicalizes `NaN`s on encode, wrapping [`", stringify!($inner), "`].")]
949 #[derive(Debug, Default)]
950 pub struct $name($inner);
951
952 impl tokio_util::codec::Encoder<$t> for $name {
953 type Error = std::io::Error;
954
955 fn encode(&mut self, item: $t, dst: &mut BytesMut) -> Result<(), Self::Error> {
956 let item = if item.is_nan() {
957 <$t>::from_bits($canon)
958 } else {
959 item
960 };
961 self.0.encode(item, dst)
962 }
963 }
964
965 impl tokio_util::codec::Encoder<&$t> for $name {
966 type Error = std::io::Error;
967
968 fn encode(&mut self, item: &$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
969 tokio_util::codec::Encoder::<$t>::encode(self, *item, dst)
970 }
971 }
972
973 impl tokio_util::codec::Encoder<&&$t> for $name {
974 type Error = std::io::Error;
975
976 fn encode(&mut self, item: &&$t, dst: &mut BytesMut) -> Result<(), Self::Error> {
977 tokio_util::codec::Encoder::<$t>::encode(self, **item, dst)
978 }
979 }
980
981 impl tokio_util::codec::Decoder for $name {
982 type Item = $t;
983 type Error = std::io::Error;
984
985 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<$t>, Self::Error> {
986 self.0.decode(src)
987 }
988 }
989
990 impl_deferred_sync!($name);
991 impl_deferred_sync!(CoreVecDecoder<$name>);
992 };
993}
994
995impl_canonical_nan_codec!(CanonicalNanF32Codec, F32Codec, f32, CANONICAL_NAN_F32);
996impl_canonical_nan_codec!(CanonicalNanF64Codec, F64Codec, f64, CANONICAL_NAN_F64);
997
998impl_copy_codec!(bool, BoolCodec);
999impl_copy_codec!(i8, S8Codec);
1000impl_copy_codec!(i16, S16Codec);
1001impl_copy_codec!(u16, U16Codec);
1002impl_copy_codec!(i32, S32Codec);
1003impl_copy_codec!(u32, U32Codec);
1004impl_copy_codec!(i64, S64Codec);
1005impl_copy_codec!(u64, U64Codec);
1006impl_copy_codec!(f32, CanonicalNanF32Codec);
1007impl_copy_codec!(f64, CanonicalNanF64Codec);
1008impl_copy_codec!(char, Utf8Codec);
1009
1010impl Encode for u8 {
1011 type Encoder = U8Codec;
1012
1013 #[instrument(level = "trace", skip(items))]
1014 fn encode_iter_own<I>(
1015 items: I,
1016 enc: &mut Self::Encoder,
1017 dst: &mut BytesMut,
1018 ) -> Result<
1019 Option<DeferredFn<Outgoing>>,
1020 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
1021 >
1022 where
1023 I: IntoIterator<Item = Self>,
1024 I::IntoIter: ExactSizeIterator,
1025 {
1026 let items = items.into_iter();
1027 dst.reserve(items.len());
1028 dst.extend(items);
1029 Ok(None)
1030 }
1031
1032 #[instrument(level = "trace", skip(items))]
1033 fn encode_iter_ref<'a, I>(
1034 items: I,
1035 enc: &mut Self::Encoder,
1036 dst: &mut BytesMut,
1037 ) -> Result<
1038 Option<DeferredFn<Outgoing>>,
1039 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
1040 >
1041 where
1042 I: IntoIterator<Item = &'a Self>,
1043 I::IntoIter: ExactSizeIterator,
1044 {
1045 let items = items.into_iter();
1046 dst.reserve(items.len());
1047 dst.extend(items);
1048 Ok(None)
1049 }
1050
1051 #[instrument(level = "trace", skip(items), fields(ty = "list<u8>"))]
1052 fn encode_list_own(
1053 items: Vec<Self>,
1054 enc: &mut Self::Encoder,
1055 dst: &mut BytesMut,
1056 ) -> Result<
1057 Option<DeferredFn<Outgoing>>,
1058 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
1059 > {
1060 CoreVecEncoderBytes.encode(items, dst)?;
1061 Ok(None)
1062 }
1063
1064 #[instrument(level = "trace", skip(items), fields(ty = "list<u8>"))]
1065 fn encode_list_ref<'a>(
1066 items: &'a [Self],
1067 enc: &mut Self::Encoder,
1068 dst: &mut BytesMut,
1069 ) -> Result<
1070 Option<DeferredFn<Outgoing>>,
1071 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
1072 >
1073 where
1074 Self::Encoder: tokio_util::codec::Encoder<&'a Self>,
1075 {
1076 CoreVecEncoderBytes.encode(items, dst)?;
1077 Ok(None)
1078 }
1079}
1080
1081impl<'b> Encode for &'b u8 {
1082 type Encoder = U8Codec;
1083
1084 #[instrument(level = "trace", skip(items))]
1085 fn encode_iter_own<I>(
1086 items: I,
1087 enc: &mut Self::Encoder,
1088 dst: &mut BytesMut,
1089 ) -> Result<
1090 Option<DeferredFn<Outgoing>>,
1091 <Self::Encoder as tokio_util::codec::Encoder<Self>>::Error,
1092 >
1093 where
1094 I: IntoIterator<Item = Self>,
1095 I::IntoIter: ExactSizeIterator,
1096 {
1097 let items = items.into_iter();
1098 dst.reserve(items.len());
1099 dst.extend(items);
1100 Ok(None)
1101 }
1102
1103 #[instrument(level = "trace", skip(items))]
1104 fn encode_iter_ref<'a, I>(
1105 items: I,
1106 enc: &mut Self::Encoder,
1107 dst: &mut BytesMut,
1108 ) -> Result<
1109 Option<DeferredFn<Outgoing>>,
1110 <Self::Encoder as tokio_util::codec::Encoder<&'a Self>>::Error,
1111 >
1112 where
1113 I: IntoIterator<Item = &'a Self>,
1114 I::IntoIter: ExactSizeIterator,
1115 'b: 'a,
1116 {
1117 let items = items.into_iter();
1118 dst.reserve(items.len());
1119 dst.extend(items.map(|b| **b));
1120 Ok(None)
1121 }
1122}
1123
1124#[derive(Debug, Default)]
1126#[repr(transparent)]
1127pub struct ListDecoderU8(CoreVecDecoderBytes);
1128
1129impl tokio_util::codec::Decoder for ListDecoderU8 {
1130 type Item = Vec<u8>;
1131 type Error = <CoreVecDecoderBytes as tokio_util::codec::Decoder>::Error;
1132
1133 #[instrument(level = "trace", skip(self), fields(ty = "list<u8>"))]
1134 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1135 let Some(buf) = self.0.decode(src)? else {
1136 return Ok(None);
1137 };
1138 Ok(Some(buf.into()))
1139 }
1140}
1141
1142impl Decode for u8 {
1143 type Decoder = U8Codec;
1144 type ListDecoder = ListDecoderU8;
1145}
1146
1147impl Encode for &str {
1148 type Encoder = CoreNameEncoder;
1149}
1150
1151impl Encode for &&str {
1152 type Encoder = CoreNameEncoder;
1153}
1154
1155impl Encode for String {
1156 type Encoder = CoreNameEncoder;
1157}
1158
1159impl Encode for &String {
1160 type Encoder = CoreNameEncoder;
1161}
1162
1163impl Decode for String {
1164 type Decoder = CoreNameDecoder;
1165 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1166}
1167
1168impl Encode for Bytes {
1169 type Encoder = CoreVecEncoderBytes;
1170}
1171
1172impl Encode for &Bytes {
1173 type Encoder = CoreVecEncoderBytes;
1174}
1175
1176impl Decode for Bytes {
1177 type Decoder = CoreVecDecoderBytes;
1178 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1179}
1180
1181#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
1183#[repr(transparent)]
1184pub struct ResourceEncoder;
1185
1186impl<T: ?Sized> tokio_util::codec::Encoder<ResourceOwn<T>> for ResourceEncoder {
1187 type Error = std::io::Error;
1188
1189 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "own"))]
1190 fn encode(&mut self, item: ResourceOwn<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1191 CoreVecEncoderBytes.encode(item.repr, dst)
1192 }
1193}
1194
1195impl<T: ?Sized> tokio_util::codec::Encoder<&ResourceOwn<T>> for ResourceEncoder {
1196 type Error = std::io::Error;
1197
1198 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "own"))]
1199 fn encode(&mut self, item: &ResourceOwn<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1200 CoreVecEncoderBytes.encode(&item.repr, dst)
1201 }
1202}
1203
1204impl<T: ?Sized> Encode for ResourceOwn<T> {
1205 type Encoder = ResourceEncoder;
1206}
1207
1208impl<T: ?Sized> Encode for &ResourceOwn<T> {
1209 type Encoder = ResourceEncoder;
1210}
1211
1212impl<T: ?Sized> tokio_util::codec::Encoder<ResourceBorrow<T>> for ResourceEncoder {
1213 type Error = std::io::Error;
1214
1215 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "borrow"))]
1216 fn encode(&mut self, item: ResourceBorrow<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1217 CoreVecEncoderBytes.encode(item.repr, dst)
1218 }
1219}
1220
1221impl<T: ?Sized> tokio_util::codec::Encoder<&ResourceBorrow<T>> for ResourceEncoder {
1222 type Error = std::io::Error;
1223
1224 #[instrument(level = "trace", skip(self, item), ret, fields(ty = "borrow"))]
1225 fn encode(&mut self, item: &ResourceBorrow<T>, dst: &mut BytesMut) -> std::io::Result<()> {
1226 CoreVecEncoderBytes.encode(&item.repr, dst)
1227 }
1228}
1229
1230impl<T: ?Sized> Encode for ResourceBorrow<T> {
1231 type Encoder = ResourceEncoder;
1232}
1233
1234impl<T: ?Sized> Encode for &ResourceBorrow<T> {
1235 type Encoder = ResourceEncoder;
1236}
1237
1238#[derive(Debug)]
1240#[repr(transparent)]
1241pub struct ResourceBorrowDecoder<T: ?Sized> {
1242 dec: CoreVecDecoderBytes,
1243 _ty: PhantomData<T>,
1244}
1245
1246impl<T: ?Sized> Default for ResourceBorrowDecoder<T> {
1247 fn default() -> Self {
1248 Self {
1249 dec: CoreVecDecoderBytes::default(),
1250 _ty: PhantomData,
1251 }
1252 }
1253}
1254
1255impl<T: ?Sized> Deferred<BufferedIncoming> for ResourceBorrowDecoder<T> {
1256 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1257 None
1258 }
1259}
1260
1261impl<T: ?Sized> Deferred<BufferedIncoming> for CoreVecDecoder<ResourceBorrowDecoder<T>> {
1262 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1263 None
1264 }
1265}
1266
1267impl<T: ?Sized + Send + 'static> Decode for ResourceBorrow<T> {
1268 type Decoder = ResourceBorrowDecoder<T>;
1269 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1270}
1271
1272impl<T: ?Sized> tokio_util::codec::Decoder for ResourceBorrowDecoder<T> {
1273 type Item = ResourceBorrow<T>;
1274 type Error = std::io::Error;
1275
1276 #[instrument(level = "trace", skip(self), fields(ty = "borrow"))]
1277 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1278 let repr = self.dec.decode(src)?;
1279 Ok(repr.map(Self::Item::from))
1280 }
1281}
1282
1283#[derive(Debug)]
1285#[repr(transparent)]
1286pub struct ResourceOwnDecoder<T: ?Sized> {
1287 dec: CoreVecDecoderBytes,
1288 _ty: PhantomData<T>,
1289}
1290
1291impl<T: ?Sized> Default for ResourceOwnDecoder<T> {
1292 fn default() -> Self {
1293 Self {
1294 dec: CoreVecDecoderBytes::default(),
1295 _ty: PhantomData,
1296 }
1297 }
1298}
1299
1300impl<T: ?Sized> Deferred<BufferedIncoming> for ResourceOwnDecoder<T> {
1301 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1302 None
1303 }
1304}
1305
1306impl<T: ?Sized> Deferred<BufferedIncoming> for CoreVecDecoder<ResourceOwnDecoder<T>> {
1307 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1308 None
1309 }
1310}
1311
1312impl<T: ?Sized + Send + 'static> Decode for ResourceOwn<T> {
1313 type Decoder = ResourceOwnDecoder<T>;
1314 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1315}
1316
1317impl<T: ?Sized> tokio_util::codec::Decoder for ResourceOwnDecoder<T> {
1318 type Item = ResourceOwn<T>;
1319 type Error = std::io::Error;
1320
1321 #[instrument(level = "trace", skip(self), fields(ty = "own"))]
1322 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1323 let repr = self.dec.decode(src)?;
1324 Ok(repr.map(Self::Item::from))
1325 }
1326}
1327
1328#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
1330#[repr(transparent)]
1331pub struct UnitCodec;
1332
1333impl tokio_util::codec::Encoder<()> for UnitCodec {
1334 type Error = std::io::Error;
1335
1336 #[instrument(level = "trace", skip(self), ret)]
1337 fn encode(&mut self, (): (), dst: &mut BytesMut) -> std::io::Result<()> {
1338 Ok(())
1339 }
1340}
1341
1342impl tokio_util::codec::Encoder<&()> for UnitCodec {
1343 type Error = std::io::Error;
1344
1345 #[instrument(level = "trace", skip(self), ret)]
1346 fn encode(&mut self, (): &(), dst: &mut BytesMut) -> std::io::Result<()> {
1347 Ok(())
1348 }
1349}
1350
1351impl tokio_util::codec::Decoder for UnitCodec {
1352 type Item = ();
1353 type Error = std::io::Error;
1354
1355 #[instrument(level = "trace", skip(self))]
1356 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1357 Ok(Some(()))
1358 }
1359}
1360
1361pub trait TupleEncode: Encode {}
1363
1364pub trait TupleDecode: Decode {}
1366
1367impl Encode for () {
1368 type Encoder = UnitCodec;
1369}
1370
1371impl TupleEncode for () {}
1372
1373impl Decode for () {
1374 type Decoder = UnitCodec;
1375 type ListDecoder = CoreVecDecoder<Self::Decoder>;
1376}
1377
1378impl TupleDecode for () {}
1379
1380macro_rules! impl_tuple_codec {
1381 ($($vn:ident),+; $($vt:ident),+; $($cn:ident),+; $($ct:ident),+) => {
1382 impl<$($ct),+> Deferred<Outgoing> for TupleEncoder::<($($ct),+,)>
1383 where
1384 $($ct: Deferred<Outgoing> + Default + 'static),+
1385 {
1386 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
1387 let Self(($(mut $cn),+,)) = mem::take(self);
1388 let deferred = [ $($cn.take_deferred()),+ ];
1389 if deferred.iter().any(Option::is_some) {
1390 Some(Box::new(|r, path| Box::pin(handle_deferred_tx(r, deferred, path))))
1391 } else {
1392 None
1393 }
1394 }
1395 }
1396
1397 impl<E, $($vt),+> Encode for ($($vt),+,)
1398 where
1399 E: From<std::io::Error>,
1400 $(
1401 $vt: Encode,
1402 $vt::Encoder: tokio_util::codec::Encoder<$vt, Error = E> + 'static,
1403 )+
1404 {
1405 type Encoder = TupleEncoder::<($($vt::Encoder),+,)>;
1406 }
1407
1408 impl<E, $($vt),+> TupleEncode for ($($vt),+,)
1409 where
1410 E: From<std::io::Error>,
1411 $(
1412 $vt: Encode,
1413 $vt::Encoder: tokio_util::codec::Encoder<$vt, Error = E> + 'static,
1414 )+
1415 {
1416 }
1417
1418 impl<'a, E, $($vt),+> Encode for &'a ($($vt),+,)
1419 where
1420 E: From<std::io::Error>,
1421 $(
1422 $vt: Encode,
1423 $vt::Encoder: tokio_util::codec::Encoder<&'a $vt, Error = E> + 'static,
1424 )+
1425 {
1426 type Encoder = TupleEncoder::<($($vt::Encoder),+,)>;
1427 }
1428
1429 impl<$($vt),+> Deferred<BufferedIncoming> for TupleDecoder::<($($vt::Decoder),+,), ($(Option<$vt>),+,)>
1430 where
1431 $($vt: Decode),+
1432 {
1433 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1434 let ($(mut $cn),+,) = mem::take(self).into_inner();
1435 let deferred = [ $($cn.take_deferred()),+ ];
1436 if deferred.iter().any(Option::is_some) {
1437 Some(Box::new(|r, path| Box::pin(handle_deferred_rx(r, deferred, path))))
1438 } else {
1439 None
1440 }
1441 }
1442 }
1443
1444 impl<E, $($vt),+> Decode for ($($vt),+,)
1445 where
1446 E: From<std::io::Error>,
1447 $(
1448 $vt: Decode + Send + 'static,
1449 $vt::Decoder: tokio_util::codec::Decoder<Error = E> + Send + 'static,
1450 )+
1451 {
1452 type Decoder = TupleDecoder::<($($vt::Decoder),+,), ($(Option<$vt>),+,)>;
1453 type ListDecoder = ListDecoder<Self::Decoder>;
1454 }
1455
1456 impl<E, $($vt),+> TupleDecode for ($($vt),+,)
1457 where
1458 E: From<std::io::Error>,
1459 $(
1460 $vt: Decode + Send + 'static,
1461 $vt::Decoder: tokio_util::codec::Decoder<Error = E> + Send + 'static,
1462 )+
1463 {
1464 }
1465 };
1466}
1467
1468impl_tuple_codec!(
1469 v0;
1470 V0;
1471 c0;
1472 C0
1473);
1474
1475impl_tuple_codec!(
1476 v0, v1;
1477 V0, V1;
1478 c0, c1;
1479 C0, C1
1480);
1481
1482impl_tuple_codec!(
1483 v0, v1, v2;
1484 V0, V1, V2;
1485 c0, c1, c2;
1486 C0, C1, C2
1487);
1488
1489impl_tuple_codec!(
1490 v0, v1, v2, v3;
1491 V0, V1, V2, V3;
1492 c0, c1, c2, c3;
1493 C0, C1, C2, C3
1494);
1495
1496impl_tuple_codec!(
1497 v0, v1, v2, v3, v4;
1498 V0, V1, V2, V3, V4;
1499 c0, c1, c2, c3, c4;
1500 C0, C1, C2, C3, C4
1501);
1502
1503impl_tuple_codec!(
1504 v0, v1, v2, v3, v4, v5;
1505 V0, V1, V2, V3, V4, V5;
1506 c0, c1, c2, c3, c4, c5;
1507 C0, C1, C2, C3, C4, C5
1508);
1509
1510impl_tuple_codec!(
1511 v0, v1, v2, v3, v4, v5, v6;
1512 V0, V1, V2, V3, V4, V5, V6;
1513 c0, c1, c2, c3, c4, c5, c6;
1514 C0, C1, C2, C3, C4, C5, C6
1515);
1516
1517impl_tuple_codec!(
1518 v0, v1, v2, v3, v4, v5, v6, v7;
1519 V0, V1, V2, V3, V4, V5, V6, V7;
1520 c0, c1, c2, c3, c4, c5, c6, c7;
1521 C0, C1, C2, C3, C4, C5, C6, C7
1522);
1523
1524impl_tuple_codec!(
1525 v0, v1, v2, v3, v4, v5, v6, v7, v8;
1526 V0, V1, V2, V3, V4, V5, V6, V7, V8;
1527 c0, c1, c2, c3, c4, c5, c6, c7, c8;
1528 C0, C1, C2, C3, C4, C5, C6, C7, C8
1529);
1530
1531impl_tuple_codec!(
1532 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9;
1533 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9;
1534 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9;
1535 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9
1536);
1537
1538impl_tuple_codec!(
1539 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;
1540 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10;
1541 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10;
1542 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
1543);
1544
1545impl_tuple_codec!(
1546 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11;
1547 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11;
1548 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11;
1549 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11
1550);
1551
1552impl_tuple_codec!(
1553 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12;
1554 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12;
1555 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12;
1556 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
1557);
1558
1559impl_tuple_codec!(
1560 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13;
1561 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13;
1562 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13;
1563 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13
1564);
1565
1566impl_tuple_codec!(
1567 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14;
1568 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14;
1569 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14;
1570 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14
1571);
1572
1573impl_tuple_codec!(
1574 v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15;
1575 V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15;
1576 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15;
1577 C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15
1578);
1579
1580#[derive(Default)]
1582pub struct FutureEncoder {
1583 deferred: Option<DeferredFn<Outgoing>>,
1584}
1585
1586impl Deferred<Outgoing> for FutureEncoder {
1587 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
1588 self.deferred.take()
1589 }
1590}
1591
1592impl<T, Fut> tokio_util::codec::Encoder<Fut> for FutureEncoder
1593where
1594 T: Encode,
1595 Fut: Future<Output = T> + Send + 'static,
1596 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1597{
1598 type Error = std::io::Error;
1599
1600 #[instrument(level = "trace", skip(self, item), fields(ty = "future"))]
1601 fn encode(&mut self, item: Fut, dst: &mut BytesMut) -> std::io::Result<()> {
1602 dst.reserve(1);
1604 dst.put_u8(0x00);
1605 let span = Span::current();
1606 self.deferred = Some(Box::new(|mut w, path| {
1607 Box::pin(
1608 async move {
1609 if !path.is_empty() {
1610 w = w.index(&path).map_err(std::io::Error::other)?;
1611 }
1612 let item = item.await;
1613 let mut enc = T::Encoder::default();
1614 let mut buf = BytesMut::default();
1615 enc.encode(item, &mut buf)?;
1616 w.write_all(&buf).await?;
1617 match enc.take_deferred() {
1618 Some(f) => f(w, Vec::default()).await,
1619 _ => Ok(()),
1620 }
1621 }
1622 .instrument(span),
1623 )
1624 }));
1625 Ok(())
1626 }
1627}
1628
1629impl<T> Encode for Pin<Box<dyn Future<Output = T> + Send>>
1630where
1631 T: Encode + 'static,
1632 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1633{
1634 type Encoder = FutureEncoder;
1635}
1636
1637pub struct FutureDecoder<T>
1639where
1640 T: Decode,
1641{
1642 dec: OptionDecoder<T::Decoder>,
1643 deferred: Option<DeferredFn<BufferedIncoming>>,
1644 _ty: PhantomData<T>,
1645}
1646
1647impl<T> Default for FutureDecoder<T>
1648where
1649 T: Decode,
1650{
1651 fn default() -> Self {
1652 Self {
1653 dec: OptionDecoder::default(),
1654 deferred: None,
1655 _ty: PhantomData,
1656 }
1657 }
1658}
1659
1660impl<T> Deferred<BufferedIncoming> for FutureDecoder<T>
1661where
1662 T: Decode,
1663{
1664 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
1665 self.deferred.take()
1666 }
1667}
1668
1669impl<T> tokio_util::codec::Decoder for FutureDecoder<T>
1670where
1671 T: Decode + Send + 'static,
1672 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
1673{
1674 type Item = Pin<Box<dyn Future<Output = T> + Send>>;
1675 type Error = <T::Decoder as tokio_util::codec::Decoder>::Error;
1676
1677 #[instrument(level = "trace", skip(self), fields(ty = "future"))]
1678 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
1679 let Some(item) = self.dec.decode(src)? else {
1680 return Ok(None);
1681 };
1682 if let Some(item) = item {
1683 self.deferred = self.dec.take_deferred();
1684 return Ok(Some(Box::pin(async { item })));
1685 }
1686
1687 let (tx, rx) = oneshot::channel();
1689 let dec = mem::take(&mut self.dec).into_inner();
1690 let span = Span::current();
1691 self.deferred = Some(Box::new(|mut r, path| {
1692 Box::pin(
1693 async move {
1694 if !path.is_empty() {
1695 r = r.index(&path).map_err(std::io::Error::other)?;
1696 }
1697 let mut dec = FramedRead::new(r, dec);
1698 trace!(?path, "receiving future element");
1699 let Some(item) = dec.next().await else {
1700 return Err(std::io::ErrorKind::UnexpectedEof.into());
1701 };
1702 let item = item?;
1703 if tx.send(item).is_err() {
1704 debug!("future receiver closed, discard data");
1705 return Ok(());
1706 }
1707 if let Some(rx) = dec.decoder_mut().take_deferred() {
1708 let buf = mem::take(dec.read_buffer_mut());
1709 let mut r = dec.into_inner();
1710 if r.buffer.is_empty() {
1711 r.buffer = buf;
1712 } else {
1713 r.buffer.unsplit(buf);
1714 }
1715 rx(r, Vec::default()).await?;
1716 }
1717 Ok(())
1718 }
1719 .instrument(span),
1720 )
1721 }));
1722 Ok(Some(Box::pin(async {
1723 let Ok(ret) = rx.await else {
1724 error!("future I/O dropped");
1725 return pending().await;
1726 };
1727 ret
1728 })))
1729 }
1730}
1731
1732impl<T> Decode for Pin<Box<dyn Future<Output = T> + Send>>
1733where
1734 T: Decode + Send + 'static,
1735 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
1736{
1737 type Decoder = FutureDecoder<T>;
1738 type ListDecoder = ListDecoder<Self::Decoder>;
1739}
1740
1741#[derive(Default)]
1743pub struct StreamEncoder {
1744 deferred: Option<DeferredFn<Outgoing>>,
1745}
1746
1747impl Deferred<Outgoing> for StreamEncoder {
1748 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
1749 self.deferred.take()
1750 }
1751}
1752
1753impl<T, S> tokio_util::codec::Encoder<S> for StreamEncoder
1754where
1755 T: Encode + Send + 'static,
1756 S: Stream<Item = Vec<T>> + Send + Unpin + 'static,
1757 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1758{
1759 type Error = std::io::Error;
1760
1761 #[instrument(level = "trace", skip(self, items), fields(ty = "stream"))]
1762 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
1763 dst.reserve(1);
1765 dst.put_u8(0x00);
1766 let span = Span::current();
1767 self.deferred = Some(Box::new(|mut w, path| {
1768 Box::pin(async move {
1769 if !path.is_empty() {
1770 w = w.index(&path).map_err(std::io::Error::other)?;
1771 }
1772 let mut enc = T::Encoder::default();
1773 let mut buf = BytesMut::default();
1774 let mut tasks = JoinSet::new();
1775 let mut i = 0_u64;
1776 loop {
1777 select! {
1778 chunk = items.next() => {
1779 let Some(chunk) = chunk else {
1780 trace!("writing stream end");
1781 buf.reserve(1);
1782 buf.put_u8(0x00);
1783 w.write_all(&buf).await?;
1784 while let Some(res) = tasks.join_next().await {
1785 trace!(?res, "receiver task finished");
1786 res??;
1787 }
1788 return Ok(())
1789 };
1790 let n = u32::try_from(chunk.len()).map_err(|err| {
1791 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
1792 })?;
1793 let end = i.checked_add(n.into()).ok_or_else(|| {
1794 std::io::Error::new(
1795 std::io::ErrorKind::InvalidInput,
1796 "stream element index would overflow u64",
1797 )
1798 })?;
1799 trace!(n, "encoding chunk length");
1800 Leb128Encoder.encode(n, &mut buf)?;
1801 trace!(i, buf = format!("{buf:02x?}"), "writing stream chunk items");
1802
1803 buf.reserve(chunk.len());
1804 for (i, item) in zip(i.., chunk) {
1805 enc.encode(item, &mut buf)?;
1806 if let Some(f) = enc.take_deferred() {
1807 let i = i
1808 .try_into()
1809 .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err))?;
1810 let w = w.index(&[i]).map_err(std::io::Error::other)?;
1811 trace!("spawning transmit task");
1812 tasks.spawn(f(w, Vec::default()));
1813 }
1814 }
1815 i = end;
1816 }
1817 Some(res) = tasks.join_next() => {
1818 trace!(?res, "receiver task finished");
1819 res??;
1820 }
1821 res = w.write(&buf), if !buf.is_empty() => {
1822 let n = res?;
1823 trace!(?buf, n, "wrote bytes from buffer");
1824 buf.advance(n);
1825 }
1826 }
1827 }
1828 }.instrument(span))
1829 }));
1830 Ok(())
1831 }
1832}
1833
1834impl<T> Encode for Pin<Box<dyn Stream<Item = Vec<T>> + Send>>
1835where
1836 T: Encode + Send + 'static,
1837 std::io::Error: From<<T::Encoder as tokio_util::codec::Encoder<T>>::Error>,
1838{
1839 type Encoder = StreamEncoder;
1840}
1841
1842#[derive(Default)]
1844pub struct StreamEncoderBytes {
1845 deferred: Option<DeferredFn<Outgoing>>,
1846}
1847
1848impl Deferred<Outgoing> for StreamEncoderBytes {
1849 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
1850 self.deferred.take()
1851 }
1852}
1853
1854impl<S> tokio_util::codec::Encoder<S> for StreamEncoderBytes
1855where
1856 S: Stream<Item = Bytes> + Send + Unpin + 'static,
1857{
1858 type Error = std::io::Error;
1859
1860 #[instrument(level = "trace", skip(self, items), fields(ty = "stream<u8>"))]
1861 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
1862 dst.reserve(1);
1864 dst.put_u8(0x00);
1865 self.deferred = Some(Box::new(|mut w, path| {
1866 Box::pin(async move {
1867 if !path.is_empty() {
1868 w = w.index(&path).map_err(std::io::Error::other)?;
1869 }
1870 let mut buf = BytesMut::default();
1871 loop {
1872 select! {
1873 chunk = items.next() => {
1874 let Some(chunk) = chunk else {
1875 trace!("writing stream end");
1876 buf.reserve(1);
1877 buf.put_u8(0x00);
1878 return w.write_all(&buf).await
1879 };
1880 let n = u32::try_from(chunk.len()).map_err(|err| {
1881 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
1882 })?;
1883 trace!(n, "encoding chunk length");
1884 Leb128Encoder.encode(n, &mut buf)?;
1885 buf.extend_from_slice(&chunk);
1886 }
1887 res = w.write(&buf), if !buf.is_empty() => {
1888 let n = res?;
1889 buf.advance(n);
1890 }
1891 }
1892 }
1893 })
1894 }));
1895 Ok(())
1896 }
1897}
1898
1899impl Encode for Pin<Box<dyn Stream<Item = Bytes> + Send>> {
1900 type Encoder = StreamEncoderBytes;
1901}
1902
1903#[derive(Default)]
1905pub struct StreamEncoderRead {
1906 deferred: Option<DeferredFn<Outgoing>>,
1907}
1908
1909impl Deferred<Outgoing> for StreamEncoderRead {
1910 fn take_deferred(&mut self) -> Option<DeferredFn<Outgoing>> {
1911 self.deferred.take()
1912 }
1913}
1914
1915impl<S> tokio_util::codec::Encoder<S> for StreamEncoderRead
1916where
1917 S: AsyncRead + Send + Unpin + 'static,
1918{
1919 type Error = std::io::Error;
1920
1921 #[instrument(level = "trace", skip(self, items), fields(ty = "stream<u8>"))]
1922 fn encode(&mut self, mut items: S, dst: &mut BytesMut) -> std::io::Result<()> {
1923 dst.reserve(1);
1925 dst.put_u8(0x00);
1926 self.deferred = Some(Box::new(|mut w, path| {
1927 Box::pin(async move {
1928 if !path.is_empty() {
1929 w = w.index(&path).map_err(std::io::Error::other)?;
1930 }
1931 let mut buf = BytesMut::default();
1932 let mut chunk = BytesMut::default();
1933 loop {
1934 select! {
1935 res = items.read_buf(&mut chunk) => {
1936 let n = res?;
1937 if n == 0 {
1938 trace!("writing stream end");
1939 buf.reserve(1);
1940 buf.put_u8(0x00);
1941 return w.write_all(&buf).await
1942 }
1943 let n = u32::try_from(n).map_err(|err| {
1944 std::io::Error::new(std::io::ErrorKind::InvalidInput, err)
1945 })?;
1946 trace!(n, "encoding chunk length");
1947 Leb128Encoder.encode(n, &mut buf)?;
1948 buf.extend_from_slice(&chunk);
1949 chunk.clear();
1950 }
1951 res = w.write(&buf), if !buf.is_empty() => {
1952 let n = res?;
1953 buf.advance(n);
1954 }
1955 }
1956 }
1957 })
1958 }));
1959 Ok(())
1960 }
1961}
1962
1963impl Encode for Pin<Box<dyn AsyncRead + Send>> {
1964 type Encoder = StreamEncoderRead;
1965}
1966
1967impl<T> Encode for std::io::Cursor<T>
1968where
1969 T: AsRef<[u8]> + Send + Unpin + 'static,
1970{
1971 type Encoder = StreamEncoderRead;
1972}
1973
1974impl Encode for tokio::io::Empty {
1975 type Encoder = StreamEncoderRead;
1976}
1977
1978#[cfg(feature = "io-std")]
1979impl Encode for tokio::io::Stdin {
1980 type Encoder = StreamEncoderRead;
1981}
1982
1983#[cfg(feature = "fs")]
1984impl Encode for tokio::fs::File {
1985 type Encoder = StreamEncoderRead;
1986}
1987
1988#[cfg(feature = "net")]
1989impl Encode for tokio::net::TcpStream {
1990 type Encoder = StreamEncoderRead;
1991}
1992
1993#[cfg(all(unix, feature = "net"))]
1994impl Encode for tokio::net::UnixStream {
1995 type Encoder = StreamEncoderRead;
1996}
1997
1998#[cfg(all(unix, feature = "net"))]
1999impl Encode for tokio::net::unix::pipe::Receiver {
2000 type Encoder = StreamEncoderRead;
2001}
2002
2003pub struct StreamDecoder<T>
2005where
2006 T: Decode,
2007{
2008 dec: T::ListDecoder,
2009 deferred: Option<DeferredFn<BufferedIncoming>>,
2010 _ty: PhantomData<T>,
2011}
2012
2013impl<T> Default for StreamDecoder<T>
2014where
2015 T: Decode,
2016{
2017 fn default() -> Self {
2018 Self {
2019 dec: T::ListDecoder::default(),
2020 deferred: None,
2021 _ty: PhantomData,
2022 }
2023 }
2024}
2025
2026impl<T> Deferred<BufferedIncoming> for StreamDecoder<T>
2027where
2028 T: Decode,
2029{
2030 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2031 self.deferred.take()
2032 }
2033}
2034
2035#[instrument(level = "trace", skip(dec, r, tx), ret)]
2036async fn handle_deferred_stream<C, T>(
2037 dec: C,
2038 mut r: BufferedIncoming,
2039 path: Vec<usize>,
2040 tx: mpsc::Sender<Vec<T>>,
2041) -> std::io::Result<()>
2042where
2043 C: tokio_util::codec::Decoder<Item = T> + Deferred<BufferedIncoming>,
2044 std::io::Error: From<C::Error>,
2045{
2046 let dec = ListDecoder::new(dec);
2047 if !path.is_empty() {
2048 r = r.index(&path).map_err(std::io::Error::other)?;
2049 }
2050 let mut framed = FramedRead::new(r, dec);
2051 let mut tasks = JoinSet::new();
2052 let mut i = 0_usize;
2053 loop {
2054 trace!("receiving pending stream chunk");
2055 select! {
2056 Some(chunk) = framed.next() => {
2057 let chunk = chunk?;
2058 if chunk.is_empty() {
2059 trace!("received stream end");
2060 while let Some(res) = tasks.join_next().await {
2061 res??;
2062 }
2063 return Ok(())
2064 }
2065 let end = i.checked_add(chunk.len()).ok_or_else(|| {
2066 std::io::Error::new(
2067 std::io::ErrorKind::InvalidInput,
2068 "stream element index would overflow usize",
2069 )
2070 })?;
2071 trace!(i, end, "received stream chunk");
2072 if tx.send(chunk).await.is_err() {
2073 debug!("stream receiver closed, discard data");
2074 return Ok(())
2075 }
2076 for (i, deferred) in zip(i.., mem::take(&mut framed.decoder_mut().deferred)) {
2077 if let Some(deferred) = deferred {
2078 let r = framed.get_ref().index(&[i]).map_err(std::io::Error::other)?;
2079 trace!("spawning receive task");
2080 tasks.spawn(deferred(r, Vec::default()));
2081 }
2082 }
2083 i = end;
2084 },
2085 Some(res) = tasks.join_next() => {
2086 trace!(?res, "receiver task finished");
2087 res??;
2088 }
2089 else => {
2090 return Ok(());
2091 }
2092 }
2093 }
2094}
2095
2096impl<T> tokio_util::codec::Decoder for StreamDecoder<T>
2097where
2098 T: Decode + Send + 'static,
2099 T::ListDecoder: Deferred<BufferedIncoming>,
2100 <T::Decoder as tokio_util::codec::Decoder>::Error: Send,
2101 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
2102{
2103 type Item = Pin<Box<dyn Stream<Item = Vec<T>> + Send>>;
2104 type Error = <<T as Decode>::ListDecoder as tokio_util::codec::Decoder>::Error;
2105
2106 #[instrument(level = "trace", skip(self), fields(ty = "stream"))]
2107 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2108 let Some(chunk) = self.dec.decode(src)? else {
2109 return Ok(None);
2110 };
2111 if !chunk.is_empty() {
2112 self.deferred = self.dec.take_deferred();
2113 return Ok(Some(Box::pin(stream::iter([chunk]))));
2114 }
2115
2116 let (tx, rx) = mpsc::channel(128);
2118 self.deferred = Some(Box::new(|r, path| {
2119 Box::pin(
2120 async move { handle_deferred_stream(T::Decoder::default(), r, path, tx).await },
2121 )
2122 }));
2123 Ok(Some(Box::pin(ReceiverStream::new(rx))))
2124 }
2125}
2126
2127impl<T> Decode for Pin<Box<dyn Stream<Item = Vec<T>> + Send>>
2128where
2129 T: Decode + Send + 'static,
2130 T::ListDecoder: Deferred<BufferedIncoming> + Send,
2131 <T::Decoder as tokio_util::codec::Decoder>::Error: Send,
2132 std::io::Error: From<<T::Decoder as tokio_util::codec::Decoder>::Error>,
2133{
2134 type Decoder = StreamDecoder<T>;
2135 type ListDecoder = ListDecoder<Self::Decoder>;
2136}
2137
2138#[derive(Default)]
2140pub struct StreamDecoderBytes {
2141 dec: CoreVecDecoderBytes,
2142 deferred: Option<DeferredFn<BufferedIncoming>>,
2143}
2144
2145impl Deferred<BufferedIncoming> for StreamDecoderBytes {
2146 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2147 self.deferred.take()
2148 }
2149}
2150
2151impl tokio_util::codec::Decoder for StreamDecoderBytes {
2152 type Item = Pin<Box<dyn Stream<Item = Bytes> + Send>>;
2153 type Error = std::io::Error;
2154
2155 #[instrument(level = "trace", skip(self), fields(ty = "stream<u8>"))]
2156 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2157 let Some(chunk) = self.dec.decode(src)? else {
2158 return Ok(None);
2159 };
2160 if !chunk.is_empty() {
2161 return Ok(Some(Box::pin(stream::iter([chunk]))));
2162 }
2163
2164 let (tx, rx) = mpsc::channel(128);
2166 let dec = mem::take(&mut self.dec);
2167 let span = Span::current();
2168 self.deferred = Some(Box::new(|mut r, path| {
2169 Box::pin(
2170 async move {
2171 if !path.is_empty() {
2172 r = r.index(&path).map_err(std::io::Error::other)?;
2173 }
2174 let mut framed = FramedRead::new(r, dec);
2175 trace!(?path, "receiving pending byte stream chunk");
2176 while let Some(chunk) = framed.next().await {
2177 let chunk = chunk?;
2178 if chunk.is_empty() {
2179 trace!("received stream end");
2180 return Ok(());
2181 }
2182 trace!(?chunk, "received pending byte stream chunk");
2183 if tx.send(chunk).await.is_err() {
2184 debug!("stream receiver closed, discard data");
2185 return Ok(());
2186 }
2187 }
2188 Ok(())
2189 }
2190 .instrument(span),
2191 )
2192 }));
2193 Ok(Some(Box::pin(ReceiverStream::new(rx))))
2194 }
2195}
2196
2197impl Decode for Pin<Box<dyn Stream<Item = Bytes> + Send>> {
2198 type Decoder = StreamDecoderBytes;
2199 type ListDecoder = ListDecoder<Self::Decoder>;
2200}
2201
2202#[derive(Default)]
2204pub struct StreamDecoderRead {
2205 dec: CoreVecDecoderBytes,
2206 deferred: Option<DeferredFn<BufferedIncoming>>,
2207}
2208
2209impl Deferred<BufferedIncoming> for StreamDecoderRead {
2210 fn take_deferred(&mut self) -> Option<DeferredFn<BufferedIncoming>> {
2211 self.deferred.take()
2212 }
2213}
2214
2215impl tokio_util::codec::Decoder for StreamDecoderRead {
2216 type Item = Pin<Box<dyn AsyncRead + Send>>;
2217 type Error = std::io::Error;
2218
2219 #[instrument(level = "trace", skip(self), fields(ty = "stream<u8>"))]
2220 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
2221 let Some(chunk) = self.dec.decode(src)? else {
2222 return Ok(None);
2223 };
2224 if !chunk.is_empty() {
2225 return Ok(Some(Box::pin(std::io::Cursor::new(chunk))));
2226 }
2227
2228 let (tx, rx) = mpsc::channel(128);
2230 let dec = mem::take(&mut self.dec);
2231 self.deferred = Some(Box::new(|mut r, path| {
2232 Box::pin(async move {
2233 if !path.is_empty() {
2234 r = r.index(&path).map_err(std::io::Error::other)?;
2235 }
2236 let mut framed = FramedRead::new(r, dec);
2237 trace!("receiving pending byte stream chunk");
2238 while let Some(chunk) = framed.next().await {
2239 let chunk = chunk?;
2240 if chunk.is_empty() {
2241 trace!("received stream end");
2242 return Ok(());
2243 }
2244 trace!(?chunk, "received byte stream chunk");
2245 if tx.send(std::io::Result::Ok(chunk)).await.is_err() {
2246 debug!("stream receiver closed, discard data");
2247 return Ok(());
2248 }
2249 }
2250 Ok(())
2251 })
2252 }));
2253 Ok(Some(Box::pin(StreamReader::new(ReceiverStream::new(rx)))))
2254 }
2255}
2256
2257impl Decode for Pin<Box<dyn AsyncRead + Send>> {
2258 type Decoder = StreamDecoderRead;
2259 type ListDecoder = ListDecoder<Self::Decoder>;
2260}
2261
2262#[cfg(test)]
2263mod tests {
2264 use anyhow::bail;
2265
2266 use super::*;
2267
2268 #[test_log::test(tokio::test)]
2269 async fn codec() -> anyhow::Result<()> {
2270 let mut buf = BytesMut::new();
2271 let mut enc = <(u8, u32) as Encode>::Encoder::default();
2272 enc.encode((0x42, 0x42), &mut buf)?;
2273 if let Some(_f) = Deferred::<Outgoing>::take_deferred(&mut enc) {
2274 bail!("no deferred write should have been returned");
2275 }
2276 assert_eq!(buf.as_ref(), b"\x42\x42");
2277 Ok(())
2278 }
2279
2280 #[test]
2281 fn canonical_nan_f32() {
2282 let mut enc = <f32 as Encode>::Encoder::default();
2283
2284 let mut buf = BytesMut::new();
2286 enc.encode(f32::from_bits(0x7f80_0001), &mut buf).unwrap();
2287 assert_eq!(buf.as_ref(), CANONICAL_NAN_F32.to_le_bytes());
2288
2289 let mut buf = BytesMut::new();
2291 enc.encode(f32::from_bits(0xffc0_0000), &mut buf).unwrap();
2292 assert_eq!(buf.as_ref(), CANONICAL_NAN_F32.to_le_bytes());
2293
2294 let mut buf = BytesMut::new();
2296 enc.encode(1.5_f32, &mut buf).unwrap();
2297 assert_eq!(buf.as_ref(), 1.5_f32.to_bits().to_le_bytes());
2298 }
2299
2300 #[test]
2301 fn canonical_nan_f64() {
2302 let mut enc = <f64 as Encode>::Encoder::default();
2303
2304 let mut buf = BytesMut::new();
2305 enc.encode(f64::from_bits(0x7ff0_0000_0000_0001), &mut buf)
2306 .unwrap();
2307 assert_eq!(buf.as_ref(), CANONICAL_NAN_F64.to_le_bytes());
2308
2309 let mut buf = BytesMut::new();
2310 enc.encode(f64::from_bits(0xfff8_0000_0000_0000), &mut buf)
2311 .unwrap();
2312 assert_eq!(buf.as_ref(), CANONICAL_NAN_F64.to_le_bytes());
2313
2314 let mut buf = BytesMut::new();
2315 enc.encode(1.5_f64, &mut buf).unwrap();
2316 assert_eq!(buf.as_ref(), 1.5_f64.to_bits().to_le_bytes());
2317 }
2318}