mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-12-24 06:59:36 -05:00
Merge #238
238: Bob error handling r=thomaseizinger a=da-kami Co-authored-by: Daniel Karzel <daniel@comit.network>
This commit is contained in:
commit
5ddf41721e
@ -128,8 +128,16 @@ async fn main() -> Result<()> {
|
||||
);
|
||||
let (swap, event_loop) = bob_factory.with_init_params(send_bitcoin).build().await?;
|
||||
|
||||
tokio::spawn(async move { event_loop.run().await });
|
||||
bob::run(swap).await?;
|
||||
let handle = tokio::spawn(async move { event_loop.run().await });
|
||||
let swap = bob::run(swap);
|
||||
tokio::select! {
|
||||
event_loop_result = handle => {
|
||||
event_loop_result??;
|
||||
},
|
||||
swap_result = swap => {
|
||||
swap_result?;
|
||||
}
|
||||
}
|
||||
}
|
||||
Command::History => {
|
||||
let mut table = Table::new();
|
||||
@ -169,9 +177,16 @@ async fn main() -> Result<()> {
|
||||
execution_params,
|
||||
);
|
||||
let (swap, event_loop) = bob_factory.build().await?;
|
||||
|
||||
tokio::spawn(async move { event_loop.run().await });
|
||||
bob::run(swap).await?;
|
||||
let handle = tokio::spawn(async move { event_loop.run().await });
|
||||
let swap = bob::run(swap);
|
||||
tokio::select! {
|
||||
event_loop_result = handle => {
|
||||
event_loop_result??;
|
||||
},
|
||||
swap_result = swap => {
|
||||
swap_result?;
|
||||
}
|
||||
}
|
||||
}
|
||||
Command::Cancel {
|
||||
swap_id,
|
||||
@ -201,27 +216,33 @@ async fn main() -> Result<()> {
|
||||
execution_params,
|
||||
);
|
||||
let (swap, event_loop) = bob_factory.build().await?;
|
||||
let handle = tokio::spawn(async move { event_loop.run().await });
|
||||
|
||||
tokio::spawn(async move { event_loop.run().await });
|
||||
|
||||
match bob::cancel(
|
||||
let cancel = bob::cancel(
|
||||
swap.swap_id,
|
||||
swap.state,
|
||||
swap.bitcoin_wallet,
|
||||
swap.db,
|
||||
force,
|
||||
)
|
||||
.await?
|
||||
{
|
||||
Ok((txid, _)) => {
|
||||
info!("Cancel transaction successfully published with id {}", txid)
|
||||
}
|
||||
Err(CancelError::CancelTimelockNotExpiredYet) => error!(
|
||||
"The Cancel Transaction cannot be published yet, \
|
||||
because the timelock has not expired. Please try again later."
|
||||
),
|
||||
Err(CancelError::CancelTxAlreadyPublished) => {
|
||||
warn!("The Cancel Transaction has already been published.")
|
||||
);
|
||||
|
||||
tokio::select! {
|
||||
event_loop_result = handle => {
|
||||
event_loop_result??;
|
||||
},
|
||||
cancel_result = cancel => {
|
||||
match cancel_result? {
|
||||
Ok((txid, _)) => {
|
||||
info!("Cancel transaction successfully published with id {}", txid)
|
||||
}
|
||||
Err(CancelError::CancelTimelockNotExpiredYet) => error!(
|
||||
"The Cancel Transaction cannot be published yet, \
|
||||
because the timelock has not expired. Please try again later."
|
||||
),
|
||||
Err(CancelError::CancelTxAlreadyPublished) => {
|
||||
warn!("The Cancel Transaction has already been published.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -254,19 +275,26 @@ async fn main() -> Result<()> {
|
||||
);
|
||||
let (swap, event_loop) = bob_factory.build().await?;
|
||||
|
||||
tokio::spawn(async move { event_loop.run().await });
|
||||
bob::refund(
|
||||
let handle = tokio::spawn(async move { event_loop.run().await });
|
||||
let refund = bob::refund(
|
||||
swap.swap_id,
|
||||
swap.state,
|
||||
swap.execution_params,
|
||||
swap.bitcoin_wallet,
|
||||
swap.db,
|
||||
force,
|
||||
)
|
||||
.await??;
|
||||
);
|
||||
|
||||
tokio::select! {
|
||||
event_loop_result = handle => {
|
||||
event_loop_result??;
|
||||
},
|
||||
refund_result = refund => {
|
||||
refund_result??;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -185,7 +185,7 @@ pub enum OutEvent {
|
||||
},
|
||||
EncryptedSignatureAcknowledged,
|
||||
ResponseSent, // Same variant is used for all messages as no processing is done
|
||||
Failure(Error),
|
||||
CommunicationError(Error),
|
||||
}
|
||||
|
||||
impl From<peer_tracker::OutEvent> for OutEvent {
|
||||
@ -203,7 +203,7 @@ impl From<quote_request::OutEvent> for OutEvent {
|
||||
use quote_request::OutEvent::*;
|
||||
match event {
|
||||
MsgReceived(quote_response) => OutEvent::QuoteResponse(quote_response),
|
||||
Failure(err) => OutEvent::Failure(err.context("Failure with Quote Request")),
|
||||
Failure(err) => OutEvent::CommunicationError(err.context("Failure with Quote Request")),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -225,7 +225,9 @@ impl From<transfer_proof::OutEvent> for OutEvent {
|
||||
channel,
|
||||
},
|
||||
AckSent => OutEvent::ResponseSent,
|
||||
Failure(err) => OutEvent::Failure(err.context("Failure with Transfer Proof")),
|
||||
Failure(err) => {
|
||||
OutEvent::CommunicationError(err.context("Failure with Transfer Proof"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -235,7 +237,9 @@ impl From<encrypted_signature::OutEvent> for OutEvent {
|
||||
use encrypted_signature::OutEvent::*;
|
||||
match event {
|
||||
Acknowledged => OutEvent::EncryptedSignatureAcknowledged,
|
||||
Failure(err) => OutEvent::Failure(err.context("Failure with Encrypted Signature")),
|
||||
Failure(err) => {
|
||||
OutEvent::CommunicationError(err.context("Failure with Encrypted Signature"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ use crate::{
|
||||
bob::{Behaviour, OutEvent, QuoteRequest, State0, State2},
|
||||
},
|
||||
};
|
||||
use anyhow::{anyhow, Result};
|
||||
use anyhow::{anyhow, bail, Result};
|
||||
use futures::FutureExt;
|
||||
use libp2p::{core::Multiaddr, PeerId};
|
||||
use std::sync::Arc;
|
||||
use std::{convert::Infallible, sync::Arc};
|
||||
use tokio::sync::mpsc::{Receiver, Sender};
|
||||
use tracing::{debug, error, info};
|
||||
|
||||
@ -167,7 +167,7 @@ impl EventLoop {
|
||||
Ok((event_loop, handle))
|
||||
}
|
||||
|
||||
pub async fn run(mut self) {
|
||||
pub async fn run(mut self) -> Result<Infallible> {
|
||||
loop {
|
||||
tokio::select! {
|
||||
swarm_event = self.swarm.next().fuse() => {
|
||||
@ -192,8 +192,8 @@ impl EventLoop {
|
||||
debug!("Alice acknowledged encrypted signature");
|
||||
}
|
||||
OutEvent::ResponseSent => {}
|
||||
OutEvent::Failure(err) => {
|
||||
error!("Communication error: {:#}", err)
|
||||
OutEvent::CommunicationError(err) => {
|
||||
bail!("Communication error: {:#}", err)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -9,6 +9,7 @@ use get_port::get_port;
|
||||
use libp2p::{core::Multiaddr, PeerId};
|
||||
use monero_harness::{image, Monero};
|
||||
use std::{
|
||||
convert::Infallible,
|
||||
path::{Path, PathBuf},
|
||||
sync::Arc,
|
||||
time::Duration,
|
||||
@ -67,7 +68,7 @@ impl BobParams {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct BobEventLoopJoinHandle(JoinHandle<()>);
|
||||
pub struct BobEventLoopJoinHandle(JoinHandle<Result<Infallible>>);
|
||||
|
||||
impl BobEventLoopJoinHandle {
|
||||
pub fn abort(&self) {
|
||||
|
Loading…
Reference in New Issue
Block a user