Skip to content

Commit 1c19bcd

Browse files
author
Kim Neunert
committed
Merge branch 'master' of github.com:cryptoadvance/spectrum
2 parents 52f709b + 6d70608 commit 1c19bcd

File tree

5 files changed

+44
-21
lines changed

5 files changed

+44
-21
lines changed

src/cryptoadvance/specterext/spectrum/bridge_rpc.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
from cryptoadvance.specter.helpers import is_ip_private
1212
from cryptoadvance.specter.specter_error import SpecterError, handle_exception
1313
from cryptoadvance.specter.rpc import BitcoinRPC
14+
from cryptoadvance.specter.rpc import RpcError as SpecterRpcError
15+
from cryptoadvance.spectrum.spectrum import RPCError as SpectrumRpcError
1416
from cryptoadvance.specter.specter_error import BrokenCoreConnectionException
1517

16-
from cryptoadvance.spectrum.spectrum import RPCError, Spectrum
18+
from cryptoadvance.spectrum.spectrum import Spectrum
1719

1820
from flask import has_app_context
1921

@@ -76,11 +78,27 @@ def multi(self, calls: list, **kwargs):
7678

7779
# Spectrum uses a DB and access to it needs an app-context. In order to keep that implementation
7880
# detail within spectrum, we're establishing a context as needed.
79-
if not has_app_context() and self._app is not None:
80-
with self._app.app_context():
81-
return [self.spectrum.jsonrpc(item,wallet_name=self.wallet_name) for item in payload]
82-
else:
83-
return [self.spectrum.jsonrpc(item,wallet_name=self.wallet_name) for item in payload]
81+
try:
82+
if not has_app_context() and self._app is not None:
83+
with self._app.app_context():
84+
result = [self.spectrum.jsonrpc(item,wallet_name=self.wallet_name, catch_exceptions=False) for item in payload]
85+
else:
86+
result = [self.spectrum.jsonrpc(item,wallet_name=self.wallet_name, catch_exceptions=False) for item in payload]
87+
return result
88+
89+
except ValueError as ve:
90+
mock_response = object()
91+
mock_response.status_code = 500
92+
mock_response.text =ve
93+
raise SpecterRpcError(
94+
f"Request error: {ve}", mock_response
95+
)
96+
except SpectrumRpcError as se:
97+
mock_response = object()
98+
mock_response.status_code = se.code
99+
mock_response.text =se.message
100+
raise SpecterRpcError(se.message, mock_response)
101+
84102

85103
def __repr__(self) -> str:
86104
return f"<BridgeRPC {self.spectrum}>"

src/cryptoadvance/spectrum/elsock.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import time
77
import threading
88
import sys
9-
from .util import SpectrumException, handle_exception
9+
from .util import FlaskThread, SpectrumException, handle_exception
1010

1111
# TODO: normal handling of ctrl+C interrupt
1212

@@ -33,16 +33,16 @@ def __init__(self, host="127.0.0.1", port=50001, use_ssl=False, callback=None, t
3333
self._requests = []
3434
self._notifications = []
3535
logger.info("Starting ElectrumSocket Threads ...")
36-
self._recv_thread = threading.Thread(target=self.recv_loop)
36+
self._recv_thread = FlaskThread(target=self.recv_loop)
3737
self._recv_thread.daemon = True
3838
self._recv_thread.start()
39-
self._write_thread = threading.Thread(target=self.write_loop)
39+
self._write_thread = FlaskThread(target=self.write_loop)
4040
self._write_thread.daemon = True
4141
self._write_thread.start()
42-
self._ping_thread = threading.Thread(target=self.ping_loop)
42+
self._ping_thread = FlaskThread(target=self.ping_loop)
4343
self._ping_thread.daemon = True
4444
self._ping_thread.start()
45-
self._notify_thread = threading.Thread(target=self.notify_loop)
45+
self._notify_thread = FlaskThread(target=self.notify_loop)
4646
self._notify_thread.daemon = True
4747
self._notify_thread.start()
4848
logger.info("Finished starting ElectrumSocket Threads")

src/cryptoadvance/spectrum/spectrum.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from decimal import Decimal
21
import json
32
import logging
43
import math
@@ -316,7 +315,7 @@ def get_wallet(self, wallet_name):
316315
raise RPCError(f"Requested wallet {wallet_name} does not exist or is not loaded", -18)
317316
return w
318317

319-
def jsonrpc(self, obj, wallet_name=None):
318+
def jsonrpc(self, obj, wallet_name=None, catch_exceptions=True):
320319
method = obj.get("method")
321320
id = obj.get("id", 0)
322321
params = obj.get("params", [])
@@ -345,9 +344,13 @@ def jsonrpc(self, obj, wallet_name=None):
345344
else:
346345
res = m(*args, **kwargs)
347346
except RPCError as e:
347+
if not catch_exceptions:
348+
raise e
348349
logger.error(f"FAIL method: {method} wallet: {wallet_name} args: {args} kwargs: {kwargs} exc {e}")
349350
return dict(result=None, error=e.to_dict(), id=id)
350351
except Exception as e:
352+
if not catch_exceptions:
353+
raise e
351354
logger.error(f"FAIL method: {method} wallet: {wallet_name} args: {args} kwargs: {kwargs} exc {e}")
352355
handle_exception(e)
353356
return dict(result=None, error={"code": -500, "message": str(e)}, id=id)

src/cryptoadvance/spectrum/util.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,13 @@ def sat_to_btc(sat):
2525
If we do it, also have a look at:
2626
https://github.com/relativisticelectron/specter-desktop/pull/3
2727
'''
28-
if not isinstance(sat, Decimal):
29-
sat = Decimal(sat)
30-
sat = sat or Decimal(0) # if None is passed
31-
return Decimal(round(sat * Decimal(1e-8), 8))
28+
sat = sat or 0 # if None is passed
29+
return round(sat * 1e-8, 8)
3230

3331

3432
def btc_to_sat(btc):
35-
if not isinstance(btc, Decimal):
36-
btc = Decimal(btc)
37-
btc = btc or Decimal(0) # if None is passed
38-
return round(btc * Decimal(1e8))
33+
btc = btc or 0 # if None is passed
34+
return round(btc * 1e8)
3935

4036
class SpectrumException(Exception):
4137
pass

tests/test_spectrum_rpc.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ def test_root(caplog,client):
1515
assert result.status_code == 200
1616
assert json.loads(result.data)["error"]["message"] == "Method not found (None)"
1717

18+
def test_unknownmethod(caplog, client):
19+
caplog.set_level(logging.INFO)
20+
caplog.set_level(logging.DEBUG, logger="cryptoadvance.spectrum")
21+
result = client.post("/", json={"method":"unknownmethod"})
22+
assert result.status_code == 200
23+
1824
def test_getmininginfo(caplog,client):
1925
caplog.set_level(logging.INFO)
2026
caplog.set_level(logging.DEBUG, logger="cryptoadvance.spectrum")

0 commit comments

Comments
 (0)