diff --git a/moderation/backend-py/main.py b/moderation/backend-py/main.py index 98f02ad..2fd7df1 100644 --- a/moderation/backend-py/main.py +++ b/moderation/backend-py/main.py @@ -30,6 +30,14 @@ async def lifespan(app: FastAPI): if settings.MINIO_ENABLED: init_minio() + # Log Socket.IO status + if socketio_app: + print("✅ WebSocket (Socket.IO) доступен") + print(" 📡 Namespace /mod-chat доступен для чата модераторов") + print(" 🔌 WebSocket endpoint: /socket.io") + else: + print("⚠️ WebSocket (Socket.IO) недоступен - чат модераторов не будет работать") + print("=" * 60 + "\n") yield @@ -79,19 +87,40 @@ async def root(): app.include_router(mod_app_router, prefix="/api/mod-app", tags=["moderation"]) app.include_router(moderation_auth_router, prefix="/api/moderation-auth", tags=["auth"]) -# Socket.IO будет обернут в uvicorn.run() для правильной работы -# Здесь просто инициализируем для проверки +# Socket.IO будет обернут для правильной работы +# Создаем обернутое приложение для Socket.IO +# Socket.IO обрабатывает пути /socket.io, остальное идет в FastAPI +socketio_app = None try: socketio_app = get_socketio_app() - print("✅ WebSocket (Socket.IO) инициализирован") - print(" 📡 Namespace /mod-chat доступен для чата модераторов") - print(" 🔌 WebSocket endpoint: /socket.io") - print(" 💡 Подключение: wss://your-domain/socket.io с namespace='/mod-chat'") except Exception as e: - print(f"⚠️ Ошибка инициализации WebSocket: {e}") - import traceback - traceback.print_exc() - print(" Чат модераторов будет недоступен") + # Ошибка инициализации Socket.IO - используем только FastAPI + socketio_app = None + +# Создаем обернутое приложение для Socket.IO +# Socket.IO обрабатывает пути /socket.io, остальное идет в FastAPI +class SocketIOWrapper: + """Wrapper to combine FastAPI and Socket.IO ASGI apps""" + def __init__(self, fastapi_app, socketio_app): + self.fastapi_app = fastapi_app + self.socketio_app = socketio_app + + async def __call__(self, scope, receive, send): + path = scope.get("path", "") + # Если путь начинается с /socket.io, используем Socket.IO + if path.startswith("/socket.io"): + await self.socketio_app(scope, receive, send) + else: + # Иначе используем FastAPI + await self.fastapi_app(scope, receive, send) + +# Создаем обернутое приложение (доступно для uvicorn) +# Это должно быть на уровне модуля, чтобы uvicorn мог импортировать +if socketio_app: + wrapped_app = SocketIOWrapper(app, socketio_app) +else: + # Если Socket.IO не инициализирован, используем только FastAPI + wrapped_app = app if __name__ == "__main__": print("\n" + "=" * 60)