Sygnal startu nagrywania idzie przez konsole, nie przez funkcje
Deploy PROD / deploy (push) Successful in 25s
Deploy PROD / deploy (push) Successful in 25s
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user