livekit-client 1.9.3 → 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 (38) hide show
  1. package/README.md +2 -0
  2. package/dist/livekit-client.esm.mjs +125 -908
  3. package/dist/livekit-client.esm.mjs.map +1 -1
  4. package/dist/livekit-client.umd.js +1 -1
  5. package/dist/livekit-client.umd.js.map +1 -1
  6. package/dist/src/api/SignalClient.d.ts +2 -3
  7. package/dist/src/api/SignalClient.d.ts.map +1 -1
  8. package/dist/src/room/PCTransport.d.ts +1 -2
  9. package/dist/src/room/PCTransport.d.ts.map +1 -1
  10. package/dist/src/room/Room.d.ts +1 -0
  11. package/dist/src/room/Room.d.ts.map +1 -1
  12. package/dist/src/room/participant/LocalParticipant.d.ts +0 -1
  13. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  14. package/dist/src/room/timers.d.ts +4 -5
  15. package/dist/src/room/timers.d.ts.map +1 -1
  16. package/dist/src/room/utils.d.ts.map +1 -1
  17. package/dist/src/utils/AsyncQueue.d.ts +23 -0
  18. package/dist/src/utils/AsyncQueue.d.ts.map +1 -0
  19. package/dist/src/utils/browserParser.d.ts +10 -0
  20. package/dist/src/utils/browserParser.d.ts.map +1 -0
  21. package/dist/ts4.2/src/api/SignalClient.d.ts +2 -3
  22. package/dist/ts4.2/src/room/PCTransport.d.ts +1 -2
  23. package/dist/ts4.2/src/room/Room.d.ts +1 -0
  24. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +0 -1
  25. package/dist/ts4.2/src/room/timers.d.ts +4 -5
  26. package/dist/ts4.2/src/utils/AsyncQueue.d.ts +23 -0
  27. package/dist/ts4.2/src/utils/browserParser.d.ts +10 -0
  28. package/package.json +11 -22
  29. package/src/api/SignalClient.ts +4 -5
  30. package/src/connectionHelper/ConnectionCheck.ts +1 -1
  31. package/src/room/PCTransport.ts +1 -1
  32. package/src/room/Room.ts +5 -2
  33. package/src/room/participant/LocalParticipant.ts +0 -1
  34. package/src/room/utils.ts +17 -16
  35. package/src/utils/AsyncQueue.test.ts +99 -0
  36. package/src/utils/AsyncQueue.ts +57 -0
  37. package/src/utils/browserParser.test.ts +58 -0
  38. package/src/utils/browserParser.ts +72 -0
@@ -6978,158 +6978,6 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
6978
6978
  }
6979
6979
  }
6980
6980
  var eventsExports = events.exports;
6981
- var EventEmitter$1 = /*@__PURE__*/getDefaultExportFromCjs(eventsExports);
6982
-
6983
- class Queue {
6984
- /**
6985
- * @class Queue
6986
- *
6987
- * Priority queue with rate limiting<br>
6988
- * See the medium article:<br>
6989
- * https://mmomtchev.medium.com/parallelizing-download-loops-in-js-with-async-await-queue-670420880cd6
6990
- *
6991
- * @param {number} [_maxConcurrent=1] Number of tasks allowed to run simultaneously
6992
- * @param {number} [_minCycle=0] Minimum number of milliseconds between two consecutive tasks
6993
- */
6994
- constructor(_maxConcurrent, _minCycle) {
6995
- this.maxConcurrent = _maxConcurrent || 1;
6996
- this.minCycle = _minCycle || 0;
6997
- this.queueRunning = [];
6998
- this.queueWaiting = {};
6999
- this.lastRun = 0;
7000
- }
7001
-
7002
- /** @private */
7003
- dequeue(hash) {
7004
- const q = this.queueRunning;
7005
- const idx = q.findIndex(x => x.hash === hash);
7006
- if (idx == -1) throw 'queue desync';
7007
- const o = q[idx];
7008
- q.splice(idx, 1);
7009
- return o;
7010
- }
7011
-
7012
- /** @private */
7013
- getFirstWaiting() {
7014
- for (let p of Object.keys(this.queueWaiting).sort((a, b) => a - b)) if (this.queueWaiting[p] !== undefined && this.queueWaiting[p].length > 0) return this.queueWaiting[p];
7015
- return undefined;
7016
- }
7017
-
7018
- /**
7019
- * Signal that the task `hash` has finished.<br>
7020
- * Frees its slot in the queue
7021
- *
7022
- * @method end
7023
- * @param {any} hash Unique hash identifying the task, Symbol() works very well
7024
- */
7025
- end(hash) {
7026
- const me = this.dequeue(hash);
7027
- me.resolve();
7028
- /* Choose the next task to run and unblock its promise */
7029
- const q = this.getFirstWaiting();
7030
- if (q !== undefined) {
7031
- const next = q.shift();
7032
- next.resolve();
7033
- }
7034
- }
7035
-
7036
- /**
7037
- * Wait for a slot in the queue
7038
- *
7039
- * @method wait
7040
- * @param {any} hash Unique hash identifying the task
7041
- * @param {number} [priority=0] Optional priority, -1 is higher priority than 1
7042
- * @return {Promise<void>} Resolved when the task is ready to run
7043
- */
7044
- async wait(hash, _priority) {
7045
- const priority = _priority === undefined ? 0 : _priority;
7046
- /* Us on the queue */
7047
- let me = {
7048
- hash,
7049
- priority
7050
- };
7051
- /* Create priorities on the fly */
7052
- if (this.queueWaiting[priority] == undefined) this.queueWaiting[priority] = [];
7053
-
7054
- /* Are we allowed to run? */
7055
- if (this.queueRunning.length >= this.maxConcurrent) {
7056
- /* This promise will be unlocked from the outside */
7057
- /* and it cannot reject */
7058
- me.promise = new Promise(resolve => {
7059
- me.resolve = resolve;
7060
- });
7061
- /* Get in the line */
7062
- this.queueWaiting[priority].push(me);
7063
- await me.promise;
7064
- }
7065
- this.queueRunning.push(me);
7066
- me.promise = new Promise(resolve => {
7067
- me.resolve = resolve;
7068
- });
7069
- /* Wait if it is too soon */
7070
- while (Date.now() - this.lastRun < this.minCycle) {
7071
- await new Promise(resolve => setTimeout(resolve, this.minCycle - Date.now() + this.lastRun));
7072
- }
7073
- this.lastRun = Date.now();
7074
- }
7075
-
7076
- /**
7077
- * Run a job (equivalent to calling Queue.wait(), fn() and then Queue.end())<br>
7078
- * fn can be both synchronous or asynchronous function
7079
- *
7080
- * @method run
7081
- * @param {Function} fn The job
7082
- * @param {number} [priority=0] Optional priority, -1 is higher priority than 1
7083
- * @return {Promise<any>} Resolved when the task has finished with the return value of fn
7084
- */
7085
- run(job, _priority) {
7086
- const priority = _priority === undefined ? 0 : _priority;
7087
- const id = Symbol();
7088
- return this.wait(id, priority).then(() => job()).finally(() => {
7089
- this.end(id);
7090
- });
7091
- }
7092
-
7093
- /**
7094
- * @interface QueueStats {running: number, waiting: number, last: number}
7095
- */
7096
-
7097
- /**
7098
- * Return the number of running and waiting jobs
7099
- *
7100
- * @method stat
7101
- * @return {QueueStats} running, waiting, last
7102
- */
7103
- stat() {
7104
- return {
7105
- running: this.queueRunning.length,
7106
- waiting: Object.keys(this.queueWaiting).reduce((t, x) => t += this.queueWaiting[x].length, 0),
7107
- last: this.lastRun
7108
- };
7109
- }
7110
-
7111
- /**
7112
- * Returns a promise that resolves when the queue is empty
7113
- *
7114
- * @method flush
7115
- * @return {Promise<void>}
7116
- */
7117
- async flush() {
7118
- /* Aways wait on the lowest priority in the queue */
7119
- while (this.stat().waiting > 0) {
7120
- for (let p of Object.keys(this.queueWaiting).sort((a, b) => b - a)) {
7121
- const qp = this.queueWaiting[p];
7122
- if (qp !== undefined && qp.length > 0) {
7123
- await qp[qp.length - 1].promise;
7124
- }
7125
- }
7126
- }
7127
- /* And then finish on the running queue */
7128
- while (this.queueRunning.length > 0) {
7129
- await Promise.allSettled(this.queueRunning.map(x => x.promise));
7130
- }
7131
- }
7132
- }
7133
6981
 
7134
6982
  /*
7135
6983
  * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
@@ -14153,745 +14001,66 @@ CriticalTimers.clearInterval = function () {
14153
14001
  return clearInterval(...arguments);
14154
14002
  };
14155
14003
 
14156
- var uaParser = {exports: {}};
14157
-
14158
- (function (module, exports) {
14159
- /////////////////////////////////////////////////////////////////////////////////
14160
- /* UAParser.js v1.0.35
14161
- Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
14162
- MIT License */ /*
14163
- Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
14164
- Supports browser & node.js environment.
14165
- Demo : https://faisalman.github.io/ua-parser-js
14166
- Source : https://github.com/faisalman/ua-parser-js */
14167
- /////////////////////////////////////////////////////////////////////////////////
14168
-
14169
- (function (window, undefined$1) {
14170
-
14171
- //////////////
14172
- // Constants
14173
- /////////////
14174
- var LIBVERSION = '1.0.35',
14175
- EMPTY = '',
14176
- UNKNOWN = '?',
14177
- FUNC_TYPE = 'function',
14178
- UNDEF_TYPE = 'undefined',
14179
- OBJ_TYPE = 'object',
14180
- STR_TYPE = 'string',
14181
- MAJOR = 'major',
14182
- MODEL = 'model',
14183
- NAME = 'name',
14184
- TYPE = 'type',
14185
- VENDOR = 'vendor',
14186
- VERSION = 'version',
14187
- ARCHITECTURE = 'architecture',
14188
- CONSOLE = 'console',
14189
- MOBILE = 'mobile',
14190
- TABLET = 'tablet',
14191
- SMARTTV = 'smarttv',
14192
- WEARABLE = 'wearable',
14193
- EMBEDDED = 'embedded',
14194
- UA_MAX_LENGTH = 350;
14195
- var AMAZON = 'Amazon',
14196
- APPLE = 'Apple',
14197
- ASUS = 'ASUS',
14198
- BLACKBERRY = 'BlackBerry',
14199
- BROWSER = 'Browser',
14200
- CHROME = 'Chrome',
14201
- EDGE = 'Edge',
14202
- FIREFOX = 'Firefox',
14203
- GOOGLE = 'Google',
14204
- HUAWEI = 'Huawei',
14205
- LG = 'LG',
14206
- MICROSOFT = 'Microsoft',
14207
- MOTOROLA = 'Motorola',
14208
- OPERA = 'Opera',
14209
- SAMSUNG = 'Samsung',
14210
- SHARP = 'Sharp',
14211
- SONY = 'Sony',
14212
- XIAOMI = 'Xiaomi',
14213
- ZEBRA = 'Zebra',
14214
- FACEBOOK = 'Facebook',
14215
- CHROMIUM_OS = 'Chromium OS',
14216
- MAC_OS = 'Mac OS';
14217
-
14218
- ///////////
14219
- // Helper
14220
- //////////
14221
-
14222
- var extend = function (regexes, extensions) {
14223
- var mergedRegexes = {};
14224
- for (var i in regexes) {
14225
- if (extensions[i] && extensions[i].length % 2 === 0) {
14226
- mergedRegexes[i] = extensions[i].concat(regexes[i]);
14227
- } else {
14228
- mergedRegexes[i] = regexes[i];
14229
- }
14230
- }
14231
- return mergedRegexes;
14232
- },
14233
- enumerize = function (arr) {
14234
- var enums = {};
14235
- for (var i = 0; i < arr.length; i++) {
14236
- enums[arr[i].toUpperCase()] = arr[i];
14237
- }
14238
- return enums;
14239
- },
14240
- has = function (str1, str2) {
14241
- return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
14242
- },
14243
- lowerize = function (str) {
14244
- return str.toLowerCase();
14245
- },
14246
- majorize = function (version) {
14247
- return typeof version === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined$1;
14248
- },
14249
- trim = function (str, len) {
14250
- if (typeof str === STR_TYPE) {
14251
- str = str.replace(/^\s\s*/, EMPTY);
14252
- return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
14253
- }
14254
- };
14255
-
14256
- ///////////////
14257
- // Map helper
14258
- //////////////
14259
-
14260
- var rgxMapper = function (ua, arrays) {
14261
- var i = 0,
14262
- j,
14263
- k,
14264
- p,
14265
- q,
14266
- matches,
14267
- match;
14268
-
14269
- // loop through all regexes maps
14270
- while (i < arrays.length && !matches) {
14271
- var regex = arrays[i],
14272
- // even sequence (0,2,4,..)
14273
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
14274
- j = k = 0;
14275
-
14276
- // try matching uastring with regexes
14277
- while (j < regex.length && !matches) {
14278
- if (!regex[j]) {
14279
- break;
14280
- }
14281
- matches = regex[j++].exec(ua);
14282
- if (!!matches) {
14283
- for (p = 0; p < props.length; p++) {
14284
- match = matches[++k];
14285
- q = props[p];
14286
- // check if given property is actually array
14287
- if (typeof q === OBJ_TYPE && q.length > 0) {
14288
- if (q.length === 2) {
14289
- if (typeof q[1] == FUNC_TYPE) {
14290
- // assign modified match
14291
- this[q[0]] = q[1].call(this, match);
14292
- } else {
14293
- // assign given value, ignore regex match
14294
- this[q[0]] = q[1];
14295
- }
14296
- } else if (q.length === 3) {
14297
- // check whether function or regex
14298
- if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
14299
- // call function (usually string mapper)
14300
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined$1;
14301
- } else {
14302
- // sanitize match using given regex
14303
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined$1;
14304
- }
14305
- } else if (q.length === 4) {
14306
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined$1;
14307
- }
14308
- } else {
14309
- this[q] = match ? match : undefined$1;
14310
- }
14311
- }
14312
- }
14313
- }
14314
- i += 2;
14315
- }
14316
- },
14317
- strMapper = function (str, map) {
14318
- for (var i in map) {
14319
- // check if current value is array
14320
- if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
14321
- for (var j = 0; j < map[i].length; j++) {
14322
- if (has(map[i][j], str)) {
14323
- return i === UNKNOWN ? undefined$1 : i;
14324
- }
14325
- }
14326
- } else if (has(map[i], str)) {
14327
- return i === UNKNOWN ? undefined$1 : i;
14328
- }
14329
- }
14330
- return str;
14331
- };
14332
-
14333
- ///////////////
14334
- // String map
14335
- //////////////
14336
-
14337
- // Safari < 3.0
14338
- var oldSafariMap = {
14339
- '1.0': '/8',
14340
- '1.2': '/1',
14341
- '1.3': '/3',
14342
- '2.0': '/412',
14343
- '2.0.2': '/416',
14344
- '2.0.3': '/417',
14345
- '2.0.4': '/419',
14346
- '?': '/'
14347
- },
14348
- windowsVersionMap = {
14349
- 'ME': '4.90',
14350
- 'NT 3.11': 'NT3.51',
14351
- 'NT 4.0': 'NT4.0',
14352
- '2000': 'NT 5.0',
14353
- 'XP': ['NT 5.1', 'NT 5.2'],
14354
- 'Vista': 'NT 6.0',
14355
- '7': 'NT 6.1',
14356
- '8': 'NT 6.2',
14357
- '8.1': 'NT 6.3',
14358
- '10': ['NT 6.4', 'NT 10.0'],
14359
- 'RT': 'ARM'
14360
- };
14361
-
14362
- //////////////
14363
- // Regex map
14364
- /////////////
14365
-
14366
- var regexes = {
14367
- browser: [[/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
14368
- ], [VERSION, [NAME, 'Chrome']], [/edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
14369
- ], [VERSION, [NAME, 'Edge']], [
14370
- // Presto based
14371
- /(opera mini)\/([-\w\.]+)/i,
14372
- // Opera Mini
14373
- /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
14374
- // Opera Mobi/Tablet
14375
- /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
14376
- ], [NAME, VERSION], [/opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
14377
- ], [VERSION, [NAME, OPERA + ' Mini']], [/\bopr\/([\w\.]+)/i // Opera Webkit
14378
- ], [VERSION, [NAME, OPERA]], [
14379
- // Mixed
14380
- /(kindle)\/([\w\.]+)/i,
14381
- // Kindle
14382
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,
14383
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
14384
- // Trident based
14385
- /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,
14386
- // Avant/IEMobile/SlimBrowser
14387
- /(ba?idubrowser)[\/ ]?([\w\.]+)/i,
14388
- // Baidu Browser
14389
- /(?:ms|\()(ie) ([\w\.]+)/i,
14390
- // Internet Explorer
14391
-
14392
- // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
14393
- /(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,
14394
- // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
14395
- /(heytap|ovi)browser\/([\d\.]+)/i,
14396
- // Heytap/Ovi
14397
- /(weibo)__([\d\.]+)/i // Weibo
14398
- ], [NAME, VERSION], [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
14399
- ], [VERSION, [NAME, 'UC' + BROWSER]], [/microm.+\bqbcore\/([\w\.]+)/i,
14400
- // WeChat Desktop for Windows Built-in Browser
14401
- /\bqbcore\/([\w\.]+).+microm/i], [VERSION, [NAME, 'WeChat(Win) Desktop']], [/micromessenger\/([\w\.]+)/i // WeChat
14402
- ], [VERSION, [NAME, 'WeChat']], [/konqueror\/([\w\.]+)/i // Konqueror
14403
- ], [VERSION, [NAME, 'Konqueror']], [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
14404
- ], [VERSION, [NAME, 'IE']], [/ya(?:search)?browser\/([\w\.]+)/i // Yandex
14405
- ], [VERSION, [NAME, 'Yandex']], [/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
14406
- ], [[NAME, /(.+)/, '$1 Secure ' + BROWSER], VERSION], [/\bfocus\/([\w\.]+)/i // Firefox Focus
14407
- ], [VERSION, [NAME, FIREFOX + ' Focus']], [/\bopt\/([\w\.]+)/i // Opera Touch
14408
- ], [VERSION, [NAME, OPERA + ' Touch']], [/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
14409
- ], [VERSION, [NAME, 'Coc Coc']], [/dolfin\/([\w\.]+)/i // Dolphin
14410
- ], [VERSION, [NAME, 'Dolphin']], [/coast\/([\w\.]+)/i // Opera Coast
14411
- ], [VERSION, [NAME, OPERA + ' Coast']], [/miuibrowser\/([\w\.]+)/i // MIUI Browser
14412
- ], [VERSION, [NAME, 'MIUI ' + BROWSER]], [/fxios\/([-\w\.]+)/i // Firefox for iOS
14413
- ], [VERSION, [NAME, FIREFOX]], [/\bqihu|(qi?ho?o?|360)browser/i // 360
14414
- ], [[NAME, '360 ' + BROWSER]], [/(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [
14415
- // Oculus/Samsung/Sailfish/Huawei Browser
14416
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
14417
- ], [[NAME, /_/g, ' '], VERSION], [/(electron)\/([\w\.]+) safari/i,
14418
- // Electron-based App
14419
- /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
14420
- // Tesla
14421
- /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
14422
- ], [NAME, VERSION], [/(metasr)[\/ ]?([\w\.]+)/i,
14423
- // SouGouBrowser
14424
- /(lbbrowser)/i,
14425
- // LieBao Browser
14426
- /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
14427
- ], [NAME], [
14428
- // WebView
14429
- /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
14430
- ], [[NAME, FACEBOOK], VERSION], [/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
14431
- // Kakao App
14432
- /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
14433
- // Naver InApp
14434
- /safari (line)\/([\w\.]+)/i,
14435
- // Line App for iOS
14436
- /\b(line)\/([\w\.]+)\/iab/i,
14437
- // Line App for Android
14438
- /(chromium|instagram)[\/ ]([-\w\.]+)/i // Chromium/Instagram
14439
- ], [NAME, VERSION], [/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
14440
- ], [VERSION, [NAME, 'GSA']], [/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
14441
- ], [VERSION, [NAME, 'TikTok']], [/headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
14442
- ], [VERSION, [NAME, CHROME + ' Headless']], [/ wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
14443
- ], [[NAME, CHROME + ' WebView'], VERSION], [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
14444
- ], [VERSION, [NAME, 'Android ' + BROWSER]], [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
14445
- ], [NAME, VERSION], [/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
14446
- ], [VERSION, [NAME, 'Mobile Safari']], [/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
14447
- ], [VERSION, NAME], [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
14448
- ], [NAME, [VERSION, strMapper, oldSafariMap]], [/(webkit|khtml)\/([\w\.]+)/i], [NAME, VERSION], [
14449
- // Gecko based
14450
- /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
14451
- ], [[NAME, 'Netscape'], VERSION], [/mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
14452
- ], [VERSION, [NAME, FIREFOX + ' Reality']], [/ekiohf.+(flow)\/([\w\.]+)/i,
14453
- // Flow
14454
- /(swiftfox)/i,
14455
- // Swiftfox
14456
- /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
14457
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
14458
- /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
14459
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
14460
- /(firefox)\/([\w\.]+)/i,
14461
- // Other Firefox-based
14462
- /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,
14463
- // Mozilla
14464
-
14465
- // Other
14466
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
14467
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
14468
- /(links) \(([\w\.]+)/i,
14469
- // Links
14470
- /panasonic;(viera)/i // Panasonic Viera
14471
- ], [NAME, VERSION], [/(cobalt)\/([\w\.]+)/i // Cobalt
14472
- ], [NAME, [VERSION, /master.|lts./, ""]]],
14473
- cpu: [[/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
14474
- ], [[ARCHITECTURE, 'amd64']], [/(ia32(?=;))/i // IA32 (quicktime)
14475
- ], [[ARCHITECTURE, lowerize]], [/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
14476
- ], [[ARCHITECTURE, 'ia32']], [/\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
14477
- ], [[ARCHITECTURE, 'arm64']], [/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
14478
- ], [[ARCHITECTURE, 'armhf']], [
14479
- // PocketPC mistakenly identified as PowerPC
14480
- /windows (ce|mobile); ppc;/i], [[ARCHITECTURE, 'arm']], [/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
14481
- ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [/(sun4\w)[;\)]/i // SPARC
14482
- ], [[ARCHITECTURE, 'sparc']], [/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
14483
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
14484
- ], [[ARCHITECTURE, lowerize]]],
14485
- device: [[
14486
- //////////////////////////
14487
- // MOBILES & TABLETS
14488
- /////////////////////////
14489
-
14490
- // Samsung
14491
- /\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]], [
14492
- // Apple
14493
- /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
14494
- ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [/\((ipad);[-\w\),; ]+apple/i,
14495
- // iPad
14496
- /applecoremedia\/[\w\.]+ \((ipad)/i, /\b(ipad)\d\d?,\d\d?[;\]].+ios/i], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [/(macintosh);/i], [MODEL, [VENDOR, APPLE]], [
14497
- // Sharp
14498
- /\b(sh-?[altvz]?\d\d[a-ekm]?)/i], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
14499
- // Huawei
14500
- /\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]], [
14501
- // Xiaomi
14502
- /\b(poco[\w ]+)(?: bui|\))/i,
14503
- // Xiaomi POCO
14504
- /\b; (\w+) build\/hm\1/i,
14505
- // Xiaomi Hongmi 'numeric' models
14506
- /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
14507
- // Xiaomi Hongmi
14508
- /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
14509
- // Xiaomi Redmi
14510
- /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
14511
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
14512
- ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
14513
- // OPPO
14514
- /; (\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]], [
14515
- // Vivo
14516
- /vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
14517
- // Realme
14518
- /\b(rmx[12]\d{3})(?: bui|;|\))/i], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
14519
- // Motorola
14520
- /\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]], [
14521
- // LG
14522
- /((?=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]], [
14523
- // Lenovo
14524
- /(ideatab[-\w ]+)/i, /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
14525
- // Nokia
14526
- /(?:maemo|nokia).*(n900|lumia \d+)/i, /nokia[-_ ]?([-\w\.]*)/i], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
14527
- // Google
14528
- /(pixel c)\b/i // Google Pixel C
14529
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
14530
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
14531
- // Sony
14532
- /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]], [
14533
- // OnePlus
14534
- / (kb2005|in20[12]5|be20[12][59])\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
14535
- // Amazon
14536
- /(alexa)webm/i, /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,
14537
- // Kindle Fire without Silk / Echo Show
14538
- /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
14539
- ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
14540
- ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
14541
- // BlackBerry
14542
- /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
14543
- ], [MODEL, VENDOR, [TYPE, TABLET]], [/\b((?:bb[a-f]|st[hv])100-\d)/i, /\(bb10; (\w+)/i // BlackBerry 10
14544
- ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
14545
- // Asus
14546
- /(?:\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]], [
14547
- // HTC
14548
- /(nexus 9)/i // HTC Nexus 9
14549
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
14550
- // HTC
14551
-
14552
- // ZTE
14553
- /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i, /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
14554
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
14555
- // Acer
14556
- /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
14557
- // Meizu
14558
- /droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
14559
- // MIXED
14560
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
14561
- // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
14562
- /(hp) ([\w ]+\w)/i,
14563
- // HP iPAQ
14564
- /(asus)-?(\w+)/i,
14565
- // Asus
14566
- /(microsoft); (lumia[\w ]+)/i,
14567
- // Microsoft Lumia
14568
- /(lenovo)[-_ ]?([-\w]+)/i,
14569
- // Lenovo
14570
- /(jolla)/i,
14571
- // Jolla
14572
- /(oppo) ?([\w ]+) bui/i // OPPO
14573
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kobo)\s(ereader|touch)/i,
14574
- // Kobo
14575
- /(archos) (gamepad2?)/i,
14576
- // Archos
14577
- /(hp).+(touchpad(?!.+tablet)|tablet)/i,
14578
- // HP TouchPad
14579
- /(kindle)\/([\w\.]+)/i,
14580
- // Kindle
14581
- /(nook)[\w ]+build\/(\w+)/i,
14582
- // Nook
14583
- /(dell) (strea[kpr\d ]*[\dko])/i,
14584
- // Dell Streak
14585
- /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
14586
- // Le Pan Tablets
14587
- /(trinity)[- ]*(t\d{3}) bui/i,
14588
- // Trinity Tablets
14589
- /(gigaset)[- ]+(q\w{1,9}) bui/i,
14590
- // Gigaset Tablets
14591
- /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
14592
- ], [VENDOR, MODEL, [TYPE, TABLET]], [/(surface duo)/i // Surface Duo
14593
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [/droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
14594
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [/(u304aa)/i // AT&T
14595
- ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [/\bsie-(\w*)/i // Siemens
14596
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [/\b(rct\w+) b/i // RCA Tablets
14597
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
14598
- ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
14599
- ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
14600
- ], [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
14601
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [/\b(nx\d{3}j) b/i // ZTE Nubia
14602
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
14603
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [/\b(zur\d{3}) b/i // Swiss ZUR Tablet
14604
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [/\b((zeki)?tb.*\b) b/i // Zeki Tablets
14605
- ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [/\b([yr]\d{2}) b/i, /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
14606
- ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [/\b(ns-?\w{0,9}) b/i // Insignia Tablets
14607
- ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
14608
- ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
14609
- ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
14610
- ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [/\b(ph-1) /i // Essential PH-1
14611
- ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
14612
- ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
14613
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [/\btu_(1491) b/i // Rotor Tablets
14614
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [/(shield[\w ]+) b/i // Nvidia Shield Tablets
14615
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [/(sprint) (\w+)/i // Sprint Phones
14616
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [/(kin\.[onetw]{3})/i // Microsoft Kin
14617
- ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
14618
- ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
14619
- ///////////////////
14620
- // SMARTTVS
14621
- ///////////////////
14622
-
14623
- /smart-tv.+(samsung)/i // Samsung
14624
- ], [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
14625
- ], [[VENDOR, LG], [TYPE, SMARTTV]], [/(apple) ?tv/i // Apple TV
14626
- ], [VENDOR, [MODEL, APPLE + ' TV'], [TYPE, SMARTTV]], [/crkey/i // Google Chromecast
14627
- ], [[MODEL, CHROME + 'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [/droid.+aft(\w)( bui|\))/i // Fire TV
14628
- ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [/\(dtv[\);].+(aquos)/i, /(aquos-tv[\w ]+)\)/i // Sharp
14629
- ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]], [/(bravia[\w ]+)( bui|\))/i // Sony
14630
- ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [/(mitv-\w{5}) bui/i // Xiaomi
14631
- ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [/Hbbtv.*(technisat) (.*);/i // TechniSAT
14632
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
14633
- // Roku
14634
- /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
14635
- ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
14636
- ], [[TYPE, SMARTTV]], [
14637
- ///////////////////
14638
- // CONSOLES
14639
- ///////////////////
14640
-
14641
- /(ouya)/i,
14642
- // Ouya
14643
- /(nintendo) ([wids3utch]+)/i // Nintendo
14644
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [/droid.+; (shield) bui/i // Nvidia
14645
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [/(playstation [345portablevi]+)/i // Playstation
14646
- ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [/\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
14647
- ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
14648
- ///////////////////
14649
- // WEARABLES
14650
- ///////////////////
14651
-
14652
- /((pebble))app/i // Pebble
14653
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
14654
- ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [/droid.+; (glass) \d/i // Google Glass
14655
- ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [/droid.+; (wt63?0{2,3})\)/i], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [/(quest( 2| pro)?)/i // Oculus Quest
14656
- ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
14657
- ///////////////////
14658
- // EMBEDDED
14659
- ///////////////////
14660
-
14661
- /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
14662
- ], [VENDOR, [TYPE, EMBEDDED]], [/(aeobc)\b/i // Echo Dot
14663
- ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
14664
- ////////////////////
14665
- // MIXED (GENERIC)
14666
- ///////////////////
14667
-
14668
- /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
14669
- ], [MODEL, [TYPE, MOBILE]], [/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
14670
- ], [MODEL, [TYPE, TABLET]], [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
14671
- ], [[TYPE, TABLET]], [/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
14672
- ], [[TYPE, MOBILE]], [/(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
14673
- ], [MODEL, [VENDOR, 'Generic']]],
14674
- engine: [[/windows.+ edge\/([\w\.]+)/i // EdgeHTML
14675
- ], [VERSION, [NAME, EDGE + 'HTML']], [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
14676
- ], [VERSION, [NAME, 'Blink']], [/(presto)\/([\w\.]+)/i,
14677
- // Presto
14678
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
14679
- // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
14680
- /ekioh(flow)\/([\w\.]+)/i,
14681
- // Flow
14682
- /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
14683
- // KHTML/Tasman/Links
14684
- /(icab)[\/ ]([23]\.[\d\.]+)/i,
14685
- // iCab
14686
- /\b(libweb)/i], [NAME, VERSION], [/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
14687
- ], [VERSION, NAME]],
14688
- os: [[
14689
- // Windows
14690
- /microsoft (windows) (vista|xp)/i // Windows (iTunes)
14691
- ], [NAME, VERSION], [/(windows) nt 6\.2; (arm)/i,
14692
- // Windows RT
14693
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,
14694
- // Windows Phone
14695
- /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i], [NAME, [VERSION, strMapper, windowsVersionMap]], [/(win(?=3|9|n)|win 9x )([nt\d\.]+)/i], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [
14696
- // iOS/macOS
14697
- /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,
14698
- // iOS
14699
- /ios;fbsv\/([\d\.]+)/i, /cfnetwork\/.+darwin/i], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
14700
- ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
14701
- // Mobile OSes
14702
- /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
14703
- ], [VERSION, NAME], [
14704
- // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
14705
- /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i, /(blackberry)\w*\/([\w\.]*)/i,
14706
- // Blackberry
14707
- /(tizen|kaios)[\/ ]([\w\.]+)/i,
14708
- // Tizen/KaiOS
14709
- /\((series40);/i // Series 40
14710
- ], [NAME, VERSION], [/\(bb(10);/i // BlackBerry 10
14711
- ], [VERSION, [NAME, BLACKBERRY]], [/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
14712
- ], [VERSION, [NAME, 'Symbian']], [/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
14713
- ], [VERSION, [NAME, FIREFOX + ' OS']], [/web0s;.+rt(tv)/i, /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
14714
- ], [VERSION, [NAME, 'webOS']], [/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
14715
- ], [VERSION, [NAME, 'watchOS']], [
14716
- // Google Chromecast
14717
- /crkey\/([\d\.]+)/i // Google Chromecast
14718
- ], [VERSION, [NAME, CHROME + 'cast']], [/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
14719
- ], [[NAME, CHROMIUM_OS], VERSION], [
14720
- // Smart TVs
14721
- /panasonic;(viera)/i,
14722
- // Panasonic Viera
14723
- /(netrange)mmh/i,
14724
- // Netrange
14725
- /(nettv)\/(\d+\.[\w\.]+)/i,
14726
- // NetTV
14727
-
14728
- // Console
14729
- /(nintendo|playstation) ([wids345portablevuch]+)/i,
14730
- // Nintendo/Playstation
14731
- /(xbox); +xbox ([^\);]+)/i,
14732
- // Microsoft Xbox (360, One, X, S, Series X, Series S)
14733
-
14734
- // Other
14735
- /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
14736
- // Joli/Palm
14737
- /(mint)[\/\(\) ]?(\w*)/i,
14738
- // Mint
14739
- /(mageia|vectorlinux)[; ]/i,
14740
- // Mageia/VectorLinux
14741
- /([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,
14742
- // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
14743
- /(hurd|linux) ?([\w\.]*)/i,
14744
- // Hurd/Linux
14745
- /(gnu) ?([\w\.]*)/i,
14746
- // GNU
14747
- /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
14748
- // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
14749
- /(haiku) (\w+)/i // Haiku
14750
- ], [NAME, VERSION], [/(sunos) ?([\w\.\d]*)/i // Solaris
14751
- ], [[NAME, 'Solaris'], VERSION], [/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
14752
- // Solaris
14753
- /(aix) ((\d)(?=\.|\)| )[\w\.])*/i,
14754
- // AIX
14755
- /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,
14756
- // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
14757
- /(unix) ?([\w\.]*)/i // UNIX
14758
- ], [NAME, VERSION]]
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;
14027
+ }
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)
14759
14034
  };
14760
-
14761
- /////////////////
14762
- // Constructor
14763
- ////////////////
14764
-
14765
- var UAParser = function (ua, extensions) {
14766
- if (typeof ua === OBJ_TYPE) {
14767
- extensions = ua;
14768
- ua = undefined$1;
14769
- }
14770
- if (!(this instanceof UAParser)) {
14771
- return new UAParser(ua, extensions).getResult();
14772
- }
14773
- var _navigator = typeof window !== UNDEF_TYPE && window.navigator ? window.navigator : undefined$1;
14774
- var _ua = ua || (_navigator && _navigator.userAgent ? _navigator.userAgent : EMPTY);
14775
- var _uach = _navigator && _navigator.userAgentData ? _navigator.userAgentData : undefined$1;
14776
- var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
14777
- var _isSelfNav = _navigator && _navigator.userAgent == _ua;
14778
- this.getBrowser = function () {
14779
- var _browser = {};
14780
- _browser[NAME] = undefined$1;
14781
- _browser[VERSION] = undefined$1;
14782
- rgxMapper.call(_browser, _ua, _rgxmap.browser);
14783
- _browser[MAJOR] = majorize(_browser[VERSION]);
14784
- // Brave-specific detection
14785
- if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
14786
- _browser[NAME] = 'Brave';
14787
- }
14788
- return _browser;
14789
- };
14790
- this.getCPU = function () {
14791
- var _cpu = {};
14792
- _cpu[ARCHITECTURE] = undefined$1;
14793
- rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
14794
- return _cpu;
14795
- };
14796
- this.getDevice = function () {
14797
- var _device = {};
14798
- _device[VENDOR] = undefined$1;
14799
- _device[MODEL] = undefined$1;
14800
- _device[TYPE] = undefined$1;
14801
- rgxMapper.call(_device, _ua, _rgxmap.device);
14802
- if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
14803
- _device[TYPE] = MOBILE;
14804
- }
14805
- // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
14806
- if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
14807
- _device[MODEL] = 'iPad';
14808
- _device[TYPE] = TABLET;
14809
- }
14810
- return _device;
14811
- };
14812
- this.getEngine = function () {
14813
- var _engine = {};
14814
- _engine[NAME] = undefined$1;
14815
- _engine[VERSION] = undefined$1;
14816
- rgxMapper.call(_engine, _ua, _rgxmap.engine);
14817
- return _engine;
14818
- };
14819
- this.getOS = function () {
14820
- var _os = {};
14821
- _os[NAME] = undefined$1;
14822
- _os[VERSION] = undefined$1;
14823
- rgxMapper.call(_os, _ua, _rgxmap.os);
14824
- if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
14825
- _os[NAME] = _uach.platform.replace(/chrome os/i, CHROMIUM_OS).replace(/macos/i, MAC_OS); // backward compatibility
14826
- }
14827
-
14828
- return _os;
14829
- };
14830
- this.getResult = function () {
14831
- return {
14832
- ua: this.getUA(),
14833
- browser: this.getBrowser(),
14834
- engine: this.getEngine(),
14835
- os: this.getOS(),
14836
- device: this.getDevice(),
14837
- cpu: this.getCPU()
14838
- };
14839
- };
14840
- this.getUA = function () {
14841
- return _ua;
14842
- };
14843
- this.setUA = function (ua) {
14844
- _ua = typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
14845
- return this;
14846
- };
14847
- this.setUA(_ua);
14848
- return this;
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)
14849
14043
  };
14850
- UAParser.VERSION = LIBVERSION;
14851
- UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
14852
- UAParser.CPU = enumerize([ARCHITECTURE]);
14853
- UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
14854
- UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
14855
-
14856
- ///////////
14857
- // Export
14858
- //////////
14859
-
14860
- // check js environment
14861
- {
14862
- // nodejs env
14863
- if (module.exports) {
14864
- exports = module.exports = UAParser;
14865
- }
14866
- exports.UAParser = UAParser;
14867
- }
14868
-
14869
- // jQuery/Zepto specific (optional)
14870
- // Note:
14871
- // In AMD env the global scope should be kept clean, but jQuery is an exception.
14872
- // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
14873
- // and we should catch that.
14874
- var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
14875
- if ($ && !$.ua) {
14876
- var parser = new UAParser();
14877
- $.ua = parser.getResult();
14878
- $.ua.get = function () {
14879
- return parser.getUA();
14880
- };
14881
- $.ua.set = function (ua) {
14882
- parser.setUA(ua);
14883
- var result = parser.getResult();
14884
- for (var prop in result) {
14885
- $.ua[prop] = result[prop];
14886
- }
14887
- };
14888
- }
14889
- })(typeof window === 'object' ? window : commonjsGlobal);
14890
- })(uaParser, uaParser.exports);
14891
- var uaParserExports = uaParser.exports;
14892
- var UAParser = /*@__PURE__*/getDefaultExportFromCjs(uaParserExports);
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
+ }
14893
14062
 
14894
- var version$1 = "1.9.3";
14063
+ var version$1 = "1.9.5";
14895
14064
 
14896
14065
  const version = version$1;
14897
14066
  const protocolVersion = 9;
@@ -15065,11 +14234,8 @@ function supportsSetSinkId(elm) {
15065
14234
  }
15066
14235
  const setCodecPreferencesVersions = {
15067
14236
  Chrome: '100',
15068
- Chromium: '100',
15069
14237
  Safari: '15',
15070
- Firefox: '100',
15071
- Edge: '100',
15072
- Brave: '1.40'
14238
+ Firefox: '100'
15073
14239
  };
15074
14240
  function supportsSetCodecPreferences(transceiver) {
15075
14241
  if (!isWeb()) {
@@ -15078,14 +14244,14 @@ function supportsSetCodecPreferences(transceiver) {
15078
14244
  if (!('setCodecPreferences' in transceiver)) {
15079
14245
  return false;
15080
14246
  }
15081
- const uap = UAParser();
15082
- if (!uap.browser.name || !uap.browser.version) {
14247
+ const browser = getBrowser();
14248
+ if (!(browser === null || browser === void 0 ? void 0 : browser.name) || !browser.version) {
15083
14249
  // version is required
15084
14250
  return false;
15085
14251
  }
15086
- const v = setCodecPreferencesVersions[uap.browser.name];
14252
+ const v = setCodecPreferencesVersions[browser.name];
15087
14253
  if (v) {
15088
- return compareVersions(uap.browser.version, v) >= 0;
14254
+ return compareVersions(browser.version, v) >= 0;
15089
14255
  }
15090
14256
  return false;
15091
14257
  }
@@ -15093,16 +14259,16 @@ function isBrowserSupported() {
15093
14259
  return supportsTransceiver() || supportsAddTrack();
15094
14260
  }
15095
14261
  function isFireFox() {
15096
- if (!isWeb()) return false;
15097
- return navigator.userAgent.indexOf('Firefox') !== -1;
14262
+ var _a;
14263
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Firefox';
15098
14264
  }
15099
14265
  function isChromiumBased() {
15100
- if (!isWeb()) return false;
15101
- return navigator.userAgent.indexOf('Chrom') !== -1;
14266
+ var _a;
14267
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Chrome';
15102
14268
  }
15103
14269
  function isSafari() {
15104
- if (!isWeb()) return false;
15105
- return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
14270
+ var _a;
14271
+ return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Safari';
15106
14272
  }
15107
14273
  function isMobile() {
15108
14274
  if (!isWeb()) return false;
@@ -15152,12 +14318,18 @@ function getDevicePixelRatio() {
15152
14318
  function compareVersions(v1, v2) {
15153
14319
  const parts1 = v1.split('.');
15154
14320
  const parts2 = v2.split('.');
15155
- const k = Math.min(v1.length, v2.length);
14321
+ const k = Math.min(parts1.length, parts2.length);
15156
14322
  for (let i = 0; i < k; ++i) {
15157
14323
  const p1 = parseInt(parts1[i], 10);
15158
14324
  const p2 = parseInt(parts2[i], 10);
15159
14325
  if (p1 > p2) return 1;
15160
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;
15161
14333
  }
15162
14334
  return parts1.length == parts2.length ? 0 : parts1.length < parts2.length ? -1 : 1;
15163
14335
  }
@@ -15333,9 +14505,51 @@ class Mutex {
15333
14505
  }
15334
14506
  }
15335
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();
14537
+ }
14538
+ });
14539
+ }
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
+ }
14549
+
15336
14550
  const passThroughQueueSignals = ['syncState', 'trickle', 'offer', 'answer', 'simulate', 'leave'];
15337
14551
  function canPassThroughQueue(req) {
15338
- const canPass = passThroughQueueSignals.includes(req.$case);
14552
+ const canPass = passThroughQueueSignals.indexOf(req.$case) >= 0;
15339
14553
  livekitLogger.trace('request allowed to bypass queue:', {
15340
14554
  canPass,
15341
14555
  req
@@ -15351,7 +14565,7 @@ class SignalClient {
15351
14565
  this.isConnected = false;
15352
14566
  this.isReconnecting = false;
15353
14567
  this.useJSON = useJSON;
15354
- this.requestQueue = new Queue();
14568
+ this.requestQueue = new AsyncQueue();
15355
14569
  this.queuedRequests = [];
15356
14570
  this.closingLock = new Mutex();
15357
14571
  }
@@ -16671,7 +15885,7 @@ const PCEvents = {
16671
15885
  NegotiationComplete: 'negotiationComplete'
16672
15886
  };
16673
15887
  /** @internal */
16674
- class PCTransport extends EventEmitter$1 {
15888
+ class PCTransport extends eventsExports.EventEmitter {
16675
15889
  constructor(config) {
16676
15890
  let mediaConstraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16677
15891
  super();
@@ -23528,7 +22742,10 @@ class Room extends eventsExports.EventEmitter {
23528
22742
  livekitLogger.warn('detected connection state mismatch', {
23529
22743
  numFailures: consecutiveFailures
23530
22744
  });
23531
- 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
+ }
23532
22749
  } else {
23533
22750
  consecutiveFailures = 0;
23534
22751
  }
@@ -24092,7 +23309,7 @@ class WebSocketCheck extends Checker {
24092
23309
  }
24093
23310
  }
24094
23311
 
24095
- class ConnectionCheck extends EventEmitter$1 {
23312
+ class ConnectionCheck extends eventsExports.EventEmitter {
24096
23313
  constructor(url, token) {
24097
23314
  super();
24098
23315
  this.checkResults = new Map();