4
4
5
5
from typing import List , Callable , Set
6
6
7
+ import datetime
8
+
7
9
# todo full type hinting
8
10
9
11
12
+ def dprint (type , * args ):
13
+ print (str (datetime .datetime .now ()) + ": (" + asyncio .current_task ().get_name () + ") " + type + ": \n \t " , * args )
14
+
15
+
10
16
class Radio :
11
17
12
18
ETX = b'\x03 ' # end of transmission tag
@@ -30,19 +36,19 @@ def sequence(self, message: str) -> None:
30
36
self .writer .write (data )
31
37
32
38
async def send (self , message : str ) -> None :
33
- print ( "(" , asyncio . Task . current_task (). get_name (), ") Sending: " , message )
39
+ dprint ( " Sending" , message )
34
40
self .sequence (message )
35
41
await self .writer .drain ()
36
42
37
43
async def feedback (self , message : str ) -> None :
38
44
data = self .prepare (message )
39
- print ( "(" , asyncio . Task . current_task (). get_name (), ") Feeding-back: " , message )
45
+ dprint ( " Feeding-back" , message )
40
46
self .reader .feed_data (data )
41
47
42
48
async def receive (self ) -> str :
43
49
data = await self .reader .readuntil (self .ETX )
44
50
message = self .unpack (data )
45
- print ( "(" , asyncio . Task . current_task (). get_name (), ") Received: " , message )
51
+ dprint ( " Received" , message )
46
52
return message
47
53
48
54
@@ -61,6 +67,7 @@ def __init__(self, name, reader=None, writer=None):
61
67
self .__name__ = type (self ).__name__ + "-" + name
62
68
63
69
self .white_list_functions : List [str ] = [ # todo change to function reference in a json friendly way
70
+ "echo" ,
64
71
"close"
65
72
]
66
73
@@ -75,11 +82,11 @@ async def callback(self, response: dict) -> None:
75
82
args = ()
76
83
await function (* args )
77
84
else :
78
- print ("(" , asyncio .Task . current_task ().get_name (), ") Request unrecognised by server: " + str (response ))
85
+ print ("(" , asyncio .current_task ().get_name (), ") Request unrecognised by server: " + str (response ))
79
86
80
87
async def run (self ) -> None :
81
- asyncio .Task . current_task ().set_name (self .__name__ + "-Transmitter" )
82
- print ( "(" , asyncio . Task . current_task (). get_name (), ") listening" )
88
+ asyncio .current_task ().set_name (self .__name__ + "-Transmitter" )
89
+ dprint ( " listening" )
83
90
if self .ready :
84
91
try :
85
92
while self .ready :
@@ -90,9 +97,17 @@ async def run(self) -> None:
90
97
await self .writer .wait_closed ()
91
98
self .reader , self .writer = None , None
92
99
100
+ async def echo (self , message : str ) -> None :
101
+ print (message )
102
+
93
103
async def close (self ) -> None :
94
104
self .ready = False
95
105
106
+ async def quit (self ) -> None :
107
+ json_dict = {"type" : "close" }
108
+ await self .send (json_dict )
109
+ await self .feedback (json_dict )
110
+
96
111
def prepare (self , json_dict : dict ) -> bytes :
97
112
message = json .dumps (json_dict , default = json_encoder )
98
113
return super ().prepare (message )
@@ -155,7 +170,7 @@ def __init__(self, addr='127.0.0.1', port=8888):
155
170
self .connections : List [Node ] = list ()
156
171
157
172
async def handler (self , reader : StreamReader , writer : StreamWriter ):
158
- name = asyncio .Task . current_task ().get_name ()
173
+ name = asyncio .current_task ().get_name ()
159
174
node = Node (name , self , reader , writer )
160
175
self .connections .append (node )
161
176
try :
@@ -166,11 +181,11 @@ async def handler(self, reader: StreamReader, writer: StreamWriter):
166
181
async def run (self ):
167
182
self .server = await asyncio .start_server (self .handler , self .addr , self .port )
168
183
await self .server .start_serving ()
169
- print ( f'Serving on { self .server .sockets [0 ].getsockname ()} ' )
184
+ dprint ( "Starting" , f'Serving on { self .server .sockets [0 ].getsockname ()} ' )
170
185
171
186
async def close (self ):
172
187
for node in self .connections :
173
- await node .close_client ()
188
+ await node .quit ()
174
189
175
190
self .server .close ()
176
191
await self .server .wait_closed ()
@@ -195,11 +210,6 @@ async def broadcast(self, json_dict: dict, tag: str):
195
210
if tag in node .subscriptions : # todo change to channels containing Nodes to avoid for loops
196
211
await node .send (json_dict )
197
212
198
- async def close_client (self ):
199
- json_dict = {"type" : "close" }
200
- await self .send (json_dict )
201
- await self .feedback (json_dict )
202
-
203
213
204
214
def main ():
205
215
host = Host ()
0 commit comments