fix: pass instance_id to _write_loop to resolve NameError

The write loop was crashing with 'name instance_id is not defined' when
processing resize messages. This caused the connection to drop with 1006
and the frontend to reconnect in a loop. Fixed by passing instance_id
as a parameter to _write_loop. Also cleaned up debug logging.
This commit is contained in:
Fusion
2026-05-24 16:18:53 +02:00
parent fa20d00d14
commit 4a66a4a384
+7 -26
View File
@@ -88,7 +88,7 @@ async def terminal_websocket(
# Start I/O loops and heartbeat
read_task = asyncio.create_task(_read_loop(session, websocket))
write_task = asyncio.create_task(_write_loop(session, websocket))
write_task = asyncio.create_task(_write_loop(session, websocket, instance_id))
heartbeat_task = asyncio.create_task(_heartbeat_loop(websocket))
# Wait for either task to complete (indicating disconnect or error)
@@ -97,11 +97,6 @@ async def terminal_websocket(
return_when=asyncio.FIRST_COMPLETED,
)
# Log which task completed
for task in done:
task_name = "read" if task == read_task else "write" if task == write_task else "heartbeat"
logger.info(f"Task '{task_name}' completed first for instance {instance_id}")
# Cancel remaining tasks
for task in pending:
task.cancel()
@@ -121,35 +116,24 @@ async def terminal_websocket(
async def _read_loop(session, websocket) -> None:
"""Read output from the container and send to WebSocket."""
loop_count = 0
try:
while session.is_alive() and not session._closed:
loop_count += 1
if loop_count == 1:
logger.info(f"Read loop started for session {session.session_id}, alive={session.is_alive()}, closed={session._closed}")
data = await session.read_output()
if data:
try:
await websocket.send_bytes(data)
except Exception as e:
logger.warning(f"Read loop send_bytes failed: {e}")
except Exception:
break
else:
await asyncio.sleep(0.01)
except Exception as e:
logger.warning(f"Read loop exception: {e}")
finally:
logger.info(f"Read loop exited after {loop_count} iterations, alive={session.is_alive()}, closed={session._closed}")
except Exception:
pass
async def _write_loop(session, websocket) -> None:
async def _write_loop(session, websocket, instance_id: str) -> None:
"""Read input from WebSocket and send to container."""
loop_count = 0
try:
while session.is_alive() and not session._closed:
loop_count += 1
if loop_count == 1:
logger.info(f"Write loop started for session {session.session_id}, alive={session.is_alive()}, closed={session._closed}")
message = await websocket.receive()
if message["type"] == "websocket.receive":
if "bytes" in message:
@@ -193,12 +177,9 @@ async def _write_loop(session, websocket) -> None:
else:
await session.write_input(text.encode("utf-8"))
elif message["type"] == "websocket.disconnect":
logger.info(f"Write loop: websocket.disconnect received for session {session.session_id}")
break
except Exception as e:
logger.warning(f"Write loop exception for session {session.session_id}: {e}")
finally:
logger.info(f"Write loop exited after {loop_count} iterations, alive={session.is_alive()}, closed={session._closed}")
except Exception:
pass
async def _heartbeat_loop(websocket: WebSocket) -> None: