1010from redis import ResponseError
1111from redis .asyncio import Redis
1212from redis .asyncio .client import PubSub
13- from typing_extensions import override
13+ from typing_extensions import Unpack , override
1414
1515from reflex .config import get_config
1616from reflex .environment import environment
17- from reflex .event import Event
18- from reflex .istate .manager import StateManager , _default_token_expiration
17+ from reflex .istate .manager import (
18+ StateManager ,
19+ StateModificationContext ,
20+ _default_token_expiration ,
21+ )
1922from reflex .state import BaseState , _split_substate_key , _substate_key
2023from reflex .utils import console
2124from reflex .utils .exceptions import (
@@ -264,7 +267,7 @@ async def set_state(
264267 state : BaseState ,
265268 * ,
266269 lock_id : bytes | None = None ,
267- context : Event | None = None ,
270+ ** context : Unpack [ StateModificationContext ] ,
268271 ):
269272 """Set the state for a token.
270273
@@ -287,7 +290,11 @@ async def set_state(
287290 f"Lock expired for token { token } while processing. Consider increasing "
288291 f"`app.state_manager.lock_expiration` (currently { self .lock_expiration } ) "
289292 "or use `@rx.event(background=True)` decorator for long-running tasks."
290- + (f" Happened in event: { context .name } " if context is not None else "" )
293+ + (
294+ f" Happened in event: { event .name } "
295+ if (event := context .get ("event" )) is not None
296+ else ""
297+ )
291298 )
292299 raise LockExpiredError (msg )
293300 if lock_id is not None :
@@ -299,8 +306,8 @@ async def set_state(
299306 f"Lock for token { token } was held too long { time_taken = } s, "
300307 f"use `@rx.event(background=True)` decorator for long-running tasks."
301308 + (
302- f" Happened in event: { context .name } "
303- if context is not None
309+ f" Happened in event: { event .name } "
310+ if ( event := context . get ( "event" )) is not None
304311 else ""
305312 ),
306313 dedupe = True ,
@@ -319,7 +326,7 @@ async def set_state(
319326 _substate_key (client_token , substate ),
320327 substate ,
321328 lock_id = lock_id ,
322- context = context ,
329+ ** context ,
323330 ),
324331 name = f"reflex_set_state|{ client_token } |{ substate .get_full_name ()} " ,
325332 )
@@ -342,21 +349,21 @@ async def set_state(
342349 @override
343350 @contextlib .asynccontextmanager
344351 async def modify_state (
345- self , token : str , * , context : Event | None = None
352+ self , token : str , ** context : Unpack [ StateModificationContext ]
346353 ) -> AsyncIterator [BaseState ]:
347354 """Modify the state for a token while holding exclusive lock.
348355
349356 Args:
350357 token: The token to modify the state for.
351- context: The event context.
358+ context: The state modification context.
352359
353360 Yields:
354361 The state for the token.
355362 """
356363 async with self ._lock (token ) as lock_id :
357364 state = await self .get_state (token )
358365 yield state
359- await self .set_state (token , state , lock_id = lock_id , context = context )
366+ await self .set_state (token , state , lock_id = lock_id , ** context )
360367
361368 @staticmethod
362369 def _lock_key (token : str ) -> bytes :
0 commit comments