Skip to content

Commit cbef644

Browse files
committed
Remove terminal_error method for sender and receiver
The public `terminal_error` method does not really serve a purpose as we now deal with errors directly in the state machine and don't really have an opportunity to call the `terminal_error` method where looking for an error wouldn't be sufficient.
1 parent ef1c15a commit cbef644

4 files changed

Lines changed: 90 additions & 37 deletions

File tree

payjoin-cli/src/app/v2/mod.rs

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -350,36 +350,57 @@ impl AppTrait for App {
350350
self.db.get_inactive_send_session_ids()?.into_iter().try_for_each(
351351
|(session_id, completed_at)| {
352352
let persister = SenderPersister::from_id(self.db.clone(), session_id.clone());
353-
if let Ok((sender_state, session_history)) = replay_sender_event_log(&persister) {
354-
let row = SessionHistoryRow {
355-
session_id,
356-
role: Role::Sender,
357-
status: sender_state,
358-
completed_at: Some(completed_at),
359-
error_message: session_history.terminal_error(),
360-
};
361-
send_rows.push(row);
362-
}
353+
match replay_sender_event_log(&persister) {
354+
Ok((sender_state, _)) => {
355+
let row = SessionHistoryRow {
356+
session_id,
357+
role: Role::Receiver,
358+
status: sender_state.clone(),
359+
completed_at: Some(completed_at),
360+
error_message: None,
361+
};
362+
send_rows.push(row);
363+
}
364+
Err(e) => {
365+
let row = SessionHistoryRow {
366+
session_id,
367+
role: Role::Receiver,
368+
status: SendSession::TerminalFailure,
369+
completed_at: Some(completed_at),
370+
error_message: Some(e.to_string()),
371+
};
372+
send_rows.push(row);
373+
}
374+
};
363375
Ok::<_, anyhow::Error>(())
364376
},
365377
)?;
366378

367379
self.db.get_inactive_recv_session_ids()?.into_iter().try_for_each(
368380
|(session_id, completed_at)| {
369381
let persister = ReceiverPersister::from_id(self.db.clone(), session_id.clone());
370-
if let Ok((receiver_state, session_history)) = replay_receiver_event_log(&persister)
371-
{
372-
let row = SessionHistoryRow {
373-
session_id,
374-
role: Role::Receiver,
375-
status: receiver_state,
376-
completed_at: Some(completed_at),
377-
error_message: session_history
378-
.terminal_error()
379-
.map(|e| e.to_json().to_string()),
380-
};
381-
recv_rows.push(row);
382-
}
382+
match replay_receiver_event_log(&persister) {
383+
Ok((receiver_state, _)) => {
384+
let row = SessionHistoryRow {
385+
session_id,
386+
role: Role::Receiver,
387+
status: receiver_state.clone(),
388+
completed_at: Some(completed_at),
389+
error_message: None,
390+
};
391+
recv_rows.push(row);
392+
}
393+
Err(e) => {
394+
let row = SessionHistoryRow {
395+
session_id,
396+
role: Role::Receiver,
397+
status: ReceiveSession::TerminalFailure,
398+
completed_at: Some(completed_at),
399+
error_message: Some(e.to_string()),
400+
};
401+
recv_rows.push(row);
402+
}
403+
};
383404
Ok::<_, anyhow::Error>(())
384405
},
385406
)?;

payjoin-ffi/src/receive/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ impl SessionHistory {
145145
/// Receiver session Payjoin URI
146146
pub fn pj_uri(&self) -> Arc<crate::PjUri> { Arc::new(self.0.pj_uri().into()) }
147147

148-
/// Terminal error from the session if present
149-
pub fn terminal_error(&self) -> Option<Arc<JsonReply>> {
150-
self.0.terminal_error().map(|reply| Arc::new(reply.into()))
148+
/// Psbt With fee contributions applied
149+
pub fn psbt_ready_for_signing(&self) -> Option<Arc<crate::Psbt>> {
150+
self.0.psbt_ready_for_signing().map(|psbt| Arc::new(psbt.into()))
151151
}
152152

153153
/// Fallback transaction from the session if present

payjoin/src/core/receive/v2/session.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,10 @@ impl SessionHistory {
9494
})
9595
}
9696

97-
/// Terminal error from the session if present
98-
/// TODO: This should replay the event log and return the actual error, not a JSON reply
99-
pub fn terminal_error(&self) -> Option<JsonReply> {
97+
/// Psbt with fee contributions applied
98+
pub fn psbt_ready_for_signing(&self) -> Option<bitcoin::Psbt> {
10099
self.events.iter().find_map(|event| match event {
101-
SessionEvent::GotReplyableError(reply) => Some(reply.clone()),
100+
SessionEvent::AppliedFeeRange(psbt_context) => Some(psbt_context.payjoin_psbt.clone()),
102101
_ => None,
103102
})
104103
}

payjoin/src/core/send/v2/session.rs

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,6 @@ impl SessionHistory {
9191
_ => SessionStatus::Active,
9292
}
9393
}
94-
95-
pub fn terminal_error(&self) -> Option<String> {
96-
self.events.iter().find_map(|event| match event {
97-
SessionEvent::Closed(SessionOutcome::Failure) => None,
98-
_ => None,
99-
})
100-
}
10194
}
10295

10396
/// Represents the status of a session that can be inferred from the information in the session
@@ -215,13 +208,53 @@ mod tests {
215208
persister.save_event(event).expect("In memory persister shouldn't fail");
216209
}
217210

211+
<<<<<<< HEAD
218212
let (sender, session_history) =
219213
replay_event_log(&persister).expect("In memory persister shouldn't fail");
220214
assert_eq!(sender, test.expected_sender_state);
221215
assert_eq!(session_history.fallback_tx(), test.expected_session_history.fallback_tx);
222216
assert_eq!(*session_history.pj_param(), test.expected_session_history.pj_param);
223217
assert_eq!(session_history.status(), test.expected_session_history.expected_status);
224218
assert_eq!(session_history.terminal_error(), test.expected_error);
219+
=======
220+
let session = match replay_event_log(&persister) {
221+
Ok((sender_state, session_history)) => SessionHistoryTest {
222+
events: session_history.events.clone(),
223+
expected_session_history: SessionHistoryExpectedOutcome {
224+
fallback_tx: session_history.fallback_tx(),
225+
pj_param: session_history.pj_param().to_owned(),
226+
},
227+
expected_sender_state: sender_state.clone(),
228+
expected_error: None,
229+
},
230+
Err(e) => SessionHistoryTest {
231+
events: vec![],
232+
expected_session_history: SessionHistoryExpectedOutcome {
233+
fallback_tx: test.expected_session_history.fallback_tx.clone(),
234+
pj_param: test.expected_session_history.pj_param.clone(),
235+
},
236+
expected_sender_state: SendSession::TerminalFailure,
237+
expected_error: Some(e.to_string()),
238+
},
239+
};
240+
241+
assert_eq!(session.expected_sender_state, test.expected_sender_state);
242+
assert_eq!(
243+
session.expected_session_history.fallback_tx,
244+
test.expected_session_history.fallback_tx
245+
);
246+
assert_eq!(
247+
session.expected_session_history.pj_param,
248+
test.expected_session_history.pj_param
249+
);
250+
assert_eq!(
251+
session.events.iter().find_map(|event| match event {
252+
SessionEvent::SessionInvalid(error) => Some(error.clone()),
253+
_ => None,
254+
}),
255+
test.expected_error
256+
);
257+
>>>>>>> 70daf91a (Remove terminal_error method for sender and receiver)
225258
}
226259

227260
#[test]

0 commit comments

Comments
 (0)