{"version":3,"file":"react.mjs","sources":["../src/mp3worker/WorkerEncoder.js","../src/Timer.js","../src/utils.js","../src/AudioRecorder.js","../src/react.js"],"sourcesContent":["let workerStates = {\n\tINACTIVE : 0,\n\tLOADING : 1,\n\tREADY : 2,\n\tERROR : 3\n}\n\nlet worker = null;\nlet workerState = workerStates.INACTIVE;\nlet workerStateChangeCallbacks = [];\nlet jobCallbacks = {};\n\nfunction uuidv4() { // https://stackoverflow.com/a/2117523\n\treturn ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>\n\t\t(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n\t);\n}\n\nfunction notifyWorkerState(newState) {\n\tworkerState = newState;\n\n\tfor (let callback of workerStateChangeCallbacks) {\n\t\tcallback();\n\t}\n\n\tworkerStateChangeCallbacks = [];\n}\n\n// This hack required to load worker from another domain (e.g. a CDN)\n// https://stackoverflow.com/a/62914052\nfunction getWorkerCrossDomainURL(url) {\n\tconst content = `importScripts(\"${url}\");`;\n\treturn URL.createObjectURL(new Blob([content], {type : \"text/javascript\"}));\n}\n\nfunction loadWorker(workerUrl) {\n\tif (/^https?:\\/\\//.test(workerUrl)) { // Is it an absolute URL? Then consider it cross domain.\n\t\tworkerUrl = getWorkerCrossDomainURL(workerUrl);\n\t}\n\n\tworker = new Worker(workerUrl);\n\tworkerState = workerStates.LOADING;\n\n\tworker.onmessage = (event) => {\n\t\tswitch (event.data.message) {\n\t\t\tcase \"ready\":\n\t\t\t\tnotifyWorkerState(workerStates.READY);\n\t\t\t\tbreak;\n\t\t\tcase \"encoded\":\n\t\t\t\tif (event.data.jobId in jobCallbacks) {\n\t\t\t\t\tjobCallbacks[event.data.jobId].onencoded(event.data.srcBufLen);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"data\":\n\t\t\t\tif (event.data.jobId in jobCallbacks) {\n\t\t\t\t\tjobCallbacks[event.data.jobId].ondataavailable(event.data.data);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"stopped\":\n\t\t\t\tif (event.data.jobId in jobCallbacks) {\n\t\t\t\t\tjobCallbacks[event.data.jobId].onstopped();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tworker.onerror = (event) => {\n\t\tconsole.error(\"mp3worker error. Is the worker URL correct?\");\n\t\tnotifyWorkerState(workerStates.ERROR);\n\t};\n}\n\n// Callbacks:\n// - ondataavailable\n// - onstopped\nexport default class WorkerEncoder {\n\tconstructor(options) {\n\t\tthis.jobId = uuidv4();\n\t\tthis.options = options;\n\t\tthis.queuedData = 0;\n\n\t\tjobCallbacks[this.jobId] = {\n\t\t\tonencoded : (srcBufLen) => {\n\t\t\t\tthis.queuedData -= srcBufLen;\n\t\t\t},\n\t\t\tondataavailable : (data) => {\n\t\t\t\tthis.ondataavailable && this.ondataavailable(data);\n\t\t\t},\n\t\t\tonstopped : () => {\n\t\t\t\tdelete jobCallbacks[this.jobId]; // Clean up\n\t\t\t\tthis.onstopped && this.onstopped();\n\t\t\t}\n\t\t};\n\t}\n\n\tstatic preload(workerUrl) {\n\t\tif (workerState == workerStates.INACTIVE || workerState == workerStates.ERROR) {\n\t\t\tloadWorker(workerUrl);\n\t\t}\n\t}\n\n\tstatic waitForWorker(workerUrl) {\n\t\tif (workerState == workerStates.READY) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\t// Worker loading already failed, try again...\n\t\t\tif (workerState == workerStates.INACTIVE || workerState == workerStates.ERROR) {\n\t\t\t\tloadWorker(workerUrl);\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tworkerStateChangeCallbacks.push(() => {\n\t\t\t\t\tif (workerState == workerStates.READY) {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet error = new Error(\"MP3 worker failed\");\n\t\t\t\t\t\terror.name = \"WorkerError\";\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tstart() {\n\t\tworker.postMessage({\n\t\t\tcommand : \"start\",\n\t\t\tjobId : this.jobId,\n\t\t\toptions : this.options\n\t\t});\n\t}\n\n\tsendData(buffers) {\n\t\t// Check for an empty buffer\n\t\tif (buffers && buffers.length > 0 && buffers[0].length > 0) {\n\t\t\tthis.queuedData += buffers[0].length;\n\t\t\t\n\t\t\tworker.postMessage({\n\t\t\t\tcommand : \"data\",\n\t\t\t\tjobId : this.jobId,\n\t\t\t\tbuffers : buffers\n\t\t\t});\n\t\t}\n\t}\n\t\n\t// Amount of data that is not yet encoded.\n\tgetQueuedDataLen() {\n\t\treturn this.queuedData;\n\t}\n\n\tstop() {\n\t\tworker.postMessage({\n\t\t\tcommand : \"stop\",\n\t\t\tjobId : this.jobId\n\t\t});\n\t}\n}\n","\nexport default class Timer {\n\tconstructor() {\n\t\tthis.reset();\n\t}\n\n\treset() {\n\t\tthis.startTime = null; // May be modified when resuming, so not the true start time.\n\t\tthis.stoppedTime = null;\n\t}\n\n\tstart() {\n\t\tif (!this.startTime) {\n\t\t\tthis.startTime = Date.now();\n\t\t}\n\n\t\tif (this.stoppedTime) {\n\t\t\t// Skip time forward by the time length we were stopped\n\t\t\tthis.startTime += Date.now() - this.stoppedTime;\n\t\t\tthis.stoppedTime = null;\n\t\t}\n\t}\n\t\n\tresetAndStart() {\n\t\tthis.reset();\n\t\tthis.start();\n\t}\n\n\tstop() {\n\t\tif (!this.stoppedTime) {\n\t\t\tthis.stoppedTime = Date.now();\n\t\t}\n\t}\n\n\tgetTime() {\n\t\tif (this.startTime) {\n\t\t\tif (this.stoppedTime) {\n\t\t\t\treturn this.stoppedTime - this.startTime;\n\t\t\t} else {\n\t\t\t\treturn Date.now() - this.startTime;\n\t\t\t}\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n","\nexport function stopStream(stream) {\n\tif (stream.getTracks) {\n\t\tstream.getTracks().forEach(track => track.stop());\n\t} else {\n\t\tstream.stop(); // Deprecated\n\t}\n}\n\n// https://stackoverflow.com/a/9039885\nexport function detectIOS() {\n\treturn [\n\t\t'iPad Simulator',\n\t\t'iPhone Simulator',\n\t\t'iPod Simulator',\n\t\t'iPad',\n\t\t'iPhone',\n\t\t'iPod'\n\t].includes(navigator.platform)\n\t\t// iPad on iOS 13 detection\n\t\t|| (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document);\n}\n\nexport function detectSafari() {\n\treturn /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n}\n","import WorkerEncoder from \"./mp3worker/WorkerEncoder.js\";\nimport Timer from \"./Timer.js\";\nimport {stopStream, detectIOS, detectSafari} from \"./utils.js\";\n\nfunction getAudioContextCtor() {\n\treturn window.AudioContext || window.webkitAudioContext;\n}\n// Don't use audio worklet on iOS or safari, fall back to ScriptProcessor.\n// There are issues with dropped incoming audio data after ~45 seconds. Thus, the resulting audio would be shorter and sped up / glitchy.\n// Curiously, these same issues are present if *not using* AudioWorklet on Chrome\nfunction isAudioWorkletSupported() {\n\treturn window.AudioWorklet && !detectIOS() && !detectSafari();\n}\n\nconst states = {\n\tSTOPPED : 0,\n\tRECORDING : 1,\n\tPAUSED : 2,\n\tSTARTING : 3,\n\tSTOPPING : 4\n};\n\nconst DEFAULT_OPTIONS = {\n\trecordingGain : 1,\n\tencoderBitRate : 96,\n\tstreaming : false,\n\tstreamBufferSize : 50000,\n\tforceScriptProcessor : false,\n\tconstraints : {\n\t\tchannelCount : 1,\n\t\tautoGainControl : true,\n\t\techoCancellation : true,\n\t\tnoiseSuppression : true\n\t}\n};\n\nlet workerUrl = null;\n\nfunction createCancelStartError() {\n\tlet error = new Error(\"AudioRecorder start cancelled by call to stop\");\n\terror.name = \"CancelStartError\";\n\treturn error;\n}\n\nfunction getNumberOfChannels(stream) {\n\tlet audioTracks = stream.getAudioTracks();\n\t\n\tif (audioTracks.length < 1) {\n\t\tthrow new Error(\"No audio tracks in user media stream\");\n\t}\n\t\n\tlet trackSettings = audioTracks[0].getSettings();\n\treturn \"channelCount\" in trackSettings ? trackSettings.channelCount : 1;\n}\n\n// Worklet does nothing more than pass the data out, to be actually encoded by a regular Web Worker\n// Previously this was rewritten to do the encoding within an AudioWorklet, and it was all very nice and clean\n// but apparently doing anything that uses much CPU in a AudioWorklet will cause glitches in some browsers.\n// So, it's best to do the encoding in a regular Web Worker.\nlet AUDIO_OUTPUT_MODULE_URL = null;\n\nfunction getAudioOutputModuleUrl() {\n\tif (AUDIO_OUTPUT_MODULE_URL) {\n\t\treturn AUDIO_OUTPUT_MODULE_URL;\n\t}\n\n\tAUDIO_OUTPUT_MODULE_URL = URL.createObjectURL(new Blob([`\n\t\tclass AudioOutputProcessor extends AudioWorkletProcessor {\n\t\t\tprocess(inputs, outputs) {\n\t\t\t\tthis.port.postMessage(inputs[0]);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tregisterProcessor(\"audio-output-processor\", AudioOutputProcessor);\n\t`], {type : \"application/javascript\"}));\n\n\treturn AUDIO_OUTPUT_MODULE_URL;\n}\n\n/*\nCallbacks:\n\tondataavailable\n\tonstart - called when recording successfully started\n\tonstop - called when all data finished encoding and was output\n\tonerror - error starting recording\n*/\nexport default class AudioRecorder {\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options\n\t\t};\n\n\t\tthis.state = states.STOPPED;\n\t\tthis.audioContext = null;\n\t\tthis.encoder = null;\n\t\tthis.encodedData = null;\n\t\tthis.stopPromiseResolve = null;\n\t\tthis.stopPromiseReject = null;\n\t\tthis.timer = new Timer();\n\t}\n\t\n\tstatic isRecordingSupported() {\n\t\treturn getAudioContextCtor() && navigator && navigator.mediaDevices && navigator.mediaDevices.getUserMedia;\n\t}\n\t\n\tstatic preload(_workerUrl) {\n\t\tworkerUrl = _workerUrl;\n\t\tWorkerEncoder.preload(workerUrl);\n\t}\n\t\n\t// Will we use AudioWorklet?\n\tuseAudioWorklet() {\n\t\treturn isAudioWorkletSupported() && !this.options.forceScriptProcessor;\n\t}\n\t\n\tcreateAndStartEncoder(numberOfChannels) {\n\t\tthis.encoder = new WorkerEncoder({\n\t\t\toriginalSampleRate : this.audioContext.sampleRate,\n\t\t\tnumberOfChannels : numberOfChannels,\n\t\t\tencoderBitRate : this.options.encoderBitRate,\n\t\t\tstreamBufferSize : this.options.streamBufferSize\n\t\t});\n\n\t\tthis.encoder.ondataavailable = (data) => {\n\t\t\tif (this.options.streaming) {\n\t\t\t\tthis.ondataavailable && this.ondataavailable(data);\n\t\t\t} else {\n\t\t\t\tthis.encodedData.push(data);\n\t\t\t}\n\t\t};\n\n\t\tthis.encoder.onstopped = () => {\n\t\t\tthis.state = states.STOPPED;\n\t\t\tlet mp3Blob = this.options.streaming ? undefined : new Blob(this.encodedData, {type : \"audio/mpeg\"});\n\t\t\tthis.onstop && this.onstop(mp3Blob);\n\t\t\tthis.stopPromiseResolve(mp3Blob);\n\t\t};\n\n\t\tthis.encoder.start();\n\t}\n\n\tcreateOutputNode(numberOfChannels) {\t\t\n\t\tif (this.useAudioWorklet()) {\n\t\t\tconsole.log(\"Using AudioWorklet\");\n\n\t\t\tthis.outputNode = new AudioWorkletNode(this.audioContext, \"audio-output-processor\", {numberOfOutputs : 0});\n\n\t\t\tthis.outputNode.port.onmessage = ({data}) => {\n\t\t\t\tif (this.state == states.RECORDING) {\n\t\t\t\t\tthis.encoder.sendData(data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tconsole.log(\"Using ScriptProcessorNode\");\n\t\t\t\n\t\t\tthis.outputNode = this.audioContext.createScriptProcessor(4096, numberOfChannels, numberOfChannels);\n\n\t\t\tthis.outputNode.connect(this.audioContext.destination);\n\t\t\tthis.outputNode.onaudioprocess = (event) => {\n\t\t\t\tif (this.state == states.RECORDING) {\n\t\t\t\t\tlet inputBuffer = event.inputBuffer;\n\t\t\t\t\tlet buffers = [];\n\n\t\t\t\t\tfor (let i = 0; i < inputBuffer.numberOfChannels; i ++) {\n\t\t\t\t\t\tbuffers.push(inputBuffer.getChannelData(i));\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.encoder.sendData(buffers);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\t\n\tcreateAudioNodes(numberOfChannels) {\n\t\tthis.createOutputNode(numberOfChannels);\n\t\t\n\t\tthis.recordingGainNode = this.audioContext.createGain();\n\t\tthis.setRecordingGain(this.options.recordingGain);\n\t\tthis.recordingGainNode.connect(this.outputNode);\n\n\t\tthis.sourceNode = this.audioContext.createMediaStreamSource(this.stream);\n\t\tthis.sourceNode.connect(this.recordingGainNode);\n\t}\n\n\tcleanupAudioNodes() {\n\t\tif (this.stream) {\n\t\t\tstopStream(this.stream);\n\t\t\tthis.stream = null;\n\t\t}\n\t\t\n\t\tif (this.useAudioWorklet()) {\n\t\t\tthis.outputNode && (this.outputNode.port.onmessage = null);\n\t\t} else {\n\t\t\tthis.outputNode && (this.outputNode.onaudioprocess = null);\n\t\t}\n\t\t\n\t\tthis.outputNode && this.outputNode.disconnect();\n\t\tthis.recordingGainNode && this.recordingGainNode.disconnect();\n\t\tthis.sourceNode && this.sourceNode.disconnect();\n\t\tthis.audioContext && this.audioContext.close();\n\t}\n\n\tsetRecordingGain(gain) {\n\t\tthis.options.recordingGain = gain;\n\n\t\tif (this.recordingGainNode) {\n\t\t\tthis.recordingGainNode.gain.setTargetAtTime(gain, this.audioContext.currentTime, 0.01);\n\t\t}\n\t}\n\t\n\tget time() {\n\t\treturn this.timer.getTime();\n\t}\n\t\n\t// Get the amount of data left to be encoded.\n\t// Useful to estimate if STOPPING state (encoding still ongoing) will last a while.\n\tgetEncodingQueueSize() {\n\t\treturn this.encoder ? this.encoder.getQueuedDataLen() : 0;\n\t}\n\t\n\t// Called after every \"await\" in start(), to check that stop wasn't called\n\t// and we should abandon starting\n\tstoppingCheck() {\n\t\tif (this.state == states.STOPPING) {\n\t\t\tthrow createCancelStartError();\n\t\t}\n\t}\n\n\tasync __start(paused) {\n\t\tif (this.state != states.STOPPED) {\n\t\t\tthrow new Error(\"Called start when not in stopped state\");\n\t\t}\n\t\t\n\t\tif (workerUrl == null) {\n\t\t\tthrow new Error(\"preload was not called on AudioRecorder\");\n\t\t}\n\t\t\n\t\tthis.state = states.STARTING;\n\t\tthis.encodedData = [];\n\t\tthis.stream = null;\n\t\t\n\t\ttry {\n\t\t\tawait WorkerEncoder.waitForWorker(workerUrl);\n\t\t\tthis.stoppingCheck();\n\t\t\t\n\t\t\t// If a constraint is set, pass them, otherwise just pass true\n\t\t\tlet constraints = Object.keys(this.options.constraints).length > 0 ? this.options.constraints : true;\n\t\t\t\n\t\t\tthis.stream = await navigator.mediaDevices.getUserMedia({audio : constraints});\n\t\t\tthis.stoppingCheck();\n\t\t\t\n\t\t\tconst _AudioContext = getAudioContextCtor();\n\t\t\tthis.audioContext = new _AudioContext();\n\t\t\t\n\t\t\tif (this.useAudioWorklet()) {\n\t\t\t\tawait this.audioContext.audioWorklet.addModule(getAudioOutputModuleUrl(), {credentials : \"omit\"});\n\t\t\t\tthis.stoppingCheck();\n\t\t\t}\n\t\t\t\n\t\t\t// Channel count must be gotten from the stream, as it might not have supported\n\t\t\t// the desired amount specified in the constraints\n\t\t\tlet numberOfChannels = getNumberOfChannels(this.stream);\n\t\t\t\n\t\t\t// Successfully recording!\n\t\t\tthis.createAndStartEncoder(numberOfChannels);\n\t\t\tthis.createAudioNodes(numberOfChannels);\n\n\t\t\tif (paused) {\n\t\t\t\tthis.timer.reset();\n\t\t\t\tthis.state = states.PAUSED;\n\t\t\t} else {\n\t\t\t\tthis.timer.resetAndStart();\n\t\t\t\tthis.state = states.RECORDING;\n\t\t\t}\n\n\t\t\tthis.onstart && this.onstart();\n\t\t} catch (error) {\n\t\t\tlet startWasCancelled = this.state == states.STOPPING;\n\t\t\tthis.cleanupAudioNodes();\n\t\t\t\n\t\t\t// Reset so can attempt start again\n\t\t\tthis.state = states.STOPPED;\n\t\t\t\n\t\t\t// Reject the stop promise now we have cleaned up and are in STOPPED state and ready to start() again\n\t\t\tif (startWasCancelled) {\n\t\t\t\tthis.stopPromiseReject(error);\n\t\t\t}\n\t\t\t\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync __stop() {\n\t\tthis.timer.stop();\n\t\t\n\t\tif (this.state == states.RECORDING || this.state == states.PAUSED) {\n\t\t\t// Stop recording, but encoding may not have finished yet,\n\t\t\t// so we enter the stopping state.\n\t\t\tthis.state = states.STOPPING;\n\t\t\t\n\t\t\tthis.cleanupAudioNodes();\n\t\t\tthis.encoder.stop();\n\t\t\t\n\t\t\t// Will be resolved later when encoding finishes\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.stopPromiseResolve = resolve;\n\t\t\t});\n\t\t} else if (this.state == states.STARTING) {\n\t\t\tthis.state = states.STOPPING;\n\t\t\t\n\t\t\t// Will be rejected later when start() has completely finished operation\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.stopPromiseReject = reject;\n\t\t\t})\n\t\t}\n\t\t\n\t\tthrow new Error(\"Called stop when AudioRecorder was not started\");\n\t}\n\t\n\tstart(paused = false) {\n\t\tlet promise = this.__start(paused);\n\t\t\n\t\tpromise.catch(error => {\n\t\t\t// Don't send CancelStartError to onerror, as it's not *really* an error state\n\t\t\t// Only used as a promise rejection to indicate that starting did not succeed.\n\t\t\tif (error.name != \"CancelStartError\") {\n\t\t\t\tthis.onerror && this.onerror(error);\n\t\t\t}\n\t\t});\n\t\t\n\t\tif (!this.onerror) {\n\t\t\treturn promise;\n\t\t}\n\t}\n\t\n\tstop() {\n\t\tlet promise = this.__stop();\n\t\t\n\t\tpromise.catch(error => {\n\t\t\tif (error.name == \"CancelStartError\") {\n\t\t\t\t// Stop was called before recording even started\n\t\t\t\t// Send a onstop event anyway to indicate that recording can be retried.\n\t\t\t\tthis.onstop && this.onstop(this.options.streaming ? undefined : null);\n\t\t\t} else {\n\t\t\t\tthis.onerror && this.onerror(error);\n\t\t\t}\n\t\t});\n\t\t\n\t\tif (!this.onerror) {\n\t\t\treturn promise;\n\t\t}\n\t}\n\n\tpause() {\n\t\tif (this.state == states.RECORDING) {\n\t\t\tthis.state = states.PAUSED;\n\t\t\tthis.timer.stop();\n\t\t}\n\t}\n\n\tresume() {\n\t\tif (this.state == states.PAUSED) {\n\t\t\tthis.state = states.RECORDING;\n\t\t\tthis.timer.start();\n\t\t}\n\t}\n}\n","import {useRef, useState, useEffect} from \"react\";\nimport AudioRecorder from \"./AudioRecorder.js\";\n\nexport const RecorderStates = {\n\tINITIAL : 0,\n\tSTARTING : 1,\n\tRECORDING : 2,\n\tPAUSED : 3,\n\tENCODING : 4,\n\tCOMPLETE : 5,\n\tERROR : 6,\n\tCOUNTDOWN : 7\n};\n\nfunction useInterval(updateFunc, timeStep = 1000/60.0) {\n\tconst intervalIdRef = useRef(null);\n\t\n\tuseEffect(() => {\n\t\tintervalIdRef.current = setInterval(updateFunc, timeStep);\n\t\t\n\t\treturn () => {\n\t\t\tintervalIdRef.current && clearInterval(intervalIdRef.current);\n\t\t};\n\t}, []);\n}\n\nexport function useSimpleAudioRecorder({\n\tworkerUrl,\n\tonDataAvailable,\n\tonComplete,\n\tonError,\n\toptions,\n\tcleanup = false,\n\ttimeUpdateStep = 111,\n\tcountdown = 0\n} = {}) {\n\tconst [recorderState, setRecorderState] = useState(RecorderStates.INITIAL);\n\tconst [mp3Blobs, setMp3Blobs] = useState([]);\n\tconst [mp3Urls, setMp3Urls] = useState([]);\n\tconst [error, setError] = useState(null);\n\tconst [time, setTime] = useState(0);\n\tconst [countdownStartTime, setCountdownStartTime] = useState(null);\n\tconst [countdownTimeLeft, setCountdownTimeLeft] = useState(0);\n\n\tconst recorderStateRef = useRef(recorderState);\n\tconst countdownStartTimeRef = useRef(0);\n\t\n\tconst recorderRef = useRef(null);\n\tconst audioDataRef = useRef(null);\n\tconst countdownTimerRef = useRef(null);\n\n\trecorderStateRef.current = recorderState;\n\tcountdownStartTimeRef.current = countdownStartTime;\n\n\tfunction clearCountdownTimeout() {\n\t\tif (countdownTimerRef.current != null) {\n\t\t\tclearTimeout(countdownTimerRef.current);\n\t\t\tcountdownTimerRef.current = null;\n\t\t}\n\t}\n\t\n\tuseEffect(() => {\n\t\tif (workerUrl) {\n\t\t\tAudioRecorder.preload(workerUrl);\n\t\t}\n\t\t\n\t\treturn () => {\n\t\t\tclearCountdownTimeout();\n\n\t\t\tif (recorderRef.current) {\n\t\t\t\trecorderRef.current.ondataavailable = null;\n\t\t\t\trecorderRef.current.onstart = null;\n\t\t\t\trecorderRef.current.onstop = null;\n\t\t\t\trecorderRef.current.onerror = null;\n\t\t\t\trecorderRef.current.stop();\n\t\t\t\trecorderRef.current = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (cleanup) {\n\t\t\t\tmp3Urls.forEach(URL.revokeObjectURL);\n\t\t\t}\n\t\t};\n\t}, []);\n\t\n\tuseInterval(() => {\n\t\t\trecorderRef.current && setTime(recorderRef.current.time);\n\n\t\t\tif (recorderStateRef.current == RecorderStates.COUNTDOWN) {\n\t\t\t\tsetCountdownTimeLeft(Math.max(0, countdown - (Date.now() - countdownStartTimeRef.current)));\n\t\t\t}\n\t}, timeUpdateStep);\n\t\n\tfunction start() {\n\t\taudioDataRef.current = [];\n\t\trecorderRef.current = new AudioRecorder({...options, streaming : true});\n\t\t\n\t\tsetRecorderState(RecorderStates.STARTING);\n\t\tsetCountdownTimeLeft(countdown);\n\t\t\n\t\trecorderRef.current.ondataavailable = (data) => {\n\t\t\taudioDataRef.current.push(data);\n\t\t\tonDataAvailable && onDataAvailable(data);\n\t\t};\n\t\t\n\t\trecorderRef.current.onstart = () => {\n\t\t\tif (countdown > 0) {\n\t\t\t\tsetRecorderState(RecorderStates.COUNTDOWN);\n\t\t\t\tsetCountdownStartTime(Date.now());\n\n\t\t\t\tcountdownTimerRef.current = setTimeout(() => {\n\t\t\t\t\tif (recorderStateRef.current == RecorderStates.COUNTDOWN) {\n\t\t\t\t\t\trecorderRef.current.resume();\n\t\t\t\t\t\tsetRecorderState(RecorderStates.RECORDING);\n\t\t\t\t\t\tsetCountdownTimeLeft(0);\n\t\t\t\t\t}\n\t\t\t\t}, countdown);\n\t\t\t} else {\n\t\t\t\tsetRecorderState(RecorderStates.RECORDING);\n\t\t\t}\n\t\t\tsetError(null);\n\t\t};\n\t\t\n\t\trecorderRef.current.onstop = () => {\n\t\t\t// Combine all the mp3 data chunks from the audioData array into a Blob\n\t\t\tconst mp3Blob = new Blob(audioDataRef.current, {type : \"audio/mpeg\"});\n\t\t\tconst mp3Url = URL.createObjectURL(mp3Blob);\n\t\t\tsetRecorderState(RecorderStates.COMPLETE);\n\t\t\tsetMp3Blobs([...mp3Blobs, mp3Blob]);\n\t\t\tsetMp3Urls([...mp3Urls, mp3Url]);\n\t\t\tonComplete && onComplete({mp3Blob, mp3Url});\n\t\t};\n\t\t\n\t\trecorderRef.current.onerror = (error) => {\n\t\t\tsetRecorderState(RecorderStates.ERROR);\n\t\t\tsetError(error);\n\t\t\tonError && onError(error);\n\t\t};\n\t\t\n\t\trecorderRef.current.start(countdown > 0);\n\t}\n\t\n\tfunction stop() {\n\t\tclearCountdownTimeout();\n\n\t\tif (recorderRef.current.getEncodingQueueSize() > 1000) {\n\t\t\t// If there's a fair amount of data left, we'll enter the ENCODING state.\n\t\t\t// (so a spinner or something could be shown)\n\t\t\tsetRecorderState(RecorderStates.ENCODING);\n\t\t}\n\t\t\n\t\trecorderRef.current.stop();\n\t}\n\t\n\tfunction pause() {\n\t\tif (recorderStateRef.current == RecorderStates.RECORDING) {\n\t\t\trecorderRef.current.pause();\n\t\t\tsetRecorderState(RecorderStates.PAUSED);\n\t\t}\n\t}\n\t\n\tfunction resume() {\n\t\tif (recorderStateRef.current == RecorderStates.PAUSED) {\n\t\t\trecorderRef.current.resume();\n\t\t\tsetRecorderState(RecorderStates.RECORDING);\n\t\t}\n\t}\n\t\n\tconst props = {recorderState};\n\t\n\treturn {\n\t\terror,\n\t\terrorStr : error ? error.toString() : null,\n\t\ttime,\n\t\tcountdownTimeLeft,\n\t\tmp3Blobs,\n\t\tmp3Urls,\n\t\tmp3Blob : mp3Blobs.at(-1),\n\t\tmp3Url : mp3Urls.at(-1),\n\t\tstart,\n\t\tstop,\n\t\tpause,\n\t\tresume,\n\t\t...props,\n\t\tgetProps : () => props\n\t};\n}\n\nexport function SimpleAudioRecorder({\n\trecorderState,\n\tviewInitial, viewStarting, viewCountdown, viewRecording, viewPaused, viewEncoding, viewComplete, viewError\n}) {\n\t// Only viewInitial and viewRecording are required.\n\t// Others will default to one of viewInitial or viewRecording if not specified, for a simpler UI.\n\n\t// if viewStarting is not set, we fallback first to viewCountdown, and then to viewRecording\n\tviewStarting = viewStarting ?? (viewCountdown ?? viewRecording);\n\tviewCountdown = viewCountdown ?? viewRecording;\n\tviewPaused = viewPaused ?? viewInitial;\n\tviewEncoding = viewEncoding ?? viewComplete;\n\tviewComplete = viewComplete ?? viewInitial;\n\tviewError = viewError ?? viewInitial;\n\t\n\tconst stateMap = new Map();\n\tstateMap.set(RecorderStates.INITIAL, viewInitial);\n\tstateMap.set(RecorderStates.STARTING, viewStarting);\n\tstateMap.set(RecorderStates.COUNTDOWN, viewCountdown);\n\tstateMap.set(RecorderStates.RECORDING, viewRecording);\n\tstateMap.set(RecorderStates.PAUSED, viewPaused);\n\tstateMap.set(RecorderStates.ENCODING, viewEncoding);\n\tstateMap.set(RecorderStates.COMPLETE, viewComplete);\n\tstateMap.set(RecorderStates.ERROR, viewError);\n\t\n\treturn stateMap.get(recorderState) ?? RecorderStates.INITIAL;\n}\n\nexport function preloadWorker(workerUrl) {\n\tAudioRecorder.preload(workerUrl);\n}\n"],"names":["workerStates","INACTIVE","LOADING","READY","ERROR","worker","workerState","workerStateChangeCallbacks","jobCallbacks","uuidv4","replace","c","crypto","getRandomValues","Uint8Array","toString","notifyWorkerState","newState","callback","getWorkerCrossDomainURL","url","content","URL","createObjectURL","Blob","type","loadWorker","workerUrl","test","Worker","onmessage","event","data","message","jobId","onencoded","srcBufLen","ondataavailable","onstopped","onerror","console","error","WorkerEncoder","constructor","options","queuedData","preload","waitForWorker","Promise","resolve","reject","push","Error","name","start","postMessage","command","sendData","buffers","length","getQueuedDataLen","stop","Timer","reset","startTime","stoppedTime","Date","now","resetAndStart","getTime","stopStream","stream","getTracks","forEach","track","detectIOS","includes","navigator","platform","userAgent","document","detectSafari","getAudioContextCtor","window","AudioContext","webkitAudioContext","isAudioWorkletSupported","AudioWorklet","states","STOPPED","RECORDING","PAUSED","STARTING","STOPPING","DEFAULT_OPTIONS","recordingGain","encoderBitRate","streaming","streamBufferSize","forceScriptProcessor","constraints","channelCount","autoGainControl","echoCancellation","noiseSuppression","createCancelStartError","getNumberOfChannels","audioTracks","getAudioTracks","trackSettings","getSettings","AUDIO_OUTPUT_MODULE_URL","getAudioOutputModuleUrl","AudioRecorder","state","audioContext","encoder","encodedData","stopPromiseResolve","stopPromiseReject","timer","isRecordingSupported","mediaDevices","getUserMedia","_workerUrl","useAudioWorklet","createAndStartEncoder","numberOfChannels","originalSampleRate","sampleRate","mp3Blob","undefined","onstop","createOutputNode","log","outputNode","AudioWorkletNode","numberOfOutputs","port","createScriptProcessor","connect","destination","onaudioprocess","inputBuffer","i","getChannelData","createAudioNodes","recordingGainNode","createGain","setRecordingGain","sourceNode","createMediaStreamSource","cleanupAudioNodes","disconnect","close","gain","setTargetAtTime","currentTime","time","getEncodingQueueSize","stoppingCheck","__start","paused","Object","keys","audio","_AudioContext","audioWorklet","addModule","credentials","onstart","startWasCancelled","__stop","promise","catch","pause","resume","RecorderStates","INITIAL","ENCODING","COMPLETE","COUNTDOWN","useInterval","updateFunc","timeStep","intervalIdRef","useRef","useEffect","current","setInterval","clearInterval","useSimpleAudioRecorder","onDataAvailable","onComplete","onError","cleanup","timeUpdateStep","countdown","recorderState","setRecorderState","useState","mp3Blobs","setMp3Blobs","mp3Urls","setMp3Urls","setError","setTime","countdownStartTime","setCountdownStartTime","countdownTimeLeft","setCountdownTimeLeft","recorderStateRef","countdownStartTimeRef","recorderRef","audioDataRef","countdownTimerRef","clearCountdownTimeout","clearTimeout","revokeObjectURL","Math","max","setTimeout","mp3Url","props","errorStr","at","getProps","SimpleAudioRecorder","viewInitial","viewStarting","viewCountdown","viewRecording","viewPaused","viewEncoding","viewComplete","viewError","stateMap","Map","set","get","preloadWorker"],"mappings":"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"}