static async fetchDevices(onSuccess, onError) {
try {
/**\rn * 火狐浏览器不支持这种获取mic和camera的方式,改为直接调用声网原生方法rn */ // var userAgent = navigator.userAgent.toLowerCase();\rnrn // 火狐或者H5直接获取设列表rn if (userAgent.indexOf(\"firefox\") > -1 || userAgent.indexOf(\"android\") > -1 || userAgent.indexOf(\"iphone\") > -1) {\rn _js_AgoraRTC_N_production__WEBPACK_IMPORTED_MODULE_2___default.a.getDevices().then(devices => {\rn _logger_helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].uploadLog(_constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_INFO, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Normal_Type, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Result_Success + '|0|0', '0', JSON.stringify(devices), '获取设备信息', _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_sourceType, '015');\rn if (devices.length !== 0) {\rn const mic = [];\rn const camera = [];\rn const outMic = [];\rn devices.forEach(device => {\rn if (device.kind === 'audioinput') {\rn mic.push(device);\rn } else if (device.kind === 'videoinput') {\rn camera.push(device);\rn } else if (device.kind === 'audiooutput') {\rn outMic.push(device);\rn }\rn });\rn onSuccess({\rn mic,\rn camera,\rn outMicrn });\rn } else {\rn onSuccess({\rn mic,\rn camera,\rn outMicrn });\rn }\rn }).catch(err => {\rn _logger_helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].uploadErr(_constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_ERROR, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Normal_Type, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Result_failed + '|fetch device|0', '0', err, '获取火狐设备异常', _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_sourceType, '015');\rn onError(err);\rn });\rn } else {\rn const result1 = await navigator.permissions.query({\rn name: 'microphone'\rn });\rn const result2 = await navigator.permissions.query({\rn name: 'camera'\rn });\rn // if (result1.state != 'denied' && result2.state !='denied') {\rn const devices = await Devices.enumerateDevices();\rn let hasMic = devices.mic.length !== 0;\rn let hasCamera = devices.camera.length !== 0;\rn if (result1.state != 'granted' || result2.state != 'granted') {\rn // 如果有一个权限不是允许,重新调用获取授权rn if (result1.state == 'denied') {\rn hasMic = false;\rn }\rn if (result2.state == 'denied') {\rn hasCamera = false;\rn }\rn if (hasCamera || hasMic) {\rn const stream = await navigator.mediaDevices.getUserMedia({\rn audio: hasMic,\rn video: hasCamerarn });\rn }\rn }\rn await _js_AgoraRTC_N_production__WEBPACK_IMPORTED_MODULE_2___default.a.getDevices().then(devicesInfo => {\rn _logger_helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].uploadLog(_constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_INFO, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Normal_Type, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Result_Success + '|0|0', '0', JSON.stringify(devicesInfo), '获取设备信息', _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_sourceType, '015');\rn if (devicesInfo.length !== 0) {\rn const mic = [];\rn const camera = [];\rn const outMic = [];\rn devicesInfo.forEach(device => {\rn if (device.kind === 'audioinput') {\rn mic.push(device);\rn } else if (device.kind === 'videoinput') {\rn camera.push(device);\rn } else if (device.kind === 'audiooutput') {\rn outMic.push(device);\rn }\rn });\rn onSuccess({\rn mic,\rn camera,\rn outMicrn });\rn } else {\rn onSuccess({\rn mic,\rn camera,\rn outMicrn });\rn }\rn }).catch(err => {\rn _logger_helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].uploadErr(_constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_ERROR, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Normal_Type, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Result_failed + '|fetch device|0', '0', err, '获取设备异常', _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_sourceType, '015');\rn onError(err);\rn });\rn }\rn } catch (err) {\rn _logger_helper__WEBPACK_IMPORTED_MODULE_0__[\"default\"].uploadErr(_constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_ERROR, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Normal_Type, _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Result_failed + '|fetch device|0', '0', err, '获取设备异常', _constant__WEBPACK_IMPORTED_MODULE_1__[\"default\"].Log_sourceType, '015');\rn onError(err);\rn }\rn }\rnrn static async enumerateDevices() {\rn const devices = await navigator.mediaDevices.enumerateDevices();\rn const mic = [];\rn const camera = [];\rn devices.forEach(device => {\rn if (device.kind === 'audioinput') {\rn mic.push(device);\rn } else if (device.kind === 'videoinput') {\rn camera.push(device);\rn }\rn });\rn return {\rn mic,\rn camerarn };\rn }\rnrn /**\rn * 获取系统版本信息rn */\rn static async getUserAgent() {\rn // var userAgent = navigator.userAgent.toLowerCase();\rn // console.log('userAgent:', userAgent);\rn let name;\rn // var version = \"Unknown\";\rn if (userAgent.indexOf('win') > -1) {\rn if (userAgent.indexOf('windows nt 5.0') > -1) {\rn name = 'Windows 2000';\rn } else if (userAgent.indexOf('windows nt 5.1') > -1 || userAgent.indexOf('windows nt 5.2') > -1) {\rn name = 'Windows XP';\rn } else if (userAgent.indexOf('windows nt 6.0') > -1) {\rn name = 'Windows Vista';\rn } else if (userAgent.indexOf('windows nt 6.1') > -1 || (userAgent.indexOf('windows 7') > -1)) {\rn name = 'Windows 7';\rn } else if (userAgent.indexOf('windows nt 6.2') > -1 || (userAgent.indexOf('windows 8') > -1)) {\rn name = 'Windows 8';\rn } else if (userAgent.indexOf('windows nt 6.3') > -1) {\rn name = 'Windows 8.1';\rn } else if (userAgent.indexOf('windows nt 6.2') > -1 || (userAgent.indexOf('windows nt 10.0') > -1)) {\rn name = 'Windows 10';\rn } else {\rn name = 'Unknown';\rn }\rn } else if (userAgent.indexOf('iphone') > -1) {\rn name = \"Iphone\";\rn } else if (userAgent.indexOf('mac') > -1) {\rn name = \"Mac\";\rn } else if (userAgent.indexOf('x11') > -1 || userAgent.indexOf('unix') > -1 || userAgent.indexOf('sunname') > -1 || userAgent.indexOf('bsd') > -1) {\rn name = \"Unix\";\rn } else if (userAgent.indexOf('linux') > -1) {\rn name = \"Linux\";\rn } else {\rn name = \"Unknown\";\rn }\rn return {\rn namern };\rn }\rnrn /**\rn * 获取浏览器版本信息rn */\rnrn static async getBrowser() {\rn const sys = {};\rn const ua = userAgent;\rn let s;\rn (s = ua.match(/edge\\/([\\d.]+)/)) ?\rn (sys.edge = s[1]) :\rn (s = ua.match(/rv:([\\d.]+)\\) like gecko/)) ?\rn (sys.ie = s[1]) :\rn (s = ua.match(/msie ([\\d.]+)/)) ?\rn (sys.ie = s[1]) :\rn (s = ua.match(/firefox\\/([\\d.]+)/)) ?\rn (sys.firefox = s[1]) :\rn (s = ua.match(/tbs\\/([\\d]+)/)) ?\rn (sys.tbs = s[1]) :\rn (s = ua.match(/xweb\\/([\\d]+)/)) ?\rn (sys.xweb = s[1]) :\rn (s = ua.match(/chrome\\/([\\d.]+)/)) ?\rn (sys.chrome = s[1]) :\rn (s = ua.match(/opera.([\\d.]+)/)) ?\rn (sys.opera = s[1]) :\rn (s = ua.match(/version\\/([\\d.]+).*safari/)) ?\rn (sys.safari = s[1]) :\rn 0;\rnrn if (sys.xweb) {\rn return {\rn browser: 'webView XWEB',\rn version: ''\rn };\rn }\rn if (sys.tbs) {\rn return {\rn browser: 'webView TBS',\rn version: ''\rn };\rn }\rn if (sys.edge) {\rn return {\rn browser: 'Edge',\rn version: sys.edgern };\rn }\rn if (sys.ie) {\rn return {\rn browser: 'IE',\rn version: sys.iern };\rn }\rn if (sys.firefox) {\rn return {\rn browser: 'Firefox',\rn version: sys.firefoxrn };\rn }\rn if (sys.chrome) {\rn return {\rn browser: 'Chrome',\rn version: sys.chromern };\rn }\rn if (sys.opera) {\rn return {\rn browser: 'Opera',\rn version: sys.operarn };\rn }\rn if (sys.safari) {\rn return {\rn browser: 'Safari',\rn version: sys.safarirn };\rn }\rnrn return {\rn browser: '',\rn version: '0'\rn };\rn }\rnrn static getOsInfo() {\rn return userAgent;\rn }\rn}这个代码帮我格式化一下 但是你不要修改任何的代码 我需要使用这个代码排障 你帮我格式化后 代码是代码 注释是注释区分开就行不要修改任何的逻辑注释也不要修改