Skip to content

Commit 584cdce

Browse files
authored
Tor Socks Proxy (#7)
* tor socks lnd * cln and phoenix tor socks * update docs * rebrand LNI Remote * revert to reqwest blocking with timeout
1 parent 7e2ea72 commit 584cdce

File tree

16 files changed

+550
-468
lines changed

16 files changed

+550
-468
lines changed

bindings/lni_nodejs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ async-trait = "0.1"
1515
thiserror = "1.0"
1616
serde = { version = "1", features=["derive"] }
1717
serde_json = "1"
18-
reqwest = { version = "0.10", default-features = false, features = ["json", "rustls-tls", "blocking"] }
18+
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "blocking", "socks"] }
1919
tokio = { version = "1", features = ["full"] }
2020
napi = { version = "2.12.2", default-features = false, features = ["napi4", "tokio_rt", "async"] }
2121
napi-derive = "2.12.2"

bindings/lni_nodejs/index.d.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
export interface PhoenixdConfig {
77
url: string
88
password: string
9+
socks5Proxy?: string
10+
acceptInvalidCerts?: boolean
11+
httpTimeout?: number
912
}
1013
export interface PhoenixdNode {
11-
url: string
12-
password: string
14+
config: PhoenixdConfig
1315
}
1416
export interface Bolt11Resp {
1517
amountSat: number
@@ -26,18 +28,22 @@ export interface PhoenixPayInvoiceResp {
2628
export interface ClnConfig {
2729
url: string
2830
rune: string
31+
socks5Proxy?: string
32+
acceptInvalidCerts?: boolean
33+
httpTimeout?: number
2934
}
3035
export interface ClnNode {
31-
url: string
32-
rune: string
36+
config: ClnConfig
3337
}
3438
export interface LndConfig {
3539
url: string
3640
macaroon: string
41+
socks5Proxy?: string
42+
acceptInvalidCerts?: boolean
43+
httpTimeout?: number
3744
}
3845
export interface LndNode {
39-
url: string
40-
macaroon: string
46+
config: LndConfig
4147
}
4248
export const enum InvoiceType {
4349
Bolt11 = 'Bolt11',

bindings/lni_nodejs/main.mjs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,27 @@ async function lnd() {
132132
}
133133

134134
async function test() {
135+
// const config = {
136+
// url: process.env.PHOENIXD_URL,
137+
// password: process.env.PHOENIXD_PASSWORD,
138+
// test_hash: process.env.PHOENIXD_TEST_PAYMENT_HASH,
139+
// };
140+
// const node = new PhoenixdNode(config);
135141
const config = {
136-
url: process.env.PHOENIXD_URL,
137-
password: process.env.PHOENIXD_PASSWORD,
138-
test_hash: process.env.PHOENIXD_TEST_PAYMENT_HASH,
142+
url: process.env.LND_URL,
143+
macaroon: process.env.LND_MACAROON,
144+
socks5Proxy: "socks5h://127.0.0.1:9150",
145+
acceptInvalidCerts: true,
139146
};
140-
const node = new PhoenixdNode(config);
147+
const node = new LndNode(config);
148+
console.log("Node info:", await node.getInfo());
141149
}
142150

143151
async function main() {
144152
// phoenixd();
145-
cln();
153+
// cln();
146154
// lnd();
147-
// test();
155+
test();
148156
}
149157

150158
main();

bindings/lni_nodejs/src/cln.rs

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,13 @@ impl ClnNode {
2525

2626
#[napi]
2727
pub fn get_config(&self) -> ClnConfig {
28-
ClnConfig {
29-
url: self.inner.url.clone(),
30-
rune: self.inner.rune.clone(),
31-
}
28+
self.inner.clone()
3229
}
3330

3431
#[napi]
3532
pub async fn get_info(&self) -> napi::Result<lni::NodeInfo> {
36-
let info = lni::cln::api::get_info(self.inner.url.clone(), self.inner.rune.clone())
33+
let info = lni::cln::api::get_info(&self.inner)
34+
.await
3735
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
3836
Ok(info)
3937
}
@@ -44,8 +42,7 @@ impl ClnNode {
4442
params: CreateInvoiceParams,
4543
) -> napi::Result<lni::Transaction> {
4644
let txn = lni::cln::api::create_invoice(
47-
self.inner.url.clone(),
48-
self.inner.rune.clone(),
45+
&self.inner,
4946
params.invoice_type,
5047
params.amount_msats,
5148
params.offer,
@@ -63,27 +60,25 @@ impl ClnNode {
6360
&self,
6461
params: PayInvoiceParams,
6562
) -> Result<lni::types::PayInvoiceResponse> {
66-
let invoice =
67-
lni::cln::api::pay_invoice(self.inner.url.clone(), self.inner.rune.clone(), params)
68-
.await
69-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
63+
let invoice = lni::cln::api::pay_invoice(&self.inner, params)
64+
.await
65+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
7066
Ok(invoice)
7167
}
7268

7369
#[napi]
7470
pub async fn get_offer(&self, search: Option<String>) -> Result<lni::types::PayCode> {
75-
let offer = lni::cln::api::get_offer(self.inner.url.clone(), self.inner.rune.clone(), search)
71+
let offer = lni::cln::api::get_offer(&self.inner, search)
7672
.await
7773
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
7874
Ok(offer)
7975
}
8076

8177
#[napi]
8278
pub async fn list_offers(&self, search: Option<String>) -> Result<Vec<lni::types::PayCode>> {
83-
let offers =
84-
lni::cln::api::list_offers(self.inner.url.clone(), self.inner.rune.clone(), search)
85-
.await
86-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
79+
let offers = lni::cln::api::list_offers(&self.inner, search)
80+
.await
81+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
8782
Ok(offers)
8883
}
8984

@@ -94,28 +89,17 @@ impl ClnNode {
9489
amount_msats: i64,
9590
payer_note: Option<String>,
9691
) -> napi::Result<lni::PayInvoiceResponse> {
97-
let offer = lni::cln::api::pay_offer(
98-
self.inner.url.clone(),
99-
self.inner.rune.clone(),
100-
offer,
101-
amount_msats,
102-
payer_note,
103-
)
104-
.await
105-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
92+
let offer = lni::cln::api::pay_offer(&self.inner, offer, amount_msats, payer_note)
93+
.await
94+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
10695
Ok(offer)
10796
}
10897

10998
#[napi]
11099
pub async fn lookup_invoice(&self, payment_hash: String) -> napi::Result<lni::Transaction> {
111-
let txn = lni::cln::api::lookup_invoice(
112-
self.inner.url.clone(),
113-
self.inner.rune.clone(),
114-
Some(payment_hash),
115-
None,
116-
None,
117-
)
118-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
100+
let txn = lni::cln::api::lookup_invoice(&self.inner, Some(payment_hash), None, None)
101+
.await
102+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
119103
Ok(txn)
120104
}
121105

@@ -124,19 +108,15 @@ impl ClnNode {
124108
&self,
125109
params: lni::types::ListTransactionsParams,
126110
) -> napi::Result<Vec<lni::Transaction>> {
127-
let txns = lni::cln::api::list_transactions(
128-
self.inner.url.clone(),
129-
self.inner.rune.clone(),
130-
params.from,
131-
params.limit,
132-
)
133-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
111+
let txns = lni::cln::api::list_transactions(&self.inner, params.from, params.limit)
112+
.await
113+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
134114
Ok(txns)
135115
}
136116

137117
#[napi]
138118
pub async fn decode(&self, str: String) -> Result<String> {
139-
let decoded = lni::cln::api::decode(self.inner.url.clone(), self.inner.rune.clone(), str)
119+
let decoded = lni::cln::api::decode(&self.inner, str)
140120
.await
141121
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
142122
Ok(decoded)

bindings/lni_nodejs/src/lnd.rs

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@ impl LndNode {
2828
LndConfig {
2929
url: self.inner.url.clone(),
3030
macaroon: self.inner.macaroon.clone(),
31+
socks5_proxy: self.inner.socks5_proxy.clone(),
32+
accept_invalid_certs: self.inner.accept_invalid_certs,
33+
http_timeout: self.inner.http_timeout,
3134
}
3235
}
3336

3437
#[napi]
3538
pub async fn get_info(&self) -> napi::Result<lni::NodeInfo> {
36-
let info = lni::lnd::api::get_info(self.inner.url.clone(), self.inner.macaroon.clone())
39+
let info = lni::lnd::api::get_info(&self.inner)
40+
.await
3741
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
3842
Ok(info)
3943
}
@@ -43,10 +47,9 @@ impl LndNode {
4347
&self,
4448
params: CreateInvoiceParams,
4549
) -> napi::Result<lni::Transaction> {
46-
let txn =
47-
lni::lnd::api::create_invoice(self.inner.url.clone(), self.inner.macaroon.clone(), params)
48-
.await
49-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
50+
let txn = lni::lnd::api::create_invoice(&self.inner, params)
51+
.await
52+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
5053
Ok(txn)
5154
}
5255

@@ -55,28 +58,25 @@ impl LndNode {
5558
&self,
5659
params: PayInvoiceParams,
5760
) -> Result<lni::types::PayInvoiceResponse> {
58-
let invoice =
59-
lni::lnd::api::pay_invoice(self.inner.url.clone(), self.inner.macaroon.clone(), params)
60-
.await
61-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
61+
let invoice = lni::lnd::api::pay_invoice(&self.inner, params)
62+
.await
63+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
6264
Ok(invoice)
6365
}
6466

6567
#[napi]
6668
pub async fn get_offer(&self, search: Option<String>) -> Result<lni::types::PayCode> {
67-
let offer =
68-
lni::lnd::api::get_offer(self.inner.url.clone(), self.inner.macaroon.clone(), search)
69-
.await
70-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
69+
let offer = lni::lnd::api::get_offer(&self.inner, search)
70+
.await
71+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
7172
Ok(offer)
7273
}
7374

7475
#[napi]
7576
pub async fn list_offers(&self, search: Option<String>) -> Result<Vec<lni::types::PayCode>> {
76-
let offers =
77-
lni::lnd::api::list_offers(self.inner.url.clone(), self.inner.macaroon.clone(), search)
78-
.await
79-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
77+
let offers = lni::lnd::api::list_offers(&self.inner, search)
78+
.await
79+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
8080
Ok(offers)
8181
}
8282

@@ -87,26 +87,17 @@ impl LndNode {
8787
amount_msats: i64,
8888
payer_note: Option<String>,
8989
) -> napi::Result<lni::PayInvoiceResponse> {
90-
let offer = lni::lnd::api::pay_offer(
91-
self.inner.url.clone(),
92-
self.inner.macaroon.clone(),
93-
offer,
94-
amount_msats,
95-
payer_note,
96-
)
97-
.await
98-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
90+
let offer = lni::lnd::api::pay_offer(&self.inner, offer, amount_msats, payer_note)
91+
.await
92+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
9993
Ok(offer)
10094
}
10195

10296
#[napi]
10397
pub async fn lookup_invoice(&self, payment_hash: String) -> napi::Result<lni::Transaction> {
104-
let txn = lni::lnd::api::lookup_invoice(
105-
self.inner.url.clone(),
106-
self.inner.macaroon.clone(),
107-
Some(payment_hash),
108-
)
109-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
98+
let txn = lni::lnd::api::lookup_invoice(&self.inner, Some(payment_hash))
99+
.await
100+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
110101
Ok(txn)
111102
}
112103

@@ -115,19 +106,15 @@ impl LndNode {
115106
&self,
116107
params: lni::types::ListTransactionsParams,
117108
) -> napi::Result<Vec<lni::Transaction>> {
118-
let txns = lni::lnd::api::list_transactions(
119-
self.inner.url.clone(),
120-
self.inner.macaroon.clone(),
121-
params.from,
122-
params.limit,
123-
)
124-
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
109+
let txns = lni::lnd::api::list_transactions(&self.inner, params.from, params.limit)
110+
.await
111+
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
125112
Ok(txns)
126113
}
127114

128115
#[napi]
129116
pub async fn decode(&self, str: String) -> Result<String> {
130-
let decoded = lni::lnd::api::decode(self.inner.url.clone(), self.inner.macaroon.clone(), str)
117+
let decoded = lni::lnd::api::decode(&self.inner, str)
131118
.await
132119
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
133120
Ok(decoded)

0 commit comments

Comments
 (0)