diff --git a/android/src/services/audio.ts b/android/src/services/audio.ts index 65bdc30..b399b6f 100644 --- a/android/src/services/audio.ts +++ b/android/src/services/audio.ts @@ -1161,8 +1161,12 @@ class AudioService { // start, Chunks und end waren weg, die Bubble verschwand, und erst der // zweite Versuch klappte (da war der Reconnect durch). Nachtraeglich // gepuffertes Audio waere sinnlos: die STT-Sitzung laeuft in Echtzeit. - if (rvs.getState() !== 'connected') { - console.warn('[Audio] startStreamingRecording: RVS nicht verbunden (state=%s)', + // WICHTIG: den SOCKET fragen, nicht den gemerkten Zustand. Der kann + // faelschlich 'disconnected' sein, obwohl die Verbindung laeuft (Zombie) — + // dann wuerde hier jede Aufnahme abgelehnt, bevor sie beginnt, und der + // Nutzer kann gar nicht mehr sprechen. + if (!rvs.isSocketOpen()) { + console.warn('[Audio] startStreamingRecording: Socket nicht offen (state=%s)', rvs.getState()); return { requestId: '', ok: false, error: 'not-connected' }; } diff --git a/android/src/services/rvs.ts b/android/src/services/rvs.ts index 8889585..04f2728 100644 --- a/android/src/services/rvs.ts +++ b/android/src/services/rvs.ts @@ -130,6 +130,15 @@ class RVSConnection { this.setState('disconnected'); } + /** + * Ist die Verbindung WIRKLICH offen? Fragt den Socket selbst, nicht den + * gemerkten Zustand — der kann (z.B. nach einem Zombie) falsch sein. Wer + * davon abhaengig macht, ob ueberhaupt gesendet wird, muss das Echte wissen. + */ + isSocketOpen(): boolean { + return !!this.ws && this.ws.readyState === WebSocket.OPEN; + } + /** Nachricht an den RVS senden */ send(type: MessageType, payload: Record): void { if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {