speaker-calibration 2.2.224 → 2.2.225

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -125,7 +125,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
125
125
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
126
126
 
127
127
  "use strict";
128
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array-buffer.slice.js */ \"./node_modules/core-js/modules/es.array-buffer.slice.js\");\n/* harmony import */ var core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.typed-array.uint8-array.js */ \"./node_modules/core-js/modules/es.typed-array.uint8-array.js\");\n/* harmony import */ var core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.typed-array.fill.js */ \"./node_modules/core-js/modules/es.typed-array.fill.js\");\n/* harmony import */ var core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.typed-array.set.js */ \"./node_modules/core-js/modules/es.typed-array.set.js\");\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.typed-array.sort.js */ \"./node_modules/core-js/modules/es.typed-array.sort.js\");\n/* harmony import */ var core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var qrcode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! qrcode */ \"./node_modules/qrcode/lib/browser.js\");\n/* harmony import */ var _audioPeer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./audioPeer */ \"./src/peer-connection/audioPeer.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _peerErrors__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./peerErrors */ \"./src/peer-connection/peerErrors.js\");\n/* harmony import */ var peerjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! peerjs */ \"./node_modules/peerjs/dist/bundler.mjs\");\nvar _Speaker;\n\n\n\n\n\n\n\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n\n\n\n\n\n//import {phrases} from '../../dist/example/i18n';\n\n/**\r\n * @class Handles the speaker's side of the connection. Responsible for initiating the connection,\r\n * rendering the QRCode, and answering the call.\r\n * @augments AudioPeer\r\n */\nvar _showQRCode = /*#__PURE__*/new WeakMap();\nvar _showSpinner = /*#__PURE__*/new WeakMap();\nvar _removeUIElems = /*#__PURE__*/new WeakMap();\nvar _onPeerOpen = /*#__PURE__*/new WeakMap();\nvar _onPeerConnection = /*#__PURE__*/new WeakMap();\nvar _onPeerDisconnected = /*#__PURE__*/new WeakMap();\nvar _onPeerError = /*#__PURE__*/new WeakMap();\nvar _onIncomingData = /*#__PURE__*/new WeakMap();\nvar _ready = /*#__PURE__*/new WeakMap();\nclass Speaker extends _audioPeer__WEBPACK_IMPORTED_MODULE_8__[\"default\"] {\n /**\r\n * Takes the url of the current site and a target element where html elements will be appended.\r\n *\r\n * @param params - See type definition for initParameters.\r\n * @param Calibrator - An instance of the AudioCalibrator class, should not use AudioCalibrator directly, instead use an extended class available in /tasks/.\r\n * @param CalibratorInstance\r\n * @example\r\n */\n constructor(_params, _CalibratorInstance) {\n var _params$language, _params$debug, _params$isSmartPhone, _params$calibrateSoun, _params$calibrateSoun2, _params$instructionDi, _params$soundSubtitle, _params$timeToCalibra, _params$soundMessageI, _params$titleDisplayI, _params$timeToCalibra2, _params$isParticipant, _params$isLoudspeaker, _params$micrpohoneIdF, _params$buttonsContai, _params$phrases, _params$calibrateSoun3;\n super(_params);\n _defineProperty(this, \"uri\", '');\n _defineProperty(this, \"qrImage\", void 0);\n _defineProperty(this, \"shortURL\", void 0);\n _defineProperty(this, \"initPeer\", async () => {\n const id = await this.generateTimeBasedPeerID();\n this.peer = new peerjs__WEBPACK_IMPORTED_MODULE_11__[\"default\"](id, {\n secure: true,\n host: 'easyeyes-peer-server.herokuapp.com',\n port: 443,\n config: {\n iceServers: [{\n urls: 'stun:stun.relay.metered.ca:80'\n }, {\n urls: 'turn:global.relay.metered.ca:80',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turn:global.relay.metered.ca:80?transport=tcp',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turn:global.relay.metered.ca:443',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turns:global.relay.metered.ca:443?transport=tcp',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }]\n }\n });\n this.peer.on('open', _classPrivateFieldGet(_onPeerOpen, this));\n this.peer.on('connection', _classPrivateFieldGet(_onPeerConnection, this));\n this.peer.on('close', this.onPeerClose);\n this.peer.on('disconnected', _classPrivateFieldGet(_onPeerDisconnected, this));\n this.peer.on('error', _classPrivateFieldGet(_onPeerError, this));\n });\n _defineProperty(this, \"generateTimeBasedPeerID\", async () => {\n const now = new Date().getTime();\n const randomBuffer = new Uint8Array(10);\n crypto.getRandomValues(randomBuffer);\n const randomPart = Array.from(randomBuffer).map(b => b.toString(36)).join('');\n const toHash = \"\".concat(now, \"-\").concat(randomPart);\n const encoder = new TextEncoder();\n const data = encoder.encode(toHash);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hash)); // Convert buffer to byte array\n const hashString = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n const shortHash = hashString.substring(0, 12); // Use more of the hash for a longer ID\n // return shortHash; // Consider converting this to Base62\n return this.encodeBase62(parseInt(shortHash, 16));\n });\n _defineProperty(this, \"encodeBase62\", num => {\n const base = 36;\n const characters = '0123456789abcdefghijklmnopqrstuvwxyz';\n let result = '';\n while (num > 0) {\n result = characters[num % base] + result;\n num = Math.floor(num / base);\n }\n return result;\n });\n /**\r\n * Called after the peer conncection has been opened.\r\n * Generates a QR code for the connection and displays it.\r\n *\r\n * @private\r\n * @example\r\n */\n\n _classPrivateFieldInitSpec(this, _showQRCode, async () => {\n const queryStringParameters = {\n speakerPeerId: this.peer.id,\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n };\n const queryString = this.queryStringFromObject(queryStringParameters);\n this.uri = this.siteUrl + queryString;\n if (this.isSmartPhone) {\n // Generate QR code\n const qrCanvas = document.createElement('canvas');\n qrCanvas.setAttribute('id', 'qrCanvas');\n qrcode__WEBPACK_IMPORTED_MODULE_7__.toCanvas(qrCanvas, this.uri, error => {\n if (error) console.error(error);\n });\n\n // Create QR image\n const qrImage = new Image();\n qrImage.setAttribute('id', 'compatibilityCheckQRImage');\n qrImage.style.zIndex = Infinity;\n qrImage.style.height = '150px';\n qrImage.style.width = '150px';\n qrImage.style.margin = '-10px';\n qrImage.style.aspectRatio = 1;\n qrImage.src = qrCanvas.toDataURL();\n this.qrImage = qrImage;\n\n // Get shortened URL\n let shortURL = this.uri;\n try {\n const response = await fetch('https://api.short.io/links/public', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: 'pk_fysLKGj3legZz4XZ'\n },\n body: JSON.stringify({\n domain: 'listeners.link',\n originalURL: this.uri\n })\n });\n if (!response.ok) {\n throw new Error(\"HTTP error! Status: \".concat(response.status));\n }\n const data = await response.json();\n shortURL = data.shortURL;\n } catch (error) {\n console.error('Error:', error.message);\n }\n\n // Main container with 3 columns\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.alignItems = 'flex-start';\n container.style.paddingTop = '0';\n container.id = 'skipQRContainer';\n\n // Column 1: QR Code\n const qrColumn = document.createElement('div');\n qrColumn.style.flex = '0 0 auto';\n qrColumn.appendChild(qrImage);\n\n // Column 2: Explanation Text\n const textColumn = document.createElement('div');\n textColumn.style.flex = '1';\n textColumn.style.padding = '0 20px';\n textColumn.style.maxWidth = '560px';\n const explanation = document.createElement('h2');\n explanation.style.fontSize = '1.1rem';\n explanation.id = 'skipQRExplanation';\n explanation.style.margin = '0';\n explanation.style.textAlign = 'left';\n explanation.innerHTML = (0,_utils__WEBPACK_IMPORTED_MODULE_9__.formatLineBreak)(this.phrases.RC_skipQR_ExplanationWithoutPreferNot[this.language].replace('xxx', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")).replace('XXX', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")), this.phrases.RC_checkInternetConnection[this.language]);\n const language = this.language;\n const phrases = this.phrases;\n const checkConnection = document.createElement('a');\n checkConnection.id = 'check-connection';\n checkConnection.href = '#';\n checkConnection.innerHTML = \"check the phone's internet connection\";\n checkConnection.addEventListener('click', function (event) {\n event.preventDefault();\n (0,_utils__WEBPACK_IMPORTED_MODULE_9__.createAndShowPopup)(language, phrases);\n });\n explanation.querySelector('a#check-connection').replaceWith(checkConnection);\n textColumn.appendChild(explanation);\n\n // Column 3: Buttons\n const buttonColumn = document.createElement('div');\n buttonColumn.style.display = 'flex';\n buttonColumn.style.flexDirection = 'column';\n buttonColumn.style.gap = '10px';\n buttonColumn.style.flex = '0 0 auto';\n buttonColumn.style.alignItems = 'flex-end';\n buttonColumn.appendChild(this.buttonsContainer);\n\n // Assemble the columns\n container.appendChild(qrColumn);\n container.appendChild(textColumn);\n container.appendChild(buttonColumn);\n document.getElementById(this.targetElement).appendChild(container);\n } else {\n // show the link to the user\n // If specified HTML Id is available, show QR code there\n if (document.getElementById(this.targetElement)) {\n // const linkTag = document.createElement('a');\n // linkTag.setAttribute('href', uri);\n // linkTag.innerHTML = 'Click here to start the calibration';\n // linkTag.target = '_blank';\n // document.getElementById(this.targetElement).appendChild(linkTag);\n // document.getElementById(this.targetElement).appendChild(qrCanvas);\n\n const proceedButton = document.createElement('button');\n proceedButton.setAttribute('id', 'calibrationProceedButton');\n proceedButton.setAttribute('class', 'btn btn-success');\n proceedButton.innerHTML = this.phrases.T_proceed[this.language];\n proceedButton.onclick = () => {\n // open the link in a new tab\n window.open(this.uri, '_blank');\n // remove the button\n document.getElementById('calibrationProceedButton').remove();\n };\n document.getElementById(this.targetElement).appendChild(proceedButton);\n }\n }\n // or just print it to console\n console.log('TEST: Peer reachable at: ', this.uri);\n });\n _classPrivateFieldInitSpec(this, _showSpinner, () => {\n const spinner = document.createElement('div');\n spinner.className = 'spinner-border ml-auto';\n spinner.role = 'status';\n spinner.ariaHidden = 'true';\n spinner.style.marginTop = '0.8rem';\n document.getElementById(this.targetElement).appendChild(spinner);\n\n // clear instructionDisplay\n const soundMessage = document.getElementById(this.soundMessageId);\n soundMessage.innerHTML = '';\n soundMessage.style.display = 'none';\n const instructionDisplay = document.getElementById(this.instructionDisplayId);\n const background = document.getElementById('background'); // todo: get background id from params\n const subtitle = document.getElementById(this.soundSubtitleId);\n if (subtitle) {\n subtitle.innerHTML = '';\n }\n if (instructionDisplay) {\n instructionDisplay.innerHTML = '';\n instructionDisplay.style.whiteSpace = 'nowrap';\n instructionDisplay.style.fontWeight = 'bold';\n instructionDisplay.style.width = 'fit-content';\n instructionDisplay.innerHTML = this.phrases.RC_soundRecording[this.language];\n let fontSize = 100;\n instructionDisplay.style.fontSize = fontSize + 'px';\n while (instructionDisplay.scrollWidth > background.scrollWidth * 0.9 && fontSize > 10) {\n fontSize--;\n instructionDisplay.style.fontSize = fontSize + 'px';\n }\n // const p = document.createElement('p');\n // // font size\n // p.style.fontSize = '1.1rem';\n // p.style.fontWeight = 'normal';\n // p.style.paddingTop = '20px';\n // const timeToCalibrateText = phrases.RC_howLongToCalibrate['en-US'];\n // p.innerHTML = timeToCalibrateText.replace('111', this.timeToCalibrate);\n // instructionDisplay.appendChild(p);\n }\n const timeToCalibrateDisplay = document.getElementById(this.timeToCalibrateDisplay);\n if (timeToCalibrateDisplay) {\n const timeToCalibrateText = this.phrases.RC_howLongToCalibrate[this.language];\n timeToCalibrateDisplay.innerHTML = timeToCalibrateText.replace('111', this.timeToCalibrate);\n timeToCalibrateDisplay.style.fontWeight = 'normal';\n timeToCalibrateDisplay.style.fontSize = '1rem';\n // timeToCalibrateDisplay.style.paddingTop = '20px';\n }\n\n // Update title - titleDisplayId\n const titleDisplay = document.getElementById(this.titleDisplayId);\n if (titleDisplay) {\n // if (this.isParticipant) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n // } else if (this.isSmartPhone) {\n // if (this.isLoudspeakerCalibration) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n if (this.isLoudspeakerCalibration) {\n if (this.isParticipant) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n } else if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('4', '5');\n }\n } else {\n if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n }\n }\n }\n });\n _classPrivateFieldInitSpec(this, _removeUIElems, () => {\n const parent = document.getElementById(this.targetElement);\n while (parent.firstChild) {\n parent.firstChild.remove();\n }\n });\n /**\r\n * Called when the peer connection is opened.\r\n * Saves the peer id and calls the QR code generator.\r\n *\r\n * @param peerId - The peer id of the peer connection.\r\n * @param id\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerOpen, id => {\n // Workaround for peer.reconnect deleting previous id\n try {\n if (id === null) {\n console.error('Received null id from peer open');\n this.peer.id = this.lastPeerId;\n } else {\n this.lastPeerId = this.peer.id;\n }\n if (id !== this.peer.id) {\n console.warn('DEBUG Check you assumption that id === this.peer.id');\n }\n } catch (error) {\n console.error('Error in #onPeerOpen: ', error);\n }\n _classPrivateFieldGet(_showQRCode, this).call(this);\n });\n /**\r\n * Called when the peer connection is established.\r\n * Enforces a single connection.\r\n *\r\n * @param connection - The connection object.\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerConnection, connection => {\n // Allow only a single connection\n if (this.conn && this.conn.open) {\n connection.on('open', () => {\n connection.send('Already connected to another client');\n setTimeout(() => {\n connection.close();\n }, 500);\n });\n return;\n }\n this.conn = connection;\n console.log('Connected to: ', this.conn.peer);\n _classPrivateFieldGet(_ready, this).call(this);\n });\n /**\r\n * Called when the peer connection is closed.\r\n *\r\n * @private\r\n * @example\r\n */\n _defineProperty(this, \"onPeerClose\", () => {\n this.conn = null;\n console.log('Connection destroyed');\n });\n /**\r\n * Called when the peer connection is disconnected.\r\n * Attempts to reconnect.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerDisconnected, () => {\n console.log('Connection lost. Please reconnect');\n try {\n // Workaround for peer.reconnect deleting previous id\n this.peer.id = this.lastPeerId;\n // eslint-disable-next-line no-underscore-dangle\n this.peer._lastServerId = this.lastPeerId;\n this.peer.reconnect();\n } catch (error) {\n console.error('Error in #onPeerDisconnected: ', error);\n }\n });\n /**\r\n * Called when the peer connection encounters an error.\r\n *\r\n * @param error\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerError, error => {\n // TODO: check if this function is needed or not\n console.error(error);\n });\n /**\r\n * Called when data is received from the peer connection.\r\n *\r\n * @param data\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onIncomingData, data => {\n // enforce object type\n if (!Object.prototype.hasOwnProperty.call(data, 'name') || !Object.prototype.hasOwnProperty.call(data, 'payload')) {\n console.error('Received malformed data: ', data);\n return;\n }\n switch (data.name) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', data.payload);\n if (!data.payload) {\n this.ac.setSamplingRates(this.calibrateSoundHz);\n } else {\n this.ac.setSamplingRates(data.payload);\n }\n break;\n case 'sampleSize':\n this.ac.setSampleSize(data.payload);\n break;\n case 'deviceType':\n this.ac.setDeviceType(data.payload);\n break;\n case 'deviceName':\n this.ac.setDeviceName(data.payload);\n break;\n case 'flags':\n //this.ac.setDeviceName(data.payload);\n console.log('FLAGS');\n console.log(data.payload);\n this.ac.setFlags(data.payload);\n break;\n case 'deviceInfo':\n this.ac.setDeviceInfo(data.payload);\n console.log('Received device info from listener: ', data.payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', data.payload);\n if (data.payload.type === 'error') {\n this.permissionStatus = 'error';\n this.ac.setPermissionStatus('error');\n } else if (data.payload.type === 'denied') {\n this.permissionStatus = 'denied';\n this.ac.setPermissionStatus('denied');\n } else if (data.payload.type === 'granted') {\n this.permissionStatus = 'granted';\n this.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_10__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_10__.MissingSpeakerIdError.name:\n throw data.payload;\n break;\n default:\n break;\n }\n });\n /**\r\n * Called when the peer connection is #ready.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _ready, () => {\n // Perform callback with data\n this.conn.on('data', _classPrivateFieldGet(_onIncomingData, this));\n this.conn.on('close', () => {\n console.log('Connection reset<br>Awaiting connection...');\n this.conn = null;\n });\n });\n /** .\r\n * .\r\n * .\r\n * Debug method for downloading the recorded audio\r\n *\r\n * @public\r\n * @example\r\n */\n _defineProperty(this, \"downloadData\", () => {\n this.ac.downloadData();\n });\n _defineProperty(this, \"repeatCalibration\", async (params, stream, CalibratorInstance) => {\n this.ac = CalibratorInstance;\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n _classPrivateFieldGet(_showSpinner, this).call(this);\n console.log('This is a repeat');\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (this.permissionStatus === 'error' || this.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n resolve('permission denied');\n }\n }, 100);\n\n // Start calibration process\n (async () => {\n try {\n const result = await this.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId);\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n resolve(result);\n } catch (error) {\n clearInterval(permissionCheckInterval);\n reject(error);\n }\n })();\n });\n });\n this.language = (_params$language = _params === null || _params === void 0 ? void 0 : _params.language) !== null && _params$language !== void 0 ? _params$language : 'en-US';\n this.siteUrl += '/listener?';\n this.ac = _CalibratorInstance;\n this.result = null;\n this.debug = (_params$debug = _params === null || _params === void 0 ? void 0 : _params.debug) !== null && _params$debug !== void 0 ? _params$debug : false;\n this.isSmartPhone = (_params$isSmartPhone = _params === null || _params === void 0 ? void 0 : _params.isSmartPhone) !== null && _params$isSmartPhone !== void 0 ? _params$isSmartPhone : false;\n this.calibrateSoundHz = (_params$calibrateSoun = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundHz) !== null && _params$calibrateSoun !== void 0 ? _params$calibrateSoun : 48000;\n this.calibrateSoundSamplingDesiredBits = (_params$calibrateSoun2 = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundSamplingDesiredBits) !== null && _params$calibrateSoun2 !== void 0 ? _params$calibrateSoun2 : 24;\n this.instructionDisplayId = (_params$instructionDi = _params === null || _params === void 0 ? void 0 : _params.instructionDisplayId) !== null && _params$instructionDi !== void 0 ? _params$instructionDi : '';\n this.soundSubtitleId = (_params$soundSubtitle = _params === null || _params === void 0 ? void 0 : _params.soundSubtitleId) !== null && _params$soundSubtitle !== void 0 ? _params$soundSubtitle : '';\n this.timeToCalibrateDisplay = (_params$timeToCalibra = _params === null || _params === void 0 ? void 0 : _params.timeToCalibrateId) !== null && _params$timeToCalibra !== void 0 ? _params$timeToCalibra : '';\n this.soundMessageId = (_params$soundMessageI = _params === null || _params === void 0 ? void 0 : _params.soundMessageId) !== null && _params$soundMessageI !== void 0 ? _params$soundMessageI : '';\n this.titleDisplayId = (_params$titleDisplayI = _params === null || _params === void 0 ? void 0 : _params.titleDisplayId) !== null && _params$titleDisplayI !== void 0 ? _params$titleDisplayI : '';\n this.timeToCalibrate = (_params$timeToCalibra2 = _params === null || _params === void 0 ? void 0 : _params.timeToCalibrate) !== null && _params$timeToCalibra2 !== void 0 ? _params$timeToCalibra2 : 10;\n this.isParticipant = (_params$isParticipant = _params === null || _params === void 0 ? void 0 : _params.isParticipant) !== null && _params$isParticipant !== void 0 ? _params$isParticipant : false;\n this.isLoudspeakerCalibration = (_params$isLoudspeaker = _params === null || _params === void 0 ? void 0 : _params.isLoudspeakerCalibration) !== null && _params$isLoudspeaker !== void 0 ? _params$isLoudspeaker : false;\n this.deviceId = (_params$micrpohoneIdF = _params === null || _params === void 0 ? void 0 : _params.micrpohoneIdFromWebAudioApi) !== null && _params$micrpohoneIdF !== void 0 ? _params$micrpohoneIdF : '';\n this.buttonsContainer = (_params$buttonsContai = _params === null || _params === void 0 ? void 0 : _params.buttonsContainer) !== null && _params$buttonsContai !== void 0 ? _params$buttonsContai : document.createElement('div');\n this.phrases = (_params$phrases = _params === null || _params === void 0 ? void 0 : _params.phrases) !== null && _params$phrases !== void 0 ? _params$phrases : {};\n this.permissionStatus = 'pending';\n this.calibrateSoundHz = (_params$calibrateSoun3 = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundHz) !== null && _params$calibrateSoun3 !== void 0 ? _params$calibrateSoun3 : 48000;\n\n /* Set up callbacks that handle any events related to our peer object. */\n }\n}\n\n/* \r\nReferenced links:\r\nhttps://stackoverflow.com/questions/28016664/when-you-pass-this-as-an-argument/28016676#28016676\r\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\r\nhttps://stackoverflow.com/questions/879152/how-do-i-make-javascript-beep [3]\r\n*/\n_Speaker = Speaker;\n/**\r\n * Async factory method that creates the Speaker object, and returns a promise that resolves to the result of the calibration.\r\n *\r\n * @param params - The parameters to be passed to the peer object.\r\n * @param Calibrator - The class that defines the calibration process.\r\n * @param CalibratorInstance\r\n * @param timeOut - The amount of time to wait before timing out the connection (in milliseconds).\r\n * @public\r\n * @example\r\n */\n_defineProperty(Speaker, \"startCalibration\", async function (params, CalibratorInstance) {\n let timeOut = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance);\n const {\n speaker\n } = window;\n await speaker.initPeer();\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (speaker.permissionStatus === 'error' || speaker.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve('permission denied');\n }\n }, 100);\n\n // when a call is received\n speaker.peer.on('call', async call => {\n clearInterval(permissionCheckInterval); // Clear interval when call is received\n // Rest of the existing call handling code...\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_9__.sleep)(1);\n }\n if (params.displayUpdate) {\n params.displayUpdate.style.display = '';\n }\n\n // resolve when we have a result\n speaker.result = await speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n clearInterval(permissionCheckInterval);\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_10__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"testIIR\", async function (params, CalibratorInstance, IIR) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance);\n const {\n speaker\n } = window;\n speaker.initPeer();\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // when a call is received\n speaker.peer.on('call', async call => {\n // Answer the call (one way)\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_9__.sleep)(1);\n }\n // resolve when we have a result\n speaker.result = await speaker.ac.playMLSwithIIR(stream, IIR);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_10__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"closeConnection\", () => {\n _Speaker.conn = null;\n console.log('Connection destroyed');\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Speaker);\n\n//# sourceURL=webpack://speakerCalibrator/./src/peer-connection/speaker.js?");
128
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array-buffer.slice.js */ \"./node_modules/core-js/modules/es.array-buffer.slice.js\");\n/* harmony import */ var core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_buffer_slice_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.typed-array.uint8-array.js */ \"./node_modules/core-js/modules/es.typed-array.uint8-array.js\");\n/* harmony import */ var core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_uint8_array_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.typed-array.fill.js */ \"./node_modules/core-js/modules/es.typed-array.fill.js\");\n/* harmony import */ var core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_fill_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.typed-array.set.js */ \"./node_modules/core-js/modules/es.typed-array.set.js\");\n/* harmony import */ var core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_set_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.typed-array.sort.js */ \"./node_modules/core-js/modules/es.typed-array.sort.js\");\n/* harmony import */ var core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_typed_array_sort_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var qrcode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! qrcode */ \"./node_modules/qrcode/lib/browser.js\");\n/* harmony import */ var _audioPeer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./audioPeer */ \"./src/peer-connection/audioPeer.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _peerErrors__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./peerErrors */ \"./src/peer-connection/peerErrors.js\");\n/* harmony import */ var peerjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! peerjs */ \"./node_modules/peerjs/dist/bundler.mjs\");\nvar _Speaker;\n\n\n\n\n\n\n\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n\n\n\n\n\n//import {phrases} from '../../dist/example/i18n';\n\n/**\r\n * @class Handles the speaker's side of the connection. Responsible for initiating the connection,\r\n * rendering the QRCode, and answering the call.\r\n * @augments AudioPeer\r\n */\nvar _showQRCode = /*#__PURE__*/new WeakMap();\nvar _showSpinner = /*#__PURE__*/new WeakMap();\nvar _removeUIElems = /*#__PURE__*/new WeakMap();\nvar _onPeerOpen = /*#__PURE__*/new WeakMap();\nvar _onPeerConnection = /*#__PURE__*/new WeakMap();\nvar _onPeerDisconnected = /*#__PURE__*/new WeakMap();\nvar _onPeerError = /*#__PURE__*/new WeakMap();\nvar _onIncomingData = /*#__PURE__*/new WeakMap();\nvar _ready = /*#__PURE__*/new WeakMap();\nclass Speaker extends _audioPeer__WEBPACK_IMPORTED_MODULE_8__[\"default\"] {\n /**\r\n * Takes the url of the current site and a target element where html elements will be appended.\r\n *\r\n * @param params - See type definition for initParameters.\r\n * @param Calibrator - An instance of the AudioCalibrator class, should not use AudioCalibrator directly, instead use an extended class available in /tasks/.\r\n * @param CalibratorInstance\r\n * @example\r\n */\n constructor(_params, _CalibratorInstance) {\n var _params$language, _params$debug, _params$isSmartPhone, _params$calibrateSoun, _params$calibrateSoun2, _params$instructionDi, _params$soundSubtitle, _params$timeToCalibra, _params$soundMessageI, _params$titleDisplayI, _params$timeToCalibra2, _params$isParticipant, _params$isLoudspeaker, _params$micrpohoneIdF, _params$buttonsContai, _params$phrases, _params$calibrateSoun3;\n super(_params);\n _defineProperty(this, \"uri\", '');\n _defineProperty(this, \"qrImage\", void 0);\n _defineProperty(this, \"shortURL\", void 0);\n _defineProperty(this, \"initPeer\", async () => {\n const id = await this.generateTimeBasedPeerID();\n this.peer = new peerjs__WEBPACK_IMPORTED_MODULE_11__[\"default\"](id, {\n secure: true,\n host: 'easyeyes-peer-server.herokuapp.com',\n port: 443,\n config: {\n iceServers: [{\n urls: 'turn:global.relay.metered.ca:80',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turn:global.relay.metered.ca:80?transport=tcp',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turn:global.relay.metered.ca:443',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }, {\n urls: 'turns:global.relay.metered.ca:443?transport=tcp',\n username: 'de884cfc34189cdf1a5dd616',\n credential: 'IcOpouU9/TYBmpHU'\n }]\n }\n });\n this.peer.on('open', _classPrivateFieldGet(_onPeerOpen, this));\n this.peer.on('connection', _classPrivateFieldGet(_onPeerConnection, this));\n this.peer.on('close', this.onPeerClose);\n this.peer.on('disconnected', _classPrivateFieldGet(_onPeerDisconnected, this));\n this.peer.on('error', _classPrivateFieldGet(_onPeerError, this));\n });\n _defineProperty(this, \"generateTimeBasedPeerID\", async () => {\n const now = new Date().getTime();\n const randomBuffer = new Uint8Array(10);\n crypto.getRandomValues(randomBuffer);\n const randomPart = Array.from(randomBuffer).map(b => b.toString(36)).join('');\n const toHash = \"\".concat(now, \"-\").concat(randomPart);\n const encoder = new TextEncoder();\n const data = encoder.encode(toHash);\n const hash = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hash)); // Convert buffer to byte array\n const hashString = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n const shortHash = hashString.substring(0, 12); // Use more of the hash for a longer ID\n // return shortHash; // Consider converting this to Base62\n return this.encodeBase62(parseInt(shortHash, 16));\n });\n _defineProperty(this, \"encodeBase62\", num => {\n const base = 36;\n const characters = '0123456789abcdefghijklmnopqrstuvwxyz';\n let result = '';\n while (num > 0) {\n result = characters[num % base] + result;\n num = Math.floor(num / base);\n }\n return result;\n });\n /**\r\n * Called after the peer conncection has been opened.\r\n * Generates a QR code for the connection and displays it.\r\n *\r\n * @private\r\n * @example\r\n */\n\n _classPrivateFieldInitSpec(this, _showQRCode, async () => {\n const queryStringParameters = {\n speakerPeerId: this.peer.id,\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n };\n const queryString = this.queryStringFromObject(queryStringParameters);\n this.uri = this.siteUrl + queryString;\n if (this.isSmartPhone) {\n // Generate QR code\n const qrCanvas = document.createElement('canvas');\n qrCanvas.setAttribute('id', 'qrCanvas');\n qrcode__WEBPACK_IMPORTED_MODULE_7__.toCanvas(qrCanvas, this.uri, error => {\n if (error) console.error(error);\n });\n\n // Create QR image\n const qrImage = new Image();\n qrImage.setAttribute('id', 'compatibilityCheckQRImage');\n qrImage.style.zIndex = Infinity;\n qrImage.style.height = '150px';\n qrImage.style.width = '150px';\n qrImage.style.margin = '-10px';\n qrImage.style.aspectRatio = 1;\n qrImage.src = qrCanvas.toDataURL();\n this.qrImage = qrImage;\n\n // Get shortened URL\n let shortURL = this.uri;\n try {\n const response = await fetch('https://api.short.io/links/public', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: 'pk_fysLKGj3legZz4XZ'\n },\n body: JSON.stringify({\n domain: 'listeners.link',\n originalURL: this.uri\n })\n });\n if (!response.ok) {\n throw new Error(\"HTTP error! Status: \".concat(response.status));\n }\n const data = await response.json();\n shortURL = data.shortURL;\n } catch (error) {\n console.error('Error:', error.message);\n }\n\n // Main container with 3 columns\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.alignItems = 'flex-start';\n container.style.paddingTop = '0';\n container.id = 'skipQRContainer';\n\n // Column 1: QR Code\n const qrColumn = document.createElement('div');\n qrColumn.style.flex = '0 0 auto';\n qrColumn.appendChild(qrImage);\n\n // Column 2: Explanation Text\n const textColumn = document.createElement('div');\n textColumn.style.flex = '1';\n textColumn.style.padding = '0 20px';\n textColumn.style.maxWidth = '560px';\n const explanation = document.createElement('h2');\n explanation.style.fontSize = '1.1rem';\n explanation.id = 'skipQRExplanation';\n explanation.style.margin = '0';\n explanation.style.textAlign = 'left';\n explanation.innerHTML = (0,_utils__WEBPACK_IMPORTED_MODULE_9__.formatLineBreak)(this.phrases.RC_skipQR_ExplanationWithoutPreferNot[this.language].replace('xxx', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")).replace('XXX', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")), this.phrases.RC_checkInternetConnection[this.language]);\n const language = this.language;\n const phrases = this.phrases;\n const checkConnection = document.createElement('a');\n checkConnection.id = 'check-connection';\n checkConnection.href = '#';\n checkConnection.innerHTML = \"check the phone's internet connection\";\n checkConnection.addEventListener('click', function (event) {\n event.preventDefault();\n (0,_utils__WEBPACK_IMPORTED_MODULE_9__.createAndShowPopup)(language, phrases);\n });\n explanation.querySelector('a#check-connection').replaceWith(checkConnection);\n textColumn.appendChild(explanation);\n\n // Column 3: Buttons\n const buttonColumn = document.createElement('div');\n buttonColumn.style.display = 'flex';\n buttonColumn.style.flexDirection = 'column';\n buttonColumn.style.gap = '10px';\n buttonColumn.style.flex = '0 0 auto';\n buttonColumn.style.alignItems = 'flex-end';\n buttonColumn.appendChild(this.buttonsContainer);\n\n // Assemble the columns\n container.appendChild(qrColumn);\n container.appendChild(textColumn);\n container.appendChild(buttonColumn);\n document.getElementById(this.targetElement).appendChild(container);\n } else {\n // show the link to the user\n // If specified HTML Id is available, show QR code there\n if (document.getElementById(this.targetElement)) {\n // const linkTag = document.createElement('a');\n // linkTag.setAttribute('href', uri);\n // linkTag.innerHTML = 'Click here to start the calibration';\n // linkTag.target = '_blank';\n // document.getElementById(this.targetElement).appendChild(linkTag);\n // document.getElementById(this.targetElement).appendChild(qrCanvas);\n\n const proceedButton = document.createElement('button');\n proceedButton.setAttribute('id', 'calibrationProceedButton');\n proceedButton.setAttribute('class', 'btn btn-success');\n proceedButton.innerHTML = this.phrases.T_proceed[this.language];\n proceedButton.onclick = () => {\n // open the link in a new tab\n window.open(this.uri, '_blank');\n // remove the button\n document.getElementById('calibrationProceedButton').remove();\n };\n document.getElementById(this.targetElement).appendChild(proceedButton);\n }\n }\n // or just print it to console\n console.log('TEST: Peer reachable at: ', this.uri);\n });\n _classPrivateFieldInitSpec(this, _showSpinner, () => {\n const spinner = document.createElement('div');\n spinner.className = 'spinner-border ml-auto';\n spinner.role = 'status';\n spinner.ariaHidden = 'true';\n spinner.style.marginTop = '0.8rem';\n document.getElementById(this.targetElement).appendChild(spinner);\n\n // clear instructionDisplay\n const soundMessage = document.getElementById(this.soundMessageId);\n soundMessage.innerHTML = '';\n soundMessage.style.display = 'none';\n const instructionDisplay = document.getElementById(this.instructionDisplayId);\n const background = document.getElementById('background'); // todo: get background id from params\n const subtitle = document.getElementById(this.soundSubtitleId);\n if (subtitle) {\n subtitle.innerHTML = '';\n }\n if (instructionDisplay) {\n instructionDisplay.innerHTML = '';\n instructionDisplay.style.whiteSpace = 'nowrap';\n instructionDisplay.style.fontWeight = 'bold';\n instructionDisplay.style.width = 'fit-content';\n instructionDisplay.innerHTML = this.phrases.RC_soundRecording[this.language];\n let fontSize = 100;\n instructionDisplay.style.fontSize = fontSize + 'px';\n while (instructionDisplay.scrollWidth > background.scrollWidth * 0.9 && fontSize > 10) {\n fontSize--;\n instructionDisplay.style.fontSize = fontSize + 'px';\n }\n // const p = document.createElement('p');\n // // font size\n // p.style.fontSize = '1.1rem';\n // p.style.fontWeight = 'normal';\n // p.style.paddingTop = '20px';\n // const timeToCalibrateText = phrases.RC_howLongToCalibrate['en-US'];\n // p.innerHTML = timeToCalibrateText.replace('111', this.timeToCalibrate);\n // instructionDisplay.appendChild(p);\n }\n const timeToCalibrateDisplay = document.getElementById(this.timeToCalibrateDisplay);\n if (timeToCalibrateDisplay) {\n const timeToCalibrateText = this.phrases.RC_howLongToCalibrate[this.language];\n timeToCalibrateDisplay.innerHTML = timeToCalibrateText.replace('111', this.timeToCalibrate);\n timeToCalibrateDisplay.style.fontWeight = 'normal';\n timeToCalibrateDisplay.style.fontSize = '1rem';\n // timeToCalibrateDisplay.style.paddingTop = '20px';\n }\n\n // Update title - titleDisplayId\n const titleDisplay = document.getElementById(this.titleDisplayId);\n if (titleDisplay) {\n // if (this.isParticipant) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n // } else if (this.isSmartPhone) {\n // if (this.isLoudspeakerCalibration) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n if (this.isLoudspeakerCalibration) {\n if (this.isParticipant) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n } else if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('4', '5');\n }\n } else {\n if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n }\n }\n }\n });\n _classPrivateFieldInitSpec(this, _removeUIElems, () => {\n const parent = document.getElementById(this.targetElement);\n while (parent.firstChild) {\n parent.firstChild.remove();\n }\n });\n /**\r\n * Called when the peer connection is opened.\r\n * Saves the peer id and calls the QR code generator.\r\n *\r\n * @param peerId - The peer id of the peer connection.\r\n * @param id\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerOpen, id => {\n // Workaround for peer.reconnect deleting previous id\n try {\n if (id === null) {\n console.error('Received null id from peer open');\n this.peer.id = this.lastPeerId;\n } else {\n this.lastPeerId = this.peer.id;\n }\n if (id !== this.peer.id) {\n console.warn('DEBUG Check you assumption that id === this.peer.id');\n }\n } catch (error) {\n console.error('Error in #onPeerOpen: ', error);\n }\n _classPrivateFieldGet(_showQRCode, this).call(this);\n });\n /**\r\n * Called when the peer connection is established.\r\n * Enforces a single connection.\r\n *\r\n * @param connection - The connection object.\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerConnection, connection => {\n // Allow only a single connection\n if (this.conn && this.conn.open) {\n connection.on('open', () => {\n connection.send('Already connected to another client');\n setTimeout(() => {\n connection.close();\n }, 500);\n });\n return;\n }\n this.conn = connection;\n console.log('Connected to: ', this.conn.peer);\n _classPrivateFieldGet(_ready, this).call(this);\n });\n /**\r\n * Called when the peer connection is closed.\r\n *\r\n * @private\r\n * @example\r\n */\n _defineProperty(this, \"onPeerClose\", () => {\n this.conn = null;\n console.log('Connection destroyed');\n });\n /**\r\n * Called when the peer connection is disconnected.\r\n * Attempts to reconnect.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerDisconnected, () => {\n console.log('Connection lost. Please reconnect');\n try {\n // Workaround for peer.reconnect deleting previous id\n this.peer.id = this.lastPeerId;\n // eslint-disable-next-line no-underscore-dangle\n this.peer._lastServerId = this.lastPeerId;\n this.peer.reconnect();\n } catch (error) {\n console.error('Error in #onPeerDisconnected: ', error);\n }\n });\n /**\r\n * Called when the peer connection encounters an error.\r\n *\r\n * @param error\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerError, error => {\n // TODO: check if this function is needed or not\n console.error(error);\n });\n /**\r\n * Called when data is received from the peer connection.\r\n *\r\n * @param data\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onIncomingData, data => {\n // enforce object type\n if (!Object.prototype.hasOwnProperty.call(data, 'name') || !Object.prototype.hasOwnProperty.call(data, 'payload')) {\n console.error('Received malformed data: ', data);\n return;\n }\n switch (data.name) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', data.payload);\n if (!data.payload) {\n this.ac.setSamplingRates(this.calibrateSoundHz);\n } else {\n this.ac.setSamplingRates(data.payload);\n }\n break;\n case 'sampleSize':\n this.ac.setSampleSize(data.payload);\n break;\n case 'deviceType':\n this.ac.setDeviceType(data.payload);\n break;\n case 'deviceName':\n this.ac.setDeviceName(data.payload);\n break;\n case 'flags':\n //this.ac.setDeviceName(data.payload);\n console.log('FLAGS');\n console.log(data.payload);\n this.ac.setFlags(data.payload);\n break;\n case 'deviceInfo':\n this.ac.setDeviceInfo(data.payload);\n console.log('Received device info from listener: ', data.payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', data.payload);\n if (data.payload.type === 'error') {\n this.permissionStatus = 'error';\n this.ac.setPermissionStatus('error');\n } else if (data.payload.type === 'denied') {\n this.permissionStatus = 'denied';\n this.ac.setPermissionStatus('denied');\n } else if (data.payload.type === 'granted') {\n this.permissionStatus = 'granted';\n this.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_10__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_10__.MissingSpeakerIdError.name:\n throw data.payload;\n break;\n default:\n break;\n }\n });\n /**\r\n * Called when the peer connection is #ready.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _ready, () => {\n // Perform callback with data\n this.conn.on('data', _classPrivateFieldGet(_onIncomingData, this));\n this.conn.on('close', () => {\n console.log('Connection reset<br>Awaiting connection...');\n this.conn = null;\n });\n });\n /** .\r\n * .\r\n * .\r\n * Debug method for downloading the recorded audio\r\n *\r\n * @public\r\n * @example\r\n */\n _defineProperty(this, \"downloadData\", () => {\n this.ac.downloadData();\n });\n _defineProperty(this, \"repeatCalibration\", async (params, stream, CalibratorInstance) => {\n this.ac = CalibratorInstance;\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n _classPrivateFieldGet(_showSpinner, this).call(this);\n console.log('This is a repeat');\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (this.permissionStatus === 'error' || this.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n resolve('permission denied');\n }\n }, 100);\n\n // Start calibration process\n (async () => {\n try {\n const result = await this.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId);\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, this).call(this);\n resolve(result);\n } catch (error) {\n clearInterval(permissionCheckInterval);\n reject(error);\n }\n })();\n });\n });\n this.language = (_params$language = _params === null || _params === void 0 ? void 0 : _params.language) !== null && _params$language !== void 0 ? _params$language : 'en-US';\n this.siteUrl += '/listener?';\n this.ac = _CalibratorInstance;\n this.result = null;\n this.debug = (_params$debug = _params === null || _params === void 0 ? void 0 : _params.debug) !== null && _params$debug !== void 0 ? _params$debug : false;\n this.isSmartPhone = (_params$isSmartPhone = _params === null || _params === void 0 ? void 0 : _params.isSmartPhone) !== null && _params$isSmartPhone !== void 0 ? _params$isSmartPhone : false;\n this.calibrateSoundHz = (_params$calibrateSoun = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundHz) !== null && _params$calibrateSoun !== void 0 ? _params$calibrateSoun : 48000;\n this.calibrateSoundSamplingDesiredBits = (_params$calibrateSoun2 = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundSamplingDesiredBits) !== null && _params$calibrateSoun2 !== void 0 ? _params$calibrateSoun2 : 24;\n this.instructionDisplayId = (_params$instructionDi = _params === null || _params === void 0 ? void 0 : _params.instructionDisplayId) !== null && _params$instructionDi !== void 0 ? _params$instructionDi : '';\n this.soundSubtitleId = (_params$soundSubtitle = _params === null || _params === void 0 ? void 0 : _params.soundSubtitleId) !== null && _params$soundSubtitle !== void 0 ? _params$soundSubtitle : '';\n this.timeToCalibrateDisplay = (_params$timeToCalibra = _params === null || _params === void 0 ? void 0 : _params.timeToCalibrateId) !== null && _params$timeToCalibra !== void 0 ? _params$timeToCalibra : '';\n this.soundMessageId = (_params$soundMessageI = _params === null || _params === void 0 ? void 0 : _params.soundMessageId) !== null && _params$soundMessageI !== void 0 ? _params$soundMessageI : '';\n this.titleDisplayId = (_params$titleDisplayI = _params === null || _params === void 0 ? void 0 : _params.titleDisplayId) !== null && _params$titleDisplayI !== void 0 ? _params$titleDisplayI : '';\n this.timeToCalibrate = (_params$timeToCalibra2 = _params === null || _params === void 0 ? void 0 : _params.timeToCalibrate) !== null && _params$timeToCalibra2 !== void 0 ? _params$timeToCalibra2 : 10;\n this.isParticipant = (_params$isParticipant = _params === null || _params === void 0 ? void 0 : _params.isParticipant) !== null && _params$isParticipant !== void 0 ? _params$isParticipant : false;\n this.isLoudspeakerCalibration = (_params$isLoudspeaker = _params === null || _params === void 0 ? void 0 : _params.isLoudspeakerCalibration) !== null && _params$isLoudspeaker !== void 0 ? _params$isLoudspeaker : false;\n this.deviceId = (_params$micrpohoneIdF = _params === null || _params === void 0 ? void 0 : _params.micrpohoneIdFromWebAudioApi) !== null && _params$micrpohoneIdF !== void 0 ? _params$micrpohoneIdF : '';\n this.buttonsContainer = (_params$buttonsContai = _params === null || _params === void 0 ? void 0 : _params.buttonsContainer) !== null && _params$buttonsContai !== void 0 ? _params$buttonsContai : document.createElement('div');\n this.phrases = (_params$phrases = _params === null || _params === void 0 ? void 0 : _params.phrases) !== null && _params$phrases !== void 0 ? _params$phrases : {};\n this.permissionStatus = 'pending';\n this.calibrateSoundHz = (_params$calibrateSoun3 = _params === null || _params === void 0 ? void 0 : _params.calibrateSoundHz) !== null && _params$calibrateSoun3 !== void 0 ? _params$calibrateSoun3 : 48000;\n\n /* Set up callbacks that handle any events related to our peer object. */\n }\n}\n\n/* \r\nReferenced links:\r\nhttps://stackoverflow.com/questions/28016664/when-you-pass-this-as-an-argument/28016676#28016676\r\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\r\nhttps://stackoverflow.com/questions/879152/how-do-i-make-javascript-beep [3]\r\n*/\n_Speaker = Speaker;\n/**\r\n * Async factory method that creates the Speaker object, and returns a promise that resolves to the result of the calibration.\r\n *\r\n * @param params - The parameters to be passed to the peer object.\r\n * @param Calibrator - The class that defines the calibration process.\r\n * @param CalibratorInstance\r\n * @param timeOut - The amount of time to wait before timing out the connection (in milliseconds).\r\n * @public\r\n * @example\r\n */\n_defineProperty(Speaker, \"startCalibration\", async function (params, CalibratorInstance) {\n let timeOut = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance);\n const {\n speaker\n } = window;\n await speaker.initPeer();\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (speaker.permissionStatus === 'error' || speaker.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve('permission denied');\n }\n }, 100);\n\n // when a call is received\n speaker.peer.on('call', async call => {\n clearInterval(permissionCheckInterval); // Clear interval when call is received\n // Rest of the existing call handling code...\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_9__.sleep)(1);\n }\n if (params.displayUpdate) {\n params.displayUpdate.style.display = '';\n }\n\n // resolve when we have a result\n speaker.result = await speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n clearInterval(permissionCheckInterval);\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_10__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"testIIR\", async function (params, CalibratorInstance, IIR) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance);\n const {\n speaker\n } = window;\n speaker.initPeer();\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // when a call is received\n speaker.peer.on('call', async call => {\n // Answer the call (one way)\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_9__.sleep)(1);\n }\n // resolve when we have a result\n speaker.result = await speaker.ac.playMLSwithIIR(stream, IIR);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_10__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"closeConnection\", () => {\n _Speaker.conn = null;\n console.log('Connection destroyed');\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Speaker);\n\n//# sourceURL=webpack://speakerCalibrator/./src/peer-connection/speaker.js?");
129
129
 
130
130
  /***/ }),
131
131
 
@@ -147,7 +147,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
147
147
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
148
148
 
149
149
  "use strict";
150
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n/**\r\n *\r\n */\nclass PythonServerAPI {\n constructor() {\n // static PYTHON_SERVER_URL ='http://127.0.0.1:5000';\n /** @private */\n _defineProperty(this, \"MAX_RETRY_COUNT\", 3);\n /** @private */\n _defineProperty(this, \"RETRY_DELAY_MS\", 1000);\n /**\r\n * @param data- -\r\n * g = inverted impulse response, when convolved with the impulse\r\n * reponse, they cancel out.\r\n * @param data.payload\r\n * @param data.sampleRate\r\n * @param data.P\r\n * @param data-.payload\r\n * @param data-.sampleRate\r\n * @param data-.P\r\n * @returns\r\n * @example\r\n */\n _defineProperty(this, \"getImpulseResponse\", async _ref => {\n let {\n mls,\n sampleRate,\n numPeriods,\n sig,\n fs2,\n L_new_n,\n dL_n\n } = _ref;\n const task = 'impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n 'sample-rate': sampleRate,\n mls,\n numPeriods,\n sig,\n fs2,\n L_new_n,\n dL_n\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getAutocorrelation\", async _ref2 => {\n let {\n mls,\n payload,\n sampleRate,\n numPeriods\n } = _ref2;\n const task = 'autocorrelation';\n let res = null;\n const data = JSON.stringify({\n task,\n payload: payload,\n 'sample-rate': sampleRate,\n mls,\n numPeriods\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getConvolution\", async _ref3 => {\n let {\n mls,\n inverse_response,\n inverse_response_no_bandpass,\n attenuatorGain_dB,\n mls_amplitude\n } = _ref3;\n const task = 'convolution';\n let res = null;\n const data = JSON.stringify({\n task,\n mls,\n inverse_response,\n inverse_response_no_bandpass,\n attenuatorGain_dB,\n mls_amplitude\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLS\", async _ref4 => {\n let {\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n } = _ref4;\n const task = 'mls';\n let res = null;\n const data = JSON.stringify({\n task,\n length: length,\n amplitude: amplitude,\n calibrateSoundBurstMLSVersions: calibrateSoundBurstMLSVersions\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getShortURL\", async originalURL => {\n const task = 'url';\n let res = null;\n console.log(originalURL);\n const data = JSON.stringify({\n URL: originalURL\n });\n console.log(data);\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMemory\", async () => {\n let res;\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/memory\",\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(response => {\n console.log('memory used:', Math.round(response.data['memory']), 'mb');\n res = response.data['memory'];\n }).catch(error => {\n throw error;\n });\n return res;\n });\n _defineProperty(this, \"checkMemory\", async () => {\n console.log('wait for memory under 500 mb to continue calibration');\n await this.getMemory();\n // let memory = await this.getMemory();\n // while (memory >= 500) {\n // console.log(\"sleep 30s\");\n // await sleep(30);\n // memory = await this.getMemory();\n // }\n });\n _defineProperty(this, \"getMLSWithRetry\", async _ref5 => {\n let {\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n } = _ref5;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getMLS({\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get MLS after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getPSD\", async _ref6 => {\n let {\n unconv_rec,\n conv_rec,\n sampleRate\n } = _ref6;\n const task = 'psd';\n let res = null;\n const data = JSON.stringify({\n task,\n unconv_rec,\n conv_rec,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getBackgroundNoisePSD\", async _ref7 => {\n let {\n background_rec,\n sampleRate\n } = _ref7;\n const task = 'background-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n background_rec,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getBackgroundNoisePSDWithRetry\", async _ref8 => {\n let {\n background_rec,\n sampleRate\n } = _ref8;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getBackgroundNoisePSD({\n background_rec,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getSubtractedPSD\", async (rec, knownGains, knownFrequencies, sampleRate) => {\n const task = 'subtracted-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n rec,\n knownGains,\n knownFrequencies,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getSubtractedPSDWithRetry\", async (rec, knownGains, knownFrequencies, sampleRate) => {\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getSubtractedPSD(rec, knownGains, knownFrequencies, sampleRate);\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getPSDWithRetry\", async _ref9 => {\n let {\n unconv_rec,\n conv_rec,\n sampleRate\n } = _ref9;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getPSD({\n unconv_rec,\n conv_rec,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getComponentInverseImpulseResponse\", async _ref10 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref10;\n const task = 'component-inverse-impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n componentIRGains,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getSystemInverseImpulseResponse\", async _ref11 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref11;\n const task = 'system-inverse-impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n payload,\n mls,\n lowHz,\n iirLength,\n highHz,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLSPSD\", async _ref12 => {\n let {\n mls,\n sampleRate\n } = _ref12;\n const task = 'mls-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n mls,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLSPSDWithRetry\", async _ref13 => {\n let {\n mls,\n sampleRate\n } = _ref13;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getMLSPSD({\n mls,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getComponentInverseImpulseResponseWithRetry\", async _ref14 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref14;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getComponentInverseImpulseResponse({\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getSystemInverseImpulseResponseWithRetry\", async _ref15 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref15;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getSystemInverseImpulseResponse({\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getVolumeCalibration\", async _ref16 => {\n let {\n payload,\n sampleRate,\n lCalib\n } = _ref16;\n const task = 'volume';\n let res = null;\n console.log({\n payload\n });\n const data = JSON.stringify({\n task,\n payload,\n 'sample-rate': sampleRate,\n lCalib\n });\n const response = await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n // if response.data is a string, parse it\n if (typeof response.data === 'string') {\n // response.data = response.data.replaceAll('Infinity', 99999999);\n // response.data = JSON.parse(response.data);\n //if there is Infinity in the string, throw an error\n if (response.data.includes('Infinity')) {\n throw new Error('Server returned Infinity. Please Make sure the microphone is recording correclty');\n }\n response.data = JSON.parse(response.data);\n }\n return response.data[task];\n }).catch(error => {\n throw error;\n });\n console.log(response);\n return response;\n });\n _defineProperty(this, \"getVolumeCalibrationParameters\", async _ref17 => {\n let {\n inDBValues,\n outDBSPLValues,\n lCalib,\n componentGainDBSPL\n } = _ref17;\n const task = 'volume-parameters';\n let res = null;\n const data = JSON.stringify({\n task,\n inDBValues,\n outDBSPLValues,\n lCalib,\n componentGainDBSPL\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n\n // console.log(res.data[task]);\n //below is an example of res.data[task]\n //{\n // R: 16.56981076554259,\n // RMSError: 1.9289162528535229\n // T: -47.79799120884434,\n // W: 61.0485247483732,\n // backgroundDBSPL: 43.88233142069752,\n // gainDBSPL: -128.24742161208985\n //}\n return res.data[task];\n });\n _defineProperty(this, \"allHzPowerCheck\", async _ref18 => {\n let {\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n } = _ref18;\n const task = 'all-hz-check';\n let res = null;\n console.log({\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n });\n const data = JSON.stringify({\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"volumePowerCheck\", async _ref19 => {\n let {\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n } = _ref19;\n const task = 'volume-check';\n let res = null;\n const data = JSON.stringify({\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"volumePowerCheckWithRetry\", async _ref20 => {\n let {\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n } = _ref20;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.volumePowerCheck({\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get volume power check after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n }\n}\n_defineProperty(PythonServerAPI, \"PYTHON_SERVER_URL\", 'https://easyeyes-python-flask-server.herokuapp.com');\n_defineProperty(PythonServerAPI, \"TEST_SERVER_URL\", 'http://127.0.0.1:5000');\n/* harmony default export */ __webpack_exports__[\"default\"] = (PythonServerAPI);\n\n//# sourceURL=webpack://speakerCalibrator/./src/server/PythonServerAPI.js?");
150
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n/**\r\n *\r\n */\nclass PythonServerAPI {\n constructor() {\n // static PYTHON_SERVER_URL ='http://127.0.0.1:5000';\n /** @private */\n _defineProperty(this, \"MAX_RETRY_COUNT\", 3);\n /** @private */\n _defineProperty(this, \"RETRY_DELAY_MS\", 1000);\n /**\r\n * @param data- -\r\n * g = inverted impulse response, when convolved with the impulse\r\n * reponse, they cancel out.\r\n * @param data.payload\r\n * @param data.sampleRate\r\n * @param data.P\r\n * @param data-.payload\r\n * @param data-.sampleRate\r\n * @param data-.P\r\n * @returns\r\n * @example\r\n */\n _defineProperty(this, \"getImpulseResponse\", async _ref => {\n let {\n mls,\n sampleRate,\n numPeriods,\n sig,\n fs2,\n L_new_n,\n dL_n\n } = _ref;\n const task = 'impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n 'sample-rate': sampleRate,\n mls,\n numPeriods,\n sig,\n fs2,\n L_new_n,\n dL_n\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getAutocorrelation\", async _ref2 => {\n let {\n mls,\n payload,\n sampleRate,\n numPeriods\n } = _ref2;\n const task = 'autocorrelation';\n let res = null;\n const data = JSON.stringify({\n task,\n payload: payload,\n 'sample-rate': sampleRate,\n mls,\n numPeriods\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getConvolution\", async _ref3 => {\n let {\n mls,\n inverse_response,\n inverse_response_no_bandpass,\n attenuatorGain_dB,\n mls_amplitude\n } = _ref3;\n const task = 'convolution';\n let res = null;\n const data = JSON.stringify({\n task,\n mls,\n inverse_response,\n inverse_response_no_bandpass,\n attenuatorGain_dB,\n mls_amplitude\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLS\", async _ref4 => {\n let {\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n } = _ref4;\n const task = 'mls';\n let res = null;\n const data = JSON.stringify({\n task,\n length: length,\n amplitude: amplitude,\n calibrateSoundBurstMLSVersions: calibrateSoundBurstMLSVersions\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getShortURL\", async originalURL => {\n const task = 'url';\n let res = null;\n console.log(originalURL);\n const data = JSON.stringify({\n URL: originalURL\n });\n console.log(data);\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMemory\", async () => {\n let res;\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/memory\",\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(response => {\n console.log('memory used:', Math.round(response.data['memory']), 'mb');\n res = response.data['memory'];\n }).catch(error => {\n throw error;\n });\n return res;\n });\n _defineProperty(this, \"checkMemory\", async () => {\n console.log('wait for memory under 500 mb to continue calibration');\n await this.getMemory();\n // let memory = await this.getMemory();\n // while (memory >= 500) {\n // console.log(\"sleep 30s\");\n // await sleep(30);\n // memory = await this.getMemory();\n // }\n });\n _defineProperty(this, \"getMLSWithRetry\", async _ref5 => {\n let {\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n } = _ref5;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getMLS({\n length,\n amplitude,\n calibrateSoundBurstMLSVersions\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get MLS after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getPSD\", async _ref6 => {\n let {\n unconv_rec,\n conv_rec,\n sampleRate\n } = _ref6;\n const task = 'psd';\n let res = null;\n const data = JSON.stringify({\n task,\n unconv_rec,\n conv_rec,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getBackgroundNoisePSD\", async _ref7 => {\n let {\n background_rec,\n sampleRate\n } = _ref7;\n const task = 'background-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n background_rec,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getBackgroundNoisePSDWithRetry\", async _ref8 => {\n let {\n background_rec,\n sampleRate\n } = _ref8;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getBackgroundNoisePSD({\n background_rec,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getSubtractedPSD\", async (rec, knownGains, knownFrequencies, sampleRate) => {\n const task = 'subtracted-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n rec,\n knownGains,\n knownFrequencies,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getSubtractedPSDWithRetry\", async (rec, knownGains, knownFrequencies, sampleRate) => {\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getSubtractedPSD(rec, knownGains, knownFrequencies, sampleRate);\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getPSDWithRetry\", async _ref9 => {\n let {\n unconv_rec,\n conv_rec,\n sampleRate\n } = _ref9;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getPSD({\n unconv_rec,\n conv_rec,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get PSD after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getComponentInverseImpulseResponse\", async _ref10 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref10;\n const task = 'component-inverse-impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n componentIRGains,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getSystemInverseImpulseResponse\", async _ref11 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref11;\n const task = 'system-inverse-impulse-response';\n let res = null;\n const data = JSON.stringify({\n task,\n payload,\n mls,\n lowHz,\n iirLength,\n highHz,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLSPSD\", async _ref12 => {\n let {\n mls,\n sampleRate\n } = _ref12;\n const task = 'mls-psd';\n let res = null;\n const data = JSON.stringify({\n task,\n mls,\n sampleRate\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"getMLSPSDWithRetry\", async _ref13 => {\n let {\n mls,\n sampleRate\n } = _ref13;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getMLSPSD({\n mls,\n sampleRate\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getComponentInverseImpulseResponseWithRetry\", async _ref14 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref14;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getComponentInverseImpulseResponse({\n payload,\n mls,\n lowHz,\n highHz,\n componentIRGains,\n iirLength,\n componentIRFreqs,\n sampleRate,\n mlsAmplitude,\n irLength,\n calibrateSoundSmoothOctaves,\n calibrateSoundSmoothMinBandwidthHz,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getSystemInverseImpulseResponseWithRetry\", async _ref15 => {\n let {\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n } = _ref15;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.getSystemInverseImpulseResponse({\n payload,\n mls,\n lowHz,\n highHz,\n iirLength,\n sampleRate,\n mlsAmplitude,\n calibrateSoundBurstFilteredExtraDb,\n calibrateSoundIIRPhase\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get inverse impulse response after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n _defineProperty(this, \"getVolumeCalibration\", async _ref16 => {\n let {\n payload,\n sampleRate,\n lCalib\n } = _ref16;\n const task = 'volume';\n let res = null;\n console.log({\n payload\n });\n const data = JSON.stringify({\n task,\n payload,\n 'sample-rate': sampleRate,\n lCalib\n });\n const response = await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n // if response.data is a string, parse it\n if (typeof response.data === 'string') {\n // response.data = response.data.replaceAll('Infinity', 99999999);\n // response.data = JSON.parse(response.data);\n //if there is Infinity in the string, throw an error\n if (response.data.includes('Infinity')) {\n throw new Error('Server returned Infinity. Please make sure the microphone is recording correctly');\n }\n response.data = JSON.parse(response.data);\n }\n return response.data[task];\n }).catch(error => {\n alert('Invalid data. Please make sure the microphone is recording correctly and press on \"Re-Record\"');\n throw error;\n });\n console.log(response);\n return response;\n });\n _defineProperty(this, \"getVolumeCalibrationParameters\", async _ref17 => {\n let {\n inDBValues,\n outDBSPLValues,\n lCalib,\n componentGainDBSPL\n } = _ref17;\n const task = 'volume-parameters';\n let res = null;\n const data = JSON.stringify({\n task,\n inDBValues,\n outDBSPLValues,\n lCalib,\n componentGainDBSPL\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n\n // console.log(res.data[task]);\n //below is an example of res.data[task]\n //{\n // R: 16.56981076554259,\n // RMSError: 1.9289162528535229\n // T: -47.79799120884434,\n // W: 61.0485247483732,\n // backgroundDBSPL: 43.88233142069752,\n // gainDBSPL: -128.24742161208985\n //}\n return res.data[task];\n });\n _defineProperty(this, \"allHzPowerCheck\", async _ref18 => {\n let {\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n } = _ref18;\n const task = 'all-hz-check';\n let res = null;\n console.log({\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n });\n const data = JSON.stringify({\n payload,\n sampleRate,\n binDesiredSec,\n burstSec,\n repeats,\n warmUp\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"volumePowerCheck\", async _ref19 => {\n let {\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n } = _ref19;\n const task = 'volume-check';\n let res = null;\n const data = JSON.stringify({\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n });\n await (0,axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n method: 'post',\n baseURL: PythonServerAPI.PYTHON_SERVER_URL,\n //server\n url: \"/task/\".concat(task),\n headers: {\n 'Content-Type': 'application/json'\n },\n data\n }).then(response => {\n res = response;\n console.log(res.data[task]);\n }).catch(error => {\n throw error;\n });\n return res.data[task];\n });\n _defineProperty(this, \"volumePowerCheckWithRetry\", async _ref20 => {\n let {\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n } = _ref20;\n let retryCount = 0;\n let response = null;\n while (retryCount < this.MAX_RETRY_COUNT) {\n try {\n response = await this.volumePowerCheck({\n payload,\n sampleRate,\n preSec,\n Sec,\n binDesiredSec\n });\n // If the request is successful, break out of the loop\n break;\n } catch (error) {\n console.error(\"Error occurred. Retrying... (\".concat(retryCount + 1, \"/\").concat(this.MAX_RETRY_COUNT, \")\"));\n retryCount++;\n await new Promise(resolve => setTimeout(resolve, this.RETRY_DELAY_MS));\n }\n }\n if (response) {\n return response;\n } else {\n throw new Error(\"Failed to get volume power check after \".concat(this.MAX_RETRY_COUNT, \" attempts.\"));\n }\n });\n }\n}\n_defineProperty(PythonServerAPI, \"PYTHON_SERVER_URL\", 'https://easyeyes-python-flask-server.herokuapp.com');\n_defineProperty(PythonServerAPI, \"TEST_SERVER_URL\", 'http://127.0.0.1:5000');\n/* harmony default export */ __webpack_exports__[\"default\"] = (PythonServerAPI);\n\n//# sourceURL=webpack://speakerCalibrator/./src/server/PythonServerAPI.js?");
151
151
 
152
152
  /***/ }),
153
153
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "speaker-calibration",
3
- "version": "2.2.224",
3
+ "version": "2.2.225",
4
4
  "description": "Speaker calibration library for auditory testing",
5
5
  "main": "dist/main.js",
6
6
  "directories": {
@@ -78,9 +78,6 @@ class Listener extends AudioPeer {
78
78
  secure: true,
79
79
  config: {
80
80
  iceServers: [
81
- {
82
- urls: 'stun:stun.relay.metered.ca:80',
83
- },
84
81
  {
85
82
  urls: 'turn:global.relay.metered.ca:80',
86
83
  username: 'de884cfc34189cdf1a5dd616',
@@ -63,9 +63,6 @@ class Speaker extends AudioPeer {
63
63
  port: 443,
64
64
  config: {
65
65
  iceServers: [
66
- {
67
- urls: 'stun:stun.relay.metered.ca:80',
68
- },
69
66
  {
70
67
  urls: 'turn:global.relay.metered.ca:80',
71
68
  username: 'de884cfc34189cdf1a5dd616',
@@ -681,7 +681,7 @@ class PythonServerAPI {
681
681
  //if there is Infinity in the string, throw an error
682
682
  if (response.data.includes('Infinity')) {
683
683
  throw new Error(
684
- 'Server returned Infinity. Please Make sure the microphone is recording correclty'
684
+ 'Server returned Infinity. Please make sure the microphone is recording correctly'
685
685
  );
686
686
  }
687
687
  response.data = JSON.parse(response.data);
@@ -689,6 +689,9 @@ class PythonServerAPI {
689
689
  return response.data[task];
690
690
  })
691
691
  .catch(error => {
692
+ alert(
693
+ 'Invalid data. Please make sure the microphone is recording correctly and press on "Re-Record"'
694
+ );
692
695
  throw error;
693
696
  });
694
697