npv2k1's picture
feat: implement WebSocket support and RabbitMQ integration for message handling
bc0521a
raw
history blame
1.81 kB
"""FastAPI application factory."""
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from .routes import v1_router
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
def create_app() -> FastAPI:
"""Create and configure the FastAPI application."""
app = FastAPI()
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include routers
app.include_router(v1_router)
@app.on_event("startup")
async def startup_event():
"""Run startup events."""
pass
@app.on_event("shutdown")
async def shutdown_event():
"""Run shutdown events."""
pass
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
print(f"Received: {data}")
await manager.broadcast(f"Message from client: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast("A client disconnected")
return app
# Create default app instance
app = create_app()