1313// limitations under the License.
1414
1515use bmrng:: unbounded:: UnboundedRequestReceiver ;
16+ use bytes:: Bytes ;
1617use libwebrtc:: {
1718 native:: frame_cryptor:: EncryptionState ,
1819 prelude:: {
@@ -186,6 +187,20 @@ pub enum RoomEvent {
186187 topic : String ,
187188 participant_identity : ParticipantIdentity ,
188189 } ,
190+ /// A byte buffer has been fully received from a remove participant
191+ /// sent using [`LocalParticipant::send_bytes`].
192+ BytesReceived {
193+ bytes : Bytes ,
194+ info : ByteStreamInfo ,
195+ participant_identity : ParticipantIdentity ,
196+ } ,
197+ /// A string has been fully received from a remove participant
198+ /// sent using [`LocalParticipant::send_text`].
199+ TextReceived {
200+ text : String ,
201+ info : TextStreamInfo ,
202+ participant_identity : ParticipantIdentity ,
203+ } ,
189204 #[ deprecated( note = "Use high-level data streams API instead." ) ]
190205 StreamHeaderReceived {
191206 header : proto:: data_stream:: Header ,
@@ -1701,17 +1716,8 @@ async fn incoming_data_stream_task(
17011716 loop {
17021717 tokio:: select! {
17031718 Some ( ( reader, identity) ) = open_rx. recv( ) => {
1704- match reader {
1705- AnyStreamReader :: Byte ( reader) => dispatcher. dispatch( & RoomEvent :: ByteStreamOpened {
1706- topic: reader. info( ) . topic. clone( ) ,
1707- reader: TakeCell :: new( reader) ,
1708- participant_identity: ParticipantIdentity ( identity)
1709- } ) ,
1710- AnyStreamReader :: Text ( reader) => dispatcher. dispatch( & RoomEvent :: TextStreamOpened {
1711- topic: reader. info( ) . topic. clone( ) ,
1712- reader: TakeCell :: new( reader) ,
1713- participant_identity: ParticipantIdentity ( identity)
1714- } ) ,
1719+ if let Some ( event) = event_for_incoming_stream( reader, identity) . await {
1720+ dispatcher. dispatch( & event)
17151721 }
17161722 } ,
17171723 _ = close_rx. recv( ) => {
@@ -1721,6 +1727,44 @@ async fn incoming_data_stream_task(
17211727 }
17221728}
17231729
1730+ async fn event_for_incoming_stream ( reader : AnyStreamReader , identity : String ) -> Option < RoomEvent > {
1731+ let participant_identity = ParticipantIdentity ( identity) ;
1732+ match reader {
1733+ AnyStreamReader :: Byte ( reader) => {
1734+ if reader. info ( ) . attributes . contains_key ( "__push" ) {
1735+ // TODO: avoid cloning info
1736+ let info = reader. info ( ) . clone ( ) ;
1737+ let Ok ( bytes) = reader. read_all ( ) . await else {
1738+ log:: error!( "Failed to read pushed bytes for stream '{}'" , info. id) ;
1739+ return None ;
1740+ } ;
1741+ return Some ( RoomEvent :: BytesReceived { bytes, info, participant_identity } ) ;
1742+ }
1743+ Some ( RoomEvent :: ByteStreamOpened {
1744+ topic : reader. info ( ) . topic . clone ( ) ,
1745+ reader : TakeCell :: new ( reader) ,
1746+ participant_identity,
1747+ } )
1748+ }
1749+ AnyStreamReader :: Text ( reader) => {
1750+ if reader. info ( ) . attributes . contains_key ( "__push" ) {
1751+ // TODO: avoid cloning info
1752+ let info = reader. info ( ) . clone ( ) ;
1753+ let Ok ( text) = reader. read_all ( ) . await else {
1754+ log:: error!( "Failed to read pushed text for stream '{}'" , info. id) ;
1755+ return None ;
1756+ } ;
1757+ return Some ( RoomEvent :: TextReceived { text, info, participant_identity } ) ;
1758+ }
1759+ Some ( RoomEvent :: TextStreamOpened {
1760+ topic : reader. info ( ) . topic . clone ( ) ,
1761+ reader : TakeCell :: new ( reader) ,
1762+ participant_identity,
1763+ } )
1764+ }
1765+ }
1766+ }
1767+
17241768/// Receives packets from the outgoing stream manager and send them.
17251769async fn outgoing_data_stream_task (
17261770 mut packet_rx : UnboundedRequestReceiver < proto:: DataPacket , Result < ( ) , EngineError > > ,
0 commit comments