3
3
from typing import Any
4
4
5
5
from channels .generic .websocket import AsyncJsonWebsocketConsumer
6
- from idom .core .component import ComponentConstructor
7
6
from 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
9
9
10
10
11
11
class IdomAsyncWebSocketConsumer (AsyncJsonWebsocketConsumer ):
@@ -19,22 +19,26 @@ def __init__(
19
19
20
20
async def connect (self ) -> None :
21
21
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 ())
30
23
31
- async def close (self , * args : Any , ** kwargs : Any ) -> None :
24
+ async def disconnect (self , code : int ) -> None :
32
25
if self ._idom_dispatcher_future .done ():
33
26
await self ._idom_dispatcher_future
34
27
else :
35
28
self ._idom_dispatcher_future .cancel ()
36
- await asyncio .wait ([self ._idom_dispatcher_future ])
37
- await super ().close (* args , ** kwargs )
29
+ await super ().disconnect (code )
38
30
39
31
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