@@ -30,20 +30,28 @@ def __init__(self):
30
30
async def serve (self , websocket , permissions ):
31
31
self .websocket = websocket
32
32
self .websockets .append (websocket )
33
- self .event = asyncio .Event ()
33
+ self .data_from_terminal = asyncio .Queue ()
34
34
self .loop = asyncio .get_event_loop ()
35
35
36
- task = asyncio .create_task (self .send_data ())
36
+ task = asyncio .create_task (self .send_data ()) # noqa: F841
37
37
38
38
def on_output ():
39
39
try :
40
- self .data_or_disconnect = self .p_out .read (65536 ).decode ()
41
- self .event .set ()
42
- except Exception :
43
- os .close (self .fd )
44
- self .loop .remove_reader (self .p_out )
45
- self .data_or_disconnect = None
46
- self .event .set ()
40
+ data = self .p_out .read (65536 ).decode ()
41
+ except OSError :
42
+ try :
43
+ self .loop .remove_reader (self .p_out )
44
+ except Exception :
45
+ pass
46
+ try :
47
+ os .close (self .fd )
48
+ except OSError :
49
+ pass
50
+ self .data_from_terminal .put_nowait (None )
51
+ self .websockets .clear ()
52
+ self .quit ()
53
+ else :
54
+ self .data_from_terminal .put_nowait (data )
47
55
48
56
self .loop .add_reader (self .p_out , on_output )
49
57
await websocket .send_json (["setup" , {}])
@@ -58,21 +66,31 @@ def on_output():
58
66
winsize = struct .pack ("HH" , msg [1 ], msg [2 ])
59
67
fcntl .ioctl (self .fd , termios .TIOCSWINSZ , winsize )
60
68
except WebSocketDisconnect :
61
- task . cancel ( )
69
+ self . quit ( websocket )
62
70
63
71
async def send_data (self ):
64
72
while True :
65
- await self .event .wait ()
66
- self .event .clear ()
67
- if self .data_or_disconnect is None :
68
- await self .websocket .send_json (["disconnect" , 1 ])
69
- else :
70
- for websocket in self .websockets :
71
- await websocket .send_json (["stdout" , self .data_or_disconnect ])
73
+ data = await self .data_from_terminal .get ()
74
+ if data is None :
75
+ try :
76
+ await self .websocket .send_json (["disconnect" , 1 ])
77
+ except Exception :
78
+ pass
79
+ return
80
+
81
+ for websocket in self .websockets :
82
+ await websocket .send_json (["stdout" , data ])
72
83
73
- def quit (self , websocket ):
84
+ def quit (self , websocket = None ):
74
85
if websocket in self .websockets :
75
86
self .websockets .remove (websocket )
76
87
if not self .websockets :
77
- os .close (self .fd )
78
- self .loop .remove_reader (self .p_out )
88
+ try :
89
+ self .loop .remove_reader (self .p_out )
90
+ except Exception :
91
+ pass
92
+ try :
93
+ os .close (self .fd )
94
+ except OSError :
95
+ pass
96
+ self .data_from_terminal .put_nowait (None )
0 commit comments