github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/cmd/litpy/litrpc.py (about)

     1  #!/usr/bin/env python3
     2  # Copyright (c) 2017 The lit developers
     3  # Distributed under the MIT software license, see the accompanying
     4  # file LICENSE or http://www.opensource.org/licenses/mit-license.php.
     5  """Python interface to lit"""
     6  
     7  import json
     8  import logging
     9  import random
    10  import time
    11  import websocket  # `pip install websocket-client`
    12  
    13  logger = logging.getLogger("litrpc")
    14  
    15  class LitConnection():
    16      """A class representing a connection to a lit node."""
    17      def __init__(self, ip, port):
    18          self.ip = ip
    19          self.port = port
    20  
    21      def connect(self):
    22          """Connect to the node. Continue trying for 10 seconds"""
    23          logger.debug("Opening RPC connection to litnode %s:%s" % (self.ip, self.port))
    24          self.ws = websocket.WebSocket()
    25          for _ in range(50):
    26              try:
    27                  self.ws.connect("ws://%s:%s/ws" % (self.ip, self.port))
    28              except ConnectionRefusedError:
    29                  # lit is not ready to accept connections yet
    30                  time.sleep(0.25)
    31              else:
    32                  # No exception - we're connected!
    33                  break
    34          self.msg_id = random.randint(0, 9999)
    35  
    36      def send_message(self, method, params):
    37          """Sends a websocket message to the lit node"""
    38          logger.debug("Sending rpc message to %s:%s %s(%s)" % (self.ip, self.port, method, str(params)))
    39          self.ws.send(json.dumps({"method": "LitRPC.%s" % method,
    40                                   "params": [params],
    41                                   "jsonrpc": "2.0",
    42                                   "id": str(self.msg_id)}))
    43  
    44          self.msg_id = self.msg_id + 1 % 10000
    45  
    46          resp = json.loads(self.ws.recv())
    47          logger.debug("Received rpc response from %s:%s method: %s Response: %s." % (self.ip, self.port, method, str(resp)))
    48          return resp
    49  
    50      def __getattr__(self, name):
    51          """Dispatches any unrecognised messages to the websocket connection"""
    52          def dispatcher(**kwargs):
    53              return self.send_message(name, kwargs)
    54          return dispatcher
    55  
    56      def new_address(self):
    57          """Add a new wallit address"""
    58          return self.Address(NumToMake=1)
    59  
    60      def balance(self):
    61          """Get wallit balance"""
    62          return self.Bal()