Try workaround for generator autotrait bug

> Added a test that the handshake's version message matches specified fields, but the test does not compile, because rustc doesn't believe that the Box<dyn std::error::Error + Send + Sync + 'static> is 'static, and therefore isn't a Box<dyn std::error::Error + Send + Sync + 'static>. This manifests as being unable to spawn the connect_isolated task. From digging through Tokio issues I believe that this is an instance of rust-lang/rust#64552 .

Co-authored-by: Jane Lusby <jlusby42@gmail.com>
This commit is contained in:
Henry de Valence 2020-09-17 11:06:42 -07:00
parent 81e8195f68
commit 95f2463188
1 changed files with 9 additions and 6 deletions

View File

@ -35,14 +35,19 @@ use crate::{peer, BoxedStdError, Config, Request, Response};
/// connection allows this method to be used with clearnet or Tor transports.
///
/// - `user_agent`: a valid BIP14 user-agent, e.g., the empty string.
pub async fn connect_isolated(
pub fn connect_isolated(
conn: TcpStream,
user_agent: String,
) -> Result<BoxService<Request, Response, BoxedStdError>, BoxedStdError> {
) -> impl Future<
Output = Result<
BoxService<Request, Response, Box<dyn std::error::Error + Send + Sync + 'static>>,
Box<dyn std::error::Error + Send + Sync + 'static>,
>,
> {
let handshake = peer::Handshake::builder()
.with_config(Config::default())
.with_inbound_service(tower::service_fn(|_req| async move {
Ok::<Response, BoxedStdError>(Response::Nil)
Ok::<Response, Box<dyn std::error::Error + Send + Sync + 'static>>(Response::Nil)
}))
.with_user_agent(user_agent)
.finish()
@ -54,9 +59,7 @@ pub async fn connect_isolated(
// touch it at all.
let remote_addr = "0.0.0.0:8233".parse().unwrap();
let client = Oneshot::new(handshake, (conn, remote_addr)).await?;
Ok(BoxService::new(Wrapper(client)))
Oneshot::new(handshake, (conn, remote_addr)).map_ok(|client| BoxService::new(Wrapper(client)))
}
// This can be deleted when a new version of Tower with map_err is released.