tinyhumansai/openhuman · error
[meet-video-producer] ws ctor failed
Error message
[meet-video-producer] ws ctor failed
What it means
Constructing the WebSocket to the local frame consumer (ws://127.0.0.1:... meet video sink) threw synchronously — the new WebSocket(url) call itself failed, usually a malformed/unroutable URL or an environment where the constructor throws. The producer effect returns early: no frames are sent for this session and no ws handlers are installed.
Source
Thrown at app/src/features/meet/MascotFrameProducer.tsx:342
'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA==';
const keepAliveAudio = document.createElement('audio');
keepAliveAudio.muted = true;
keepAliveAudio.loop = true;
keepAliveAudio.autoplay = true;
keepAliveAudio.preload = 'auto';
keepAliveAudio.src = SILENT_WAV;
keepAliveAudio.style.display = 'none';
document.body.appendChild(keepAliveAudio);
void keepAliveAudio
.play()
.catch(err => console.warn('[meet-video-producer] silent audio play() failed', err));
const url = `ws://127.0.0.1:${session.port}`;
let ws: WebSocket;
try {
ws = new WebSocket(url);
} catch (err) {
console.warn('[meet-video-producer] ws ctor failed', err);
return;
}
ws.binaryType = 'arraybuffer';
wsRef.current = ws;
ws.onopen = () => {
wsReadyRef.current = true;
console.log('[meet-video-producer] ws connected', url);
};
ws.onclose = () => {
wsReadyRef.current = false;
console.log('[meet-video-producer] ws closed');
};
ws.onerror = err => {
console.warn('[meet-video-producer] ws error', err);
};
const intervalMs = Math.round(1000 / PRODUCER_FPS);
const workerSrc =View on GitHub (pinned to 7491200858)
Solutions
- Verify the URL in the adjacent log — the port comes from the meet session request; a stale port after session restart causes this
- Restart the meet session so the producer reconnects with a fresh URL
- Check that the local frame consumer process is listening and no firewall blocks loopback WebSocket connections
- If the constructor throws deterministically, inspect err for the browser's rejection reason (URL scheme/port validity)
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at app/src/features/meet/MascotFrameProducer.tsx:342 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/946d39c28f32c806.
Report an issue: GitHub.