Skip to content

Integrating Events with WebSockets in Nexios

Nexios combines WebSockets with a powerful event system to create reactive, real-time applications. This integration lets different parts of your system communicate seamlessly while keeping code clean and maintainable.


Basic WebSocket Event Integration

Emitting Events from Connections

WebSocket handlers can trigger events that other components can react to:

python
@app.ws_route("/chat")
async def chat_handler(ws: WebSocket):
    await ws.accept()
    await app.events.emit("ws.connected", {"client": ws.client})  # Connection event
    
    try:
        while True:
            message = await ws.receive_json()
            await app.events.emit("chat.message", message)  # Message event
    except Exception as e:
        await app.events.emit("ws.error", {"error": str(e)})  # Error event

Reacting to Events in Handlers

Subscribe to events and push updates to connected clients:

python
@app.events.on("notification.created")  
async def push_notification(notification):
    await ChannelBox.group_send(
        group_name="notifications",
        payload=notification
    )

Advanced Integration Patterns

Namespaced WebSocket Events

Create isolated event spaces for better organization:

python
ws_events = app.events.namespace("websocket")

@ws_events.on("message.received")  
async def process_message(msg):
    print(f"New message: {msg['content']}")

# In handler:
await ws_events.emit("message.received", {"content": "Hello"})

One-Time Connection Events

Execute actions only when a connection first starts:

python
@app.events.once("connection.init")  
async def send_welcome(data):
    await data["ws"].send_json({"type": "welcome"})

# During connection:
await app.events.emit("connection.init", {"ws": ws})

Error Handling with Events

Centralize error management through events:

python
@app.events.on("ws.error")  
async def handle_errors(error):
    logging.error(f"WebSocket failure: {error}")
    # Alert monitoring systems

# In handlers:
try:
    ...
except Exception as e:
    await app.events.emit("ws.error", {"error": str(e)})

Complete Chat Application Example

python
@app.ws_route("/chat/{room}")  
async def chat_room(ws: WebSocket):
    room = ws.path_params["room"]
    channel = Channel(websocket=ws)
    await ChannelBox.add_channel_to_group(channel, f"chat_{room}")

    try:
        while True:
            msg = await ws.receive_json()
            await app.events.emit("room.message", {
                "room": room,
                "message": msg
            })
    finally:
        await ChannelBox.remove_channel_from_group(channel, f"chat_{room}")

@app.events.on("room.message")  
async def broadcast(msg):
    await ChannelBox.group_send(
        group_name=f"chat_{msg['room']}",
        payload=msg
    )