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

  1. Retry the dispatch subscription with backoff instead of swallowing the failure.
  2. Verify the backend emits on `omnidisc://dispatch`; check the Rust setup/emit code for the exact topic string.
  3. Track a dispatchConnected flag and surface 'incoming calls unavailable' in the UI when false.
  4. 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

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


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)