{"record":{"id":"946d39c28f32c806","repo":"tinyhumansai/openhuman","slug":"meet-video-producer-ws-ctor-failed","errorCode":null,"errorMessage":"[meet-video-producer] ws ctor failed","messagePattern":"\\[meet-video-producer\\] ws ctor failed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/features/meet/MascotFrameProducer.tsx","lineNumber":342,"sourceCode":"      'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA==';\n    const keepAliveAudio = document.createElement('audio');\n    keepAliveAudio.muted = true;\n    keepAliveAudio.loop = true;\n    keepAliveAudio.autoplay = true;\n    keepAliveAudio.preload = 'auto';\n    keepAliveAudio.src = SILENT_WAV;\n    keepAliveAudio.style.display = 'none';\n    document.body.appendChild(keepAliveAudio);\n    void keepAliveAudio\n      .play()\n      .catch(err => console.warn('[meet-video-producer] silent audio play() failed', err));\n\n    const url = `ws://127.0.0.1:${session.port}`;\n    let ws: WebSocket;\n    try {\n      ws = new WebSocket(url);\n    } catch (err) {\n      console.warn('[meet-video-producer] ws ctor failed', err);\n      return;\n    }\n    ws.binaryType = 'arraybuffer';\n    wsRef.current = ws;\n    ws.onopen = () => {\n      wsReadyRef.current = true;\n      console.log('[meet-video-producer] ws connected', url);\n    };\n    ws.onclose = () => {\n      wsReadyRef.current = false;\n      console.log('[meet-video-producer] ws closed');\n    };\n    ws.onerror = err => {\n      console.warn('[meet-video-producer] ws error', err);\n    };\n\n    const intervalMs = Math.round(1000 / PRODUCER_FPS);\n    const workerSrc =","sourceCodeStart":324,"sourceCodeEnd":360,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/features/meet/MascotFrameProducer.tsx#L324-L360","documentation":"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.","triggerScenarios":"Thrown at app/src/features/meet/MascotFrameProducer.tsx:342 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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)"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}