1- """
2- Base Message Queue Protocol and In-Memory Implementation
3-
4- This module defines the message queue protocol and provides a default in-memory implementation.
5- """
6-
71import logging
82from typing import Protocol , runtime_checkable
93from uuid import UUID
1610@runtime_checkable
1711class MessageQueue (Protocol ):
1812 """Abstract interface for an SSE message queue.
19-
20- This interface allows messages to be queued and processed by any SSE server instance,
13+
14+ This interface allows messages to be queued and processed by any SSE server instance
2115 enabling multiple servers to handle requests for the same session.
2216 """
23-
24- async def add_message (self , session_id : UUID , message : types .JSONRPCMessage | Exception ) -> bool :
17+
18+ async def add_message (
19+ self , session_id : UUID , message : types .JSONRPCMessage | Exception
20+ ) -> bool :
2521 """Add a message to the queue for the specified session.
26-
22+
2723 Args:
2824 session_id: The UUID of the session this message is for
2925 message: The message to queue
30-
26+
3127 Returns:
3228 bool: True if message was accepted, False if session not found
3329 """
3430 ...
35-
36- async def get_message (self , session_id : UUID , timeout : float = 0.1 ) -> types .JSONRPCMessage | Exception | None :
31+
32+ async def get_message (
33+ self , session_id : UUID , timeout : float = 0.1
34+ ) -> types .JSONRPCMessage | Exception | None :
3735 """Get the next message for the specified session.
38-
36+
3937 Args:
4038 session_id: The UUID of the session to get messages for
4139 timeout: Maximum time to wait for a message, in seconds
42-
40+
4341 Returns:
4442 The next message or None if no message is available
4543 """
4644 ...
47-
45+
4846 async def register_session (self , session_id : UUID ) -> None :
4947 """Register a new session with the queue.
50-
48+
5149 Args:
5250 session_id: The UUID of the new session to register
5351 """
5452 ...
55-
53+
5654 async def unregister_session (self , session_id : UUID ) -> None :
5755 """Unregister a session when it's closed.
58-
56+
5957 Args:
6058 session_id: The UUID of the session to unregister
6159 """
6260 ...
63-
61+
6462 async def session_exists (self , session_id : UUID ) -> bool :
6563 """Check if a session exists.
66-
64+
6765 Args:
6866 session_id: The UUID of the session to check
69-
67+
7068 Returns:
7169 bool: True if the session is active, False otherwise
7270 """
@@ -75,54 +73,59 @@ async def session_exists(self, session_id: UUID) -> bool:
7573
7674class InMemoryMessageQueue :
7775 """Default in-memory implementation of the MessageQueue interface.
78-
79- This implementation keeps messages in memory for each session until they're retrieved.
76+
77+ This implementation keeps messages in memory for
78+ each session until they're retrieved.
8079 """
81-
80+
8281 def __init__ (self ) -> None :
8382 self ._message_queues : dict [UUID , list [types .JSONRPCMessage | Exception ]] = {}
8483 self ._active_sessions : set [UUID ] = set ()
85-
86- async def add_message (self , session_id : UUID , message : types .JSONRPCMessage | Exception ) -> bool :
84+
85+ async def add_message (
86+ self , session_id : UUID , message : types .JSONRPCMessage | Exception
87+ ) -> bool :
8788 """Add a message to the queue for the specified session."""
8889 if session_id not in self ._active_sessions :
8990 logger .warning (f"Message received for unknown session { session_id } " )
9091 return False
91-
92+
9293 if session_id not in self ._message_queues :
9394 self ._message_queues [session_id ] = []
94-
95+
9596 self ._message_queues [session_id ].append (message )
9697 logger .debug (f"Added message to queue for session { session_id } " )
9798 return True
98-
99- async def get_message (self , session_id : UUID , timeout : float = 0.1 ) -> types .JSONRPCMessage | Exception | None :
99+
100+ async def get_message (
101+ self , session_id : UUID , timeout : float = 0.1
102+ ) -> types .JSONRPCMessage | Exception | None :
100103 """Get the next message for the specified session."""
101104 if session_id not in self ._active_sessions :
102105 return None
103-
106+
104107 queue = self ._message_queues .get (session_id , [])
105108 if not queue :
106109 return None
107-
110+
108111 message = queue .pop (0 )
109112 if not queue : # Clean up empty queue
110113 del self ._message_queues [session_id ]
111-
114+
112115 return message
113-
116+
114117 async def register_session (self , session_id : UUID ) -> None :
115118 """Register a new session with the queue."""
116119 self ._active_sessions .add (session_id )
117120 logger .debug (f"Registered session { session_id } " )
118-
121+
119122 async def unregister_session (self , session_id : UUID ) -> None :
120123 """Unregister a session when it's closed."""
121124 self ._active_sessions .discard (session_id )
122125 if session_id in self ._message_queues :
123126 del self ._message_queues [session_id ]
124127 logger .debug (f"Unregistered session { session_id } " )
125-
128+
126129 async def session_exists (self , session_id : UUID ) -> bool :
127130 """Check if a session exists."""
128- return session_id in self ._active_sessions
131+ return session_id in self ._active_sessions
0 commit comments