11from abc import abstractmethod
22import asyncio
3- import contextlib
43from typing import (
5- AsyncIterator ,
64 Generic ,
75 Tuple ,
86 Type ,
@@ -103,21 +101,6 @@ def __init__(self,
103101 def _make_peer_pool (self ) -> TPeerPool :
104102 ...
105103
106- @contextlib .asynccontextmanager
107- async def tcp_listener (self ) -> AsyncIterator [None ]:
108- # TODO: Support IPv6 addresses as well.
109- tcp_listener = await asyncio .start_server (
110- self .receive_handshake ,
111- host = BOUND_IP ,
112- port = self .port ,
113- )
114- try :
115- yield
116- finally :
117- self .logger .info ("Server finished, closing TCP listener..." )
118- tcp_listener .close ()
119- await tcp_listener .wait_closed ()
120-
121104 async def run (self ) -> None :
122105 self .logger .info ("Running server..." )
123106 self .logger .info (
@@ -129,9 +112,20 @@ async def run(self) -> None:
129112 self .logger .info ('network: %s' , self .network_id )
130113 self .logger .info ('peers: max_peers=%s' , self .max_peers )
131114
132- async with self .tcp_listener ():
133- self .manager .run_daemon_child_service (self .peer_pool )
134- await self .manager .wait_finished ()
115+ # TODO: Support IPv6 addresses as well.
116+ tcp_listener = await asyncio .start_server (
117+ self .receive_handshake ,
118+ host = BOUND_IP ,
119+ port = self .port ,
120+ )
121+ try :
122+ # mypy doesn't know that the Server returned above is an async contextmanager.
123+ async with tcp_listener : # type: ignore
124+ self .manager .run_daemon_child_service (self .peer_pool )
125+ await tcp_listener .serve_forever ()
126+ finally :
127+ self .logger .info ("TCP Listener finished, cancelling Server" )
128+ self .manager .cancel ()
135129
136130 async def receive_handshake (
137131 self , reader : asyncio .StreamReader , writer : asyncio .StreamWriter ) -> None :
0 commit comments