restructure synchronizer
fix CLI notify cmd. fix merchant websockets.
This commit is contained in:
@@ -852,3 +852,54 @@ 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
|
||||
|
||||
Reference in New Issue
Block a user