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

  1. Verify the URL in the adjacent log — the port comes from the meet session request; a stale port after session restart causes this
  2. Restart the meet session so the producer reconnects with a fresh URL
  3. Check that the local frame consumer process is listening and no firewall blocks loopback WebSocket connections
  4. 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.