@@ -335,6 +335,27 @@ impl<S> WebSocketStream<S> {
335335 let receiver = WebSocketReceiver { shared } ;
336336 ( sender, receiver)
337337 }
338+
339+ /// Attempts to reunite the [sender](WebSocketSender) and [receiver](WebSocketReceiver)
340+ /// parts back into a single stream. If both parts originate from the same
341+ /// [`split`](WebSocketStream::split) call, returns `Ok` with the original stream.
342+ /// Otherwise, returns `Err` containing the provided parts.
343+ pub fn reunite (
344+ sender : WebSocketSender < S > ,
345+ receiver : WebSocketReceiver < S > ,
346+ ) -> Result < Self , ( WebSocketSender < S > , WebSocketReceiver < S > ) > {
347+ if sender. is_pair_of ( & receiver) {
348+ drop ( receiver) ;
349+ let stream = Arc :: try_unwrap ( sender. shared )
350+ . ok ( )
351+ . expect ( "reunite the stream" )
352+ . into_inner ( ) ;
353+
354+ Ok ( stream)
355+ } else {
356+ Err ( ( sender, receiver) )
357+ }
358+ }
338359}
339360
340361impl < T > WebSocketStream < T >
@@ -551,6 +572,7 @@ where
551572}
552573
553574/// The sender part of a [websocket](WebSocketStream) stream.
575+ #[ derive( Debug ) ]
554576pub struct WebSocketSender < S > {
555577 shared : Arc < Shared < S > > ,
556578}
@@ -575,6 +597,12 @@ impl<S> WebSocketSender<S> {
575597 {
576598 self . send ( Message :: Close ( msg) ) . await
577599 }
600+
601+ /// Checks if this [sender](WebSocketSender) and some [receiver](WebSocketReceiver)
602+ /// were split from the same [websocket](WebSocketStream) stream.
603+ pub fn is_pair_of ( & self , other : & WebSocketReceiver < S > ) -> bool {
604+ Arc :: ptr_eq ( & self . shared , & other. shared )
605+ }
578606}
579607
580608#[ cfg( feature = "futures-03-sink" ) ]
@@ -602,10 +630,19 @@ where
602630}
603631
604632/// The receiver part of a [websocket](WebSocketStream) stream.
633+ #[ derive( Debug ) ]
605634pub struct WebSocketReceiver < S > {
606635 shared : Arc < Shared < S > > ,
607636}
608637
638+ impl < S > WebSocketReceiver < S > {
639+ /// Checks if this [receiver](WebSocketReceiver) and some [sender](WebSocketSender)
640+ /// were split from the same [websocket](WebSocketStream) stream.
641+ pub fn is_pair_of ( & self , other : & WebSocketSender < S > ) -> bool {
642+ Arc :: ptr_eq ( & self . shared , & other. shared )
643+ }
644+ }
645+
609646impl < S > Stream for WebSocketReceiver < S >
610647where
611648 S : AsyncRead + AsyncWrite + Unpin ,
@@ -626,12 +663,17 @@ where
626663 }
627664}
628665
666+ #[ derive( Debug ) ]
629667struct Shared < S > ( Mutex < WebSocketStream < S > > ) ;
630668
631669impl < S > Shared < S > {
632670 fn lock ( & self ) -> MutexGuard < ' _ , WebSocketStream < S > > {
633671 self . 0 . lock ( ) . expect ( "lock shared stream" )
634672 }
673+
674+ fn into_inner ( self ) -> WebSocketStream < S > {
675+ self . 0 . into_inner ( ) . expect ( "get shared stream" )
676+ }
635677}
636678
637679#[ cfg( any(
0 commit comments