105 lines
4.1 KiB
Python
105 lines
4.1 KiB
Python
# standard imports
|
|
import datetime
|
|
|
|
# local imports
|
|
from chainqueue.enum import StatusBits
|
|
|
|
|
|
class Adapter:
|
|
"""Base class defining interface to be implemented by chainqueue adapters.
|
|
|
|
The chainqueue adapter collects the following actions:
|
|
|
|
- add: add a transaction to the queue
|
|
- upcoming: get queued transactions ready to be sent to network
|
|
- dispatch: send a queued transaction to the network
|
|
- translate: decode details of a transaction
|
|
- create_session, release_session: session management to control queue state integrity
|
|
|
|
:param backend: Chainqueue backend
|
|
:type backend: TODO - abstract backend class. Must implement get, create_session, release_session
|
|
:param pending_retry_threshold: seconds delay before retrying a transaction stalled in the newtork
|
|
:type pending_retry_threshold: int
|
|
:param error_retry_threshold: seconds delay before retrying a transaction that incurred a recoverable error state
|
|
:type error_retry_threshold: int
|
|
"""
|
|
|
|
def __init__(self, backend, pending_retry_threshold=0, error_retry_threshold=0):
|
|
self.backend = backend
|
|
self.pending_retry_threshold = datetime.timedelta(pending_retry_threshold)
|
|
self.error_retry_threshold = datetime.timedelta(error_retry_threshold)
|
|
|
|
|
|
def add(self, bytecode, chain_spec, session=None):
|
|
"""Add a transaction to the queue.
|
|
|
|
:param bytecode: Transaction wire format bytecode, in hex
|
|
:type bytecode: str
|
|
:param chain_spec: Chain spec to use for transaction decode
|
|
:type chain_spec: chainlib.chain.ChainSpec
|
|
:param session: Backend state integrity session
|
|
:type session: varies
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
def translate(self, bytecode, chain_spec):
|
|
"""Decode details of a transaction.
|
|
|
|
:param bytecode: Transaction wire format bytecode, in hex
|
|
:type bytecode: str
|
|
:param chain_spec: Chain spec to use for transaction decode
|
|
:type chain_spec: chainlib.chain.ChainSpec
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
def dispatch(self, chain_spec, rpc, tx_hash, signed_tx, session=None):
|
|
"""Send a queued transaction to the network.
|
|
|
|
:param chain_spec: Chain spec to use to identify the transaction network
|
|
:type chain_spec: chainlib.chain.ChainSpec
|
|
:param rpc: RPC connection to use for transaction send
|
|
:type rpc: chainlib.connection.RPCConnection
|
|
:param tx_hash: Transaction hash (checksum of transaction), in hex
|
|
:type tx_hash: str
|
|
:param signed_tx: Transaction wire format bytecode, in hex
|
|
:type signed_tx: str
|
|
:param session: Backend state integrity session
|
|
:type session: varies
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
def upcoming(self, chain_spec, session=None):
|
|
"""Get queued transactions ready to be sent to the network.
|
|
|
|
The transactions will be a combination of newly submitted transactions, previously sent but stalled transactions, and transactions that could temporarily not be submitted.
|
|
|
|
:param chain_spec: Chain spec to use to identify the transaction network
|
|
:type chain_spec: chainlib.chain.ChainSpec
|
|
:param session: Backend state integrity session
|
|
:type session: varies
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
|
|
def create_session(self, session=None):
|
|
"""Create a session context to guarantee atomic state change in backend.
|
|
|
|
:param session: If specified, session will be used instead of creating a new one
|
|
:type session: varies
|
|
"""
|
|
return self.backend.create_session(session)
|
|
|
|
|
|
def release_session(self, session=None):
|
|
"""Release a session context created by create_session.
|
|
|
|
If session parameter is defined, final session destruction will be deferred to the initial provider of the session. In other words; if create_session was called with a session, release_session should symmetrically be called with the same session.
|
|
|
|
:param session: Session context.
|
|
:type session: varies
|
|
"""
|
|
return self.backend.release_session(session)
|