mirror of
https://github.com/OpenHands/OpenHands.git
synced 2026-03-22 13:47:19 +08:00
* refactor session mgmt * defer file handling to runtime * add todo * refactor sessions a bit more * remove messages logic from FE * fix up socket handshake * refactor frontend auth a bit * first pass at redoing file explorer * implement directory suffix * fix up file tree * close agent on websocket close * remove session saving * move file refresh * remove getWorkspace * plumb path/code differently * fix build issues * fix the tests * fix npm build * add session rehydration * fix event serialization * logspam * fix user message rehydration * add get_event fn * agent state restoration * change history tracking for codeact * fix responsiveness of init * fix lint * lint * delint * fix prop * update tests * logspam * lint * fix test * revert codeact * change fileService to use API * fix up session loading * delint * delint * fix integration tests * revert test * fix up access to options endpoints * fix initial files load * delint * fix file initialization * fix mock server * fixl int * fix auth for html * Update frontend/src/i18n/translation.json Co-authored-by: Xingyao Wang <xingyao6@illinois.edu> * refactor sessions and sockets * avoid reinitializing the same session * fix reconnect issue * change up intro message * more guards on reinit * rename agent_session * delint * fix a bunch of tests * delint * fix last test * remove code editor context * fix build * fix any * fix dot notation * Update frontend/src/services/api.ts Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * fix up error handling * Update opendevin/server/session/agent.py Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * Update opendevin/server/session/agent.py Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * Update frontend/src/services/session.ts Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> * fix build errs * fix else * add closed state * delint * Update opendevin/server/session/session.py Co-authored-by: Engel Nyst <enyst@users.noreply.github.com> --------- Co-authored-by: Xingyao Wang <xingyao6@illinois.edu> Co-authored-by: Graham Neubig <neubig@gmail.com> Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
import asyncio
|
|
import time
|
|
|
|
from fastapi import WebSocket
|
|
|
|
from opendevin.core.logger import opendevin_logger as logger
|
|
|
|
from .session import Session
|
|
|
|
|
|
class SessionManager:
|
|
_sessions: dict[str, Session] = {}
|
|
cleanup_interval: int = 300
|
|
session_timeout: int = 600
|
|
|
|
def __init__(self):
|
|
asyncio.create_task(self._cleanup_sessions())
|
|
|
|
def add_or_restart_session(self, sid: str, ws_conn: WebSocket) -> Session:
|
|
if sid in self._sessions:
|
|
asyncio.create_task(self._sessions[sid].close())
|
|
self._sessions[sid] = Session(sid=sid, ws=ws_conn)
|
|
return self._sessions[sid]
|
|
|
|
def get_session(self, sid: str) -> Session | None:
|
|
if sid not in self._sessions:
|
|
return None
|
|
return self._sessions.get(sid)
|
|
|
|
async def send(self, sid: str, data: dict[str, object]) -> bool:
|
|
"""Sends data to the client."""
|
|
if sid not in self._sessions:
|
|
return False
|
|
return await self._sessions[sid].send(data)
|
|
|
|
async def send_error(self, sid: str, message: str) -> bool:
|
|
"""Sends an error message to the client."""
|
|
return await self.send(sid, {'error': True, 'message': message})
|
|
|
|
async def send_message(self, sid: str, message: str) -> bool:
|
|
"""Sends a message to the client."""
|
|
return await self.send(sid, {'message': message})
|
|
|
|
async def _cleanup_sessions(self):
|
|
while True:
|
|
current_time = time.time()
|
|
session_ids_to_remove = []
|
|
for sid, session in list(self._sessions.items()):
|
|
# if session inactive for a long time, remove it
|
|
if (
|
|
not session.is_alive
|
|
and current_time - session.last_active_ts > self.session_timeout
|
|
):
|
|
session_ids_to_remove.append(sid)
|
|
|
|
for sid in session_ids_to_remove:
|
|
del self._sessions[sid]
|
|
logger.info(f'Session {sid} has been removed due to inactivity.')
|
|
|
|
await asyncio.sleep(self.cleanup_interval)
|