1
+ use std:: marker:: PhantomData ;
1
2
use std:: task:: { Context , Poll } ;
2
3
3
4
use bytes:: { Buf , Bytes } ;
@@ -12,26 +13,21 @@ use crate::{
12
13
frame:: { self , Frame , PayloadLen } ,
13
14
stream:: StreamId ,
14
15
} ,
15
- quic:: { RecvStream , SendStream } ,
16
+ quic:: { BidiStream , RecvStream , SendStream } ,
16
17
stream:: WriteBuf ,
17
18
} ;
18
19
19
- pub struct FrameStream < S >
20
- where
21
- S : RecvStream ,
22
- {
20
+ pub struct FrameStream < S , B > {
23
21
stream : S ,
24
22
bufs : BufList < Bytes > ,
25
23
decoder : FrameDecoder ,
26
24
remaining_data : usize ,
27
25
/// Set to true when `stream` reaches the end.
28
26
is_eos : bool ,
27
+ _phantom_buffer : PhantomData < B > ,
29
28
}
30
29
31
- impl < S > FrameStream < S >
32
- where
33
- S : RecvStream ,
34
- {
30
+ impl < S , B > FrameStream < S , B > {
35
31
pub fn new ( stream : S ) -> Self {
36
32
Self :: with_bufs ( stream, BufList :: new ( ) )
37
33
}
43
39
decoder : FrameDecoder :: default ( ) ,
44
40
remaining_data : 0 ,
45
41
is_eos : false ,
42
+ _phantom_buffer : PhantomData ,
46
43
}
47
44
}
45
+ }
48
46
47
+ impl < S , B > FrameStream < S , B >
48
+ where
49
+ S : RecvStream ,
50
+ {
49
51
pub fn poll_next (
50
52
& mut self ,
51
53
cx : & mut Context < ' _ > ,
@@ -136,9 +138,9 @@ where
136
138
}
137
139
}
138
140
139
- impl < T , B > SendStream < B > for FrameStream < T >
141
+ impl < T , B > SendStream < B > for FrameStream < T , B >
140
142
where
141
- T : SendStream < B > + RecvStream ,
143
+ T : SendStream < B > ,
142
144
B : Buf ,
143
145
{
144
146
type Error = <T as SendStream < B > >:: Error ;
@@ -164,6 +166,34 @@ where
164
166
}
165
167
}
166
168
169
+ impl < S , B > FrameStream < S , B >
170
+ where
171
+ S : BidiStream < B > ,
172
+ B : Buf ,
173
+ {
174
+ pub ( crate ) fn split ( self ) -> ( FrameStream < S :: SendStream , B > , FrameStream < S :: RecvStream , B > ) {
175
+ let ( send, recv) = self . stream . split ( ) ;
176
+ (
177
+ FrameStream {
178
+ stream : send,
179
+ bufs : BufList :: new ( ) ,
180
+ decoder : FrameDecoder :: default ( ) ,
181
+ remaining_data : 0 ,
182
+ is_eos : false ,
183
+ _phantom_buffer : PhantomData ,
184
+ } ,
185
+ FrameStream {
186
+ stream : recv,
187
+ bufs : self . bufs ,
188
+ decoder : self . decoder ,
189
+ remaining_data : self . remaining_data ,
190
+ is_eos : self . is_eos ,
191
+ _phantom_buffer : PhantomData ,
192
+ } ,
193
+ )
194
+ }
195
+ }
196
+
167
197
#[ derive( Default ) ]
168
198
pub struct FrameDecoder {
169
199
expected : Option < usize > ,
@@ -338,7 +368,7 @@ mod tests {
338
368
Frame :: headers ( & b"trailer" [ ..] ) . encode_with_payload ( & mut buf) ;
339
369
recv. chunk ( buf. freeze ( ) ) ;
340
370
341
- let mut stream = FrameStream :: new ( recv) ;
371
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
342
372
343
373
assert_poll_matches ! (
344
374
|mut cx| stream. poll_next( & mut cx) ,
@@ -366,7 +396,7 @@ mod tests {
366
396
Frame :: headers ( & b"header" [ ..] ) . encode_with_payload ( & mut buf) ;
367
397
let mut buf = buf. freeze ( ) ;
368
398
recv. chunk ( buf. split_to ( buf. len ( ) - 1 ) ) ;
369
- let mut stream = FrameStream :: new ( recv) ;
399
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
370
400
371
401
assert_poll_matches ! (
372
402
|mut cx| stream. poll_next( & mut cx) ,
@@ -385,7 +415,7 @@ mod tests {
385
415
FrameType :: DATA . encode ( & mut buf) ;
386
416
VarInt :: from ( 4u32 ) . encode ( & mut buf) ;
387
417
recv. chunk ( buf. freeze ( ) ) ;
388
- let mut stream = FrameStream :: new ( recv) ;
418
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
389
419
390
420
assert_poll_matches ! (
391
421
|mut cx| stream. poll_next( & mut cx) ,
@@ -407,7 +437,7 @@ mod tests {
407
437
let mut buf = buf. freeze ( ) ;
408
438
recv. chunk ( buf. split_to ( buf. len ( ) - 2 ) ) ;
409
439
recv. chunk ( buf) ;
410
- let mut stream = FrameStream :: new ( recv) ;
440
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
411
441
412
442
// We get the total size of data about to be received
413
443
assert_poll_matches ! (
@@ -436,7 +466,7 @@ mod tests {
436
466
VarInt :: from ( 4u32 ) . encode ( & mut buf) ;
437
467
buf. put_slice ( & b"b" [ ..] ) ;
438
468
recv. chunk ( buf. freeze ( ) ) ;
439
- let mut stream = FrameStream :: new ( recv) ;
469
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
440
470
441
471
assert_poll_matches ! (
442
472
|mut cx| stream. poll_next( & mut cx) ,
@@ -468,7 +498,7 @@ mod tests {
468
498
Frame :: Data ( Bytes :: from ( "body" ) ) . encode_with_payload ( & mut buf) ;
469
499
470
500
recv. chunk ( buf. freeze ( ) ) ;
471
- let mut stream = FrameStream :: new ( recv) ;
501
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
472
502
473
503
assert_poll_matches ! (
474
504
|mut cx| stream. poll_next( & mut cx) ,
@@ -490,7 +520,7 @@ mod tests {
490
520
buf. put_slice ( & b"bo" [ ..] ) ;
491
521
recv. chunk ( buf. clone ( ) . freeze ( ) ) ;
492
522
493
- let mut stream = FrameStream :: new ( recv) ;
523
+ let mut stream: FrameStream < _ , ( ) > = FrameStream :: new ( recv) ;
494
524
495
525
assert_poll_matches ! (
496
526
|mut cx| stream. poll_next( & mut cx) ,
0 commit comments