1- use super :: misc:: StreamID ;
1+ use super :: misc:: { self , Counter , StreamID } ;
22use super :: spi:: { Rx , Transport , Tx } ;
33use crate :: errors:: { ErrorKind , RSocketError } ;
44use crate :: frame:: { self , Body , Frame } ;
@@ -12,6 +12,7 @@ use std::env;
1212use std:: error:: Error ;
1313use std:: future:: Future ;
1414use std:: pin:: Pin ;
15+ use std:: ptr;
1516use std:: sync:: { Arc , Mutex , RwLock } ;
1617use tokio:: net:: TcpListener ;
1718use tokio:: prelude:: * ;
@@ -33,12 +34,13 @@ struct Responder {
3334
3435type Single = oneshot:: Sender < RSocketResult < Payload > > ;
3536type Multi = mpsc:: UnboundedSender < RSocketResult < Payload > > ;
37+ type MultiReceiver = mpsc:: UnboundedReceiver < RSocketResult < Payload > > ;
3638
3739#[ derive( Debug ) ]
3840enum Handler {
3941 Request ( Single ) ,
4042 Stream ( Multi ) ,
41- Channel ( Multi ) ,
43+ Channel ( ( Multi , Counter ) ) ,
4244}
4345
4446#[ derive( Debug ) ]
@@ -95,7 +97,7 @@ impl DuplexSocket {
9597 while let Some ( msg) = rx. recv ( ) . await {
9698 let sid = msg. get_stream_id ( ) ;
9799 let flag = msg. get_flag ( ) ;
98- debug ! ( "<--- RCV: {:?}" , msg) ;
100+ misc :: debug_frame ( false , & msg) ;
99101 match msg. get_body ( ) {
100102 Body :: Setup ( v) => self . on_setup ( & acceptor, sid, flag, SetupPayload :: from ( v) ) ,
101103 Body :: Resume ( v) => {
@@ -122,6 +124,8 @@ impl DuplexSocket {
122124 }
123125 Body :: RequestChannel ( v) => {
124126 // TODO: support channel
127+ let input = Payload :: from ( v) ;
128+ self . on_request_channel ( sid, flag, input) . await ;
125129 }
126130 Body :: Payload ( v) => {
127131 let input = Payload :: from ( v) ;
@@ -159,25 +163,19 @@ impl DuplexSocket {
159163 Handler :: Request ( sender) => sender. send ( Ok ( input) ) . unwrap ( ) ,
160164 Handler :: Stream ( sender) => {
161165 if flag & frame:: FLAG_NEXT != 0 {
162- sender. clone ( ) . send ( Ok ( input) ) . unwrap ( ) ;
166+ sender. send ( Ok ( input) ) . unwrap ( ) ;
163167 }
164- if flag & frame:: FLAG_COMPLETE != 0 {
165- // steam end
166- drop ( sender) ;
167- } else {
168+ if flag & frame:: FLAG_COMPLETE == 0 {
168169 senders. insert ( sid, Handler :: Stream ( sender) ) ;
169170 }
170171 }
171- Handler :: Channel ( sender) => {
172+ Handler :: Channel ( ( sender, cdl ) ) => {
172173 // TODO: support channel
173174 if flag & frame:: FLAG_NEXT != 0 {
174- sender. clone ( ) . send ( Ok ( input) ) . unwrap ( ) ;
175+ sender. send ( Ok ( input) ) . unwrap ( ) ;
175176 }
176- if flag & frame:: FLAG_COMPLETE != 0 {
177- // steam end
178- drop ( sender) ;
179- } else {
180- senders. insert ( sid, Handler :: Stream ( sender) ) ;
177+ if flag & frame:: FLAG_COMPLETE == 0 {
178+ senders. insert ( sid, Handler :: Channel ( ( sender, cdl) ) ) ;
181179 }
182180 }
183181 } ;
@@ -256,6 +254,39 @@ impl DuplexSocket {
256254 } ) ;
257255 }
258256
257+ #[ inline]
258+ async fn on_request_channel ( & self , sid : u32 , flag : u16 , first : Payload ) {
259+ let responder = self . responder . clone ( ) ;
260+ let tx = self . tx . clone ( ) ;
261+ let ( sender, receiver) = mpsc:: unbounded_channel :: < RSocketResult < Payload > > ( ) ;
262+ sender. send ( Ok ( first) ) . unwrap ( ) ;
263+ let cdl = Counter :: new ( 2 ) ;
264+ self . register_handler ( sid, Handler :: Channel ( ( sender, cdl. clone ( ) ) ) ) ;
265+ tokio:: spawn ( async move {
266+ // respond client channel
267+ let inputs: Flux < Payload > = Box :: pin ( receiver) ;
268+ let mut outputs = responder. request_channel ( inputs) ;
269+ // TODO: support custom RequestN.
270+ let request_n = frame:: RequestN :: builder ( sid, 0 ) . build ( ) ;
271+ tx. send ( request_n) . unwrap ( ) ;
272+
273+ while let Some ( v) = outputs. next ( ) . await {
274+ let ( d, m) = v. unwrap ( ) . split ( ) ;
275+ let mut bu = frame:: Payload :: builder ( sid, frame:: FLAG_NEXT ) ;
276+ if let Some ( b) = d {
277+ bu = bu. set_data ( b) ;
278+ }
279+ if let Some ( b) = m {
280+ bu = bu. set_metadata ( b) ;
281+ }
282+ let sending = bu. build ( ) ;
283+ tx. send ( sending) . unwrap ( ) ;
284+ }
285+ let complete = frame:: Payload :: builder ( sid, frame:: FLAG_COMPLETE ) . build ( ) ;
286+ tx. send ( complete) . unwrap ( ) ;
287+ } ) ;
288+ }
289+
259290 #[ inline]
260291 async fn on_metadata_push ( & self , input : Payload ) {
261292 if let Err ( e) = self . responder . clone ( ) . metadata_push ( input) . await {
@@ -378,7 +409,8 @@ impl RSocket for DuplexSocket {
378409 let tx = self . tx . clone ( ) ;
379410 // register handler
380411 let ( sender, receiver) = mpsc:: unbounded_channel :: < RSocketResult < Payload > > ( ) ;
381- self . register_handler ( sid, Handler :: Channel ( sender) ) ;
412+ let cdl = Counter :: new ( 2 ) ;
413+ self . register_handler ( sid, Handler :: Channel ( ( sender, cdl. clone ( ) ) ) ) ;
382414 tokio:: spawn ( async move {
383415 let mut sent: u64 = 0 ;
384416 while let Some ( it) = reqs. next ( ) . await {
@@ -406,6 +438,7 @@ impl RSocket for DuplexSocket {
406438 } ;
407439 tx. send ( sending) . unwrap ( ) ;
408440 }
441+ cdl. count_down ( ) ;
409442 let sending = frame:: Payload :: builder ( sid, frame:: FLAG_COMPLETE ) . build ( ) ;
410443 tx. send ( sending) . unwrap ( ) ;
411444 } ) ;
0 commit comments