From 1e22e6c5cc1f222515a0da6dcf9e3052aae4c025 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 19 Apr 2024 17:02:02 -0400 Subject: [PATCH] jsonrpc: start reworking the jsonrpc We already are forced to use tokio, so at this point it is better that we use tokio and we leave our experimentation for another memont Link: https://github.com/vincenzopalazzo/lampo.rs/issues/182 Signed-off-by: Vincenzo Palazzo --- Cargo.lock | 672 +-------------------------------- Cargo.toml | 1 - lampo-jsonrpc/Cargo.toml | 2 +- lampo-jsonrpc/src/json_rpc2.rs | 2 +- lampo-jsonrpc/src/lib.rs | 267 +++---------- lampod-cli/Cargo.toml | 2 +- lampod-cli/src/main.rs | 22 +- 7 files changed, 88 insertions(+), 880 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a91a0873..b9b2579c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -103,12 +103,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "bdk" version = "1.0.0-alpha.7" @@ -135,27 +129,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bdk_esplora" -version = "0.9.0" -source = "git+https://github.com/bitcoindevkit/bdk.git#c01983d02aac6ee49c1bb34ade833e5d72bc8738" -dependencies = [ - "async-trait", - "bdk_chain", - "esplora-client", - "futures", -] - -[[package]] -name = "bdk_file_store" -version = "0.7.0" -source = "git+https://github.com/bitcoindevkit/bdk.git#c01983d02aac6ee49c1bb34ade833e5d72bc8738" -dependencies = [ - "bdk_chain", - "bincode", - "serde", -] - [[package]] name = "bech32" version = "0.8.1" @@ -168,15 +141,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip39" version = "2.0.0" @@ -194,7 +158,7 @@ version = "0.30.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1945a5048598e4189e239d3f809b19bdad4845c4b2ba400d304d2dcf26d2c462" dependencies = [ - "base64 0.13.1", + "base64", "bech32 0.9.1", "bitcoin-private", "bitcoin_hashes 0.12.0", @@ -212,12 +176,6 @@ dependencies = [ "bech32 0.8.1", ] -[[package]] -name = "bitcoin-internals" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f9997f8650dd818369931b5672a18dbef95324d0513aa99aae758de8ce86e5b" - [[package]] name = "bitcoin-private" version = "0.1.0" @@ -284,12 +242,6 @@ version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.5.0" @@ -375,31 +327,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - [[package]] name = "crossbeam-channel" version = "0.5.12" @@ -440,21 +367,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" -[[package]] -name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_logger" version = "0.10.2" @@ -481,20 +393,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "esplora-client" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb1f7f2489cce83bc3bd92784f9ba5271eeb6e729b975895fc541f78cbfcdca" -dependencies = [ - "bitcoin", - "bitcoin-internals", - "log", - "reqwest", - "serde", - "ureq", -] - [[package]] name = "fastrand" version = "2.0.1" @@ -510,37 +408,6 @@ dependencies = [ "libc", ] -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -669,25 +536,6 @@ dependencies = [ "url", ] -[[package]] -name = "h2" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.5", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -724,77 +572,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "idna" version = "0.5.0" @@ -842,12 +619,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - [[package]] name = "is-terminal" version = "0.4.12" @@ -889,24 +660,11 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8128f36b47411cd3f044be8c1f5cc0c9e24d1d1bfdc45f0a57897b32513053f2" dependencies = [ - "base64 0.13.1", + "base64", "serde", "serde_json", ] -[[package]] -name = "lampo-bdk-wallet" -version = "0.1.0" -dependencies = [ - "bdk", - "bdk_chain", - "bdk_esplora", - "bdk_file_store", - "lampo-common", - "log", - "tokio", -] - [[package]] name = "lampo-bitcoind" version = "0.1.0" @@ -995,9 +753,9 @@ dependencies = [ "lampo-common", "log", "ntest", - "popol", "serde", "serde_json", + "tokio", ] [[package]] @@ -1202,12 +960,6 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "miniscript" version = "10.0.0" @@ -1247,24 +999,6 @@ dependencies = [ "bitcoin", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "newline-converter" version = "0.2.2" @@ -1364,50 +1098,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -1455,15 +1145,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" -[[package]] -name = "popol" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953dd115cbe3b9d10340d47e6825a9700059a2fee12cee722975776caf3c531" -dependencies = [ - "libc", -] - [[package]] name = "port-selector" version = "0.1.6" @@ -1586,9 +1267,9 @@ checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -1609,65 +1290,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "reqwest" -version = "0.11.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-socks", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rustc-demangle" @@ -1688,61 +1313,12 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pki-types" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" - -[[package]] -name = "rustls-webpki" -version = "0.102.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "ryu" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -1770,29 +1346,6 @@ dependencies = [ "cc", ] -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "serde" version = "1.0.197" @@ -1825,18 +1378,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -1871,29 +1412,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "socks" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" -dependencies = [ - "byteorder", - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - [[package]] name = "syn" version = "1.0.109" @@ -1916,33 +1434,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" version = "3.10.1" @@ -2060,43 +1551,19 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "socket2", + "tokio-macros", "windows-sys 0.48.0", ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" -dependencies = [ - "either", - "futures-util", - "thiserror", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" +name = "tokio-macros" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", + "proc-macro2", + "quote", + "syn 2.0.52", ] [[package]] @@ -2116,37 +1583,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -2189,32 +1625,6 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "2.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" -dependencies = [ - "base64 0.21.7", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "rustls-webpki", - "serde", - "serde_json", - "socks", - "url", - "webpki-roots", -] - [[package]] name = "url" version = "2.5.0" @@ -2232,15 +1642,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2272,18 +1673,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -2313,25 +1702,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2495,16 +1865,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "zeroize" version = "1.7.0" diff --git a/Cargo.toml b/Cargo.toml index a383060d..67e3169b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ members = [ "lampo-client", "lampo-c-ffi", "lampo-core-wallet", - "lampo-bdk-wallet", "lampo-testing", "tests/tests", ] diff --git a/lampo-jsonrpc/Cargo.toml b/lampo-jsonrpc/Cargo.toml index 9158e44e..178088e2 100644 --- a/lampo-jsonrpc/Cargo.toml +++ b/lampo-jsonrpc/Cargo.toml @@ -13,7 +13,7 @@ readme = "README.md" [dependencies] serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } -popol = "2.2.0" +tokio = { version = "1", features = ["full"] } log = "0.4.17" [dev-dependencies] diff --git a/lampo-jsonrpc/src/json_rpc2.rs b/lampo-jsonrpc/src/json_rpc2.rs index 806ca77e..dad0db3a 100644 --- a/lampo-jsonrpc/src/json_rpc2.rs +++ b/lampo-jsonrpc/src/json_rpc2.rs @@ -56,7 +56,7 @@ pub struct Response { /// An error if there is one, or null pub error: Option, /// Identifier for this Request, which should match that of the request - pub id: Id, + pub id: Option, /// jsonrpc field, MUST be "2.0" pub jsonrpc: String, } diff --git a/lampo-jsonrpc/src/lib.rs b/lampo-jsonrpc/src/lib.rs index 37259389..7ad50d46 100644 --- a/lampo-jsonrpc/src/lib.rs +++ b/lampo-jsonrpc/src/lib.rs @@ -1,41 +1,31 @@ //! Full feature async JSON RPC 2.0 Server/client with a //! minimal dependencies footprint. use std::cell::{Cell, RefCell}; -use std::collections::{HashMap, VecDeque}; -use std::io::{self, ErrorKind}; -use std::io::{Read, Write}; -use std::os::unix::net::UnixListener; -use std::os::unix::net::{SocketAddr, UnixStream}; -use std::sync::{Arc, Mutex}; -use std::thread::JoinHandle; - -// FIXME: use mio for a better platform support. -use popol::{Sources, Timeout}; +use std::collections::HashMap; +use std::io; +use std::sync::Arc; + use serde_json::Value; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::{UnixListener, UnixStream}; pub mod command; pub mod errors; pub mod json_rpc2; -use command::Context; - +use crate::command::Context; use crate::errors::Error; use crate::json_rpc2::{Request, Response}; #[derive(Debug, Clone, PartialEq)] pub enum RPCEvent { Listening, - Connect(String), + Connect(i32), } pub struct JSONRPCv2 { socket_path: String, - sources: Sources, - socket: UnixListener, handler: Arc>, - // FIXME: should be not the name but the fd int as key? - pub(crate) conn: HashMap, - conn_queue: Mutex>>>>, } pub struct Handler { @@ -95,15 +85,9 @@ impl Handler { impl JSONRPCv2 { pub fn new(ctx: Arc>, path: &str) -> Result { - let listnet = UnixListener::bind(path)?; - let sources = Sources::::new(); Ok(Self { - sources, - socket: listnet, handler: Arc::new(Handler::new(ctx)), socket_path: path.to_owned(), - conn: HashMap::new(), - conn_queue: Mutex::new(Cell::new(HashMap::new())), }) } @@ -118,198 +102,67 @@ impl JSONRPCv2 { Ok(()) } - pub fn add_connection(&mut self, key: &SocketAddr, stream: UnixStream) { - let path = if let Some(path) = key.as_pathname() { - path.to_str().unwrap() - } else { - "unnamed" - }; - let res = stream.set_nonblocking(true); - debug_assert!(res.is_ok()); - let event = RPCEvent::Connect(path.to_string()); - self.sources.register(event, &stream, popol::interest::ALL); - self.conn.insert(path.to_owned(), stream); + #[allow(dead_code)] + fn ctx(&self) -> &T { + self.handler.ctx() } - pub fn send_resp(&self, key: String, resp: Response) { - let queue = self.conn_queue.lock().unwrap(); + async fn handle_connection(&self, mut socket: UnixStream) { + let mut buffer = vec![0; 1024]; - let mut conns = queue.take(); - log::debug!(target: "jsonrpc", "{:?}", conns); - if conns.contains_key(&key) { - let Some(queue) = conns.get_mut(&key) else { - panic!("queue not found"); + loop { + let n = match socket.read(&mut buffer).await { + Ok(n) if n == 0 => return, // Connection was closed + Ok(n) => n, + Err(_) => return, // An error occurred + }; + + let request: Request = match serde_json::from_slice(&buffer[..n]) { + Ok(req) => req, + Err(_) => continue, // Invalid request }; - queue.push_back(resp); - } else { - let mut q = VecDeque::new(); - q.push_back(resp); - conns.insert(key, q); - } - log::debug!(target: "jsonrpc", "{:?}", conns); - queue.set(conns); - } - pub fn pop_resp(&self, key: String) -> Option> { - let queue = self.conn_queue.lock().unwrap(); + let Some(rpc) = self.handler.run_callback(&request) else { + continue; + }; + let response = if let Ok(method) = rpc { + Response { + jsonrpc: "2.0".to_string(), + id: request.id, + result: Some(method), + error: None, + } + } else { + Response { + jsonrpc: "2.0".to_string(), + id: request.id, + result: None, + error: Some(rpc.err().unwrap().into()), + } + }; - let mut conns = queue.take(); - if !conns.contains_key(&key) { - return None; + let response = serde_json::to_vec(&response).unwrap(); + socket.write_all(&response).await.unwrap(); } - let Some(q) = conns.get_mut(&key) else { - return None; - }; - let resp = q.pop_front(); - queue.set(conns); - resp } - #[allow(dead_code)] - fn ctx(&self) -> &T { - self.handler.ctx() - } + pub async fn listen(self) -> io::Result<()> { + let path = self.socket_path.clone(); + loop { + let listnet = UnixListener::bind(path.clone())?; + let (socket, _) = listnet.accept().await?; - pub fn listen(mut self) -> io::Result<()> { - self.socket.set_nonblocking(true)?; - self.sources - .register(RPCEvent::Listening, &self.socket, popol::interest::READ); - - log::info!(target: "jsonrpc", "starting server on {}", self.socket_path); - let mut events = vec![]; - while !self.handler.stop.get() { - // Blocking while we are waiting new events! - self.sources.poll(&mut events, Timeout::Never)?; - - for mut event in events.drain(..) { - match &event.key { - RPCEvent::Listening => { - let conn = self.socket.accept(); - let Ok((stream, addr)) = conn else { - if let Err(err) = &conn { - if err.kind() == ErrorKind::WouldBlock { - break; - } - } - log::error!(target: "jsonrpc", "fail to accept the connection: {:?}", conn); - continue; - }; - log::trace!(target: "jsonrpc", "new connection to unix rpc socket"); - self.add_connection(&addr, stream); - } - RPCEvent::Connect(addr) => { - if event.is_hangup() { - break; - } - if event.is_error() { - log::error!(target: "jsonrpc", "an error occurs"); - continue; - } - - if event.is_invalid() { - log::info!(target: "jsonrpc", "event invalid, unregister event from the tracking one"); - self.sources.unregister(&event.key); - break; - } - - if event.is_readable() { - let Some(mut stream) = self.conn.get(addr) else { - log::error!(target: "jsonrpc", "connection not found `{addr}`"); - continue; - }; - let mut buff = String::new(); - if let Err(err) = stream.read_to_string(&mut buff) { - if err.kind() != ErrorKind::WouldBlock { - return Err(err); - } - log::info!(target: "jsonrpc", "blocking with err {:?}!", err); - } - if buff.is_empty() { - log::warn!(target: "jsonrpc", "buffer is empty"); - break; - } - let buff = buff.trim(); - log::info!(target: "jsonrpc", "buffer read {buff}"); - let requ: Request = - serde_json::from_str(&buff).map_err(|err| { - io::Error::new(io::ErrorKind::Other, format!("{err}")) - })?; - log::trace!(target: "jsonrpc", "request {:?}", requ); - let Some(resp) = self.handler.run_callback(&requ) else { - log::error!(target: "jsonrpc", "`{}` not found!", requ.method); - break; - }; - // FIXME; the id in the JSON RPC can be null! - let response = match resp { - Ok(result) => Response { - id: requ.id.clone().unwrap(), - jsonrpc: requ.jsonrpc.to_owned(), - result: Some(result), - error: None, - }, - Err(err) => Response { - result: None, - error: Some(err.into()), - id: requ.id.unwrap().clone(), - jsonrpc: requ.jsonrpc.clone(), - }, - }; - log::trace!(target: "jsonrpc", "send response: `{:?}`", response); - self.send_resp(addr.to_string(), response); - } - - if event.is_writable() { - let stream = self.conn.get(addr); - if stream.is_none() { - log::error!(target: "jsonrpc", "connection not found `{addr}`"); - continue; - }; - - let mut stream = stream.unwrap(); - let Some(resp) = self.pop_resp(addr.to_string()) else { - break; - }; - let buff = serde_json::to_string(&resp).unwrap(); - if let Err(err) = stream.write_all(buff.as_bytes()) { - if err.kind() != ErrorKind::WouldBlock { - return Err(err); - } - } - match stream.flush() { - // In this case, we've written all the data, we - // are no longer interested in writing to this - // socket. - Ok(()) => { - event.source.unset(popol::interest::WRITE); - } - // In this case, the write couldn't complete. Set - // our interest to `WRITE` to be notified when the - // socket is ready to write again. - Err(err) - if [io::ErrorKind::WouldBlock, io::ErrorKind::WriteZero] - .contains(&err.kind()) => - { - event.source.set(popol::interest::WRITE); - } - Err(err) => { - log::error!(target: "jsonrpc", "{}: Write error: {}", addr, err.to_string()); - } - } - stream.shutdown(std::net::Shutdown::Both)?; - } - } - } - } + self.handle_connection(socket).await; } Ok(()) } - pub fn handler(&self) -> Arc> { - self.handler.clone() + pub fn spawn(self) -> io::Result<()> { + unimplemented!() } - pub fn spawn(self) -> JoinHandle> { - std::thread::spawn(move || self.listen()) + pub fn handler(&self) -> Arc> { + self.handler.clone() } } @@ -345,9 +198,9 @@ mod tests { } } - #[test] + #[tokio::test] #[timeout(9000)] - fn register_rpc() { + async fn register_rpc() { logger::init("debug", None).unwrap(); let path = "/tmp/tmp.sock"; let _ = std::fs::remove_file(path); @@ -361,7 +214,7 @@ mod tests { assert!(res.is_ok(), "{:?}", res); let handler = server.handler(); - let worker = server.spawn(); + let _ = tokio::spawn(async { server.listen().await } ).await; let request = Request:: { id: Some(0.into()), jsonrpc: String::from_str("2.0").unwrap(), @@ -382,7 +235,7 @@ mod tests { log::info!(target: "client", "read answer from server"); let resp: Response = serde_json::from_reader(stream).unwrap(); log::info!(target: "client", "msg received: {:?}", resp); - assert_eq!(resp.id, request.id.unwrap()); + assert_eq!(resp.id, request.id); resp }); @@ -411,11 +264,9 @@ mod tests { }); let resp = client_worker.join().unwrap(); - assert_eq!(Id::Str("0".to_owned()), resp.id); + assert_eq!(Some(Id::Str("0".to_owned())), resp.id); let resp = client_worker2.join().unwrap(); - assert_eq!(Id::Str("1".to_owned()), resp.id); + assert_eq!(Some(Id::Str("1".to_owned())), resp.id); handler.stop(); - - let _ = worker.join(); } } diff --git a/lampod-cli/Cargo.toml b/lampod-cli/Cargo.toml index b193af48..c58596cb 100644 --- a/lampod-cli/Cargo.toml +++ b/lampod-cli/Cargo.toml @@ -11,7 +11,7 @@ lampo-bitcoind = { path = "../lampo-bitcoind" } lampo-jsonrpc = { path = "../lampo-jsonrpc" } lampo-core-wallet = { path = "../lampo-core-wallet" } -tokio = { version = "1.22.0", features = ["rt"] } +tokio = { version = "1.22.0", features = ["rt", "macros"] } lexopt = { version = "0.3" } filelock-rs = "0.1.0-beta.2" log = { version = "0.4", features = ["std"] } diff --git a/lampod-cli/src/main.rs b/lampod-cli/src/main.rs index daa8978b..6e371e6c 100644 --- a/lampod-cli/src/main.rs +++ b/lampod-cli/src/main.rs @@ -17,7 +17,6 @@ use lampo_common::conf::LampoConf; use lampo_common::error; use lampo_common::logger; use lampo_core_wallet::CoreWalletManager; -use lampo_jsonrpc::Handler; use lampo_jsonrpc::JSONRPCv2; use lampod::chain::WalletManager; @@ -38,15 +37,16 @@ use lampod::LampoDeamon; use crate::args::LampoCliArgs; -fn main() -> error::Result<()> { +#[tokio::main] +async fn main() -> error::Result<()> { log::debug!("Started!"); let args = args::parse_args()?; - run(args)?; + run(args).await?; Ok(()) } /// Return the root directory. -fn run(args: LampoCliArgs) -> error::Result<()> { +async fn run(args: LampoCliArgs) -> error::Result<()> { let mnemonic = args.mnemonic.clone(); // After this point the configuration is ready! @@ -136,7 +136,8 @@ fn run(args: LampoCliArgs) -> error::Result<()> { })?; let lampod = Arc::new(lampod); - let (jsorpc_worker, handler) = run_jsonrpc(lampod.clone()).unwrap(); + let rpc_server = run_jsonrpc(lampod.clone()).unwrap(); + let handler = rpc_server.handler(); rpc_handler.set_handler(handler.clone()); ctrlc::set_handler(move || { @@ -149,14 +150,12 @@ fn run(args: LampoCliArgs) -> error::Result<()> { let workder = lampod.listen().unwrap(); log::info!(target: "lampod-cli", "------------ Starting Server ------------"); - let _ = workder.join(); - let _ = jsorpc_worker.join().unwrap(); + let _ = tokio::spawn(async { workder.join() }).await; + rpc_server.listen().await?; Ok(()) } -fn run_jsonrpc( - lampod: Arc, -) -> error::Result<(JoinHandle>, Arc>)> { +fn run_jsonrpc(lampod: Arc) -> error::Result> { let socket_path = format!("{}/lampod.socket", lampod.root_path()); // we take the lock with the pid file so if we are at this point // we can delete the socket because there is no other process @@ -179,6 +178,5 @@ fn run_jsonrpc( server.add_rpc("keysend", json_keysend).unwrap(); server.add_rpc("fees", json_estimate_fees).unwrap(); server.add_rpc("close", json_close_channel).unwrap(); - let handler = server.handler(); - Ok((server.spawn(), handler)) + Ok(server) }