3636from ._utils import user_state_key
3737
3838
39+ def _session_key_prefix (app_name : str , user_id : Optional [str ] = None ) -> str :
40+ """Generate a Redis key prefix for listing sessions.
41+
42+ When user_id is None, the prefix matches sessions across all users for the
43+ given app; otherwise it is scoped to the specific user.
44+
45+ Args:
46+ app_name: Application name
47+ user_id: Optional user identifier
48+
49+ Returns:
50+ Formatted session key prefix with a trailing wildcard.
51+ """
52+ if user_id is None :
53+ return f"session:{ app_name } :*"
54+ return f"session:{ app_name } :{ user_id } :*"
55+
56+
3957class RedisSessionService (BaseSessionService ):
4058 """A Redis implementation of the session service.
4159
@@ -129,18 +147,17 @@ async def get_session(
129147 return self ._merge_state (app_state , user_state , session )
130148
131149 @override
132- async def list_sessions (self , * , app_name : str , user_id : str ) -> ListSessionsResponse :
150+ async def list_sessions (self , * , app_name : str , user_id : Optional [ str ] = None ) -> ListSessionsResponse :
133151 async with self ._redis_storage .create_db_session () as redis_session :
134- pattern = session_key (app_name , user_id , "*" )
152+ pattern = _session_key_prefix (app_name , user_id )
135153 command = RedisCommand (method = 'keys' , args = (pattern , ))
136154 keys = await self ._redis_storage .execute_command (redis_session , command )
137155
138156 if not keys :
139157 return ListSessionsResponse ()
140158
141- # Get app and user state once for all sessions
159+ # Get app state once for all sessions
142160 app_state = await self ._get_app_state (redis_session , app_name )
143- user_state = await self ._get_user_state (redis_session , app_name , user_id )
144161
145162 sessions_without_events = []
146163 for key in keys :
@@ -150,6 +167,7 @@ async def list_sessions(self, *, app_name: str, user_id: str) -> ListSessionsRes
150167 storage_session .events = []
151168 storage_session .historical_events = []
152169 # Merge state
170+ user_state = await self ._get_user_state (redis_session , app_name , storage_session .user_id )
153171 storage_session = self ._merge_state (app_state , user_state , storage_session )
154172 sessions_without_events .append (storage_session )
155173
0 commit comments