tonhowtf/omniget · error
[omnidisc] could not subscribe to call rings
Error message
[omnidisc] could not subscribe to call rings
What it means
During voice init, subscribing to the `omnidisc://dispatch` channel (call rings) via listen() can itself reject. Unlike the voice channel failure, this one is non-fatal: the warning is logged and init continues to fetch `omnidisc_voice_status`. Result: the session works but incoming-call rings are silently never delivered.
Solutions
- Retry the dispatch subscription with backoff instead of swallowing the failure.
- Verify the backend emits on `omnidisc://dispatch`; check the Rust setup/emit code for the exact topic string.
- Track a dispatchConnected flag and surface 'incoming calls unavailable' in the UI when false.
- Gate init on the Tauri runtime to avoid subscribe attempts outside the webview.
Example fix
// before
unlistenDispatch = await listen<DispatchPayload>("omnidisc://dispatch", ...);
// after
try {
unlistenDispatch = await listen<DispatchPayload>("omnidisc://dispatch", ...);
dispatchConnected = true;
} catch (e) {
dispatchConnected = false;
scheduleDispatchRetry();
} Defensive patterns
Strategy: retry
Validate before calling
if (!('__TAURI_INTERNALS__' in window)) { dispatchConnected = false; return; } Try / catch
try {
unlistenDispatch = await listen<DispatchPayload>("omnidisc://dispatch", onDispatch);
dispatchConnected = true;
} catch (e) {
dispatchConnected = false;
console.warn("[omnidisc] could not subscribe to call rings", errorText(e));
scheduleDispatchRetry();
} Prevention
- Track subscription success in a flag and retry failed subscriptions in the background.
- Confirm the backend emits on the exact `omnidisc://dispatch` topic.
- Surface degraded mode ('incoming calls unavailable') instead of failing silently.
- Gate init on the Tauri runtime to avoid futile subscribe attempts.
When it happens
Trigger: listen("omnidisc://dispatch") rejecting because the IPC/event layer is unavailable, the backend never registered that topic, or a prior listen teardown raced the new subscription.
Common situations: Partial backend build missing the dispatch emitter; init running in a non-Tauri test harness; event system briefly unavailable at startup so voice works but rings are lost until re-init.
Related errors
- [omnidisc] stream events subscribe failed
- [omnidisc] could not subscribe to voice events
- [omnidisc] call ring failed
- [omnidisc] voice event failed
- [sc-download-store] listen single failed
AI-assisted analysis of tonhowtf/omniget@8600b91f42 (2026-09-12).
Data as JSON: /api/errors/2f801ebb325552b6.
Report an issue: GitHub.
Appendix: source
Thrown at src/lib/stores/omnidisc-voice-store.svelte.ts:504
} catch (e) {
console.warn("[omnidisc] voice event failed", errorText(e));
}
});
} catch (e) {
initialized = false;
console.warn("[omnidisc] could not subscribe to voice events", errorText(e));
return;
}
try {
unlistenDispatch = await listen<DispatchPayload>("omnidisc://dispatch", (event) => {
try {
handleDispatch(event.payload);
} catch (e) {
console.warn("[omnidisc] call ring failed", errorText(e));
}
});
} catch (e) {
console.warn("[omnidisc] could not subscribe to call rings", errorText(e));
}
try {
applyStatus(await invoke<VoiceStatusWire>("omnidisc_voice_status"));
} catch {
return;
}
}
export function teardownVoice() {
if (unlisten) unlisten();
unlisten = null;
if (unlistenDispatch) unlistenDispatch();
unlistenDispatch = null;
initialized = false;
if (statsTimer) clearInterval(statsTimer);
statsTimer = null;
if (ringTimer) clearInterval(ringTimer);
ringTimer = null;View on GitHub (pinned to 8600b91f42)