@@ -124,14 +124,14 @@ impl SignalingCallbacks for FullMeshCallbacks {}
124124/// Signaling server isolated registry of peers, rooms and channels
125125#[ derive( Default , Debug , Clone ) ]
126126pub struct IsolatedMeshState {
127- rooms : HashMap < String , HashMap < PeerId , SignalingChannel > > ,
127+ rooms : HashMap < String , HashMap < PeerId , SignalingChannel > > ,
128128 peers : HashMap < PeerId , String > ,
129129}
130130
131131/// Signaling server state for full mesh topologies
132132#[ derive( Default , Debug , Clone ) ]
133133pub struct FullMeshState {
134- pub ( crate ) state : StateObj < IsolatedMeshState >
134+ pub ( crate ) state : StateObj < IsolatedMeshState > ,
135135}
136136impl SignalingState for FullMeshState { }
137137
@@ -142,15 +142,27 @@ impl FullMeshState {
142142 let event = Message :: Text ( JsonPeerEvent :: NewPeer ( peer) . to_string ( ) . into ( ) ) ;
143143
144144 // Create the room if needed
145- if !self . state . lock ( ) . as_ref ( ) . unwrap ( ) . rooms . contains_key ( & room) {
146- self . state . lock ( ) . as_mut ( ) . unwrap ( ) . rooms . insert ( room. clone ( ) , HashMap :: new ( ) ) ;
145+ if !self
146+ . state
147+ . lock ( )
148+ . as_ref ( )
149+ . unwrap ( )
150+ . rooms
151+ . contains_key ( & room)
152+ {
153+ self . state
154+ . lock ( )
155+ . as_mut ( )
156+ . unwrap ( )
157+ . rooms
158+ . insert ( room. clone ( ) , HashMap :: new ( ) ) ;
147159 }
148160
149161 // Safety: Lock must be scoped/dropped to ensure no deadlock with loop
150162 // let rooms = { self.peers.lock().unwrap().clone() };
151163 let state = { self . state . lock ( ) . unwrap ( ) . clone ( ) } ;
152164 // let rooms = self.peers.lock();
153- state. rooms . iter ( ) . for_each ( |( name, peers) | {
165+ state. rooms . iter ( ) . for_each ( |( name, peers) | {
154166 if * name == room {
155167 peers. keys ( ) . for_each ( |peer_id| {
156168 if let Err ( e) = self . try_send_to_peer ( * peer_id, event. clone ( ) , room. clone ( ) ) {
@@ -161,37 +173,70 @@ impl FullMeshState {
161173 } ) ;
162174
163175 // Safety: All prior locks in this method must be freed prior to this call
164- self . state . lock ( ) . as_mut ( ) . unwrap ( ) . rooms . get_mut ( & room) . unwrap ( ) . insert ( peer, sender) ;
165- self . state . lock ( ) . as_mut ( ) . unwrap ( ) . peers . insert ( peer, room. clone ( ) ) ;
176+ self . state
177+ . lock ( )
178+ . as_mut ( )
179+ . unwrap ( )
180+ . rooms
181+ . get_mut ( & room)
182+ . unwrap ( )
183+ . insert ( peer, sender) ;
184+ self . state
185+ . lock ( )
186+ . as_mut ( )
187+ . unwrap ( )
188+ . peers
189+ . insert ( peer, room. clone ( ) ) ;
166190 }
167191
168192 /// Remove a peer from the state if it existed, returning the peer removed.
169193 pub fn remove_peer ( & mut self , peer_id : & PeerId ) {
170- let peer_room = self . state . lock ( ) . as_ref ( ) . unwrap ( ) . peers . get ( peer_id) . unwrap ( ) . clone ( ) ;
194+ let peer_room = self
195+ . state
196+ . lock ( )
197+ . as_ref ( )
198+ . unwrap ( )
199+ . peers
200+ . get ( peer_id)
201+ . unwrap ( )
202+ . clone ( ) ;
171203 self . state . lock ( ) . as_mut ( ) . unwrap ( ) . peers . remove ( peer_id) ;
172204 let removed_peer = self
173205 . state
174206 . lock ( )
175207 . as_mut ( )
176208 . unwrap ( )
177209 . rooms
178- . get_mut ( & peer_room) . unwrap ( ) . remove ( peer_id) . map ( |sender| ( * peer_id, sender) ) ;
210+ . get_mut ( & peer_room)
211+ . unwrap ( )
212+ . remove ( peer_id)
213+ . map ( |sender| ( * peer_id, sender) ) ;
179214 if let Some ( ( peer_id, _sender) ) = removed_peer {
180215 // Tell each connected peer about the disconnected peer.
181216 let event = Message :: Text ( JsonPeerEvent :: PeerLeft ( peer_id) . to_string ( ) . into ( ) ) ;
182217 // Safety: Lock must be scoped/dropped to ensure no deadlock with loop
183218 let state = { self . state . lock ( ) . unwrap ( ) . clone ( ) } ;
184- state. rooms . get ( & peer_room) . unwrap ( ) . iter ( ) . for_each ( |( peer_id, _) | {
185- match self . try_send_to_peer ( * peer_id, event. clone ( ) , peer_room. to_string ( ) ) {
186- Ok ( ( ) ) => info ! ( "Sent peer remove to: {peer_id}" ) ,
187- Err ( e) => error ! ( "Failure sending peer remove: {e:?}" ) ,
188- }
189- } ) ;
219+ state
220+ . rooms
221+ . get ( & peer_room)
222+ . unwrap ( )
223+ . iter ( )
224+ . for_each ( |( peer_id, _) | {
225+ match self . try_send_to_peer ( * peer_id, event. clone ( ) , peer_room. to_string ( ) ) {
226+ Ok ( ( ) ) => info ! ( "Sent peer remove to: {peer_id}" ) ,
227+ Err ( e) => error ! ( "Failure sending peer remove: {e:?}" ) ,
228+ }
229+ } ) ;
190230 }
191231 }
192232
193233 /// Send a message to a peer without blocking.
194- pub fn try_send_to_peer ( & self , id : PeerId , message : Message , room : String ) -> Result < ( ) , SignalingError > {
234+ pub fn try_send_to_peer (
235+ & self ,
236+ id : PeerId ,
237+ message : Message ,
238+ room : String ,
239+ ) -> Result < ( ) , SignalingError > {
195240 self . state
196241 . lock ( )
197242 . unwrap ( )
0 commit comments