From 1c2eab13a92fac9e43663eb0b5f099eb1c40ea5b Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Thu, 8 Jan 2026 19:52:30 +0000 Subject: [PATCH] Admin UI fixes: remove duplicate tasks, report transport upgrades --- src/socketio/admin.py | 6 ++++++ src/socketio/async_admin.py | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/socketio/admin.py b/src/socketio/admin.py index 12b905e..e59da8a 100644 --- a/src/socketio/admin.py +++ b/src/socketio/admin.py @@ -194,6 +194,8 @@ class InstrumentedServer: if self.stats_task: # pragma: no branch self.stop_stats_event.set() self.stats_task.join() + self.stop_stats_event.clear() + self.stats_task = None def _trigger_event(self, event, namespace, *args): t = time.time() @@ -206,6 +208,9 @@ class InstrumentedServer: serialized_socket, datetime.fromtimestamp(t, timezone.utc).isoformat(), ), namespace=self.admin_namespace) + if not self.sio.eio._get_socket(eio_sid).upgraded: + self.sio.start_background_task( + self._check_for_upgrade, eio_sid, sid, namespace) elif event == 'disconnect': del self.sio.manager._timestamps[sid] reason = args[1] @@ -283,6 +288,7 @@ class InstrumentedServer: def _handle_eio_connect(self, eio_sid, environ): if self.stop_stats_event is None: self.stop_stats_event = self.sio.eio.create_event() + if self.stats_task is None: self.stats_task = self.sio.start_background_task( self._emit_server_stats) diff --git a/src/socketio/async_admin.py b/src/socketio/async_admin.py index b426b71..9d0fc9f 100644 --- a/src/socketio/async_admin.py +++ b/src/socketio/async_admin.py @@ -157,9 +157,6 @@ class InstrumentedAsyncServer: namespace=self.admin_namespace) self.sio.start_background_task(config, sid) - self.stop_stats_event = self.sio.eio.create_event() - self.stats_task = self.sio.start_background_task( - self._emit_server_stats) async def admin_emit(self, _, namespace, room_filter, event, *data): await self.sio.emit(event, data, to=room_filter, namespace=namespace) @@ -183,6 +180,8 @@ class InstrumentedAsyncServer: if self.stats_task: # pragma: no branch self.stop_stats_event.set() await asyncio.gather(self.stats_task) + self.stats_task = None + self.stop_stats_event.clear() async def _trigger_event(self, event, namespace, *args): t = time.time() @@ -195,6 +194,9 @@ class InstrumentedAsyncServer: serialized_socket, datetime.fromtimestamp(t, timezone.utc).isoformat(), ), namespace=self.admin_namespace) + if not self.sio.eio._get_socket(eio_sid).upgraded: + self.sio.start_background_task( + self._check_for_upgrade, eio_sid, sid, namespace) elif event == 'disconnect': del self.sio.manager._timestamps[sid] reason = args[1] @@ -273,6 +275,7 @@ class InstrumentedAsyncServer: async def _handle_eio_connect(self, eio_sid, environ): if self.stop_stats_event is None: self.stop_stats_event = self.sio.eio.create_event() + if self.stats_task is None: self.stats_task = self.sio.start_background_task( self._emit_server_stats)