Skip to content

Commit 8d368a5

Browse files
fix(listener): improve error handling in session lifecycle (#1924)
- Remove .unwrap() on SessionEvent::emit in ext.rs - treat as non-fatal - Don't treat Recorder's encode failures as fatal in post_stop - Don't treat UI-emit failures in ListenerActor as fatal - Make Listener's websocket tasks bail if sending ListenerMsg fails Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 41f0f76 commit 8d368a5

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

plugins/listener/src/actors/listener.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,14 @@ impl Actor for ListenerActor {
126126
crate::actors::ChannelMode::MicAndSpeaker => {}
127127
}
128128

129-
SessionEvent::StreamResponse {
129+
if let Err(error) = (SessionEvent::StreamResponse {
130130
session_id: state.args.session_id.clone(),
131131
response,
132+
})
133+
.emit(&state.args.app)
134+
{
135+
tracing::error!(?error, "stream_response_emit_failed");
132136
}
133-
.emit(&state.args.app)?;
134137
}
135138

136139
ListenerMsg::StreamStartFailed(error) => {
@@ -524,7 +527,10 @@ async fn process_stream<S, E>(
524527
response.set_channel_index(channel_idx, total_channels);
525528
}
526529

527-
let _ = myself.send_message(ListenerMsg::StreamResponse(response));
530+
if myself.send_message(ListenerMsg::StreamResponse(response)).is_err() {
531+
tracing::warn!("actor_gone_during_finalize");
532+
break;
533+
}
528534

529535
if received_from_finalize {
530536
tracing::info!(from_finalize = true, "break_from_finalize");
@@ -554,7 +560,10 @@ async fn process_stream<S, E>(
554560
response.set_channel_index(channel_idx, total_channels);
555561
}
556562

557-
let _ = myself.send_message(ListenerMsg::StreamResponse(response));
563+
if myself.send_message(ListenerMsg::StreamResponse(response)).is_err() {
564+
tracing::warn!("actor_gone_breaking_stream_loop");
565+
break;
566+
}
558567
}
559568
// Something went wrong while sending or receiving a websocket message. Should restart.
560569
Ok(Some(Err(e))) => {

plugins/listener/src/actors/recorder.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,17 +165,15 @@ impl Actor for RecorderActor {
165165
&st.wav_path,
166166
&temp_ogg_path,
167167
VorbisEncodeSettings::default(),
168-
)
169-
.map_err(into_actor_err)
170-
{
168+
) {
171169
Ok(_) => {
172170
std::fs::rename(&temp_ogg_path, &st.ogg_path)?;
173171
std::fs::remove_file(&st.wav_path)?;
174172
}
175173
Err(e) => {
176174
tracing::error!(error = ?e, "wav_to_ogg_failed_keeping_wav");
177175
let _ = std::fs::remove_file(&temp_ogg_path);
178-
return Err(e);
176+
// Keep WAV as a fallback, but don't cause an actor failure
179177
}
180178
}
181179
}

plugins/listener/src/ext.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,13 @@ impl<R: tauri::Runtime, T: tauri::Manager<R>> ListenerPluginExt<R> for T {
111111
guard.session_supervisor = Some(supervisor_ref);
112112
guard.supervisor_handle = Some(handle);
113113

114-
SessionEvent::RunningActive {
114+
if let Err(error) = (SessionEvent::RunningActive {
115115
session_id: params.session_id,
116-
}
116+
})
117117
.emit(&guard.app)
118-
.unwrap();
118+
{
119+
tracing::error!(?error, "failed_to_emit_running_active");
120+
}
119121

120122
tracing::info!("session_started");
121123
}
@@ -141,9 +143,9 @@ impl<R: tauri::Runtime, T: tauri::Manager<R>> ListenerPluginExt<R> for T {
141143
};
142144

143145
if let Some(session_id) = session_id.clone() {
144-
SessionEvent::Finalizing { session_id }
145-
.emit(&guard.app)
146-
.unwrap();
146+
if let Err(error) = (SessionEvent::Finalizing { session_id }).emit(&guard.app) {
147+
tracing::error!(?error, "failed_to_emit_finalizing");
148+
}
147149
}
148150

149151
if let Some(supervisor_cell) = guard.session_supervisor.take() {
@@ -160,9 +162,9 @@ impl<R: tauri::Runtime, T: tauri::Manager<R>> ListenerPluginExt<R> for T {
160162
}
161163

162164
if let Some(session_id) = session_id {
163-
SessionEvent::Inactive { session_id }
164-
.emit(&guard.app)
165-
.unwrap();
165+
if let Err(error) = (SessionEvent::Inactive { session_id }).emit(&guard.app) {
166+
tracing::error!(?error, "failed_to_emit_inactive");
167+
}
166168
}
167169

168170
tracing::info!("session_stopped");

0 commit comments

Comments
 (0)