File size: 945 Bytes
71b4454
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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()