33from typing import Any
44
55from channels .generic .websocket import AsyncJsonWebsocketConsumer
6-
7- from idom .core .layout import Layout
86from idom .core .dispatcher import dispatch_single_view
9- from idom .core .component import ComponentConstructor
7+ from idom .core .layout import Layout , LayoutEvent
8+ from idom .core .proto import ComponentConstructor
109
1110
1211class IdomAsyncWebSocketConsumer (AsyncJsonWebsocketConsumer ):
@@ -20,22 +19,26 @@ def __init__(
2019
2120 async def connect (self ) -> None :
2221 await super ().connect ()
23- self ._idom_recv_queue = recv_queue = asyncio .Queue ()
24- self ._idom_dispatcher_future = asyncio .ensure_future (
25- dispatch_single_view (
26- Layout (self ._idom_component_constructor ()),
27- self .send_json ,
28- recv_queue .get ,
29- )
30- )
22+ self ._idom_dispatcher_future = asyncio .ensure_future (self ._run_dispatch_loop ())
3123
32- async def close (self , * args : Any , ** kwargs : Any ) -> None :
24+ async def disconnect (self , code : int ) -> None :
3325 if self ._idom_dispatcher_future .done ():
3426 await self ._idom_dispatcher_future
3527 else :
3628 self ._idom_dispatcher_future .cancel ()
37- await asyncio .wait ([self ._idom_dispatcher_future ])
38- await super ().close (* args , ** kwargs )
29+ await super ().disconnect (code )
3930
4031 async def receive_json (self , content : Any , ** kwargs : Any ) -> None :
41- await self ._idom_recv_queue .put (content )
32+ await self ._idom_recv_queue .put (LayoutEvent (** content ))
33+
34+ async def _run_dispatch_loop (self ):
35+ self ._idom_recv_queue = recv_queue = asyncio .Queue ()
36+ try :
37+ await dispatch_single_view (
38+ Layout (self ._idom_component_constructor ()),
39+ self .send_json ,
40+ recv_queue .get ,
41+ )
42+ except Exception :
43+ await self .close ()
44+ raise
0 commit comments