{"version":3,"file":"index.cjs","sources":["../src/mp3worker/WorkerEncoder.js","../src/Timer.js","../src/utils.js","../src/AudioRecorder.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"],"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"],"mappings":"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"}