88from anyio .abc import TaskGroup
99
1010from reactpy .config import REACTPY_DEBUG_MODE
11- from reactpy .core .types import LayoutEventMessage , LayoutType , LayoutUpdateMessage
12-
11+ from reactpy .core .types import StorageEventMessage , LocalStorage , LayoutEventMessage , LayoutType , LayoutUpdateMessage
12+ from reactpy . core . layout import Layout
1313logger = getLogger (__name__ )
1414
1515
@@ -33,6 +33,7 @@ class Stop(BaseException):
3333
3434async def serve_layout (
3535 layout : LayoutType [LayoutUpdateMessage , LayoutEventMessage ],
36+ storage : LocalStorage ,
3637 send : SendCoroutine ,
3738 recv : RecvCoroutine ,
3839) -> None :
@@ -41,11 +42,10 @@ async def serve_layout(
4142 try :
4243 async with create_task_group () as task_group :
4344 task_group .start_soon (_single_outgoing_loop , layout , send )
44- task_group .start_soon (_single_incoming_loop , task_group , layout , recv )
45+ task_group .start_soon (_single_incoming_loop , task_group , layout , storage , recv )
4546 except Stop :
4647 logger .info (f"Stopped serving { layout } " )
4748
48-
4949async def _single_outgoing_loop (
5050 layout : LayoutType [LayoutUpdateMessage , LayoutEventMessage ], send : SendCoroutine
5151) -> None :
@@ -63,13 +63,23 @@ async def _single_outgoing_loop(
6363 logger .error (msg )
6464 raise
6565
66+ async def incoming_router (
67+ layout : Layout ,
68+ storage : LocalStorage ,
69+ event : LayoutEventMessage or StorageEventMessage ,
70+ ):
71+ if event ["type" ] == "sync-local-storage" :
72+ storage ._sync (event ["storage" ])
73+ else :
74+ await layout .deliver (event )
6675
6776async def _single_incoming_loop (
6877 task_group : TaskGroup ,
6978 layout : LayoutType [LayoutUpdateMessage , LayoutEventMessage ],
79+ storage : LocalStorage ,
7080 recv : RecvCoroutine ,
7181) -> None :
7282 while True :
7383 # We need to fire and forget here so that we avoid waiting on the completion
7484 # of this event handler before receiving and running the next one.
75- task_group .start_soon (layout . deliver , await recv ())
85+ task_group .start_soon (incoming_router , layout , storage , await recv ())
0 commit comments