From 088d20ab45aaf60fa610ee2dfac7933850178bad Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Fri, 12 Jun 2020 15:08:53 +0300 Subject: [PATCH] Fix start record delay --- dist-unminified/recorder.js | 2 +- dist/recorder.min.js | 2 +- src/recorder.js | 22 +++++++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/dist-unminified/recorder.js b/dist-unminified/recorder.js index 746580c..0d39522 100644 --- a/dist-unminified/recorder.js +++ b/dist-unminified/recorder.js @@ -115,7 +115,7 @@ eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn th /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nvar AudioContext = global.AudioContext || global.webkitAudioContext;\n\n\n// Constructor\nvar Recorder = function( config ){\n\n if ( !Recorder.isRecordingSupported() ) {\n throw new Error(\"Recording is not supported in this browser\");\n }\n\n if ( !config ) config = {};\n\n this.state = \"inactive\";\n this.config = Object.assign({\n bufferLength: 4096,\n encoderApplication: 2049,\n encoderFrameSize: 20,\n encoderPath: 'encoderWorker.min.js',\n encoderSampleRate: 48000,\n maxFramesPerPage: 40,\n mediaTrackConstraints: true,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n resampleQuality: 3,\n streamPages: false,\n reuseWorker: false,\n wavBitDepth: 16,\n }, config );\n\n this.encodedSamplePosition = 0;\n};\n\n\n// Static Methods\nRecorder.isRecordingSupported = function(){\n return AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n};\n\n\n// Instance Methods\nRecorder.prototype.clearStream = function(){\n if ( this.stream ){\n\n if ( this.stream.getTracks ) {\n this.stream.getTracks().forEach( function( track ){\n track.stop();\n });\n }\n\n else {\n this.stream.stop();\n }\n\n delete this.stream;\n }\n\n if ( this.audioContext && this.closeAudioContext ){\n this.audioContext.close();\n delete this.audioContext;\n }\n};\n\nRecorder.prototype.encodeBuffers = function( inputBuffer ){\n if ( this.state === \"recording\" ) {\n var buffers = [];\n for ( var i = 0; i < inputBuffer.numberOfChannels; i++ ) {\n buffers[i] = inputBuffer.getChannelData(i);\n }\n\n this.encoder.postMessage({\n command: \"encode\",\n buffers: buffers\n });\n }\n};\n\nRecorder.prototype.initAudioContext = function( sourceNode ){\n if (sourceNode && sourceNode.context) {\n this.audioContext = sourceNode.context;\n this.closeAudioContext = false;\n }\n\n else {\n this.audioContext = new AudioContext();\n this.closeAudioContext = true;\n }\n\n return this.audioContext;\n};\n\nRecorder.prototype.initAudioGraph = function(){\n\n // First buffer can contain old data. Don't encode it.\n this.encodeBuffers = function(){\n delete this.encodeBuffers;\n };\n\n this.scriptProcessorNode = this.audioContext.createScriptProcessor( this.config.bufferLength, this.config.numberOfChannels, this.config.numberOfChannels );\n this.scriptProcessorNode.connect( this.audioContext.destination );\n this.scriptProcessorNode.onaudioprocess = ( e ) => {\n this.encodeBuffers( e.inputBuffer );\n };\n\n this.monitorGainNode = this.audioContext.createGain();\n this.setMonitorGain( this.config.monitorGain );\n this.monitorGainNode.connect( this.audioContext.destination );\n\n this.recordingGainNode = this.audioContext.createGain();\n this.setRecordingGain( this.config.recordingGain );\n this.recordingGainNode.connect( this.scriptProcessorNode );\n};\n\nRecorder.prototype.initSourceNode = function( sourceNode ){\n if ( sourceNode && sourceNode.context ) {\n return global.Promise.resolve( sourceNode );\n }\n\n return global.navigator.mediaDevices.getUserMedia({ audio : this.config.mediaTrackConstraints }).then( ( stream ) => {\n this.stream = stream;\n return this.audioContext.createMediaStreamSource( stream );\n });\n};\n\nRecorder.prototype.loadWorker = function() {\n if ( !this.encoder ) {\n this.encoder = new global.Worker(this.config.encoderPath);\n }\n};\n\nRecorder.prototype.initWorker = function(){\n var onPage = (this.config.streamPages ? this.streamPage : this.storePage).bind(this);\n\n this.recordedPages = [];\n this.totalLength = 0;\n this.loadWorker();\n\n return new Promise((resolve, reject) => {\n var callback = (e) => {\n switch( e['data']['message'] ){\n case 'ready':\n resolve();\n break;\n case 'page':\n this.encodedSamplePosition = e['data']['samplePosition'];\n onPage(e['data']['page']);\n break;\n case 'done':\n this.encoder.removeEventListener( \"message\", callback );\n this.finish();\n break;\n }\n };\n\n this.encoder.addEventListener( \"message\", callback );\n this.encoder.postMessage( Object.assign({\n command: 'init',\n originalSampleRate: this.audioContext.sampleRate,\n wavSampleRate: this.audioContext.sampleRate\n }, this.config));\n });\n};\n\nRecorder.prototype.pause = function( flush ) {\n if ( this.state === \"recording\" ) {\n this.state = \"paused\";\n if ( flush && this.config.streamPages ) {\n var encoder = this.encoder;\n return new Promise((resolve, reject) => {\n var callback = (e) => {\n if ( e[\"data\"][\"message\"] === 'flushed' ) {\n encoder.removeEventListener( \"message\", callback );\n this.onpause();\n resolve();\n }\n };\n encoder.addEventListener( \"message\", callback );\n encoder.postMessage( { command: \"flush\" } );\n });\n }\n this.onpause();\n return Promise.resolve();\n }\n};\n\nRecorder.prototype.resume = function() {\n if ( this.state === \"paused\" ) {\n this.state = \"recording\";\n this.onresume();\n }\n};\n\nRecorder.prototype.setRecordingGain = function( gain ){\n this.config.recordingGain = gain;\n\n if ( this.recordingGainNode && this.audioContext ) {\n this.recordingGainNode.gain.setTargetAtTime(gain, this.audioContext.currentTime, 0.01);\n }\n};\n\nRecorder.prototype.setMonitorGain = function( gain ){\n this.config.monitorGain = gain;\n\n if ( this.monitorGainNode && this.audioContext ) {\n this.monitorGainNode.gain.setTargetAtTime(gain, this.audioContext.currentTime, 0.01);\n }\n};\n\nRecorder.prototype.start = function( sourceNode ){\n if ( this.state === \"inactive\" ) {\n this.initAudioContext( sourceNode );\n this.initAudioGraph();\n\n this.encodedSamplePosition = 0;\n\n return Promise.all([this.initSourceNode(sourceNode), this.initWorker()]).then((results) => {\n this.sourceNode = results[0];\n this.state = \"recording\";\n this.onstart();\n this.encoder.postMessage({ command: 'getHeaderPages' });\n this.sourceNode.connect( this.monitorGainNode );\n this.sourceNode.connect( this.recordingGainNode );\n });\n }\n};\n\nRecorder.prototype.stop = function(){\n if ( this.state !== \"inactive\" ) {\n this.state = \"inactive\";\n this.monitorGainNode.disconnect();\n this.scriptProcessorNode.disconnect();\n this.recordingGainNode.disconnect();\n this.sourceNode.disconnect();\n this.clearStream();\n\n var encoder = this.encoder;\n return new Promise((resolve) => {\n var callback = (e) => {\n if ( e[\"data\"][\"message\"] === 'done' ) {\n encoder.removeEventListener( \"message\", callback );\n resolve();\n }\n };\n encoder.addEventListener( \"message\", callback );\n encoder.postMessage({ command: \"done\" });\n if ( !this.config.reuseWorker ) {\n encoder.postMessage({ command: \"close\" });\n }\n });\n }\n return Promise.resolve();\n};\n\nRecorder.prototype.destroyWorker = function(){\n if ( this.state === \"inactive\" ) {\n if ( this.encoder ) {\n this.encoder.postMessage({ command: \"close\" });\n delete this.encoder;\n }\n }\n};\n\nRecorder.prototype.storePage = function( page ) {\n this.recordedPages.push( page );\n this.totalLength += page.length;\n};\n\nRecorder.prototype.streamPage = function( page ) {\n this.ondataavailable( page );\n};\n\nRecorder.prototype.finish = function() {\n if( !this.config.streamPages ) {\n var outputData = new Uint8Array( this.totalLength );\n this.recordedPages.reduce( function( offset, page ){\n outputData.set( page, offset );\n return offset + page.length;\n }, 0);\n\n this.ondataavailable( outputData );\n }\n this.onstop();\n if ( !this.config.reuseWorker ) {\n delete this.encoder;\n }\n};\n\n\n// Callback Handlers\nRecorder.prototype.ondataavailable = function(){};\nRecorder.prototype.onpause = function(){};\nRecorder.prototype.onresume = function(){};\nRecorder.prototype.onstart = function(){};\nRecorder.prototype.onstop = function(){};\n\n\nmodule.exports = Recorder;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcmVjb3JkZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWNvcmRlci8uL3NyYy9yZWNvcmRlci5qcz8wNTZmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQXVkaW9Db250ZXh0ID0gZ2xvYmFsLkF1ZGlvQ29udGV4dCB8fCBnbG9iYWwud2Via2l0QXVkaW9Db250ZXh0O1xuXG5cbi8vIENvbnN0cnVjdG9yXG52YXIgUmVjb3JkZXIgPSBmdW5jdGlvbiggY29uZmlnICl7XG5cbiAgaWYgKCAhUmVjb3JkZXIuaXNSZWNvcmRpbmdTdXBwb3J0ZWQoKSApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXJcIik7XG4gIH1cblxuICBpZiAoICFjb25maWcgKSBjb25maWcgPSB7fTtcblxuICB0aGlzLnN0YXRlID0gXCJpbmFjdGl2ZVwiO1xuICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGJ1ZmZlckxlbmd0aDogNDA5NixcbiAgICBlbmNvZGVyQXBwbGljYXRpb246IDIwNDksXG4gICAgZW5jb2RlckZyYW1lU2l6ZTogMjAsXG4gICAgZW5jb2RlclBhdGg6ICdlbmNvZGVyV29ya2VyLm1pbi5qcycsXG4gICAgZW5jb2RlclNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgIG1heEZyYW1lc1BlclBhZ2U6IDQwLFxuICAgIG1lZGlhVHJhY2tDb25zdHJhaW50czogdHJ1ZSxcbiAgICBtb25pdG9yR2FpbjogMCxcbiAgICBudW1iZXJPZkNoYW5uZWxzOiAxLFxuICAgIHJlY29yZGluZ0dhaW46IDEsXG4gICAgcmVzYW1wbGVRdWFsaXR5OiAzLFxuICAgIHN0cmVhbVBhZ2VzOiBmYWxzZSxcbiAgICByZXVzZVdvcmtlcjogZmFsc2UsXG4gICAgd2F2Qml0RGVwdGg6IDE2LFxuICB9LCBjb25maWcgKTtcblxuICB0aGlzLmVuY29kZWRTYW1wbGVQb3NpdGlvbiA9IDA7XG59O1xuXG5cbi8vIFN0YXRpYyBNZXRob2RzXG5SZWNvcmRlci5pc1JlY29yZGluZ1N1cHBvcnRlZCA9IGZ1bmN0aW9uKCl7XG4gIHJldHVybiBBdWRpb0NvbnRleHQgJiYgZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJiBnbG9iYWwubmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgJiYgZ2xvYmFsLldlYkFzc2VtYmx5O1xufTtcblxuXG4vLyBJbnN0YW5jZSBNZXRob2RzXG5SZWNvcmRlci5wcm90b3R5cGUuY2xlYXJTdHJlYW0gPSBmdW5jdGlvbigpe1xuICBpZiAoIHRoaXMuc3RyZWFtICl7XG5cbiAgICBpZiAoIHRoaXMuc3RyZWFtLmdldFRyYWNrcyApIHtcbiAgICAgIHRoaXMuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goIGZ1bmN0aW9uKCB0cmFjayApe1xuICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc3RyZWFtLnN0b3AoKTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5zdHJlYW07XG4gIH1cblxuICBpZiAoIHRoaXMuYXVkaW9Db250ZXh0ICYmIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgKXtcbiAgICB0aGlzLmF1ZGlvQ29udGV4dC5jbG9zZSgpO1xuICAgIGRlbGV0ZSB0aGlzLmF1ZGlvQ29udGV4dDtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmVuY29kZUJ1ZmZlcnMgPSBmdW5jdGlvbiggaW5wdXRCdWZmZXIgKXtcbiAgaWYgKCB0aGlzLnN0YXRlID09PSBcInJlY29yZGluZ1wiICkge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgZm9yICggdmFyIGkgPSAwOyBpIDwgaW5wdXRCdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgaSsrICkge1xuICAgICAgYnVmZmVyc1tpXSA9IGlucHV0QnVmZmVyLmdldENoYW5uZWxEYXRhKGkpO1xuICAgIH1cblxuICAgIHRoaXMuZW5jb2Rlci5wb3N0TWVzc2FnZSh7XG4gICAgICBjb21tYW5kOiBcImVuY29kZVwiLFxuICAgICAgYnVmZmVyczogYnVmZmVyc1xuICAgIH0pO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCBzb3VyY2VOb2RlICl7XG4gIGlmIChzb3VyY2VOb2RlICYmIHNvdXJjZU5vZGUuY29udGV4dCkge1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gc291cmNlTm9kZS5jb250ZXh0O1xuICAgIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIGVsc2Uge1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuYXVkaW9Db250ZXh0O1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmluaXRBdWRpb0dyYXBoID0gZnVuY3Rpb24oKXtcblxuICAvLyBGaXJzdCBidWZmZXIgY2FuIGNvbnRhaW4gb2xkIGRhdGEuIERvbid0IGVuY29kZSBpdC5cbiAgdGhpcy5lbmNvZGVCdWZmZXJzID0gZnVuY3Rpb24oKXtcbiAgICBkZWxldGUgdGhpcy5lbmNvZGVCdWZmZXJzO1xuICB9O1xuXG4gIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvciggdGhpcy5jb25maWcuYnVmZmVyTGVuZ3RoLCB0aGlzLmNvbmZpZy5udW1iZXJPZkNoYW5uZWxzLCB0aGlzLmNvbmZpZy5udW1iZXJPZkNoYW5uZWxzICk7XG4gIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZS5jb25uZWN0KCB0aGlzLmF1ZGlvQ29udGV4dC5kZXN0aW5hdGlvbiApO1xuICB0aGlzLnNjcmlwdFByb2Nlc3Nvck5vZGUub25hdWRpb3Byb2Nlc3MgPSAoIGUgKSA9PiB7XG4gICAgdGhpcy5lbmNvZGVCdWZmZXJzKCBlLmlucHV0QnVmZmVyICk7XG4gIH07XG5cbiAgdGhpcy5tb25pdG9yR2Fpbk5vZGUgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XG4gIHRoaXMuc2V0TW9uaXRvckdhaW4oIHRoaXMuY29uZmlnLm1vbml0b3JHYWluICk7XG4gIHRoaXMubW9uaXRvckdhaW5Ob2RlLmNvbm5lY3QoIHRoaXMuYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uICk7XG5cbiAgdGhpcy5yZWNvcmRpbmdHYWluTm9kZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZUdhaW4oKTtcbiAgdGhpcy5zZXRSZWNvcmRpbmdHYWluKCB0aGlzLmNvbmZpZy5yZWNvcmRpbmdHYWluICk7XG4gIHRoaXMucmVjb3JkaW5nR2Fpbk5vZGUuY29ubmVjdCggdGhpcy5zY3JpcHRQcm9jZXNzb3JOb2RlICk7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdFNvdXJjZU5vZGUgPSBmdW5jdGlvbiggc291cmNlTm9kZSApe1xuICBpZiAoIHNvdXJjZU5vZGUgJiYgc291cmNlTm9kZS5jb250ZXh0ICkge1xuICAgIHJldHVybiBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKCBzb3VyY2VOb2RlICk7XG4gIH1cblxuICByZXR1cm4gZ2xvYmFsLm5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW8gOiB0aGlzLmNvbmZpZy5tZWRpYVRyYWNrQ29uc3RyYWludHMgfSkudGhlbiggKCBzdHJlYW0gKSA9PiB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBzdHJlYW0gKTtcbiAgfSk7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUubG9hZFdvcmtlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmVuY29kZXIgKSB7XG4gICAgdGhpcy5lbmNvZGVyID0gbmV3IGdsb2JhbC5Xb3JrZXIodGhpcy5jb25maWcuZW5jb2RlclBhdGgpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdFdvcmtlciA9IGZ1bmN0aW9uKCl7XG4gIHZhciBvblBhZ2UgPSAodGhpcy5jb25maWcuc3RyZWFtUGFnZXMgPyB0aGlzLnN0cmVhbVBhZ2UgOiB0aGlzLnN0b3JlUGFnZSkuYmluZCh0aGlzKTtcblxuICB0aGlzLnJlY29yZGVkUGFnZXMgPSBbXTtcbiAgdGhpcy50b3RhbExlbmd0aCA9IDA7XG4gIHRoaXMubG9hZFdvcmtlcigpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIGNhbGxiYWNrID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCggZVsnZGF0YSddWydtZXNzYWdlJ10gKXtcbiAgICAgICAgY2FzZSAncmVhZHknOlxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgICAgdGhpcy5lbmNvZGVkU2FtcGxlUG9zaXRpb24gPSBlWydkYXRhJ11bJ3NhbXBsZVBvc2l0aW9uJ107XG4gICAgICAgICAgb25QYWdlKGVbJ2RhdGEnXVsncGFnZSddKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgdGhpcy5lbmNvZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibWVzc2FnZVwiLCBjYWxsYmFjayApO1xuICAgICAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW5jb2Rlci5hZGRFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICB0aGlzLmVuY29kZXIucG9zdE1lc3NhZ2UoIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29tbWFuZDogJ2luaXQnLFxuICAgICAgb3JpZ2luYWxTYW1wbGVSYXRlOiB0aGlzLmF1ZGlvQ29udGV4dC5zYW1wbGVSYXRlLFxuICAgICAgd2F2U2FtcGxlUmF0ZTogdGhpcy5hdWRpb0NvbnRleHQuc2FtcGxlUmF0ZVxuICAgIH0sIHRoaXMuY29uZmlnKSk7XG4gIH0pO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oIGZsdXNoICkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwicmVjb3JkaW5nXCIgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwicGF1c2VkXCI7XG4gICAgaWYgKCBmbHVzaCAmJiB0aGlzLmNvbmZpZy5zdHJlYW1QYWdlcyApIHtcbiAgICAgIHZhciBlbmNvZGVyID0gdGhpcy5lbmNvZGVyO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoIGVbXCJkYXRhXCJdW1wibWVzc2FnZVwiXSA9PT0gJ2ZsdXNoZWQnICkge1xuICAgICAgICAgICAgZW5jb2Rlci5yZW1vdmVFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgICAgIHRoaXMub25wYXVzZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZW5jb2Rlci5hZGRFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgZW5jb2Rlci5wb3N0TWVzc2FnZSggeyBjb21tYW5kOiBcImZsdXNoXCIgfSApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub25wYXVzZSgpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwicGF1c2VkXCIgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwicmVjb3JkaW5nXCI7XG4gICAgdGhpcy5vbnJlc3VtZSgpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc2V0UmVjb3JkaW5nR2FpbiA9IGZ1bmN0aW9uKCBnYWluICl7XG4gIHRoaXMuY29uZmlnLnJlY29yZGluZ0dhaW4gPSBnYWluO1xuXG4gIGlmICggdGhpcy5yZWNvcmRpbmdHYWluTm9kZSAmJiB0aGlzLmF1ZGlvQ29udGV4dCApIHtcbiAgICB0aGlzLnJlY29yZGluZ0dhaW5Ob2RlLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGdhaW4sIHRoaXMuYXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxKTtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnNldE1vbml0b3JHYWluID0gZnVuY3Rpb24oIGdhaW4gKXtcbiAgdGhpcy5jb25maWcubW9uaXRvckdhaW4gPSBnYWluO1xuXG4gIGlmICggdGhpcy5tb25pdG9yR2Fpbk5vZGUgJiYgdGhpcy5hdWRpb0NvbnRleHQgKSB7XG4gICAgdGhpcy5tb25pdG9yR2Fpbk5vZGUuZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoZ2FpbiwgdGhpcy5hdWRpb0NvbnRleHQuY3VycmVudFRpbWUsIDAuMDEpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiggc291cmNlTm9kZSApe1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwiaW5hY3RpdmVcIiApIHtcbiAgICB0aGlzLmluaXRBdWRpb0NvbnRleHQoIHNvdXJjZU5vZGUgKTtcbiAgICB0aGlzLmluaXRBdWRpb0dyYXBoKCk7XG5cbiAgICB0aGlzLmVuY29kZWRTYW1wbGVQb3NpdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuaW5pdFNvdXJjZU5vZGUoc291cmNlTm9kZSksIHRoaXMuaW5pdFdvcmtlcigpXSkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgdGhpcy5zb3VyY2VOb2RlID0gcmVzdWx0c1swXTtcbiAgICAgIHRoaXMuc3RhdGUgPSBcInJlY29yZGluZ1wiO1xuICAgICAgdGhpcy5vbnN0YXJ0KCk7XG4gICAgICB0aGlzLmVuY29kZXIucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiAnZ2V0SGVhZGVyUGFnZXMnIH0pO1xuICAgICAgdGhpcy5zb3VyY2VOb2RlLmNvbm5lY3QoIHRoaXMubW9uaXRvckdhaW5Ob2RlICk7XG4gICAgICB0aGlzLnNvdXJjZU5vZGUuY29ubmVjdCggdGhpcy5yZWNvcmRpbmdHYWluTm9kZSApO1xuICAgIH0pO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCl7XG4gIGlmICggdGhpcy5zdGF0ZSAhPT0gXCJpbmFjdGl2ZVwiICkge1xuICAgIHRoaXMuc3RhdGUgPSBcImluYWN0aXZlXCI7XG4gICAgdGhpcy5tb25pdG9yR2Fpbk5vZGUuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5yZWNvcmRpbmdHYWluTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb3VyY2VOb2RlLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNsZWFyU3RyZWFtKCk7XG5cbiAgICB2YXIgZW5jb2RlciA9IHRoaXMuZW5jb2RlcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHZhciBjYWxsYmFjayA9IChlKSA9PiB7XG4gICAgICAgIGlmICggZVtcImRhdGFcIl1bXCJtZXNzYWdlXCJdID09PSAnZG9uZScgKSB7XG4gICAgICAgICAgZW5jb2Rlci5yZW1vdmVFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbmNvZGVyLmFkZEV2ZW50TGlzdGVuZXIoIFwibWVzc2FnZVwiLCBjYWxsYmFjayApO1xuICAgICAgZW5jb2Rlci5wb3N0TWVzc2FnZSh7IGNvbW1hbmQ6IFwiZG9uZVwiIH0pO1xuICAgICAgaWYgKCAhdGhpcy5jb25maWcucmV1c2VXb3JrZXIgKSB7XG4gICAgICAgIGVuY29kZXIucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiBcImNsb3NlXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmRlc3Ryb3lXb3JrZXIgPSBmdW5jdGlvbigpe1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwiaW5hY3RpdmVcIiApIHtcbiAgICBpZiAoIHRoaXMuZW5jb2RlciApIHtcbiAgICAgIHRoaXMuZW5jb2Rlci5wb3N0TWVzc2FnZSh7IGNvbW1hbmQ6IFwiY2xvc2VcIiB9KTtcbiAgICAgIGRlbGV0ZSB0aGlzLmVuY29kZXI7XG4gICAgfVxuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RvcmVQYWdlID0gZnVuY3Rpb24oIHBhZ2UgKSB7XG4gIHRoaXMucmVjb3JkZWRQYWdlcy5wdXNoKCBwYWdlICk7XG4gIHRoaXMudG90YWxMZW5ndGggKz0gcGFnZS5sZW5ndGg7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RyZWFtUGFnZSA9IGZ1bmN0aW9uKCBwYWdlICkge1xuICB0aGlzLm9uZGF0YWF2YWlsYWJsZSggcGFnZSApO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICBpZiggIXRoaXMuY29uZmlnLnN0cmVhbVBhZ2VzICkge1xuICAgIHZhciBvdXRwdXREYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMudG90YWxMZW5ndGggKTtcbiAgICB0aGlzLnJlY29yZGVkUGFnZXMucmVkdWNlKCBmdW5jdGlvbiggb2Zmc2V0LCBwYWdlICl7XG4gICAgICBvdXRwdXREYXRhLnNldCggcGFnZSwgb2Zmc2V0ICk7XG4gICAgICByZXR1cm4gb2Zmc2V0ICsgcGFnZS5sZW5ndGg7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLm9uZGF0YWF2YWlsYWJsZSggb3V0cHV0RGF0YSApO1xuICB9XG4gIHRoaXMub25zdG9wKCk7XG4gIGlmICggIXRoaXMuY29uZmlnLnJldXNlV29ya2VyICkge1xuICAgIGRlbGV0ZSB0aGlzLmVuY29kZXI7XG4gIH1cbn07XG5cblxuLy8gQ2FsbGJhY2sgSGFuZGxlcnNcblJlY29yZGVyLnByb3RvdHlwZS5vbmRhdGFhdmFpbGFibGUgPSBmdW5jdGlvbigpe307XG5SZWNvcmRlci5wcm90b3R5cGUub25wYXVzZSA9IGZ1bmN0aW9uKCl7fTtcblJlY29yZGVyLnByb3RvdHlwZS5vbnJlc3VtZSA9IGZ1bmN0aW9uKCl7fTtcblJlY29yZGVyLnByb3RvdHlwZS5vbnN0YXJ0ID0gZnVuY3Rpb24oKXt9O1xuUmVjb3JkZXIucHJvdG90eXBlLm9uc3RvcCA9IGZ1bmN0aW9uKCl7fTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY29yZGVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/recorder.js\n"); +eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nvar AudioContext = global.AudioContext || global.webkitAudioContext;\n\n\n// Constructor\nvar Recorder = function( config ){\n\n if ( !Recorder.isRecordingSupported() ) {\n throw new Error(\"Recording is not supported in this browser\");\n }\n\n if ( !config ) config = {};\n\n this.state = \"inactive\";\n this.config = Object.assign({\n bufferLength: 4096,\n encoderApplication: 2049,\n encoderFrameSize: 20,\n encoderPath: 'encoderWorker.min.js',\n encoderSampleRate: 48000,\n maxFramesPerPage: 40,\n mediaTrackConstraints: true,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n resampleQuality: 3,\n streamPages: false,\n reuseWorker: false,\n wavBitDepth: 16,\n }, config );\n\n this.encodedSamplePosition = 0;\n};\n\n\n// Static Methods\nRecorder.isRecordingSupported = function(){\n return AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n};\n\n\n// Instance Methods\nRecorder.prototype.clearStream = function(){\n if ( this.stream ){\n\n if ( this.stream.getTracks ) {\n this.stream.getTracks().forEach( function( track ){\n track.stop();\n });\n }\n\n else {\n this.stream.stop();\n }\n\n delete this.stream;\n }\n\n if ( this.audioContext && this.closeAudioContext ){\n this.audioContext.close();\n delete this.audioContext;\n }\n};\n\nRecorder.prototype.encodeBuffers = function( inputBuffer ){\n if ( this.state === \"recording\" ) {\n var buffers = [];\n for ( var i = 0; i < inputBuffer.numberOfChannels; i++ ) {\n buffers[i] = inputBuffer.getChannelData(i);\n }\n\n this.encoder.postMessage({\n command: \"encode\",\n buffers: buffers\n });\n }\n};\n\nRecorder.prototype.initAudioContext = function( sourceNode ){\n if (sourceNode && sourceNode.context) {\n this.audioContext = sourceNode.context;\n this.closeAudioContext = false;\n }\n\n else {\n this.audioContext = new AudioContext();\n this.closeAudioContext = true;\n }\n\n return this.audioContext;\n};\n\nRecorder.prototype.initAudioGraph = function(){\n\n // First buffer can contain old data. Don't encode it.\n this.encodeBuffers = function(){\n delete this.encodeBuffers;\n };\n\n this.scriptProcessorNode = this.audioContext.createScriptProcessor( this.config.bufferLength, this.config.numberOfChannels, this.config.numberOfChannels );\n this.scriptProcessorNode.connect( this.audioContext.destination );\n this.scriptProcessorNode.onaudioprocess = ( e ) => {\n this.encodeBuffers( e.inputBuffer );\n };\n\n this.monitorGainNode = this.audioContext.createGain();\n this.setMonitorGain( this.config.monitorGain );\n this.monitorGainNode.connect( this.audioContext.destination );\n\n this.recordingGainNode = this.audioContext.createGain();\n this.setRecordingGain( this.config.recordingGain );\n this.recordingGainNode.connect( this.scriptProcessorNode );\n};\n\nRecorder.prototype.initSourceNode = function( sourceNode ){\n if ( sourceNode && sourceNode.context ) {\n return global.Promise.resolve( sourceNode );\n }\n\n return global.navigator.mediaDevices.getUserMedia({ audio : this.config.mediaTrackConstraints }).then( ( stream ) => {\n this.stream = stream;\n return this.audioContext.createMediaStreamSource( stream );\n });\n};\n\nRecorder.prototype.loadWorker = function() {\n if ( !this.encoder ) {\n this.encoder = new global.Worker(this.config.encoderPath);\n }\n};\n\nRecorder.prototype.initWorker = function(){\n var onPage = (this.config.streamPages ? this.streamPage : this.storePage).bind(this);\n\n this.recordedPages = [];\n this.totalLength = 0;\n this.loadWorker();\n\n return new Promise((resolve, reject) => {\n var callback = (e) => {\n switch( e['data']['message'] ){\n case 'ready':\n resolve();\n break;\n case 'page':\n this.encodedSamplePosition = e['data']['samplePosition'];\n onPage(e['data']['page']);\n break;\n case 'done':\n this.encoder.removeEventListener( \"message\", callback );\n this.finish();\n break;\n }\n };\n\n this.encoder.addEventListener( \"message\", callback );\n this.encoder.postMessage( Object.assign({\n command: 'init',\n originalSampleRate: this.audioContext.sampleRate,\n wavSampleRate: this.audioContext.sampleRate\n }, this.config));\n });\n};\n\nRecorder.prototype.pause = function( flush ) {\n if ( this.state === \"recording\" ) {\n this.state = \"paused\";\n if ( flush && this.config.streamPages ) {\n var encoder = this.encoder;\n return new Promise((resolve, reject) => {\n var callback = (e) => {\n if ( e[\"data\"][\"message\"] === 'flushed' ) {\n encoder.removeEventListener( \"message\", callback );\n this.onpause();\n resolve();\n }\n };\n encoder.addEventListener( \"message\", callback );\n encoder.postMessage( { command: \"flush\" } );\n });\n }\n this.onpause();\n return Promise.resolve();\n }\n};\n\nRecorder.prototype.resume = function() {\n if ( this.state === \"paused\" ) {\n this.state = \"recording\";\n this.onresume();\n }\n};\n\nRecorder.prototype.setRecordingGain = function( gain ){\n this.config.recordingGain = gain;\n\n if ( this.recordingGainNode && this.audioContext ) {\n this.recordingGainNode.gain.setTargetAtTime(gain, this.audioContext.currentTime, 0.01);\n }\n};\n\nRecorder.prototype.setMonitorGain = function( gain ){\n this.config.monitorGain = gain;\n\n if ( this.monitorGainNode && this.audioContext ) {\n this.monitorGainNode.gain.setTargetAtTime(gain, this.audioContext.currentTime, 0.01);\n }\n};\n\nRecorder.prototype.start = function( sourceNode ){\n if ( this.state === \"inactive\" ) {\n this.initAudioContext( sourceNode );\n this.initAudioGraph();\n\n this.encodedSamplePosition = 0;\n\n return this.initWorker().then(() => {\n return this.initSourceNode(sourceNode);\n }).then(sourceNode => {\n this.sourceNode = sourceNode;\n this.state = \"recording\";\n this.onstart();\n this.encoder.postMessage({ command: 'getHeaderPages' });\n this.sourceNode.connect( this.monitorGainNode );\n this.sourceNode.connect( this.recordingGainNode );\n });\n }\n};\n\n/* Recorder.prototype.start = function( sourceNode ){\n if ( this.state === \"inactive\" ) {\n this.initAudioContext( sourceNode );\n this.initAudioGraph();\n\n this.encodedSamplePosition = 0;\n\n return Promise.all([this.initSourceNode(sourceNode), this.initWorker()]).then((results) => {\n this.sourceNode = results[0];\n this.state = \"recording\";\n this.onstart();\n this.encoder.postMessage({ command: 'getHeaderPages' });\n this.sourceNode.connect( this.monitorGainNode );\n this.sourceNode.connect( this.recordingGainNode );\n });\n }\n}; */\n\nRecorder.prototype.stop = function(){\n if ( this.state !== \"inactive\" ) {\n this.state = \"inactive\";\n this.monitorGainNode.disconnect();\n this.scriptProcessorNode.disconnect();\n this.recordingGainNode.disconnect();\n this.sourceNode.disconnect();\n this.clearStream();\n\n var encoder = this.encoder;\n return new Promise((resolve) => {\n var callback = (e) => {\n if ( e[\"data\"][\"message\"] === 'done' ) {\n encoder.removeEventListener( \"message\", callback );\n resolve();\n }\n };\n encoder.addEventListener( \"message\", callback );\n encoder.postMessage({ command: \"done\" });\n if ( !this.config.reuseWorker ) {\n encoder.postMessage({ command: \"close\" });\n }\n });\n }\n return Promise.resolve();\n};\n\nRecorder.prototype.destroyWorker = function(){\n if ( this.state === \"inactive\" ) {\n if ( this.encoder ) {\n this.encoder.postMessage({ command: \"close\" });\n delete this.encoder;\n }\n }\n};\n\nRecorder.prototype.storePage = function( page ) {\n this.recordedPages.push( page );\n this.totalLength += page.length;\n};\n\nRecorder.prototype.streamPage = function( page ) {\n this.ondataavailable( page );\n};\n\nRecorder.prototype.finish = function() {\n if( !this.config.streamPages ) {\n var outputData = new Uint8Array( this.totalLength );\n this.recordedPages.reduce( function( offset, page ){\n outputData.set( page, offset );\n return offset + page.length;\n }, 0);\n\n this.ondataavailable( outputData );\n }\n this.onstop();\n if ( !this.config.reuseWorker ) {\n delete this.encoder;\n }\n};\n\n\n// Callback Handlers\nRecorder.prototype.ondataavailable = function(){};\nRecorder.prototype.onpause = function(){};\nRecorder.prototype.onresume = function(){};\nRecorder.prototype.onstart = function(){};\nRecorder.prototype.onstop = function(){};\n\n\nmodule.exports = Recorder;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcmVjb3JkZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWNvcmRlci8uL3NyYy9yZWNvcmRlci5qcz8wNTZmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQXVkaW9Db250ZXh0ID0gZ2xvYmFsLkF1ZGlvQ29udGV4dCB8fCBnbG9iYWwud2Via2l0QXVkaW9Db250ZXh0O1xuXG5cbi8vIENvbnN0cnVjdG9yXG52YXIgUmVjb3JkZXIgPSBmdW5jdGlvbiggY29uZmlnICl7XG5cbiAgaWYgKCAhUmVjb3JkZXIuaXNSZWNvcmRpbmdTdXBwb3J0ZWQoKSApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXJcIik7XG4gIH1cblxuICBpZiAoICFjb25maWcgKSBjb25maWcgPSB7fTtcblxuICB0aGlzLnN0YXRlID0gXCJpbmFjdGl2ZVwiO1xuICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGJ1ZmZlckxlbmd0aDogNDA5NixcbiAgICBlbmNvZGVyQXBwbGljYXRpb246IDIwNDksXG4gICAgZW5jb2RlckZyYW1lU2l6ZTogMjAsXG4gICAgZW5jb2RlclBhdGg6ICdlbmNvZGVyV29ya2VyLm1pbi5qcycsXG4gICAgZW5jb2RlclNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgIG1heEZyYW1lc1BlclBhZ2U6IDQwLFxuICAgIG1lZGlhVHJhY2tDb25zdHJhaW50czogdHJ1ZSxcbiAgICBtb25pdG9yR2FpbjogMCxcbiAgICBudW1iZXJPZkNoYW5uZWxzOiAxLFxuICAgIHJlY29yZGluZ0dhaW46IDEsXG4gICAgcmVzYW1wbGVRdWFsaXR5OiAzLFxuICAgIHN0cmVhbVBhZ2VzOiBmYWxzZSxcbiAgICByZXVzZVdvcmtlcjogZmFsc2UsXG4gICAgd2F2Qml0RGVwdGg6IDE2LFxuICB9LCBjb25maWcgKTtcblxuICB0aGlzLmVuY29kZWRTYW1wbGVQb3NpdGlvbiA9IDA7XG59O1xuXG5cbi8vIFN0YXRpYyBNZXRob2RzXG5SZWNvcmRlci5pc1JlY29yZGluZ1N1cHBvcnRlZCA9IGZ1bmN0aW9uKCl7XG4gIHJldHVybiBBdWRpb0NvbnRleHQgJiYgZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJiBnbG9iYWwubmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgJiYgZ2xvYmFsLldlYkFzc2VtYmx5O1xufTtcblxuXG4vLyBJbnN0YW5jZSBNZXRob2RzXG5SZWNvcmRlci5wcm90b3R5cGUuY2xlYXJTdHJlYW0gPSBmdW5jdGlvbigpe1xuICBpZiAoIHRoaXMuc3RyZWFtICl7XG5cbiAgICBpZiAoIHRoaXMuc3RyZWFtLmdldFRyYWNrcyApIHtcbiAgICAgIHRoaXMuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goIGZ1bmN0aW9uKCB0cmFjayApe1xuICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc3RyZWFtLnN0b3AoKTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5zdHJlYW07XG4gIH1cblxuICBpZiAoIHRoaXMuYXVkaW9Db250ZXh0ICYmIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgKXtcbiAgICB0aGlzLmF1ZGlvQ29udGV4dC5jbG9zZSgpO1xuICAgIGRlbGV0ZSB0aGlzLmF1ZGlvQ29udGV4dDtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmVuY29kZUJ1ZmZlcnMgPSBmdW5jdGlvbiggaW5wdXRCdWZmZXIgKXtcbiAgaWYgKCB0aGlzLnN0YXRlID09PSBcInJlY29yZGluZ1wiICkge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgZm9yICggdmFyIGkgPSAwOyBpIDwgaW5wdXRCdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgaSsrICkge1xuICAgICAgYnVmZmVyc1tpXSA9IGlucHV0QnVmZmVyLmdldENoYW5uZWxEYXRhKGkpO1xuICAgIH1cblxuICAgIHRoaXMuZW5jb2Rlci5wb3N0TWVzc2FnZSh7XG4gICAgICBjb21tYW5kOiBcImVuY29kZVwiLFxuICAgICAgYnVmZmVyczogYnVmZmVyc1xuICAgIH0pO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdEF1ZGlvQ29udGV4dCA9IGZ1bmN0aW9uKCBzb3VyY2VOb2RlICl7XG4gIGlmIChzb3VyY2VOb2RlICYmIHNvdXJjZU5vZGUuY29udGV4dCkge1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gc291cmNlTm9kZS5jb250ZXh0O1xuICAgIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIGVsc2Uge1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgIHRoaXMuY2xvc2VBdWRpb0NvbnRleHQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuYXVkaW9Db250ZXh0O1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmluaXRBdWRpb0dyYXBoID0gZnVuY3Rpb24oKXtcblxuICAvLyBGaXJzdCBidWZmZXIgY2FuIGNvbnRhaW4gb2xkIGRhdGEuIERvbid0IGVuY29kZSBpdC5cbiAgdGhpcy5lbmNvZGVCdWZmZXJzID0gZnVuY3Rpb24oKXtcbiAgICBkZWxldGUgdGhpcy5lbmNvZGVCdWZmZXJzO1xuICB9O1xuXG4gIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvciggdGhpcy5jb25maWcuYnVmZmVyTGVuZ3RoLCB0aGlzLmNvbmZpZy5udW1iZXJPZkNoYW5uZWxzLCB0aGlzLmNvbmZpZy5udW1iZXJPZkNoYW5uZWxzICk7XG4gIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZS5jb25uZWN0KCB0aGlzLmF1ZGlvQ29udGV4dC5kZXN0aW5hdGlvbiApO1xuICB0aGlzLnNjcmlwdFByb2Nlc3Nvck5vZGUub25hdWRpb3Byb2Nlc3MgPSAoIGUgKSA9PiB7XG4gICAgdGhpcy5lbmNvZGVCdWZmZXJzKCBlLmlucHV0QnVmZmVyICk7XG4gIH07XG5cbiAgdGhpcy5tb25pdG9yR2Fpbk5vZGUgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XG4gIHRoaXMuc2V0TW9uaXRvckdhaW4oIHRoaXMuY29uZmlnLm1vbml0b3JHYWluICk7XG4gIHRoaXMubW9uaXRvckdhaW5Ob2RlLmNvbm5lY3QoIHRoaXMuYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uICk7XG5cbiAgdGhpcy5yZWNvcmRpbmdHYWluTm9kZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZUdhaW4oKTtcbiAgdGhpcy5zZXRSZWNvcmRpbmdHYWluKCB0aGlzLmNvbmZpZy5yZWNvcmRpbmdHYWluICk7XG4gIHRoaXMucmVjb3JkaW5nR2Fpbk5vZGUuY29ubmVjdCggdGhpcy5zY3JpcHRQcm9jZXNzb3JOb2RlICk7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdFNvdXJjZU5vZGUgPSBmdW5jdGlvbiggc291cmNlTm9kZSApe1xuICBpZiAoIHNvdXJjZU5vZGUgJiYgc291cmNlTm9kZS5jb250ZXh0ICkge1xuICAgIHJldHVybiBnbG9iYWwuUHJvbWlzZS5yZXNvbHZlKCBzb3VyY2VOb2RlICk7XG4gIH1cblxuICByZXR1cm4gZ2xvYmFsLm5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW8gOiB0aGlzLmNvbmZpZy5tZWRpYVRyYWNrQ29uc3RyYWludHMgfSkudGhlbiggKCBzdHJlYW0gKSA9PiB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBzdHJlYW0gKTtcbiAgfSk7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUubG9hZFdvcmtlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmVuY29kZXIgKSB7XG4gICAgdGhpcy5lbmNvZGVyID0gbmV3IGdsb2JhbC5Xb3JrZXIodGhpcy5jb25maWcuZW5jb2RlclBhdGgpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuaW5pdFdvcmtlciA9IGZ1bmN0aW9uKCl7XG4gIHZhciBvblBhZ2UgPSAodGhpcy5jb25maWcuc3RyZWFtUGFnZXMgPyB0aGlzLnN0cmVhbVBhZ2UgOiB0aGlzLnN0b3JlUGFnZSkuYmluZCh0aGlzKTtcblxuICB0aGlzLnJlY29yZGVkUGFnZXMgPSBbXTtcbiAgdGhpcy50b3RhbExlbmd0aCA9IDA7XG4gIHRoaXMubG9hZFdvcmtlcigpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIGNhbGxiYWNrID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCggZVsnZGF0YSddWydtZXNzYWdlJ10gKXtcbiAgICAgICAgY2FzZSAncmVhZHknOlxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgICAgdGhpcy5lbmNvZGVkU2FtcGxlUG9zaXRpb24gPSBlWydkYXRhJ11bJ3NhbXBsZVBvc2l0aW9uJ107XG4gICAgICAgICAgb25QYWdlKGVbJ2RhdGEnXVsncGFnZSddKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgdGhpcy5lbmNvZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibWVzc2FnZVwiLCBjYWxsYmFjayApO1xuICAgICAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW5jb2Rlci5hZGRFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICB0aGlzLmVuY29kZXIucG9zdE1lc3NhZ2UoIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29tbWFuZDogJ2luaXQnLFxuICAgICAgb3JpZ2luYWxTYW1wbGVSYXRlOiB0aGlzLmF1ZGlvQ29udGV4dC5zYW1wbGVSYXRlLFxuICAgICAgd2F2U2FtcGxlUmF0ZTogdGhpcy5hdWRpb0NvbnRleHQuc2FtcGxlUmF0ZVxuICAgIH0sIHRoaXMuY29uZmlnKSk7XG4gIH0pO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oIGZsdXNoICkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwicmVjb3JkaW5nXCIgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwicGF1c2VkXCI7XG4gICAgaWYgKCBmbHVzaCAmJiB0aGlzLmNvbmZpZy5zdHJlYW1QYWdlcyApIHtcbiAgICAgIHZhciBlbmNvZGVyID0gdGhpcy5lbmNvZGVyO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoIGVbXCJkYXRhXCJdW1wibWVzc2FnZVwiXSA9PT0gJ2ZsdXNoZWQnICkge1xuICAgICAgICAgICAgZW5jb2Rlci5yZW1vdmVFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgICAgIHRoaXMub25wYXVzZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZW5jb2Rlci5hZGRFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgZW5jb2Rlci5wb3N0TWVzc2FnZSggeyBjb21tYW5kOiBcImZsdXNoXCIgfSApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMub25wYXVzZSgpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwicGF1c2VkXCIgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwicmVjb3JkaW5nXCI7XG4gICAgdGhpcy5vbnJlc3VtZSgpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc2V0UmVjb3JkaW5nR2FpbiA9IGZ1bmN0aW9uKCBnYWluICl7XG4gIHRoaXMuY29uZmlnLnJlY29yZGluZ0dhaW4gPSBnYWluO1xuXG4gIGlmICggdGhpcy5yZWNvcmRpbmdHYWluTm9kZSAmJiB0aGlzLmF1ZGlvQ29udGV4dCApIHtcbiAgICB0aGlzLnJlY29yZGluZ0dhaW5Ob2RlLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGdhaW4sIHRoaXMuYXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxKTtcbiAgfVxufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLnNldE1vbml0b3JHYWluID0gZnVuY3Rpb24oIGdhaW4gKXtcbiAgdGhpcy5jb25maWcubW9uaXRvckdhaW4gPSBnYWluO1xuXG4gIGlmICggdGhpcy5tb25pdG9yR2Fpbk5vZGUgJiYgdGhpcy5hdWRpb0NvbnRleHQgKSB7XG4gICAgdGhpcy5tb25pdG9yR2Fpbk5vZGUuZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoZ2FpbiwgdGhpcy5hdWRpb0NvbnRleHQuY3VycmVudFRpbWUsIDAuMDEpO1xuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiggc291cmNlTm9kZSApe1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwiaW5hY3RpdmVcIiApIHtcbiAgICB0aGlzLmluaXRBdWRpb0NvbnRleHQoIHNvdXJjZU5vZGUgKTtcbiAgICB0aGlzLmluaXRBdWRpb0dyYXBoKCk7XG5cbiAgICB0aGlzLmVuY29kZWRTYW1wbGVQb3NpdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy5pbml0V29ya2VyKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0U291cmNlTm9kZShzb3VyY2VOb2RlKTtcbiAgICB9KS50aGVuKHNvdXJjZU5vZGUgPT4ge1xuICAgICAgdGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcbiAgICAgIHRoaXMuc3RhdGUgPSBcInJlY29yZGluZ1wiO1xuICAgICAgdGhpcy5vbnN0YXJ0KCk7XG4gICAgICB0aGlzLmVuY29kZXIucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiAnZ2V0SGVhZGVyUGFnZXMnIH0pO1xuICAgICAgdGhpcy5zb3VyY2VOb2RlLmNvbm5lY3QoIHRoaXMubW9uaXRvckdhaW5Ob2RlICk7XG4gICAgICB0aGlzLnNvdXJjZU5vZGUuY29ubmVjdCggdGhpcy5yZWNvcmRpbmdHYWluTm9kZSApO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKiBSZWNvcmRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiggc291cmNlTm9kZSApe1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwiaW5hY3RpdmVcIiApIHtcbiAgICB0aGlzLmluaXRBdWRpb0NvbnRleHQoIHNvdXJjZU5vZGUgKTtcbiAgICB0aGlzLmluaXRBdWRpb0dyYXBoKCk7XG5cbiAgICB0aGlzLmVuY29kZWRTYW1wbGVQb3NpdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuaW5pdFNvdXJjZU5vZGUoc291cmNlTm9kZSksIHRoaXMuaW5pdFdvcmtlcigpXSkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgdGhpcy5zb3VyY2VOb2RlID0gcmVzdWx0c1swXTtcbiAgICAgIHRoaXMuc3RhdGUgPSBcInJlY29yZGluZ1wiO1xuICAgICAgdGhpcy5vbnN0YXJ0KCk7XG4gICAgICB0aGlzLmVuY29kZXIucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiAnZ2V0SGVhZGVyUGFnZXMnIH0pO1xuICAgICAgdGhpcy5zb3VyY2VOb2RlLmNvbm5lY3QoIHRoaXMubW9uaXRvckdhaW5Ob2RlICk7XG4gICAgICB0aGlzLnNvdXJjZU5vZGUuY29ubmVjdCggdGhpcy5yZWNvcmRpbmdHYWluTm9kZSApO1xuICAgIH0pO1xuICB9XG59OyAqL1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCl7XG4gIGlmICggdGhpcy5zdGF0ZSAhPT0gXCJpbmFjdGl2ZVwiICkge1xuICAgIHRoaXMuc3RhdGUgPSBcImluYWN0aXZlXCI7XG4gICAgdGhpcy5tb25pdG9yR2Fpbk5vZGUuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc2NyaXB0UHJvY2Vzc29yTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5yZWNvcmRpbmdHYWluTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5zb3VyY2VOb2RlLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNsZWFyU3RyZWFtKCk7XG5cbiAgICB2YXIgZW5jb2RlciA9IHRoaXMuZW5jb2RlcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHZhciBjYWxsYmFjayA9IChlKSA9PiB7XG4gICAgICAgIGlmICggZVtcImRhdGFcIl1bXCJtZXNzYWdlXCJdID09PSAnZG9uZScgKSB7XG4gICAgICAgICAgZW5jb2Rlci5yZW1vdmVFdmVudExpc3RlbmVyKCBcIm1lc3NhZ2VcIiwgY2FsbGJhY2sgKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlbmNvZGVyLmFkZEV2ZW50TGlzdGVuZXIoIFwibWVzc2FnZVwiLCBjYWxsYmFjayApO1xuICAgICAgZW5jb2Rlci5wb3N0TWVzc2FnZSh7IGNvbW1hbmQ6IFwiZG9uZVwiIH0pO1xuICAgICAgaWYgKCAhdGhpcy5jb25maWcucmV1c2VXb3JrZXIgKSB7XG4gICAgICAgIGVuY29kZXIucG9zdE1lc3NhZ2UoeyBjb21tYW5kOiBcImNsb3NlXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmRlc3Ryb3lXb3JrZXIgPSBmdW5jdGlvbigpe1xuICBpZiAoIHRoaXMuc3RhdGUgPT09IFwiaW5hY3RpdmVcIiApIHtcbiAgICBpZiAoIHRoaXMuZW5jb2RlciApIHtcbiAgICAgIHRoaXMuZW5jb2Rlci5wb3N0TWVzc2FnZSh7IGNvbW1hbmQ6IFwiY2xvc2VcIiB9KTtcbiAgICAgIGRlbGV0ZSB0aGlzLmVuY29kZXI7XG4gICAgfVxuICB9XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RvcmVQYWdlID0gZnVuY3Rpb24oIHBhZ2UgKSB7XG4gIHRoaXMucmVjb3JkZWRQYWdlcy5wdXNoKCBwYWdlICk7XG4gIHRoaXMudG90YWxMZW5ndGggKz0gcGFnZS5sZW5ndGg7XG59O1xuXG5SZWNvcmRlci5wcm90b3R5cGUuc3RyZWFtUGFnZSA9IGZ1bmN0aW9uKCBwYWdlICkge1xuICB0aGlzLm9uZGF0YWF2YWlsYWJsZSggcGFnZSApO1xufTtcblxuUmVjb3JkZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICBpZiggIXRoaXMuY29uZmlnLnN0cmVhbVBhZ2VzICkge1xuICAgIHZhciBvdXRwdXREYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMudG90YWxMZW5ndGggKTtcbiAgICB0aGlzLnJlY29yZGVkUGFnZXMucmVkdWNlKCBmdW5jdGlvbiggb2Zmc2V0LCBwYWdlICl7XG4gICAgICBvdXRwdXREYXRhLnNldCggcGFnZSwgb2Zmc2V0ICk7XG4gICAgICByZXR1cm4gb2Zmc2V0ICsgcGFnZS5sZW5ndGg7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLm9uZGF0YWF2YWlsYWJsZSggb3V0cHV0RGF0YSApO1xuICB9XG4gIHRoaXMub25zdG9wKCk7XG4gIGlmICggIXRoaXMuY29uZmlnLnJldXNlV29ya2VyICkge1xuICAgIGRlbGV0ZSB0aGlzLmVuY29kZXI7XG4gIH1cbn07XG5cblxuLy8gQ2FsbGJhY2sgSGFuZGxlcnNcblJlY29yZGVyLnByb3RvdHlwZS5vbmRhdGFhdmFpbGFibGUgPSBmdW5jdGlvbigpe307XG5SZWNvcmRlci5wcm90b3R5cGUub25wYXVzZSA9IGZ1bmN0aW9uKCl7fTtcblJlY29yZGVyLnByb3RvdHlwZS5vbnJlc3VtZSA9IGZ1bmN0aW9uKCl7fTtcblJlY29yZGVyLnByb3RvdHlwZS5vbnN0YXJ0ID0gZnVuY3Rpb24oKXt9O1xuUmVjb3JkZXIucHJvdG90eXBlLm9uc3RvcCA9IGZ1bmN0aW9uKCl7fTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY29yZGVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/recorder.js\n"); /***/ }) diff --git a/dist/recorder.min.js b/dist/recorder.min.js index 473eccb..a28275f 100644 --- a/dist/recorder.min.js +++ b/dist/recorder.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Recorder=t():e.Recorder=t()}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{"flushed"===o.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,Promise.all([this.initSourceNode(e),this.initWorker()]).then(e=>{this.sourceNode=e[0],this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{"done"===i.data.message&&(e.removeEventListener("message",o),t())};e.addEventListener("message",o),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])})); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Recorder=t():e.Recorder=t()}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{"flushed"===o.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{"done"===i.data.message&&(e.removeEventListener("message",o),t())};e.addEventListener("message",o),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])})); \ No newline at end of file diff --git a/src/recorder.js b/src/recorder.js index 76ac814..2dbf746 100755 --- a/src/recorder.js +++ b/src/recorder.js @@ -209,6 +209,26 @@ Recorder.prototype.setMonitorGain = function( gain ){ }; Recorder.prototype.start = function( sourceNode ){ + if ( this.state === "inactive" ) { + this.initAudioContext( sourceNode ); + this.initAudioGraph(); + + this.encodedSamplePosition = 0; + + return this.initWorker().then(() => { + return this.initSourceNode(sourceNode); + }).then(sourceNode => { + this.sourceNode = sourceNode; + this.state = "recording"; + this.onstart(); + this.encoder.postMessage({ command: 'getHeaderPages' }); + this.sourceNode.connect( this.monitorGainNode ); + this.sourceNode.connect( this.recordingGainNode ); + }); + } +}; + +/* Recorder.prototype.start = function( sourceNode ){ if ( this.state === "inactive" ) { this.initAudioContext( sourceNode ); this.initAudioGraph(); @@ -224,7 +244,7 @@ Recorder.prototype.start = function( sourceNode ){ this.sourceNode.connect( this.recordingGainNode ); }); } -}; +}; */ Recorder.prototype.stop = function(){ if ( this.state !== "inactive" ) {