Jelajahi Sumber

non-recursive reconnect with increasing backoff

Rodja Trappe 1 tahun lalu
induk
melakukan
81f73958e0
1 mengubah file dengan 20 tambahan dan 16 penghapusan
  1. 20 16
      nicegui/air.py

+ 20 - 16
nicegui/air.py

@@ -1,3 +1,4 @@
+import asyncio
 import gzip
 import gzip
 import logging
 import logging
 import re
 import re
@@ -107,23 +108,26 @@ class Air:
             await self.connect()
             await self.connect()
 
 
     async def connect(self) -> None:
     async def connect(self) -> None:
-        try:
-            if self.relay.connected:
+        backoff_time = 1
+        while True:
+            try:
+                if self.relay.connected:
+                    await self.relay.disconnect()
+                await self.relay.connect(
+                    f'{RELAY_HOST}?device_token={self.token}',
+                    socketio_path='/on_air/socket.io',
+                    transports=['websocket', 'polling'],  # favor websocket over polling
+                )
+                break
+            except socketio.exceptions.ConnectionError:
+                pass
+            except ValueError:  # NOTE this sometimes happens when the internal socketio client is not yet ready
                 await self.relay.disconnect()
                 await self.relay.disconnect()
-            await self.relay.connect(
-                f'{RELAY_HOST}?device_token={self.token}',
-                socketio_path='/on_air/socket.io',
-                transports=['websocket', 'polling'],
-            )
-        except socketio.exceptions.ConnectionError:
-            await self.connect()
-        except ValueError:  # NOTE this sometimes happens when the internal socketio client is not yet ready
-            await self.relay.disconnect()
-            await self.connect()
-        except Exception:
-            logging.exception('Could not connect to NiceGUI On Air server.')
-            print('Could not connect to NiceGUI On Air server.', flush=True)
-            await self.connect()
+            except Exception:
+                globals.log.exception('Could not connect to NiceGUI On Air server.')
+
+            await asyncio.sleep(backoff_time)
+            backoff_time = min(backoff_time * 2, 32)
 
 
     async def disconnect(self) -> None:
     async def disconnect(self) -> None:
         await self.relay.disconnect()
         await self.relay.disconnect()