chainsyncer/chainsyncer/session.py

46 lines
1.3 KiB
Python
Raw Normal View History

2022-03-16 19:44:13 +01:00
# standard imports
import uuid
2022-03-18 00:48:23 +01:00
# local imports
from chainsyncer.error import FilterDone
2022-03-16 19:44:13 +01:00
class SyncSession:
2022-03-17 20:36:27 +01:00
def __init__(self, session_store):
self.session_store = session_store
2022-03-16 19:44:13 +01:00
self.filters = []
2022-03-17 23:07:19 +01:00
self.started = self.session_store.started
2022-03-18 00:48:23 +01:00
self.get = self.session_store.get
self.next = self.session_store.next_item
self.item = None
2022-03-16 19:44:13 +01:00
2022-03-17 23:07:19 +01:00
def register(self, fltr):
if self.started:
raise RuntimeError('filters cannot be changed after syncer start')
2022-03-17 20:36:27 +01:00
self.session_store.register(fltr)
2022-03-16 19:44:13 +01:00
self.filters.append(fltr)
2022-03-18 00:48:23 +01:00
def start(self, offset=0, target=-1):
self.session_store.start(offset=offset, target=target)
self.item = self.session_store.next_item()
2022-03-16 19:44:13 +01:00
def filter(self, conn, block, tx):
2022-03-18 00:48:23 +01:00
self.session_store.connect()
for fltr in self.filters:
2022-03-17 23:07:19 +01:00
try:
2022-03-18 00:48:23 +01:00
self.item.advance()
2022-03-17 23:07:19 +01:00
except FilterDone:
break
2022-03-18 00:48:23 +01:00
interrupt = fltr.filter(conn, block, tx)
self.item.release(interrupt=interrupt)
try:
self.item.advance()
raise BackendError('filter state inconsitent with filter list')
except FilterDone:
self.item.reset()
self.session_store.disconnect()