Skip to content

Commit cfe3840

Browse files
author
Ivelin Ivanov
authored
Merge pull request #26 from ambianic/dev
fix: handle graceful peer reconnect on network disruptions
2 parents ba9418c + de121d7 commit cfe3840

File tree

3 files changed

+31
-20
lines changed

3 files changed

+31
-20
lines changed

src/peerjs/ext/http-proxy.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,6 @@ async def pc_close():
235235

236236
async def pnp_service_connect() -> Peer:
237237
"""Create a Peer instance and register with PnP signaling server."""
238-
# if connection to pnp service already open, then nothing to do
239-
global peer
240-
if peer and peer.open:
241-
log.info('peer already connected')
242-
return
243238
# Create own peer object with connection to shared PeerJS server
244239
log.info('creating peer')
245240
# If we already have an assigned peerId, we will reuse it forever.
@@ -262,9 +257,7 @@ async def pnp_service_connect() -> Peer:
262257
await peer.start()
263258
log.info('peer activated')
264259
_setPnPServiceConnectionHandlers(peer)
265-
log.info('Calling make_discoverable')
266-
await make_discoverable(peer=peer)
267-
log.info('Exited make_discoverable')
260+
return peer
268261

269262

270263
async def make_discoverable(peer=None):
@@ -281,14 +274,14 @@ async def make_discoverable(peer=None):
281274
# to the signaling server is alive
282275
if peer.open:
283276
await join_peer_room(peer=peer)
277+
elif peer.destroyed:
278+
log.info('Peer connection destroyed. Will create a new peer.')
279+
peer = await pnp_service_connect()
280+
elif peer.disconnected:
281+
log.info('Peer disconnected. Will try to reconnect.')
282+
await peer.reconnect()
284283
else:
285-
log.info('Peer not connected to signaling server. '
286-
'Will retry in a bit.')
287-
if peer.disconnected:
288-
log.info('Peer disconnected. Will try to reconnect.')
289-
await peer.reconnect()
290-
else:
291-
log.info('Peer still establishing connection. %r', peer)
284+
log.info('Peer still establishing connection. %r', peer)
292285
except Exception as e:
293286
log.exception('Unable to join room. '
294287
'Will retry in a few moments. '
@@ -315,14 +308,27 @@ def _config_logger():
315308
async def _start():
316309
global http_session
317310
http_session = aiohttp.ClientSession()
318-
await pnp_service_connect()
311+
global peer
312+
peer = await pnp_service_connect()
313+
if peer:
314+
log.info('Calling make_discoverable')
315+
await make_discoverable(peer=peer)
316+
log.info('Exited make_discoverable')
317+
else:
318+
log.warning('Failed to create peer.')
319+
return peer
319320

320321

321322
async def _shutdown():
322323
global _is_shutting_down
323324
_is_shutting_down = True
325+
global peer
326+
log.debug('Shutting down. Peer %r', peer)
324327
if peer:
328+
log.info('Destroying peer %r', peer)
325329
await peer.destroy()
330+
else:
331+
log.info('Peer is None')
326332
# loop.run_until_complete(pc.close())
327333
# loop.run_until_complete(signaling.close())
328334
global http_session
@@ -348,12 +354,12 @@ async def _shutdown():
348354
# coro = _run_offer(pc, signaling)
349355
# else:
350356
# coro = _run_answer(pc, signaling)
351-
coro = _start
352357

353358
# run event loop
354359
loop = asyncio.get_event_loop()
355360
try:
356-
loop.run_until_complete(coro())
361+
log.info('\n>>>>> Starting http-proxy over webrtc. <<<<')
362+
loop.run_until_complete(_start())
357363
loop.run_forever()
358364
except KeyboardInterrupt:
359365
log.info('KeyboardInterrupt detected.')

src/peerjs/peer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,12 @@ def http_api(self):
157157
# }
158158

159159
@property
160-
def destroyed(self, ):
160+
def destroyed(self):
161161
"""Return True if peer connections have been destroyed."""
162162
return self._destroyed
163163

164164
@property
165-
def disconnected(self, ):
165+
def disconnected(self):
166166
"""Return True if peer is disconnected from signaling server."""
167167
return self._disconnected
168168

src/peerjs/socket.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ async def _receive(self, websocket=None):
6464
log.exception("Invalid server message: %s, error %s",
6565
message, e)
6666
self.emit('message', message)
67+
except asyncio.CancelledError:
68+
log.debug('Websocket receive loop cancelled.')
69+
return
6770
except ConnectionClosedError as err:
6871
log.warning("Websocket connection closed with error. %s", err)
6972
except RuntimeError as e:
@@ -137,6 +140,8 @@ async def close(self) -> None:
137140
self.emit(SocketEventType.Disconnected)
138141

139142
async def _cleanup(self) -> None:
143+
if self._receiver:
144+
self._receiver.cancel()
140145
if self._websocket:
141146
await self._websocket.close()
142147
self._websocket = None

0 commit comments

Comments
 (0)