Skip to content

Commit 8d2aaf8

Browse files
swaptrvincenzopalazzo
authored andcommitted
feat(rpc): throw exception when cln returns an error
1 parent 8f94e62 commit 8d2aaf8

File tree

5 files changed

+60
-21
lines changed

5 files changed

+60
-21
lines changed

melos.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ scripts:
1313
select-package:
1414

1515
rpc_analyze:
16-
run: melos exec -c 1 --scope="rpc" -- "dart format --set-exit-if-changed . && dart analyze . --fatal-infos"
16+
run: melos exec -c 1 --scope="clightning_rpc" -- "dart format --set-exit-if-changed . && dart analyze . --fatal-infos"
1717
description: Run dart analyzer in a specific package.
1818

1919
plugin_analyze:
@@ -48,7 +48,7 @@ scripts:
4848

4949
rpc_test:
5050
description: Run tests in a specific package.
51-
run: melos exec --concurrency=2 --scope="rpc" -- "dart pub get && dart pub run test"
51+
run: melos exec --concurrency=2 --scope="clightning_rpc" -- "dart pub get && dart pub run test"
5252
env:
5353
MELOS_TEST: true
5454

packages/rpc/lib/src/clightning_rpc.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ class RPCClient implements LightningClient {
2222
}
2323

2424
@override
25-
void close() async {}
25+
void close() async {
26+
return;
27+
}
2628

2729
@override
2830
Future<T> call<R extends Serializable, T>(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class LNClientException implements Exception {
2+
String message;
3+
int code;
4+
String? data;
5+
6+
LNClientException(this.code, this.message, this.data);
7+
}

packages/rpc/lib/src/utils/unix_rpc_client.dart

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44

55
import 'package:cln_common/cln_common.dart';
66
import 'package:jsonrpc2/jsonrpc2.dart';
7+
import 'exception/ln_client_error.dart';
78

89
class UnixRPCClient extends ServerProxyBase {
910
UnixRPCClient(String path) : super(path);
@@ -17,12 +18,25 @@ class UnixRPCClient extends ServerProxyBase {
1718
var socket = await Socket.connect(address, 0);
1819
socket.add(utf8.encode(package));
1920

20-
socket.listen((event) {
21-
LogManager.getInstance.debug('Event received is ${utf8.decode(event)}');
22-
completer.complete(utf8.decode(event));
23-
},
21+
socket.listen(
22+
(event) {
23+
LogManager.getInstance
24+
.debug('Event received is ${utf8.decode(event)}');
25+
Map<String, dynamic> eventMap = jsonDecode(utf8.decode(event));
26+
if (eventMap.containsKey("error")) {
27+
var error = eventMap["error"];
28+
var exception = LNClientException(
29+
error["code"], error["message"], error["data"]);
30+
completer.completeError(exception);
31+
} else {
32+
completer.complete(utf8.decode(event));
33+
}
34+
},
2435
onDone: () => LogManager.getInstance.debug('End JSON RPC Stream'),
25-
onError: (err) => LogManager.getInstance.error(err));
36+
onError: (error) {
37+
LogManager.getInstance.error(error);
38+
completer.completeError(error);
39+
});
2640
return completer.future;
2741
}
2842
}
Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
11
import 'dart:io';
22
import 'package:test/test.dart';
33
import 'package:clightning_rpc/clightning_rpc.dart';
4+
import 'package:clightning_rpc/src/utils/exception/ln_client_error.dart';
45

56
void main() {
67
var env = Platform.environment;
78
var rpcPath = env['RPC_PATH']!;
9+
810
group('A group of test to connect the unix socket', () {
9-
setUp(() {});
11+
var client = RPCClient();
12+
client.connect(rpcPath);
1013

11-
test('Connection test', () {
12-
var client = RPCClient();
13-
client.connect(rpcPath);
14-
expect(client, isNotNull);
15-
client.close();
16-
});
14+
setUp(() {});
1715

1816
test('Call getinfo method test', () async {
19-
var client = RPCClient();
20-
client.connect(rpcPath);
2117
expect(client, isNotNull);
2218
var response = await client.simpleCall('getinfo');
2319
expect(response['network'], 'regtest');
2420
client.close();
2521
});
2622

27-
test('Call invoice method test', () async {
28-
var client = RPCClient();
29-
client.connect(rpcPath);
23+
test('Make a loop payment and looking for exception', () async {
3024
expect(client, isNotNull);
31-
// Docs of the parametes
25+
// Docs of the parameters
3226
// https://lightning.readthedocs.io/lightning-invoice.7.html
3327
var params = <String, dynamic>{};
3428
params['msatoshi'] = '100000msat';
@@ -43,5 +37,27 @@ void main() {
4337
await client.simpleCall('delinvoice', params: params);
4438
client.close();
4539
});
40+
41+
test('Pay invoice method test', () async {
42+
expect(client, isNotNull);
43+
44+
var params = <String, dynamic>{};
45+
params['msatoshi'] = '100000msat';
46+
params['label'] = 'from-dart-v2';
47+
params['description'] = 'This is a unit test';
48+
49+
var response = await client.simpleCall('invoice', params: params);
50+
params = <String, dynamic>{};
51+
params['bolt11'] = response["bolt11"];
52+
53+
expect(() async => await client.simpleCall('pay', params: params),
54+
throwsA(isA<LNClientException>()));
55+
56+
params = <String, dynamic>{};
57+
params['label'] = 'from-dart-v2';
58+
params['status'] = 'unpaid';
59+
await client.simpleCall('delinvoice', params: params);
60+
client.close();
61+
});
4662
});
4763
}

0 commit comments

Comments
 (0)