"""Общее состояние сессий: хранилище, блокировка, константы, TTL-таймер. Единая точка хранения состояния — все операции импортируют её. Дробить state.py на файл-на-переменную не нужно: это данные, а не функции. """ import threading # TTL сессии: 30 минут TTL_SECONDS = 30 * 60 # Максимальный объём одного файла и суммарный объём файлов в сессии (защита памяти) MAX_FILE_BYTES = 50 * 1024 * 1024 # 50 MB на один файл MAX_SESSION_BYTES = 500 * 1024 * 1024 # 500 MB суммарно на сессию _sessions: dict = {} _lock = threading.Lock() def _start_timer(sid: str) -> threading.Timer: """Запустить таймер автоочистки сессии через TTL.""" def _clean(): with _lock: _sessions.pop(sid, None) timer = threading.Timer(TTL_SECONDS, _clean) timer.daemon = True timer.start() return timer def configure(max_file_bytes: int = None, max_session_bytes: int = None, ttl_seconds: int = None): """Переопределить лимиты/TTL из конфига приложения (глобально). None — оставить текущее значение. """ global MAX_FILE_BYTES, MAX_SESSION_BYTES, TTL_SECONDS if max_file_bytes is not None: MAX_FILE_BYTES = max_file_bytes if max_session_bytes is not None: MAX_SESSION_BYTES = max_session_bytes if ttl_seconds is not None: TTL_SECONDS = ttl_seconds