fix: handle client disconnect during device creation
All checks were successful
CI / test (push) Successful in 2m9s
CI / release (push) Successful in 36s
CI / docker (push) Successful in 1m11s

Long-running async handlers (DB insert + WG events) can outlive
the client connection. Guard all UI operations after async work
with RuntimeError catches so disconnected clients don't crash.
This commit is contained in:
Stefano Bertelli 2026-03-30 22:51:22 -05:00
parent 384b95b81d
commit e51c53f247
2 changed files with 27 additions and 10 deletions

View file

@ -129,13 +129,22 @@ async def admin_devices_page():
server_pubkey = await get_server_public_key()
config_text = build_client_config(device, private_key, server_pubkey)
try:
create_dialog.close()
_reset_create_form()
await refresh_table()
_show_config_dialog(device.name, config_text)
except RuntimeError:
pass # Client navigated away during async work
except RuntimeError:
pass # Client disconnected
except Exception as e:
logger.error("Failed to create device: {}", e)
try:
ui.notify(f"Error: {e}", type="negative")
except RuntimeError:
pass
def _reset_create_form():
create_name.value = ""

View file

@ -113,14 +113,22 @@ async def devices_page():
server_pubkey = await get_server_public_key()
config_text = build_client_config(device, private_key, server_pubkey)
try:
create_dialog.close()
_reset_create_form()
await refresh_table()
_show_config_dialog(device.name, config_text)
except RuntimeError:
pass # Client navigated away during async work
except RuntimeError:
pass # Client disconnected
except Exception as e:
logger.error("Failed to create device: {}", e)
try:
ui.notify(f"Error: {e}", type="negative")
except RuntimeError:
pass
def _reset_create_form():
create_name.value = ""