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