add web socket support to io using fastapi #111

Closed
opened 2025-10-27 02:22:47 -04:00 by neph1 · 0 comments
neph1 commented 2025-10-27 02:22:47 -04:00 (Migrated from github.com)

ref file:

https://github.com/neph1/LlamaTale/blob/master/tale/tio/if_browser_io.py

  • get_player_from_headers() – same logic as get_player_from_env.
  • handle_player_input() – instead of separate /input POSTs, feed the text into input queue.
  • cleanup_player() – whatever teardown already on connection close.

Ref snippet:

# file: web/server.py
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from queue import Empty
import asyncio

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()

    # Fetch or create player session
    player = get_player_from_headers(websocket.headers)
    q = player.output_queue

    # Send initial message (like your "connected" event)
    await websocket.send_text("connected")

    try:
        while True:
            # 1. Handle new player input (if any)
            try:
                data = await asyncio.wait_for(websocket.receive_text(), timeout=0.05)
                handle_player_input(player, data)
            except asyncio.TimeoutError:
                pass  # no input received

            # 2. Handle new server output
            try:
                line = q.get_nowait()
                await websocket.send_text(line)
            except Empty:
                await asyncio.sleep(0.05)  # prevent busy-looping
    except WebSocketDisconnect:
        cleanup_player(player)

This is a complex task that requires changes to driver_if.py from where the class is instantiated and the super class driver.py.

In addition, the client in /web needs to be updated to handle this new framework.

Give it your best shot, and reach out if you need more information.

ref file: https://github.com/neph1/LlamaTale/blob/master/tale/tio/if_browser_io.py - get_player_from_headers() – same logic as get_player_from_env. - handle_player_input() – instead of separate /input POSTs, feed the text into input queue. - cleanup_player() – whatever teardown already on connection close. Ref snippet: ``` # file: web/server.py from fastapi import FastAPI, WebSocket, WebSocketDisconnect from queue import Empty import asyncio app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() # Fetch or create player session player = get_player_from_headers(websocket.headers) q = player.output_queue # Send initial message (like your "connected" event) await websocket.send_text("connected") try: while True: # 1. Handle new player input (if any) try: data = await asyncio.wait_for(websocket.receive_text(), timeout=0.05) handle_player_input(player, data) except asyncio.TimeoutError: pass # no input received # 2. Handle new server output try: line = q.get_nowait() await websocket.send_text(line) except Empty: await asyncio.sleep(0.05) # prevent busy-looping except WebSocketDisconnect: cleanup_player(player) ``` This is a complex task that requires changes to driver_if.py from where the class is instantiated and the super class driver.py. In addition, the client in /web needs to be updated to handle this new framework. Give it your best shot, and reach out if you need more information.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
neph1/LlamaTale#111
No description provided.