|
@ -108,9 +108,10 @@ class ServerManager(LoggedClass): |
|
|
|
|
|
|
|
|
def notify(self, height, touched): |
|
|
def notify(self, height, touched): |
|
|
'''Notify sessions about height changes and touched addresses.''' |
|
|
'''Notify sessions about height changes and touched addresses.''' |
|
|
sessions = [session for session in self.sessions |
|
|
cache = {} |
|
|
if isinstance(session, ElectrumX)] |
|
|
for session in self.sessions: |
|
|
ElectrumX.notify(sessions, height, touched) |
|
|
if isinstance(session, ElectrumX): |
|
|
|
|
|
session.notify(height, touched, cache) |
|
|
|
|
|
|
|
|
def stop(self): |
|
|
def stop(self): |
|
|
'''Close listening servers.''' |
|
|
'''Close listening servers.''' |
|
@ -324,36 +325,36 @@ class ElectrumX(Session): |
|
|
for prefix, suffixes in rpcs |
|
|
for prefix, suffixes in rpcs |
|
|
for suffix in suffixes.split()} |
|
|
for suffix in suffixes.split()} |
|
|
|
|
|
|
|
|
@classmethod |
|
|
def notify(self, height, touched, cache): |
|
|
def notify(cls, sessions, height, touched): |
|
|
'''Notify the client about changes in height and touched addresses. |
|
|
headers_payload = height_payload = None |
|
|
|
|
|
|
|
|
|
|
|
for session in sessions: |
|
|
Cache is a shared cache for this update. |
|
|
if height != session.notified_height: |
|
|
''' |
|
|
session.notified_height = height |
|
|
if height != self.notified_height: |
|
|
if session.subscribe_headers: |
|
|
self.notified_height = height |
|
|
if headers_payload is None: |
|
|
if self.subscribe_headers: |
|
|
headers_payload = json_notification_payload( |
|
|
key = 'headers_payload' |
|
|
|
|
|
if key not in cache: |
|
|
|
|
|
cache[key] = json_notification_payload( |
|
|
'blockchain.headers.subscribe', |
|
|
'blockchain.headers.subscribe', |
|
|
(session.electrum_header(height), ), |
|
|
(self.electrum_header(height), ), |
|
|
) |
|
|
) |
|
|
session.send_json(headers_payload) |
|
|
self.send_json(cache[key]) |
|
|
|
|
|
|
|
|
if session.subscribe_height: |
|
|
if self.subscribe_height: |
|
|
if height_payload is None: |
|
|
payload = json_notification_payload( |
|
|
height_payload = json_notification_payload( |
|
|
|
|
|
'blockchain.numblocks.subscribe', |
|
|
'blockchain.numblocks.subscribe', |
|
|
(height, ), |
|
|
(height, ), |
|
|
) |
|
|
) |
|
|
session.send_json(height_payload) |
|
|
self.send_json(payload) |
|
|
|
|
|
|
|
|
hash168_to_address = session.coin.hash168_to_address |
|
|
hash168_to_address = self.coin.hash168_to_address |
|
|
for hash168 in session.hash168s.intersection(touched): |
|
|
for hash168 in self.hash168s.intersection(touched): |
|
|
address = hash168_to_address(hash168) |
|
|
address = hash168_to_address(hash168) |
|
|
status = session.address_status(hash168) |
|
|
status = self.address_status(hash168) |
|
|
payload = json_notification_payload( |
|
|
payload = json_notification_payload( |
|
|
'blockchain.address.subscribe', (address, status)) |
|
|
'blockchain.address.subscribe', (address, status)) |
|
|
session.send_json(payload) |
|
|
self.send_json(payload) |
|
|
|
|
|
|
|
|
def height(self): |
|
|
def height(self): |
|
|
'''Return the block processor's current height.''' |
|
|
'''Return the block processor's current height.''' |
|
|