From 87755b9c58ef53b45185674fabc3a23723a2a61c Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 2 Oct 2026 01:24:57 +0200 Subject: [PATCH] fix(app): Aufnahme-Sperre fragt den Socket statt den gemerkten Zustand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beweis aus app.log 02.10 01:22: beim Aufnehmen fehlte 'bg.start slot=rec' — die Aufnahme wurde abgelehnt, BEVOR sie begann. Ursache ist die in 10e7faa eingefuehrte Sperre 'ohne Verbindung nicht aufnehmen': sie prueft den gemerkten Zustand, und der steht wegen des Zombie-Bugs faelschlich auf 'disconnected', obwohl die Verbindung laeuft (TTS kam ja an). Ergebnis: Stefan konnte gar nicht mehr sprechen — die Sperre hat das Problem verschlimmert statt es zu verhindern. rvs.isSocketOpen() fragt jetzt ws.readyState direkt; audio.ts nutzt das. Damit ist die Sperre immun gegen falsche Zustandsmeldungen und blockt nur, wenn der Socket wirklich zu ist. tsc: 0 Fehler. Co-Authored-By: Claude Opus 4.8 --- android/src/services/audio.ts | 8 ++++++-- android/src/services/rvs.ts | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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) {