{"version":3,"sources":["jsdelivr-header.js","/npm/@ricky0123/vad-react@0.0.36/dist/index.js"],"names":[],"mappings":"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","file":"/npm/@ricky0123/vad-react@0.0.36/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@ricky0123/vad-react@0.0.36/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useMicVAD = exports.getDefaultReactRealTimeVADOptions = exports.utils = void 0;\nconst vad_web_1 = require(\"@ricky0123/vad-web\");\nconst react_1 = require(\"react\");\nvar vad_web_2 = require(\"@ricky0123/vad-web\");\nObject.defineProperty(exports, \"utils\", { enumerable: true, get: function () { return vad_web_2.utils; } });\nconst defaultReactOptions = {\n    userSpeakingThreshold: 0.6,\n};\nconst getDefaultReactRealTimeVADOptions = (model) => {\n    return {\n        ...(0, vad_web_1.getDefaultRealTimeVADOptions)(model),\n        ...defaultReactOptions,\n    };\n};\nexports.getDefaultReactRealTimeVADOptions = getDefaultReactRealTimeVADOptions;\nfunction useOptions(options) {\n    const model = options.model ?? vad_web_1.DEFAULT_MODEL;\n    const fullOptions = {\n        ...(0, exports.getDefaultReactRealTimeVADOptions)(model),\n        ...options,\n    };\n    const reactOptions = {\n        userSpeakingThreshold: fullOptions.userSpeakingThreshold,\n    };\n    const vadOptions = {\n        positiveSpeechThreshold: fullOptions.positiveSpeechThreshold,\n        negativeSpeechThreshold: fullOptions.negativeSpeechThreshold,\n        redemptionMs: fullOptions.redemptionMs,\n        preSpeechPadMs: fullOptions.preSpeechPadMs,\n        minSpeechMs: fullOptions.minSpeechMs,\n        submitUserSpeechOnPause: fullOptions.submitUserSpeechOnPause,\n        onFrameProcessed: fullOptions.onFrameProcessed,\n        onVADMisfire: fullOptions.onVADMisfire,\n        onSpeechStart: fullOptions.onSpeechStart,\n        onSpeechEnd: fullOptions.onSpeechEnd,\n        onSpeechRealStart: fullOptions.onSpeechRealStart,\n        baseAssetPath: fullOptions.baseAssetPath,\n        onnxWASMBasePath: fullOptions.onnxWASMBasePath,\n        model: fullOptions.model,\n        workletOptions: fullOptions.workletOptions,\n        getStream: fullOptions.getStream,\n        pauseStream: fullOptions.pauseStream,\n        resumeStream: fullOptions.resumeStream,\n        startOnLoad: fullOptions.startOnLoad,\n        processorType: fullOptions.processorType,\n    };\n    if (fullOptions.ortConfig) {\n        vadOptions.ortConfig = fullOptions.ortConfig;\n    }\n    if (fullOptions.audioContext) {\n        vadOptions.audioContext = fullOptions.audioContext;\n    }\n    return [reactOptions, vadOptions];\n}\nfunction useMicVAD(options) {\n    const [reactOptions, vadOptions] = useOptions(options);\n    const model = options[\"model\"] ?? vad_web_1.DEFAULT_MODEL;\n    const [userSpeaking, updateUserSpeaking] = (0, react_1.useState)(false);\n    const [loading, setLoading] = (0, react_1.useState)(true);\n    const [errored, setErrored] = (0, react_1.useState)(false);\n    const [listening, setListening] = (0, react_1.useState)(false);\n    const [vad, setVAD] = (0, react_1.useState)(null);\n    // Use refs to store the latest callbacks so they can be called without recreating the VAD\n    const onFrameProcessedRef = (0, react_1.useRef)(vadOptions.onFrameProcessed);\n    const onSpeechEndRef = (0, react_1.useRef)(vadOptions.onSpeechEnd);\n    const onSpeechStartRef = (0, react_1.useRef)(vadOptions.onSpeechStart);\n    const onSpeechRealStartRef = (0, react_1.useRef)(vadOptions.onSpeechRealStart);\n    const onVADMisfireRef = (0, react_1.useRef)(vadOptions.onVADMisfire);\n    const getStreamRef = (0, react_1.useRef)(vadOptions.getStream);\n    // Update refs when callbacks change\n    (0, react_1.useEffect)(() => {\n        onFrameProcessedRef.current = vadOptions.onFrameProcessed;\n        onSpeechEndRef.current = vadOptions.onSpeechEnd;\n        onSpeechStartRef.current = vadOptions.onSpeechStart;\n        onSpeechRealStartRef.current = vadOptions.onSpeechRealStart;\n        onVADMisfireRef.current = vadOptions.onVADMisfire;\n    }, [\n        vadOptions.onFrameProcessed,\n        vadOptions.onSpeechEnd,\n        vadOptions.onSpeechStart,\n        vadOptions.onSpeechRealStart,\n        vadOptions.onVADMisfire,\n    ]);\n    // Update getStream ref - this is the key fix!\n    (0, react_1.useEffect)(() => {\n        getStreamRef.current = vadOptions.getStream;\n    }, [vadOptions.getStream]);\n    // Serialize getStream function to detect changes\n    // We use a simple approach: convert function to string\n    const getStreamKey = vadOptions.getStream.toString();\n    (0, react_1.useEffect)(() => {\n        let myvad = null;\n        let canceled = false;\n        const setup = async () => {\n            try {\n                setLoading(true);\n                setErrored(false);\n                // Create VAD options with stable callback wrappers\n                const finalVadOptions = {\n                    ...vadOptions,\n                    onFrameProcessed: (probs, frame) => {\n                        const isSpeaking = probs.isSpeech > reactOptions.userSpeakingThreshold;\n                        updateUserSpeaking(isSpeaking);\n                        void onFrameProcessedRef.current(probs, frame);\n                    },\n                    onSpeechEnd: (audio) => {\n                        void onSpeechEndRef.current(audio);\n                    },\n                    onSpeechStart: () => {\n                        void onSpeechStartRef.current();\n                    },\n                    onSpeechRealStart: () => {\n                        void onSpeechRealStartRef.current();\n                    },\n                    onVADMisfire: () => {\n                        void onVADMisfireRef.current();\n                    },\n                    getStream: () => {\n                        return getStreamRef.current();\n                    },\n                };\n                myvad = await vad_web_1.MicVAD.new(finalVadOptions);\n                if (canceled) {\n                    await myvad.destroy();\n                    return;\n                }\n                setVAD(myvad);\n                if (vadOptions.startOnLoad) {\n                    await myvad.start();\n                    setListening(true);\n                }\n                setLoading(false);\n            }\n            catch (e) {\n                setLoading(false);\n                if (e instanceof Error) {\n                    setErrored(e.message);\n                }\n                else {\n                    setErrored(String(e));\n                }\n            }\n        };\n        setup().catch(() => {\n            // Error already handled in setup function\n        });\n        return function cleanUp() {\n            canceled = true;\n            if (myvad) {\n                void myvad.destroy();\n            }\n            if (!loading && !errored) {\n                setListening(false);\n            }\n        };\n    }, [getStreamKey, model]); // Recreate when getStream changes or model changes\n    const pause = (0, react_1.useCallback)(async () => {\n        if (!loading && !errored) {\n            await vad?.pause();\n            setListening(false);\n        }\n    }, [loading, errored, vad]);\n    const start = (0, react_1.useCallback)(async () => {\n        if (!loading && !errored) {\n            await vad?.start();\n            setListening(true);\n        }\n    }, [loading, errored, vad]);\n    const toggle = (0, react_1.useCallback)(async () => {\n        if (listening) {\n            await pause();\n        }\n        else {\n            await start();\n        }\n    }, [listening, pause, start]);\n    return {\n        listening,\n        errored,\n        loading,\n        userSpeaking,\n        pause,\n        start,\n        toggle,\n    };\n}\nexports.useMicVAD = useMicVAD;\n"]}