22from collections .abc import Iterator
33from contextlib import contextmanager
44from dataclasses import dataclass
5+ from functools import cached_property
56from typing import Final
67
78from aiohttp import web
@@ -62,7 +63,8 @@ class UserSessionResourcesRegistry:
6263 def _registry (self ) -> RedisResourceRegistry :
6364 return get_registry (self .app )
6465
65- def _resource_key (self ) -> UserSession :
66+ @cached_property
67+ def resource_key (self ) -> UserSession :
6668 return UserSession (
6769 user_id = self .user_id ,
6870 client_session_id = self .client_session_id or "*" ,
@@ -78,14 +80,12 @@ async def set_socket_id(self, socket_id: str) -> None:
7880 )
7981
8082 await self ._registry .set_resource (
81- self ._resource_key () , (_SOCKET_ID_FIELDNAME , socket_id )
83+ self .resource_key , (_SOCKET_ID_FIELDNAME , socket_id )
8284 )
8385 # NOTE: hearthbeat is not emulated in tests, make sure that with very small GC intervals
8486 # the resources do not expire; this value is usually in the order of minutes
8587 timeout = max (3 , _get_service_deletion_timeout (self .app ))
86- await self ._registry .set_key_alive (
87- self ._resource_key (), expiration_time = timeout
88- )
88+ await self ._registry .set_key_alive (self .resource_key , expiration_time = timeout )
8989
9090 async def get_socket_id (self ) -> str | None :
9191 _logger .debug (
@@ -94,15 +94,15 @@ async def get_socket_id(self) -> str | None:
9494 self .client_session_id ,
9595 )
9696
97- resources = await self ._registry .get_resources (self ._resource_key () )
97+ resources = await self ._registry .get_resources (self .resource_key )
9898 key : str | None = resources .get ("socket_id" , None )
9999 return key
100100
101101 async def user_pressed_disconnect (self ) -> None :
102102 """When the user disconnects expire as soon as possible the alive key
103103 to ensure garbage collection will trigger in the next 2 cycles."""
104104
105- await self ._registry .set_key_alive (self ._resource_key () , expiration_time = 1 )
105+ await self ._registry .set_key_alive (self .resource_key , expiration_time = 1 )
106106
107107 async def remove_socket_id (self ) -> None :
108108 _logger .debug (
@@ -112,17 +112,17 @@ async def remove_socket_id(self) -> None:
112112 extra = get_log_record_extra (user_id = self .user_id ),
113113 )
114114
115- await self ._registry .remove_resource (self ._resource_key () , _SOCKET_ID_FIELDNAME )
115+ await self ._registry .remove_resource (self .resource_key , _SOCKET_ID_FIELDNAME )
116116 await self ._registry .set_key_alive (
117- self ._resource_key () ,
117+ self .resource_key ,
118118 expiration_time = _get_service_deletion_timeout (self .app ),
119119 )
120120
121121 async def set_heartbeat (self ) -> None :
122122 """Extends TTL to avoid expiration of all resources under this session"""
123123
124124 await self ._registry .set_key_alive (
125- self ._resource_key () ,
125+ self .resource_key ,
126126 expiration_time = _get_service_deletion_timeout (self .app ),
127127 )
128128
@@ -160,7 +160,7 @@ async def find(self, resource_name: str) -> list[str]:
160160 extra = get_log_record_extra (user_id = self .user_id ),
161161 )
162162
163- return await self ._registry .find_resources (self ._resource_key () , resource_name )
163+ return await self ._registry .find_resources (self .resource_key , resource_name )
164164
165165 async def add (self , key : str , value : str ) -> None :
166166 _logger .debug (
@@ -172,7 +172,7 @@ async def add(self, key: str, value: str) -> None:
172172 extra = get_log_record_extra (user_id = self .user_id ),
173173 )
174174
175- await self ._registry .set_resource (self ._resource_key () , (key , value ))
175+ await self ._registry .set_resource (self .resource_key , (key , value ))
176176
177177 async def remove (self , key : str ) -> None :
178178 _logger .debug (
@@ -183,7 +183,7 @@ async def remove(self, key: str) -> None:
183183 extra = get_log_record_extra (user_id = self .user_id ),
184184 )
185185
186- await self ._registry .remove_resource (self ._resource_key () , key )
186+ await self ._registry .remove_resource (self .resource_key , key )
187187
188188 @staticmethod
189189 async def find_users_of_resource (
0 commit comments