Skip to content

Commit 2fa6ccd

Browse files
committed
Add example websocket endpoint
1 parent a4adc5d commit 2fa6ccd

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

src/http_app/routes/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from fastapi import FastAPI
22

33
from http_app.routes import api, events, graphql, hello, ping, user_registered_hook, asyncapi_docs
4+
from . import websocket
45

56

67
def init_routes(app: FastAPI) -> None:
@@ -11,3 +12,4 @@ def init_routes(app: FastAPI) -> None:
1112
app.include_router(events.router)
1213
app.include_router(user_registered_hook.router)
1314
app.include_router(graphql.router, prefix="/graphql")
15+
app.include_router(websocket.router)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from fastapi import APIRouter
2+
3+
from . import chat
4+
5+
router = APIRouter(prefix="/ws")
6+
router.include_router(chat.router)

src/http_app/routes/websocket/chat.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from fastapi import APIRouter
2+
from starlette.websockets import WebSocket, WebSocketDisconnect
3+
4+
router = APIRouter(prefix="/chat")
5+
6+
7+
class ConnectionManager:
8+
def __init__(self):
9+
self.active_connections: list[WebSocket] = []
10+
11+
async def connect(self, websocket: WebSocket):
12+
await websocket.accept()
13+
self.active_connections.append(websocket)
14+
15+
def disconnect(self, websocket: WebSocket):
16+
self.active_connections.remove(websocket)
17+
18+
async def send_personal_message(self, message: str, websocket: WebSocket):
19+
await websocket.send_text(message)
20+
21+
async def broadcast(self, message: str):
22+
for connection in self.active_connections:
23+
await connection.send_text(message)
24+
25+
26+
manager = ConnectionManager()
27+
28+
29+
@router.websocket("/{client_id}")
30+
async def websocket_endpoint(websocket: WebSocket, client_id: int):
31+
await manager.connect(websocket)
32+
try:
33+
while True:
34+
data = await websocket.receive_text()
35+
await manager.send_personal_message(f"You wrote: {data}", websocket)
36+
await manager.broadcast(f"Client #{client_id} says: {data}")
37+
except WebSocketDisconnect:
38+
manager.disconnect(websocket)
39+
await manager.broadcast(f"Client #{client_id} left the chat")

0 commit comments

Comments
 (0)