@@ -31,10 +31,14 @@ struct Responder {
3131 inner : Arc < RwLock < Box < dyn RSocket > > > ,
3232}
3333
34+ type Single = oneshot:: Sender < RSocketResult < Payload > > ;
35+ type Multi = mpsc:: UnboundedSender < RSocketResult < Payload > > ;
36+
3437#[ derive( Debug ) ]
3538enum Handler {
36- Request ( oneshot:: Sender < RSocketResult < Payload > > ) ,
37- Stream ( mpsc:: UnboundedSender < RSocketResult < Payload > > ) ,
39+ Request ( Single ) ,
40+ Stream ( Multi ) ,
41+ Channel ( Multi ) ,
3842}
3943
4044#[ derive( Debug ) ]
@@ -164,6 +168,18 @@ impl DuplexSocket {
164168 senders. insert ( sid, Handler :: Stream ( sender) ) ;
165169 }
166170 }
171+ Handler :: Channel ( sender) => {
172+ // TODO: support channel
173+ if flag & frame:: FLAG_NEXT != 0 {
174+ sender. clone ( ) . send ( Ok ( input) ) . unwrap ( ) ;
175+ }
176+ if flag & frame:: FLAG_COMPLETE != 0 {
177+ // steam end
178+ drop ( sender) ;
179+ } else {
180+ senders. insert ( sid, Handler :: Stream ( sender) ) ;
181+ }
182+ }
167183 } ;
168184 }
169185
@@ -257,6 +273,16 @@ impl DuplexSocket {
257273 }
258274 tx. send ( sending. build ( ) ) . unwrap ( ) ;
259275 }
276+
277+ fn request_channel22 ( & self , mut reqs : Flux < Payload > ) -> Flux < Payload > {
278+ let sid = self . seq . next ( ) ;
279+ let tx = self . tx . clone ( ) ;
280+ // register handler
281+ let ( sender, receiver) = mpsc:: unbounded_channel :: < RSocketResult < Payload > > ( ) ;
282+ self . register_handler ( sid, Handler :: Stream ( sender) ) ;
283+ tokio:: spawn ( async move { while let Some ( req) = reqs. next ( ) . await { } } ) ;
284+ Box :: pin ( receiver)
285+ }
260286}
261287
262288impl RSocket for DuplexSocket {
@@ -272,9 +298,7 @@ impl RSocket for DuplexSocket {
272298 let sending = bu. build ( ) ;
273299 match tx. send ( sending) {
274300 Ok ( ( ) ) => Ok ( ( ) ) ,
275- Err ( _e) => Err ( RSocketError :: from ( ErrorKind :: WithDescription (
276- "send metadata_push failed" ,
277- ) ) ) ,
301+ Err ( _e) => Err ( RSocketError :: from ( "send metadata_push failed" ) ) ,
278302 }
279303 } )
280304 }
@@ -294,9 +318,7 @@ impl RSocket for DuplexSocket {
294318 let sending = bu. build ( ) ;
295319 match tx. send ( sending) {
296320 Ok ( ( ) ) => Ok ( ( ) ) ,
297- Err ( _e) => Err ( RSocketError :: from ( ErrorKind :: WithDescription (
298- "send fire_and_forget failed" ,
299- ) ) ) ,
321+ Err ( _e) => Err ( RSocketError :: from ( "send fire_and_forget failed" ) ) ,
300322 }
301323 } )
302324 }
@@ -324,9 +346,7 @@ impl RSocket for DuplexSocket {
324346 Box :: pin ( async move {
325347 match rx. await {
326348 Ok ( v) => v,
327- Err ( _e) => Err ( RSocketError :: from ( ErrorKind :: WithDescription (
328- "request_response failed" ,
329- ) ) ) ,
349+ Err ( _e) => Err ( RSocketError :: from ( "request_response failed" ) ) ,
330350 }
331351 } )
332352 }
@@ -352,6 +372,45 @@ impl RSocket for DuplexSocket {
352372 } ) ;
353373 Box :: pin ( receiver)
354374 }
375+
376+ fn request_channel ( & self , mut reqs : Flux < Payload > ) -> Flux < Payload > {
377+ let sid = self . seq . next ( ) ;
378+ let tx = self . tx . clone ( ) ;
379+ // register handler
380+ let ( sender, receiver) = mpsc:: unbounded_channel :: < RSocketResult < Payload > > ( ) ;
381+ self . register_handler ( sid, Handler :: Channel ( sender) ) ;
382+ tokio:: spawn ( async move {
383+ let mut sent: u64 = 0 ;
384+ while let Some ( it) = reqs. next ( ) . await {
385+ // TODO: check Err
386+ let ( d, m) = it. unwrap ( ) . split ( ) ;
387+ sent += 1 ;
388+ let sending = if sent == 1 {
389+ let mut bu = frame:: RequestChannel :: builder ( sid, frame:: FLAG_NEXT ) ;
390+ if let Some ( b) = d {
391+ bu = bu. set_data ( b) ;
392+ }
393+ if let Some ( b) = m {
394+ bu = bu. set_metadata ( b) ;
395+ }
396+ bu. build ( )
397+ } else {
398+ let mut bu = frame:: Payload :: builder ( sid, frame:: FLAG_NEXT ) ;
399+ if let Some ( b) = d {
400+ bu = bu. set_data ( b) ;
401+ }
402+ if let Some ( b) = m {
403+ bu = bu. set_metadata ( b) ;
404+ }
405+ bu. build ( )
406+ } ;
407+ tx. send ( sending) . unwrap ( ) ;
408+ }
409+ let sending = frame:: Payload :: builder ( sid, frame:: FLAG_COMPLETE ) . build ( ) ;
410+ tx. send ( sending) . unwrap ( ) ;
411+ } ) ;
412+ Box :: pin ( receiver)
413+ }
355414}
356415
357416impl Handlers {
@@ -405,4 +464,8 @@ impl RSocket for Responder {
405464 let inner = self . inner . read ( ) . unwrap ( ) ;
406465 ( * inner) . request_stream ( req)
407466 }
467+ fn request_channel ( & self , reqs : Flux < Payload > ) -> Flux < Payload > {
468+ let inner = self . inner . read ( ) . unwrap ( ) ;
469+ ( * inner) . request_channel ( reqs)
470+ }
408471}
0 commit comments