livekit-client 1.9.4 → 1.9.5

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.
Files changed (30) hide show
  1. package/dist/livekit-client.esm.mjs +864 -1537
  2. package/dist/livekit-client.esm.mjs.map +1 -1
  3. package/dist/livekit-client.umd.js +1 -1
  4. package/dist/livekit-client.umd.js.map +1 -1
  5. package/dist/src/api/SignalClient.d.ts +1 -2
  6. package/dist/src/api/SignalClient.d.ts.map +1 -1
  7. package/dist/src/room/Room.d.ts +1 -0
  8. package/dist/src/room/Room.d.ts.map +1 -1
  9. package/dist/src/room/participant/LocalParticipant.d.ts +0 -1
  10. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  11. package/dist/src/room/utils.d.ts.map +1 -1
  12. package/dist/src/utils/AsyncQueue.d.ts.map +1 -0
  13. package/dist/src/utils/browserParser.d.ts +10 -0
  14. package/dist/src/utils/browserParser.d.ts.map +1 -0
  15. package/dist/ts4.2/src/api/SignalClient.d.ts +1 -2
  16. package/dist/ts4.2/src/room/Room.d.ts +1 -0
  17. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +0 -1
  18. package/dist/ts4.2/src/utils/browserParser.d.ts +10 -0
  19. package/package.json +6 -4
  20. package/src/api/SignalClient.ts +1 -2
  21. package/src/room/Room.ts +5 -2
  22. package/src/room/participant/LocalParticipant.ts +0 -1
  23. package/src/room/utils.ts +17 -16
  24. package/src/{AsyncQueue.test.ts → utils/AsyncQueue.test.ts} +1 -1
  25. package/src/{AsyncQueue.ts → utils/AsyncQueue.ts} +1 -1
  26. package/src/utils/browserParser.test.ts +58 -0
  27. package/src/utils/browserParser.ts +72 -0
  28. package/dist/src/AsyncQueue.d.ts.map +0 -1
  29. /package/dist/src/{AsyncQueue.d.ts → utils/AsyncQueue.d.ts} +0 -0
  30. /package/dist/ts4.2/src/{AsyncQueue.d.ts → utils/AsyncQueue.d.ts} +0 -0
@@ -10090,1332 +10090,110 @@ adapterFactory({
10090
10090
  window: typeof window === 'undefined' ? undefined : window
10091
10091
  });
10092
10092
 
10093
- var uaParser = {exports: {}};
10094
-
10095
- (function (module, exports) {
10096
- /////////////////////////////////////////////////////////////////////////////////
10097
- /* UAParser.js v1.0.35
10098
- Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
10099
- MIT License */ /*
10100
- Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
10101
- Supports browser & node.js environment.
10102
- Demo : https://faisalman.github.io/ua-parser-js
10103
- Source : https://github.com/faisalman/ua-parser-js */
10104
- /////////////////////////////////////////////////////////////////////////////////
10105
-
10106
- (function (window, undefined$1) {
10107
-
10108
- //////////////
10109
- // Constants
10110
- /////////////
10111
- var LIBVERSION = '1.0.35',
10112
- EMPTY = '',
10113
- UNKNOWN = '?',
10114
- FUNC_TYPE = 'function',
10115
- UNDEF_TYPE = 'undefined',
10116
- OBJ_TYPE = 'object',
10117
- STR_TYPE = 'string',
10118
- MAJOR = 'major',
10119
- MODEL = 'model',
10120
- NAME = 'name',
10121
- TYPE = 'type',
10122
- VENDOR = 'vendor',
10123
- VERSION = 'version',
10124
- ARCHITECTURE = 'architecture',
10125
- CONSOLE = 'console',
10126
- MOBILE = 'mobile',
10127
- TABLET = 'tablet',
10128
- SMARTTV = 'smarttv',
10129
- WEARABLE = 'wearable',
10130
- EMBEDDED = 'embedded',
10131
- UA_MAX_LENGTH = 350;
10132
- var AMAZON = 'Amazon',
10133
- APPLE = 'Apple',
10134
- ASUS = 'ASUS',
10135
- BLACKBERRY = 'BlackBerry',
10136
- BROWSER = 'Browser',
10137
- CHROME = 'Chrome',
10138
- EDGE = 'Edge',
10139
- FIREFOX = 'Firefox',
10140
- GOOGLE = 'Google',
10141
- HUAWEI = 'Huawei',
10142
- LG = 'LG',
10143
- MICROSOFT = 'Microsoft',
10144
- MOTOROLA = 'Motorola',
10145
- OPERA = 'Opera',
10146
- SAMSUNG = 'Samsung',
10147
- SHARP = 'Sharp',
10148
- SONY = 'Sony',
10149
- XIAOMI = 'Xiaomi',
10150
- ZEBRA = 'Zebra',
10151
- FACEBOOK = 'Facebook',
10152
- CHROMIUM_OS = 'Chromium OS',
10153
- MAC_OS = 'Mac OS';
10154
-
10155
- ///////////
10156
- // Helper
10157
- //////////
10158
-
10159
- var extend = function (regexes, extensions) {
10160
- var mergedRegexes = {};
10161
- for (var i in regexes) {
10162
- if (extensions[i] && extensions[i].length % 2 === 0) {
10163
- mergedRegexes[i] = extensions[i].concat(regexes[i]);
10164
- } else {
10165
- mergedRegexes[i] = regexes[i];
10166
- }
10167
- }
10168
- return mergedRegexes;
10169
- },
10170
- enumerize = function (arr) {
10171
- var enums = {};
10172
- for (var i = 0; i < arr.length; i++) {
10173
- enums[arr[i].toUpperCase()] = arr[i];
10174
- }
10175
- return enums;
10176
- },
10177
- has = function (str1, str2) {
10178
- return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
10179
- },
10180
- lowerize = function (str) {
10181
- return str.toLowerCase();
10182
- },
10183
- majorize = function (version) {
10184
- return typeof version === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined$1;
10185
- },
10186
- trim = function (str, len) {
10187
- if (typeof str === STR_TYPE) {
10188
- str = str.replace(/^\s\s*/, EMPTY);
10189
- return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
10190
- }
10191
- };
10192
-
10193
- ///////////////
10194
- // Map helper
10195
- //////////////
10196
-
10197
- var rgxMapper = function (ua, arrays) {
10198
- var i = 0,
10199
- j,
10200
- k,
10201
- p,
10202
- q,
10203
- matches,
10204
- match;
10205
-
10206
- // loop through all regexes maps
10207
- while (i < arrays.length && !matches) {
10208
- var regex = arrays[i],
10209
- // even sequence (0,2,4,..)
10210
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
10211
- j = k = 0;
10212
-
10213
- // try matching uastring with regexes
10214
- while (j < regex.length && !matches) {
10215
- if (!regex[j]) {
10216
- break;
10217
- }
10218
- matches = regex[j++].exec(ua);
10219
- if (!!matches) {
10220
- for (p = 0; p < props.length; p++) {
10221
- match = matches[++k];
10222
- q = props[p];
10223
- // check if given property is actually array
10224
- if (typeof q === OBJ_TYPE && q.length > 0) {
10225
- if (q.length === 2) {
10226
- if (typeof q[1] == FUNC_TYPE) {
10227
- // assign modified match
10228
- this[q[0]] = q[1].call(this, match);
10229
- } else {
10230
- // assign given value, ignore regex match
10231
- this[q[0]] = q[1];
10232
- }
10233
- } else if (q.length === 3) {
10234
- // check whether function or regex
10235
- if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
10236
- // call function (usually string mapper)
10237
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined$1;
10238
- } else {
10239
- // sanitize match using given regex
10240
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined$1;
10241
- }
10242
- } else if (q.length === 4) {
10243
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined$1;
10244
- }
10245
- } else {
10246
- this[q] = match ? match : undefined$1;
10247
- }
10248
- }
10249
- }
10250
- }
10251
- i += 2;
10252
- }
10253
- },
10254
- strMapper = function (str, map) {
10255
- for (var i in map) {
10256
- // check if current value is array
10257
- if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
10258
- for (var j = 0; j < map[i].length; j++) {
10259
- if (has(map[i][j], str)) {
10260
- return i === UNKNOWN ? undefined$1 : i;
10261
- }
10262
- }
10263
- } else if (has(map[i], str)) {
10264
- return i === UNKNOWN ? undefined$1 : i;
10265
- }
10266
- }
10267
- return str;
10268
- };
10269
-
10270
- ///////////////
10271
- // String map
10272
- //////////////
10273
-
10274
- // Safari < 3.0
10275
- var oldSafariMap = {
10276
- '1.0': '/8',
10277
- '1.2': '/1',
10278
- '1.3': '/3',
10279
- '2.0': '/412',
10280
- '2.0.2': '/416',
10281
- '2.0.3': '/417',
10282
- '2.0.4': '/419',
10283
- '?': '/'
10284
- },
10285
- windowsVersionMap = {
10286
- 'ME': '4.90',
10287
- 'NT 3.11': 'NT3.51',
10288
- 'NT 4.0': 'NT4.0',
10289
- '2000': 'NT 5.0',
10290
- 'XP': ['NT 5.1', 'NT 5.2'],
10291
- 'Vista': 'NT 6.0',
10292
- '7': 'NT 6.1',
10293
- '8': 'NT 6.2',
10294
- '8.1': 'NT 6.3',
10295
- '10': ['NT 6.4', 'NT 10.0'],
10296
- 'RT': 'ARM'
10297
- };
10298
-
10299
- //////////////
10300
- // Regex map
10301
- /////////////
10302
-
10303
- var regexes = {
10304
- browser: [[/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
10305
- ], [VERSION, [NAME, 'Chrome']], [/edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
10306
- ], [VERSION, [NAME, 'Edge']], [
10307
- // Presto based
10308
- /(opera mini)\/([-\w\.]+)/i,
10309
- // Opera Mini
10310
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
10311
- // Opera Mobi/Tablet
10312
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
10313
- ], [NAME, VERSION], [/opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
10314
- ], [VERSION, [NAME, OPERA + ' Mini']], [/\bopr\/([\w\.]+)/i // Opera Webkit
10315
- ], [VERSION, [NAME, OPERA]], [
10316
- // Mixed
10317
- /(kindle)\/([\w\.]+)/i,
10318
- // Kindle
10319
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,
10320
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
10321
- // Trident based
10322
- /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,
10323
- // Avant/IEMobile/SlimBrowser
10324
- /(ba?idubrowser)[\/ ]?([\w\.]+)/i,
10325
- // Baidu Browser
10326
- /(?:ms|\()(ie) ([\w\.]+)/i,
10327
- // Internet Explorer
10328
-
10329
- // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
10330
- /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
10331
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
10332
- /(heytap|ovi)browser\/([\d\.]+)/i,
10333
- // Heytap/Ovi
10334
- /(weibo)__([\d\.]+)/i // Weibo
10335
- ], [NAME, VERSION], [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
10336
- ], [VERSION, [NAME, 'UC' + BROWSER]], [/microm.+\bqbcore\/([\w\.]+)/i,
10337
- // WeChat Desktop for Windows Built-in Browser
10338
- /\bqbcore\/([\w\.]+).+microm/i], [VERSION, [NAME, 'WeChat(Win) Desktop']], [/micromessenger\/([\w\.]+)/i // WeChat
10339
- ], [VERSION, [NAME, 'WeChat']], [/konqueror\/([\w\.]+)/i // Konqueror
10340
- ], [VERSION, [NAME, 'Konqueror']], [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
10341
- ], [VERSION, [NAME, 'IE']], [/ya(?:search)?browser\/([\w\.]+)/i // Yandex
10342
- ], [VERSION, [NAME, 'Yandex']], [/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
10343
- ], [[NAME, /(.+)/, '$1 Secure ' + BROWSER], VERSION], [/\bfocus\/([\w\.]+)/i // Firefox Focus
10344
- ], [VERSION, [NAME, FIREFOX + ' Focus']], [/\bopt\/([\w\.]+)/i // Opera Touch
10345
- ], [VERSION, [NAME, OPERA + ' Touch']], [/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
10346
- ], [VERSION, [NAME, 'Coc Coc']], [/dolfin\/([\w\.]+)/i // Dolphin
10347
- ], [VERSION, [NAME, 'Dolphin']], [/coast\/([\w\.]+)/i // Opera Coast
10348
- ], [VERSION, [NAME, OPERA + ' Coast']], [/miuibrowser\/([\w\.]+)/i // MIUI Browser
10349
- ], [VERSION, [NAME, 'MIUI ' + BROWSER]], [/fxios\/([-\w\.]+)/i // Firefox for iOS
10350
- ], [VERSION, [NAME, FIREFOX]], [/\bqihu|(qi?ho?o?|360)browser/i // 360
10351
- ], [[NAME, '360 ' + BROWSER]], [/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [
10352
- // Oculus/Samsung/Sailfish/Huawei Browser
10353
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
10354
- ], [[NAME, /_/g, ' '], VERSION], [/(electron)\/([\w\.]+) safari/i,
10355
- // Electron-based App
10356
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
10357
- // Tesla
10358
- /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
10359
- ], [NAME, VERSION], [/(metasr)[\/ ]?([\w\.]+)/i,
10360
- // SouGouBrowser
10361
- /(lbbrowser)/i,
10362
- // LieBao Browser
10363
- /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
10364
- ], [NAME], [
10365
- // WebView
10366
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
10367
- ], [[NAME, FACEBOOK], VERSION], [/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
10368
- // Kakao App
10369
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
10370
- // Naver InApp
10371
- /safari (line)\/([\w\.]+)/i,
10372
- // Line App for iOS
10373
- /\b(line)\/([\w\.]+)\/iab/i,
10374
- // Line App for Android
10375
- /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram
10376
- ], [NAME, VERSION], [/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
10377
- ], [VERSION, [NAME, 'GSA']], [/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
10378
- ], [VERSION, [NAME, 'TikTok']], [/headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
10379
- ], [VERSION, [NAME, CHROME + ' Headless']], [/ wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
10380
- ], [[NAME, CHROME + ' WebView'], VERSION], [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
10381
- ], [VERSION, [NAME, 'Android ' + BROWSER]], [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
10382
- ], [NAME, VERSION], [/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
10383
- ], [VERSION, [NAME, 'Mobile Safari']], [/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
10384
- ], [VERSION, NAME], [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
10385
- ], [NAME, [VERSION, strMapper, oldSafariMap]], [/(webkit|khtml)\/([\w\.]+)/i], [NAME, VERSION], [
10386
- // Gecko based
10387
- /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
10388
- ], [[NAME, 'Netscape'], VERSION], [/mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
10389
- ], [VERSION, [NAME, FIREFOX + ' Reality']], [/ekiohf.+(flow)\/([\w\.]+)/i,
10390
- // Flow
10391
- /(swiftfox)/i,
10392
- // Swiftfox
10393
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
10394
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
10395
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
10396
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
10397
- /(firefox)\/([\w\.]+)/i,
10398
- // Other Firefox-based
10399
- /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,
10400
- // Mozilla
10401
-
10402
- // Other
10403
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
10404
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
10405
- /(links) \(([\w\.]+)/i,
10406
- // Links
10407
- /panasonic;(viera)/i // Panasonic Viera
10408
- ], [NAME, VERSION], [/(cobalt)\/([\w\.]+)/i // Cobalt
10409
- ], [NAME, [VERSION, /master.|lts./, ""]]],
10410
- cpu: [[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
10411
- ], [[ARCHITECTURE, 'amd64']], [/(ia32(?=;))/i // IA32 (quicktime)
10412
- ], [[ARCHITECTURE, lowerize]], [/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
10413
- ], [[ARCHITECTURE, 'ia32']], [/\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
10414
- ], [[ARCHITECTURE, 'arm64']], [/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
10415
- ], [[ARCHITECTURE, 'armhf']], [
10416
- // PocketPC mistakenly identified as PowerPC
10417
- /windows (ce|mobile); ppc;/i], [[ARCHITECTURE, 'arm']], [/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
10418
- ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [/(sun4\w)[;\)]/i // SPARC
10419
- ], [[ARCHITECTURE, 'sparc']], [/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
10420
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
10421
- ], [[ARCHITECTURE, lowerize]]],
10422
- device: [[
10423
- //////////////////////////
10424
- // MOBILES & TABLETS
10425
- /////////////////////////
10426
-
10427
- // Samsung
10428
- /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [/\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i, /samsung[- ]([-\w]+)/i, /sec-(sgh\w+)/i], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
10429
- // Apple
10430
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
10431
- ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [/\((ipad);[-\w\),; ]+apple/i,
10432
- // iPad
10433
- /applecoremedia\/[\w\.]+ \((ipad)/i, /\b(ipad)\d\d?,\d\d?[;\]].+ios/i], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [/(macintosh);/i], [MODEL, [VENDOR, APPLE]], [
10434
- // Sharp
10435
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
10436
- // Huawei
10437
- /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [/(?:huawei|honor)([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
10438
- // Xiaomi
10439
- /\b(poco[\w ]+)(?: bui|\))/i,
10440
- // Xiaomi POCO
10441
- /\b; (\w+) build\/hm\1/i,
10442
- // Xiaomi Hongmi 'numeric' models
10443
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
10444
- // Xiaomi Hongmi
10445
- /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
10446
- // Xiaomi Redmi
10447
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
10448
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
10449
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
10450
- // OPPO
10451
- /; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
10452
- // Vivo
10453
- /vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
10454
- // Realme
10455
- /\b(rmx[12]\d{3})(?: bui|;|\))/i], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
10456
- // Motorola
10457
- /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i, /\bmot(?:orola)?[- ](\w*)/i, /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [/\b(mz60\d|xoom[2 ]{0,2}) build\//i], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
10458
- // LG
10459
- /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i, /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i, /\blg-?([\d\w]+) bui/i], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
10460
- // Lenovo
10461
- /(ideatab[-\w ]+)/i, /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
10462
- // Nokia
10463
- /(?:maemo|nokia).*(n900|lumia \d+)/i, /nokia[-_ ]?([-\w\.]*)/i], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
10464
- // Google
10465
- /(pixel c)\b/i // Google Pixel C
10466
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
10467
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
10468
- // Sony
10469
- /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
10470
- // OnePlus
10471
- / (kb2005|in20[12]5|be20[12][59])\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
10472
- // Amazon
10473
- /(alexa)webm/i, /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,
10474
- // Kindle Fire without Silk / Echo Show
10475
- /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
10476
- ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
10477
- ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
10478
- // BlackBerry
10479
- /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
10480
- ], [MODEL, VENDOR, [TYPE, TABLET]], [/\b((?:bb[a-f]|st[hv])100-\d)/i, /\(bb10; (\w+)/i // BlackBerry 10
10481
- ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
10482
- // Asus
10483
- /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
10484
- // HTC
10485
- /(nexus 9)/i // HTC Nexus 9
10486
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
10487
- // HTC
10488
-
10489
- // ZTE
10490
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
10491
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
10492
- // Acer
10493
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
10494
- // Meizu
10495
- /droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
10496
- // MIXED
10497
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
10498
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
10499
- /(hp) ([\w ]+\w)/i,
10500
- // HP iPAQ
10501
- /(asus)-?(\w+)/i,
10502
- // Asus
10503
- /(microsoft); (lumia[\w ]+)/i,
10504
- // Microsoft Lumia
10505
- /(lenovo)[-_ ]?([-\w]+)/i,
10506
- // Lenovo
10507
- /(jolla)/i,
10508
- // Jolla
10509
- /(oppo) ?([\w ]+) bui/i // OPPO
10510
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kobo)\s(ereader|touch)/i,
10511
- // Kobo
10512
- /(archos) (gamepad2?)/i,
10513
- // Archos
10514
- /(hp).+(touchpad(?!.+tablet)|tablet)/i,
10515
- // HP TouchPad
10516
- /(kindle)\/([\w\.]+)/i,
10517
- // Kindle
10518
- /(nook)[\w ]+build\/(\w+)/i,
10519
- // Nook
10520
- /(dell) (strea[kpr\d ]*[\dko])/i,
10521
- // Dell Streak
10522
- /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
10523
- // Le Pan Tablets
10524
- /(trinity)[- ]*(t\d{3}) bui/i,
10525
- // Trinity Tablets
10526
- /(gigaset)[- ]+(q\w{1,9}) bui/i,
10527
- // Gigaset Tablets
10528
- /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
10529
- ], [VENDOR, MODEL, [TYPE, TABLET]], [/(surface duo)/i // Surface Duo
10530
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [/droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
10531
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [/(u304aa)/i // AT&T
10532
- ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [/\bsie-(\w*)/i // Siemens
10533
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [/\b(rct\w+) b/i // RCA Tablets
10534
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
10535
- ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
10536
- ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
10537
- ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [/\b(tm\d{3}\w+) b/i], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [/\b(k88) b/i // ZTE K Series Tablet
10538
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [/\b(nx\d{3}j) b/i // ZTE Nubia
10539
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
10540
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [/\b(zur\d{3}) b/i // Swiss ZUR Tablet
10541
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [/\b((zeki)?tb.*\b) b/i // Zeki Tablets
10542
- ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [/\b([yr]\d{2}) b/i, /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
10543
- ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [/\b(ns-?\w{0,9}) b/i // Insignia Tablets
10544
- ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
10545
- ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
10546
- ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
10547
- ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [/\b(ph-1) /i // Essential PH-1
10548
- ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
10549
- ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
10550
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [/\btu_(1491) b/i // Rotor Tablets
10551
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [/(shield[\w ]+) b/i // Nvidia Shield Tablets
10552
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [/(sprint) (\w+)/i // Sprint Phones
10553
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kin\.[onetw]{3})/i // Microsoft Kin
10554
- ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
10555
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
10556
- ///////////////////
10557
- // SMARTTVS
10558
- ///////////////////
10559
-
10560
- /smart-tv.+(samsung)/i // Samsung
10561
- ], [VENDOR, [TYPE, SMARTTV]], [/hbbtv.+maple;(\d+)/i], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
10562
- ], [[VENDOR, LG], [TYPE, SMARTTV]], [/(apple) ?tv/i // Apple TV
10563
- ], [VENDOR, [MODEL, APPLE + ' TV'], [TYPE, SMARTTV]], [/crkey/i // Google Chromecast
10564
- ], [[MODEL, CHROME + 'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [/droid.+aft(\w)( bui|\))/i // Fire TV
10565
- ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [/\(dtv[\);].+(aquos)/i, /(aquos-tv[\w ]+)\)/i // Sharp
10566
- ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]], [/(bravia[\w ]+)( bui|\))/i // Sony
10567
- ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [/(mitv-\w{5}) bui/i // Xiaomi
10568
- ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [/Hbbtv.*(technisat) (.*);/i // TechniSAT
10569
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
10570
- // Roku
10571
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
10572
- ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
10573
- ], [[TYPE, SMARTTV]], [
10574
- ///////////////////
10575
- // CONSOLES
10576
- ///////////////////
10577
-
10578
- /(ouya)/i,
10579
- // Ouya
10580
- /(nintendo) ([wids3utch]+)/i // Nintendo
10581
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [/droid.+; (shield) bui/i // Nvidia
10582
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [/(playstation [345portablevi]+)/i // Playstation
10583
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [/\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
10584
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
10585
- ///////////////////
10586
- // WEARABLES
10587
- ///////////////////
10588
-
10589
- /((pebble))app/i // Pebble
10590
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
10591
- ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [/droid.+; (glass) \d/i // Google Glass
10592
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [/droid.+; (wt63?0{2,3})\)/i], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [/(quest( 2| pro)?)/i // Oculus Quest
10593
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
10594
- ///////////////////
10595
- // EMBEDDED
10596
- ///////////////////
10597
-
10598
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
10599
- ], [VENDOR, [TYPE, EMBEDDED]], [/(aeobc)\b/i // Echo Dot
10600
- ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
10601
- ////////////////////
10602
- // MIXED (GENERIC)
10603
- ///////////////////
10604
-
10605
- /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
10606
- ], [MODEL, [TYPE, MOBILE]], [/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
10607
- ], [MODEL, [TYPE, TABLET]], [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
10608
- ], [[TYPE, TABLET]], [/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
10609
- ], [[TYPE, MOBILE]], [/(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
10610
- ], [MODEL, [VENDOR, 'Generic']]],
10611
- engine: [[/windows.+ edge\/([\w\.]+)/i // EdgeHTML
10612
- ], [VERSION, [NAME, EDGE + 'HTML']], [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
10613
- ], [VERSION, [NAME, 'Blink']], [/(presto)\/([\w\.]+)/i,
10614
- // Presto
10615
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
10616
- // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
10617
- /ekioh(flow)\/([\w\.]+)/i,
10618
- // Flow
10619
- /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
10620
- // KHTML/Tasman/Links
10621
- /(icab)[\/ ]([23]\.[\d\.]+)/i,
10622
- // iCab
10623
- /\b(libweb)/i], [NAME, VERSION], [/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
10624
- ], [VERSION, NAME]],
10625
- os: [[
10626
- // Windows
10627
- /microsoft (windows) (vista|xp)/i // Windows (iTunes)
10628
- ], [NAME, VERSION], [/(windows) nt 6\.2; (arm)/i,
10629
- // Windows RT
10630
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,
10631
- // Windows Phone
10632
- /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i], [NAME, [VERSION, strMapper, windowsVersionMap]], [/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [
10633
- // iOS/macOS
10634
- /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,
10635
- // iOS
10636
- /ios;fbsv\/([\d\.]+)/i, /cfnetwork\/.+darwin/i], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
10637
- ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
10638
- // Mobile OSes
10639
- /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
10640
- ], [VERSION, NAME], [
10641
- // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
10642
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i, /(blackberry)\w*\/([\w\.]*)/i,
10643
- // Blackberry
10644
- /(tizen|kaios)[\/ ]([\w\.]+)/i,
10645
- // Tizen/KaiOS
10646
- /\((series40);/i // Series 40
10647
- ], [NAME, VERSION], [/\(bb(10);/i // BlackBerry 10
10648
- ], [VERSION, [NAME, BLACKBERRY]], [/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
10649
- ], [VERSION, [NAME, 'Symbian']], [/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
10650
- ], [VERSION, [NAME, FIREFOX + ' OS']], [/web0s;.+rt(tv)/i, /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
10651
- ], [VERSION, [NAME, 'webOS']], [/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
10652
- ], [VERSION, [NAME, 'watchOS']], [
10653
- // Google Chromecast
10654
- /crkey\/([\d\.]+)/i // Google Chromecast
10655
- ], [VERSION, [NAME, CHROME + 'cast']], [/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
10656
- ], [[NAME, CHROMIUM_OS], VERSION], [
10657
- // Smart TVs
10658
- /panasonic;(viera)/i,
10659
- // Panasonic Viera
10660
- /(netrange)mmh/i,
10661
- // Netrange
10662
- /(nettv)\/(\d+\.[\w\.]+)/i,
10663
- // NetTV
10664
-
10665
- // Console
10666
- /(nintendo|playstation) ([wids345portablevuch]+)/i,
10667
- // Nintendo/Playstation
10668
- /(xbox); +xbox ([^\);]+)/i,
10669
- // Microsoft Xbox (360, One, X, S, Series X, Series S)
10670
-
10671
- // Other
10672
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
10673
- // Joli/Palm
10674
- /(mint)[\/\(\) ]?(\w*)/i,
10675
- // Mint
10676
- /(mageia|vectorlinux)[; ]/i,
10677
- // Mageia/VectorLinux
10678
- /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
10679
- // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
10680
- /(hurd|linux) ?([\w\.]*)/i,
10681
- // Hurd/Linux
10682
- /(gnu) ?([\w\.]*)/i,
10683
- // GNU
10684
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
10685
- // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
10686
- /(haiku) (\w+)/i // Haiku
10687
- ], [NAME, VERSION], [/(sunos) ?([\w\.\d]*)/i // Solaris
10688
- ], [[NAME, 'Solaris'], VERSION], [/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
10689
- // Solaris
10690
- /(aix) ((\d)(?=\.|\)| )[\w\.])*/i,
10691
- // AIX
10692
- /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,
10693
- // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
10694
- /(unix) ?([\w\.]*)/i // UNIX
10695
- ], [NAME, VERSION]]
10696
- };
10697
-
10698
- /////////////////
10699
- // Constructor
10700
- ////////////////
10701
-
10702
- var UAParser = function (ua, extensions) {
10703
- if (typeof ua === OBJ_TYPE) {
10704
- extensions = ua;
10705
- ua = undefined$1;
10706
- }
10707
- if (!(this instanceof UAParser)) {
10708
- return new UAParser(ua, extensions).getResult();
10709
- }
10710
- var _navigator = typeof window !== UNDEF_TYPE && window.navigator ? window.navigator : undefined$1;
10711
- var _ua = ua || (_navigator && _navigator.userAgent ? _navigator.userAgent : EMPTY);
10712
- var _uach = _navigator && _navigator.userAgentData ? _navigator.userAgentData : undefined$1;
10713
- var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
10714
- var _isSelfNav = _navigator && _navigator.userAgent == _ua;
10715
- this.getBrowser = function () {
10716
- var _browser = {};
10717
- _browser[NAME] = undefined$1;
10718
- _browser[VERSION] = undefined$1;
10719
- rgxMapper.call(_browser, _ua, _rgxmap.browser);
10720
- _browser[MAJOR] = majorize(_browser[VERSION]);
10721
- // Brave-specific detection
10722
- if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
10723
- _browser[NAME] = 'Brave';
10724
- }
10725
- return _browser;
10726
- };
10727
- this.getCPU = function () {
10728
- var _cpu = {};
10729
- _cpu[ARCHITECTURE] = undefined$1;
10730
- rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
10731
- return _cpu;
10732
- };
10733
- this.getDevice = function () {
10734
- var _device = {};
10735
- _device[VENDOR] = undefined$1;
10736
- _device[MODEL] = undefined$1;
10737
- _device[TYPE] = undefined$1;
10738
- rgxMapper.call(_device, _ua, _rgxmap.device);
10739
- if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
10740
- _device[TYPE] = MOBILE;
10741
- }
10742
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
10743
- if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
10744
- _device[MODEL] = 'iPad';
10745
- _device[TYPE] = TABLET;
10746
- }
10747
- return _device;
10748
- };
10749
- this.getEngine = function () {
10750
- var _engine = {};
10751
- _engine[NAME] = undefined$1;
10752
- _engine[VERSION] = undefined$1;
10753
- rgxMapper.call(_engine, _ua, _rgxmap.engine);
10754
- return _engine;
10755
- };
10756
- this.getOS = function () {
10757
- var _os = {};
10758
- _os[NAME] = undefined$1;
10759
- _os[VERSION] = undefined$1;
10760
- rgxMapper.call(_os, _ua, _rgxmap.os);
10761
- if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
10762
- _os[NAME] = _uach.platform.replace(/chrome os/i, CHROMIUM_OS).replace(/macos/i, MAC_OS); // backward compatibility
10763
- }
10764
-
10765
- return _os;
10766
- };
10767
- this.getResult = function () {
10768
- return {
10769
- ua: this.getUA(),
10770
- browser: this.getBrowser(),
10771
- engine: this.getEngine(),
10772
- os: this.getOS(),
10773
- device: this.getDevice(),
10774
- cpu: this.getCPU()
10775
- };
10776
- };
10777
- this.getUA = function () {
10778
- return _ua;
10779
- };
10780
- this.setUA = function (ua) {
10781
- _ua = typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
10782
- return this;
10783
- };
10784
- this.setUA(_ua);
10785
- return this;
10786
- };
10787
- UAParser.VERSION = LIBVERSION;
10788
- UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
10789
- UAParser.CPU = enumerize([ARCHITECTURE]);
10790
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
10791
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
10792
-
10793
- ///////////
10794
- // Export
10795
- //////////
10796
-
10797
- // check js environment
10798
- {
10799
- // nodejs env
10800
- if (module.exports) {
10801
- exports = module.exports = UAParser;
10802
- }
10803
- exports.UAParser = UAParser;
10804
- }
10805
-
10806
- // jQuery/Zepto specific (optional)
10807
- // Note:
10808
- // In AMD env the global scope should be kept clean, but jQuery is an exception.
10809
- // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
10810
- // and we should catch that.
10811
- var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
10812
- if ($ && !$.ua) {
10813
- var parser = new UAParser();
10814
- $.ua = parser.getResult();
10815
- $.ua.get = function () {
10816
- return parser.getUA();
10817
- };
10818
- $.ua.set = function (ua) {
10819
- parser.setUA(ua);
10820
- var result = parser.getResult();
10821
- for (var prop in result) {
10822
- $.ua[prop] = result[prop];
10823
- }
10824
- };
10825
- }
10826
- })(typeof window === 'object' ? window : commonjsGlobal);
10827
- })(uaParser, uaParser.exports);
10828
- var uaParserExports = uaParser.exports;
10829
- var UAParser = /*@__PURE__*/getDefaultExportFromCjs(uaParserExports);
10830
-
10831
- var version$1 = "1.9.4";
10832
-
10833
- const version = version$1;
10834
- const protocolVersion = 9;
10835
-
10836
- function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
10837
- const opts = Object.assign({}, options);
10838
- if (opts.audio === true) opts.audio = {};
10839
- if (opts.video === true) opts.video = {};
10840
- // use defaults
10841
- if (opts.audio) {
10842
- mergeObjectWithoutOverwriting(opts.audio, audioDefaults);
10843
- }
10844
- if (opts.video) {
10845
- mergeObjectWithoutOverwriting(opts.video, videoDefaults);
10093
+ /* eslint-disable */
10094
+ var SignalTarget;
10095
+ (function (SignalTarget) {
10096
+ SignalTarget[SignalTarget["PUBLISHER"] = 0] = "PUBLISHER";
10097
+ SignalTarget[SignalTarget["SUBSCRIBER"] = 1] = "SUBSCRIBER";
10098
+ SignalTarget[SignalTarget["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
10099
+ })(SignalTarget || (SignalTarget = {}));
10100
+ function signalTargetFromJSON(object) {
10101
+ switch (object) {
10102
+ case 0:
10103
+ case "PUBLISHER":
10104
+ return SignalTarget.PUBLISHER;
10105
+ case 1:
10106
+ case "SUBSCRIBER":
10107
+ return SignalTarget.SUBSCRIBER;
10108
+ case -1:
10109
+ case "UNRECOGNIZED":
10110
+ default:
10111
+ return SignalTarget.UNRECOGNIZED;
10846
10112
  }
10847
- return opts;
10848
- }
10849
- function mergeObjectWithoutOverwriting(mainObject, objectToMerge) {
10850
- Object.keys(objectToMerge).forEach(key => {
10851
- if (mainObject[key] === undefined) mainObject[key] = objectToMerge[key];
10852
- });
10853
- return mainObject;
10854
10113
  }
10855
- function constraintsForOptions(options) {
10856
- const constraints = {};
10857
- if (options.video) {
10858
- // default video options
10859
- if (typeof options.video === 'object') {
10860
- const videoOptions = {};
10861
- const target = videoOptions;
10862
- const source = options.video;
10863
- Object.keys(source).forEach(key => {
10864
- switch (key) {
10865
- case 'resolution':
10866
- // flatten VideoResolution fields
10867
- mergeObjectWithoutOverwriting(target, source.resolution);
10868
- break;
10869
- default:
10870
- target[key] = source[key];
10871
- }
10872
- });
10873
- constraints.video = videoOptions;
10874
- } else {
10875
- constraints.video = options.video;
10876
- }
10877
- } else {
10878
- constraints.video = false;
10879
- }
10880
- if (options.audio) {
10881
- if (typeof options.audio === 'object') {
10882
- constraints.audio = options.audio;
10883
- } else {
10884
- constraints.audio = true;
10885
- }
10886
- } else {
10887
- constraints.audio = false;
10114
+ function signalTargetToJSON(object) {
10115
+ switch (object) {
10116
+ case SignalTarget.PUBLISHER:
10117
+ return "PUBLISHER";
10118
+ case SignalTarget.SUBSCRIBER:
10119
+ return "SUBSCRIBER";
10120
+ case SignalTarget.UNRECOGNIZED:
10121
+ default:
10122
+ return "UNRECOGNIZED";
10888
10123
  }
10889
- return constraints;
10890
10124
  }
10891
- /**
10892
- * This function detects silence on a given [[Track]] instance.
10893
- * Returns true if the track seems to be entirely silent.
10894
- */
10895
- function detectSilence(track) {
10896
- let timeOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
10897
- return __awaiter(this, void 0, void 0, function* () {
10898
- const ctx = getNewAudioContext();
10899
- if (ctx) {
10900
- const analyser = ctx.createAnalyser();
10901
- analyser.fftSize = 2048;
10902
- const bufferLength = analyser.frequencyBinCount;
10903
- const dataArray = new Uint8Array(bufferLength);
10904
- const source = ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack]));
10905
- source.connect(analyser);
10906
- yield sleep(timeOffset);
10907
- analyser.getByteTimeDomainData(dataArray);
10908
- const someNoise = dataArray.some(sample => sample !== 128 && sample !== 0);
10909
- ctx.close();
10910
- return !someNoise;
10911
- }
10912
- return false;
10913
- });
10125
+ var StreamState;
10126
+ (function (StreamState) {
10127
+ StreamState[StreamState["ACTIVE"] = 0] = "ACTIVE";
10128
+ StreamState[StreamState["PAUSED"] = 1] = "PAUSED";
10129
+ StreamState[StreamState["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
10130
+ })(StreamState || (StreamState = {}));
10131
+ function streamStateFromJSON(object) {
10132
+ switch (object) {
10133
+ case 0:
10134
+ case "ACTIVE":
10135
+ return StreamState.ACTIVE;
10136
+ case 1:
10137
+ case "PAUSED":
10138
+ return StreamState.PAUSED;
10139
+ case -1:
10140
+ case "UNRECOGNIZED":
10141
+ default:
10142
+ return StreamState.UNRECOGNIZED;
10143
+ }
10914
10144
  }
10915
- /**
10916
- * @internal
10917
- */
10918
- function getNewAudioContext() {
10919
- const AudioContext =
10920
- // @ts-ignore
10921
- typeof window !== 'undefined' && (window.AudioContext || window.webkitAudioContext);
10922
- if (AudioContext) {
10923
- return new AudioContext({
10924
- latencyHint: 'interactive'
10925
- });
10145
+ function streamStateToJSON(object) {
10146
+ switch (object) {
10147
+ case StreamState.ACTIVE:
10148
+ return "ACTIVE";
10149
+ case StreamState.PAUSED:
10150
+ return "PAUSED";
10151
+ case StreamState.UNRECOGNIZED:
10152
+ default:
10153
+ return "UNRECOGNIZED";
10926
10154
  }
10927
10155
  }
10928
-
10929
- const separator = '|';
10930
- const ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension';
10931
- function unpackStreamId(packed) {
10932
- const parts = packed.split(separator);
10933
- if (parts.length > 1) {
10934
- return [parts[0], packed.substr(parts[0].length + 1)];
10156
+ var CandidateProtocol;
10157
+ (function (CandidateProtocol) {
10158
+ CandidateProtocol[CandidateProtocol["UDP"] = 0] = "UDP";
10159
+ CandidateProtocol[CandidateProtocol["TCP"] = 1] = "TCP";
10160
+ CandidateProtocol[CandidateProtocol["TLS"] = 2] = "TLS";
10161
+ CandidateProtocol[CandidateProtocol["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
10162
+ })(CandidateProtocol || (CandidateProtocol = {}));
10163
+ function candidateProtocolFromJSON(object) {
10164
+ switch (object) {
10165
+ case 0:
10166
+ case "UDP":
10167
+ return CandidateProtocol.UDP;
10168
+ case 1:
10169
+ case "TCP":
10170
+ return CandidateProtocol.TCP;
10171
+ case 2:
10172
+ case "TLS":
10173
+ return CandidateProtocol.TLS;
10174
+ case -1:
10175
+ case "UNRECOGNIZED":
10176
+ default:
10177
+ return CandidateProtocol.UNRECOGNIZED;
10935
10178
  }
10936
- return [packed, ''];
10937
10179
  }
10938
- function sleep(duration) {
10939
- return __awaiter(this, void 0, void 0, function* () {
10940
- return new Promise(resolve => setTimeout(resolve, duration));
10941
- });
10180
+ function candidateProtocolToJSON(object) {
10181
+ switch (object) {
10182
+ case CandidateProtocol.UDP:
10183
+ return "UDP";
10184
+ case CandidateProtocol.TCP:
10185
+ return "TCP";
10186
+ case CandidateProtocol.TLS:
10187
+ return "TLS";
10188
+ case CandidateProtocol.UNRECOGNIZED:
10189
+ default:
10190
+ return "UNRECOGNIZED";
10191
+ }
10942
10192
  }
10943
- /** @internal */
10944
- function supportsTransceiver() {
10945
- return 'addTransceiver' in RTCPeerConnection.prototype;
10946
- }
10947
- /** @internal */
10948
- function supportsAddTrack() {
10949
- return 'addTrack' in RTCPeerConnection.prototype;
10950
- }
10951
- function supportsAdaptiveStream() {
10952
- return typeof ResizeObserver !== undefined && typeof IntersectionObserver !== undefined;
10953
- }
10954
- function supportsDynacast() {
10955
- return supportsTransceiver();
10956
- }
10957
- function supportsAV1() {
10958
- if (!('getCapabilities' in RTCRtpSender)) {
10959
- return false;
10960
- }
10961
- const capabilities = RTCRtpSender.getCapabilities('video');
10962
- let hasAV1 = false;
10963
- if (capabilities) {
10964
- for (const codec of capabilities.codecs) {
10965
- if (codec.mimeType === 'video/AV1') {
10966
- hasAV1 = true;
10967
- break;
10968
- }
10969
- }
10970
- }
10971
- return hasAV1;
10972
- }
10973
- function supportsVP9() {
10974
- if (!('getCapabilities' in RTCRtpSender)) {
10975
- // technically speaking FireFox supports VP9, but SVC publishing is broken
10976
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1633876
10977
- return false;
10978
- }
10979
- const capabilities = RTCRtpSender.getCapabilities('video');
10980
- let hasVP9 = false;
10981
- if (capabilities) {
10982
- for (const codec of capabilities.codecs) {
10983
- if (codec.mimeType === 'video/VP9') {
10984
- hasVP9 = true;
10985
- break;
10986
- }
10987
- }
10988
- }
10989
- return hasVP9;
10990
- }
10991
- function isSVCCodec(codec) {
10992
- return codec === 'av1' || codec === 'vp9';
10993
- }
10994
- function supportsSetSinkId(elm) {
10995
- if (!document) {
10996
- return false;
10997
- }
10998
- if (!elm) {
10999
- elm = document.createElement('audio');
11000
- }
11001
- return 'setSinkId' in elm;
11002
- }
11003
- const setCodecPreferencesVersions = {
11004
- Chrome: '100',
11005
- Chromium: '100',
11006
- Safari: '15',
11007
- Firefox: '100',
11008
- Edge: '100',
11009
- Brave: '1.40'
11010
- };
11011
- function supportsSetCodecPreferences(transceiver) {
11012
- if (!isWeb()) {
11013
- return false;
11014
- }
11015
- if (!('setCodecPreferences' in transceiver)) {
11016
- return false;
11017
- }
11018
- const uap = UAParser();
11019
- if (!uap.browser.name || !uap.browser.version) {
11020
- // version is required
11021
- return false;
11022
- }
11023
- const v = setCodecPreferencesVersions[uap.browser.name];
11024
- if (v) {
11025
- return compareVersions(uap.browser.version, v) >= 0;
11026
- }
11027
- return false;
11028
- }
11029
- function isBrowserSupported() {
11030
- return supportsTransceiver() || supportsAddTrack();
11031
- }
11032
- function isFireFox() {
11033
- if (!isWeb()) return false;
11034
- return navigator.userAgent.indexOf('Firefox') !== -1;
11035
- }
11036
- function isChromiumBased() {
11037
- if (!isWeb()) return false;
11038
- return navigator.userAgent.indexOf('Chrom') !== -1;
11039
- }
11040
- function isSafari() {
11041
- if (!isWeb()) return false;
11042
- return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
11043
- }
11044
- function isMobile() {
11045
- if (!isWeb()) return false;
11046
- return /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent);
11047
- }
11048
- function isWeb() {
11049
- return typeof document !== 'undefined';
11050
- }
11051
- function isReactNative() {
11052
- // navigator.product is deprecated on browsers, but will be set appropriately for react-native.
11053
- return navigator.product == 'ReactNative';
11054
- }
11055
- function isCloud(serverUrl) {
11056
- return serverUrl.hostname.endsWith('.livekit.cloud');
11057
- }
11058
- function getLKReactNativeInfo() {
11059
- // global defined only for ReactNative.
11060
- // @ts-ignore
11061
- if (global && global.LiveKitReactNativeGlobal) {
11062
- // @ts-ignore
11063
- return global.LiveKitReactNativeGlobal;
11064
- }
11065
- return undefined;
11066
- }
11067
- function getReactNativeOs() {
11068
- if (!isReactNative()) {
11069
- return undefined;
11070
- }
11071
- let info = getLKReactNativeInfo();
11072
- if (info) {
11073
- return info.platform;
11074
- }
11075
- return undefined;
11076
- }
11077
- function getDevicePixelRatio() {
11078
- if (isWeb()) {
11079
- return window.devicePixelRatio;
11080
- }
11081
- if (isReactNative()) {
11082
- let info = getLKReactNativeInfo();
11083
- if (info) {
11084
- return info.devicePixelRatio;
11085
- }
11086
- }
11087
- return 1;
11088
- }
11089
- function compareVersions(v1, v2) {
11090
- const parts1 = v1.split('.');
11091
- const parts2 = v2.split('.');
11092
- const k = Math.min(v1.length, v2.length);
11093
- for (let i = 0; i < k; ++i) {
11094
- const p1 = parseInt(parts1[i], 10);
11095
- const p2 = parseInt(parts2[i], 10);
11096
- if (p1 > p2) return 1;
11097
- if (p1 < p2) return -1;
11098
- }
11099
- return parts1.length == parts2.length ? 0 : parts1.length < parts2.length ? -1 : 1;
11100
- }
11101
- function roDispatchCallback(entries) {
11102
- for (const entry of entries) {
11103
- entry.target.handleResize(entry);
11104
- }
11105
- }
11106
- function ioDispatchCallback(entries) {
11107
- for (const entry of entries) {
11108
- entry.target.handleVisibilityChanged(entry);
11109
- }
11110
- }
11111
- let resizeObserver = null;
11112
- const getResizeObserver = () => {
11113
- if (!resizeObserver) resizeObserver = new ResizeObserver(roDispatchCallback);
11114
- return resizeObserver;
11115
- };
11116
- let intersectionObserver = null;
11117
- const getIntersectionObserver = () => {
11118
- if (!intersectionObserver) intersectionObserver = new IntersectionObserver(ioDispatchCallback, {
11119
- root: document,
11120
- rootMargin: '0px'
11121
- });
11122
- return intersectionObserver;
11123
- };
11124
- function getClientInfo() {
11125
- var _a;
11126
- const info = ClientInfo.fromPartial({
11127
- sdk: ClientInfo_SDK.JS,
11128
- protocol: protocolVersion,
11129
- version
11130
- });
11131
- if (isReactNative()) {
11132
- info.os = (_a = getReactNativeOs()) !== null && _a !== void 0 ? _a : '';
11133
- }
11134
- return info;
11135
- }
11136
- let emptyVideoStreamTrack;
11137
- function getEmptyVideoStreamTrack() {
11138
- if (!emptyVideoStreamTrack) {
11139
- emptyVideoStreamTrack = createDummyVideoStreamTrack();
11140
- }
11141
- return emptyVideoStreamTrack;
11142
- }
11143
- function createDummyVideoStreamTrack() {
11144
- let width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
11145
- let height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16;
11146
- let enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
11147
- let paintContent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
11148
- const canvas = document.createElement('canvas');
11149
- // the canvas size is set to 16 by default, because electron apps seem to fail with smaller values
11150
- canvas.width = width;
11151
- canvas.height = height;
11152
- const ctx = canvas.getContext('2d');
11153
- ctx === null || ctx === void 0 ? void 0 : ctx.fillRect(0, 0, canvas.width, canvas.height);
11154
- if (paintContent && ctx) {
11155
- ctx.beginPath();
11156
- ctx.arc(width / 2, height / 2, 50, 0, Math.PI * 2, true);
11157
- ctx.closePath();
11158
- ctx.fillStyle = 'grey';
11159
- ctx.fill();
11160
- }
11161
- // @ts-ignore
11162
- const dummyStream = canvas.captureStream();
11163
- const [dummyTrack] = dummyStream.getTracks();
11164
- if (!dummyTrack) {
11165
- throw Error('Could not get empty media stream video track');
11166
- }
11167
- dummyTrack.enabled = enabled;
11168
- return dummyTrack;
11169
- }
11170
- let emptyAudioStreamTrack;
11171
- function getEmptyAudioStreamTrack() {
11172
- if (!emptyAudioStreamTrack) {
11173
- // implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/
11174
- const ctx = new AudioContext();
11175
- const oscillator = ctx.createOscillator();
11176
- const dst = ctx.createMediaStreamDestination();
11177
- oscillator.connect(dst);
11178
- oscillator.start();
11179
- [emptyAudioStreamTrack] = dst.stream.getAudioTracks();
11180
- if (!emptyAudioStreamTrack) {
11181
- throw Error('Could not get empty media stream audio track');
11182
- }
11183
- emptyAudioStreamTrack.enabled = false;
11184
- }
11185
- return emptyAudioStreamTrack;
11186
- }
11187
- class Future {
11188
- constructor(futureBase, onFinally) {
11189
- this.onFinally = onFinally;
11190
- this.promise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
11191
- this.resolve = resolve;
11192
- this.reject = reject;
11193
- if (futureBase) {
11194
- yield futureBase(resolve, reject);
11195
- }
11196
- })).finally(() => {
11197
- var _a;
11198
- return (_a = this.onFinally) === null || _a === void 0 ? void 0 : _a.call(this);
11199
- });
11200
- }
11201
- }
11202
- /**
11203
- * Creates and returns an analyser web audio node that is attached to the provided track.
11204
- * Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track.
11205
- * Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper
11206
- */
11207
- function createAudioAnalyser(track, options) {
11208
- const opts = Object.assign({
11209
- cloneTrack: false,
11210
- fftSize: 2048,
11211
- smoothingTimeConstant: 0.8,
11212
- minDecibels: -100,
11213
- maxDecibels: -80
11214
- }, options);
11215
- const audioContext = getNewAudioContext();
11216
- if (!audioContext) {
11217
- throw new Error('Audio Context not supported on this browser');
11218
- }
11219
- const streamTrack = opts.cloneTrack ? track.mediaStreamTrack.clone() : track.mediaStreamTrack;
11220
- const mediaStreamSource = audioContext.createMediaStreamSource(new MediaStream([streamTrack]));
11221
- const analyser = audioContext.createAnalyser();
11222
- analyser.minDecibels = opts.minDecibels;
11223
- analyser.maxDecibels = opts.maxDecibels;
11224
- analyser.fftSize = opts.fftSize;
11225
- analyser.smoothingTimeConstant = opts.smoothingTimeConstant;
11226
- mediaStreamSource.connect(analyser);
11227
- const dataArray = new Uint8Array(analyser.frequencyBinCount);
11228
- /**
11229
- * Calculates the current volume of the track in the range from 0 to 1
11230
- */
11231
- const calculateVolume = () => {
11232
- analyser.getByteFrequencyData(dataArray);
11233
- let sum = 0;
11234
- for (const amplitude of dataArray) {
11235
- sum += Math.pow(amplitude / 255, 2);
11236
- }
11237
- const volume = Math.sqrt(sum / dataArray.length);
11238
- return volume;
11239
- };
11240
- const cleanup = () => {
11241
- audioContext.close();
11242
- if (opts.cloneTrack) {
11243
- streamTrack.stop();
11244
- }
11245
- };
11246
- return {
11247
- calculateVolume,
11248
- analyser,
11249
- cleanup
11250
- };
11251
- }
11252
- class Mutex {
11253
- constructor() {
11254
- this._locking = Promise.resolve();
11255
- this._locks = 0;
11256
- }
11257
- isLocked() {
11258
- return this._locks > 0;
11259
- }
11260
- lock() {
11261
- this._locks += 1;
11262
- let unlockNext;
11263
- const willLock = new Promise(resolve => unlockNext = () => {
11264
- this._locks -= 1;
11265
- resolve();
11266
- });
11267
- const willUnlock = this._locking.then(() => unlockNext);
11268
- this._locking = this._locking.then(() => willLock);
11269
- return willUnlock;
11270
- }
11271
- }
11272
-
11273
- var QueueTaskStatus;
11274
- (function (QueueTaskStatus) {
11275
- QueueTaskStatus[QueueTaskStatus["WAITING"] = 0] = "WAITING";
11276
- QueueTaskStatus[QueueTaskStatus["RUNNING"] = 1] = "RUNNING";
11277
- QueueTaskStatus[QueueTaskStatus["COMPLETED"] = 2] = "COMPLETED";
11278
- })(QueueTaskStatus || (QueueTaskStatus = {}));
11279
- class AsyncQueue {
11280
- constructor() {
11281
- this.pendingTasks = new Map();
11282
- this.taskMutex = new Mutex();
11283
- this.nextTaskIndex = 0;
11284
- }
11285
- run(task) {
11286
- return __awaiter(this, void 0, void 0, function* () {
11287
- const taskInfo = {
11288
- id: this.nextTaskIndex++,
11289
- enqueuedAt: Date.now(),
11290
- status: QueueTaskStatus.WAITING
11291
- };
11292
- this.pendingTasks.set(taskInfo.id, taskInfo);
11293
- const unlock = yield this.taskMutex.lock();
11294
- try {
11295
- taskInfo.executedAt = Date.now();
11296
- taskInfo.status = QueueTaskStatus.RUNNING;
11297
- return yield task();
11298
- } finally {
11299
- taskInfo.status = QueueTaskStatus.COMPLETED;
11300
- this.pendingTasks.delete(taskInfo.id);
11301
- unlock();
11302
- }
11303
- });
11304
- }
11305
- flush() {
11306
- return __awaiter(this, void 0, void 0, function* () {
11307
- return this.run(() => __awaiter(this, void 0, void 0, function* () {}));
11308
- });
11309
- }
11310
- snapshot() {
11311
- return Array.from(this.pendingTasks.values());
11312
- }
11313
- }
11314
-
11315
- /* eslint-disable */
11316
- var SignalTarget;
11317
- (function (SignalTarget) {
11318
- SignalTarget[SignalTarget["PUBLISHER"] = 0] = "PUBLISHER";
11319
- SignalTarget[SignalTarget["SUBSCRIBER"] = 1] = "SUBSCRIBER";
11320
- SignalTarget[SignalTarget["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
11321
- })(SignalTarget || (SignalTarget = {}));
11322
- function signalTargetFromJSON(object) {
11323
- switch (object) {
11324
- case 0:
11325
- case "PUBLISHER":
11326
- return SignalTarget.PUBLISHER;
11327
- case 1:
11328
- case "SUBSCRIBER":
11329
- return SignalTarget.SUBSCRIBER;
11330
- case -1:
11331
- case "UNRECOGNIZED":
11332
- default:
11333
- return SignalTarget.UNRECOGNIZED;
11334
- }
11335
- }
11336
- function signalTargetToJSON(object) {
11337
- switch (object) {
11338
- case SignalTarget.PUBLISHER:
11339
- return "PUBLISHER";
11340
- case SignalTarget.SUBSCRIBER:
11341
- return "SUBSCRIBER";
11342
- case SignalTarget.UNRECOGNIZED:
11343
- default:
11344
- return "UNRECOGNIZED";
11345
- }
11346
- }
11347
- var StreamState;
11348
- (function (StreamState) {
11349
- StreamState[StreamState["ACTIVE"] = 0] = "ACTIVE";
11350
- StreamState[StreamState["PAUSED"] = 1] = "PAUSED";
11351
- StreamState[StreamState["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
11352
- })(StreamState || (StreamState = {}));
11353
- function streamStateFromJSON(object) {
11354
- switch (object) {
11355
- case 0:
11356
- case "ACTIVE":
11357
- return StreamState.ACTIVE;
11358
- case 1:
11359
- case "PAUSED":
11360
- return StreamState.PAUSED;
11361
- case -1:
11362
- case "UNRECOGNIZED":
11363
- default:
11364
- return StreamState.UNRECOGNIZED;
11365
- }
11366
- }
11367
- function streamStateToJSON(object) {
11368
- switch (object) {
11369
- case StreamState.ACTIVE:
11370
- return "ACTIVE";
11371
- case StreamState.PAUSED:
11372
- return "PAUSED";
11373
- case StreamState.UNRECOGNIZED:
11374
- default:
11375
- return "UNRECOGNIZED";
11376
- }
11377
- }
11378
- var CandidateProtocol;
11379
- (function (CandidateProtocol) {
11380
- CandidateProtocol[CandidateProtocol["UDP"] = 0] = "UDP";
11381
- CandidateProtocol[CandidateProtocol["TCP"] = 1] = "TCP";
11382
- CandidateProtocol[CandidateProtocol["TLS"] = 2] = "TLS";
11383
- CandidateProtocol[CandidateProtocol["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
11384
- })(CandidateProtocol || (CandidateProtocol = {}));
11385
- function candidateProtocolFromJSON(object) {
11386
- switch (object) {
11387
- case 0:
11388
- case "UDP":
11389
- return CandidateProtocol.UDP;
11390
- case 1:
11391
- case "TCP":
11392
- return CandidateProtocol.TCP;
11393
- case 2:
11394
- case "TLS":
11395
- return CandidateProtocol.TLS;
11396
- case -1:
11397
- case "UNRECOGNIZED":
11398
- default:
11399
- return CandidateProtocol.UNRECOGNIZED;
11400
- }
11401
- }
11402
- function candidateProtocolToJSON(object) {
11403
- switch (object) {
11404
- case CandidateProtocol.UDP:
11405
- return "UDP";
11406
- case CandidateProtocol.TCP:
11407
- return "TCP";
11408
- case CandidateProtocol.TLS:
11409
- return "TLS";
11410
- case CandidateProtocol.UNRECOGNIZED:
11411
- default:
11412
- return "UNRECOGNIZED";
11413
- }
11414
- }
11415
- function createBaseSignalRequest() {
11416
- return {
11417
- message: undefined
11418
- };
10193
+ function createBaseSignalRequest() {
10194
+ return {
10195
+ message: undefined
10196
+ };
11419
10197
  }
11420
10198
  const SignalRequest = {
11421
10199
  encode(message) {
@@ -14965,263 +13743,809 @@ const SimulateScenario = {
14965
13743
  subscriberBandwidth: object.scenario.subscriberBandwidth
14966
13744
  };
14967
13745
  }
14968
- return message;
13746
+ return message;
13747
+ }
13748
+ };
13749
+ function createBasePing() {
13750
+ return {
13751
+ timestamp: 0,
13752
+ rtt: 0
13753
+ };
13754
+ }
13755
+ const Ping = {
13756
+ encode(message) {
13757
+ let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create();
13758
+ if (message.timestamp !== 0) {
13759
+ writer.uint32(8).int64(message.timestamp);
13760
+ }
13761
+ if (message.rtt !== 0) {
13762
+ writer.uint32(16).int64(message.rtt);
13763
+ }
13764
+ return writer;
13765
+ },
13766
+ decode(input, length) {
13767
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
13768
+ let end = length === undefined ? reader.len : reader.pos + length;
13769
+ const message = createBasePing();
13770
+ while (reader.pos < end) {
13771
+ const tag = reader.uint32();
13772
+ switch (tag >>> 3) {
13773
+ case 1:
13774
+ if (tag != 8) {
13775
+ break;
13776
+ }
13777
+ message.timestamp = longToNumber(reader.int64());
13778
+ continue;
13779
+ case 2:
13780
+ if (tag != 16) {
13781
+ break;
13782
+ }
13783
+ message.rtt = longToNumber(reader.int64());
13784
+ continue;
13785
+ }
13786
+ if ((tag & 7) == 4 || tag == 0) {
13787
+ break;
13788
+ }
13789
+ reader.skipType(tag & 7);
13790
+ }
13791
+ return message;
13792
+ },
13793
+ fromJSON(object) {
13794
+ return {
13795
+ timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0,
13796
+ rtt: isSet(object.rtt) ? Number(object.rtt) : 0
13797
+ };
13798
+ },
13799
+ toJSON(message) {
13800
+ const obj = {};
13801
+ message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
13802
+ message.rtt !== undefined && (obj.rtt = Math.round(message.rtt));
13803
+ return obj;
13804
+ },
13805
+ create(base) {
13806
+ return Ping.fromPartial(base !== null && base !== void 0 ? base : {});
13807
+ },
13808
+ fromPartial(object) {
13809
+ var _a, _b;
13810
+ const message = createBasePing();
13811
+ message.timestamp = (_a = object.timestamp) !== null && _a !== void 0 ? _a : 0;
13812
+ message.rtt = (_b = object.rtt) !== null && _b !== void 0 ? _b : 0;
13813
+ return message;
13814
+ }
13815
+ };
13816
+ function createBasePong() {
13817
+ return {
13818
+ lastPingTimestamp: 0,
13819
+ timestamp: 0
13820
+ };
13821
+ }
13822
+ const Pong = {
13823
+ encode(message) {
13824
+ let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create();
13825
+ if (message.lastPingTimestamp !== 0) {
13826
+ writer.uint32(8).int64(message.lastPingTimestamp);
13827
+ }
13828
+ if (message.timestamp !== 0) {
13829
+ writer.uint32(16).int64(message.timestamp);
13830
+ }
13831
+ return writer;
13832
+ },
13833
+ decode(input, length) {
13834
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
13835
+ let end = length === undefined ? reader.len : reader.pos + length;
13836
+ const message = createBasePong();
13837
+ while (reader.pos < end) {
13838
+ const tag = reader.uint32();
13839
+ switch (tag >>> 3) {
13840
+ case 1:
13841
+ if (tag != 8) {
13842
+ break;
13843
+ }
13844
+ message.lastPingTimestamp = longToNumber(reader.int64());
13845
+ continue;
13846
+ case 2:
13847
+ if (tag != 16) {
13848
+ break;
13849
+ }
13850
+ message.timestamp = longToNumber(reader.int64());
13851
+ continue;
13852
+ }
13853
+ if ((tag & 7) == 4 || tag == 0) {
13854
+ break;
13855
+ }
13856
+ reader.skipType(tag & 7);
13857
+ }
13858
+ return message;
13859
+ },
13860
+ fromJSON(object) {
13861
+ return {
13862
+ lastPingTimestamp: isSet(object.lastPingTimestamp) ? Number(object.lastPingTimestamp) : 0,
13863
+ timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0
13864
+ };
13865
+ },
13866
+ toJSON(message) {
13867
+ const obj = {};
13868
+ message.lastPingTimestamp !== undefined && (obj.lastPingTimestamp = Math.round(message.lastPingTimestamp));
13869
+ message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
13870
+ return obj;
13871
+ },
13872
+ create(base) {
13873
+ return Pong.fromPartial(base !== null && base !== void 0 ? base : {});
13874
+ },
13875
+ fromPartial(object) {
13876
+ var _a, _b;
13877
+ const message = createBasePong();
13878
+ message.lastPingTimestamp = (_a = object.lastPingTimestamp) !== null && _a !== void 0 ? _a : 0;
13879
+ message.timestamp = (_b = object.timestamp) !== null && _b !== void 0 ? _b : 0;
13880
+ return message;
13881
+ }
13882
+ };
13883
+ var tsProtoGlobalThis = (() => {
13884
+ if (typeof globalThis !== "undefined") {
13885
+ return globalThis;
13886
+ }
13887
+ if (typeof self !== "undefined") {
13888
+ return self;
13889
+ }
13890
+ if (typeof window !== "undefined") {
13891
+ return window;
13892
+ }
13893
+ if (typeof global !== "undefined") {
13894
+ return global;
13895
+ }
13896
+ throw "Unable to locate global object";
13897
+ })();
13898
+ function longToNumber(long) {
13899
+ if (long.gt(Number.MAX_SAFE_INTEGER)) {
13900
+ throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
13901
+ }
13902
+ return long.toNumber();
13903
+ }
13904
+ if (_m0.util.Long !== Long$1) {
13905
+ _m0.util.Long = Long$1;
13906
+ _m0.configure();
13907
+ }
13908
+ function isSet(value) {
13909
+ return value !== null && value !== undefined;
13910
+ }
13911
+
13912
+ class LivekitError extends Error {
13913
+ constructor(code, message) {
13914
+ super(message || 'an error has occured');
13915
+ this.code = code;
13916
+ }
13917
+ }
13918
+ class ConnectionError extends LivekitError {
13919
+ constructor(message, reason, status) {
13920
+ super(1, message);
13921
+ this.status = status;
13922
+ this.reason = reason;
13923
+ }
13924
+ }
13925
+ class DeviceUnsupportedError extends LivekitError {
13926
+ constructor(message) {
13927
+ super(21, message !== null && message !== void 0 ? message : 'device is unsupported');
13928
+ }
13929
+ }
13930
+ class TrackInvalidError extends LivekitError {
13931
+ constructor(message) {
13932
+ super(20, message !== null && message !== void 0 ? message : 'track is invalid');
13933
+ }
13934
+ }
13935
+ class UnsupportedServer extends LivekitError {
13936
+ constructor(message) {
13937
+ super(10, message !== null && message !== void 0 ? message : 'unsupported server');
13938
+ }
13939
+ }
13940
+ class UnexpectedConnectionState extends LivekitError {
13941
+ constructor(message) {
13942
+ super(12, message !== null && message !== void 0 ? message : 'unexpected connection state');
13943
+ }
13944
+ }
13945
+ class NegotiationError extends LivekitError {
13946
+ constructor(message) {
13947
+ super(13, message !== null && message !== void 0 ? message : 'unable to negotiate');
13948
+ }
13949
+ }
13950
+ class PublishDataError extends LivekitError {
13951
+ constructor(message) {
13952
+ super(13, message !== null && message !== void 0 ? message : 'unable to publish data');
13953
+ }
13954
+ }
13955
+ var MediaDeviceFailure;
13956
+ (function (MediaDeviceFailure) {
13957
+ // user rejected permissions
13958
+ MediaDeviceFailure["PermissionDenied"] = "PermissionDenied";
13959
+ // device is not available
13960
+ MediaDeviceFailure["NotFound"] = "NotFound";
13961
+ // device is in use. On Windows, only a single tab may get access to a device at a time.
13962
+ MediaDeviceFailure["DeviceInUse"] = "DeviceInUse";
13963
+ MediaDeviceFailure["Other"] = "Other";
13964
+ })(MediaDeviceFailure || (MediaDeviceFailure = {}));
13965
+ (function (MediaDeviceFailure) {
13966
+ function getFailure(error) {
13967
+ if (error && 'name' in error) {
13968
+ if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {
13969
+ return MediaDeviceFailure.NotFound;
13970
+ }
13971
+ if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {
13972
+ return MediaDeviceFailure.PermissionDenied;
13973
+ }
13974
+ if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {
13975
+ return MediaDeviceFailure.DeviceInUse;
13976
+ }
13977
+ return MediaDeviceFailure.Other;
13978
+ }
14969
13979
  }
13980
+ MediaDeviceFailure.getFailure = getFailure;
13981
+ })(MediaDeviceFailure || (MediaDeviceFailure = {}));
13982
+
13983
+ /**
13984
+ * Timers that can be overridden with platform specific implementations
13985
+ * that ensure that they are fired. These should be used when it is critical
13986
+ * that the timer fires on time.
13987
+ */
13988
+ class CriticalTimers {}
13989
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
13990
+ CriticalTimers.setTimeout = function () {
13991
+ return setTimeout(...arguments);
14970
13992
  };
14971
- function createBasePing() {
14972
- return {
14973
- timestamp: 0,
14974
- rtt: 0
14975
- };
13993
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
13994
+ CriticalTimers.setInterval = function () {
13995
+ return setInterval(...arguments);
13996
+ };
13997
+ CriticalTimers.clearTimeout = function () {
13998
+ return clearTimeout(...arguments);
13999
+ };
14000
+ CriticalTimers.clearInterval = function () {
14001
+ return clearInterval(...arguments);
14002
+ };
14003
+
14004
+ // tiny, simplified version of https://github.com/lancedikson/bowser/blob/master/src/parser-browsers.js
14005
+ // reduced to only differentiate Chrome(ium) based browsers / Firefox / Safari
14006
+ const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i;
14007
+ let browserDetails;
14008
+ /**
14009
+ * @internal
14010
+ */
14011
+ function getBrowser(userAgent) {
14012
+ let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
14013
+ if (userAgent === undefined && (typeof document !== 'undefined' || typeof navigator === 'undefined')) {
14014
+ return;
14015
+ }
14016
+ const ua = (userAgent !== null && userAgent !== void 0 ? userAgent : navigator.userAgent).toLowerCase();
14017
+ if (browserDetails === undefined || force) {
14018
+ const browser = browsersList.find(_ref => {
14019
+ let {
14020
+ test
14021
+ } = _ref;
14022
+ return test.test(ua);
14023
+ });
14024
+ browserDetails = browser === null || browser === void 0 ? void 0 : browser.describe(ua);
14025
+ }
14026
+ return browserDetails;
14976
14027
  }
14977
- const Ping = {
14978
- encode(message) {
14979
- let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create();
14980
- if (message.timestamp !== 0) {
14981
- writer.uint32(8).int64(message.timestamp);
14028
+ const browsersList = [{
14029
+ test: /firefox|iceweasel|fxios/i,
14030
+ describe(ua) {
14031
+ const browser = {
14032
+ name: 'Firefox',
14033
+ version: getMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua)
14034
+ };
14035
+ return browser;
14036
+ }
14037
+ }, {
14038
+ test: /chrom|crios|crmo/i,
14039
+ describe(ua) {
14040
+ const browser = {
14041
+ name: 'Chrome',
14042
+ version: getMatch(/(?:chrome|chromium|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua)
14043
+ };
14044
+ return browser;
14045
+ }
14046
+ }, /* Safari */
14047
+ {
14048
+ test: /safari|applewebkit/i,
14049
+ describe(ua) {
14050
+ const browser = {
14051
+ name: 'Safari',
14052
+ version: getMatch(commonVersionIdentifier, ua)
14053
+ };
14054
+ return browser;
14055
+ }
14056
+ }];
14057
+ function getMatch(exp, ua) {
14058
+ let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
14059
+ const match = ua.match(exp);
14060
+ return match && match.length >= id && match[id] || '';
14061
+ }
14062
+
14063
+ var version$1 = "1.9.5";
14064
+
14065
+ const version = version$1;
14066
+ const protocolVersion = 9;
14067
+
14068
+ function mergeDefaultOptions(options, audioDefaults, videoDefaults) {
14069
+ const opts = Object.assign({}, options);
14070
+ if (opts.audio === true) opts.audio = {};
14071
+ if (opts.video === true) opts.video = {};
14072
+ // use defaults
14073
+ if (opts.audio) {
14074
+ mergeObjectWithoutOverwriting(opts.audio, audioDefaults);
14075
+ }
14076
+ if (opts.video) {
14077
+ mergeObjectWithoutOverwriting(opts.video, videoDefaults);
14078
+ }
14079
+ return opts;
14080
+ }
14081
+ function mergeObjectWithoutOverwriting(mainObject, objectToMerge) {
14082
+ Object.keys(objectToMerge).forEach(key => {
14083
+ if (mainObject[key] === undefined) mainObject[key] = objectToMerge[key];
14084
+ });
14085
+ return mainObject;
14086
+ }
14087
+ function constraintsForOptions(options) {
14088
+ const constraints = {};
14089
+ if (options.video) {
14090
+ // default video options
14091
+ if (typeof options.video === 'object') {
14092
+ const videoOptions = {};
14093
+ const target = videoOptions;
14094
+ const source = options.video;
14095
+ Object.keys(source).forEach(key => {
14096
+ switch (key) {
14097
+ case 'resolution':
14098
+ // flatten VideoResolution fields
14099
+ mergeObjectWithoutOverwriting(target, source.resolution);
14100
+ break;
14101
+ default:
14102
+ target[key] = source[key];
14103
+ }
14104
+ });
14105
+ constraints.video = videoOptions;
14106
+ } else {
14107
+ constraints.video = options.video;
14982
14108
  }
14983
- if (message.rtt !== 0) {
14984
- writer.uint32(16).int64(message.rtt);
14109
+ } else {
14110
+ constraints.video = false;
14111
+ }
14112
+ if (options.audio) {
14113
+ if (typeof options.audio === 'object') {
14114
+ constraints.audio = options.audio;
14115
+ } else {
14116
+ constraints.audio = true;
14985
14117
  }
14986
- return writer;
14987
- },
14988
- decode(input, length) {
14989
- const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
14990
- let end = length === undefined ? reader.len : reader.pos + length;
14991
- const message = createBasePing();
14992
- while (reader.pos < end) {
14993
- const tag = reader.uint32();
14994
- switch (tag >>> 3) {
14995
- case 1:
14996
- if (tag != 8) {
14997
- break;
14998
- }
14999
- message.timestamp = longToNumber(reader.int64());
15000
- continue;
15001
- case 2:
15002
- if (tag != 16) {
15003
- break;
15004
- }
15005
- message.rtt = longToNumber(reader.int64());
15006
- continue;
15007
- }
15008
- if ((tag & 7) == 4 || tag == 0) {
14118
+ } else {
14119
+ constraints.audio = false;
14120
+ }
14121
+ return constraints;
14122
+ }
14123
+ /**
14124
+ * This function detects silence on a given [[Track]] instance.
14125
+ * Returns true if the track seems to be entirely silent.
14126
+ */
14127
+ function detectSilence(track) {
14128
+ let timeOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
14129
+ return __awaiter(this, void 0, void 0, function* () {
14130
+ const ctx = getNewAudioContext();
14131
+ if (ctx) {
14132
+ const analyser = ctx.createAnalyser();
14133
+ analyser.fftSize = 2048;
14134
+ const bufferLength = analyser.frequencyBinCount;
14135
+ const dataArray = new Uint8Array(bufferLength);
14136
+ const source = ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack]));
14137
+ source.connect(analyser);
14138
+ yield sleep(timeOffset);
14139
+ analyser.getByteTimeDomainData(dataArray);
14140
+ const someNoise = dataArray.some(sample => sample !== 128 && sample !== 0);
14141
+ ctx.close();
14142
+ return !someNoise;
14143
+ }
14144
+ return false;
14145
+ });
14146
+ }
14147
+ /**
14148
+ * @internal
14149
+ */
14150
+ function getNewAudioContext() {
14151
+ const AudioContext =
14152
+ // @ts-ignore
14153
+ typeof window !== 'undefined' && (window.AudioContext || window.webkitAudioContext);
14154
+ if (AudioContext) {
14155
+ return new AudioContext({
14156
+ latencyHint: 'interactive'
14157
+ });
14158
+ }
14159
+ }
14160
+
14161
+ const separator = '|';
14162
+ const ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension';
14163
+ function unpackStreamId(packed) {
14164
+ const parts = packed.split(separator);
14165
+ if (parts.length > 1) {
14166
+ return [parts[0], packed.substr(parts[0].length + 1)];
14167
+ }
14168
+ return [packed, ''];
14169
+ }
14170
+ function sleep(duration) {
14171
+ return __awaiter(this, void 0, void 0, function* () {
14172
+ return new Promise(resolve => setTimeout(resolve, duration));
14173
+ });
14174
+ }
14175
+ /** @internal */
14176
+ function supportsTransceiver() {
14177
+ return 'addTransceiver' in RTCPeerConnection.prototype;
14178
+ }
14179
+ /** @internal */
14180
+ function supportsAddTrack() {
14181
+ return 'addTrack' in RTCPeerConnection.prototype;
14182
+ }
14183
+ function supportsAdaptiveStream() {
14184
+ return typeof ResizeObserver !== undefined && typeof IntersectionObserver !== undefined;
14185
+ }
14186
+ function supportsDynacast() {
14187
+ return supportsTransceiver();
14188
+ }
14189
+ function supportsAV1() {
14190
+ if (!('getCapabilities' in RTCRtpSender)) {
14191
+ return false;
14192
+ }
14193
+ const capabilities = RTCRtpSender.getCapabilities('video');
14194
+ let hasAV1 = false;
14195
+ if (capabilities) {
14196
+ for (const codec of capabilities.codecs) {
14197
+ if (codec.mimeType === 'video/AV1') {
14198
+ hasAV1 = true;
15009
14199
  break;
15010
14200
  }
15011
- reader.skipType(tag & 7);
15012
14201
  }
15013
- return message;
15014
- },
15015
- fromJSON(object) {
15016
- return {
15017
- timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0,
15018
- rtt: isSet(object.rtt) ? Number(object.rtt) : 0
15019
- };
15020
- },
15021
- toJSON(message) {
15022
- const obj = {};
15023
- message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
15024
- message.rtt !== undefined && (obj.rtt = Math.round(message.rtt));
15025
- return obj;
15026
- },
15027
- create(base) {
15028
- return Ping.fromPartial(base !== null && base !== void 0 ? base : {});
15029
- },
15030
- fromPartial(object) {
15031
- var _a, _b;
15032
- const message = createBasePing();
15033
- message.timestamp = (_a = object.timestamp) !== null && _a !== void 0 ? _a : 0;
15034
- message.rtt = (_b = object.rtt) !== null && _b !== void 0 ? _b : 0;
15035
- return message;
15036
14202
  }
15037
- };
15038
- function createBasePong() {
15039
- return {
15040
- lastPingTimestamp: 0,
15041
- timestamp: 0
15042
- };
14203
+ return hasAV1;
15043
14204
  }
15044
- const Pong = {
15045
- encode(message) {
15046
- let writer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _m0.Writer.create();
15047
- if (message.lastPingTimestamp !== 0) {
15048
- writer.uint32(8).int64(message.lastPingTimestamp);
15049
- }
15050
- if (message.timestamp !== 0) {
15051
- writer.uint32(16).int64(message.timestamp);
15052
- }
15053
- return writer;
15054
- },
15055
- decode(input, length) {
15056
- const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
15057
- let end = length === undefined ? reader.len : reader.pos + length;
15058
- const message = createBasePong();
15059
- while (reader.pos < end) {
15060
- const tag = reader.uint32();
15061
- switch (tag >>> 3) {
15062
- case 1:
15063
- if (tag != 8) {
15064
- break;
15065
- }
15066
- message.lastPingTimestamp = longToNumber(reader.int64());
15067
- continue;
15068
- case 2:
15069
- if (tag != 16) {
15070
- break;
15071
- }
15072
- message.timestamp = longToNumber(reader.int64());
15073
- continue;
15074
- }
15075
- if ((tag & 7) == 4 || tag == 0) {
14205
+ function supportsVP9() {
14206
+ if (!('getCapabilities' in RTCRtpSender)) {
14207
+ // technically speaking FireFox supports VP9, but SVC publishing is broken
14208
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1633876
14209
+ return false;
14210
+ }
14211
+ const capabilities = RTCRtpSender.getCapabilities('video');
14212
+ let hasVP9 = false;
14213
+ if (capabilities) {
14214
+ for (const codec of capabilities.codecs) {
14215
+ if (codec.mimeType === 'video/VP9') {
14216
+ hasVP9 = true;
15076
14217
  break;
15077
14218
  }
15078
- reader.skipType(tag & 7);
15079
14219
  }
15080
- return message;
15081
- },
15082
- fromJSON(object) {
15083
- return {
15084
- lastPingTimestamp: isSet(object.lastPingTimestamp) ? Number(object.lastPingTimestamp) : 0,
15085
- timestamp: isSet(object.timestamp) ? Number(object.timestamp) : 0
15086
- };
15087
- },
15088
- toJSON(message) {
15089
- const obj = {};
15090
- message.lastPingTimestamp !== undefined && (obj.lastPingTimestamp = Math.round(message.lastPingTimestamp));
15091
- message.timestamp !== undefined && (obj.timestamp = Math.round(message.timestamp));
15092
- return obj;
15093
- },
15094
- create(base) {
15095
- return Pong.fromPartial(base !== null && base !== void 0 ? base : {});
15096
- },
15097
- fromPartial(object) {
15098
- var _a, _b;
15099
- const message = createBasePong();
15100
- message.lastPingTimestamp = (_a = object.lastPingTimestamp) !== null && _a !== void 0 ? _a : 0;
15101
- message.timestamp = (_b = object.timestamp) !== null && _b !== void 0 ? _b : 0;
15102
- return message;
15103
14220
  }
14221
+ return hasVP9;
14222
+ }
14223
+ function isSVCCodec(codec) {
14224
+ return codec === 'av1' || codec === 'vp9';
14225
+ }
14226
+ function supportsSetSinkId(elm) {
14227
+ if (!document) {
14228
+ return false;
14229
+ }
14230
+ if (!elm) {
14231
+ elm = document.createElement('audio');
14232
+ }
14233
+ return 'setSinkId' in elm;
14234
+ }
14235
+ const setCodecPreferencesVersions = {
14236
+ Chrome: '100',
14237
+ Safari: '15',
14238
+ Firefox: '100'
15104
14239
  };
15105
- var tsProtoGlobalThis = (() => {
15106
- if (typeof globalThis !== "undefined") {
15107
- return globalThis;
14240
+ function supportsSetCodecPreferences(transceiver) {
14241
+ if (!isWeb()) {
14242
+ return false;
15108
14243
  }
15109
- if (typeof self !== "undefined") {
15110
- return self;
14244
+ if (!('setCodecPreferences' in transceiver)) {
14245
+ return false;
15111
14246
  }
15112
- if (typeof window !== "undefined") {
15113
- return window;
14247
+ const browser = getBrowser();
14248
+ if (!(browser === null || browser === void 0 ? void 0 : browser.name) || !browser.version) {
14249
+ // version is required
14250
+ return false;
15114
14251
  }
15115
- if (typeof global !== "undefined") {
15116
- return global;
14252
+ const v = setCodecPreferencesVersions[browser.name];
14253
+ if (v) {
14254
+ return compareVersions(browser.version, v) >= 0;
15117
14255
  }
15118
- throw "Unable to locate global object";
15119
- })();
15120
- function longToNumber(long) {
15121
- if (long.gt(Number.MAX_SAFE_INTEGER)) {
15122
- throw new tsProtoGlobalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
14256
+ return false;
14257
+ }
14258
+ function isBrowserSupported() {
14259
+ return supportsTransceiver() || supportsAddTrack();
14260
+ }
14261
+ function isFireFox() {
14262
+ var _a;
14263
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Firefox';
14264
+ }
14265
+ function isChromiumBased() {
14266
+ var _a;
14267
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Chrome';
14268
+ }
14269
+ function isSafari() {
14270
+ var _a;
14271
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Safari';
14272
+ }
14273
+ function isMobile() {
14274
+ if (!isWeb()) return false;
14275
+ return /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent);
14276
+ }
14277
+ function isWeb() {
14278
+ return typeof document !== 'undefined';
14279
+ }
14280
+ function isReactNative() {
14281
+ // navigator.product is deprecated on browsers, but will be set appropriately for react-native.
14282
+ return navigator.product == 'ReactNative';
14283
+ }
14284
+ function isCloud(serverUrl) {
14285
+ return serverUrl.hostname.endsWith('.livekit.cloud');
14286
+ }
14287
+ function getLKReactNativeInfo() {
14288
+ // global defined only for ReactNative.
14289
+ // @ts-ignore
14290
+ if (global && global.LiveKitReactNativeGlobal) {
14291
+ // @ts-ignore
14292
+ return global.LiveKitReactNativeGlobal;
14293
+ }
14294
+ return undefined;
14295
+ }
14296
+ function getReactNativeOs() {
14297
+ if (!isReactNative()) {
14298
+ return undefined;
14299
+ }
14300
+ let info = getLKReactNativeInfo();
14301
+ if (info) {
14302
+ return info.platform;
14303
+ }
14304
+ return undefined;
14305
+ }
14306
+ function getDevicePixelRatio() {
14307
+ if (isWeb()) {
14308
+ return window.devicePixelRatio;
14309
+ }
14310
+ if (isReactNative()) {
14311
+ let info = getLKReactNativeInfo();
14312
+ if (info) {
14313
+ return info.devicePixelRatio;
14314
+ }
14315
+ }
14316
+ return 1;
14317
+ }
14318
+ function compareVersions(v1, v2) {
14319
+ const parts1 = v1.split('.');
14320
+ const parts2 = v2.split('.');
14321
+ const k = Math.min(parts1.length, parts2.length);
14322
+ for (let i = 0; i < k; ++i) {
14323
+ const p1 = parseInt(parts1[i], 10);
14324
+ const p2 = parseInt(parts2[i], 10);
14325
+ if (p1 > p2) return 1;
14326
+ if (p1 < p2) return -1;
14327
+ if (i === k - 1 && p1 === p2) return 0;
14328
+ }
14329
+ if (v1 === '' && v2 !== '') {
14330
+ return -1;
14331
+ } else if (v2 === '') {
14332
+ return 1;
14333
+ }
14334
+ return parts1.length == parts2.length ? 0 : parts1.length < parts2.length ? -1 : 1;
14335
+ }
14336
+ function roDispatchCallback(entries) {
14337
+ for (const entry of entries) {
14338
+ entry.target.handleResize(entry);
14339
+ }
14340
+ }
14341
+ function ioDispatchCallback(entries) {
14342
+ for (const entry of entries) {
14343
+ entry.target.handleVisibilityChanged(entry);
14344
+ }
14345
+ }
14346
+ let resizeObserver = null;
14347
+ const getResizeObserver = () => {
14348
+ if (!resizeObserver) resizeObserver = new ResizeObserver(roDispatchCallback);
14349
+ return resizeObserver;
14350
+ };
14351
+ let intersectionObserver = null;
14352
+ const getIntersectionObserver = () => {
14353
+ if (!intersectionObserver) intersectionObserver = new IntersectionObserver(ioDispatchCallback, {
14354
+ root: document,
14355
+ rootMargin: '0px'
14356
+ });
14357
+ return intersectionObserver;
14358
+ };
14359
+ function getClientInfo() {
14360
+ var _a;
14361
+ const info = ClientInfo.fromPartial({
14362
+ sdk: ClientInfo_SDK.JS,
14363
+ protocol: protocolVersion,
14364
+ version
14365
+ });
14366
+ if (isReactNative()) {
14367
+ info.os = (_a = getReactNativeOs()) !== null && _a !== void 0 ? _a : '';
15123
14368
  }
15124
- return long.toNumber();
15125
- }
15126
- if (_m0.util.Long !== Long$1) {
15127
- _m0.util.Long = Long$1;
15128
- _m0.configure();
15129
- }
15130
- function isSet(value) {
15131
- return value !== null && value !== undefined;
14369
+ return info;
15132
14370
  }
15133
-
15134
- class LivekitError extends Error {
15135
- constructor(code, message) {
15136
- super(message || 'an error has occured');
15137
- this.code = code;
14371
+ let emptyVideoStreamTrack;
14372
+ function getEmptyVideoStreamTrack() {
14373
+ if (!emptyVideoStreamTrack) {
14374
+ emptyVideoStreamTrack = createDummyVideoStreamTrack();
15138
14375
  }
14376
+ return emptyVideoStreamTrack;
15139
14377
  }
15140
- class ConnectionError extends LivekitError {
15141
- constructor(message, reason, status) {
15142
- super(1, message);
15143
- this.status = status;
15144
- this.reason = reason;
14378
+ function createDummyVideoStreamTrack() {
14379
+ let width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
14380
+ let height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16;
14381
+ let enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
14382
+ let paintContent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
14383
+ const canvas = document.createElement('canvas');
14384
+ // the canvas size is set to 16 by default, because electron apps seem to fail with smaller values
14385
+ canvas.width = width;
14386
+ canvas.height = height;
14387
+ const ctx = canvas.getContext('2d');
14388
+ ctx === null || ctx === void 0 ? void 0 : ctx.fillRect(0, 0, canvas.width, canvas.height);
14389
+ if (paintContent && ctx) {
14390
+ ctx.beginPath();
14391
+ ctx.arc(width / 2, height / 2, 50, 0, Math.PI * 2, true);
14392
+ ctx.closePath();
14393
+ ctx.fillStyle = 'grey';
14394
+ ctx.fill();
15145
14395
  }
15146
- }
15147
- class DeviceUnsupportedError extends LivekitError {
15148
- constructor(message) {
15149
- super(21, message !== null && message !== void 0 ? message : 'device is unsupported');
14396
+ // @ts-ignore
14397
+ const dummyStream = canvas.captureStream();
14398
+ const [dummyTrack] = dummyStream.getTracks();
14399
+ if (!dummyTrack) {
14400
+ throw Error('Could not get empty media stream video track');
15150
14401
  }
14402
+ dummyTrack.enabled = enabled;
14403
+ return dummyTrack;
15151
14404
  }
15152
- class TrackInvalidError extends LivekitError {
15153
- constructor(message) {
15154
- super(20, message !== null && message !== void 0 ? message : 'track is invalid');
14405
+ let emptyAudioStreamTrack;
14406
+ function getEmptyAudioStreamTrack() {
14407
+ if (!emptyAudioStreamTrack) {
14408
+ // implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/
14409
+ const ctx = new AudioContext();
14410
+ const oscillator = ctx.createOscillator();
14411
+ const dst = ctx.createMediaStreamDestination();
14412
+ oscillator.connect(dst);
14413
+ oscillator.start();
14414
+ [emptyAudioStreamTrack] = dst.stream.getAudioTracks();
14415
+ if (!emptyAudioStreamTrack) {
14416
+ throw Error('Could not get empty media stream audio track');
14417
+ }
14418
+ emptyAudioStreamTrack.enabled = false;
15155
14419
  }
14420
+ return emptyAudioStreamTrack;
15156
14421
  }
15157
- class UnsupportedServer extends LivekitError {
15158
- constructor(message) {
15159
- super(10, message !== null && message !== void 0 ? message : 'unsupported server');
14422
+ class Future {
14423
+ constructor(futureBase, onFinally) {
14424
+ this.onFinally = onFinally;
14425
+ this.promise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
14426
+ this.resolve = resolve;
14427
+ this.reject = reject;
14428
+ if (futureBase) {
14429
+ yield futureBase(resolve, reject);
14430
+ }
14431
+ })).finally(() => {
14432
+ var _a;
14433
+ return (_a = this.onFinally) === null || _a === void 0 ? void 0 : _a.call(this);
14434
+ });
15160
14435
  }
15161
14436
  }
15162
- class UnexpectedConnectionState extends LivekitError {
15163
- constructor(message) {
15164
- super(12, message !== null && message !== void 0 ? message : 'unexpected connection state');
14437
+ /**
14438
+ * Creates and returns an analyser web audio node that is attached to the provided track.
14439
+ * Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track.
14440
+ * Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper
14441
+ */
14442
+ function createAudioAnalyser(track, options) {
14443
+ const opts = Object.assign({
14444
+ cloneTrack: false,
14445
+ fftSize: 2048,
14446
+ smoothingTimeConstant: 0.8,
14447
+ minDecibels: -100,
14448
+ maxDecibels: -80
14449
+ }, options);
14450
+ const audioContext = getNewAudioContext();
14451
+ if (!audioContext) {
14452
+ throw new Error('Audio Context not supported on this browser');
15165
14453
  }
14454
+ const streamTrack = opts.cloneTrack ? track.mediaStreamTrack.clone() : track.mediaStreamTrack;
14455
+ const mediaStreamSource = audioContext.createMediaStreamSource(new MediaStream([streamTrack]));
14456
+ const analyser = audioContext.createAnalyser();
14457
+ analyser.minDecibels = opts.minDecibels;
14458
+ analyser.maxDecibels = opts.maxDecibels;
14459
+ analyser.fftSize = opts.fftSize;
14460
+ analyser.smoothingTimeConstant = opts.smoothingTimeConstant;
14461
+ mediaStreamSource.connect(analyser);
14462
+ const dataArray = new Uint8Array(analyser.frequencyBinCount);
14463
+ /**
14464
+ * Calculates the current volume of the track in the range from 0 to 1
14465
+ */
14466
+ const calculateVolume = () => {
14467
+ analyser.getByteFrequencyData(dataArray);
14468
+ let sum = 0;
14469
+ for (const amplitude of dataArray) {
14470
+ sum += Math.pow(amplitude / 255, 2);
14471
+ }
14472
+ const volume = Math.sqrt(sum / dataArray.length);
14473
+ return volume;
14474
+ };
14475
+ const cleanup = () => {
14476
+ audioContext.close();
14477
+ if (opts.cloneTrack) {
14478
+ streamTrack.stop();
14479
+ }
14480
+ };
14481
+ return {
14482
+ calculateVolume,
14483
+ analyser,
14484
+ cleanup
14485
+ };
15166
14486
  }
15167
- class NegotiationError extends LivekitError {
15168
- constructor(message) {
15169
- super(13, message !== null && message !== void 0 ? message : 'unable to negotiate');
14487
+ class Mutex {
14488
+ constructor() {
14489
+ this._locking = Promise.resolve();
14490
+ this._locks = 0;
15170
14491
  }
15171
- }
15172
- class PublishDataError extends LivekitError {
15173
- constructor(message) {
15174
- super(13, message !== null && message !== void 0 ? message : 'unable to publish data');
14492
+ isLocked() {
14493
+ return this._locks > 0;
14494
+ }
14495
+ lock() {
14496
+ this._locks += 1;
14497
+ let unlockNext;
14498
+ const willLock = new Promise(resolve => unlockNext = () => {
14499
+ this._locks -= 1;
14500
+ resolve();
14501
+ });
14502
+ const willUnlock = this._locking.then(() => unlockNext);
14503
+ this._locking = this._locking.then(() => willLock);
14504
+ return willUnlock;
15175
14505
  }
15176
14506
  }
15177
- var MediaDeviceFailure;
15178
- (function (MediaDeviceFailure) {
15179
- // user rejected permissions
15180
- MediaDeviceFailure["PermissionDenied"] = "PermissionDenied";
15181
- // device is not available
15182
- MediaDeviceFailure["NotFound"] = "NotFound";
15183
- // device is in use. On Windows, only a single tab may get access to a device at a time.
15184
- MediaDeviceFailure["DeviceInUse"] = "DeviceInUse";
15185
- MediaDeviceFailure["Other"] = "Other";
15186
- })(MediaDeviceFailure || (MediaDeviceFailure = {}));
15187
- (function (MediaDeviceFailure) {
15188
- function getFailure(error) {
15189
- if (error && 'name' in error) {
15190
- if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {
15191
- return MediaDeviceFailure.NotFound;
15192
- }
15193
- if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {
15194
- return MediaDeviceFailure.PermissionDenied;
15195
- }
15196
- if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {
15197
- return MediaDeviceFailure.DeviceInUse;
14507
+
14508
+ var QueueTaskStatus;
14509
+ (function (QueueTaskStatus) {
14510
+ QueueTaskStatus[QueueTaskStatus["WAITING"] = 0] = "WAITING";
14511
+ QueueTaskStatus[QueueTaskStatus["RUNNING"] = 1] = "RUNNING";
14512
+ QueueTaskStatus[QueueTaskStatus["COMPLETED"] = 2] = "COMPLETED";
14513
+ })(QueueTaskStatus || (QueueTaskStatus = {}));
14514
+ class AsyncQueue {
14515
+ constructor() {
14516
+ this.pendingTasks = new Map();
14517
+ this.taskMutex = new Mutex();
14518
+ this.nextTaskIndex = 0;
14519
+ }
14520
+ run(task) {
14521
+ return __awaiter(this, void 0, void 0, function* () {
14522
+ const taskInfo = {
14523
+ id: this.nextTaskIndex++,
14524
+ enqueuedAt: Date.now(),
14525
+ status: QueueTaskStatus.WAITING
14526
+ };
14527
+ this.pendingTasks.set(taskInfo.id, taskInfo);
14528
+ const unlock = yield this.taskMutex.lock();
14529
+ try {
14530
+ taskInfo.executedAt = Date.now();
14531
+ taskInfo.status = QueueTaskStatus.RUNNING;
14532
+ return yield task();
14533
+ } finally {
14534
+ taskInfo.status = QueueTaskStatus.COMPLETED;
14535
+ this.pendingTasks.delete(taskInfo.id);
14536
+ unlock();
15198
14537
  }
15199
- return MediaDeviceFailure.Other;
15200
- }
14538
+ });
15201
14539
  }
15202
- MediaDeviceFailure.getFailure = getFailure;
15203
- })(MediaDeviceFailure || (MediaDeviceFailure = {}));
15204
-
15205
- /**
15206
- * Timers that can be overridden with platform specific implementations
15207
- * that ensure that they are fired. These should be used when it is critical
15208
- * that the timer fires on time.
15209
- */
15210
- class CriticalTimers {}
15211
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
15212
- CriticalTimers.setTimeout = function () {
15213
- return setTimeout(...arguments);
15214
- };
15215
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
15216
- CriticalTimers.setInterval = function () {
15217
- return setInterval(...arguments);
15218
- };
15219
- CriticalTimers.clearTimeout = function () {
15220
- return clearTimeout(...arguments);
15221
- };
15222
- CriticalTimers.clearInterval = function () {
15223
- return clearInterval(...arguments);
15224
- };
14540
+ flush() {
14541
+ return __awaiter(this, void 0, void 0, function* () {
14542
+ return this.run(() => __awaiter(this, void 0, void 0, function* () {}));
14543
+ });
14544
+ }
14545
+ snapshot() {
14546
+ return Array.from(this.pendingTasks.values());
14547
+ }
14548
+ }
15225
14549
 
15226
14550
  const passThroughQueueSignals = ['syncState', 'trickle', 'offer', 'answer', 'simulate', 'leave'];
15227
14551
  function canPassThroughQueue(req) {
@@ -23418,7 +22742,10 @@ class Room extends eventsExports.EventEmitter {
23418
22742
  livekitLogger.warn('detected connection state mismatch', {
23419
22743
  numFailures: consecutiveFailures
23420
22744
  });
23421
- if (consecutiveFailures >= 3) this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, DisconnectReason.UNKNOWN_REASON);
22745
+ if (consecutiveFailures >= 3) {
22746
+ this.recreateEngine();
22747
+ this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, DisconnectReason.STATE_MISMATCH);
22748
+ }
23422
22749
  } else {
23423
22750
  consecutiveFailures = 0;
23424
22751
  }