tinyhumansai/openhuman · error

[meet-video-producer] ws error

Error message

[meet-video-producer] ws error

What it means

The mascot producer's WebSocket to the local frame consumer errored after successful construction (ws.onerror). This fires on connection-level failures — the local consumer refused/dropped the TCP connection or the handshake failed. wsReadyRef stays false (or resets), so pending frames are silently not delivered until the socket recovers or the session ends; onclose follows and logs 'ws closed'.

Source

Thrown at app/src/features/meet/MascotFrameProducer.tsx:356

    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 =
      'let t=null;self.onmessage=(e)=>{const d=e.data||{};' +
      "if(d.cmd==='start'){clearInterval(t);t=setInterval(()=>self.postMessage('tick'),d.intervalMs);}" +
      "else if(d.cmd==='stop'){clearInterval(t);}};";
    const blob = new Blob([workerSrc], { type: 'application/javascript' });
    const workerUrl = URL.createObjectURL(blob);
    const worker = new Worker(workerUrl);

    worker.onmessage = () => {
      void captureFrame();
    };
    worker.postMessage({ cmd: 'start', intervalMs });

    // Subscribe to the speak_pump's speaking-state edge events so the
    // mascot face toggles in sync with the audio participants hear. Done

View on GitHub (pinned to 7491200858)

Solutions

  1. Check whether 'ws connected' ever logged for this session — an error before open means the consumer was never reachable
  2. Confirm the local meet frame consumer process is running and listening on the logged port
  3. Loopback firewall rules or an already-bound port can cause handshake failures — verify with a local connection test
  4. Restart the meet session to re-create the producer and socket
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at app/src/features/meet/MascotFrameProducer.tsx:356 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/133c93098ea209fa. Report an issue: GitHub.