11import asyncio
22import logging
3+ from urllib .parse import urlparse
34
45from .protocol import BasicProtocol , create_peer
6+ from .ws import WSClient , WSServer
57
68logger = logging .getLogger (__name__ )
79
10+ def parse_peer (peer ):
11+ if "://" not in peer :
12+ peer = f"receptor://{ peer } "
13+ return urlparse (peer )
814
915# FIXME: ping_interval is in the config, it shouldn't need to be passed as an arg here
1016def mainloop (receptor , ping_interval = None , loop = asyncio .get_event_loop (), skip_run = False ):
@@ -15,8 +21,23 @@ def mainloop(receptor, ping_interval=None, loop=asyncio.get_event_loop(), skip_r
1521 config .node_listen_address , config .node_listen_port , ssl = config .get_server_ssl_context ())
1622 loop .create_task (listener )
1723 logger .info ("Serving on %s:%s" , config .node_listen_address , config .node_listen_port )
24+
25+ ws_server = WSServer (receptor , loop )
26+ ws_listener = loop .create_server (ws_server .app ().make_handler (),
27+ config .node_listen_address , config .node_listen_port + 1 , ssl = config .get_server_ssl_context ())
28+ loop .create_task (ws_listener )
29+ logger .info ("Serving ws on %s:%s" , config .node_listen_address , config .node_listen_port + 1 )
30+
1831 for peer in config .node_peers :
19- loop .create_task (create_peer (receptor , loop , * peer .strip ().split (":" , 1 )))
32+ parsed = parse_peer (peer )
33+ if parsed .scheme == "receptor" :
34+ loop .create_task (create_peer (receptor , loop , parsed .hostname , parsed .port ))
35+ elif parsed .scheme in ("ws" , "wss" ):
36+ c = WSClient (receptor , loop )
37+ loop .create_task (c .connect (peer ))
38+ else :
39+ logger .warn (f"invalid peer: %s -> %s" , peer , parsed )
40+
2041 if ping_interval > 0 :
2142 ping_time = (((int (loop .time ()) + 1 ) // ping_interval ) + 1 ) * ping_interval
2243 loop .call_at (ping_time , loop .create_task , send_pings_and_reschedule (receptor , loop , ping_time , ping_interval ))
@@ -34,6 +55,6 @@ async def send_pings_and_reschedule(receptor, loop, ping_time, ping_interval):
3455 logger .debug (f'Scheduling mesh ping.' )
3556 for node_id in receptor .router .get_nodes ():
3657 await receptor .router .ping_node (node_id )
37- loop .call_at (ping_time + ping_interval ,
58+ loop .call_at (ping_time + ping_interval ,
3859 loop .create_task , send_pings_and_reschedule (
3960 receptor , loop , ping_time + ping_interval , ping_interval ))
0 commit comments