diff --git a/lbry/wallet/server/session.py b/lbry/wallet/server/session.py index 341281a8f..206c4d872 100644 --- a/lbry/wallet/server/session.py +++ b/lbry/wallet/server/session.py @@ -144,13 +144,6 @@ class SessionManager: self.session_event = Event() - # Set up the RPC request handlers - cmds = ('add_peer daemon_url disconnect getinfo groups log peers ' - 'query reorg sessions stop'.split()) - LocalRPC.request_handlers.update( - {cmd: getattr(self, 'rpc_' + cmd) for cmd in cmds} - ) - async def _start_server(self, kind, *args, **kw_args): loop = asyncio.get_event_loop() if kind == 'RPC': @@ -716,6 +709,7 @@ class SessionBase(RPCSession): REQUESTS_COUNT.labels(method=request.method).inc() if isinstance(request, Request): handler = self.request_handlers.get(request.method) + handler = partial(handler, self) else: handler = None coro = handler_invocation(handler, request)() @@ -789,16 +783,56 @@ class LBRYElectrumX(SessionBase): session_mgr: LBRYSessionManager version = lbry.__version__ + @classmethod + def initialize_request_handlers(cls): + cls.request_handlers.update({ + 'blockchain.block.get_chunk': cls.block_get_chunk, + 'blockchain.block.get_header': cls.block_get_header, + 'blockchain.estimatefee': cls.estimatefee, + 'blockchain.relayfee': cls.relayfee, + 'blockchain.scripthash.get_balance': cls.scripthash_get_balance, + 'blockchain.scripthash.get_history': cls.scripthash_get_history, + 'blockchain.scripthash.get_mempool': cls.scripthash_get_mempool, + 'blockchain.scripthash.listunspent': cls.scripthash_listunspent, + 'blockchain.scripthash.subscribe': cls.scripthash_subscribe, + 'blockchain.transaction.broadcast': cls.transaction_broadcast, + 'blockchain.transaction.get': cls.transaction_get, + 'blockchain.transaction.get_merkle': cls.transaction_merkle, + 'server.add_peer': cls.add_peer, + 'server.banner': cls.banner, + 'server.donation_address': cls.donation_address, + 'server.features': cls.server_features_async, + 'server.peers.subscribe': cls.peers_subscribe, + 'server.version': cls.server_version, + 'blockchain.transaction.get_height': cls.transaction_get_height, + 'blockchain.claimtrie.search': cls.claimtrie_search, + 'blockchain.claimtrie.resolve': cls.claimtrie_resolve, + 'blockchain.claimtrie.getclaimsbyids': cls.claimtrie_getclaimsbyids, + 'blockchain.block.get_server_height': cls.get_server_height, + 'mempool.get_fee_histogram': cls.mempool_compact_histogram, + 'blockchain.block.headers': cls.block_headers, + 'server.ping': cls.ping, + 'blockchain.headers.subscribe': cls.headers_subscribe_False, + 'blockchain.address.get_balance': cls.address_get_balance, + 'blockchain.address.get_history': cls.address_get_history, + 'blockchain.address.get_mempool': cls.address_get_mempool, + 'blockchain.address.listunspent': cls.address_listunspent, + 'blockchain.address.subscribe': cls.address_subscribe, + 'blockchain.address.unsubscribe': cls.address_unsubscribe, + }) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + if not LBRYElectrumX.request_handlers: + LBRYElectrumX.initialize_request_handlers() self.subscribe_headers = False self.subscribe_headers_raw = False self.connection.max_response_size = self.env.max_send self.hashX_subs = {} self.sv_seen = False self.mempool_statuses = {} - self.set_request_handlers(self.PROTOCOL_MIN) - # fixme: this is a rebase hack, we need to go through ChainState instead later + self.protocol_tuple = self.PROTOCOL_MIN + self.daemon = self.session_mgr.daemon self.bp: LBRYBlockProcessor = self.session_mgr.bp self.db: LBRYLevelDB = self.bp.db @@ -945,6 +979,9 @@ class LBRYElectrumX(SessionBase): metrics.cache_response() return cache_item.result + async def mempool_compact_histogram(self): + return self.mempool.compact_fee_histogram() + async def claimtrie_search(self, **kwargs): if kwargs: return await self.run_and_cache_query('search', reader.search_to_bytes, kwargs) @@ -1395,8 +1432,7 @@ class LBRYElectrumX(SessionBase): self.close_after_send = True raise RPCError(BAD_REQUEST, f'unsupported protocol version: {protocol_version}') - self.set_request_handlers(ptuple) - + self.protocol_tuple = ptuple return self.version, self.protocol_version_string() async def transaction_broadcast(self, raw_tx): @@ -1490,45 +1526,6 @@ class LBRYElectrumX(SessionBase): else: return tx_hash - def set_request_handlers(self, ptuple): - self.protocol_tuple = ptuple - handlers = { - 'blockchain.block.get_chunk': self.block_get_chunk, - 'blockchain.block.get_header': self.block_get_header, - 'blockchain.estimatefee': self.estimatefee, - 'blockchain.relayfee': self.relayfee, - 'blockchain.scripthash.get_balance': self.scripthash_get_balance, - 'blockchain.scripthash.get_history': self.scripthash_get_history, - 'blockchain.scripthash.get_mempool': self.scripthash_get_mempool, - 'blockchain.scripthash.listunspent': self.scripthash_listunspent, - 'blockchain.scripthash.subscribe': self.scripthash_subscribe, - 'blockchain.transaction.broadcast': self.transaction_broadcast, - 'blockchain.transaction.get': self.transaction_get, - 'blockchain.transaction.get_merkle': self.transaction_merkle, - 'server.add_peer': self.add_peer, - 'server.banner': self.banner, - 'server.donation_address': self.donation_address, - 'server.features': self.server_features_async, - 'server.peers.subscribe': self.peers_subscribe, - 'server.version': self.server_version, - 'blockchain.transaction.get_height': self.transaction_get_height, - 'blockchain.claimtrie.search': self.claimtrie_search, - 'blockchain.claimtrie.resolve': self.claimtrie_resolve, - 'blockchain.claimtrie.getclaimsbyids': self.claimtrie_getclaimsbyids, - 'blockchain.block.get_server_height': self.get_server_height, - 'mempool.get_fee_histogram': self.mempool.compact_fee_histogram, - 'blockchain.block.headers': self.block_headers, - 'server.ping': self.ping, - 'blockchain.headers.subscribe': self.headers_subscribe_False, - 'blockchain.address.get_balance': self.address_get_balance, - 'blockchain.address.get_history': self.address_get_history, - 'blockchain.address.get_mempool': self.address_get_mempool, - 'blockchain.address.listunspent': self.address_listunspent, - 'blockchain.address.subscribe': self.address_subscribe, - 'blockchain.address.unsubscribe': self.address_unsubscribe, - } - self.request_handlers = handlers - class LocalRPC(SessionBase): """A local TCP RPC server session."""