This commit is contained in:
mirai
2026-01-03 12:00:52 +03:00
parent 8b58bf4db3
commit 264d19e932
6 changed files with 5 additions and 31 deletions
-3
View File
@@ -7,7 +7,6 @@ from sanic_ext import Extend
from .managers import ConnectionManager
from .stores import MessageStore, UserSessionStore
from .srp_auth import SRPAuthManager
from .logger import logger
from .routes import register_routes
@@ -32,12 +31,10 @@ def create_app(password: str = "", name: str = "cmd-chat-server") -> Sanic:
def register_lifecycle(app: Sanic) -> None:
@app.before_server_start
async def setup(app: Sanic):
logger.info("Server starting...")
app.ctx.cleanup_task = asyncio.create_task(cleanup_stale_sessions(app))
@app.after_server_stop
async def teardown(app: Sanic):
logger.info("Server shutting down...")
if app.ctx.cleanup_task:
app.ctx.cleanup_task.cancel()
with suppress(asyncio.CancelledError):
-6
View File
@@ -1,6 +0,0 @@
import logging
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
-5
View File
@@ -1,7 +1,6 @@
import asyncio
from typing import Optional
from sanic import Websocket
from .logger import logger
class ConnectionManager:
@@ -12,13 +11,11 @@ class ConnectionManager:
async def connect(self, user_id: str, websocket: Websocket) -> None:
async with self._lock:
self.active_connections[user_id] = websocket
logger.info(f"Client connected: {user_id}")
async def disconnect(self, user_id: str) -> None:
async with self._lock:
if user_id in self.active_connections:
del self.active_connections[user_id]
logger.info(f"Client disconnected: {user_id}")
async def broadcast(self, message: str, exclude_user: Optional[str] = None) -> None:
async with self._lock:
@@ -29,7 +26,6 @@ class ConnectionManager:
try:
await connection.send(message)
except Exception:
logger.exception(f"Failed to send message to {user_id}")
disconnected.append(user_id)
for user_id in disconnected:
@@ -43,6 +39,5 @@ class ConnectionManager:
await connection.send(message)
return True
except Exception:
logger.exception(f"Failed to send personal message to {user_id}")
return False
return False
-2
View File
@@ -1,5 +1,4 @@
from typing import Optional
from .logger import logger
from .factory import create_app
@@ -10,7 +9,6 @@ def run_server(
workers: int = 1,
) -> None:
app = create_app(password=password or "")
logger.info(f"Starting server on {host}:{port}")
app.run(
host=host,
+4 -7
View File
@@ -1,6 +1,5 @@
from typing import Optional
from .models import Message, UserSession
from .logger import logger
class MessageStore:
@@ -9,7 +8,7 @@ class MessageStore:
def add(self, message: Message) -> None:
self._messages.append(message)
logger.info(f"Message added: {message.id} from {message.username}")
def get_all(self) -> list[Message]:
return self._messages.copy()
@@ -17,7 +16,7 @@ class MessageStore:
def clear(self) -> None:
count = len(self._messages)
self._messages.clear()
logger.info(f"Cleared {count} messages")
def count(self) -> int:
return len(self._messages)
@@ -29,7 +28,7 @@ class UserSessionStore:
def add(self, session: UserSession) -> None:
self._sessions[session.user_id] = session
logger.info(f"Session created: {session.user_id} ({session.username})")
def get(self, user_id: str) -> Optional[UserSession]:
return self._sessions.get(user_id)
@@ -41,7 +40,7 @@ class UserSessionStore:
def remove(self, user_id: str) -> None:
if user_id in self._sessions:
del self._sessions[user_id]
logger.info(f"Session removed: {user_id}")
def cleanup_stale(self, timeout_seconds: int = 3600) -> int:
stale_ids = [
@@ -49,8 +48,6 @@ class UserSessionStore:
]
for uid in stale_ids:
del self._sessions[uid]
if stale_ids:
logger.info(f"Cleaned up {len(stale_ids)} stale sessions")
return len(stale_ids)
def get_all(self) -> list[UserSession]:
+1 -8
View File
@@ -7,7 +7,6 @@ from sanic import Sanic, Request, response, Websocket
from sanic.response import HTTPResponse, json as json_response
from .models import Message, UserSession
from .logger import logger
from .helpers import (
get_client_ip,
send_state,
@@ -31,8 +30,6 @@ async def srp_init(request: Request, app: Sanic) -> HTTPResponse:
user_id, B, salt = app.ctx.srp_manager.init_auth(username, client_public)
logger.info(f"SRP init: {username} ({user_id[:8]}...)")
return response.json(
{
"user_id": user_id,
@@ -42,7 +39,6 @@ async def srp_init(request: Request, app: Sanic) -> HTTPResponse:
)
except Exception:
logger.exception("SRP init failed")
return response.json({"error": "SRP init failed"}, status=500)
@@ -70,7 +66,6 @@ async def srp_verify(request: Request, app: Sanic) -> HTTPResponse:
)
app.ctx.session_store.add(session)
logger.info(f"SRP verified: {username} ({user_id[:8]}...)")
return response.json(
{
@@ -80,10 +75,8 @@ async def srp_verify(request: Request, app: Sanic) -> HTTPResponse:
)
except ValueError as e:
logger.warning(f"SRP verify failed: {e}")
return response.json({"error": str(e)}, status=401)
except Exception:
logger.exception("SRP verify failed")
return response.json({"error": "SRP verify failed"}, status=500)
@@ -128,7 +121,7 @@ async def chat_ws(request: Request, ws: Websocket, app: Sanic) -> None:
)
except Exception:
logger.exception(f"WebSocket error for {user_id}")
pass
finally:
await manager.disconnect(user_id)
await manager.broadcast(