@webex/internal-media-core 2.2.5 → 2.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +298 -1326
- package/dist/esm/index.js +299 -1326
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/esm/index.js
CHANGED
|
@@ -18,1303 +18,6 @@ function _mergeNamespaces(n, m) {
|
|
|
18
18
|
return Object.freeze(n);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
var global$1 = (typeof global !== "undefined" ? global :
|
|
22
|
-
typeof self !== "undefined" ? self :
|
|
23
|
-
typeof window !== "undefined" ? window : {});
|
|
24
|
-
|
|
25
|
-
// shim for using process in browser
|
|
26
|
-
// based off https://github.com/defunctzombie/node-process/blob/master/browser.js
|
|
27
|
-
|
|
28
|
-
function defaultSetTimout() {
|
|
29
|
-
throw new Error('setTimeout has not been defined');
|
|
30
|
-
}
|
|
31
|
-
function defaultClearTimeout () {
|
|
32
|
-
throw new Error('clearTimeout has not been defined');
|
|
33
|
-
}
|
|
34
|
-
var cachedSetTimeout = defaultSetTimout;
|
|
35
|
-
var cachedClearTimeout = defaultClearTimeout;
|
|
36
|
-
if (typeof global$1.setTimeout === 'function') {
|
|
37
|
-
cachedSetTimeout = setTimeout;
|
|
38
|
-
}
|
|
39
|
-
if (typeof global$1.clearTimeout === 'function') {
|
|
40
|
-
cachedClearTimeout = clearTimeout;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function runTimeout(fun) {
|
|
44
|
-
if (cachedSetTimeout === setTimeout) {
|
|
45
|
-
//normal enviroments in sane situations
|
|
46
|
-
return setTimeout(fun, 0);
|
|
47
|
-
}
|
|
48
|
-
// if setTimeout wasn't available but was latter defined
|
|
49
|
-
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
50
|
-
cachedSetTimeout = setTimeout;
|
|
51
|
-
return setTimeout(fun, 0);
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
55
|
-
return cachedSetTimeout(fun, 0);
|
|
56
|
-
} catch(e){
|
|
57
|
-
try {
|
|
58
|
-
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
59
|
-
return cachedSetTimeout.call(null, fun, 0);
|
|
60
|
-
} catch(e){
|
|
61
|
-
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
62
|
-
return cachedSetTimeout.call(this, fun, 0);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
function runClearTimeout(marker) {
|
|
69
|
-
if (cachedClearTimeout === clearTimeout) {
|
|
70
|
-
//normal enviroments in sane situations
|
|
71
|
-
return clearTimeout(marker);
|
|
72
|
-
}
|
|
73
|
-
// if clearTimeout wasn't available but was latter defined
|
|
74
|
-
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
75
|
-
cachedClearTimeout = clearTimeout;
|
|
76
|
-
return clearTimeout(marker);
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
80
|
-
return cachedClearTimeout(marker);
|
|
81
|
-
} catch (e){
|
|
82
|
-
try {
|
|
83
|
-
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
84
|
-
return cachedClearTimeout.call(null, marker);
|
|
85
|
-
} catch (e){
|
|
86
|
-
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
87
|
-
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
88
|
-
return cachedClearTimeout.call(this, marker);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
var queue$2 = [];
|
|
96
|
-
var draining = false;
|
|
97
|
-
var currentQueue;
|
|
98
|
-
var queueIndex = -1;
|
|
99
|
-
|
|
100
|
-
function cleanUpNextTick() {
|
|
101
|
-
if (!draining || !currentQueue) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
draining = false;
|
|
105
|
-
if (currentQueue.length) {
|
|
106
|
-
queue$2 = currentQueue.concat(queue$2);
|
|
107
|
-
} else {
|
|
108
|
-
queueIndex = -1;
|
|
109
|
-
}
|
|
110
|
-
if (queue$2.length) {
|
|
111
|
-
drainQueue();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function drainQueue() {
|
|
116
|
-
if (draining) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
var timeout = runTimeout(cleanUpNextTick);
|
|
120
|
-
draining = true;
|
|
121
|
-
|
|
122
|
-
var len = queue$2.length;
|
|
123
|
-
while(len) {
|
|
124
|
-
currentQueue = queue$2;
|
|
125
|
-
queue$2 = [];
|
|
126
|
-
while (++queueIndex < len) {
|
|
127
|
-
if (currentQueue) {
|
|
128
|
-
currentQueue[queueIndex].run();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
queueIndex = -1;
|
|
132
|
-
len = queue$2.length;
|
|
133
|
-
}
|
|
134
|
-
currentQueue = null;
|
|
135
|
-
draining = false;
|
|
136
|
-
runClearTimeout(timeout);
|
|
137
|
-
}
|
|
138
|
-
function nextTick(fun) {
|
|
139
|
-
var args = new Array(arguments.length - 1);
|
|
140
|
-
if (arguments.length > 1) {
|
|
141
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
142
|
-
args[i - 1] = arguments[i];
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
queue$2.push(new Item(fun, args));
|
|
146
|
-
if (queue$2.length === 1 && !draining) {
|
|
147
|
-
runTimeout(drainQueue);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// v8 likes predictible objects
|
|
151
|
-
function Item(fun, array) {
|
|
152
|
-
this.fun = fun;
|
|
153
|
-
this.array = array;
|
|
154
|
-
}
|
|
155
|
-
Item.prototype.run = function () {
|
|
156
|
-
this.fun.apply(null, this.array);
|
|
157
|
-
};
|
|
158
|
-
var title = 'browser';
|
|
159
|
-
var platform = 'browser';
|
|
160
|
-
var browser = true;
|
|
161
|
-
var env = {};
|
|
162
|
-
var argv = [];
|
|
163
|
-
var version = ''; // empty string to avoid regexp issues
|
|
164
|
-
var versions = {};
|
|
165
|
-
var release = {};
|
|
166
|
-
var config = {};
|
|
167
|
-
|
|
168
|
-
function noop() {}
|
|
169
|
-
|
|
170
|
-
var on$1 = noop;
|
|
171
|
-
var addListener = noop;
|
|
172
|
-
var once$4 = noop;
|
|
173
|
-
var off$1 = noop;
|
|
174
|
-
var removeListener = noop;
|
|
175
|
-
var removeAllListeners = noop;
|
|
176
|
-
var emit = noop;
|
|
177
|
-
|
|
178
|
-
function binding(name) {
|
|
179
|
-
throw new Error('process.binding is not supported');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function cwd () { return '/' }
|
|
183
|
-
function chdir (dir) {
|
|
184
|
-
throw new Error('process.chdir is not supported');
|
|
185
|
-
}function umask() { return 0; }
|
|
186
|
-
|
|
187
|
-
// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
|
|
188
|
-
var performance$1 = global$1.performance || {};
|
|
189
|
-
var performanceNow =
|
|
190
|
-
performance$1.now ||
|
|
191
|
-
performance$1.mozNow ||
|
|
192
|
-
performance$1.msNow ||
|
|
193
|
-
performance$1.oNow ||
|
|
194
|
-
performance$1.webkitNow ||
|
|
195
|
-
function(){ return (new Date()).getTime() };
|
|
196
|
-
|
|
197
|
-
// generate timestamp or delta
|
|
198
|
-
// see http://nodejs.org/api/process.html#process_process_hrtime
|
|
199
|
-
function hrtime(previousTimestamp){
|
|
200
|
-
var clocktime = performanceNow.call(performance$1)*1e-3;
|
|
201
|
-
var seconds = Math.floor(clocktime);
|
|
202
|
-
var nanoseconds = Math.floor((clocktime%1)*1e9);
|
|
203
|
-
if (previousTimestamp) {
|
|
204
|
-
seconds = seconds - previousTimestamp[0];
|
|
205
|
-
nanoseconds = nanoseconds - previousTimestamp[1];
|
|
206
|
-
if (nanoseconds<0) {
|
|
207
|
-
seconds--;
|
|
208
|
-
nanoseconds += 1e9;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
return [seconds,nanoseconds]
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
var startTime = new Date();
|
|
215
|
-
function uptime() {
|
|
216
|
-
var currentTime = new Date();
|
|
217
|
-
var dif = currentTime - startTime;
|
|
218
|
-
return dif / 1000;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
var browser$1 = {
|
|
222
|
-
nextTick: nextTick,
|
|
223
|
-
title: title,
|
|
224
|
-
browser: browser,
|
|
225
|
-
env: env,
|
|
226
|
-
argv: argv,
|
|
227
|
-
version: version,
|
|
228
|
-
versions: versions,
|
|
229
|
-
on: on$1,
|
|
230
|
-
addListener: addListener,
|
|
231
|
-
once: once$4,
|
|
232
|
-
off: off$1,
|
|
233
|
-
removeListener: removeListener,
|
|
234
|
-
removeAllListeners: removeAllListeners,
|
|
235
|
-
emit: emit,
|
|
236
|
-
binding: binding,
|
|
237
|
-
cwd: cwd,
|
|
238
|
-
chdir: chdir,
|
|
239
|
-
umask: umask,
|
|
240
|
-
hrtime: hrtime,
|
|
241
|
-
platform: platform,
|
|
242
|
-
release: release,
|
|
243
|
-
config: config,
|
|
244
|
-
uptime: uptime
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
var commonjsGlobal$4 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
248
|
-
|
|
249
|
-
var DetectRTC = {exports: {}};
|
|
250
|
-
|
|
251
|
-
(function (module) {
|
|
252
|
-
|
|
253
|
-
// Last Updated On: 2020-08-12 11:18:41 AM UTC
|
|
254
|
-
|
|
255
|
-
// ________________
|
|
256
|
-
// DetectRTC v1.4.1
|
|
257
|
-
|
|
258
|
-
// Open-Sourced: https://github.com/muaz-khan/DetectRTC
|
|
259
|
-
|
|
260
|
-
// --------------------------------------------------
|
|
261
|
-
// Muaz Khan - www.MuazKhan.com
|
|
262
|
-
// MIT License - www.WebRTC-Experiment.com/licence
|
|
263
|
-
// --------------------------------------------------
|
|
264
|
-
(function () {
|
|
265
|
-
var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';
|
|
266
|
-
var isNodejs = typeof browser$1 === 'object' && typeof browser$1.versions === 'object' && browser$1.versions.node && /*node-process*/!browser$1.browser;
|
|
267
|
-
if (isNodejs) {
|
|
268
|
-
var version = browser$1.versions.node.toString().replace('v', '');
|
|
269
|
-
browserFakeUserAgent = 'Nodejs/' + version + ' (NodeOS) AppleWebKit/' + version + ' (KHTML, like Gecko) Nodejs/' + version + ' Nodejs/' + version;
|
|
270
|
-
}
|
|
271
|
-
(function (that) {
|
|
272
|
-
if (typeof window !== 'undefined') {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
if (typeof window === 'undefined' && typeof commonjsGlobal$4 !== 'undefined') {
|
|
276
|
-
commonjsGlobal$4.navigator = {
|
|
277
|
-
userAgent: browserFakeUserAgent,
|
|
278
|
-
getUserMedia: function getUserMedia() {}
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
/*global window:true */
|
|
282
|
-
that.window = commonjsGlobal$4;
|
|
283
|
-
}
|
|
284
|
-
if (typeof location === 'undefined') {
|
|
285
|
-
/*global location:true */
|
|
286
|
-
that.location = {
|
|
287
|
-
protocol: 'file:',
|
|
288
|
-
href: '',
|
|
289
|
-
hash: ''
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
if (typeof screen === 'undefined') {
|
|
293
|
-
/*global screen:true */
|
|
294
|
-
that.screen = {
|
|
295
|
-
width: 0,
|
|
296
|
-
height: 0
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
})(typeof commonjsGlobal$4 !== 'undefined' ? commonjsGlobal$4 : window);
|
|
300
|
-
|
|
301
|
-
/*global navigator:true */
|
|
302
|
-
var navigator = window.navigator;
|
|
303
|
-
if (typeof navigator !== 'undefined') {
|
|
304
|
-
if (typeof navigator.webkitGetUserMedia !== 'undefined') {
|
|
305
|
-
navigator.getUserMedia = navigator.webkitGetUserMedia;
|
|
306
|
-
}
|
|
307
|
-
if (typeof navigator.mozGetUserMedia !== 'undefined') {
|
|
308
|
-
navigator.getUserMedia = navigator.mozGetUserMedia;
|
|
309
|
-
}
|
|
310
|
-
} else {
|
|
311
|
-
navigator = {
|
|
312
|
-
getUserMedia: function getUserMedia() {},
|
|
313
|
-
userAgent: browserFakeUserAgent
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
var isMobileDevice = !!/Android|webOS|iPhone|iPad|iPod|BB10|BlackBerry|IEMobile|Opera Mini|Mobile|mobile/i.test(navigator.userAgent || '');
|
|
317
|
-
var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveOrOpenBlob || !!navigator.msSaveBlob);
|
|
318
|
-
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
|
|
319
|
-
var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && 'netscape' in window && / rv:/.test(navigator.userAgent);
|
|
320
|
-
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
321
|
-
var isChrome = !!window.chrome && !isOpera;
|
|
322
|
-
var isIE = typeof document !== 'undefined' && !!document.documentMode && !isEdge;
|
|
323
|
-
|
|
324
|
-
// this one can also be used:
|
|
325
|
-
// https://www.websocket.org/js/stuff.js (DetectBrowser.js)
|
|
326
|
-
|
|
327
|
-
function getBrowserInfo() {
|
|
328
|
-
navigator.appVersion;
|
|
329
|
-
var nAgt = navigator.userAgent;
|
|
330
|
-
var browserName = navigator.appName;
|
|
331
|
-
var fullVersion = '' + parseFloat(navigator.appVersion);
|
|
332
|
-
var majorVersion = parseInt(navigator.appVersion, 10);
|
|
333
|
-
var nameOffset, verOffset, ix;
|
|
334
|
-
|
|
335
|
-
// In Opera, the true version is after 'Opera' or after 'Version'
|
|
336
|
-
if (isOpera) {
|
|
337
|
-
browserName = 'Opera';
|
|
338
|
-
try {
|
|
339
|
-
fullVersion = navigator.userAgent.split('OPR/')[1].split(' ')[0];
|
|
340
|
-
majorVersion = fullVersion.split('.')[0];
|
|
341
|
-
} catch (e) {
|
|
342
|
-
fullVersion = '0.0.0.0';
|
|
343
|
-
majorVersion = 0;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
// In MSIE version <=10, the true version is after 'MSIE' in userAgent
|
|
347
|
-
// In IE 11, look for the string after 'rv:'
|
|
348
|
-
else if (isIE) {
|
|
349
|
-
verOffset = nAgt.indexOf('rv:');
|
|
350
|
-
if (verOffset > 0) {
|
|
351
|
-
//IE 11
|
|
352
|
-
fullVersion = nAgt.substring(verOffset + 3);
|
|
353
|
-
} else {
|
|
354
|
-
//IE 10 or earlier
|
|
355
|
-
verOffset = nAgt.indexOf('MSIE');
|
|
356
|
-
fullVersion = nAgt.substring(verOffset + 5);
|
|
357
|
-
}
|
|
358
|
-
browserName = 'IE';
|
|
359
|
-
}
|
|
360
|
-
// In Chrome, the true version is after 'Chrome'
|
|
361
|
-
else if (isChrome) {
|
|
362
|
-
verOffset = nAgt.indexOf('Chrome');
|
|
363
|
-
browserName = 'Chrome';
|
|
364
|
-
fullVersion = nAgt.substring(verOffset + 7);
|
|
365
|
-
}
|
|
366
|
-
// In Safari, the true version is after 'Safari' or after 'Version'
|
|
367
|
-
else if (isSafari) {
|
|
368
|
-
// both and safri and chrome has same userAgent
|
|
369
|
-
if (nAgt.indexOf('CriOS') !== -1) {
|
|
370
|
-
verOffset = nAgt.indexOf('CriOS');
|
|
371
|
-
browserName = 'Chrome';
|
|
372
|
-
fullVersion = nAgt.substring(verOffset + 6);
|
|
373
|
-
} else if (nAgt.indexOf('FxiOS') !== -1) {
|
|
374
|
-
verOffset = nAgt.indexOf('FxiOS');
|
|
375
|
-
browserName = 'Firefox';
|
|
376
|
-
fullVersion = nAgt.substring(verOffset + 6);
|
|
377
|
-
} else {
|
|
378
|
-
verOffset = nAgt.indexOf('Safari');
|
|
379
|
-
browserName = 'Safari';
|
|
380
|
-
fullVersion = nAgt.substring(verOffset + 7);
|
|
381
|
-
if ((verOffset = nAgt.indexOf('Version')) !== -1) {
|
|
382
|
-
fullVersion = nAgt.substring(verOffset + 8);
|
|
383
|
-
}
|
|
384
|
-
if (navigator.userAgent.indexOf('Version/') !== -1) {
|
|
385
|
-
fullVersion = navigator.userAgent.split('Version/')[1].split(' ')[0];
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
// In Firefox, the true version is after 'Firefox'
|
|
390
|
-
else if (isFirefox) {
|
|
391
|
-
verOffset = nAgt.indexOf('Firefox');
|
|
392
|
-
browserName = 'Firefox';
|
|
393
|
-
fullVersion = nAgt.substring(verOffset + 8);
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// In most other browsers, 'name/version' is at the end of userAgent
|
|
397
|
-
else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
|
|
398
|
-
browserName = nAgt.substring(nameOffset, verOffset);
|
|
399
|
-
fullVersion = nAgt.substring(verOffset + 1);
|
|
400
|
-
if (browserName.toLowerCase() === browserName.toUpperCase()) {
|
|
401
|
-
browserName = navigator.appName;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
if (isEdge) {
|
|
405
|
-
browserName = 'Edge';
|
|
406
|
-
fullVersion = navigator.userAgent.split('Edge/')[1];
|
|
407
|
-
// fullVersion = parseInt(navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)[2], 10).toString();
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// trim the fullVersion string at semicolon/space/bracket if present
|
|
411
|
-
if ((ix = fullVersion.search(/[; \)]/)) !== -1) {
|
|
412
|
-
fullVersion = fullVersion.substring(0, ix);
|
|
413
|
-
}
|
|
414
|
-
majorVersion = parseInt('' + fullVersion, 10);
|
|
415
|
-
if (isNaN(majorVersion)) {
|
|
416
|
-
fullVersion = '' + parseFloat(navigator.appVersion);
|
|
417
|
-
majorVersion = parseInt(navigator.appVersion, 10);
|
|
418
|
-
}
|
|
419
|
-
return {
|
|
420
|
-
fullVersion: fullVersion,
|
|
421
|
-
version: majorVersion,
|
|
422
|
-
name: browserName,
|
|
423
|
-
isPrivateBrowsing: false
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// via: https://gist.github.com/cou929/7973956
|
|
428
|
-
|
|
429
|
-
function retry(isDone, next) {
|
|
430
|
-
var currentTrial = 0,
|
|
431
|
-
maxRetry = 50,
|
|
432
|
-
isTimeout = false;
|
|
433
|
-
var id = window.setInterval(function () {
|
|
434
|
-
if (isDone()) {
|
|
435
|
-
window.clearInterval(id);
|
|
436
|
-
next(isTimeout);
|
|
437
|
-
}
|
|
438
|
-
if (currentTrial++ > maxRetry) {
|
|
439
|
-
window.clearInterval(id);
|
|
440
|
-
isTimeout = true;
|
|
441
|
-
next(isTimeout);
|
|
442
|
-
}
|
|
443
|
-
}, 10);
|
|
444
|
-
}
|
|
445
|
-
function isIE10OrLater(userAgent) {
|
|
446
|
-
var ua = userAgent.toLowerCase();
|
|
447
|
-
if (ua.indexOf('msie') === 0 && ua.indexOf('trident') === 0) {
|
|
448
|
-
return false;
|
|
449
|
-
}
|
|
450
|
-
var match = /(?:msie|rv:)\s?([\d\.]+)/.exec(ua);
|
|
451
|
-
if (match && parseInt(match[1], 10) >= 10) {
|
|
452
|
-
return true;
|
|
453
|
-
}
|
|
454
|
-
return false;
|
|
455
|
-
}
|
|
456
|
-
function detectPrivateMode(callback) {
|
|
457
|
-
var isPrivate;
|
|
458
|
-
try {
|
|
459
|
-
if (window.webkitRequestFileSystem) {
|
|
460
|
-
window.webkitRequestFileSystem(window.TEMPORARY, 1, function () {
|
|
461
|
-
isPrivate = false;
|
|
462
|
-
}, function (e) {
|
|
463
|
-
isPrivate = true;
|
|
464
|
-
});
|
|
465
|
-
} else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
|
|
466
|
-
var db;
|
|
467
|
-
try {
|
|
468
|
-
db = window.indexedDB.open('test');
|
|
469
|
-
db.onerror = function () {
|
|
470
|
-
return true;
|
|
471
|
-
};
|
|
472
|
-
} catch (e) {
|
|
473
|
-
isPrivate = true;
|
|
474
|
-
}
|
|
475
|
-
if (typeof isPrivate === 'undefined') {
|
|
476
|
-
retry(function isDone() {
|
|
477
|
-
return db.readyState === 'done' ? true : false;
|
|
478
|
-
}, function next(isTimeout) {
|
|
479
|
-
if (!isTimeout) {
|
|
480
|
-
isPrivate = db.result ? false : true;
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
} else if (isIE10OrLater(window.navigator.userAgent)) {
|
|
485
|
-
isPrivate = false;
|
|
486
|
-
try {
|
|
487
|
-
if (!window.indexedDB) {
|
|
488
|
-
isPrivate = true;
|
|
489
|
-
}
|
|
490
|
-
} catch (e) {
|
|
491
|
-
isPrivate = true;
|
|
492
|
-
}
|
|
493
|
-
} else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
|
|
494
|
-
try {
|
|
495
|
-
window.localStorage.setItem('test', 1);
|
|
496
|
-
} catch (e) {
|
|
497
|
-
isPrivate = true;
|
|
498
|
-
}
|
|
499
|
-
if (typeof isPrivate === 'undefined') {
|
|
500
|
-
isPrivate = false;
|
|
501
|
-
window.localStorage.removeItem('test');
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
} catch (e) {
|
|
505
|
-
isPrivate = false;
|
|
506
|
-
}
|
|
507
|
-
retry(function isDone() {
|
|
508
|
-
return typeof isPrivate !== 'undefined' ? true : false;
|
|
509
|
-
}, function next(isTimeout) {
|
|
510
|
-
callback(isPrivate);
|
|
511
|
-
});
|
|
512
|
-
}
|
|
513
|
-
var isMobile = {
|
|
514
|
-
Android: function Android() {
|
|
515
|
-
return navigator.userAgent.match(/Android/i);
|
|
516
|
-
},
|
|
517
|
-
BlackBerry: function BlackBerry() {
|
|
518
|
-
return navigator.userAgent.match(/BlackBerry|BB10/i);
|
|
519
|
-
},
|
|
520
|
-
iOS: function iOS() {
|
|
521
|
-
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
|
522
|
-
},
|
|
523
|
-
Opera: function Opera() {
|
|
524
|
-
return navigator.userAgent.match(/Opera Mini/i);
|
|
525
|
-
},
|
|
526
|
-
Windows: function Windows() {
|
|
527
|
-
return navigator.userAgent.match(/IEMobile/i);
|
|
528
|
-
},
|
|
529
|
-
any: function any() {
|
|
530
|
-
return isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows();
|
|
531
|
-
},
|
|
532
|
-
getOsName: function getOsName() {
|
|
533
|
-
var osName = 'Unknown OS';
|
|
534
|
-
if (isMobile.Android()) {
|
|
535
|
-
osName = 'Android';
|
|
536
|
-
}
|
|
537
|
-
if (isMobile.BlackBerry()) {
|
|
538
|
-
osName = 'BlackBerry';
|
|
539
|
-
}
|
|
540
|
-
if (isMobile.iOS()) {
|
|
541
|
-
osName = 'iOS';
|
|
542
|
-
}
|
|
543
|
-
if (isMobile.Opera()) {
|
|
544
|
-
osName = 'Opera Mini';
|
|
545
|
-
}
|
|
546
|
-
if (isMobile.Windows()) {
|
|
547
|
-
osName = 'Windows';
|
|
548
|
-
}
|
|
549
|
-
return osName;
|
|
550
|
-
}
|
|
551
|
-
};
|
|
552
|
-
|
|
553
|
-
// via: http://jsfiddle.net/ChristianL/AVyND/
|
|
554
|
-
function detectDesktopOS() {
|
|
555
|
-
var unknown = '-';
|
|
556
|
-
var nVer = navigator.appVersion;
|
|
557
|
-
var nAgt = navigator.userAgent;
|
|
558
|
-
var os = unknown;
|
|
559
|
-
var clientStrings = [{
|
|
560
|
-
s: 'Chrome OS',
|
|
561
|
-
r: /CrOS/
|
|
562
|
-
}, {
|
|
563
|
-
s: 'Windows 10',
|
|
564
|
-
r: /(Windows 10.0|Windows NT 10.0)/
|
|
565
|
-
}, {
|
|
566
|
-
s: 'Windows 8.1',
|
|
567
|
-
r: /(Windows 8.1|Windows NT 6.3)/
|
|
568
|
-
}, {
|
|
569
|
-
s: 'Windows 8',
|
|
570
|
-
r: /(Windows 8|Windows NT 6.2)/
|
|
571
|
-
}, {
|
|
572
|
-
s: 'Windows 7',
|
|
573
|
-
r: /(Windows 7|Windows NT 6.1)/
|
|
574
|
-
}, {
|
|
575
|
-
s: 'Windows Vista',
|
|
576
|
-
r: /Windows NT 6.0/
|
|
577
|
-
}, {
|
|
578
|
-
s: 'Windows Server 2003',
|
|
579
|
-
r: /Windows NT 5.2/
|
|
580
|
-
}, {
|
|
581
|
-
s: 'Windows XP',
|
|
582
|
-
r: /(Windows NT 5.1|Windows XP)/
|
|
583
|
-
}, {
|
|
584
|
-
s: 'Windows 2000',
|
|
585
|
-
r: /(Windows NT 5.0|Windows 2000)/
|
|
586
|
-
}, {
|
|
587
|
-
s: 'Windows ME',
|
|
588
|
-
r: /(Win 9x 4.90|Windows ME)/
|
|
589
|
-
}, {
|
|
590
|
-
s: 'Windows 98',
|
|
591
|
-
r: /(Windows 98|Win98)/
|
|
592
|
-
}, {
|
|
593
|
-
s: 'Windows 95',
|
|
594
|
-
r: /(Windows 95|Win95|Windows_95)/
|
|
595
|
-
}, {
|
|
596
|
-
s: 'Windows NT 4.0',
|
|
597
|
-
r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/
|
|
598
|
-
}, {
|
|
599
|
-
s: 'Windows CE',
|
|
600
|
-
r: /Windows CE/
|
|
601
|
-
}, {
|
|
602
|
-
s: 'Windows 3.11',
|
|
603
|
-
r: /Win16/
|
|
604
|
-
}, {
|
|
605
|
-
s: 'Android',
|
|
606
|
-
r: /Android/
|
|
607
|
-
}, {
|
|
608
|
-
s: 'Open BSD',
|
|
609
|
-
r: /OpenBSD/
|
|
610
|
-
}, {
|
|
611
|
-
s: 'Sun OS',
|
|
612
|
-
r: /SunOS/
|
|
613
|
-
}, {
|
|
614
|
-
s: 'Linux',
|
|
615
|
-
r: /(Linux|X11)/
|
|
616
|
-
}, {
|
|
617
|
-
s: 'iOS',
|
|
618
|
-
r: /(iPhone|iPad|iPod)/
|
|
619
|
-
}, {
|
|
620
|
-
s: 'Mac OS X',
|
|
621
|
-
r: /Mac OS X/
|
|
622
|
-
}, {
|
|
623
|
-
s: 'Mac OS',
|
|
624
|
-
r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/
|
|
625
|
-
}, {
|
|
626
|
-
s: 'QNX',
|
|
627
|
-
r: /QNX/
|
|
628
|
-
}, {
|
|
629
|
-
s: 'UNIX',
|
|
630
|
-
r: /UNIX/
|
|
631
|
-
}, {
|
|
632
|
-
s: 'BeOS',
|
|
633
|
-
r: /BeOS/
|
|
634
|
-
}, {
|
|
635
|
-
s: 'OS/2',
|
|
636
|
-
r: /OS\/2/
|
|
637
|
-
}, {
|
|
638
|
-
s: 'Search Bot',
|
|
639
|
-
r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/
|
|
640
|
-
}];
|
|
641
|
-
for (var i = 0, cs; cs = clientStrings[i]; i++) {
|
|
642
|
-
if (cs.r.test(nAgt)) {
|
|
643
|
-
os = cs.s;
|
|
644
|
-
break;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
var osVersion = unknown;
|
|
648
|
-
if (/Windows/.test(os)) {
|
|
649
|
-
if (/Windows (.*)/.test(os)) {
|
|
650
|
-
osVersion = /Windows (.*)/.exec(os)[1];
|
|
651
|
-
}
|
|
652
|
-
os = 'Windows';
|
|
653
|
-
}
|
|
654
|
-
switch (os) {
|
|
655
|
-
case 'Mac OS X':
|
|
656
|
-
if (/Mac OS X (10[\.\_\d]+)/.test(nAgt)) {
|
|
657
|
-
osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
|
|
658
|
-
}
|
|
659
|
-
break;
|
|
660
|
-
case 'Android':
|
|
661
|
-
if (/Android ([\.\_\d]+)/.test(nAgt)) {
|
|
662
|
-
osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
|
|
663
|
-
}
|
|
664
|
-
break;
|
|
665
|
-
case 'iOS':
|
|
666
|
-
if (/OS (\d+)_(\d+)_?(\d+)?/.test(nAgt)) {
|
|
667
|
-
osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
|
|
668
|
-
if (osVersion && osVersion.length > 3) {
|
|
669
|
-
osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
break;
|
|
673
|
-
}
|
|
674
|
-
return {
|
|
675
|
-
osName: os,
|
|
676
|
-
osVersion: osVersion
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
var osName = 'Unknown OS';
|
|
680
|
-
var osVersion = 'Unknown OS Version';
|
|
681
|
-
function getAndroidVersion(ua) {
|
|
682
|
-
ua = (ua || navigator.userAgent).toLowerCase();
|
|
683
|
-
var match = ua.match(/android\s([0-9\.]*)/);
|
|
684
|
-
return match ? match[1] : false;
|
|
685
|
-
}
|
|
686
|
-
var osInfo = detectDesktopOS();
|
|
687
|
-
if (osInfo && osInfo.osName && osInfo.osName != '-') {
|
|
688
|
-
osName = osInfo.osName;
|
|
689
|
-
osVersion = osInfo.osVersion;
|
|
690
|
-
} else if (isMobile.any()) {
|
|
691
|
-
osName = isMobile.getOsName();
|
|
692
|
-
if (osName == 'Android') {
|
|
693
|
-
osVersion = getAndroidVersion();
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
var isNodejs = typeof browser$1 === 'object' && typeof browser$1.versions === 'object' && browser$1.versions.node;
|
|
697
|
-
if (osName === 'Unknown OS' && isNodejs) {
|
|
698
|
-
osName = 'Nodejs';
|
|
699
|
-
osVersion = browser$1.versions.node.toString().replace('v', '');
|
|
700
|
-
}
|
|
701
|
-
var isCanvasSupportsStreamCapturing = false;
|
|
702
|
-
var isVideoSupportsStreamCapturing = false;
|
|
703
|
-
['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function (item) {
|
|
704
|
-
if (typeof document === 'undefined' || typeof document.createElement !== 'function') {
|
|
705
|
-
return;
|
|
706
|
-
}
|
|
707
|
-
if (!isCanvasSupportsStreamCapturing && item in document.createElement('canvas')) {
|
|
708
|
-
isCanvasSupportsStreamCapturing = true;
|
|
709
|
-
}
|
|
710
|
-
if (!isVideoSupportsStreamCapturing && item in document.createElement('video')) {
|
|
711
|
-
isVideoSupportsStreamCapturing = true;
|
|
712
|
-
}
|
|
713
|
-
});
|
|
714
|
-
var regexIpv4Local = /^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/,
|
|
715
|
-
regexIpv4 = /([0-9]{1,3}(\.[0-9]{1,3}){3})/,
|
|
716
|
-
regexIpv6 = /[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}/;
|
|
717
|
-
|
|
718
|
-
// via: https://github.com/diafygi/webrtc-ips
|
|
719
|
-
function DetectLocalIPAddress(callback, stream) {
|
|
720
|
-
if (!DetectRTC.isWebRTCSupported) {
|
|
721
|
-
return;
|
|
722
|
-
}
|
|
723
|
-
var isPublic = true,
|
|
724
|
-
isIpv4 = true;
|
|
725
|
-
getIPs(function (ip) {
|
|
726
|
-
if (!ip) {
|
|
727
|
-
callback(); // Pass nothing to tell that ICE-gathering-ended
|
|
728
|
-
} else if (ip.match(regexIpv4Local)) {
|
|
729
|
-
isPublic = false;
|
|
730
|
-
callback('Local: ' + ip, isPublic, isIpv4);
|
|
731
|
-
} else if (ip.match(regexIpv6)) {
|
|
732
|
-
//via https://ourcodeworld.com/articles/read/257/how-to-get-the-client-ip-address-with-javascript-only
|
|
733
|
-
isIpv4 = false;
|
|
734
|
-
callback('Public: ' + ip, isPublic, isIpv4);
|
|
735
|
-
} else {
|
|
736
|
-
callback('Public: ' + ip, isPublic, isIpv4);
|
|
737
|
-
}
|
|
738
|
-
}, stream);
|
|
739
|
-
}
|
|
740
|
-
function getIPs(callback, stream) {
|
|
741
|
-
if (typeof document === 'undefined' || typeof document.getElementById !== 'function') {
|
|
742
|
-
return;
|
|
743
|
-
}
|
|
744
|
-
var ipDuplicates = {};
|
|
745
|
-
var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
|
|
746
|
-
if (!RTCPeerConnection) {
|
|
747
|
-
var iframe = document.getElementById('iframe');
|
|
748
|
-
if (!iframe) {
|
|
749
|
-
return;
|
|
750
|
-
}
|
|
751
|
-
var win = iframe.contentWindow;
|
|
752
|
-
RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;
|
|
753
|
-
}
|
|
754
|
-
if (!RTCPeerConnection) {
|
|
755
|
-
return;
|
|
756
|
-
}
|
|
757
|
-
var peerConfig = null;
|
|
758
|
-
if (DetectRTC.browser === 'Chrome' && DetectRTC.browser.version < 58) {
|
|
759
|
-
// todo: add support for older Opera
|
|
760
|
-
peerConfig = {
|
|
761
|
-
optional: [{
|
|
762
|
-
RtpDataChannels: true
|
|
763
|
-
}]
|
|
764
|
-
};
|
|
765
|
-
}
|
|
766
|
-
var servers = {
|
|
767
|
-
iceServers: [{
|
|
768
|
-
urls: 'stun:stun.l.google.com:19302'
|
|
769
|
-
}]
|
|
770
|
-
};
|
|
771
|
-
var pc = new RTCPeerConnection(servers, peerConfig);
|
|
772
|
-
if (stream) {
|
|
773
|
-
if (pc.addStream) {
|
|
774
|
-
pc.addStream(stream);
|
|
775
|
-
} else if (pc.addTrack && stream.getTracks()[0]) {
|
|
776
|
-
pc.addTrack(stream.getTracks()[0], stream);
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
function handleCandidate(candidate) {
|
|
780
|
-
if (!candidate) {
|
|
781
|
-
callback(); // Pass nothing to tell that ICE-gathering-ended
|
|
782
|
-
return;
|
|
783
|
-
}
|
|
784
|
-
var match = regexIpv4.exec(candidate);
|
|
785
|
-
if (!match) {
|
|
786
|
-
return;
|
|
787
|
-
}
|
|
788
|
-
var ipAddress = match[1];
|
|
789
|
-
var isPublic = candidate.match(regexIpv4Local),
|
|
790
|
-
isIpv4 = true;
|
|
791
|
-
if (ipDuplicates[ipAddress] === undefined) {
|
|
792
|
-
callback(ipAddress, isPublic, isIpv4);
|
|
793
|
-
}
|
|
794
|
-
ipDuplicates[ipAddress] = true;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
// listen for candidate events
|
|
798
|
-
pc.onicecandidate = function (event) {
|
|
799
|
-
if (event.candidate && event.candidate.candidate) {
|
|
800
|
-
handleCandidate(event.candidate.candidate);
|
|
801
|
-
} else {
|
|
802
|
-
handleCandidate(); // Pass nothing to tell that ICE-gathering-ended
|
|
803
|
-
}
|
|
804
|
-
};
|
|
805
|
-
|
|
806
|
-
// create data channel
|
|
807
|
-
if (!stream) {
|
|
808
|
-
try {
|
|
809
|
-
pc.createDataChannel('sctp', {});
|
|
810
|
-
} catch (e) {}
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
// create an offer sdp
|
|
814
|
-
if (DetectRTC.isPromisesSupported) {
|
|
815
|
-
pc.createOffer().then(function (result) {
|
|
816
|
-
pc.setLocalDescription(result).then(afterCreateOffer);
|
|
817
|
-
});
|
|
818
|
-
} else {
|
|
819
|
-
pc.createOffer(function (result) {
|
|
820
|
-
pc.setLocalDescription(result, afterCreateOffer, function () {});
|
|
821
|
-
}, function () {});
|
|
822
|
-
}
|
|
823
|
-
function afterCreateOffer() {
|
|
824
|
-
var lines = pc.localDescription.sdp.split('\n');
|
|
825
|
-
lines.forEach(function (line) {
|
|
826
|
-
if (line && line.indexOf('a=candidate:') === 0) {
|
|
827
|
-
handleCandidate(line);
|
|
828
|
-
}
|
|
829
|
-
});
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
var MediaDevices = [];
|
|
833
|
-
var audioInputDevices = [];
|
|
834
|
-
var audioOutputDevices = [];
|
|
835
|
-
var videoInputDevices = [];
|
|
836
|
-
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
|
837
|
-
// Firefox 38+ seems having support of enumerateDevices
|
|
838
|
-
// Thanks @xdumaine/enumerateDevices
|
|
839
|
-
navigator.enumerateDevices = function (callback) {
|
|
840
|
-
var enumerateDevices = navigator.mediaDevices.enumerateDevices();
|
|
841
|
-
if (enumerateDevices && enumerateDevices.then) {
|
|
842
|
-
navigator.mediaDevices.enumerateDevices().then(callback).catch(function () {
|
|
843
|
-
callback([]);
|
|
844
|
-
});
|
|
845
|
-
} else {
|
|
846
|
-
callback([]);
|
|
847
|
-
}
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
// Media Devices detection
|
|
852
|
-
var canEnumerate = false;
|
|
853
|
-
|
|
854
|
-
/*global MediaStreamTrack:true */
|
|
855
|
-
if (typeof MediaStreamTrack !== 'undefined' && 'getSources' in MediaStreamTrack) {
|
|
856
|
-
canEnumerate = true;
|
|
857
|
-
} else if (navigator.mediaDevices && !!navigator.mediaDevices.enumerateDevices) {
|
|
858
|
-
canEnumerate = true;
|
|
859
|
-
}
|
|
860
|
-
var hasMicrophone = false;
|
|
861
|
-
var hasSpeakers = false;
|
|
862
|
-
var hasWebcam = false;
|
|
863
|
-
var isWebsiteHasMicrophonePermissions = false;
|
|
864
|
-
var isWebsiteHasWebcamPermissions = false;
|
|
865
|
-
|
|
866
|
-
// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediadevices
|
|
867
|
-
function checkDeviceSupport(callback) {
|
|
868
|
-
if (!canEnumerate) {
|
|
869
|
-
if (callback) {
|
|
870
|
-
callback();
|
|
871
|
-
}
|
|
872
|
-
return;
|
|
873
|
-
}
|
|
874
|
-
if (!navigator.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources) {
|
|
875
|
-
navigator.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack);
|
|
876
|
-
}
|
|
877
|
-
if (!navigator.enumerateDevices && navigator.enumerateDevices) {
|
|
878
|
-
navigator.enumerateDevices = navigator.enumerateDevices.bind(navigator);
|
|
879
|
-
}
|
|
880
|
-
if (!navigator.enumerateDevices) {
|
|
881
|
-
if (callback) {
|
|
882
|
-
callback();
|
|
883
|
-
}
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
MediaDevices = [];
|
|
887
|
-
audioInputDevices = [];
|
|
888
|
-
audioOutputDevices = [];
|
|
889
|
-
videoInputDevices = [];
|
|
890
|
-
hasMicrophone = false;
|
|
891
|
-
hasSpeakers = false;
|
|
892
|
-
hasWebcam = false;
|
|
893
|
-
isWebsiteHasMicrophonePermissions = false;
|
|
894
|
-
isWebsiteHasWebcamPermissions = false;
|
|
895
|
-
|
|
896
|
-
// to prevent duplication
|
|
897
|
-
var alreadyUsedDevices = {};
|
|
898
|
-
navigator.enumerateDevices(function (devices) {
|
|
899
|
-
MediaDevices = [];
|
|
900
|
-
audioInputDevices = [];
|
|
901
|
-
audioOutputDevices = [];
|
|
902
|
-
videoInputDevices = [];
|
|
903
|
-
devices.forEach(function (_device) {
|
|
904
|
-
var device = {};
|
|
905
|
-
for (var d in _device) {
|
|
906
|
-
try {
|
|
907
|
-
if (typeof _device[d] !== 'function') {
|
|
908
|
-
device[d] = _device[d];
|
|
909
|
-
}
|
|
910
|
-
} catch (e) {}
|
|
911
|
-
}
|
|
912
|
-
if (alreadyUsedDevices[device.deviceId + device.label + device.kind]) {
|
|
913
|
-
return;
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
// if it is MediaStreamTrack.getSources
|
|
917
|
-
if (device.kind === 'audio') {
|
|
918
|
-
device.kind = 'audioinput';
|
|
919
|
-
}
|
|
920
|
-
if (device.kind === 'video') {
|
|
921
|
-
device.kind = 'videoinput';
|
|
922
|
-
}
|
|
923
|
-
if (!device.deviceId) {
|
|
924
|
-
device.deviceId = device.id;
|
|
925
|
-
}
|
|
926
|
-
if (!device.id) {
|
|
927
|
-
device.id = device.deviceId;
|
|
928
|
-
}
|
|
929
|
-
if (!device.label) {
|
|
930
|
-
device.isCustomLabel = true;
|
|
931
|
-
if (device.kind === 'videoinput') {
|
|
932
|
-
device.label = 'Camera ' + (videoInputDevices.length + 1);
|
|
933
|
-
} else if (device.kind === 'audioinput') {
|
|
934
|
-
device.label = 'Microphone ' + (audioInputDevices.length + 1);
|
|
935
|
-
} else if (device.kind === 'audiooutput') {
|
|
936
|
-
device.label = 'Speaker ' + (audioOutputDevices.length + 1);
|
|
937
|
-
} else {
|
|
938
|
-
device.label = 'Please invoke getUserMedia once.';
|
|
939
|
-
}
|
|
940
|
-
if (typeof DetectRTC !== 'undefined' && DetectRTC.browser.isChrome && DetectRTC.browser.version >= 46 && !/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {
|
|
941
|
-
if (typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1) {
|
|
942
|
-
device.label = 'HTTPs is required to get label of this ' + device.kind + ' device.';
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
} else {
|
|
946
|
-
// Firefox on Android still returns empty label
|
|
947
|
-
if (device.kind === 'videoinput' && !isWebsiteHasWebcamPermissions) {
|
|
948
|
-
isWebsiteHasWebcamPermissions = true;
|
|
949
|
-
}
|
|
950
|
-
if (device.kind === 'audioinput' && !isWebsiteHasMicrophonePermissions) {
|
|
951
|
-
isWebsiteHasMicrophonePermissions = true;
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
if (device.kind === 'audioinput') {
|
|
955
|
-
hasMicrophone = true;
|
|
956
|
-
if (audioInputDevices.indexOf(device) === -1) {
|
|
957
|
-
audioInputDevices.push(device);
|
|
958
|
-
}
|
|
959
|
-
}
|
|
960
|
-
if (device.kind === 'audiooutput') {
|
|
961
|
-
hasSpeakers = true;
|
|
962
|
-
if (audioOutputDevices.indexOf(device) === -1) {
|
|
963
|
-
audioOutputDevices.push(device);
|
|
964
|
-
}
|
|
965
|
-
}
|
|
966
|
-
if (device.kind === 'videoinput') {
|
|
967
|
-
hasWebcam = true;
|
|
968
|
-
if (videoInputDevices.indexOf(device) === -1) {
|
|
969
|
-
videoInputDevices.push(device);
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
// there is no 'videoouput' in the spec.
|
|
974
|
-
MediaDevices.push(device);
|
|
975
|
-
alreadyUsedDevices[device.deviceId + device.label + device.kind] = device;
|
|
976
|
-
});
|
|
977
|
-
if (typeof DetectRTC !== 'undefined') {
|
|
978
|
-
// to sync latest outputs
|
|
979
|
-
DetectRTC.MediaDevices = MediaDevices;
|
|
980
|
-
DetectRTC.hasMicrophone = hasMicrophone;
|
|
981
|
-
DetectRTC.hasSpeakers = hasSpeakers;
|
|
982
|
-
DetectRTC.hasWebcam = hasWebcam;
|
|
983
|
-
DetectRTC.isWebsiteHasWebcamPermissions = isWebsiteHasWebcamPermissions;
|
|
984
|
-
DetectRTC.isWebsiteHasMicrophonePermissions = isWebsiteHasMicrophonePermissions;
|
|
985
|
-
DetectRTC.audioInputDevices = audioInputDevices;
|
|
986
|
-
DetectRTC.audioOutputDevices = audioOutputDevices;
|
|
987
|
-
DetectRTC.videoInputDevices = videoInputDevices;
|
|
988
|
-
}
|
|
989
|
-
if (callback) {
|
|
990
|
-
callback();
|
|
991
|
-
}
|
|
992
|
-
});
|
|
993
|
-
}
|
|
994
|
-
var DetectRTC = window.DetectRTC || {};
|
|
995
|
-
|
|
996
|
-
// ----------
|
|
997
|
-
// DetectRTC.browser.name || DetectRTC.browser.version || DetectRTC.browser.fullVersion
|
|
998
|
-
DetectRTC.browser = getBrowserInfo();
|
|
999
|
-
detectPrivateMode(function (isPrivateBrowsing) {
|
|
1000
|
-
DetectRTC.browser.isPrivateBrowsing = !!isPrivateBrowsing;
|
|
1001
|
-
});
|
|
1002
|
-
|
|
1003
|
-
// DetectRTC.isChrome || DetectRTC.isFirefox || DetectRTC.isEdge
|
|
1004
|
-
DetectRTC.browser['is' + DetectRTC.browser.name] = true;
|
|
1005
|
-
|
|
1006
|
-
// -----------
|
|
1007
|
-
DetectRTC.osName = osName;
|
|
1008
|
-
DetectRTC.osVersion = osVersion;
|
|
1009
|
-
typeof browser$1 === 'object' && typeof browser$1.versions === 'object' && browser$1.versions['node-webkit'];
|
|
1010
|
-
|
|
1011
|
-
// --------- Detect if system supports WebRTC 1.0 or WebRTC 1.1.
|
|
1012
|
-
var isWebRTCSupported = false;
|
|
1013
|
-
['RTCPeerConnection', 'webkitRTCPeerConnection', 'mozRTCPeerConnection', 'RTCIceGatherer'].forEach(function (item) {
|
|
1014
|
-
if (isWebRTCSupported) {
|
|
1015
|
-
return;
|
|
1016
|
-
}
|
|
1017
|
-
if (item in window) {
|
|
1018
|
-
isWebRTCSupported = true;
|
|
1019
|
-
}
|
|
1020
|
-
});
|
|
1021
|
-
DetectRTC.isWebRTCSupported = isWebRTCSupported;
|
|
1022
|
-
|
|
1023
|
-
//-------
|
|
1024
|
-
DetectRTC.isORTCSupported = typeof RTCIceGatherer !== 'undefined';
|
|
1025
|
-
|
|
1026
|
-
// --------- Detect if system supports screen capturing API
|
|
1027
|
-
var isScreenCapturingSupported = false;
|
|
1028
|
-
if (DetectRTC.browser.isChrome && DetectRTC.browser.version >= 35) {
|
|
1029
|
-
isScreenCapturingSupported = true;
|
|
1030
|
-
} else if (DetectRTC.browser.isFirefox && DetectRTC.browser.version >= 34) {
|
|
1031
|
-
isScreenCapturingSupported = true;
|
|
1032
|
-
} else if (DetectRTC.browser.isEdge && DetectRTC.browser.version >= 17) {
|
|
1033
|
-
isScreenCapturingSupported = true;
|
|
1034
|
-
} else if (DetectRTC.osName === 'Android' && DetectRTC.browser.isChrome) {
|
|
1035
|
-
isScreenCapturingSupported = true;
|
|
1036
|
-
}
|
|
1037
|
-
if (!!navigator.getDisplayMedia || navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
|
|
1038
|
-
isScreenCapturingSupported = true;
|
|
1039
|
-
}
|
|
1040
|
-
if (!/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {
|
|
1041
|
-
var isNonLocalHost = typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1;
|
|
1042
|
-
if (isNonLocalHost && (DetectRTC.browser.isChrome || DetectRTC.browser.isEdge || DetectRTC.browser.isOpera)) {
|
|
1043
|
-
isScreenCapturingSupported = false;
|
|
1044
|
-
} else if (DetectRTC.browser.isFirefox) {
|
|
1045
|
-
isScreenCapturingSupported = false;
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
DetectRTC.isScreenCapturingSupported = isScreenCapturingSupported;
|
|
1049
|
-
|
|
1050
|
-
// --------- Detect if WebAudio API are supported
|
|
1051
|
-
var webAudio = {
|
|
1052
|
-
isSupported: false,
|
|
1053
|
-
isCreateMediaStreamSourceSupported: false
|
|
1054
|
-
};
|
|
1055
|
-
['AudioContext', 'webkitAudioContext', 'mozAudioContext', 'msAudioContext'].forEach(function (item) {
|
|
1056
|
-
if (webAudio.isSupported) {
|
|
1057
|
-
return;
|
|
1058
|
-
}
|
|
1059
|
-
if (item in window) {
|
|
1060
|
-
webAudio.isSupported = true;
|
|
1061
|
-
if (window[item] && 'createMediaStreamSource' in window[item].prototype) {
|
|
1062
|
-
webAudio.isCreateMediaStreamSourceSupported = true;
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
});
|
|
1066
|
-
DetectRTC.isAudioContextSupported = webAudio.isSupported;
|
|
1067
|
-
DetectRTC.isCreateMediaStreamSourceSupported = webAudio.isCreateMediaStreamSourceSupported;
|
|
1068
|
-
|
|
1069
|
-
// ---------- Detect if SCTP/RTP channels are supported.
|
|
1070
|
-
|
|
1071
|
-
var isRtpDataChannelsSupported = false;
|
|
1072
|
-
if (DetectRTC.browser.isChrome && DetectRTC.browser.version > 31) {
|
|
1073
|
-
isRtpDataChannelsSupported = true;
|
|
1074
|
-
}
|
|
1075
|
-
DetectRTC.isRtpDataChannelsSupported = isRtpDataChannelsSupported;
|
|
1076
|
-
var isSCTPSupportd = false;
|
|
1077
|
-
if (DetectRTC.browser.isFirefox && DetectRTC.browser.version > 28) {
|
|
1078
|
-
isSCTPSupportd = true;
|
|
1079
|
-
} else if (DetectRTC.browser.isChrome && DetectRTC.browser.version > 25) {
|
|
1080
|
-
isSCTPSupportd = true;
|
|
1081
|
-
} else if (DetectRTC.browser.isOpera && DetectRTC.browser.version >= 11) {
|
|
1082
|
-
isSCTPSupportd = true;
|
|
1083
|
-
}
|
|
1084
|
-
DetectRTC.isSctpDataChannelsSupported = isSCTPSupportd;
|
|
1085
|
-
|
|
1086
|
-
// ---------
|
|
1087
|
-
|
|
1088
|
-
DetectRTC.isMobileDevice = isMobileDevice; // "isMobileDevice" boolean is defined in "getBrowserInfo.js"
|
|
1089
|
-
|
|
1090
|
-
// ------
|
|
1091
|
-
var isGetUserMediaSupported = false;
|
|
1092
|
-
if (navigator.getUserMedia) {
|
|
1093
|
-
isGetUserMediaSupported = true;
|
|
1094
|
-
} else if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
|
1095
|
-
isGetUserMediaSupported = true;
|
|
1096
|
-
}
|
|
1097
|
-
if (DetectRTC.browser.isChrome && DetectRTC.browser.version >= 46 && !/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {
|
|
1098
|
-
if (typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1) {
|
|
1099
|
-
isGetUserMediaSupported = 'Requires HTTPs';
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
if (DetectRTC.osName === 'Nodejs') {
|
|
1103
|
-
isGetUserMediaSupported = false;
|
|
1104
|
-
}
|
|
1105
|
-
DetectRTC.isGetUserMediaSupported = isGetUserMediaSupported;
|
|
1106
|
-
var displayResolution = '';
|
|
1107
|
-
if (screen.width) {
|
|
1108
|
-
var width = screen.width ? screen.width : '';
|
|
1109
|
-
var height = screen.height ? screen.height : '';
|
|
1110
|
-
displayResolution += '' + width + ' x ' + height;
|
|
1111
|
-
}
|
|
1112
|
-
DetectRTC.displayResolution = displayResolution;
|
|
1113
|
-
function getAspectRatio(w, h) {
|
|
1114
|
-
function gcd(a, b) {
|
|
1115
|
-
return b == 0 ? a : gcd(b, a % b);
|
|
1116
|
-
}
|
|
1117
|
-
var r = gcd(w, h);
|
|
1118
|
-
return w / r / (h / r);
|
|
1119
|
-
}
|
|
1120
|
-
DetectRTC.displayAspectRatio = getAspectRatio(screen.width, screen.height).toFixed(2);
|
|
1121
|
-
|
|
1122
|
-
// ----------
|
|
1123
|
-
DetectRTC.isCanvasSupportsStreamCapturing = isCanvasSupportsStreamCapturing;
|
|
1124
|
-
DetectRTC.isVideoSupportsStreamCapturing = isVideoSupportsStreamCapturing;
|
|
1125
|
-
if (DetectRTC.browser.name == 'Chrome' && DetectRTC.browser.version >= 53) {
|
|
1126
|
-
if (!DetectRTC.isCanvasSupportsStreamCapturing) {
|
|
1127
|
-
DetectRTC.isCanvasSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features';
|
|
1128
|
-
}
|
|
1129
|
-
if (!DetectRTC.isVideoSupportsStreamCapturing) {
|
|
1130
|
-
DetectRTC.isVideoSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features';
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
// ------
|
|
1135
|
-
DetectRTC.DetectLocalIPAddress = DetectLocalIPAddress;
|
|
1136
|
-
DetectRTC.isWebSocketsSupported = 'WebSocket' in window && 2 === window.WebSocket.CLOSING;
|
|
1137
|
-
DetectRTC.isWebSocketsBlocked = !DetectRTC.isWebSocketsSupported;
|
|
1138
|
-
if (DetectRTC.osName === 'Nodejs') {
|
|
1139
|
-
DetectRTC.isWebSocketsSupported = true;
|
|
1140
|
-
DetectRTC.isWebSocketsBlocked = false;
|
|
1141
|
-
}
|
|
1142
|
-
DetectRTC.checkWebSocketsSupport = function (callback) {
|
|
1143
|
-
callback = callback || function () {};
|
|
1144
|
-
try {
|
|
1145
|
-
var starttime;
|
|
1146
|
-
var websocket = new WebSocket('wss://echo.websocket.org:443/');
|
|
1147
|
-
websocket.onopen = function () {
|
|
1148
|
-
DetectRTC.isWebSocketsBlocked = false;
|
|
1149
|
-
starttime = new Date().getTime();
|
|
1150
|
-
websocket.send('ping');
|
|
1151
|
-
};
|
|
1152
|
-
websocket.onmessage = function () {
|
|
1153
|
-
DetectRTC.WebsocketLatency = new Date().getTime() - starttime + 'ms';
|
|
1154
|
-
callback();
|
|
1155
|
-
websocket.close();
|
|
1156
|
-
websocket = null;
|
|
1157
|
-
};
|
|
1158
|
-
websocket.onerror = function () {
|
|
1159
|
-
DetectRTC.isWebSocketsBlocked = true;
|
|
1160
|
-
callback();
|
|
1161
|
-
};
|
|
1162
|
-
} catch (e) {
|
|
1163
|
-
DetectRTC.isWebSocketsBlocked = true;
|
|
1164
|
-
callback();
|
|
1165
|
-
}
|
|
1166
|
-
};
|
|
1167
|
-
|
|
1168
|
-
// -------
|
|
1169
|
-
DetectRTC.load = function (callback) {
|
|
1170
|
-
callback = callback || function () {};
|
|
1171
|
-
checkDeviceSupport(callback);
|
|
1172
|
-
};
|
|
1173
|
-
if (typeof MediaDevices !== 'undefined') {
|
|
1174
|
-
DetectRTC.MediaDevices = MediaDevices;
|
|
1175
|
-
} else {
|
|
1176
|
-
DetectRTC.MediaDevices = [];
|
|
1177
|
-
}
|
|
1178
|
-
DetectRTC.hasMicrophone = hasMicrophone;
|
|
1179
|
-
DetectRTC.hasSpeakers = hasSpeakers;
|
|
1180
|
-
DetectRTC.hasWebcam = hasWebcam;
|
|
1181
|
-
DetectRTC.isWebsiteHasWebcamPermissions = isWebsiteHasWebcamPermissions;
|
|
1182
|
-
DetectRTC.isWebsiteHasMicrophonePermissions = isWebsiteHasMicrophonePermissions;
|
|
1183
|
-
DetectRTC.audioInputDevices = audioInputDevices;
|
|
1184
|
-
DetectRTC.audioOutputDevices = audioOutputDevices;
|
|
1185
|
-
DetectRTC.videoInputDevices = videoInputDevices;
|
|
1186
|
-
|
|
1187
|
-
// ------
|
|
1188
|
-
var isSetSinkIdSupported = false;
|
|
1189
|
-
if (typeof document !== 'undefined' && typeof document.createElement === 'function' && 'setSinkId' in document.createElement('video')) {
|
|
1190
|
-
isSetSinkIdSupported = true;
|
|
1191
|
-
}
|
|
1192
|
-
DetectRTC.isSetSinkIdSupported = isSetSinkIdSupported;
|
|
1193
|
-
|
|
1194
|
-
// -----
|
|
1195
|
-
var isRTPSenderReplaceTracksSupported = false;
|
|
1196
|
-
if (DetectRTC.browser.isFirefox && typeof mozRTCPeerConnection !== 'undefined' /*&& DetectRTC.browser.version > 39*/) {
|
|
1197
|
-
/*global mozRTCPeerConnection:true */
|
|
1198
|
-
if ('getSenders' in mozRTCPeerConnection.prototype) {
|
|
1199
|
-
isRTPSenderReplaceTracksSupported = true;
|
|
1200
|
-
}
|
|
1201
|
-
} else if (DetectRTC.browser.isChrome && typeof webkitRTCPeerConnection !== 'undefined') {
|
|
1202
|
-
/*global webkitRTCPeerConnection:true */
|
|
1203
|
-
if ('getSenders' in webkitRTCPeerConnection.prototype) {
|
|
1204
|
-
isRTPSenderReplaceTracksSupported = true;
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
DetectRTC.isRTPSenderReplaceTracksSupported = isRTPSenderReplaceTracksSupported;
|
|
1208
|
-
|
|
1209
|
-
//------
|
|
1210
|
-
var isRemoteStreamProcessingSupported = false;
|
|
1211
|
-
if (DetectRTC.browser.isFirefox && DetectRTC.browser.version > 38) {
|
|
1212
|
-
isRemoteStreamProcessingSupported = true;
|
|
1213
|
-
}
|
|
1214
|
-
DetectRTC.isRemoteStreamProcessingSupported = isRemoteStreamProcessingSupported;
|
|
1215
|
-
|
|
1216
|
-
//-------
|
|
1217
|
-
var isApplyConstraintsSupported = false;
|
|
1218
|
-
|
|
1219
|
-
/*global MediaStreamTrack:true */
|
|
1220
|
-
if (typeof MediaStreamTrack !== 'undefined' && 'applyConstraints' in MediaStreamTrack.prototype) {
|
|
1221
|
-
isApplyConstraintsSupported = true;
|
|
1222
|
-
}
|
|
1223
|
-
DetectRTC.isApplyConstraintsSupported = isApplyConstraintsSupported;
|
|
1224
|
-
|
|
1225
|
-
//-------
|
|
1226
|
-
var isMultiMonitorScreenCapturingSupported = false;
|
|
1227
|
-
if (DetectRTC.browser.isFirefox && DetectRTC.browser.version >= 43) {
|
|
1228
|
-
// version 43 merely supports platforms for multi-monitors
|
|
1229
|
-
// version 44 will support exact multi-monitor selection i.e. you can select any monitor for screen capturing.
|
|
1230
|
-
isMultiMonitorScreenCapturingSupported = true;
|
|
1231
|
-
}
|
|
1232
|
-
DetectRTC.isMultiMonitorScreenCapturingSupported = isMultiMonitorScreenCapturingSupported;
|
|
1233
|
-
DetectRTC.isPromisesSupported = !!('Promise' in window);
|
|
1234
|
-
|
|
1235
|
-
// version is generated by "grunt"
|
|
1236
|
-
DetectRTC.version = '1.4.1';
|
|
1237
|
-
if (typeof DetectRTC === 'undefined') {
|
|
1238
|
-
window.DetectRTC = {};
|
|
1239
|
-
}
|
|
1240
|
-
var MediaStream = window.MediaStream;
|
|
1241
|
-
if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {
|
|
1242
|
-
MediaStream = webkitMediaStream;
|
|
1243
|
-
}
|
|
1244
|
-
if (typeof MediaStream !== 'undefined' && typeof MediaStream === 'function') {
|
|
1245
|
-
DetectRTC.MediaStream = Object.keys(MediaStream.prototype);
|
|
1246
|
-
} else DetectRTC.MediaStream = false;
|
|
1247
|
-
if (typeof MediaStreamTrack !== 'undefined') {
|
|
1248
|
-
DetectRTC.MediaStreamTrack = Object.keys(MediaStreamTrack.prototype);
|
|
1249
|
-
} else DetectRTC.MediaStreamTrack = false;
|
|
1250
|
-
var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
|
|
1251
|
-
if (typeof RTCPeerConnection !== 'undefined') {
|
|
1252
|
-
DetectRTC.RTCPeerConnection = Object.keys(RTCPeerConnection.prototype);
|
|
1253
|
-
} else DetectRTC.RTCPeerConnection = false;
|
|
1254
|
-
window.DetectRTC = DetectRTC;
|
|
1255
|
-
{
|
|
1256
|
-
module.exports = DetectRTC;
|
|
1257
|
-
}
|
|
1258
|
-
})();
|
|
1259
|
-
})(DetectRTC);
|
|
1260
|
-
|
|
1261
|
-
var MEDIA = 'MEDIA';
|
|
1262
|
-
var DEVICE = 'DEVICE';
|
|
1263
|
-
var MEDIA_STREAM_TRACK = 'MEDIA_STREAM_TRACK';
|
|
1264
|
-
|
|
1265
|
-
var LEVELS = {
|
|
1266
|
-
error: 1,
|
|
1267
|
-
warn: 2,
|
|
1268
|
-
info: 3,
|
|
1269
|
-
debug: 4
|
|
1270
|
-
};
|
|
1271
|
-
var logFormat = (level, logDetails) => {
|
|
1272
|
-
var {
|
|
1273
|
-
ID,
|
|
1274
|
-
mediaType,
|
|
1275
|
-
action,
|
|
1276
|
-
description,
|
|
1277
|
-
error
|
|
1278
|
-
} = logDetails;
|
|
1279
|
-
var timestamp = new Date().toISOString();
|
|
1280
|
-
var errorText = error ? error.stack ? "".concat(error.message, ": ").concat(error.stack) : "".concat(error) : '';
|
|
1281
|
-
return "".concat(timestamp, " ").concat(level, " ").concat(ID || '', " ").concat(mediaType, " ").concat(action, " ").concat(description, " ").concat(errorText).replace(/\s+/g, ' ').trim();
|
|
1282
|
-
};
|
|
1283
|
-
var currentLevel = 'error';
|
|
1284
|
-
var log$3 = (level, args) => {
|
|
1285
|
-
if (LEVELS[level] <= LEVELS[currentLevel]) {
|
|
1286
|
-
console.log(logFormat(level, args));
|
|
1287
|
-
}
|
|
1288
|
-
};
|
|
1289
|
-
var logger$4 = {
|
|
1290
|
-
info: args => log$3('info', args),
|
|
1291
|
-
warn: args => log$3('warn', args),
|
|
1292
|
-
error: args => log$3('error', args),
|
|
1293
|
-
debug: args => log$3('debug', args)
|
|
1294
|
-
};
|
|
1295
|
-
var _loop = function _loop(level) {
|
|
1296
|
-
logger$4[level] = logInfo => {
|
|
1297
|
-
var {
|
|
1298
|
-
ID,
|
|
1299
|
-
mediaType,
|
|
1300
|
-
action,
|
|
1301
|
-
description,
|
|
1302
|
-
error
|
|
1303
|
-
} = logInfo;
|
|
1304
|
-
currentLevel = level;
|
|
1305
|
-
return log$3(level, {
|
|
1306
|
-
ID,
|
|
1307
|
-
mediaType,
|
|
1308
|
-
action,
|
|
1309
|
-
description,
|
|
1310
|
-
error
|
|
1311
|
-
});
|
|
1312
|
-
};
|
|
1313
|
-
};
|
|
1314
|
-
for (var level of ['info', 'warn', 'error', 'debug']) {
|
|
1315
|
-
_loop(level);
|
|
1316
|
-
}
|
|
1317
|
-
|
|
1318
21
|
var domain;
|
|
1319
22
|
|
|
1320
23
|
// This constructor is used to store event handlers. Instantiating this is
|
|
@@ -1787,6 +490,63 @@ function unwrapListeners$3(arr) {
|
|
|
1787
490
|
return ret;
|
|
1788
491
|
}
|
|
1789
492
|
|
|
493
|
+
var MEDIA = 'MEDIA';
|
|
494
|
+
var DEVICE = 'DEVICE';
|
|
495
|
+
var MEDIA_STREAM_TRACK = 'MEDIA_STREAM_TRACK';
|
|
496
|
+
|
|
497
|
+
var LEVELS = {
|
|
498
|
+
error: 1,
|
|
499
|
+
warn: 2,
|
|
500
|
+
info: 3,
|
|
501
|
+
debug: 4
|
|
502
|
+
};
|
|
503
|
+
var logFormat = (level, logDetails) => {
|
|
504
|
+
var {
|
|
505
|
+
ID,
|
|
506
|
+
mediaType,
|
|
507
|
+
action,
|
|
508
|
+
description,
|
|
509
|
+
error
|
|
510
|
+
} = logDetails;
|
|
511
|
+
var timestamp = new Date().toISOString();
|
|
512
|
+
var errorText = error ? error.stack ? "".concat(error.message, ": ").concat(error.stack) : "".concat(error) : '';
|
|
513
|
+
return "".concat(timestamp, " ").concat(level, " ").concat(ID || '', " ").concat(mediaType, " ").concat(action, " ").concat(description, " ").concat(errorText).replace(/\s+/g, ' ').trim();
|
|
514
|
+
};
|
|
515
|
+
var currentLevel = 'error';
|
|
516
|
+
var log$3 = (level, args) => {
|
|
517
|
+
if (LEVELS[level] <= LEVELS[currentLevel]) {
|
|
518
|
+
console.log(logFormat(level, args));
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
var logger$4 = {
|
|
522
|
+
info: args => log$3('info', args),
|
|
523
|
+
warn: args => log$3('warn', args),
|
|
524
|
+
error: args => log$3('error', args),
|
|
525
|
+
debug: args => log$3('debug', args)
|
|
526
|
+
};
|
|
527
|
+
var _loop = function _loop(level) {
|
|
528
|
+
logger$4[level] = logInfo => {
|
|
529
|
+
var {
|
|
530
|
+
ID,
|
|
531
|
+
mediaType,
|
|
532
|
+
action,
|
|
533
|
+
description,
|
|
534
|
+
error
|
|
535
|
+
} = logInfo;
|
|
536
|
+
currentLevel = level;
|
|
537
|
+
return log$3(level, {
|
|
538
|
+
ID,
|
|
539
|
+
mediaType,
|
|
540
|
+
action,
|
|
541
|
+
description,
|
|
542
|
+
error
|
|
543
|
+
});
|
|
544
|
+
};
|
|
545
|
+
};
|
|
546
|
+
for (var level of ['info', 'warn', 'error', 'debug']) {
|
|
547
|
+
_loop(level);
|
|
548
|
+
}
|
|
549
|
+
|
|
1790
550
|
function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); }
|
|
1791
551
|
function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
1792
552
|
var DeviceKinds;
|
|
@@ -2366,7 +1126,7 @@ function _deviceChangePublisher() {
|
|
|
2366
1126
|
});
|
|
2367
1127
|
return _deviceChangePublisher.apply(this, arguments);
|
|
2368
1128
|
}
|
|
2369
|
-
function on(_x4, _x5) {
|
|
1129
|
+
function on$1(_x4, _x5) {
|
|
2370
1130
|
return _on.apply(this, arguments);
|
|
2371
1131
|
}
|
|
2372
1132
|
function _on() {
|
|
@@ -2385,7 +1145,7 @@ function _on() {
|
|
|
2385
1145
|
});
|
|
2386
1146
|
return _on.apply(this, arguments);
|
|
2387
1147
|
}
|
|
2388
|
-
var off = (eventName, listener) => {
|
|
1148
|
+
var off$1 = (eventName, listener) => {
|
|
2389
1149
|
logger$4.debug({
|
|
2390
1150
|
mediaType: MEDIA,
|
|
2391
1151
|
action: 'off()',
|
|
@@ -2680,6 +1440,232 @@ var Error$1 = /*#__PURE__*/Object.freeze({
|
|
|
2680
1440
|
|
|
2681
1441
|
class EventEmitter$5 extends EventEmitter$6 {}
|
|
2682
1442
|
|
|
1443
|
+
var global$1 = (typeof global !== "undefined" ? global :
|
|
1444
|
+
typeof self !== "undefined" ? self :
|
|
1445
|
+
typeof window !== "undefined" ? window : {});
|
|
1446
|
+
|
|
1447
|
+
// shim for using process in browser
|
|
1448
|
+
// based off https://github.com/defunctzombie/node-process/blob/master/browser.js
|
|
1449
|
+
|
|
1450
|
+
function defaultSetTimout() {
|
|
1451
|
+
throw new Error('setTimeout has not been defined');
|
|
1452
|
+
}
|
|
1453
|
+
function defaultClearTimeout () {
|
|
1454
|
+
throw new Error('clearTimeout has not been defined');
|
|
1455
|
+
}
|
|
1456
|
+
var cachedSetTimeout = defaultSetTimout;
|
|
1457
|
+
var cachedClearTimeout = defaultClearTimeout;
|
|
1458
|
+
if (typeof global$1.setTimeout === 'function') {
|
|
1459
|
+
cachedSetTimeout = setTimeout;
|
|
1460
|
+
}
|
|
1461
|
+
if (typeof global$1.clearTimeout === 'function') {
|
|
1462
|
+
cachedClearTimeout = clearTimeout;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
function runTimeout(fun) {
|
|
1466
|
+
if (cachedSetTimeout === setTimeout) {
|
|
1467
|
+
//normal enviroments in sane situations
|
|
1468
|
+
return setTimeout(fun, 0);
|
|
1469
|
+
}
|
|
1470
|
+
// if setTimeout wasn't available but was latter defined
|
|
1471
|
+
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
|
1472
|
+
cachedSetTimeout = setTimeout;
|
|
1473
|
+
return setTimeout(fun, 0);
|
|
1474
|
+
}
|
|
1475
|
+
try {
|
|
1476
|
+
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
1477
|
+
return cachedSetTimeout(fun, 0);
|
|
1478
|
+
} catch(e){
|
|
1479
|
+
try {
|
|
1480
|
+
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
1481
|
+
return cachedSetTimeout.call(null, fun, 0);
|
|
1482
|
+
} catch(e){
|
|
1483
|
+
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
|
1484
|
+
return cachedSetTimeout.call(this, fun, 0);
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
}
|
|
1490
|
+
function runClearTimeout(marker) {
|
|
1491
|
+
if (cachedClearTimeout === clearTimeout) {
|
|
1492
|
+
//normal enviroments in sane situations
|
|
1493
|
+
return clearTimeout(marker);
|
|
1494
|
+
}
|
|
1495
|
+
// if clearTimeout wasn't available but was latter defined
|
|
1496
|
+
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
|
1497
|
+
cachedClearTimeout = clearTimeout;
|
|
1498
|
+
return clearTimeout(marker);
|
|
1499
|
+
}
|
|
1500
|
+
try {
|
|
1501
|
+
// when when somebody has screwed with setTimeout but no I.E. maddness
|
|
1502
|
+
return cachedClearTimeout(marker);
|
|
1503
|
+
} catch (e){
|
|
1504
|
+
try {
|
|
1505
|
+
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
|
1506
|
+
return cachedClearTimeout.call(null, marker);
|
|
1507
|
+
} catch (e){
|
|
1508
|
+
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
|
1509
|
+
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
|
1510
|
+
return cachedClearTimeout.call(this, marker);
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
}
|
|
1517
|
+
var queue$2 = [];
|
|
1518
|
+
var draining = false;
|
|
1519
|
+
var currentQueue;
|
|
1520
|
+
var queueIndex = -1;
|
|
1521
|
+
|
|
1522
|
+
function cleanUpNextTick() {
|
|
1523
|
+
if (!draining || !currentQueue) {
|
|
1524
|
+
return;
|
|
1525
|
+
}
|
|
1526
|
+
draining = false;
|
|
1527
|
+
if (currentQueue.length) {
|
|
1528
|
+
queue$2 = currentQueue.concat(queue$2);
|
|
1529
|
+
} else {
|
|
1530
|
+
queueIndex = -1;
|
|
1531
|
+
}
|
|
1532
|
+
if (queue$2.length) {
|
|
1533
|
+
drainQueue();
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
function drainQueue() {
|
|
1538
|
+
if (draining) {
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1541
|
+
var timeout = runTimeout(cleanUpNextTick);
|
|
1542
|
+
draining = true;
|
|
1543
|
+
|
|
1544
|
+
var len = queue$2.length;
|
|
1545
|
+
while(len) {
|
|
1546
|
+
currentQueue = queue$2;
|
|
1547
|
+
queue$2 = [];
|
|
1548
|
+
while (++queueIndex < len) {
|
|
1549
|
+
if (currentQueue) {
|
|
1550
|
+
currentQueue[queueIndex].run();
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
queueIndex = -1;
|
|
1554
|
+
len = queue$2.length;
|
|
1555
|
+
}
|
|
1556
|
+
currentQueue = null;
|
|
1557
|
+
draining = false;
|
|
1558
|
+
runClearTimeout(timeout);
|
|
1559
|
+
}
|
|
1560
|
+
function nextTick(fun) {
|
|
1561
|
+
var args = new Array(arguments.length - 1);
|
|
1562
|
+
if (arguments.length > 1) {
|
|
1563
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
1564
|
+
args[i - 1] = arguments[i];
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
queue$2.push(new Item(fun, args));
|
|
1568
|
+
if (queue$2.length === 1 && !draining) {
|
|
1569
|
+
runTimeout(drainQueue);
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
// v8 likes predictible objects
|
|
1573
|
+
function Item(fun, array) {
|
|
1574
|
+
this.fun = fun;
|
|
1575
|
+
this.array = array;
|
|
1576
|
+
}
|
|
1577
|
+
Item.prototype.run = function () {
|
|
1578
|
+
this.fun.apply(null, this.array);
|
|
1579
|
+
};
|
|
1580
|
+
var title = 'browser';
|
|
1581
|
+
var platform = 'browser';
|
|
1582
|
+
var browser = true;
|
|
1583
|
+
var env = {};
|
|
1584
|
+
var argv = [];
|
|
1585
|
+
var version = ''; // empty string to avoid regexp issues
|
|
1586
|
+
var versions = {};
|
|
1587
|
+
var release = {};
|
|
1588
|
+
var config = {};
|
|
1589
|
+
|
|
1590
|
+
function noop() {}
|
|
1591
|
+
|
|
1592
|
+
var on = noop;
|
|
1593
|
+
var addListener = noop;
|
|
1594
|
+
var once$4 = noop;
|
|
1595
|
+
var off = noop;
|
|
1596
|
+
var removeListener = noop;
|
|
1597
|
+
var removeAllListeners = noop;
|
|
1598
|
+
var emit = noop;
|
|
1599
|
+
|
|
1600
|
+
function binding(name) {
|
|
1601
|
+
throw new Error('process.binding is not supported');
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
function cwd () { return '/' }
|
|
1605
|
+
function chdir (dir) {
|
|
1606
|
+
throw new Error('process.chdir is not supported');
|
|
1607
|
+
}function umask() { return 0; }
|
|
1608
|
+
|
|
1609
|
+
// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
|
|
1610
|
+
var performance$1 = global$1.performance || {};
|
|
1611
|
+
var performanceNow =
|
|
1612
|
+
performance$1.now ||
|
|
1613
|
+
performance$1.mozNow ||
|
|
1614
|
+
performance$1.msNow ||
|
|
1615
|
+
performance$1.oNow ||
|
|
1616
|
+
performance$1.webkitNow ||
|
|
1617
|
+
function(){ return (new Date()).getTime() };
|
|
1618
|
+
|
|
1619
|
+
// generate timestamp or delta
|
|
1620
|
+
// see http://nodejs.org/api/process.html#process_process_hrtime
|
|
1621
|
+
function hrtime(previousTimestamp){
|
|
1622
|
+
var clocktime = performanceNow.call(performance$1)*1e-3;
|
|
1623
|
+
var seconds = Math.floor(clocktime);
|
|
1624
|
+
var nanoseconds = Math.floor((clocktime%1)*1e9);
|
|
1625
|
+
if (previousTimestamp) {
|
|
1626
|
+
seconds = seconds - previousTimestamp[0];
|
|
1627
|
+
nanoseconds = nanoseconds - previousTimestamp[1];
|
|
1628
|
+
if (nanoseconds<0) {
|
|
1629
|
+
seconds--;
|
|
1630
|
+
nanoseconds += 1e9;
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
return [seconds,nanoseconds]
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
var startTime = new Date();
|
|
1637
|
+
function uptime() {
|
|
1638
|
+
var currentTime = new Date();
|
|
1639
|
+
var dif = currentTime - startTime;
|
|
1640
|
+
return dif / 1000;
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
var browser$1 = {
|
|
1644
|
+
nextTick: nextTick,
|
|
1645
|
+
title: title,
|
|
1646
|
+
browser: browser,
|
|
1647
|
+
env: env,
|
|
1648
|
+
argv: argv,
|
|
1649
|
+
version: version,
|
|
1650
|
+
versions: versions,
|
|
1651
|
+
on: on,
|
|
1652
|
+
addListener: addListener,
|
|
1653
|
+
once: once$4,
|
|
1654
|
+
off: off,
|
|
1655
|
+
removeListener: removeListener,
|
|
1656
|
+
removeAllListeners: removeAllListeners,
|
|
1657
|
+
emit: emit,
|
|
1658
|
+
binding: binding,
|
|
1659
|
+
cwd: cwd,
|
|
1660
|
+
chdir: chdir,
|
|
1661
|
+
umask: umask,
|
|
1662
|
+
hrtime: hrtime,
|
|
1663
|
+
platform: platform,
|
|
1664
|
+
release: release,
|
|
1665
|
+
config: config,
|
|
1666
|
+
uptime: uptime
|
|
1667
|
+
};
|
|
1668
|
+
|
|
2683
1669
|
function _mergeNamespaces$1(n,m){m.forEach(function(e){e&&typeof e!=='string'&&!Array.isArray(e)&&Object.keys(e).forEach(function(k){if(k!=='default'&&!(k in n)){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function get(){return e[k];}});}});});return Object.freeze(n);}/******************************************************************************
|
|
2684
1670
|
Copyright (c) Microsoft Corporation.
|
|
2685
1671
|
|
|
@@ -2742,7 +1728,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
|
|
|
2742
1728
|
// `options` hash can be used to configure the default logLevel and provide a custom message formatter.
|
|
2743
1729
|
Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
|
|
2744
1730
|
Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
|
|
2745
|
-
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1$1);})(logger$1$1);var Logger$2=logger$1$1.exports;var DEFAULT_LOGGER_NAME$1='webrtc-core';var logger$3=Logger$2.get(DEFAULT_LOGGER_NAME$1);Logger$2.useDefaults({defaultLevel:Logger$2.DEBUG,/* eslint-disable-next-line jsdoc/require-jsdoc */formatter:(messages,context)=>{messages.unshift("[".concat(context.name,"]"));}});var DeviceKind;(function(DeviceKind){DeviceKind["AudioInput"]="audioinput";DeviceKind["AudioOutput"]="audiooutput";DeviceKind["VideoInput"]="videoinput";})(DeviceKind||(DeviceKind={}));/**
|
|
1731
|
+
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1$1);})(logger$1$1);var Logger$2=logger$1$1.exports;var DEFAULT_LOGGER_NAME$1='webrtc-core';var logger$3=Logger$2.get(DEFAULT_LOGGER_NAME$1);Logger$2.useDefaults({defaultLevel:Logger$2.DEBUG,/* eslint-disable-next-line jsdoc/require-jsdoc */formatter:(messages,context)=>{messages.unshift("[".concat(context.name,"]"));}});var DeviceKind$1;(function(DeviceKind){DeviceKind["AudioInput"]="audioinput";DeviceKind["AudioOutput"]="audiooutput";DeviceKind["VideoInput"]="videoinput";})(DeviceKind$1||(DeviceKind$1={}));/**
|
|
2746
1732
|
* Prompts the user for permission to use a media input which produces a MediaStream with tracks
|
|
2747
1733
|
* containing the requested types of media.
|
|
2748
1734
|
*
|
|
@@ -2776,7 +1762,7 @@ if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger
|
|
|
2776
1762
|
* @throws An error if camera or microphone aren't available options for query() (Firefox), or if
|
|
2777
1763
|
* navigator.permissions is undefined (Safari and others).
|
|
2778
1764
|
* @returns Array of Permission Status objects.
|
|
2779
|
-
*/function checkNavigatorPermissions(deviceKinds){return __awaiter$2(this,void 0,void 0,function*(){var permissionRequests=[];if(deviceKinds.includes(DeviceKind.VideoInput)){permissionRequests.push(navigator.permissions.query({name:'camera'}));}if(deviceKinds.includes(DeviceKind.AudioInput)){permissionRequests.push(navigator.permissions.query({name:'microphone'}));}return Promise.all(permissionRequests);});}/**
|
|
1765
|
+
*/function checkNavigatorPermissions(deviceKinds){return __awaiter$2(this,void 0,void 0,function*(){var permissionRequests=[];if(deviceKinds.includes(DeviceKind$1.VideoInput)){permissionRequests.push(navigator.permissions.query({name:'camera'}));}if(deviceKinds.includes(DeviceKind$1.AudioInput)){permissionRequests.push(navigator.permissions.query({name:'microphone'}));}return Promise.all(permissionRequests);});}/**
|
|
2780
1766
|
* Check to see if the user has granted the application permission to use their devices.
|
|
2781
1767
|
*
|
|
2782
1768
|
* @param deviceKinds - Array of DeviceKind items.
|
|
@@ -2791,11 +1777,11 @@ return devices.filter(device=>deviceKinds.includes(device.kind)).every(device=>d
|
|
|
2791
1777
|
* @param callback - Function that will be executed while device permissions are granted. After this
|
|
2792
1778
|
* returns, permissions (for example device labels in Firefox) may not be available anymore.
|
|
2793
1779
|
* @returns The callback's response.
|
|
2794
|
-
*/function ensureDevicePermissions(deviceKinds,callback){return __awaiter$2(this,void 0,void 0,function*(){try{var hasDevicePermissions=yield checkDevicePermissions(deviceKinds);if(!hasDevicePermissions){var stream=yield getUserMedia({audio:deviceKinds.includes(DeviceKind.AudioInput),video:deviceKinds.includes(DeviceKind.VideoInput)});// Callback is here to call a function while an active capture exists, so that the browser
|
|
1780
|
+
*/function ensureDevicePermissions(deviceKinds,callback){return __awaiter$2(this,void 0,void 0,function*(){try{var hasDevicePermissions=yield checkDevicePermissions(deviceKinds);if(!hasDevicePermissions){var stream=yield getUserMedia({audio:deviceKinds.includes(DeviceKind$1.AudioInput),video:deviceKinds.includes(DeviceKind$1.VideoInput)});// Callback is here to call a function while an active capture exists, so that the browser
|
|
2795
1781
|
// (Firefox) will allow the user to access device information.
|
|
2796
1782
|
var callbackRes=yield callback();// Stop tracks in the stream so the browser (Safari) will know that there is not an active
|
|
2797
1783
|
// stream running.
|
|
2798
|
-
stream.getTracks().forEach(track=>track.stop());return callbackRes;}return callback();}catch(e){logger$3.error(e);throw new Error('Failed to ensure device permissions.');}});}var media=/*#__PURE__*/Object.freeze({__proto__:null,get DeviceKind(){return DeviceKind;},getUserMedia:getUserMedia,getDisplayMedia:getDisplayMedia,enumerateDevices:enumerateDevices,setOnDeviceChangeHandler:setOnDeviceChangeHandler$1,checkDevicePermissions:checkDevicePermissions,ensureDevicePermissions:ensureDevicePermissions});var WebrtcCoreErrorType;(function(WebrtcCoreErrorType){WebrtcCoreErrorType["DEVICE_PERMISSION_DENIED"]="DEVICE_PERMISSION_DENIED";WebrtcCoreErrorType["CREATE_STREAM_FAILED"]="CREATE_STREAM_FAILED";WebrtcCoreErrorType["ADD_EFFECT_FAILED"]="ADD_EFFECT_FAILED";})(WebrtcCoreErrorType||(WebrtcCoreErrorType={}));/**
|
|
1784
|
+
stream.getTracks().forEach(track=>track.stop());return callbackRes;}return callback();}catch(e){logger$3.error(e);throw new Error('Failed to ensure device permissions.');}});}var media=/*#__PURE__*/Object.freeze({__proto__:null,get DeviceKind(){return DeviceKind$1;},getUserMedia:getUserMedia,getDisplayMedia:getDisplayMedia,enumerateDevices:enumerateDevices,setOnDeviceChangeHandler:setOnDeviceChangeHandler$1,checkDevicePermissions:checkDevicePermissions,ensureDevicePermissions:ensureDevicePermissions});var WebrtcCoreErrorType;(function(WebrtcCoreErrorType){WebrtcCoreErrorType["DEVICE_PERMISSION_DENIED"]="DEVICE_PERMISSION_DENIED";WebrtcCoreErrorType["CREATE_STREAM_FAILED"]="CREATE_STREAM_FAILED";WebrtcCoreErrorType["ADD_EFFECT_FAILED"]="ADD_EFFECT_FAILED";})(WebrtcCoreErrorType||(WebrtcCoreErrorType={}));/**
|
|
2799
1785
|
* Represents a WebRTC core error, which contains error type and error message.
|
|
2800
1786
|
*/class WebrtcCoreError{/**
|
|
2801
1787
|
* Creates new error.
|
|
@@ -2839,19 +1825,19 @@ localSystemAudioStream=new systemAudioStreamConstructor(new MediaStream(stream.g
|
|
|
2839
1825
|
*
|
|
2840
1826
|
* @param deviceKind - Optional filter to return a specific device kind.
|
|
2841
1827
|
* @returns List of media devices in an array of MediaDeviceInfo objects.
|
|
2842
|
-
*/function getDevices(deviceKind){return __awaiter$2(this,void 0,void 0,function*(){var devices;try{devices=yield ensureDevicePermissions([DeviceKind.AudioInput,DeviceKind.VideoInput],enumerateDevices);}catch(error){throw new WebrtcCoreError(WebrtcCoreErrorType.DEVICE_PERMISSION_DENIED,'Failed to ensure device permissions');}return devices.filter(v=>deviceKind?v.kind===deviceKind:true);});}/**
|
|
1828
|
+
*/function getDevices(deviceKind){return __awaiter$2(this,void 0,void 0,function*(){var devices;try{devices=yield ensureDevicePermissions([DeviceKind$1.AudioInput,DeviceKind$1.VideoInput],enumerateDevices);}catch(error){throw new WebrtcCoreError(WebrtcCoreErrorType.DEVICE_PERMISSION_DENIED,'Failed to ensure device permissions');}return devices.filter(v=>deviceKind?v.kind===deviceKind:true);});}/**
|
|
2843
1829
|
* Helper function to get a list of microphone devices.
|
|
2844
1830
|
*
|
|
2845
1831
|
* @returns List of microphone devices in an array of MediaDeviceInfo objects.
|
|
2846
|
-
*/function getAudioInputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind.AudioInput);});}/**
|
|
1832
|
+
*/function getAudioInputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind$1.AudioInput);});}/**
|
|
2847
1833
|
* Helper function to get a list of speaker devices.
|
|
2848
1834
|
*
|
|
2849
1835
|
* @returns List of speaker devices in an array of MediaDeviceInfo objects.
|
|
2850
|
-
*/function getAudioOutputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind.AudioOutput);});}/**
|
|
1836
|
+
*/function getAudioOutputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind$1.AudioOutput);});}/**
|
|
2851
1837
|
* Helper function to get a list of camera devices.
|
|
2852
1838
|
*
|
|
2853
1839
|
* @returns List of camera devices in an array of MediaDeviceInfo objects.
|
|
2854
|
-
*/function getVideoInputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind.VideoInput);});}/**
|
|
1840
|
+
*/function getVideoInputDevices(){return __awaiter$2(this,void 0,void 0,function*(){return getDevices(DeviceKind$1.VideoInput);});}/**
|
|
2855
1841
|
* Export the setOnDeviceChangeHandler method directly from the core lib.
|
|
2856
1842
|
*/var {setOnDeviceChangeHandler}=media;var events$1$1={exports:{}};var R$1$1=typeof Reflect==='object'?Reflect:null;var ReflectApply$1$1=R$1$1&&typeof R$1$1.apply==='function'?R$1$1.apply:function ReflectApply(target,receiver,args){return Function.prototype.apply.call(target,receiver,args);};var ReflectOwnKeys$1$1;if(R$1$1&&typeof R$1$1.ownKeys==='function'){ReflectOwnKeys$1$1=R$1$1.ownKeys;}else if(Object.getOwnPropertySymbols){ReflectOwnKeys$1$1=function ReflectOwnKeys(target){return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));};}else {ReflectOwnKeys$1$1=function ReflectOwnKeys(target){return Object.getOwnPropertyNames(target);};}function ProcessEmitWarning$1$1(warning){if(console&&console.warn)console.warn(warning);}var NumberIsNaN$1$1=Number.isNaN||function NumberIsNaN(value){return value!==value;};function EventEmitter$1$1(){EventEmitter$1$1.init.call(this);}events$1$1.exports=EventEmitter$1$1;events$1$1.exports.once=once$1$1;// Backwards-compat with node 0.10.x
|
|
2857
1843
|
EventEmitter$1$1.EventEmitter=EventEmitter$1$1;EventEmitter$1$1.prototype._events=undefined;EventEmitter$1$1.prototype._eventsCount=0;EventEmitter$1$1.prototype._maxListeners=undefined;// By default EventEmitters will print a warning if more than 10 listeners are
|
|
@@ -3699,7 +2685,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
|
|
|
3699
2685
|
// `options` hash can be used to configure the default logLevel and provide a custom message formatter.
|
|
3700
2686
|
Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
|
|
3701
2687
|
Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
|
|
3702
|
-
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$2);})(logger$2);var Logger$1=logger$2.exports;Logger$1.useDefaults({defaultLevel:Logger$1.DEBUG,formatter:(messages,context)=>{messages.unshift("[".concat(context.name,"] "));}});var MediaFamily;(function(MediaFamily){MediaFamily["Audio"]="AUDIO";MediaFamily["Video"]="VIDEO";})(MediaFamily||(MediaFamily={}));var MediaContent;(function(MediaContent){MediaContent["Main"]="MAIN";MediaContent["Slides"]="SLIDES";})(MediaContent||(MediaContent={}));var Policy;(function(Policy){Policy["ActiveSpeaker"]="active-speaker";Policy["ReceiverSelected"]="receiver-selected";})(Policy||(Policy={}));var MediaType;(function(MediaType){MediaType["VideoMain"]="VIDEO-MAIN";MediaType["VideoSlides"]="VIDEO-SLIDES";MediaType["AudioMain"]="AUDIO-MAIN";MediaType["AudioSlides"]="AUDIO-SLIDES";})(MediaType||(MediaType={}));function randomInteger(min,max){return Math.floor(Math.random()*(max-min+1))+min;}function generateSceneId(){return randomInteger(0,0x7fffff);}function generateCsi(mediaFamily,sceneId){var av;if(mediaFamily===MediaFamily.Audio){av=0;}else {av=1;}return sceneId<<8|av;}function getMediaType(mediaFamily,mediaContent){if(mediaFamily===MediaFamily.Video&&mediaContent===MediaContent.Main){return MediaType.VideoMain;}if(mediaFamily===MediaFamily.Video&&mediaContent===MediaContent.Slides){return MediaType.VideoSlides;}if(mediaFamily===MediaFamily.Audio&&mediaContent===MediaContent.Main){return MediaType.AudioMain;}return MediaType.AudioSlides;}function getMediaFamily(mediaType){return [MediaType.VideoMain,MediaType.VideoSlides].includes(mediaType)?MediaFamily.Video:MediaFamily.Audio;}function getMediaContent(mediaType){return [MediaType.VideoMain,MediaType.AudioMain].includes(mediaType)?MediaContent.Main:MediaContent.Slides;}var truthyOrZero=value=>value===0||value;function arraysAreEqual(left,right,predicate){if(left.length!==right.length){return false;}for(var i=0;i<left.length;i+=1){if(!predicate(left[i],right[i])){return false;}}return true;}class ActiveSpeakerInfo{constructor(priority,crossPriorityDuplication,crossPolicyDuplication,preferLiveVideo,namedMediaGroups){this.priority=priority;this.crossPriorityDuplication=crossPriorityDuplication;this.crossPolicyDuplication=crossPolicyDuplication;this.preferLiveVideo=preferLiveVideo;this.namedMediaGroups=namedMediaGroups;}toString(){return "ActiveSpeakerInfo(priority=".concat(this.priority,", crossPriorityDuplication=").concat(this.crossPriorityDuplication,", crossPolicyDuplication=").concat(this.crossPolicyDuplication,", preferLiveVideo=").concat(this.preferLiveVideo,"), namedMediaGroups=").concat(this.namedMediaGroups);}}function isValidActiveSpeakerInfo(msg){var maybeActiveSpeakerInfo=msg;return Boolean('priority'in maybeActiveSpeakerInfo&&'crossPriorityDuplication'in maybeActiveSpeakerInfo&&'crossPolicyDuplication'in maybeActiveSpeakerInfo&&'preferLiveVideo'in maybeActiveSpeakerInfo);}function areNamedMediaGroupArraysEqual(left,right){if(left===undefined||right===undefined){return left===right;}return arraysAreEqual(left,right,(l,r)=>l.type===r.type&&l.value===r.value);}function areActiveSpeakerInfosEqual(left,right){return left.priority===right.priority&&left.crossPriorityDuplication===right.crossPriorityDuplication&&left.crossPolicyDuplication===right.crossPolicyDuplication&&left.preferLiveVideo===right.preferLiveVideo&&areNamedMediaGroupArraysEqual(left.namedMediaGroups,right.namedMediaGroups);}function isValidActiveSpeakerNotificationMsg(msg){var maybeActiveSpeakerNotificationMsg=msg;return Boolean(maybeActiveSpeakerNotificationMsg.seqNum&&maybeActiveSpeakerNotificationMsg.csis);}var HomerMsgType;(function(HomerMsgType){HomerMsgType["Multistream"]="multistream";})(HomerMsgType||(HomerMsgType={}));class HomerMsg{constructor(msgType,payload){this.msgType=msgType;this.payload=payload;}static fromJson(data){if(!data.msgType||!data.payload){return null;}return new HomerMsg(data.msgType,data.payload);}}var JmpMsgType;(function(JmpMsgType){JmpMsgType["MediaRequest"]="mediaRequest";JmpMsgType["MediaRequestAck"]="mediaRequestAck";JmpMsgType["MediaRequestStatus"]="mediaRequestStatus";JmpMsgType["MediaRequestStatusAck"]="mediaRequestStatusAck";JmpMsgType["SourceAdvertisement"]="sourceAdvertisement";JmpMsgType["SourceAdvertisementAck"]="sourceAdvertisementAck";JmpMsgType["ActiveSpeakerNotification"]="activeSpeakerNotification";})(JmpMsgType||(JmpMsgType={}));class JmpMsg{constructor(mediaFamily,mediaContent,payload){this.mediaFamily=mediaFamily;this.mediaContent=mediaContent;this.payload=payload;}toString(){return "JmpMsg(mediaFamily=".concat(this.mediaFamily,", mediaContent=").concat(this.mediaContent,", payload=").concat(this.payload,")");}}function isValidJmpMsgPayload(msg){var maybeJmpMsgPayload=msg;return Boolean(maybeJmpMsgPayload.msgType&&maybeJmpMsgPayload.payload);}function isValidJmpMsg(msg){var maybeJmpMsg=msg;return Boolean(maybeJmpMsg.mediaContent&&maybeJmpMsg.mediaFamily&&maybeJmpMsg.payload&&isValidJmpMsgPayload(maybeJmpMsg.payload));}class MediaRequestMsg{constructor(seqNum,requests){this.seqNum=seqNum;this.requests=requests;}toString(){return "JmpMediaMsg(seqNum=".concat(this.seqNum,", requests=[").concat(this.requests,"])");}}function isValidMediaRequestMsg(msg){var maybeMediaRequestMsg=msg;return Boolean(maybeMediaRequestMsg.seqNum&&maybeMediaRequestMsg.requests);}class MediaRequestAckMsg{constructor(mediaRequestSeqNum){this.mediaRequestSeqNum=mediaRequestSeqNum;}toString(){return "MediaRequestAckMsg(seqNum=".concat(this.mediaRequestSeqNum,")");}}function isValidMediaRequestAckMsg(msg){var maybeMediaRequestAckMsg=msg;return Boolean(maybeMediaRequestAckMsg.mediaRequestSeqNum);}function isValidStreamId(obj){var maybeStreamId=obj;if(maybeStreamId.mid&&maybeStreamId.ssrc){return false;}return Boolean(maybeStreamId.mid)||Boolean(maybeStreamId.ssrc);}function compareStreamIds(id1,id2){var keys1=Object.keys(id1);var keys2=Object.keys(id2);if(keys1.length!==keys2.length){return false;}return keys1.every(key=>id1[key]===id2[key]);}function isValidStreamInfo(obj){var maybeStreamInfo=obj;return Boolean(maybeStreamInfo.id&&isValidStreamId(maybeStreamInfo.id)&&['no source','invalid source','live','avatar','bandwidth disabled'].includes(maybeStreamInfo.state));}class MediaRequestStatusMsg{constructor(seqNum,streamStates){this.seqNum=seqNum;this.streamStates=streamStates;}}function isValidMediaRequestStatusMsg(msg){var maybeMediaRequestStatusMsg=msg;return Boolean(maybeMediaRequestStatusMsg.seqNum)&&maybeMediaRequestStatusMsg.streamStates&&maybeMediaRequestStatusMsg.streamStates.every(streamInfo=>isValidStreamInfo(streamInfo));}function compareStreamStateArrays(streamStates1,streamStates2){var _a,_b;if(streamStates1.length!==streamStates2.length){return false;}for(var i=0;i<streamStates1.length;i+=1){if(!compareStreamIds(streamStates1[i].id,streamStates2[i].id)){return false;}if(streamStates1[i].state!==streamStates2[i].state){return false;}if(((_a=streamStates1[i])===null||_a===void 0?void 0:_a.csi)!==((_b=streamStates2[i])===null||_b===void 0?void 0:_b.csi)){return false;}}return true;}class MediaRequestStatusAckMsg{constructor(mediaRequestStatusSeqNum){this.mediaRequestStatusSeqNum=mediaRequestStatusSeqNum;}toString(){return "MediaRequestStatusAckMsg(seqNum=".concat(this.mediaRequestStatusSeqNum,")");}}function isValidMediaRequestStatusAckMsg(msg){var maybeMediaRequestStatusAckMsg=msg;return Boolean(maybeMediaRequestStatusAckMsg.mediaRequestStatusSeqNum);}class H264Codec{constructor(maxFs,maxFps,maxMbps,maxWidth,maxHeight){this.maxFs=maxFs;this.maxFps=maxFps;this.maxMbps=maxMbps;this.maxWidth=maxWidth;this.maxHeight=maxHeight;}}function areH264CodecsEqual(left,right){if(left===undefined||right===undefined){return left===right;}return left.maxFs===right.maxFs&&left.maxFps===right.maxFps&&left.maxMbps===right.maxMbps&&left.maxWidth===right.maxWidth&&left.maxHeight===right.maxHeight;}class CodecInfo$1{constructor(payloadType,h264){this.payloadType=payloadType;this.h264=h264;}}function areCodecInfosEqual(left,right){return left.payloadType===right.payloadType&&areH264CodecsEqual(left.h264,right.h264);}class ReceiverSelectedInfo{constructor(csi){this.csi=csi;}toString(){return "ReceiverSelectedInfo(csi=".concat(this.csi,")");}}function isValidReceiverSelectedInfo(msg){var maybeReceiverSelectedInfo=msg;return Boolean(maybeReceiverSelectedInfo.csi);}function areReceiverSelectedInfosEqual(left,right){return left.csi===right.csi;}class SourceAdvertisementMsg{constructor(seqNum,numTotalSources,numLiveSources,namedMediaGroups,videoContentHint){this.seqNum=seqNum;this.numTotalSources=numTotalSources;this.numLiveSources=numLiveSources;this.namedMediaGroups=namedMediaGroups;this.videoContentHint=videoContentHint;}toString(){return "SourceAdvertisement(seqNum=".concat(this.seqNum,", numTotalSources=").concat(this.numTotalSources,", numLiveSources=").concat(this.numLiveSources,", namedMediaGroups=").concat(this.namedMediaGroups,", videoContentHint=").concat(this.videoContentHint);}}function isValidSourceAdvertisementMsg(msg){var maybeSourceAdvertisementMsg=msg;return Boolean(maybeSourceAdvertisementMsg.seqNum&&truthyOrZero(maybeSourceAdvertisementMsg.numTotalSources)&&truthyOrZero(maybeSourceAdvertisementMsg.numLiveSources));}class SourceAdvertisementAckMsg{constructor(sourceAdvertisementSeqNum){this.sourceAdvertisementSeqNum=sourceAdvertisementSeqNum;}toString(){return "SourceAdvertisementAckMsg(sourceAdvertisementSeqNum=".concat(this.sourceAdvertisementSeqNum,")");}}function isValidSourceAdvertisementAckMsg(msg){var maybeSourceAdvertisementAckMsg=msg;return Boolean(maybeSourceAdvertisementAckMsg.sourceAdvertisementSeqNum);}class StreamRequest$1{constructor(policy,policySpecificInfo,ids,maxPayloadBitsPerSecond){var codecInfos=arguments.length>4&&arguments[4]!==undefined?arguments[4]:[];this.policy=policy;this.policySpecificInfo=policySpecificInfo;this.ids=ids;this.maxPayloadBitsPerSecond=maxPayloadBitsPerSecond;this.codecInfos=codecInfos;}toString(){return "Request(policy=".concat(this.policy,", info=").concat(this.policySpecificInfo,", ids=[").concat(this.ids,"], maxPayloadBitsPerSecond=[").concat(this.maxPayloadBitsPerSecond,"], codecInfos=[").concat(this.codecInfos,"])");}}function arePolicySpecificInfosEqual(left,right){if(isValidActiveSpeakerInfo(left)){if(!isValidActiveSpeakerInfo(right)){return false;}return areActiveSpeakerInfosEqual(left,right);}if(isValidReceiverSelectedInfo(left)){if(!isValidReceiverSelectedInfo(right)){return false;}return areReceiverSelectedInfosEqual(left,right);}throw new Error('Invalid PolicySpecificInfo');}function areCodecInfoArraysEqual(left,right){return arraysAreEqual(left,right,areCodecInfosEqual);}function areStreamIdArraysEqual(left,right){return arraysAreEqual(left,right,compareStreamIds);}function areStreamRequestsEqual(left,right){if(left.policy!==right.policy){return false;}if(!arePolicySpecificInfosEqual(left.policySpecificInfo,right.policySpecificInfo)){return false;}if(!areStreamIdArraysEqual(left.ids,right.ids)){return false;}if(left.maxPayloadBitsPerSecond!==right.maxPayloadBitsPerSecond){return false;}if(!areCodecInfoArraysEqual(left.codecInfos,right.codecInfos)){return false;}return true;}class RetransmitHandler{constructor(msg,maxNumRetransmits,retransmitIntervalMs,transmitCallback,expirationCallback){this.timerHandle=undefined;this.msg=msg;this.numRetransmitsLeft=maxNumRetransmits;this.retransmitIntervalMs=retransmitIntervalMs;this.transmitCallback=transmitCallback;this.expirationCallback=expirationCallback;this.scheduleTimer();}onTimer(){var _a;if(this.numRetransmitsLeft>0){--this.numRetransmitsLeft;this.transmitCallback(this.msg);this.scheduleTimer();}else {(_a=this.expirationCallback)===null||_a===void 0?void 0:_a.call(this,this.msg);}}scheduleTimer(){this.timerHandle=window.setTimeout(()=>this.onTimer(),this.retransmitIntervalMs);}cancel(){if(this.timerHandle){clearTimeout(this.timerHandle);}this.timerHandle=undefined;}}var JmpSessionEvents;(function(JmpSessionEvents){JmpSessionEvents["ActiveSpeaker"]="active-speaker";JmpSessionEvents["MediaRequestReceived"]="media-request-received";JmpSessionEvents["MediaRequestStatusReceived"]="media-request-status-received";JmpSessionEvents["SourceAdvertisementReceived"]="source-advertisement-received";})(JmpSessionEvents||(JmpSessionEvents={}));function areStreamRequestArraysEqual(left,right){if(left.length!==right.length){return false;}for(var i=0;i<left.length;i+=1){if(!areStreamRequestsEqual(left[i],right[i])){return false;}}return true;}class JmpSession extends EventEmitter$6{constructor(mediaFamily,mediaContent){var maxNumRetransmits=arguments.length>2&&arguments[2]!==undefined?arguments[2]:200;var retransmitIntervalMs=arguments.length>3&&arguments[3]!==undefined?arguments[3]:250;super();this.currMediaRequestSeqNum=1;this.currSourceAdvertisementSeqNum=1;this.currMediaRequestStatusSeqNum=1;this.txCallback=undefined;this.lastSentMediaRequest=undefined;this.lastSentMediaRequestAck=undefined;this.lastReceivedMediaRequest=undefined;this.mediaFamily=mediaFamily;this.mediaContent=mediaContent;this.logger=Logger$1.get("JmpSession ".concat(this.mediaFamily,"-").concat(this.mediaContent));this.maxNumRetransmits=maxNumRetransmits;this.retransmitIntervalMs=retransmitIntervalMs;}getLogger(){return this.logger;}sendRequests(requests){var _a;var mediaRequestMsg=new MediaRequestMsg(this.currMediaRequestSeqNum,requests);if(!this.lastSentMediaRequest||!areStreamRequestArraysEqual(this.lastSentMediaRequest.msg.requests,requests)){this.sendJmpMsg(JmpMsgType.MediaRequest,mediaRequestMsg);(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.cancel();this.lastSentMediaRequest=new RetransmitHandler(mediaRequestMsg,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent MediaRequest...");this.sendJmpMsg(JmpMsgType.MediaRequest,mediaRequestMsg);},expiredJmpMsg=>{this.logger.warn("Retransmits for message expired: ".concat(expiredJmpMsg));});this.currMediaRequestSeqNum++;}else {this.logger.info("Duplicate MediaRequest detected and will not be sent: ".concat(mediaRequestMsg));}}sendSourceAdvertisement(numTotalSources,numLiveSources,namedMediaGroups,videoContentHint){var sourceAdvertisementMsg=new SourceAdvertisementMsg(this.currSourceAdvertisementSeqNum++,numTotalSources,numLiveSources,namedMediaGroups,videoContentHint);this.sendJmpMsg(JmpMsgType.SourceAdvertisement,sourceAdvertisementMsg);this.lastSentSourceAdvertisement=new RetransmitHandler(sourceAdvertisementMsg,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent SourceAdvertisement...");this.sendJmpMsg(JmpMsgType.SourceAdvertisement,sourceAdvertisementMsg);},expiredMsg=>{this.logger.warn("Retransmits for message expired: ",expiredMsg);});}sendMediaRequestStatus(streamStates){var _a,_b;var filteredStreamStates=streamStates.filter(streamState=>{var _a;return (_a=this.lastReceivedMediaRequest)===null||_a===void 0?void 0:_a.requests.some(req=>req.ids.find(streamId=>compareStreamIds(streamId,streamState.id)));});var mediaRequestStatus=new MediaRequestStatusMsg(this.currMediaRequestStatusSeqNum,filteredStreamStates);if(!((_a=this.lastSentMediaRequestStatus)===null||_a===void 0?void 0:_a.msg.streamStates)||!compareStreamStateArrays(filteredStreamStates,this.lastSentMediaRequestStatus.msg.streamStates)){this.sendJmpMsg(JmpMsgType.MediaRequestStatus,mediaRequestStatus);(_b=this.lastSentMediaRequestStatus)===null||_b===void 0?void 0:_b.cancel();this.lastSentMediaRequestStatus=new RetransmitHandler(mediaRequestStatus,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent MediaRequestStatus...");this.sendJmpMsg(JmpMsgType.MediaRequestStatus,mediaRequestStatus);},expiredMsg=>{this.logger.warn("Retransmits for message expired: ",expiredMsg);});this.currMediaRequestStatusSeqNum++;}else {this.logger.info("Duplicate MediaRequestStatus detected and will not be sent: ",mediaRequestStatus);}}receive(jmpMsg){if(jmpMsg.mediaContent!==this.mediaContent||jmpMsg.mediaFamily!==this.mediaFamily){this.logger.error("JmpMsg ".concat(JSON.stringify(jmpMsg)," sent to incorrect JmpSession"));return;}this.logger.debug("Received JmpMsg",JSON.stringify(jmpMsg));var{payload}=jmpMsg;if(payload.msgType===JmpMsgType.MediaRequest){var mediaRequestMsg=payload.payload;if(!isValidMediaRequestMsg(mediaRequestMsg)){this.logger.error("Received invalid MediaRequest:",JSON.stringify(mediaRequestMsg));return;}this.handleIncomingMediaRequest(mediaRequestMsg);}else if(payload.msgType===JmpMsgType.MediaRequestAck){var mediaRequestAckMsg=payload.payload;if(!isValidMediaRequestAckMsg(mediaRequestAckMsg)){this.logger.error("Received invalid MediaRequest ACK:",JSON.stringify(mediaRequestAckMsg));return;}this.handleIncomingMediaRequestAck(mediaRequestAckMsg);}else if(payload.msgType===JmpMsgType.ActiveSpeakerNotification){var activeSpeakerNotification=payload.payload;if(!isValidActiveSpeakerNotificationMsg(activeSpeakerNotification)){this.logger.info("Received invalid Active Speaker Notification:",JSON.stringify(activeSpeakerNotification));return;}this.handleIncomingActiveSpeakerNotification(activeSpeakerNotification);}else if(payload.msgType===JmpMsgType.SourceAdvertisement){var sourceAdvertisement=payload.payload;if(!isValidSourceAdvertisementMsg(sourceAdvertisement)){this.logger.error("Received invalid SourceAdvertisementMsg:",JSON.stringify(sourceAdvertisement));return;}this.handleIncomingSourceAdvertisement(sourceAdvertisement);}else if(payload.msgType===JmpMsgType.SourceAdvertisementAck){var sourceAdvertisementAck=payload.payload;if(!isValidSourceAdvertisementAckMsg(sourceAdvertisementAck)){this.logger.error("Received invalid SourceAdvertisementAckMsg:",JSON.stringify(sourceAdvertisementAck));return;}this.handleIncomingSourceAdvertisementAck(sourceAdvertisementAck);}else if(payload.msgType===JmpMsgType.MediaRequestStatus){var mediaRequestStatus=payload.payload;if(!isValidMediaRequestStatusMsg(mediaRequestStatus)){this.logger.error("Received invalid MediaRequestStatusMsg:",JSON.stringify(mediaRequestStatus));return;}this.handleIncomingMediaRequestStatus(mediaRequestStatus);}else if(payload.msgType===JmpMsgType.MediaRequestStatusAck){var mediaRequestStatusAck=payload.payload;if(!isValidMediaRequestStatusAckMsg(mediaRequestStatusAck)){this.logger.error("Received invalid MediaRequestStatusAckMsg:",JSON.stringify(mediaRequestStatusAck));return;}this.handleIncomingMediaRequestStatusAck(mediaRequestStatusAck);}else {this.logger.error("Received unknown JmpMsg");}}setTxCallback(callback){this.txCallback=callback;}close(){var _a;this.logger.info("closing");(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.cancel();}sendJmpMsg(msgType,payload){var _a;var jmpMsg=new JmpMsg(this.mediaFamily,this.mediaContent,{msgType,payload});var homerMsg=new HomerMsg(HomerMsgType.Multistream,jmpMsg);(_a=this.txCallback)===null||_a===void 0?void 0:_a.call(this,JSON.stringify(homerMsg));}handleIncomingMediaRequest(mediaRequestMsg){var _a;if(this.lastReceivedMediaRequest&&mediaRequestMsg.seqNum<((_a=this.lastReceivedMediaRequest)===null||_a===void 0?void 0:_a.seqNum)){this.logger.info("Received old MediaRequest, ignoring");}else if(this.lastReceivedMediaRequest&&mediaRequestMsg.seqNum===this.lastReceivedMediaRequest.seqNum){if(this.lastSentMediaRequestAck){this.logger.info("Received duplicate MediaRequest, re-sending ACK");this.sendJmpMsg(JmpMsgType.MediaRequestAck,this.lastSentMediaRequestAck);}else {this.logger.warn("Received duplicate MediaRequest, but there was no ACK previously sent");}}else {this.logger.info("Received new MediaRequest, sending ACK");var mediaRequestAck=new MediaRequestAckMsg(mediaRequestMsg.seqNum);this.lastReceivedMediaRequest=mediaRequestMsg;this.lastSentMediaRequestAck=mediaRequestAck;this.sendJmpMsg(JmpMsgType.MediaRequestAck,mediaRequestAck);this.emit(JmpSessionEvents.MediaRequestReceived,mediaRequestMsg);}}handleIncomingMediaRequestAck(mediaRequestAckMsg){var _a,_b,_c;if(mediaRequestAckMsg.mediaRequestSeqNum===((_b=(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent MediaRequest");(_c=this.lastSentMediaRequest)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old MediaRequest");}}handleIncomingActiveSpeakerNotification(activeSpeakerNotification){this.logger.debug("Received Active Speaker Notification:",activeSpeakerNotification);this.emit(JmpSessionEvents.ActiveSpeaker,activeSpeakerNotification);}handleIncomingSourceAdvertisement(sourceAdvertisement){if(this.lastReceivedSourceAdvertisement&&sourceAdvertisement.seqNum<this.lastReceivedSourceAdvertisement.seqNum){this.logger.info("Received old SourceAdvertisement, ignoring");}else if(this.lastReceivedSourceAdvertisement&&sourceAdvertisement.seqNum===this.lastReceivedSourceAdvertisement.seqNum){if(this.lastSentSourceAdvertisementAck){this.logger.info("Received duplicate SourceAdvertisement, re-sending ACK");this.sendJmpMsg(JmpMsgType.SourceAdvertisementAck,this.lastSentSourceAdvertisementAck);}else {this.logger.warn("Received duplicate SourceAdvertisement, but there was no ACK previously sent");}}else {this.logger.info("Received new SourceAdvertisement, sending ACK");var sourceAdvertisementAck=new SourceAdvertisementAckMsg(sourceAdvertisement.seqNum);this.lastReceivedSourceAdvertisement=sourceAdvertisement;this.lastSentSourceAdvertisementAck=sourceAdvertisementAck;this.sendJmpMsg(JmpMsgType.SourceAdvertisementAck,sourceAdvertisementAck);this.emit(JmpSessionEvents.SourceAdvertisementReceived,sourceAdvertisement);}}handleIncomingSourceAdvertisementAck(sourceAdvertisementAck){var _a,_b,_c;if(sourceAdvertisementAck.sourceAdvertisementSeqNum===((_b=(_a=this.lastSentSourceAdvertisement)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent SourceAdvertisement");(_c=this.lastSentSourceAdvertisement)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old SourceAdvertisement");}}handleIncomingMediaRequestStatus(mediaRequestStatus){if(this.lastReceivedMediaRequestStatus&&mediaRequestStatus.seqNum<this.lastReceivedMediaRequestStatus.seqNum){this.logger.info("Received old MediaRequestStatus, ignoring");}else if(this.lastReceivedMediaRequestStatus&&mediaRequestStatus.seqNum===this.lastReceivedMediaRequestStatus.seqNum){if(this.lastSentMediaRequestStatusAck){this.logger.info("Received duplicate MediaRequestStatus, re-sending ACK");this.sendJmpMsg(JmpMsgType.MediaRequestStatusAck,this.lastSentMediaRequestStatusAck);}else {this.logger.warn("Received duplicate MediaRequestStatus, but there was no ACK previously sent");}}else {this.logger.info("Received new MediaRequestStatus, sending ACK");var mediaRequestStatusAck=new MediaRequestStatusAckMsg(mediaRequestStatus.seqNum);this.lastReceivedMediaRequestStatus=mediaRequestStatus;this.lastSentMediaRequestStatusAck=mediaRequestStatusAck;this.sendJmpMsg(JmpMsgType.MediaRequestStatusAck,mediaRequestStatusAck);this.emit(JmpSessionEvents.MediaRequestStatusReceived,mediaRequestStatus);}}handleIncomingMediaRequestStatusAck(mediaRequestStatusAck){var _a,_b,_c;if(mediaRequestStatusAck.mediaRequestStatusSeqNum===((_b=(_a=this.lastSentMediaRequestStatus)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent MediaRequestStatus");(_c=this.lastSentMediaRequestStatus)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old MediaRequestStatus");}}}var WcmeErrorType;(function(WcmeErrorType){WcmeErrorType["CREATE_OFFER_FAILED"]="CREATE_OFFER_FAILED";WcmeErrorType["SET_ANSWER_FAILED"]="SET_ANSWER_FAILED";WcmeErrorType["OFFER_ANSWER_MISMATCH"]="OFFER_ANSWER_MISMATCH";WcmeErrorType["SDP_MUNGE_FAILED"]="SDP_MUNGE_FAILED";WcmeErrorType["SDP_MUNGE_MISSING_CODECS"]="SDP_MUNGE_MISSING_CODECS";WcmeErrorType["INVALID_STREAM_REQUEST"]="INVALID_STREAM_REQUEST";WcmeErrorType["GET_TRANSCEIVER_FAILED"]="GET_TRANSCEIVER_FAILED";WcmeErrorType["GET_MAX_BITRATE_FAILED"]="GET_MAX_BITRATE_FAILED";WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"]="GET_PAYLOAD_TYPE_FAILED";WcmeErrorType["SET_NMG_FAILED"]="SET_NMG_FAILED";})(WcmeErrorType||(WcmeErrorType={}));class WcmeError{constructor(type){var message=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'';this.type=type;this.message=message;}}var commonjsGlobal$1=typeof globalThis!=='undefined'?globalThis:typeof window!=='undefined'?window:typeof global$1!=='undefined'?global$1:typeof self!=='undefined'?self:{};var logger$1={exports:{}};/*!
|
|
2688
|
+
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$2);})(logger$2);var Logger$1=logger$2.exports;Logger$1.useDefaults({defaultLevel:Logger$1.DEBUG,formatter:(messages,context)=>{messages.unshift("[".concat(context.name,"] "));}});var MediaFamily;(function(MediaFamily){MediaFamily["Audio"]="AUDIO";MediaFamily["Video"]="VIDEO";})(MediaFamily||(MediaFamily={}));var MediaContent;(function(MediaContent){MediaContent["Main"]="MAIN";MediaContent["Slides"]="SLIDES";})(MediaContent||(MediaContent={}));var Policy;(function(Policy){Policy["ActiveSpeaker"]="active-speaker";Policy["ReceiverSelected"]="receiver-selected";})(Policy||(Policy={}));var MediaType;(function(MediaType){MediaType["VideoMain"]="VIDEO-MAIN";MediaType["VideoSlides"]="VIDEO-SLIDES";MediaType["AudioMain"]="AUDIO-MAIN";MediaType["AudioSlides"]="AUDIO-SLIDES";})(MediaType||(MediaType={}));function randomInteger(min,max){return Math.floor(Math.random()*(max-min+1))+min;}function generateSceneId(){return randomInteger(0,0x7fffff);}function generateCsi(mediaFamily,sceneId){var av;if(mediaFamily===MediaFamily.Audio){av=0;}else {av=1;}return sceneId<<8|av;}function getMediaType(mediaFamily,mediaContent){if(mediaFamily===MediaFamily.Video&&mediaContent===MediaContent.Main){return MediaType.VideoMain;}if(mediaFamily===MediaFamily.Video&&mediaContent===MediaContent.Slides){return MediaType.VideoSlides;}if(mediaFamily===MediaFamily.Audio&&mediaContent===MediaContent.Main){return MediaType.AudioMain;}return MediaType.AudioSlides;}function getMediaFamily(mediaType){return [MediaType.VideoMain,MediaType.VideoSlides].includes(mediaType)?MediaFamily.Video:MediaFamily.Audio;}function getMediaContent(mediaType){return [MediaType.VideoMain,MediaType.AudioMain].includes(mediaType)?MediaContent.Main:MediaContent.Slides;}var truthyOrZero=value=>value===0||value;function arraysAreEqual(left,right,predicate){if(left.length!==right.length){return false;}for(var i=0;i<left.length;i+=1){if(!predicate(left[i],right[i])){return false;}}return true;}class ActiveSpeakerInfo{constructor(priority,crossPriorityDuplication,crossPolicyDuplication,preferLiveVideo,namedMediaGroups){this.priority=priority;this.crossPriorityDuplication=crossPriorityDuplication;this.crossPolicyDuplication=crossPolicyDuplication;this.preferLiveVideo=preferLiveVideo;this.namedMediaGroups=namedMediaGroups;}toString(){return "ActiveSpeakerInfo(priority=".concat(this.priority,", crossPriorityDuplication=").concat(this.crossPriorityDuplication,", crossPolicyDuplication=").concat(this.crossPolicyDuplication,", preferLiveVideo=").concat(this.preferLiveVideo,"), namedMediaGroups=").concat(this.namedMediaGroups);}}function isValidActiveSpeakerInfo(msg){var maybeActiveSpeakerInfo=msg;return Boolean('priority'in maybeActiveSpeakerInfo&&'crossPriorityDuplication'in maybeActiveSpeakerInfo&&'crossPolicyDuplication'in maybeActiveSpeakerInfo&&'preferLiveVideo'in maybeActiveSpeakerInfo);}function areNamedMediaGroupArraysEqual(left,right){if(left===undefined||right===undefined){return left===right;}return arraysAreEqual(left,right,(l,r)=>l.type===r.type&&l.value===r.value);}function areActiveSpeakerInfosEqual(left,right){return left.priority===right.priority&&left.crossPriorityDuplication===right.crossPriorityDuplication&&left.crossPolicyDuplication===right.crossPolicyDuplication&&left.preferLiveVideo===right.preferLiveVideo&&areNamedMediaGroupArraysEqual(left.namedMediaGroups,right.namedMediaGroups);}function isValidActiveSpeakerNotificationMsg(msg){var maybeActiveSpeakerNotificationMsg=msg;return Boolean(maybeActiveSpeakerNotificationMsg.seqNum&&maybeActiveSpeakerNotificationMsg.csis);}var HomerMsgType;(function(HomerMsgType){HomerMsgType["Multistream"]="multistream";})(HomerMsgType||(HomerMsgType={}));class HomerMsg{constructor(msgType,payload){this.msgType=msgType;this.payload=payload;}static fromJson(data){if(!data.msgType||!data.payload){return null;}return new HomerMsg(data.msgType,data.payload);}}var JmpMsgType;(function(JmpMsgType){JmpMsgType["MediaRequest"]="mediaRequest";JmpMsgType["MediaRequestAck"]="mediaRequestAck";JmpMsgType["MediaRequestStatus"]="mediaRequestStatus";JmpMsgType["MediaRequestStatusAck"]="mediaRequestStatusAck";JmpMsgType["SourceAdvertisement"]="sourceAdvertisement";JmpMsgType["SourceAdvertisementAck"]="sourceAdvertisementAck";JmpMsgType["ActiveSpeakerNotification"]="activeSpeakerNotification";})(JmpMsgType||(JmpMsgType={}));class JmpMsg{constructor(mediaFamily,mediaContent,payload){this.mediaFamily=mediaFamily;this.mediaContent=mediaContent;this.payload=payload;}toString(){return "JmpMsg(mediaFamily=".concat(this.mediaFamily,", mediaContent=").concat(this.mediaContent,", payload=").concat(this.payload,")");}}function isValidJmpMsgPayload(msg){var maybeJmpMsgPayload=msg;return Boolean(maybeJmpMsgPayload.msgType&&maybeJmpMsgPayload.payload);}function isValidJmpMsg(msg){var maybeJmpMsg=msg;return Boolean(maybeJmpMsg.mediaContent&&maybeJmpMsg.mediaFamily&&maybeJmpMsg.payload&&isValidJmpMsgPayload(maybeJmpMsg.payload));}class MediaRequestMsg{constructor(seqNum,requests){this.seqNum=seqNum;this.requests=requests;}toString(){return "JmpMediaMsg(seqNum=".concat(this.seqNum,", requests=[").concat(this.requests,"])");}}function isValidMediaRequestMsg(msg){var maybeMediaRequestMsg=msg;return Boolean(maybeMediaRequestMsg.seqNum&&maybeMediaRequestMsg.requests);}class MediaRequestAckMsg{constructor(mediaRequestSeqNum){this.mediaRequestSeqNum=mediaRequestSeqNum;}toString(){return "MediaRequestAckMsg(seqNum=".concat(this.mediaRequestSeqNum,")");}}function isValidMediaRequestAckMsg(msg){var maybeMediaRequestAckMsg=msg;return Boolean(maybeMediaRequestAckMsg.mediaRequestSeqNum);}function isValidStreamId(obj){var maybeStreamId=obj;if(maybeStreamId.mid&&maybeStreamId.ssrc){return false;}return Boolean(maybeStreamId.mid)||Boolean(maybeStreamId.ssrc);}function compareStreamIds(id1,id2){var keys1=Object.keys(id1);var keys2=Object.keys(id2);if(keys1.length!==keys2.length){return false;}return keys1.every(key=>id1[key]===id2[key]);}function isValidStreamInfo(obj){var maybeStreamInfo=obj;return Boolean(maybeStreamInfo.id&&isValidStreamId(maybeStreamInfo.id)&&['no source','invalid source','live','avatar','bandwidth disabled'].includes(maybeStreamInfo.state));}class MediaRequestStatusMsg{constructor(seqNum,streamStates){this.seqNum=seqNum;this.streamStates=streamStates;}}function isValidMediaRequestStatusMsg(msg){var maybeMediaRequestStatusMsg=msg;return Boolean(maybeMediaRequestStatusMsg.seqNum)&&maybeMediaRequestStatusMsg.streamStates&&maybeMediaRequestStatusMsg.streamStates.every(streamInfo=>isValidStreamInfo(streamInfo));}function compareStreamStateArrays(streamStates1,streamStates2){var _a,_b;if(streamStates1.length!==streamStates2.length){return false;}for(var i=0;i<streamStates1.length;i+=1){if(!compareStreamIds(streamStates1[i].id,streamStates2[i].id)){return false;}if(streamStates1[i].state!==streamStates2[i].state){return false;}if(((_a=streamStates1[i])===null||_a===void 0?void 0:_a.csi)!==((_b=streamStates2[i])===null||_b===void 0?void 0:_b.csi)){return false;}}return true;}class MediaRequestStatusAckMsg{constructor(mediaRequestStatusSeqNum){this.mediaRequestStatusSeqNum=mediaRequestStatusSeqNum;}toString(){return "MediaRequestStatusAckMsg(seqNum=".concat(this.mediaRequestStatusSeqNum,")");}}function isValidMediaRequestStatusAckMsg(msg){var maybeMediaRequestStatusAckMsg=msg;return Boolean(maybeMediaRequestStatusAckMsg.mediaRequestStatusSeqNum);}class H264Codec{constructor(maxFs,maxFps,maxMbps,maxWidth,maxHeight){this.maxFs=maxFs;this.maxFps=maxFps;this.maxMbps=maxMbps;this.maxWidth=maxWidth;this.maxHeight=maxHeight;}}function areH264CodecsEqual(left,right){if(left===undefined||right===undefined){return left===right;}return left.maxFs===right.maxFs&&left.maxFps===right.maxFps&&left.maxMbps===right.maxMbps&&left.maxWidth===right.maxWidth&&left.maxHeight===right.maxHeight;}class CodecInfo$1{constructor(payloadType,h264){this.payloadType=payloadType;this.h264=h264;}}function areCodecInfosEqual(left,right){return left.payloadType===right.payloadType&&areH264CodecsEqual(left.h264,right.h264);}class ReceiverSelectedInfo{constructor(csi){this.csi=csi;}toString(){return "ReceiverSelectedInfo(csi=".concat(this.csi,")");}}function isValidReceiverSelectedInfo(msg){var maybeReceiverSelectedInfo=msg;return Boolean(maybeReceiverSelectedInfo.csi);}function areReceiverSelectedInfosEqual(left,right){return left.csi===right.csi;}class SourceAdvertisementMsg{constructor(seqNum,numTotalSources,numLiveSources,namedMediaGroups,videoContentHint){this.seqNum=seqNum;this.numTotalSources=numTotalSources;this.numLiveSources=numLiveSources;this.namedMediaGroups=namedMediaGroups;this.videoContentHint=videoContentHint;}toString(){return "SourceAdvertisement(seqNum=".concat(this.seqNum,", numTotalSources=").concat(this.numTotalSources,", numLiveSources=").concat(this.numLiveSources,", namedMediaGroups=").concat(this.namedMediaGroups,", videoContentHint=").concat(this.videoContentHint);}}function isValidSourceAdvertisementMsg(msg){var maybeSourceAdvertisementMsg=msg;return Boolean(maybeSourceAdvertisementMsg.seqNum&&truthyOrZero(maybeSourceAdvertisementMsg.numTotalSources)&&truthyOrZero(maybeSourceAdvertisementMsg.numLiveSources));}function compareNamedMediaGroupArrays(namedMediaGroups1,namedMediaGroups2){var _a,_b;if(namedMediaGroups1.length!==namedMediaGroups2.length){return false;}for(var i=0;i<namedMediaGroups1.length;i+=1){if(namedMediaGroups1[i].type!==namedMediaGroups2[i].type){return false;}if(((_a=namedMediaGroups1[i])===null||_a===void 0?void 0:_a.value)!==((_b=namedMediaGroups2[i])===null||_b===void 0?void 0:_b.value)){return false;}}return true;}function compareSourceAdvertisementMsgs(sourceAdvertisementMsg1,sourceAdvertisementMsg2){return sourceAdvertisementMsg1.numLiveSources===sourceAdvertisementMsg2.numLiveSources&&sourceAdvertisementMsg1.numTotalSources===sourceAdvertisementMsg2.numTotalSources&&compareNamedMediaGroupArrays(sourceAdvertisementMsg1.namedMediaGroups||[],sourceAdvertisementMsg2.namedMediaGroups||[])&&sourceAdvertisementMsg1.videoContentHint===sourceAdvertisementMsg2.videoContentHint;}class SourceAdvertisementAckMsg{constructor(sourceAdvertisementSeqNum){this.sourceAdvertisementSeqNum=sourceAdvertisementSeqNum;}toString(){return "SourceAdvertisementAckMsg(sourceAdvertisementSeqNum=".concat(this.sourceAdvertisementSeqNum,")");}}function isValidSourceAdvertisementAckMsg(msg){var maybeSourceAdvertisementAckMsg=msg;return Boolean(maybeSourceAdvertisementAckMsg.sourceAdvertisementSeqNum);}class StreamRequest$1{constructor(policy,policySpecificInfo,ids,maxPayloadBitsPerSecond){var codecInfos=arguments.length>4&&arguments[4]!==undefined?arguments[4]:[];this.policy=policy;this.policySpecificInfo=policySpecificInfo;this.ids=ids;this.maxPayloadBitsPerSecond=maxPayloadBitsPerSecond;this.codecInfos=codecInfos;}toString(){return "Request(policy=".concat(this.policy,", info=").concat(this.policySpecificInfo,", ids=[").concat(this.ids,"], maxPayloadBitsPerSecond=[").concat(this.maxPayloadBitsPerSecond,"], codecInfos=[").concat(this.codecInfos,"])");}}function arePolicySpecificInfosEqual(left,right){if(isValidActiveSpeakerInfo(left)){if(!isValidActiveSpeakerInfo(right)){return false;}return areActiveSpeakerInfosEqual(left,right);}if(isValidReceiverSelectedInfo(left)){if(!isValidReceiverSelectedInfo(right)){return false;}return areReceiverSelectedInfosEqual(left,right);}throw new Error('Invalid PolicySpecificInfo');}function areCodecInfoArraysEqual(left,right){return arraysAreEqual(left,right,areCodecInfosEqual);}function areStreamIdArraysEqual(left,right){return arraysAreEqual(left,right,compareStreamIds);}function areStreamRequestsEqual(left,right){if(left.policy!==right.policy){return false;}if(!arePolicySpecificInfosEqual(left.policySpecificInfo,right.policySpecificInfo)){return false;}if(!areStreamIdArraysEqual(left.ids,right.ids)){return false;}if(left.maxPayloadBitsPerSecond!==right.maxPayloadBitsPerSecond){return false;}if(!areCodecInfoArraysEqual(left.codecInfos,right.codecInfos)){return false;}return true;}class RetransmitHandler{constructor(msg,maxNumRetransmits,retransmitIntervalMs,transmitCallback,expirationCallback){this.timerHandle=undefined;this.msg=msg;this.numRetransmitsLeft=maxNumRetransmits;this.retransmitIntervalMs=retransmitIntervalMs;this.transmitCallback=transmitCallback;this.expirationCallback=expirationCallback;this.scheduleTimer();}onTimer(){var _a;if(this.numRetransmitsLeft>0){--this.numRetransmitsLeft;this.transmitCallback(this.msg);this.scheduleTimer();}else {(_a=this.expirationCallback)===null||_a===void 0?void 0:_a.call(this,this.msg);}}scheduleTimer(){this.timerHandle=window.setTimeout(()=>this.onTimer(),this.retransmitIntervalMs);}cancel(){if(this.timerHandle){clearTimeout(this.timerHandle);}this.timerHandle=undefined;}}var JmpSessionEvents;(function(JmpSessionEvents){JmpSessionEvents["ActiveSpeaker"]="active-speaker";JmpSessionEvents["MediaRequestReceived"]="media-request-received";JmpSessionEvents["MediaRequestStatusReceived"]="media-request-status-received";JmpSessionEvents["SourceAdvertisementReceived"]="source-advertisement-received";})(JmpSessionEvents||(JmpSessionEvents={}));function areStreamRequestArraysEqual(left,right){if(left.length!==right.length){return false;}for(var i=0;i<left.length;i+=1){if(!areStreamRequestsEqual(left[i],right[i])){return false;}}return true;}class JmpSession extends EventEmitter$6{constructor(mediaFamily,mediaContent){var maxNumRetransmits=arguments.length>2&&arguments[2]!==undefined?arguments[2]:200;var retransmitIntervalMs=arguments.length>3&&arguments[3]!==undefined?arguments[3]:250;super();this.currMediaRequestSeqNum=1;this.currSourceAdvertisementSeqNum=1;this.currMediaRequestStatusSeqNum=1;this.txCallback=undefined;this.lastSentMediaRequest=undefined;this.lastSentMediaRequestAck=undefined;this.lastReceivedMediaRequest=undefined;this.mediaFamily=mediaFamily;this.mediaContent=mediaContent;this.logger=Logger$1.get("JmpSession ".concat(this.mediaFamily,"-").concat(this.mediaContent));this.maxNumRetransmits=maxNumRetransmits;this.retransmitIntervalMs=retransmitIntervalMs;}getLogger(){return this.logger;}sendRequests(requests){var _a;var mediaRequestMsg=new MediaRequestMsg(this.currMediaRequestSeqNum,requests);if(!this.lastSentMediaRequest||!areStreamRequestArraysEqual(this.lastSentMediaRequest.msg.requests,requests)){this.sendJmpMsg(JmpMsgType.MediaRequest,mediaRequestMsg);(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.cancel();this.lastSentMediaRequest=new RetransmitHandler(mediaRequestMsg,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent MediaRequest...");this.sendJmpMsg(JmpMsgType.MediaRequest,mediaRequestMsg);},expiredJmpMsg=>{this.logger.warn("Retransmits for message expired: ".concat(expiredJmpMsg));});this.currMediaRequestSeqNum++;}else {this.logger.info("Duplicate MediaRequest detected and will not be sent: ".concat(mediaRequestMsg));}}sendSourceAdvertisement(numTotalSources,numLiveSources,namedMediaGroups,videoContentHint){var _a;var sourceAdvertisementMsg=new SourceAdvertisementMsg(this.currSourceAdvertisementSeqNum,numTotalSources,numLiveSources,namedMediaGroups,videoContentHint);if(!this.lastSentSourceAdvertisement||!compareSourceAdvertisementMsgs(this.lastSentSourceAdvertisement.msg,sourceAdvertisementMsg)){this.sendJmpMsg(JmpMsgType.SourceAdvertisement,sourceAdvertisementMsg);(_a=this.lastSentSourceAdvertisement)===null||_a===void 0?void 0:_a.cancel();this.lastSentSourceAdvertisement=new RetransmitHandler(sourceAdvertisementMsg,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent SourceAdvertisement...");this.sendJmpMsg(JmpMsgType.SourceAdvertisement,sourceAdvertisementMsg);},expiredMsg=>{this.logger.warn("Retransmits for message expired: ",expiredMsg);});this.currSourceAdvertisementSeqNum++;}else {this.logger.info("Duplicate SourceAdvertisement detected and will not be sent: ",sourceAdvertisementMsg);}}sendMediaRequestStatus(streamStates){var _a,_b;var filteredStreamStates=streamStates.filter(streamState=>{var _a;return (_a=this.lastReceivedMediaRequest)===null||_a===void 0?void 0:_a.requests.some(req=>req.ids.find(streamId=>compareStreamIds(streamId,streamState.id)));});var mediaRequestStatus=new MediaRequestStatusMsg(this.currMediaRequestStatusSeqNum,filteredStreamStates);if(!((_a=this.lastSentMediaRequestStatus)===null||_a===void 0?void 0:_a.msg.streamStates)||!compareStreamStateArrays(filteredStreamStates,this.lastSentMediaRequestStatus.msg.streamStates)){this.sendJmpMsg(JmpMsgType.MediaRequestStatus,mediaRequestStatus);(_b=this.lastSentMediaRequestStatus)===null||_b===void 0?void 0:_b.cancel();this.lastSentMediaRequestStatus=new RetransmitHandler(mediaRequestStatus,this.maxNumRetransmits,this.retransmitIntervalMs,()=>{this.logger.info("Retransmitting previously sent MediaRequestStatus...");this.sendJmpMsg(JmpMsgType.MediaRequestStatus,mediaRequestStatus);},expiredMsg=>{this.logger.warn("Retransmits for message expired: ",expiredMsg);});this.currMediaRequestStatusSeqNum++;}else {this.logger.info("Duplicate MediaRequestStatus detected and will not be sent: ",mediaRequestStatus);}}receive(jmpMsg){if(jmpMsg.mediaContent!==this.mediaContent||jmpMsg.mediaFamily!==this.mediaFamily){this.logger.error("JmpMsg ".concat(JSON.stringify(jmpMsg)," sent to incorrect JmpSession"));return;}this.logger.debug("Received JmpMsg",JSON.stringify(jmpMsg));var{payload}=jmpMsg;if(payload.msgType===JmpMsgType.MediaRequest){var mediaRequestMsg=payload.payload;if(!isValidMediaRequestMsg(mediaRequestMsg)){this.logger.error("Received invalid MediaRequest:",JSON.stringify(mediaRequestMsg));return;}this.handleIncomingMediaRequest(mediaRequestMsg);}else if(payload.msgType===JmpMsgType.MediaRequestAck){var mediaRequestAckMsg=payload.payload;if(!isValidMediaRequestAckMsg(mediaRequestAckMsg)){this.logger.error("Received invalid MediaRequest ACK:",JSON.stringify(mediaRequestAckMsg));return;}this.handleIncomingMediaRequestAck(mediaRequestAckMsg);}else if(payload.msgType===JmpMsgType.ActiveSpeakerNotification){var activeSpeakerNotification=payload.payload;if(!isValidActiveSpeakerNotificationMsg(activeSpeakerNotification)){this.logger.info("Received invalid Active Speaker Notification:",JSON.stringify(activeSpeakerNotification));return;}this.handleIncomingActiveSpeakerNotification(activeSpeakerNotification);}else if(payload.msgType===JmpMsgType.SourceAdvertisement){var sourceAdvertisement=payload.payload;if(!isValidSourceAdvertisementMsg(sourceAdvertisement)){this.logger.error("Received invalid SourceAdvertisementMsg:",JSON.stringify(sourceAdvertisement));return;}this.handleIncomingSourceAdvertisement(sourceAdvertisement);}else if(payload.msgType===JmpMsgType.SourceAdvertisementAck){var sourceAdvertisementAck=payload.payload;if(!isValidSourceAdvertisementAckMsg(sourceAdvertisementAck)){this.logger.error("Received invalid SourceAdvertisementAckMsg:",JSON.stringify(sourceAdvertisementAck));return;}this.handleIncomingSourceAdvertisementAck(sourceAdvertisementAck);}else if(payload.msgType===JmpMsgType.MediaRequestStatus){var mediaRequestStatus=payload.payload;if(!isValidMediaRequestStatusMsg(mediaRequestStatus)){this.logger.error("Received invalid MediaRequestStatusMsg:",JSON.stringify(mediaRequestStatus));return;}this.handleIncomingMediaRequestStatus(mediaRequestStatus);}else if(payload.msgType===JmpMsgType.MediaRequestStatusAck){var mediaRequestStatusAck=payload.payload;if(!isValidMediaRequestStatusAckMsg(mediaRequestStatusAck)){this.logger.error("Received invalid MediaRequestStatusAckMsg:",JSON.stringify(mediaRequestStatusAck));return;}this.handleIncomingMediaRequestStatusAck(mediaRequestStatusAck);}else {this.logger.error("Received unknown JmpMsg");}}setTxCallback(callback){this.txCallback=callback;}close(){var _a,_b,_c;this.logger.info("closing");(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.cancel();(_b=this.lastSentMediaRequestStatus)===null||_b===void 0?void 0:_b.cancel();(_c=this.lastSentSourceAdvertisement)===null||_c===void 0?void 0:_c.cancel();}sendJmpMsg(msgType,payload){var _a;var jmpMsg=new JmpMsg(this.mediaFamily,this.mediaContent,{msgType,payload});var homerMsg=new HomerMsg(HomerMsgType.Multistream,jmpMsg);(_a=this.txCallback)===null||_a===void 0?void 0:_a.call(this,JSON.stringify(homerMsg));}handleIncomingMediaRequest(mediaRequestMsg){var _a;if(this.lastReceivedMediaRequest&&mediaRequestMsg.seqNum<((_a=this.lastReceivedMediaRequest)===null||_a===void 0?void 0:_a.seqNum)){this.logger.info("Received old MediaRequest, ignoring");}else if(this.lastReceivedMediaRequest&&mediaRequestMsg.seqNum===this.lastReceivedMediaRequest.seqNum){if(this.lastSentMediaRequestAck){this.logger.info("Received duplicate MediaRequest, re-sending ACK");this.sendJmpMsg(JmpMsgType.MediaRequestAck,this.lastSentMediaRequestAck);}else {this.logger.warn("Received duplicate MediaRequest, but there was no ACK previously sent");}}else {this.logger.info("Received new MediaRequest, sending ACK");var mediaRequestAck=new MediaRequestAckMsg(mediaRequestMsg.seqNum);this.lastReceivedMediaRequest=mediaRequestMsg;this.lastSentMediaRequestAck=mediaRequestAck;this.sendJmpMsg(JmpMsgType.MediaRequestAck,mediaRequestAck);this.emit(JmpSessionEvents.MediaRequestReceived,mediaRequestMsg);}}handleIncomingMediaRequestAck(mediaRequestAckMsg){var _a,_b,_c;if(mediaRequestAckMsg.mediaRequestSeqNum===((_b=(_a=this.lastSentMediaRequest)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent MediaRequest");(_c=this.lastSentMediaRequest)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old MediaRequest");}}handleIncomingActiveSpeakerNotification(activeSpeakerNotification){this.logger.debug("Received Active Speaker Notification:",activeSpeakerNotification);this.emit(JmpSessionEvents.ActiveSpeaker,activeSpeakerNotification);}handleIncomingSourceAdvertisement(sourceAdvertisement){if(this.lastReceivedSourceAdvertisement&&sourceAdvertisement.seqNum<this.lastReceivedSourceAdvertisement.seqNum){this.logger.info("Received old SourceAdvertisement, ignoring");}else if(this.lastReceivedSourceAdvertisement&&sourceAdvertisement.seqNum===this.lastReceivedSourceAdvertisement.seqNum){if(this.lastSentSourceAdvertisementAck){this.logger.info("Received duplicate SourceAdvertisement, re-sending ACK");this.sendJmpMsg(JmpMsgType.SourceAdvertisementAck,this.lastSentSourceAdvertisementAck);}else {this.logger.warn("Received duplicate SourceAdvertisement, but there was no ACK previously sent");}}else {this.logger.info("Received new SourceAdvertisement, sending ACK");var sourceAdvertisementAck=new SourceAdvertisementAckMsg(sourceAdvertisement.seqNum);this.lastReceivedSourceAdvertisement=sourceAdvertisement;this.lastSentSourceAdvertisementAck=sourceAdvertisementAck;this.sendJmpMsg(JmpMsgType.SourceAdvertisementAck,sourceAdvertisementAck);this.emit(JmpSessionEvents.SourceAdvertisementReceived,sourceAdvertisement);}}handleIncomingSourceAdvertisementAck(sourceAdvertisementAck){var _a,_b,_c;if(sourceAdvertisementAck.sourceAdvertisementSeqNum===((_b=(_a=this.lastSentSourceAdvertisement)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent SourceAdvertisement");(_c=this.lastSentSourceAdvertisement)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old SourceAdvertisement");}}handleIncomingMediaRequestStatus(mediaRequestStatus){if(this.lastReceivedMediaRequestStatus&&mediaRequestStatus.seqNum<this.lastReceivedMediaRequestStatus.seqNum){this.logger.info("Received old MediaRequestStatus, ignoring");}else if(this.lastReceivedMediaRequestStatus&&mediaRequestStatus.seqNum===this.lastReceivedMediaRequestStatus.seqNum){if(this.lastSentMediaRequestStatusAck){this.logger.info("Received duplicate MediaRequestStatus, re-sending ACK");this.sendJmpMsg(JmpMsgType.MediaRequestStatusAck,this.lastSentMediaRequestStatusAck);}else {this.logger.warn("Received duplicate MediaRequestStatus, but there was no ACK previously sent");}}else {this.logger.info("Received new MediaRequestStatus, sending ACK");var mediaRequestStatusAck=new MediaRequestStatusAckMsg(mediaRequestStatus.seqNum);this.lastReceivedMediaRequestStatus=mediaRequestStatus;this.lastSentMediaRequestStatusAck=mediaRequestStatusAck;this.sendJmpMsg(JmpMsgType.MediaRequestStatusAck,mediaRequestStatusAck);this.emit(JmpSessionEvents.MediaRequestStatusReceived,mediaRequestStatus);}}handleIncomingMediaRequestStatusAck(mediaRequestStatusAck){var _a,_b,_c;if(mediaRequestStatusAck.mediaRequestStatusSeqNum===((_b=(_a=this.lastSentMediaRequestStatus)===null||_a===void 0?void 0:_a.msg)===null||_b===void 0?void 0:_b.seqNum)){this.logger.info("Received ACK for last sent MediaRequestStatus");(_c=this.lastSentMediaRequestStatus)===null||_c===void 0?void 0:_c.cancel();}else {this.logger.info("Received ACK for old MediaRequestStatus");}}}var WcmeErrorType;(function(WcmeErrorType){WcmeErrorType["CREATE_OFFER_FAILED"]="CREATE_OFFER_FAILED";WcmeErrorType["SET_ANSWER_FAILED"]="SET_ANSWER_FAILED";WcmeErrorType["OFFER_ANSWER_MISMATCH"]="OFFER_ANSWER_MISMATCH";WcmeErrorType["SDP_MUNGE_FAILED"]="SDP_MUNGE_FAILED";WcmeErrorType["SDP_MUNGE_MISSING_CODECS"]="SDP_MUNGE_MISSING_CODECS";WcmeErrorType["INVALID_STREAM_REQUEST"]="INVALID_STREAM_REQUEST";WcmeErrorType["GET_TRANSCEIVER_FAILED"]="GET_TRANSCEIVER_FAILED";WcmeErrorType["GET_MAX_BITRATE_FAILED"]="GET_MAX_BITRATE_FAILED";WcmeErrorType["GET_PAYLOAD_TYPE_FAILED"]="GET_PAYLOAD_TYPE_FAILED";WcmeErrorType["SET_NMG_FAILED"]="SET_NMG_FAILED";})(WcmeErrorType||(WcmeErrorType={}));class WcmeError{constructor(type){var message=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'';this.type=type;this.message=message;}}var commonjsGlobal$1=typeof globalThis!=='undefined'?globalThis:typeof window!=='undefined'?window:typeof global$1!=='undefined'?global$1:typeof self!=='undefined'?self:{};var logger$1={exports:{}};/*!
|
|
3703
2689
|
* js-logger - http://github.com/jonnyreeves/js-logger
|
|
3704
2690
|
* Jonny Reeves, http://jonnyreeves.co.uk/
|
|
3705
2691
|
* js-logger may be freely distributed under the MIT license.
|
|
@@ -5850,7 +4836,7 @@ var{hasOwnProperty}=Object.prototype;for(var i=0;i<mapResults.length;i++){if(map
|
|
|
5850
4836
|
* // arg1 now equals 'three'
|
|
5851
4837
|
* callback(null, 'done');
|
|
5852
4838
|
* }
|
|
5853
|
-
*/function waterfall(tasks,callback){callback=once(callback);if(!Array.isArray(tasks))return callback(new Error('First argument to waterfall must be an array of functions'));if(!tasks.length)return callback();var taskIndex=0;function nextTask(args){var task=wrapAsync(tasks[taskIndex++]);task(...args,onlyOnce(next));}function next(err){if(err===false)return;for(var _len22=arguments.length,args=new Array(_len22>1?_len22-1:0),_key22=1;_key22<_len22;_key22++){args[_key22-1]=arguments[_key22];}if(err||taskIndex===tasks.length){return callback(err,...args);}nextTask(args);}nextTask([]);}awaitify(waterfall);function processTasks(task,finishedCallback){return __awaiter$1(this,void 0,void 0,function*(){try{yield task();finishedCallback();}catch(e){finishedCallback(e);}});}class AsyncQueue{constructor(){this.queue=queue$1(processTasks,1);}push(task){return this.queue.pushAsync(task);}empty(){return this.queue.empty();}}var OfferAnswerType;(function(OfferAnswerType){OfferAnswerType[OfferAnswerType["LocalOnly"]=0]="LocalOnly";OfferAnswerType[OfferAnswerType["Remote"]=1]="Remote";})(OfferAnswerType||(OfferAnswerType={}));class SendOnlyTransceiver extends Transceiver{constructor(rtcRtpTransceiver,mid,csi,munger,mediaType){super(rtcRtpTransceiver,mid);this.rtxEnabled=false;this.streamMuteStateChange=new TypedEvent();this.streamPublishStateChange=new TypedEvent();this.negotiationNeeded=new TypedEvent();this.namedMediaGroupsChange=new TypedEvent();this.requestedIdEncodingParamsMap=new Map();this.updateSendParametersQueue=new AsyncQueue();this.csi=csi;this.direction='sendrecv';this.handleTrackChange=this.handleTrackChange.bind(this);this.handleStreamConstraintsChange=this.handleStreamConstraintsChange.bind(this);this.handleStreamMuteStateChange=this.handleStreamMuteStateChange.bind(this);this.munger=munger;this.mediaType=mediaType;}replaceSenderSource(stream){var _a,_b;return __awaiter$1(this,void 0,void 0,function*(){var trackOrNull=(_a=stream===null||stream===void 0?void 0:stream.outputStream.getTracks()[0])!==null&&_a!==void 0?_a:null;if(((_b=this.sender.track)===null||_b===void 0?void 0:_b.id)!==(trackOrNull===null||trackOrNull===void 0?void 0:trackOrNull.id)){yield this.sender.replaceTrack(trackOrNull);if(trackOrNull){logger.log("Sender source for ".concat(this.mediaType," replaced with track ID ").concat(trackOrNull.id));}else {logger.log("Sender source for ".concat(this.mediaType," set to null, sender stopped"));}}});}handleTrackChange(){return __awaiter$1(this,void 0,void 0,function*(){if(this.requested){yield this.replaceSenderSource(this.publishedStream);}});}handleStreamConstraintsChange(){return __awaiter$1(this,void 0,void 0,function*(){yield this.updateSendParameters(this.requestedIdEncodingParamsMap);});}handleStreamMuteStateChange(){this.streamMuteStateChange.emit();}get requested(){return this.requestedIdEncodingParamsMap.size>0;}replaceTransceiver(newRtcRtpTransceiver){var _super=Object.create(null,{replaceTransceiver:{get:()=>super.replaceTransceiver}});return __awaiter$1(this,void 0,void 0,function*(){_super.replaceTransceiver.call(this,newRtcRtpTransceiver);newRtcRtpTransceiver.direction=this.direction;if(this.requested){yield this.replaceSenderSource(this.publishedStream);}});}replacePublishedStream(newStream){return __awaiter$1(this,void 0,void 0,function*(){var oldStream=this.publishedStream;oldStream===null||oldStream===void 0?void 0:oldStream.off(LocalStreamEventNames.OutputTrackChange,this.handleTrackChange);oldStream===null||oldStream===void 0?void 0:oldStream.off(LocalStreamEventNames.ConstraintsChange,this.handleStreamConstraintsChange);oldStream===null||oldStream===void 0?void 0:oldStream.off(StreamEventNames.MuteStateChange,this.handleStreamMuteStateChange);if(this.requested){yield this.replaceSenderSource(newStream);}this.publishedStream=newStream;newStream===null||newStream===void 0?void 0:newStream.on(LocalStreamEventNames.OutputTrackChange,this.handleTrackChange);newStream===null||newStream===void 0?void 0:newStream.on(LocalStreamEventNames.ConstraintsChange,this.handleStreamConstraintsChange);newStream===null||newStream===void 0?void 0:newStream.on(StreamEventNames.MuteStateChange,this.handleStreamMuteStateChange);if(!oldStream&&newStream&&!newStream.muted||oldStream&&!newStream&&!oldStream.muted){this.streamPublishStateChange.emit();}else if((oldStream===null||oldStream===void 0?void 0:oldStream.muted)!==(newStream===null||newStream===void 0?void 0:newStream.muted)){this.streamMuteStateChange.emit();}});}setNamedMediaGroups(namedMediaGroups){if(this.mediaType!==MediaType.AudioMain){logErrorAndThrow(WcmeErrorType.SET_NMG_FAILED,"Named media groups can only be set for audio.");}this.namedMediaGroups=namedMediaGroups;this.namedMediaGroupsChange.emit();}publishStream(stream){return this.replacePublishedStream(stream);}unpublishStream(){return this.replacePublishedStream();}get active(){return this._rtcRtpTransceiver.direction==='sendrecv';}set active(enabled){this.direction=enabled?'sendrecv':'inactive';this._rtcRtpTransceiver.direction=this.direction;if(this._rtcRtpTransceiver.direction!==this._rtcRtpTransceiver.currentDirection){this.negotiationNeeded.emit(OfferAnswerType.Remote);}}getStats(){return this.sender.getStats();}updateSendParameters(requestedIdEncodingParamsMap){return __awaiter$1(this,void 0,void 0,function*(){return this.updateSendParametersQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var requested=requestedIdEncodingParamsMap.size>0;if(this.requested!==requested){yield this.replaceSenderSource(requested?this.publishedStream:null);}var sendParameters=this.sender.getParameters();sendParameters.encodings.forEach((encoding,index)=>{var _a,_b;var encodingParams=requestedIdEncodingParamsMap.get(index);encoding.active=!!encodingParams;if(encodingParams){var{maxPayloadBitsPerSecond,maxFs,maxWidth,maxHeight}=encodingParams;var scaleDownRatio=getScaleDownRatio((_a=this.publishedStream)===null||_a===void 0?void 0:_a.getSettings().width,(_b=this.publishedStream)===null||_b===void 0?void 0:_b.getSettings().height,maxFs,maxWidth,maxHeight);if(maxPayloadBitsPerSecond!==undefined&&maxPayloadBitsPerSecond>=0){encoding.maxBitrate=maxPayloadBitsPerSecond;}if(scaleDownRatio!==undefined&&scaleDownRatio>=1.0){encoding.scaleResolutionDownBy=scaleDownRatio;}}});yield this.sender.setParameters(sendParameters);this.requestedIdEncodingParamsMap=requestedIdEncodingParamsMap;}));});}isSimulcastEnabled(){var params=this.sender.getParameters();return params.encodings.length>1;}mungeLocalDescription(mediaDescription){this.munger.mungeLocalDescription(mediaDescription,this.isSimulcastEnabled(),this.rtxEnabled,this.twccDisabled);}mungeLocalDescriptionForRemoteServer(mediaDescription){this.munger.mungeLocalDescriptionForRemoteServer(mediaDescription,getMediaContent(this.mediaType),this.csi);}mungeRemoteDescription(mediaDescription){this.munger.mungeRemoteDescription(mediaDescription);}get senderIds(){return this.munger.getSenderIds();}get numActiveSimulcastLayers(){var _a;if(getMediaFamily(this.mediaType)===MediaFamily.Video){return (_a=this.publishedStream)===null||_a===void 0?void 0:_a.getNumActiveSimulcastLayers();}return this.publishedStream?0:undefined;}getEncodingIndexForStreamId(id){return this.munger.getEncodingIndexForStreamId(id);}resetSdpMunger(){this.munger.reset();}setCodecParameters(parameters){this.munger.setCodecParameters(parameters);this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);}deleteCodecParameters(parameters){this.munger.deleteCodecParameters(parameters);this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);}}class SendSlot{constructor(sendTransceiver){this.sendTransceiver=sendTransceiver;}publishStream(stream){return __awaiter$1(this,void 0,void 0,function*(){if(stream===this.sendTransceiver.publishedStream){return Promise.resolve();}return this.sendTransceiver.publishStream(stream);});}unpublishStream(){return __awaiter$1(this,void 0,void 0,function*(){if(!this.sendTransceiver.publishedStream){return Promise.resolve();}return this.sendTransceiver.unpublishStream();});}setNamedMediaGroups(namedMediaGroups){this.sendTransceiver.setNamedMediaGroups(namedMediaGroups);}get active(){return this.sendTransceiver.active;}set active(active){this.sendTransceiver.active=active;}setCodecParameters(parameters){return __awaiter$1(this,void 0,void 0,function*(){this.sendTransceiver.setCodecParameters(parameters);});}deleteCodecParameters(parameters){return __awaiter$1(this,void 0,void 0,function*(){this.sendTransceiver.deleteCodecParameters(parameters);});}}class StatsManager{constructor(statsGetter){var statsPreprocessor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:()=>__awaiter$1(this,void 0,void 0,function*(){});this.statsGetter=statsGetter;this.statsPreProcessor=statsPreprocessor;}getStats(){return __awaiter$1(this,void 0,void 0,function*(){var statsReport=yield this.statsGetter();var statsMap=new Map();statsReport.forEach((stats,key)=>statsMap.set(key,stats));yield this.statsPreProcessor(statsMap);return statsMap;});}}var organizeTransceiverStats=(sendTransceivers,recvTransceivers)=>__awaiter$1(void 0,void 0,void 0,function*(){var result={audio:{senders:[],receivers:[]},video:{senders:[],receivers:[]},screenShareAudio:{senders:[],receivers:[]},screenShareVideo:{senders:[],receivers:[]}};yield Promise.all([...sendTransceivers.entries()].map(_ref6=>{var[mediaType,transceiver]=_ref6;return __awaiter$1(void 0,void 0,void 0,function*(){var _a;var item={report:yield transceiver.getStats(),mid:transceiver.mid,csi:transceiver.csi,currentDirection:'sendonly',localTrackLabel:(_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.label};if(mediaType===MediaType.AudioMain){result.audio.senders.push(item);}if(mediaType===MediaType.VideoMain){result.video.senders.push(item);}if(mediaType===MediaType.AudioSlides){result.screenShareAudio.senders.push(item);}if(mediaType===MediaType.VideoSlides){result.screenShareVideo.senders.push(item);}});}));yield Promise.all([...recvTransceivers.entries()].map(_ref7=>{var[mediaType,transceivers]=_ref7;return __awaiter$1(void 0,void 0,void 0,function*(){return Promise.all(transceivers.map(t=>__awaiter$1(void 0,void 0,void 0,function*(){var _b,_c;var item={report:yield t.getStats(),mid:(_b=t.receiveSlot.id)===null||_b===void 0?void 0:_b.mid,csi:t.receiveSlot.currentRxCsi,currentDirection:'recvonly',localTrackLabel:(_c=t.receiveSlot.stream.getTracks()[0])===null||_c===void 0?void 0:_c.label};if(mediaType===MediaType.AudioMain){result.audio.receivers.push(item);}if(mediaType===MediaType.VideoMain){result.video.receivers.push(item);}if(mediaType===MediaType.AudioSlides){result.screenShareAudio.receivers.push(item);}if(mediaType===MediaType.VideoSlides){result.screenShareVideo.receivers.push(item);}})));});}));return result;});function toMediaStreamTrackKind(mediaType){return [MediaType.VideoMain,MediaType.VideoSlides].includes(mediaType)?MediaStreamTrackKind.Video:MediaStreamTrackKind.Audio;}function webRtcVideoContentHintToJmpVideoContentHint(hint){if(hint==='motion'){return 'motion';}if(hint==='detail'){return 'sharpness';}return undefined;}var MultistreamConnectionEventNames;(function(MultistreamConnectionEventNames){MultistreamConnectionEventNames["VideoSourceCountUpdate"]="video-source-count-update";MultistreamConnectionEventNames["AudioSourceCountUpdate"]="audio-source-count-update";MultistreamConnectionEventNames["ActiveSpeakerNotification"]="active-speaker-notification";MultistreamConnectionEventNames["ConnectionStateUpdate"]="connection-state-update";MultistreamConnectionEventNames["NegotiationNeeded"]="negotiation-needed";})(MultistreamConnectionEventNames||(MultistreamConnectionEventNames={}));var defaultMultistreamConnectionOptions={disableSimulcast:BrowserInfo.isFirefox(),bundlePolicy:'max-compat',iceServers:undefined,disableContentSimulcast:true,disableAudioTwcc:true};class MultistreamConnection extends EventEmitter$2{constructor(){var userOptions=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};super();this.sendTransceivers=new Map();this.recvTransceivers=new Map();this.jmpSessions=new Map();this.pendingJmpTasks=[];this.metricsCallback=()=>{};this.overuseUpdateCallback=()=>{};this.midPredictor=new MidPredictor();this.offerAnswerQueue=new AsyncQueue();this.currentCreateOfferId=0;this.options=Object.assign(Object.assign({},defaultMultistreamConnectionOptions),userOptions);logger.info("Creating multistream connection with options ".concat(JSON.stringify(this.options)));this.initializePeerConnection();this.overuseStateManager=new OveruseStateManager(overuseState=>this.overuseUpdateCallback(overuseState));this.overuseStateManager.start();this.statsManager=new StatsManager(()=>this.pc.getStats(),stats=>this.preProcessStats(stats));var mainSceneId=generateSceneId();var slidesSceneId=generateSceneId();var videoMainEncodingOptions=this.getVideoEncodingOptions(MediaContent.Main);var videoSlidesEncodingOptions=this.getVideoEncodingOptions(MediaContent.Slides);this.createSendTransceiver(MediaType.VideoMain,mainSceneId,videoMainEncodingOptions);this.createSendTransceiver(MediaType.AudioMain,mainSceneId);this.createSendTransceiver(MediaType.VideoSlides,slidesSceneId,videoSlidesEncodingOptions);this.createSendTransceiver(MediaType.AudioSlides,slidesSceneId);}initializePeerConnection(){var _a;(_a=this.pc)===null||_a===void 0?void 0:_a.close();this.pc=new PeerConnection({iceServers:this.options.iceServers,bundlePolicy:this.options.bundlePolicy});this.pc.on(PeerConnection.Events.ConnectionStateChange,state=>this.emit(MultistreamConnectionEventNames.ConnectionStateUpdate,state));this.attachMetricsObserver();this.createDataChannel();}getConnectionState(){return this.pc.getConnectionState();}getVideoEncodingOptions(content){var enabledSimulcast=content===MediaContent.Main?!this.options.disableSimulcast:!this.options.disableContentSimulcast;return enabledSimulcast?[{scaleResolutionDownBy:4,active:false},{scaleResolutionDownBy:2,active:false},{active:false}]:[{active:false}];}createSendTransceiver(mediaType,sceneId,sendEncodingsOptions){var rtcTransceiver;try{rtcTransceiver=this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'sendrecv',sendEncodings:sendEncodingsOptions});}catch(e){logger.error("addTransceiver failed due to : ".concat(e));throw e;}var mid=this.midPredictor.getNextMid(mediaType);var csi=generateCsi(getMediaFamily(mediaType),sceneId);var munger=new EgressSdpMunger();var transceiver=new SendOnlyTransceiver(rtcTransceiver,mid,csi,munger,mediaType);if(getMediaFamily(mediaType)===MediaFamily.Video){transceiver.rtxEnabled=true;transceiver.setCodecParameters({'max-mbps':"".concat(defaultMaxVideoEncodeMbps),'max-fs':"".concat(defaultMaxVideoEncodeFrameSize)});}transceiver.twccDisabled=getMediaFamily(mediaType)===MediaFamily.Audio?this.options.disableAudioTwcc:false;transceiver.active=false;transceiver.streamMuteStateChange.on(()=>{this.sendSourceAdvertisement(mediaType);this.sendMediaRequestStatus(mediaType);});transceiver.streamPublishStateChange.on(()=>{this.sendSourceAdvertisement(mediaType);this.sendMediaRequestStatus(mediaType);});transceiver.negotiationNeeded.on(offerAnswerType=>{if(offerAnswerType===OfferAnswerType.Remote){this.emit(MultistreamConnectionEventNames.NegotiationNeeded);}else if(this.pc.getRemoteDescription()){this.queueLocalOfferAnswer();}});transceiver.namedMediaGroupsChange.on(()=>{this.sendSourceAdvertisement(mediaType);});this.sendTransceivers.set(mediaType,transceiver);this.createJmpSession(mediaType);}createSendSlot(mediaType){var active=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var transceiver=this.getSendTransceiverOrThrow(mediaType);transceiver.active=active;return new SendSlot(transceiver);}createJmpSession(mediaType){var jmpSession=new JmpSession(getMediaFamily(mediaType),getMediaContent(mediaType));jmpSession.setTxCallback(msg=>{var _a;if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)!=='open'){logger.error("DataChannel not created or not connected. Unable to send JMP message.");return;}logger.info("Sending JMP message: ".concat(msg));this.dataChannel.send(msg);});var prevNumTotalSources=0;var prevNumLiveSources=0;jmpSession.on(JmpSessionEvents.SourceAdvertisementReceived,data=>{logger.log("SourceAdvertisement received: ".concat(JSON.stringify(data)));if(data.numTotalSources!==prevNumTotalSources||data.numLiveSources!==prevNumLiveSources){prevNumTotalSources=data.numTotalSources;prevNumLiveSources=data.numLiveSources;var eventName=getMediaFamily(mediaType)===MediaFamily.Video?MultistreamConnectionEventNames.VideoSourceCountUpdate:MultistreamConnectionEventNames.AudioSourceCountUpdate;this.emit(eventName,data.numTotalSources,data.numLiveSources,getMediaContent(mediaType));}else {logger.log('Number of sources was unchanged, ignoring message');}});jmpSession.on(JmpSessionEvents.MediaRequestStatusReceived,data=>{logger.log("MediaRequestStatus received: ".concat(JSON.stringify(data)));data.streamStates.forEach(s=>{var receiveSlot=this.getReceiveSlotById(s.id);if(!receiveSlot){logger.warn("Got MediaRequestStatus for unknown receive slot: ".concat(JSON.stringify(s.id)));return;}receiveSlot._updateSource(s.state,s.csi);});});jmpSession.on(JmpSessionEvents.MediaRequestReceived,data=>{logger.log("MediaRequest received: ".concat(JSON.stringify(data)));this.updateRequestedStreams(mediaType,data.requests).then(()=>{if(getMediaFamily(mediaType)===MediaFamily.Video){this.sendMediaRequestStatus(mediaType);}});});jmpSession.on(JmpSessionEvents.ActiveSpeaker,data=>{this.emit(MultistreamConnectionEventNames.ActiveSpeakerNotification,data.csis);});this.jmpSessions.set(mediaType,jmpSession);}updateRequestedStreams(mediaType,requests){var sendTransceiver=this.getSendTransceiverOrThrow(mediaType);var mediaFamily=getMediaFamily(mediaType);var requestedIdEncodingParamsMap=new Map();var rsRequests=requests.filter(r=>isValidReceiverSelectedInfo(r.policySpecificInfo));if(rsRequests.length!==requests.length){logger.warn('Ignoring non-receiver-selected requests');}rsRequests.forEach(_ref8=>{var{ids,policySpecificInfo,codecInfos,maxPayloadBitsPerSecond}=_ref8;var _a,_b,_c;if(ids.length>1){logErrorAndThrow(WcmeErrorType.INVALID_STREAM_REQUEST,"Stream request cannot have more than one ID.");}if(ids.length===0){return;}if(sendTransceiver.csi!==policySpecificInfo.csi){logger.warn('csi in the StreamRequest does not match');return;}var id=ids[0];var codecInfo=codecInfos[0];var streamIdsMatched=sendTransceiver.senderIds.some(validId=>compareStreamIds(id,validId));if(streamIdsMatched){var encodingIndex=sendTransceiver.getEncodingIndexForStreamId(id);if(encodingIndex!==-1){var encodingParams={maxPayloadBitsPerSecond};if(mediaFamily===MediaFamily.Video){encodingParams.maxFs=(_a=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_a===void 0?void 0:_a.maxFs;encodingParams.maxWidth=(_b=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_b===void 0?void 0:_b.maxWidth;encodingParams.maxHeight=(_c=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_c===void 0?void 0:_c.maxHeight;}requestedIdEncodingParamsMap.set(encodingIndex,encodingParams);}else {logger.warn("".concat(mediaType,": Unable to get encoding index for stream ID: ").concat(JSON.stringify(id)));}}else {logger.warn("".concat(mediaType,": Unable to find matching stream ID for requested ID: ").concat(JSON.stringify(id)));}});return sendTransceiver.updateSendParameters(requestedIdEncodingParamsMap);}createDataChannel(){var dataChannel=this.pc.createDataChannel('datachannel',{ordered:false,maxRetransmits:0});dataChannel.onopen=event=>{logger.info('DataChannel opened:',JSON.stringify(event));[...this.sendTransceivers.keys()].forEach(mediaType=>{this.sendSourceAdvertisement(mediaType);});logger.info("Flushing pending JMP task queue");this.pendingJmpTasks.forEach(t=>t());this.pendingJmpTasks=[];};dataChannel.onmessage=e=>{var parsed;try{parsed=JSON.parse(e.data);}catch(err){logger.error("Error parsing datachannel JSON: ".concat(err));return;}logger.debug('DataChannel got msg:',e.data);var homerMsg=HomerMsg.fromJson(parsed);if(!homerMsg){logger.error("Received invalid datachannel message: ".concat(e));return;}var jmpMsg=homerMsg.payload;if(!isValidJmpMsg(jmpMsg)){logger.error("Received invalid JMP msg: ".concat(JSON.stringify(jmpMsg)));return;}var mediaType=getMediaType(jmpMsg.mediaFamily,jmpMsg.mediaContent);var jmpSession=this.jmpSessions.get(mediaType);if(!jmpSession){logger.error("Unable to find JMP session for media type ".concat(mediaType,"."));return;}jmpSession.receive(jmpMsg);};dataChannel.onclose=event=>{logger.info('DataChannel closed:',JSON.stringify(event));};dataChannel.onerror=event=>{logger.info('DataChannel error:',JSON.stringify(event));};this.dataChannel=dataChannel;}close(){this.sendTransceivers.forEach(t=>t.close());this.recvTransceivers.forEach(recvTransceivers=>{recvTransceivers.forEach(t=>t.close());});this.pc.close();}sendMediaRequestStatus(mediaType){var _a;if(getMediaFamily(mediaType)!==MediaFamily.Video){return;}if(!this.getSendTransceiverOrThrow(mediaType).requested){return;}var streamStates=this.getVideoStreamStates(mediaType);var task=()=>{var _a;(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendMediaRequestStatus(streamStates);};if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}sendSourceAdvertisement(mediaType){var _a,_b;var transceiver=this.getSendTransceiverOrThrow(mediaType);var numLiveSources=((_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.muted)===false?1:0;var task;if(getMediaFamily(mediaType)===MediaFamily.Video){var sources=this.getVideoStreamStates(mediaType);if(sources===null){return;}var contentHint;if(transceiver.publishedStream&&mediaType===MediaType.VideoSlides){contentHint=transceiver.publishedStream.contentHint;}task=()=>{var _a;(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendSourceAdvertisement(1,numLiveSources,[],webRtcVideoContentHintToJmpVideoContentHint(contentHint));};}else {task=()=>{var _a;return (_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendSourceAdvertisement(1,numLiveSources,mediaType===MediaType.AudioMain?transceiver.namedMediaGroups:[]);};}if(((_b=this.dataChannel)===null||_b===void 0?void 0:_b.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}getVideoStreamStates(mediaType){var _a;var sendTransceiver=this.getSendTransceiverOrThrow(mediaType);var published=!!sendTransceiver.publishedStream;var muted=(_a=sendTransceiver.publishedStream)===null||_a===void 0?void 0:_a.muted;return sendTransceiver.senderIds.map(id=>{var state;if(!published){state='no source';}else if(muted){state='avatar';}else {state='live';}return {id,state,csi:sendTransceiver.csi};});}createReceiveSlot(mediaType){return __awaiter$1(this,void 0,void 0,function*(){return new Promise(createReceiveSlotResolve=>{this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var rtcRtpTransceiver=this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'recvonly'});var transceiverMid=this.midPredictor.getNextMid(mediaType);var munger=new IngressSdpMunger();var recvOnlyTransceiver=new ReceiveOnlyTransceiver(rtcRtpTransceiver,transceiverMid,munger);recvOnlyTransceiver.twccDisabled=getMediaFamily(mediaType)===MediaFamily.Audio?this.options.disableAudioTwcc:false;this.recvTransceivers.set(mediaType,[...(this.recvTransceivers.get(mediaType)||[]),recvOnlyTransceiver]);if(this.pc.getRemoteDescription()){yield this.doLocalOfferAnswer();}createReceiveSlotResolve(recvOnlyTransceiver.receiveSlot);}));});});}getIngressPayloadType(mediaType,mimeType){var _a,_b,_c;var requestedMediaCodecType=mimeType.split('/')[1];var requestedMid=(_a=this.sendTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.mid;var parsedOffer=parse$1((_b=this.pc.getLocalDescription())===null||_b===void 0?void 0:_b.sdp);var parsedAnswer=parse$1((_c=this.pc.getRemoteDescription())===null||_c===void 0?void 0:_c.sdp);var senderCodecs=parsedAnswer.avMedia.filter(media=>requestedMid===media.mid).map(media=>[...media.codecs.values()]).flat().filter(ci=>ci.name===requestedMediaCodecType);var receiverCodecs=parsedOffer.avMedia.filter(media=>requestedMid===media.mid).map(media=>[...media.codecs.values()]).flat().filter(ci=>ci.name===requestedMediaCodecType);if(!senderCodecs||!receiverCodecs||senderCodecs.length===0||receiverCodecs.length===0){logErrorAndThrow(WcmeErrorType.GET_PAYLOAD_TYPE_FAILED,"Sender codecs or receiver codecs is undefined or empty.");}var senderCodec=senderCodecs[0];var targetCodec=receiverCodecs.find(receiverCodec=>{return areCodecsCompatible(senderCodec,receiverCodec);});if(!targetCodec||!targetCodec.pt){logErrorAndThrow(WcmeErrorType.GET_PAYLOAD_TYPE_FAILED,"Cannot find matching receiver codec for the given mediaType/mimeType.");}return targetCodec.pt;}createOffer(){return __awaiter$1(this,void 0,void 0,function*(){if(!this.pc.getLocalDescription()){this.midPredictor.allocateMidForDatachannel();}if(this.setAnswerResolve){logger.info('Canceling previous offer since setAnswer was never called for it');this.setAnswerResolve();this.setAnswerResolve=undefined;}var createOfferId=++this.currentCreateOfferId;return new Promise((createOfferResolve,createOfferReject)=>{this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var _a;try{var offer=yield this.pc.createOffer();if(!offer.sdp){logErrorAndThrow(WcmeErrorType.CREATE_OFFER_FAILED,'SDP not found in offer.');}offer.sdp=this.preProcessLocalOffer(offer.sdp);yield this.pc.setLocalDescription(offer);var sdpToSend=this.prepareLocalOfferForRemoteServer((_a=this.pc.getLocalDescription())===null||_a===void 0?void 0:_a.sdp);createOfferResolve({type:'offer',sdp:sdpToSend});if(this.currentCreateOfferId>createOfferId){logger.log('Canceling previous offer since createOffer was called while it was being created');}else {yield new Promise(setAnswerResolve=>{this.setAnswerResolve=setAnswerResolve;});}}catch(error){createOfferReject(error);}}));});});}setAnswer(answer){return __awaiter$1(this,void 0,void 0,function*(){var sdp=this.preProcessRemoteAnswer(answer);if(!this.setAnswerResolve){logErrorAndThrow(WcmeErrorType.SET_ANSWER_FAILED,"Call to setAnswer without having previously called createOffer.");}logger.info('calling this.pc.setRemoteDescription()');return this.pc.setRemoteDescription({type:'answer',sdp}).then(()=>__awaiter$1(this,void 0,void 0,function*(){logger.info('this.pc.setRemoteDescription() resolved');if(this.setAnswerResolve){this.setAnswerResolve();this.setAnswerResolve=undefined;}else {logger.debug("setAnswerResolve function was cleared between setAnswer and result of setRemoteDescription");}}));});}doLocalOfferAnswer(){var _a;return __awaiter$1(this,void 0,void 0,function*(){var offer=yield this.pc.createOffer();if(!offer.sdp){logErrorAndThrow(WcmeErrorType.CREATE_OFFER_FAILED,'SDP not found in offer.');}offer.sdp=this.preProcessLocalOffer(offer.sdp);yield this.pc.setLocalDescription(offer);var answer=this.preProcessRemoteAnswer((_a=this.pc.getRemoteDescription())===null||_a===void 0?void 0:_a.sdp);return this.pc.setRemoteDescription({type:'answer',sdp:answer});});}queueLocalOfferAnswer(){return __awaiter$1(this,void 0,void 0,function*(){return this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){yield this.doLocalOfferAnswer();}));});}preProcessLocalOffer(offer){var parsedOffer=parse$1(offer);parsedOffer.avMedia.filter(av=>av.direction==='recvonly').forEach(av=>{var recvTransceiver=this.getRecvTransceiverByMidOrThrow(av.mid);recvTransceiver.mungeLocalDescription(av);});parsedOffer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='inactive').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeLocalDescription(av);});if(BrowserInfo.isFirefox()){setupBundle(parsedOffer,this.options.bundlePolicy,this.midPredictor.getMidMap());}return parsedOffer.toString();}prepareLocalOfferForRemoteServer(offer){var parsedOffer=parse$1(offer);parsedOffer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='inactive').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeLocalDescriptionForRemoteServer(av);});parsedOffer.media.filter(media=>media instanceof ApplicationMediaDescription$1).forEach(media=>{injectDummyCandidates(media);});if(BrowserInfo.isFirefox()){setupBundle(parsedOffer,this.options.bundlePolicy,this.midPredictor.getMidMap());if(this.options.bundlePolicy==='max-bundle'){parsedOffer.media.forEach((media,index)=>{if(index>0){media.port=parsedOffer.media[0].port;}});}}filterRecvOnlyMediaDescriptions(parsedOffer);return parsedOffer.toString();}preProcessRemoteAnswer(answer){var _a;var parsedAnswer=parse$1(answer);var parsedOffer=parse$1((_a=this.pc.getLocalDescription())===null||_a===void 0?void 0:_a.sdp);matchMediaDescriptionsInAnswer(parsedOffer,parsedAnswer);parsedAnswer.avMedia.filter(av=>av.direction==='sendonly').forEach(av=>{var recvTransceiver=this.getRecvTransceiverByMidOrThrow(av.mid);recvTransceiver.mungeRemoteDescription(av);});parsedAnswer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='recvonly').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeRemoteDescription(av);});parsedAnswer.media.filter(media=>media instanceof ApplicationMediaDescription$1).forEach(media=>{if(retainCandidates(media,['udp','tcp'])){logger.log("Some unsupported remote candidates have been removed from mid ".concat(media.mid));}});if(BrowserInfo.isFirefox()){setupBundle(parsedAnswer,this.options.bundlePolicy,this.midPredictor.getMidMap());}return parsedAnswer.toString();}getSendTransceiverOrThrow(mediaType){var sendTransceiver=this.sendTransceivers.get(mediaType);if(!sendTransceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find send transceiver for media type ".concat(mediaType,"."));}return sendTransceiver;}getSendTransceiverByMidOrThrow(mid){var transceiver=[...this.sendTransceivers.values()].find(t=>t.mid===mid);if(!transceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find send transceiver with MID ".concat(mid,"."));}return transceiver;}getRecvTransceiverByMidOrThrow(mid){var transceiver=[...this.recvTransceivers.values()].flat().find(t=>t.mid===mid);if(!transceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find recv transceiver with MID ".concat(mid,"."));}return transceiver;}requestMedia(mediaType,streamRequests){var _a;var task=()=>{var _a;var jmpSession=this.jmpSessions.get(mediaType);if(!jmpSession){logger.error("Unable to find jmp session for ".concat(mediaType));return;}var requestedReceiveSlotIds=[];streamRequests.forEach(sr=>{sr.receiveSlots.forEach(rs=>{if(!rs.id){logger.error("Running stream request task, but ReceiveSlot ID is missing!");return;}requestedReceiveSlotIds.push(rs.id);});});(_a=this.recvTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.forEach(transceiver=>{if(!requestedReceiveSlotIds.some(id=>compareStreamIds(id,transceiver.receiveSlot.id))){transceiver.receiveSlot._updateSource('no source',undefined);}});jmpSession.sendRequests(streamRequests.map(sr=>sr._toJmpStreamRequest()));};if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}renewPeerConnection(userOptions){if(userOptions){this.options=Object.assign(Object.assign({},this.options),userOptions);}logger.info("Renewing multistream connection with options ".concat(JSON.stringify(this.options)));this.midPredictor.reset();this.initializePeerConnection();var mainSceneId=generateSceneId();var slidesSceneId=generateSceneId();this.sendTransceivers.forEach((transceiver,mediaType)=>{var _a;var mediaContent=getMediaContent(mediaType);var sceneId=mediaContent===MediaContent.Main?mainSceneId:slidesSceneId;var mid=this.midPredictor.getNextMid(mediaType);transceiver.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'sendrecv',sendEncodings:getMediaFamily(mediaType)===MediaFamily.Video?this.getVideoEncodingOptions(mediaContent):undefined}));transceiver.mid=mid;transceiver.csi=generateCsi(getMediaFamily(mediaType),sceneId);transceiver.resetSdpMunger();(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.close();this.createJmpSession(mediaType);});this.recvTransceivers.forEach((transceivers,mediaType)=>{transceivers.forEach(t=>{var mid=this.midPredictor.getNextMid(mediaType);t.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'recvonly'}));t.mid=mid;});});}getReceiveSlotById(id){return [...this.recvTransceivers.values()].flat().map(transceiver=>transceiver.receiveSlot).find(receiveSlot=>{var receiveSlotId=receiveSlot.id||{};return Object.keys(receiveSlotId).length===Object.keys(id).length&&Object.keys(receiveSlotId).every(key=>Object.prototype.hasOwnProperty.call(id,key)&&receiveSlotId[key]===id[key]);});}getStats(){return this.statsManager.getStats();}getTransceiverStats(){return __awaiter$1(this,void 0,void 0,function*(){return organizeTransceiverStats(this.sendTransceivers,this.recvTransceivers);});}preProcessStats(stats){return __awaiter$1(this,void 0,void 0,function*(){yield Promise.all([...this.sendTransceivers.entries()].map(_ref9=>{var[mediaType,transceiver]=_ref9;return __awaiter$1(this,void 0,void 0,function*(){(yield transceiver.getStats()).forEach(senderStats=>{var _a;if(senderStats.type==='outbound-rtp'){var statsToModify=stats.get(senderStats.id);statsToModify.mid=transceiver.mid;statsToModify.csi=transceiver.csi;statsToModify.calliopeMediaType=mediaType;var trackSettings=(_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.getSettings();if(trackSettings===null||trackSettings===void 0?void 0:trackSettings.frameRate){statsToModify.targetFrameRate=trackSettings===null||trackSettings===void 0?void 0:trackSettings.frameRate;}stats.set(senderStats.id,statsToModify);}else if(senderStats.type==='media-source'){var _statsToModify=stats.get(senderStats.id);_statsToModify.calliopeMediaType=mediaType;stats.set(senderStats.id,_statsToModify);}});});}));yield Promise.all([...this.recvTransceivers.entries()].map(_ref10=>{var[mediaType,transceivers]=_ref10;return __awaiter$1(this,void 0,void 0,function*(){yield Promise.all(transceivers.map(transceiver=>__awaiter$1(this,void 0,void 0,function*(){(yield transceiver.getStats()).forEach(receiverStats=>{var _a;if(receiverStats.type==='inbound-rtp'){var statsToModify=stats.get(receiverStats.id);statsToModify.mid=(_a=transceiver.receiveSlot.id)===null||_a===void 0?void 0:_a.mid;statsToModify.csi=transceiver.receiveSlot.currentRxCsi;statsToModify.calliopeMediaType=mediaType;Object.assign(statsToModify,transceiver.receiverId);stats.set(receiverStats.id,statsToModify);}});})));});}));});}attachMetricsObserver(){this.forceStatsReport=rtcStats_1(this.pc.getUnderlyingRTCPeerConnection(),data=>this.metricsCallback(data),5000,stats=>this.preProcessStats(stats)).forceStatsReport;}forceRtcMetricsCallback(){var _a;return (_a=this.forceStatsReport)===null||_a===void 0?void 0:_a.call(this);}setMetricsCallback(callback){this.metricsCallback=callback;}setOveruseUpdateCallback(callback){this.overuseUpdateCallback=callback;}getCsiByMediaType(mediaType){var _a;return (_a=this.sendTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.csi;}getAllCsis(){return {audioMain:this.getCsiByMediaType(MediaType.AudioMain),audioSlides:this.getCsiByMediaType(MediaType.AudioSlides),videoMain:this.getCsiByMediaType(MediaType.VideoMain),videoSlides:this.getCsiByMediaType(MediaType.VideoSlides)};}}class StreamRequest{constructor(policy,policySpecificInfo,receiveSlots,maxPayloadBitsPerSecond){var codecInfos=arguments.length>4&&arguments[4]!==undefined?arguments[4]:[];this.policy=policy;this.policySpecificInfo=policySpecificInfo;this.receiveSlots=receiveSlots;this.maxPayloadBitsPerSecond=maxPayloadBitsPerSecond;this.codecInfos=codecInfos;}_toJmpStreamRequest(){return new StreamRequest$1(this.policy,this.policySpecificInfo,this.receiveSlots.map(rs=>rs.id),this.maxPayloadBitsPerSecond,this.codecInfos);}}
|
|
4839
|
+
*/function waterfall(tasks,callback){callback=once(callback);if(!Array.isArray(tasks))return callback(new Error('First argument to waterfall must be an array of functions'));if(!tasks.length)return callback();var taskIndex=0;function nextTask(args){var task=wrapAsync(tasks[taskIndex++]);task(...args,onlyOnce(next));}function next(err){if(err===false)return;for(var _len22=arguments.length,args=new Array(_len22>1?_len22-1:0),_key22=1;_key22<_len22;_key22++){args[_key22-1]=arguments[_key22];}if(err||taskIndex===tasks.length){return callback(err,...args);}nextTask(args);}nextTask([]);}awaitify(waterfall);function processTasks(task,finishedCallback){return __awaiter$1(this,void 0,void 0,function*(){try{yield task();finishedCallback();}catch(e){finishedCallback(e);}});}class AsyncQueue{constructor(){this.queue=queue$1(processTasks,1);}push(task){return this.queue.pushAsync(task);}empty(){return this.queue.empty();}}var OfferAnswerType;(function(OfferAnswerType){OfferAnswerType[OfferAnswerType["LocalOnly"]=0]="LocalOnly";OfferAnswerType[OfferAnswerType["Remote"]=1]="Remote";})(OfferAnswerType||(OfferAnswerType={}));class SendOnlyTransceiver extends Transceiver{constructor(rtcRtpTransceiver,mid,csi,munger,mediaType){super(rtcRtpTransceiver,mid);this.rtxEnabled=false;this.streamMuteStateChange=new TypedEvent();this.streamPublishStateChange=new TypedEvent();this.negotiationNeeded=new TypedEvent();this.namedMediaGroupsChange=new TypedEvent();this.requestedIdEncodingParamsMap=new Map();this.updateSendParametersQueue=new AsyncQueue();this.csi=csi;this.direction='sendrecv';this.handleTrackChange=this.handleTrackChange.bind(this);this.handleStreamConstraintsChange=this.handleStreamConstraintsChange.bind(this);this.handleStreamMuteStateChange=this.handleStreamMuteStateChange.bind(this);this.munger=munger;this.mediaType=mediaType;}replaceSenderSource(stream){var _a,_b;return __awaiter$1(this,void 0,void 0,function*(){var trackOrNull=(_a=stream===null||stream===void 0?void 0:stream.outputStream.getTracks()[0])!==null&&_a!==void 0?_a:null;if(((_b=this.sender.track)===null||_b===void 0?void 0:_b.id)!==(trackOrNull===null||trackOrNull===void 0?void 0:trackOrNull.id)){yield this.sender.replaceTrack(trackOrNull);if(trackOrNull){logger.log("Sender source for ".concat(this.mediaType," replaced with track ID ").concat(trackOrNull.id));}else {logger.log("Sender source for ".concat(this.mediaType," set to null, sender stopped"));}}});}handleTrackChange(){return __awaiter$1(this,void 0,void 0,function*(){if(this.requested){yield this.replaceSenderSource(this.publishedStream);}});}handleStreamConstraintsChange(){return __awaiter$1(this,void 0,void 0,function*(){yield this.updateSendParameters(this.requestedIdEncodingParamsMap);});}handleStreamMuteStateChange(){this.streamMuteStateChange.emit();}get requested(){return this.requestedIdEncodingParamsMap.size>0;}replaceTransceiver(newRtcRtpTransceiver){var _super=Object.create(null,{replaceTransceiver:{get:()=>super.replaceTransceiver}});return __awaiter$1(this,void 0,void 0,function*(){_super.replaceTransceiver.call(this,newRtcRtpTransceiver);newRtcRtpTransceiver.direction=this.direction;if(this.requested){yield this.replaceSenderSource(this.publishedStream);}});}replacePublishedStream(newStream){return __awaiter$1(this,void 0,void 0,function*(){var oldStream=this.publishedStream;oldStream===null||oldStream===void 0?void 0:oldStream.off(LocalStreamEventNames.OutputTrackChange,this.handleTrackChange);oldStream===null||oldStream===void 0?void 0:oldStream.off(LocalStreamEventNames.ConstraintsChange,this.handleStreamConstraintsChange);oldStream===null||oldStream===void 0?void 0:oldStream.off(StreamEventNames.MuteStateChange,this.handleStreamMuteStateChange);if(this.requested){yield this.replaceSenderSource(newStream);}this.publishedStream=newStream;newStream===null||newStream===void 0?void 0:newStream.on(LocalStreamEventNames.OutputTrackChange,this.handleTrackChange);newStream===null||newStream===void 0?void 0:newStream.on(LocalStreamEventNames.ConstraintsChange,this.handleStreamConstraintsChange);newStream===null||newStream===void 0?void 0:newStream.on(StreamEventNames.MuteStateChange,this.handleStreamMuteStateChange);if(!oldStream&&newStream&&!newStream.muted||oldStream&&!newStream&&!oldStream.muted){this.streamPublishStateChange.emit();}else if((oldStream===null||oldStream===void 0?void 0:oldStream.muted)!==(newStream===null||newStream===void 0?void 0:newStream.muted)){this.streamMuteStateChange.emit();}});}setNamedMediaGroups(namedMediaGroups){if(this.mediaType!==MediaType.AudioMain){logErrorAndThrow(WcmeErrorType.SET_NMG_FAILED,"Named media groups can only be set for audio.");}this.namedMediaGroups=namedMediaGroups;this.namedMediaGroupsChange.emit();}publishStream(stream){return this.replacePublishedStream(stream);}unpublishStream(){return this.replacePublishedStream();}get active(){return this._rtcRtpTransceiver.direction==='sendrecv';}set active(enabled){this.direction=enabled?'sendrecv':'inactive';this._rtcRtpTransceiver.direction=this.direction;if(this._rtcRtpTransceiver.direction!==this._rtcRtpTransceiver.currentDirection){this.negotiationNeeded.emit(OfferAnswerType.Remote);}}getStats(){return this.sender.getStats();}updateSendParameters(requestedIdEncodingParamsMap){return __awaiter$1(this,void 0,void 0,function*(){return this.updateSendParametersQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var requested=requestedIdEncodingParamsMap.size>0;if(this.requested!==requested){yield this.replaceSenderSource(requested?this.publishedStream:null);}var sendParameters=this.sender.getParameters();sendParameters.encodings.forEach((encoding,index)=>{var _a,_b;var encodingParams=requestedIdEncodingParamsMap.get(index);encoding.active=!!encodingParams;if(encodingParams){var{maxPayloadBitsPerSecond,maxFs,maxWidth,maxHeight}=encodingParams;var scaleDownRatio=getScaleDownRatio((_a=this.publishedStream)===null||_a===void 0?void 0:_a.getSettings().width,(_b=this.publishedStream)===null||_b===void 0?void 0:_b.getSettings().height,maxFs,maxWidth,maxHeight);if(maxPayloadBitsPerSecond!==undefined&&maxPayloadBitsPerSecond>=0){encoding.maxBitrate=maxPayloadBitsPerSecond;}if(scaleDownRatio!==undefined&&scaleDownRatio>=1.0){encoding.scaleResolutionDownBy=scaleDownRatio;}}});yield this.sender.setParameters(sendParameters);this.requestedIdEncodingParamsMap=requestedIdEncodingParamsMap;}));});}isSimulcastEnabled(){var params=this.sender.getParameters();return params.encodings.length>1;}mungeLocalDescription(mediaDescription){this.munger.mungeLocalDescription(mediaDescription,this.isSimulcastEnabled(),this.rtxEnabled,this.twccDisabled);}mungeLocalDescriptionForRemoteServer(mediaDescription){this.munger.mungeLocalDescriptionForRemoteServer(mediaDescription,getMediaContent(this.mediaType),this.csi);}mungeRemoteDescription(mediaDescription){this.munger.mungeRemoteDescription(mediaDescription);}get senderIds(){return this.munger.getSenderIds();}get numActiveSimulcastLayers(){var _a;if(getMediaFamily(this.mediaType)===MediaFamily.Video){return (_a=this.publishedStream)===null||_a===void 0?void 0:_a.getNumActiveSimulcastLayers();}return this.publishedStream?0:undefined;}getEncodingIndexForStreamId(id){return this.munger.getEncodingIndexForStreamId(id);}resetSdpMunger(){this.munger.reset();}setCodecParameters(parameters){this.munger.setCodecParameters(parameters);this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);}deleteCodecParameters(parameters){this.munger.deleteCodecParameters(parameters);this.negotiationNeeded.emit(OfferAnswerType.LocalOnly);}}class SendSlot{constructor(sendTransceiver){this.sendTransceiver=sendTransceiver;}publishStream(stream){return __awaiter$1(this,void 0,void 0,function*(){if(stream===this.sendTransceiver.publishedStream){return Promise.resolve();}return this.sendTransceiver.publishStream(stream);});}unpublishStream(){return __awaiter$1(this,void 0,void 0,function*(){if(!this.sendTransceiver.publishedStream){return Promise.resolve();}return this.sendTransceiver.unpublishStream();});}setNamedMediaGroups(namedMediaGroups){this.sendTransceiver.setNamedMediaGroups(namedMediaGroups);}get active(){return this.sendTransceiver.active;}set active(active){this.sendTransceiver.active=active;}setCodecParameters(parameters){return __awaiter$1(this,void 0,void 0,function*(){this.sendTransceiver.setCodecParameters(parameters);});}deleteCodecParameters(parameters){return __awaiter$1(this,void 0,void 0,function*(){this.sendTransceiver.deleteCodecParameters(parameters);});}}class StatsManager{constructor(statsGetter){var statsPreprocessor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:()=>__awaiter$1(this,void 0,void 0,function*(){});this.statsGetter=statsGetter;this.statsPreProcessor=statsPreprocessor;}getStats(){return __awaiter$1(this,void 0,void 0,function*(){var statsReport=yield this.statsGetter();var statsMap=new Map();statsReport.forEach((stats,key)=>statsMap.set(key,stats));yield this.statsPreProcessor(statsMap);return statsMap;});}}var organizeTransceiverStats=(sendTransceivers,recvTransceivers)=>__awaiter$1(void 0,void 0,void 0,function*(){var result={audio:{senders:[],receivers:[]},video:{senders:[],receivers:[]},screenShareAudio:{senders:[],receivers:[]},screenShareVideo:{senders:[],receivers:[]}};yield Promise.all([...sendTransceivers.entries()].map(_ref6=>{var[mediaType,transceiver]=_ref6;return __awaiter$1(void 0,void 0,void 0,function*(){var _a;var item={report:yield transceiver.getStats(),mid:transceiver.mid,csi:transceiver.csi,currentDirection:'sendonly',localTrackLabel:(_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.label};if(mediaType===MediaType.AudioMain){result.audio.senders.push(item);}if(mediaType===MediaType.VideoMain){result.video.senders.push(item);}if(mediaType===MediaType.AudioSlides){result.screenShareAudio.senders.push(item);}if(mediaType===MediaType.VideoSlides){result.screenShareVideo.senders.push(item);}});}));yield Promise.all([...recvTransceivers.entries()].map(_ref7=>{var[mediaType,transceivers]=_ref7;return __awaiter$1(void 0,void 0,void 0,function*(){return Promise.all(transceivers.map(t=>__awaiter$1(void 0,void 0,void 0,function*(){var _b,_c;var item={report:yield t.getStats(),mid:(_b=t.receiveSlot.id)===null||_b===void 0?void 0:_b.mid,csi:t.receiveSlot.currentRxCsi,currentDirection:'recvonly',localTrackLabel:(_c=t.receiveSlot.stream.getTracks()[0])===null||_c===void 0?void 0:_c.label};if(mediaType===MediaType.AudioMain){result.audio.receivers.push(item);}if(mediaType===MediaType.VideoMain){result.video.receivers.push(item);}if(mediaType===MediaType.AudioSlides){result.screenShareAudio.receivers.push(item);}if(mediaType===MediaType.VideoSlides){result.screenShareVideo.receivers.push(item);}})));});}));return result;});function toMediaStreamTrackKind(mediaType){return [MediaType.VideoMain,MediaType.VideoSlides].includes(mediaType)?MediaStreamTrackKind.Video:MediaStreamTrackKind.Audio;}function webRtcVideoContentHintToJmpVideoContentHint(hint){if(hint==='motion'){return 'motion';}if(hint==='detail'){return 'sharpness';}return undefined;}var MultistreamConnectionEventNames;(function(MultistreamConnectionEventNames){MultistreamConnectionEventNames["VideoSourceCountUpdate"]="video-source-count-update";MultistreamConnectionEventNames["AudioSourceCountUpdate"]="audio-source-count-update";MultistreamConnectionEventNames["ActiveSpeakerNotification"]="active-speaker-notification";MultistreamConnectionEventNames["ConnectionStateUpdate"]="connection-state-update";MultistreamConnectionEventNames["NegotiationNeeded"]="negotiation-needed";})(MultistreamConnectionEventNames||(MultistreamConnectionEventNames={}));var defaultMultistreamConnectionOptions={disableSimulcast:BrowserInfo.isFirefox(),bundlePolicy:'max-compat',iceServers:undefined,disableContentSimulcast:true,disableAudioTwcc:true};class MultistreamConnection extends EventEmitter$2{constructor(){var userOptions=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};super();this.sendTransceivers=new Map();this.recvTransceivers=new Map();this.jmpSessions=new Map();this.pendingJmpTasks=[];this.metricsCallback=()=>{};this.overuseUpdateCallback=()=>{};this.midPredictor=new MidPredictor();this.offerAnswerQueue=new AsyncQueue();this.currentCreateOfferId=0;this.options=Object.assign(Object.assign({},defaultMultistreamConnectionOptions),userOptions);logger.info("Creating multistream connection with options ".concat(JSON.stringify(this.options)));this.initializePeerConnection();this.overuseStateManager=new OveruseStateManager(overuseState=>this.overuseUpdateCallback(overuseState));this.overuseStateManager.start();this.statsManager=new StatsManager(()=>this.pc.getStats(),stats=>this.preProcessStats(stats));var mainSceneId=generateSceneId();var slidesSceneId=generateSceneId();var videoMainEncodingOptions=this.getVideoEncodingOptions(MediaContent.Main);var videoSlidesEncodingOptions=this.getVideoEncodingOptions(MediaContent.Slides);this.createSendTransceiver(MediaType.VideoMain,mainSceneId,videoMainEncodingOptions);this.createSendTransceiver(MediaType.AudioMain,mainSceneId);this.createSendTransceiver(MediaType.VideoSlides,slidesSceneId,videoSlidesEncodingOptions);this.createSendTransceiver(MediaType.AudioSlides,slidesSceneId);}initializePeerConnection(){var _a;(_a=this.pc)===null||_a===void 0?void 0:_a.close();this.pc=new PeerConnection({iceServers:this.options.iceServers,bundlePolicy:this.options.bundlePolicy});this.pc.on(PeerConnection.Events.ConnectionStateChange,state=>this.emit(MultistreamConnectionEventNames.ConnectionStateUpdate,state));this.attachMetricsObserver();this.createDataChannel();}getConnectionState(){return this.pc.getConnectionState();}getVideoEncodingOptions(content){var enabledSimulcast=content===MediaContent.Main?!this.options.disableSimulcast:!this.options.disableContentSimulcast;return enabledSimulcast?[{scaleResolutionDownBy:4,active:false},{scaleResolutionDownBy:2,active:false},{active:false}]:[{active:false}];}createSendTransceiver(mediaType,sceneId,sendEncodingsOptions){var rtcTransceiver;try{rtcTransceiver=this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'sendrecv',sendEncodings:sendEncodingsOptions});}catch(e){logger.error("addTransceiver failed due to : ".concat(e));throw e;}var mid=this.midPredictor.getNextMid(mediaType);var csi=generateCsi(getMediaFamily(mediaType),sceneId);var munger=new EgressSdpMunger();var transceiver=new SendOnlyTransceiver(rtcTransceiver,mid,csi,munger,mediaType);if(getMediaFamily(mediaType)===MediaFamily.Video){transceiver.rtxEnabled=true;transceiver.setCodecParameters({'max-mbps':"".concat(defaultMaxVideoEncodeMbps),'max-fs':"".concat(defaultMaxVideoEncodeFrameSize)});}transceiver.twccDisabled=getMediaFamily(mediaType)===MediaFamily.Audio?this.options.disableAudioTwcc:false;transceiver.active=false;transceiver.streamMuteStateChange.on(()=>{this.sendSourceAdvertisement(mediaType);this.sendMediaRequestStatus(mediaType);});transceiver.streamPublishStateChange.on(()=>{this.sendSourceAdvertisement(mediaType);this.sendMediaRequestStatus(mediaType);});transceiver.negotiationNeeded.on(offerAnswerType=>{if(offerAnswerType===OfferAnswerType.Remote){this.emit(MultistreamConnectionEventNames.NegotiationNeeded);}else if(this.pc.getRemoteDescription()){this.queueLocalOfferAnswer();}});transceiver.namedMediaGroupsChange.on(()=>{this.sendSourceAdvertisement(mediaType);});this.sendTransceivers.set(mediaType,transceiver);this.createJmpSession(mediaType);}createSendSlot(mediaType){var active=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var transceiver=this.getSendTransceiverOrThrow(mediaType);transceiver.active=active;return new SendSlot(transceiver);}createJmpSession(mediaType){var jmpSession=new JmpSession(getMediaFamily(mediaType),getMediaContent(mediaType));jmpSession.setTxCallback(msg=>{var _a;if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)!=='open'){logger.error("DataChannel not created or not connected. Unable to send JMP message.");return;}logger.info("Sending JMP message: ".concat(msg));this.dataChannel.send(msg);});var prevNumTotalSources=0;var prevNumLiveSources=0;jmpSession.on(JmpSessionEvents.SourceAdvertisementReceived,data=>{logger.log("SourceAdvertisement received: ".concat(JSON.stringify(data)));if(data.numTotalSources!==prevNumTotalSources||data.numLiveSources!==prevNumLiveSources){prevNumTotalSources=data.numTotalSources;prevNumLiveSources=data.numLiveSources;var eventName=getMediaFamily(mediaType)===MediaFamily.Video?MultistreamConnectionEventNames.VideoSourceCountUpdate:MultistreamConnectionEventNames.AudioSourceCountUpdate;this.emit(eventName,data.numTotalSources,data.numLiveSources,getMediaContent(mediaType));}else {logger.log('Number of sources was unchanged, ignoring message');}});jmpSession.on(JmpSessionEvents.MediaRequestStatusReceived,data=>{logger.log("MediaRequestStatus received: ".concat(JSON.stringify(data)));data.streamStates.forEach(s=>{var receiveSlot=this.getReceiveSlotById(s.id);if(!receiveSlot){logger.warn("Got MediaRequestStatus for unknown receive slot: ".concat(JSON.stringify(s.id)));return;}receiveSlot._updateSource(s.state,s.csi);});});jmpSession.on(JmpSessionEvents.MediaRequestReceived,data=>{logger.log("MediaRequest received: ".concat(JSON.stringify(data)));this.updateRequestedStreams(mediaType,data.requests).then(()=>{if(getMediaFamily(mediaType)===MediaFamily.Video){this.sendMediaRequestStatus(mediaType);}});});jmpSession.on(JmpSessionEvents.ActiveSpeaker,data=>{this.emit(MultistreamConnectionEventNames.ActiveSpeakerNotification,data.csis);});this.jmpSessions.set(mediaType,jmpSession);}updateRequestedStreams(mediaType,requests){var sendTransceiver=this.getSendTransceiverOrThrow(mediaType);var mediaFamily=getMediaFamily(mediaType);var requestedIdEncodingParamsMap=new Map();var rsRequests=requests.filter(r=>isValidReceiverSelectedInfo(r.policySpecificInfo));if(rsRequests.length!==requests.length){logger.warn('Ignoring non-receiver-selected requests');}rsRequests.forEach(_ref8=>{var{ids,policySpecificInfo,codecInfos,maxPayloadBitsPerSecond}=_ref8;var _a,_b,_c;if(ids.length>1){logErrorAndThrow(WcmeErrorType.INVALID_STREAM_REQUEST,"Stream request cannot have more than one ID.");}if(ids.length===0){return;}if(sendTransceiver.csi!==policySpecificInfo.csi){logger.warn('csi in the StreamRequest does not match');return;}var id=ids[0];var codecInfo=codecInfos[0];var streamIdsMatched=sendTransceiver.senderIds.some(validId=>compareStreamIds(id,validId));if(streamIdsMatched){var encodingIndex=sendTransceiver.getEncodingIndexForStreamId(id);if(encodingIndex!==-1){var encodingParams={maxPayloadBitsPerSecond};if(mediaFamily===MediaFamily.Video){encodingParams.maxFs=(_a=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_a===void 0?void 0:_a.maxFs;encodingParams.maxWidth=(_b=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_b===void 0?void 0:_b.maxWidth;encodingParams.maxHeight=(_c=codecInfo===null||codecInfo===void 0?void 0:codecInfo.h264)===null||_c===void 0?void 0:_c.maxHeight;}requestedIdEncodingParamsMap.set(encodingIndex,encodingParams);}else {logger.warn("".concat(mediaType,": Unable to get encoding index for stream ID: ").concat(JSON.stringify(id)));}}else {logger.warn("".concat(mediaType,": Unable to find matching stream ID for requested ID: ").concat(JSON.stringify(id)));}});return sendTransceiver.updateSendParameters(requestedIdEncodingParamsMap);}createDataChannel(){var dataChannel=this.pc.createDataChannel('datachannel',{ordered:false,maxRetransmits:0});dataChannel.onopen=event=>{logger.info('DataChannel opened:',JSON.stringify(event));[...this.sendTransceivers.keys()].forEach(mediaType=>{this.sendSourceAdvertisement(mediaType);});logger.info("Flushing pending JMP task queue");this.pendingJmpTasks.forEach(t=>t());this.pendingJmpTasks=[];};dataChannel.onmessage=e=>{var parsed;try{parsed=JSON.parse(e.data);}catch(err){logger.error("Error parsing datachannel JSON: ".concat(err));return;}logger.debug('DataChannel got msg:',e.data);var homerMsg=HomerMsg.fromJson(parsed);if(!homerMsg){logger.error("Received invalid datachannel message: ".concat(e));return;}var jmpMsg=homerMsg.payload;if(!isValidJmpMsg(jmpMsg)){logger.error("Received invalid JMP msg: ".concat(JSON.stringify(jmpMsg)));return;}var mediaType=getMediaType(jmpMsg.mediaFamily,jmpMsg.mediaContent);var jmpSession=this.jmpSessions.get(mediaType);if(!jmpSession){logger.error("Unable to find JMP session for media type ".concat(mediaType,"."));return;}jmpSession.receive(jmpMsg);};dataChannel.onclose=event=>{logger.info('DataChannel closed:',JSON.stringify(event));};dataChannel.onerror=event=>{logger.info('DataChannel error:',JSON.stringify(event));};this.dataChannel=dataChannel;}close(){this.sendTransceivers.forEach(t=>t.close());this.recvTransceivers.forEach(recvTransceivers=>{recvTransceivers.forEach(t=>t.close());});this.jmpSessions.forEach(jmpSession=>jmpSession.close());this.pc.close();}sendMediaRequestStatus(mediaType){var _a;if(getMediaFamily(mediaType)!==MediaFamily.Video){return;}if(!this.getSendTransceiverOrThrow(mediaType).requested){return;}var streamStates=this.getVideoStreamStates(mediaType);var task=()=>{var _a;(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendMediaRequestStatus(streamStates);};if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}sendSourceAdvertisement(mediaType){var _a,_b;var transceiver=this.getSendTransceiverOrThrow(mediaType);var numLiveSources=((_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.muted)===false?1:0;var task;if(getMediaFamily(mediaType)===MediaFamily.Video){var sources=this.getVideoStreamStates(mediaType);if(sources===null){return;}var contentHint;if(transceiver.publishedStream&&mediaType===MediaType.VideoSlides){contentHint=transceiver.publishedStream.contentHint;}task=()=>{var _a;(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendSourceAdvertisement(1,numLiveSources,[],webRtcVideoContentHintToJmpVideoContentHint(contentHint));};}else {task=()=>{var _a;return (_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.sendSourceAdvertisement(1,numLiveSources,mediaType===MediaType.AudioMain?transceiver.namedMediaGroups:[]);};}if(((_b=this.dataChannel)===null||_b===void 0?void 0:_b.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}getVideoStreamStates(mediaType){var _a;var sendTransceiver=this.getSendTransceiverOrThrow(mediaType);var published=!!sendTransceiver.publishedStream;var muted=(_a=sendTransceiver.publishedStream)===null||_a===void 0?void 0:_a.muted;return sendTransceiver.senderIds.map(id=>{var state;if(!published){state='no source';}else if(muted){state='avatar';}else {state='live';}return {id,state,csi:sendTransceiver.csi};});}createReceiveSlot(mediaType){return __awaiter$1(this,void 0,void 0,function*(){return new Promise(createReceiveSlotResolve=>{this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var rtcRtpTransceiver=this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'recvonly'});var transceiverMid=this.midPredictor.getNextMid(mediaType);var munger=new IngressSdpMunger();var recvOnlyTransceiver=new ReceiveOnlyTransceiver(rtcRtpTransceiver,transceiverMid,munger);recvOnlyTransceiver.twccDisabled=getMediaFamily(mediaType)===MediaFamily.Audio?this.options.disableAudioTwcc:false;this.recvTransceivers.set(mediaType,[...(this.recvTransceivers.get(mediaType)||[]),recvOnlyTransceiver]);if(this.pc.getRemoteDescription()){yield this.doLocalOfferAnswer();}createReceiveSlotResolve(recvOnlyTransceiver.receiveSlot);}));});});}getIngressPayloadType(mediaType,mimeType){var _a,_b,_c;var requestedMediaCodecType=mimeType.split('/')[1];var requestedMid=(_a=this.sendTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.mid;var parsedOffer=parse$1((_b=this.pc.getLocalDescription())===null||_b===void 0?void 0:_b.sdp);var parsedAnswer=parse$1((_c=this.pc.getRemoteDescription())===null||_c===void 0?void 0:_c.sdp);var senderCodecs=parsedAnswer.avMedia.filter(media=>requestedMid===media.mid).map(media=>[...media.codecs.values()]).flat().filter(ci=>ci.name===requestedMediaCodecType);var receiverCodecs=parsedOffer.avMedia.filter(media=>requestedMid===media.mid).map(media=>[...media.codecs.values()]).flat().filter(ci=>ci.name===requestedMediaCodecType);if(!senderCodecs||!receiverCodecs||senderCodecs.length===0||receiverCodecs.length===0){logErrorAndThrow(WcmeErrorType.GET_PAYLOAD_TYPE_FAILED,"Sender codecs or receiver codecs is undefined or empty.");}var senderCodec=senderCodecs[0];var targetCodec=receiverCodecs.find(receiverCodec=>{return areCodecsCompatible(senderCodec,receiverCodec);});if(!targetCodec||!targetCodec.pt){logErrorAndThrow(WcmeErrorType.GET_PAYLOAD_TYPE_FAILED,"Cannot find matching receiver codec for the given mediaType/mimeType.");}return targetCodec.pt;}createOffer(){return __awaiter$1(this,void 0,void 0,function*(){if(!this.pc.getLocalDescription()){this.midPredictor.allocateMidForDatachannel();}if(this.setAnswerResolve){logger.info('Canceling previous offer since setAnswer was never called for it');this.setAnswerResolve();this.setAnswerResolve=undefined;}var createOfferId=++this.currentCreateOfferId;return new Promise((createOfferResolve,createOfferReject)=>{this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){var _a;try{var offer=yield this.pc.createOffer();if(!offer.sdp){logErrorAndThrow(WcmeErrorType.CREATE_OFFER_FAILED,'SDP not found in offer.');}offer.sdp=this.preProcessLocalOffer(offer.sdp);yield this.pc.setLocalDescription(offer);var sdpToSend=this.prepareLocalOfferForRemoteServer((_a=this.pc.getLocalDescription())===null||_a===void 0?void 0:_a.sdp);createOfferResolve({type:'offer',sdp:sdpToSend});if(this.currentCreateOfferId>createOfferId){logger.log('Canceling previous offer since createOffer was called while it was being created');}else {yield new Promise(setAnswerResolve=>{this.setAnswerResolve=setAnswerResolve;});}}catch(error){createOfferReject(error);}}));});});}setAnswer(answer){return __awaiter$1(this,void 0,void 0,function*(){var sdp=this.preProcessRemoteAnswer(answer);if(!this.setAnswerResolve){logErrorAndThrow(WcmeErrorType.SET_ANSWER_FAILED,"Call to setAnswer without having previously called createOffer.");}logger.info('calling this.pc.setRemoteDescription()');return this.pc.setRemoteDescription({type:'answer',sdp}).then(()=>__awaiter$1(this,void 0,void 0,function*(){logger.info('this.pc.setRemoteDescription() resolved');if(this.setAnswerResolve){this.setAnswerResolve();this.setAnswerResolve=undefined;}else {logger.debug("setAnswerResolve function was cleared between setAnswer and result of setRemoteDescription");}}));});}doLocalOfferAnswer(){var _a;return __awaiter$1(this,void 0,void 0,function*(){var offer=yield this.pc.createOffer();if(!offer.sdp){logErrorAndThrow(WcmeErrorType.CREATE_OFFER_FAILED,'SDP not found in offer.');}offer.sdp=this.preProcessLocalOffer(offer.sdp);yield this.pc.setLocalDescription(offer);var answer=this.preProcessRemoteAnswer((_a=this.pc.getRemoteDescription())===null||_a===void 0?void 0:_a.sdp);return this.pc.setRemoteDescription({type:'answer',sdp:answer});});}queueLocalOfferAnswer(){return __awaiter$1(this,void 0,void 0,function*(){return this.offerAnswerQueue.push(()=>__awaiter$1(this,void 0,void 0,function*(){yield this.doLocalOfferAnswer();}));});}preProcessLocalOffer(offer){var parsedOffer=parse$1(offer);parsedOffer.avMedia.filter(av=>av.direction==='recvonly').forEach(av=>{var recvTransceiver=this.getRecvTransceiverByMidOrThrow(av.mid);recvTransceiver.mungeLocalDescription(av);});parsedOffer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='inactive').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeLocalDescription(av);});if(BrowserInfo.isFirefox()){setupBundle(parsedOffer,this.options.bundlePolicy,this.midPredictor.getMidMap());}return parsedOffer.toString();}prepareLocalOfferForRemoteServer(offer){var parsedOffer=parse$1(offer);parsedOffer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='inactive').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeLocalDescriptionForRemoteServer(av);});parsedOffer.media.filter(media=>media instanceof ApplicationMediaDescription$1).forEach(media=>{injectDummyCandidates(media);});if(BrowserInfo.isFirefox()){setupBundle(parsedOffer,this.options.bundlePolicy,this.midPredictor.getMidMap());if(this.options.bundlePolicy==='max-bundle'){parsedOffer.media.forEach((media,index)=>{if(index>0){media.port=parsedOffer.media[0].port;}});}}filterRecvOnlyMediaDescriptions(parsedOffer);return parsedOffer.toString();}preProcessRemoteAnswer(answer){var _a;var parsedAnswer=parse$1(answer);var parsedOffer=parse$1((_a=this.pc.getLocalDescription())===null||_a===void 0?void 0:_a.sdp);matchMediaDescriptionsInAnswer(parsedOffer,parsedAnswer);parsedAnswer.avMedia.filter(av=>av.direction==='sendonly').forEach(av=>{var recvTransceiver=this.getRecvTransceiverByMidOrThrow(av.mid);recvTransceiver.mungeRemoteDescription(av);});parsedAnswer.avMedia.filter(av=>av.direction==='sendrecv'||av.direction==='recvonly').forEach(av=>{var sendTransceiver=this.getSendTransceiverByMidOrThrow(av.mid);sendTransceiver.mungeRemoteDescription(av);});parsedAnswer.media.filter(media=>media instanceof ApplicationMediaDescription$1).forEach(media=>{if(retainCandidates(media,['udp','tcp'])){logger.log("Some unsupported remote candidates have been removed from mid ".concat(media.mid));}});if(BrowserInfo.isFirefox()){setupBundle(parsedAnswer,this.options.bundlePolicy,this.midPredictor.getMidMap());}return parsedAnswer.toString();}getSendTransceiverOrThrow(mediaType){var sendTransceiver=this.sendTransceivers.get(mediaType);if(!sendTransceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find send transceiver for media type ".concat(mediaType,"."));}return sendTransceiver;}getSendTransceiverByMidOrThrow(mid){var transceiver=[...this.sendTransceivers.values()].find(t=>t.mid===mid);if(!transceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find send transceiver with MID ".concat(mid,"."));}return transceiver;}getRecvTransceiverByMidOrThrow(mid){var transceiver=[...this.recvTransceivers.values()].flat().find(t=>t.mid===mid);if(!transceiver){logErrorAndThrow(WcmeErrorType.GET_TRANSCEIVER_FAILED,"Unable to find recv transceiver with MID ".concat(mid,"."));}return transceiver;}requestMedia(mediaType,streamRequests){var _a;var task=()=>{var _a;var jmpSession=this.jmpSessions.get(mediaType);if(!jmpSession){logger.error("Unable to find jmp session for ".concat(mediaType));return;}var requestedReceiveSlotIds=[];streamRequests.forEach(sr=>{sr.receiveSlots.forEach(rs=>{if(!rs.id){logger.error("Running stream request task, but ReceiveSlot ID is missing!");return;}requestedReceiveSlotIds.push(rs.id);});});(_a=this.recvTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.forEach(transceiver=>{if(!requestedReceiveSlotIds.some(id=>compareStreamIds(id,transceiver.receiveSlot.id))){transceiver.receiveSlot._updateSource('no source',undefined);}});jmpSession.sendRequests(streamRequests.map(sr=>sr._toJmpStreamRequest()));};if(((_a=this.dataChannel)===null||_a===void 0?void 0:_a.readyState)==='open'){task();}else {this.pendingJmpTasks.push(task);}}renewPeerConnection(userOptions){if(userOptions){this.options=Object.assign(Object.assign({},this.options),userOptions);}logger.info("Renewing multistream connection with options ".concat(JSON.stringify(this.options)));this.midPredictor.reset();this.initializePeerConnection();var mainSceneId=generateSceneId();var slidesSceneId=generateSceneId();this.sendTransceivers.forEach((transceiver,mediaType)=>{var _a;var mediaContent=getMediaContent(mediaType);var sceneId=mediaContent===MediaContent.Main?mainSceneId:slidesSceneId;var mid=this.midPredictor.getNextMid(mediaType);transceiver.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'sendrecv',sendEncodings:getMediaFamily(mediaType)===MediaFamily.Video?this.getVideoEncodingOptions(mediaContent):undefined}));transceiver.mid=mid;transceiver.csi=generateCsi(getMediaFamily(mediaType),sceneId);transceiver.resetSdpMunger();(_a=this.jmpSessions.get(mediaType))===null||_a===void 0?void 0:_a.close();this.createJmpSession(mediaType);});this.recvTransceivers.forEach((transceivers,mediaType)=>{transceivers.forEach(t=>{var mid=this.midPredictor.getNextMid(mediaType);t.replaceTransceiver(this.pc.addTransceiver(toMediaStreamTrackKind(mediaType),{direction:'recvonly'}));t.mid=mid;});});}getReceiveSlotById(id){return [...this.recvTransceivers.values()].flat().map(transceiver=>transceiver.receiveSlot).find(receiveSlot=>{var receiveSlotId=receiveSlot.id||{};return Object.keys(receiveSlotId).length===Object.keys(id).length&&Object.keys(receiveSlotId).every(key=>Object.prototype.hasOwnProperty.call(id,key)&&receiveSlotId[key]===id[key]);});}getStats(){return this.statsManager.getStats();}getTransceiverStats(){return __awaiter$1(this,void 0,void 0,function*(){return organizeTransceiverStats(this.sendTransceivers,this.recvTransceivers);});}preProcessStats(stats){return __awaiter$1(this,void 0,void 0,function*(){yield Promise.all([...this.sendTransceivers.entries()].map(_ref9=>{var[mediaType,transceiver]=_ref9;return __awaiter$1(this,void 0,void 0,function*(){(yield transceiver.getStats()).forEach(senderStats=>{var _a;if(senderStats.type==='outbound-rtp'){var statsToModify=stats.get(senderStats.id);statsToModify.mid=transceiver.mid;statsToModify.csi=transceiver.csi;statsToModify.calliopeMediaType=mediaType;var trackSettings=(_a=transceiver.publishedStream)===null||_a===void 0?void 0:_a.getSettings();if(trackSettings===null||trackSettings===void 0?void 0:trackSettings.frameRate){statsToModify.targetFrameRate=trackSettings===null||trackSettings===void 0?void 0:trackSettings.frameRate;}stats.set(senderStats.id,statsToModify);}else if(senderStats.type==='media-source'){var _statsToModify=stats.get(senderStats.id);_statsToModify.calliopeMediaType=mediaType;stats.set(senderStats.id,_statsToModify);}});});}));yield Promise.all([...this.recvTransceivers.entries()].map(_ref10=>{var[mediaType,transceivers]=_ref10;return __awaiter$1(this,void 0,void 0,function*(){yield Promise.all(transceivers.map(transceiver=>__awaiter$1(this,void 0,void 0,function*(){(yield transceiver.getStats()).forEach(receiverStats=>{var _a;if(receiverStats.type==='inbound-rtp'){var statsToModify=stats.get(receiverStats.id);statsToModify.mid=(_a=transceiver.receiveSlot.id)===null||_a===void 0?void 0:_a.mid;statsToModify.csi=transceiver.receiveSlot.currentRxCsi;statsToModify.calliopeMediaType=mediaType;Object.assign(statsToModify,transceiver.receiverId);stats.set(receiverStats.id,statsToModify);}});})));});}));});}attachMetricsObserver(){this.forceStatsReport=rtcStats_1(this.pc.getUnderlyingRTCPeerConnection(),data=>this.metricsCallback(data),5000,stats=>this.preProcessStats(stats)).forceStatsReport;}forceRtcMetricsCallback(){var _a;return (_a=this.forceStatsReport)===null||_a===void 0?void 0:_a.call(this);}setMetricsCallback(callback){this.metricsCallback=callback;}setOveruseUpdateCallback(callback){this.overuseUpdateCallback=callback;}getCsiByMediaType(mediaType){var _a;return (_a=this.sendTransceivers.get(mediaType))===null||_a===void 0?void 0:_a.csi;}getAllCsis(){return {audioMain:this.getCsiByMediaType(MediaType.AudioMain),audioSlides:this.getCsiByMediaType(MediaType.AudioSlides),videoMain:this.getCsiByMediaType(MediaType.VideoMain),videoSlides:this.getCsiByMediaType(MediaType.VideoSlides)};}}class StreamRequest{constructor(policy,policySpecificInfo,receiveSlots,maxPayloadBitsPerSecond){var codecInfos=arguments.length>4&&arguments[4]!==undefined?arguments[4]:[];this.policy=policy;this.policySpecificInfo=policySpecificInfo;this.receiveSlots=receiveSlots;this.maxPayloadBitsPerSecond=maxPayloadBitsPerSecond;this.codecInfos=codecInfos;}_toJmpStreamRequest(){return new StreamRequest$1(this.policy,this.policySpecificInfo,this.receiveSlots.map(rs=>rs.id),this.maxPayloadBitsPerSecond,this.codecInfos);}}
|
|
5854
4840
|
|
|
5855
4841
|
var defaultLogger = {
|
|
5856
4842
|
info: function info() {
|
|
@@ -16231,18 +15217,6 @@ class MultistreamRoapMediaConnection extends EventEmitter$6 {
|
|
|
16231
15217
|
|
|
16232
15218
|
var Errors = Error$1;
|
|
16233
15219
|
|
|
16234
|
-
function isBrowserSupported() {
|
|
16235
|
-
var isSupported = false;
|
|
16236
|
-
logger$4.info({
|
|
16237
|
-
mediaType: MEDIA,
|
|
16238
|
-
action: 'isBrowserSupported()',
|
|
16239
|
-
description: 'Checking is current browser supported by webrtc'
|
|
16240
|
-
});
|
|
16241
|
-
if ((DetectRTC.exports.browser.isChrome || DetectRTC.exports.browser.isFirefox || DetectRTC.exports.browser.isSafari || DetectRTC.exports.browser.isEdge) && DetectRTC.exports.isWebRTCSupported) {
|
|
16242
|
-
isSupported = true;
|
|
16243
|
-
}
|
|
16244
|
-
return isSupported;
|
|
16245
|
-
}
|
|
16246
15220
|
var Media = {
|
|
16247
15221
|
createAudioTrack: createAudioTrack,
|
|
16248
15222
|
createVideoTrack: createVideoTrack,
|
|
@@ -16250,15 +15224,14 @@ var Media = {
|
|
|
16250
15224
|
getCameras: getCameras,
|
|
16251
15225
|
getMicrophones: getMicrophones,
|
|
16252
15226
|
getSpeakers: getSpeakers,
|
|
16253
|
-
on: on,
|
|
16254
|
-
off: off,
|
|
15227
|
+
on: on$1,
|
|
15228
|
+
off: off$1,
|
|
16255
15229
|
Effects: {
|
|
16256
15230
|
BNR: {
|
|
16257
15231
|
enableBNR: enableBNR,
|
|
16258
15232
|
disableBNR: disableBNR
|
|
16259
15233
|
}
|
|
16260
|
-
}
|
|
16261
|
-
isBrowserSupported
|
|
15234
|
+
}
|
|
16262
15235
|
};
|
|
16263
15236
|
|
|
16264
|
-
export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, Event$1 as Event, H264Codec, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteTrackType, RoapMediaConnection, SendSlot, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraStream, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices,
|
|
15237
|
+
export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, Event$1 as Event, H264Codec, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteTrackType, RoapMediaConnection, SendSlot, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraStream, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices, setLogger, setOnDeviceChangeHandler };
|