use-audio-capture
Version:
🎙️ A lightweight React hook for audio recording using native Web APIs (MediaRecorder, getUserMedia). Start, stop, pause, resume audio recordings with customizable callbacks. Perfect for voice notes, interviews, podcasts, and real-time audio processing in
2 lines (1 loc) • 2.44 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react");function m(e,i){if(!e)throw new Error(i)}function g(e){return e instanceof Error}const y=e=>{const i=u.useRef([]),d=u.useRef(null),c=u.useRef(null),l=u.useCallback(async()=>{if(typeof window>"u")return;m(navigator.mediaDevices,"MediaDevices not supported");const a=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1});d.current=a;const t=new MediaRecorder(a);t.onstart=async n=>{var r;(r=e==null?void 0:e.onStart)==null||r.call(e,n,{mediaStream:a})},t.onstop=n=>{var r;(r=e==null?void 0:e.onStop)==null||r.call(e,n,i.current,{mediaStream:a})},t.onpause=n=>{var r;(r=e==null?void 0:e.onPause)==null||r.call(e,n,i.current,{mediaStream:a})},t.onerror=n=>{var r;(r=e==null?void 0:e.onError)==null||r.call(e,n,{mediaStream:a,error:new Error("An error occurred while recording")})},t.onresume=n=>{var r;(r=e==null?void 0:e.onResume)==null||r.call(e,n,i.current,{mediaStream:a})},t.ondataavailable=async n=>{var r;i.current.push(n.data),(r=e==null?void 0:e.onChunk)==null||r.call(e,n,{mediaStream:a})},c.current=t},[e]),w=u.useCallback(async()=>{var a,t;try{if(((a=c.current)==null?void 0:a.state)==="recording")return;i.current=[],await l(),m(c.current,"MediaRecorder not created"),c.current.start(500)}catch(n){const r=g(n)?n.message:"Something went wrong during recording";(t=e==null?void 0:e.onError)==null||t.call(e,new Event(r),{error:n,mediaStream:d.current})}},[e,l]),S=u.useCallback(async()=>{var a,t;try{m(c.current,"MediaRecorder not created"),c.current.stop(),(a=d.current)==null||a.getAudioTracks().forEach(n=>n.stop())}catch(n){const r=g(n)?n.message:"Something went wrong during stopping recording";(t=e==null?void 0:e.onError)==null||t.call(e,new Event(r),{error:n,mediaStream:d.current})}},[e]),f=u.useCallback(async()=>{var a;try{m(c.current,"MediaRecorder not created"),c.current.pause()}catch(t){const n=g(t)?t.message:"Something went wrong during pausing recording";(a=e==null?void 0:e.onError)==null||a.call(e,new Event(n),{error:t,mediaStream:d.current})}},[e]),h=u.useCallback(async()=>{var a;try{m(c.current,"MediaRecorder not created"),c.current.resume()}catch(t){const n=g(t)?t.message:"Something went wrong during resuming recording";(a=e==null?void 0:e.onError)==null||a.call(e,new Event(n),{error:t,mediaStream:d.current})}},[e]);return{start:w,stop:S,pause:f,resume:h}};exports.useAudioCapture=y;