Drop futures dependency from lightning-block-sync

Some how I'd understood that `futures` had reasonable MSRV
guarantees (e.g. at least Debian stable), but apparently that isn't
actually the case, as they bumped it to upgrade to syn (with
apparently no actual features or bugfixes added as a result?) with
no minor version bump or any available alternative (unlike Tokio,
which does LTS releases).

Luckily its relatively easy to just drop the `futures` dependency -
it means a new connection for each request, which is annoying, but
certainly not the end of the world, and its easier than trying to
deal with pinning `futures`.

See https://github.com/rust-lang/futures-rs/pull/2733
This commit is contained in:
Matt Corallo 2023-03-30 18:33:04 +00:00
parent 783e8188a7
commit 6b55df93fb
3 changed files with 5 additions and 13 deletions

View file

@ -20,7 +20,6 @@ rpc-client = [ "serde_json", "chunked_transfer" ]
[dependencies]
bitcoin = "0.29.0"
lightning = { version = "0.0.114", path = "../lightning" }
futures-util = { version = "0.3" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde_json = { version = "1.0", optional = true }
chunked_transfer = { version = "1.4", optional = true }

View file

@ -7,15 +7,12 @@ use crate::http::{BinaryResponse, HttpEndpoint, HttpClient, JsonResponse};
use bitcoin::hash_types::BlockHash;
use bitcoin::hashes::hex::ToHex;
use futures_util::lock::Mutex;
use std::convert::TryFrom;
use std::convert::TryInto;
/// A simple REST client for requesting resources using HTTP `GET`.
pub struct RestClient {
endpoint: HttpEndpoint,
client: Mutex<HttpClient>,
}
impl RestClient {
@ -23,8 +20,7 @@ impl RestClient {
///
/// The endpoint should contain the REST path component (e.g., http://127.0.0.1:8332/rest).
pub fn new(endpoint: HttpEndpoint) -> std::io::Result<Self> {
let client = Mutex::new(HttpClient::connect(&endpoint)?);
Ok(Self { endpoint, client })
Ok(Self { endpoint })
}
/// Requests a resource encoded in `F` format and interpreted as type `T`.
@ -32,7 +28,8 @@ impl RestClient {
where F: TryFrom<Vec<u8>, Error = std::io::Error> + TryInto<T, Error = std::io::Error> {
let host = format!("{}:{}", self.endpoint.host(), self.endpoint.port());
let uri = format!("{}/{}", self.endpoint.path().trim_end_matches("/"), resource_path);
self.client.lock().await.get::<F>(&uri, &host).await?.try_into()
let mut client = HttpClient::connect(&self.endpoint)?;
client.get::<F>(&uri, &host).await?.try_into()
}
}

View file

@ -7,8 +7,6 @@ use crate::http::{HttpClient, HttpEndpoint, HttpError, JsonResponse};
use bitcoin::hash_types::BlockHash;
use bitcoin::hashes::hex::ToHex;
use futures_util::lock::Mutex;
use serde_json;
use std::convert::TryFrom;
@ -41,7 +39,6 @@ impl Error for RpcError {}
pub struct RpcClient {
basic_auth: String,
endpoint: HttpEndpoint,
client: Mutex<HttpClient>,
id: AtomicUsize,
}
@ -50,11 +47,9 @@ impl RpcClient {
/// credentials should be a base64 encoding of a user name and password joined by a colon, as is
/// required for HTTP basic access authentication.
pub fn new(credentials: &str, endpoint: HttpEndpoint) -> std::io::Result<Self> {
let client = Mutex::new(HttpClient::connect(&endpoint)?);
Ok(Self {
basic_auth: "Basic ".to_string() + credentials,
endpoint,
client,
id: AtomicUsize::new(0),
})
}
@ -73,7 +68,8 @@ impl RpcClient {
"id": &self.id.fetch_add(1, Ordering::AcqRel).to_string()
});
let mut response = match self.client.lock().await.post::<JsonResponse>(&uri, &host, &self.basic_auth, content).await {
let mut client = HttpClient::connect(&self.endpoint)?;
let mut response = match client.post::<JsonResponse>(&uri, &host, &self.basic_auth, content).await {
Ok(JsonResponse(response)) => response,
Err(e) if e.kind() == std::io::ErrorKind::Other => {
match e.get_ref().unwrap().downcast_ref::<HttpError>() {