{"version":3,"file":"react.cjs","sources":["../src/react.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { getMimeType } from './utils'\nimport { webmFixDuration } from './blob-fix'\nimport { SAMPLING_RATE } from './constants'\nimport { IOptions } from './types'\nexport function useAudioRecorder(options: IOptions = {}) {\n  const { mimeType = getMimeType(), sampleRate = SAMPLING_RATE } = options\n  const streamRef = useRef<MediaStream | null>(null)\n  const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n  const chunksRef = useRef<Blob[]>([])\n  const [recording, setRecording] = useState(false)\n  const [duration, setDuration] = useState(0)\n  const [recordedBlob, setRecordedBlob] = useState<Blob | null>(null)\n  const initRecorder = async () => {\n    if (!streamRef.current) {\n      streamRef.current = await navigator.mediaDevices.getUserMedia({\n        audio: true,\n      })\n    }\n  }\n  const [recordedAudioBuffer, setRecordedAudioBuffer] =\n    useState<AudioBuffer | null>(null)\n  const startRecording = async (completeCallback?: () => void) => {\n    setRecordedBlob(null)\n    const startTime = Date.now()\n    try {\n      if (!streamRef.current) {\n        await initRecorder()\n      }\n      const mediaRecorder = new MediaRecorder(streamRef.current!, {\n        mimeType,\n      })\n      mediaRecorderRef.current = mediaRecorder\n      mediaRecorder.addEventListener('dataavailable', async (event) => {\n        if (event.data.size > 0) {\n          chunksRef.current.push(event.data)\n        }\n        if (mediaRecorder.state === 'inactive') {\n          const duration = Date.now() - startTime\n          let blob = new Blob(chunksRef.current, {\n            type: mediaRecorder.mimeType,\n          })\n          if (getMimeType() === 'audio/webm') {\n            blob = await webmFixDuration(blob, duration, blob.type)\n          }\n          setRecordedBlob(blob)\n          if (!recordedBlob?.size) {\n            return\n          }\n          const fileReader = new FileReader()\n          fileReader.onloadend = async () => {\n            const audioCTX = new AudioContext({\n              sampleRate,\n            })\n            setRecordedAudioBuffer(\n              await audioCTX.decodeAudioData(fileReader.result as ArrayBuffer),\n            )\n            completeCallback?.()\n          }\n          fileReader.readAsArrayBuffer(recordedBlob)\n          chunksRef.current = []\n        }\n      })\n      mediaRecorder.start()\n      setRecording(true)\n    } catch (error) {\n      console.error('Error accessing microphone:', error)\n    }\n  }\n  const stopRecording = () => {\n    if (\n      mediaRecorderRef.current &&\n      mediaRecorderRef.current.state === 'recording'\n    ) {\n      mediaRecorderRef.current.stop() // set state to inactive\n      setDuration(0)\n      setRecording(false)\n    }\n  }\n\n  useEffect(() => {\n    const stream: MediaStream | null = null\n\n    if (recording) {\n      const timer = setInterval(() => {\n        setDuration((prevDuration) => prevDuration + 1)\n      }, 1000)\n\n      return () => {\n        clearInterval(timer)\n      }\n    }\n\n    return () => {\n      if (stream) {\n        ;(stream as unknown as MediaStream)\n          .getTracks()\n          .forEach((track) => track.stop())\n      }\n    }\n  }, [recording])\n  const handleToggleRecording = (completeCallback?: () => void) => {\n    if (recording) {\n      stopRecording()\n    } else {\n      startRecording(completeCallback)\n    }\n  }\n  return {\n    streamRef,\n    mediaRecorderRef,\n    recording,\n    duration,\n    recordedBlob,\n    recordedAudioBuffer,\n    chunksRef,\n    initRecorder,\n    startRecording,\n    stopRecording,\n    handleToggleRecording,\n  }\n}\n"],"names":["getMimeType","SAMPLING_RATE","useRef","useState","duration","webmFixDuration","useEffect"],"mappings":"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"}