From 2e1cb89fc6a4e9b79fc0e242416593cf5ef3b18a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Zatorski?= Date: Fri, 4 Sep 2026 13:31:33 +0200 Subject: [PATCH] Sygnal startu nagrywania idzie przez konsole, nie przez funkcje KAZDE nagranie konczylo sie bledem 412 "Start signal not received" po okolo minucie, przy poprawnie dzialajacym pokoju, szablonie osiagalnym po sieci Dockera i wlasciwych danych MinIO. Szablon wolal `window.START_RECORDING()`, czyli funkcje, ktorej nikt nigdy nie przypisywal. Byla zadeklarowana wylacznie w `declare global` jako opcjonalna, wiec warunek `tracks.length > 0 && window.START_RECORDING` byl ZAWSZE falszywy. Nawet gdyby nie byl, wywolanie funkcji niczego by nie dalo. Egress czyta **wyjscie konsoli przegladarki** i czeka na napis `START_RECORDING`. Dziala bez interfejsu, wiec konsola jest jedynym kanalem, ktorym strona moze cokolwiek powiedziec procesowi nadrzednemu. Mowi o tym dokumentacja LiveKit: "The recorder waits for the page to log START_RECORDING to the console". `console.log` nie jest tu wiec debugowaniem i nie wolno go usunac przy porzadkowaniu logow. Sprawdzone, ze napis przezywa minifikacje produkcyjna: minifikator Vite domyslnie nie wycina `console.log`. Powtorne wyslanie blokuje `useRef`, a nie kasowanie pola `window`. Diagnoza zajela dluzej, bo objaw myli: zadanie dociera do Egressu i przechodzi walidacje, kontener laczy sie z Redisem, szablon odpowiada HTTP 200, a Egress wchodzi do pokoju i widnieje na liscie uczestnikow. Wszystko poza jedna linia dziala. Co-Authored-By: Claude Opus 5 --- .../src/pages/public/RecordingTemplate.tsx | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/frontend/src/pages/public/RecordingTemplate.tsx b/frontend/src/pages/public/RecordingTemplate.tsx index 78a66ee..c24d9c5 100644 --- a/frontend/src/pages/public/RecordingTemplate.tsx +++ b/frontend/src/pages/public/RecordingTemplate.tsx @@ -1,7 +1,7 @@ import '@livekit/components-styles' import { GridLayout, LiveKitRoom, ParticipantTile, RoomAudioRenderer, useTracks } from '@livekit/components-react' import { RoomEvent, Track } from 'livekit-client' -import { useEffect } from 'react' +import { useEffect, useRef } from 'react' import { useSearchParams } from 'react-router-dom' /** @@ -22,25 +22,29 @@ import { useSearchParams } from 'react-router-dom' * Wlasny szablon lezy w naszym froncie i jest osiagalny po sieci Dockera, * wiec nagrywanie dziala tak samo w sieci zamknietej. * - * SYGNAL STARTU I KONCA + * SYGNAL STARTU IDZIE PRZEZ KONSOLE PRZEGLADARKI * ------------------------------------------------------------------------ - * Egress czeka na `window.START_RECORDING()`, zanim zacznie pisac plik, i na - * `window.END_RECORDING()`, zeby go domknac. **Bez wywolania pierwszej funkcji - * nagranie jest przerywane po kilkunastu sekundach** z bledem 412. Wolamy ja, - * gdy pokoj jest polaczony i sa w nim jakies sciezki: nagranie ma zaczynac sie - * od obrazu, a nie od pustej planszy. + * **Egress czyta konsole i szuka w niej napisu `START_RECORDING`.** Nie jest + * to wywolanie funkcji: przegladarka Egress dziala bez interfejsu, a jedynym + * kanalem, ktorym strona moze cokolwiek powiedziec procesowi nadrzednemu, jest + * wlasnie wyjscie konsoli. Analogicznie `END_RECORDING` domyka plik, choc przy + * zatrzymaniu z panelu robi to juz API (`StopEgress`). + * + * Wczesniejsza wersja wolala `window.START_RECORDING()`, czyli funkcje, ktorej + * nikt nigdy nie przypisywal: warunek `&& window.START_RECORDING` byl zawsze + * falszywy, a nawet gdyby nie byl, wywolanie funkcji niczego nie wypisuje. + * **Kazde nagranie konczylo sie przez to bledem 412 "Start signal not + * received"** po okolo minucie, przy poprawnie dzialajacym pokoju, szablonie + * osiagalnym po sieci Dockera i wlasciwych danych MinIO. Objaw myli, bo + * wszystko poza jedna linia dziala. + * + * Sygnal idzie, gdy pokoj jest polaczony i sa w nim jakies sciezki: nagranie + * ma zaczynac sie od obrazu, a nie od pustej planszy. * * Ta strona nie jest dla ludzi: nie ma tu panelu interakcji, banerow ani * paska akcji. Ma pokazywac obraz spotkania i nic wiecej. */ -declare global { - interface Window { - START_RECORDING?: () => void - END_RECORDING?: () => void - } -} - export function RecordingTemplate() { const [params] = useSearchParams() const url = params.get('url') ?? '' @@ -79,13 +83,16 @@ function RecordingStage() { * Sygnal startu wysylamy raz, gdy pojawi sie pierwsza sciezka. Wyslanie go * od razu po polaczeniu dawaloby kilka sekund czarnego obrazu na poczatku * kazdego nagrania. + * + * `console.log` nie jest tu debugowaniem, tylko JEDYNYM kanalem rozmowy + * z Egress: proces nadrzedny czyta wyjscie konsoli przegladarki i czeka + * dokladnie na ten napis. Nie usuwac przy porzadkowaniu logow. */ + const started = useRef(false) useEffect(() => { - if (tracks.length > 0 && window.START_RECORDING) { - window.START_RECORDING() - // wolamy tylko raz: powtorne wywolanie Egress ignoruje, ale nie ma - // powodu go zasypywac przy kazdej zmianie liczby sciezek - window.START_RECORDING = undefined + if (tracks.length > 0 && !started.current) { + started.current = true + console.log('START_RECORDING') } }, [tracks.length])