|
|
@ -883,54 +883,3 @@ class Network(PrintError): |
|
|
|
await self.interface.group.spawn(self._request_fee_estimates, self.interface) |
|
|
|
|
|
|
|
await asyncio.sleep(0.1) |
|
|
|
|
|
|
|
|
|
|
|
class NetworkJobOnDefaultServer(PrintError): |
|
|
|
"""An abstract base class for a job that runs on the main network |
|
|
|
interface. Every time the main interface changes, the job is |
|
|
|
restarted, and some of its internals are reset. |
|
|
|
""" |
|
|
|
def __init__(self, network: Network): |
|
|
|
asyncio.set_event_loop(network.asyncio_loop) |
|
|
|
self.network = network |
|
|
|
self.interface = None # type: Interface |
|
|
|
self._restart_lock = asyncio.Lock() |
|
|
|
self._reset() |
|
|
|
asyncio.run_coroutine_threadsafe(self._restart(), network.asyncio_loop) |
|
|
|
network.register_callback(self._restart, ['default_server_changed']) |
|
|
|
|
|
|
|
def _reset(self): |
|
|
|
"""Initialise fields. Called every time the underlying |
|
|
|
server connection changes. |
|
|
|
""" |
|
|
|
self.group = SilentTaskGroup() |
|
|
|
|
|
|
|
async def _start(self, interface): |
|
|
|
self.interface = interface |
|
|
|
await interface.group.spawn(self._start_tasks) |
|
|
|
|
|
|
|
async def _start_tasks(self): |
|
|
|
"""Start tasks in self.group. Called every time the underlying |
|
|
|
server connection changes. |
|
|
|
""" |
|
|
|
raise NotImplementedError() # implemented by subclasses |
|
|
|
|
|
|
|
async def stop(self): |
|
|
|
await self.group.cancel_remaining() |
|
|
|
|
|
|
|
@aiosafe |
|
|
|
async def _restart(self, *args): |
|
|
|
interface = self.network.interface |
|
|
|
if interface is None: |
|
|
|
return # we should get called again soon |
|
|
|
|
|
|
|
async with self._restart_lock: |
|
|
|
await self.stop() |
|
|
|
self._reset() |
|
|
|
await self._start(interface) |
|
|
|
|
|
|
|
@property |
|
|
|
def session(self): |
|
|
|
s = self.interface.session |
|
|
|
assert s is not None |
|
|
|
return s |
|
|
|