33from typing import Any
44
55from channels .generic .websocket import AsyncJsonWebsocketConsumer
6- from idom .core .component import ComponentConstructor
76from idom .core .dispatcher import dispatch_single_view
8- from idom .core .layout import Layout
7+ from idom .core .layout import Layout , LayoutEvent
8+ from idom .core .proto import ComponentConstructor
99
1010
1111class IdomAsyncWebSocketConsumer (AsyncJsonWebsocketConsumer ):
@@ -19,22 +19,26 @@ def __init__(
1919
2020 async def connect (self ) -> None :
2121 await super ().connect ()
22- self ._idom_recv_queue = recv_queue = asyncio .Queue ()
23- self ._idom_dispatcher_future = asyncio .ensure_future (
24- dispatch_single_view (
25- Layout (self ._idom_component_constructor ()),
26- self .send_json ,
27- recv_queue .get ,
28- )
29- )
22+ self ._idom_dispatcher_future = asyncio .ensure_future (self ._run_dispatch_loop ())
3023
31- async def close (self , * args : Any , ** kwargs : Any ) -> None :
24+ async def disconnect (self , code : int ) -> None :
3225 if self ._idom_dispatcher_future .done ():
3326 await self ._idom_dispatcher_future
3427 else :
3528 self ._idom_dispatcher_future .cancel ()
36- await asyncio .wait ([self ._idom_dispatcher_future ])
37- await super ().close (* args , ** kwargs )
29+ await super ().disconnect (code )
3830
3931 async def receive_json (self , content : Any , ** kwargs : Any ) -> None :
40- 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