David Prince
production: clean source snapshot — no history bloat
71b4454
Raw
History Blame Contribute Delete
945 Bytes
import asyncio
import json
from typing import Dict, AsyncGenerator
class SSEStreamManager:
def __init__(self):
self._queues: Dict[str, asyncio.Queue] = {}
def get_queue(self, session_id: str) -> asyncio.Queue:
if session_id not in self._queues:
self._queues[session_id] = asyncio.Queue()
return self._queues[session_id]
async def publish(self, session_id: str, event_type: str, data: dict):
queue = self.get_queue(session_id)
payload = f"event: {event_type}\ndata: {json.dumps(data)}\n\n"
await queue.put(payload)
async def event_generator(self, session_id: str) -> AsyncGenerator[str, None]:
queue = self.get_queue(session_id)
try:
while True:
data = await queue.get()
yield data
queue.task_done()
except asyncio.CancelledError:
pass
sse_manager = SSEStreamManager()