{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/audio-recorder-polyfill/index.js","webpack:///./app/javascript/packs/recorder_polyfill.js","webpack:///./node_modules/audio-recorder-polyfill/wave-encoder.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","context","processor","AudioContext","window","webkitAudioContext","error","method","event","Event","data","Error","MediaRecorder","stream","fn","js","blob","this","state","em","document","createDocumentFragment","encoder","toString","replace","Blob","Worker","URL","createObjectURL","recorder","addEventListener","e","type","mimeType","dispatchEvent","start","timeslice","clone","input","createMediaStreamSource","createScriptProcessor","onaudioprocess","postMessage","inputBuffer","getChannelData","connect","destination","slicing","setInterval","requestData","stop","getTracks","forEach","track","clearInterval","pause","resume","sampleRate","apply","arguments","removeEventListener","isTypeSupported","test","notSupported","navigator","mediaDevices","recorded","onmessage","buffer","length","Uint8Array","index","sample","push","encode","bufferLength","wav","view","DataView","setUint32","setUint16","set","dump"],"mappings":"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","file":"js/recorder_polyfill-06e30df550ee7a97d161.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 237);\n","var AudioContext = window.AudioContext || window.webkitAudioContext\n\nfunction createWorker (fn) {\n var js = fn\n .toString()\n .replace(/^function\\s*\\(\\)\\s*{/, '')\n .replace(/}$/, '')\n var blob = new Blob([js])\n return new Worker(URL.createObjectURL(blob))\n}\n\nfunction error (method) {\n var event = new Event('error')\n event.data = new Error('Wrong state for ' + method)\n return event\n}\n\nvar context, processor\n\n/**\n * Audio Recorder with MediaRecorder API.\n *\n * @param {MediaStream} stream The audio stream to record.\n *\n * @example\n * navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) {\n * var recorder = new MediaRecorder(stream)\n * })\n *\n * @class\n */\nfunction MediaRecorder (stream) {\n /**\n * The `MediaStream` passed into the constructor.\n * @type {MediaStream}\n */\n this.stream = stream\n\n /**\n * The current state of recording process.\n * @type {\"inactive\"|\"recording\"|\"paused\"}\n */\n this.state = 'inactive'\n\n this.em = document.createDocumentFragment()\n this.encoder = createWorker(MediaRecorder.encoder)\n\n var recorder = this\n this.encoder.addEventListener('message', function (e) {\n var event = new Event('dataavailable')\n event.data = new Blob([e.data], { type: recorder.mimeType })\n recorder.em.dispatchEvent(event)\n if (recorder.state === 'inactive') {\n recorder.em.dispatchEvent(new Event('stop'))\n }\n })\n}\n\nMediaRecorder.prototype = {\n /**\n * The MIME type that is being used for recording.\n * @type {string}\n */\n mimeType: 'audio/wav',\n\n /**\n * Begins recording media.\n *\n * @param {number} [timeslice] The milliseconds to record into each `Blob`.\n * If this parameter isn’t included, single `Blob`\n * will be recorded.\n *\n * @return {undefined}\n *\n * @example\n * recordButton.addEventListener('click', function () {\n * recorder.start()\n * })\n */\n start: function start (timeslice) {\n /**\n Create a clone of stream and start recording\n */\n if (this.state !== 'inactive') {\n return this.em.dispatchEvent(error('start'))\n }\n\n this.state = 'recording'\n\n if (!context) {\n context = new AudioContext()\n }\n this.clone = this.stream.clone()\n var input = context.createMediaStreamSource(this.clone)\n\n if (!processor) {\n processor = context.createScriptProcessor(2048, 1, 1)\n }\n\n var recorder = this\n processor.onaudioprocess = function (e) {\n if (recorder.state === 'recording') {\n recorder.encoder.postMessage([\n 'encode', e.inputBuffer.getChannelData(0)\n ])\n }\n }\n\n input.connect(processor)\n processor.connect(context.destination)\n\n this.em.dispatchEvent(new Event('start'))\n\n if (timeslice) {\n this.slicing = setInterval(function () {\n if (recorder.state === 'recording') recorder.requestData()\n }, timeslice)\n }\n\n return undefined\n },\n\n /**\n * Stop media capture and raise `dataavailable` event with recorded data.\n *\n * @return {undefined}\n *\n * @example\n * finishButton.addEventListener('click', function () {\n * recorder.stop()\n * })\n */\n stop: function stop () {\n /**\n Stop stream and end cloned stream tracks\n */\n if (this.state === 'inactive') {\n return this.em.dispatchEvent(error('stop'))\n }\n\n this.requestData()\n this.state = 'inactive'\n this.clone.getTracks().forEach(function (track) {\n track.stop()\n })\n return clearInterval(this.slicing)\n },\n\n /**\n * Pauses recording of media streams.\n *\n * @return {undefined}\n *\n * @example\n * pauseButton.addEventListener('click', function () {\n * recorder.pause()\n * })\n */\n pause: function pause () {\n if (this.state !== 'recording') {\n return this.em.dispatchEvent(error('pause'))\n }\n\n this.state = 'paused'\n return this.em.dispatchEvent(new Event('pause'))\n },\n\n /**\n * Resumes media recording when it has been previously paused.\n *\n * @return {undefined}\n *\n * @example\n * resumeButton.addEventListener('click', function () {\n * recorder.resume()\n * })\n */\n resume: function resume () {\n if (this.state !== 'paused') {\n return this.em.dispatchEvent(error('resume'))\n }\n\n this.state = 'recording'\n return this.em.dispatchEvent(new Event('resume'))\n },\n\n /**\n * Raise a `dataavailable` event containing the captured media.\n *\n * @return {undefined}\n *\n * @example\n * this.on('nextData', function () {\n * recorder.requestData()\n * })\n */\n requestData: function requestData () {\n if (this.state === 'inactive') {\n return this.em.dispatchEvent(error('requestData'))\n }\n\n return this.encoder.postMessage(['dump', context.sampleRate])\n },\n\n /**\n * Add listener for specified event type.\n *\n * @param {\"start\"|\"stop\"|\"pause\"|\"resume\"|\"dataavailable\"|\"error\"}\n * type Event type.\n * @param {function} listener The listener function.\n *\n * @return {undefined}\n *\n * @example\n * recorder.addEventListener('dataavailable', function (e) {\n * audio.src = URL.createObjectURL(e.data)\n * })\n */\n addEventListener: function addEventListener () {\n this.em.addEventListener.apply(this.em, arguments)\n },\n\n /**\n * Remove event listener.\n *\n * @param {\"start\"|\"stop\"|\"pause\"|\"resume\"|\"dataavailable\"|\"error\"}\n * type Event type.\n * @param {function} listener The same function used in `addEventListener`.\n *\n * @return {undefined}\n */\n removeEventListener: function removeEventListener () {\n this.em.removeEventListener.apply(this.em, arguments)\n },\n\n /**\n * Calls each of the listeners registered for a given event.\n *\n * @param {Event} event The event object.\n *\n * @return {boolean} Is event was no canceled by any listener.\n */\n dispatchEvent: function dispatchEvent () {\n this.em.dispatchEvent.apply(this.em, arguments)\n }\n}\n\n/**\n * Returns `true` if the MIME type specified is one the polyfill can record.\n *\n * This polyfill supports only `audio/wav`.\n *\n * @param {string} mimeType The mimeType to check.\n *\n * @return {boolean} `true` on `audio/wav` MIME type.\n */\nMediaRecorder.isTypeSupported = function isTypeSupported (mimeType) {\n return /audio\\/wave?/.test(mimeType)\n}\n\n/**\n * `true` if MediaRecorder can not be polyfilled in the current browser.\n * @type {boolean}\n *\n * @example\n * if (MediaRecorder.notSupported) {\n * showWarning('Audio recording is not supported in this browser')\n * }\n */\nMediaRecorder.notSupported = !navigator.mediaDevices || !AudioContext\n\n/**\n * Converts RAW audio buffer to compressed audio files.\n * It will be loaded to Web Worker.\n * By default, WAVE encoder will be used.\n * @type {function}\n *\n * @example\n * MediaRecorder.prototype.mimeType = 'audio/ogg'\n * MediaRecorder.encoder = oggEncoder\n */\nMediaRecorder.encoder = require('./wave-encoder')\n\nmodule.exports = MediaRecorder\n","// MediaRecorder polyfill\nimport MediaRecorder from 'audio-recorder-polyfill'\n\nif (!window.MediaRecorder) {\n window.MediaRecorder = MediaRecorder\n}\n","// Copied from https://github.com/chris-rudmin/Recorderjs\n\nmodule.exports = function () {\n var BYTES_PER_SAMPLE = 2\n\n var recorded = []\n\n function encode (buffer) {\n var length = buffer.length\n var data = new Uint8Array(length * BYTES_PER_SAMPLE)\n for (var i = 0; i < length; i++) {\n var index = i * BYTES_PER_SAMPLE\n var sample = buffer[i]\n if (sample > 1) {\n sample = 1\n } else if (sample < -1) {\n sample = -1\n }\n sample = sample * 32768\n data[index] = sample\n data[index + 1] = sample >> 8\n }\n recorded.push(data)\n }\n\n function dump (sampleRate) {\n var bufferLength = recorded.length ? recorded[0].length : 0\n var length = recorded.length * bufferLength\n var wav = new Uint8Array(44 + length)\n var view = new DataView(wav.buffer)\n\n // RIFF identifier 'RIFF'\n view.setUint32(0, 1380533830, false)\n // file length minus RIFF identifier length and file description length\n view.setUint32(4, 36 + length, true)\n // RIFF type 'WAVE'\n view.setUint32(8, 1463899717, false)\n // format chunk identifier 'fmt '\n view.setUint32(12, 1718449184, false)\n // format chunk length\n view.setUint32(16, 16, true)\n // sample format (raw)\n view.setUint16(20, 1, true)\n // channel count\n view.setUint16(22, 1, true)\n // sample rate\n view.setUint32(24, sampleRate, true)\n // byte rate (sample rate * block align)\n view.setUint32(28, sampleRate * BYTES_PER_SAMPLE, true)\n // block align (channel count * bytes per sample)\n view.setUint16(32, BYTES_PER_SAMPLE, true)\n // bits per sample\n view.setUint16(34, 8 * BYTES_PER_SAMPLE, true)\n // data chunk identifier 'data'\n view.setUint32(36, 1684108385, false)\n // data chunk length\n view.setUint32(40, length, true)\n\n for (var i = 0; i < recorded.length; i++) {\n wav.set(recorded[i], i * bufferLength + 44)\n }\n\n recorded = []\n postMessage(wav.buffer, [wav.buffer])\n }\n\n onmessage = function (e) {\n if (e.data[0] === 'encode') {\n encode(e.data[1])\n } else {\n dump(e.data[1])\n }\n }\n}\n"],"sourceRoot":""}