@techsee/techsee-media-service 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/MultiParty/opentok/OpentokSubscriber.js +0 -2
  2. package/lib/MultiParty/opentok/OpentokSubscriber.js.map +1 -1
  3. package/package.json +5 -3
  4. package/lib/oldCode/constants.js +0 -25
  5. package/lib/oldCode/constants.js.map +0 -1
  6. package/lib/oldCode/event-emitter.js +0 -62
  7. package/lib/oldCode/event-emitter.js.map +0 -1
  8. package/lib/oldCode/index.js +0 -60
  9. package/lib/oldCode/index.js.map +0 -1
  10. package/lib/oldCode/opentok/session.js +0 -335
  11. package/lib/oldCode/opentok/session.js.map +0 -1
  12. package/lib/oldCode/opentok/stream.js +0 -324
  13. package/lib/oldCode/opentok/stream.js.map +0 -1
  14. package/lib/oldCode/publisher.js +0 -168
  15. package/lib/oldCode/publisher.js.map +0 -1
  16. package/lib/oldCode/service.js +0 -417
  17. package/lib/oldCode/service.js.map +0 -1
  18. package/lib/oldCode/session.js +0 -132
  19. package/lib/oldCode/session.js.map +0 -1
  20. package/lib/oldCode/stream.js +0 -223
  21. package/lib/oldCode/stream.js.map +0 -1
  22. package/lib/oldCode/subscriber.js +0 -115
  23. package/lib/oldCode/subscriber.js.map +0 -1
  24. package/lib/oldCode/tracer.d.ts +0 -36
  25. package/lib/oldCode/tracer.d.ts.map +0 -1
  26. package/lib/oldCode/tracer.js +0 -202
  27. package/lib/oldCode/tracer.js.map +0 -1
  28. package/lib/oldCode/utils/ImageFixer.d.ts +0 -1
  29. package/lib/oldCode/utils/ImageFixer.d.ts.map +0 -1
  30. package/lib/oldCode/utils/ImageFixer.js +0 -83
  31. package/lib/oldCode/utils/ImageFixer.js.map +0 -1
  32. package/lib/oldCode/webrtc/constants.js +0 -106
  33. package/lib/oldCode/webrtc/constants.js.map +0 -1
  34. package/lib/oldCode/webrtc/helper.js +0 -225
  35. package/lib/oldCode/webrtc/helper.js.map +0 -1
  36. package/lib/oldCode/webrtc/session-kms.js +0 -573
  37. package/lib/oldCode/webrtc/session-kms.js.map +0 -1
  38. package/lib/oldCode/webrtc/session-loopback.js +0 -354
  39. package/lib/oldCode/webrtc/session-loopback.js.map +0 -1
  40. package/lib/oldCode/webrtc/session-turn.js +0 -927
  41. package/lib/oldCode/webrtc/session-turn.js.map +0 -1
  42. package/lib/oldCode/webrtc/session-turn.v2.js +0 -592
  43. package/lib/oldCode/webrtc/session-turn.v2.js.map +0 -1
  44. package/lib/oldCode/webrtc/session.js +0 -58
  45. package/lib/oldCode/webrtc/session.js.map +0 -1
  46. package/lib/oldCode/webrtc/stream.js +0 -696
  47. package/lib/oldCode/webrtc/stream.js.map +0 -1
  48. package/lib/oldCode/webrtc/temasys/adapter-loader.js +0 -11
  49. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +0 -1
  50. package/lib/oldCode/webrtc/temasys/adapter.js +0 -5933
  51. package/lib/oldCode/webrtc/temasys/adapter.js.map +0 -1
  52. package/lib/oldCode/webrtc/webrtc-ie-shim.js +0 -3437
  53. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +0 -1
@@ -1,3437 +0,0 @@
1
- "use strict";
2
-
3
- function _typeof2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
4
-
5
- (function (f) {
6
- if ((typeof exports === "undefined" ? "undefined" : _typeof2(exports)) === "object" && typeof module !== "undefined") {
7
- module.exports = f();
8
- } else if (typeof define === "function" && define.amd) {
9
- define([], f);
10
- } else {
11
- var g;
12
-
13
- if (typeof window !== "undefined") {
14
- g = window;
15
- } else if (typeof global !== "undefined") {
16
- g = global;
17
- } else if (typeof self !== "undefined") {
18
- g = self;
19
- } else {
20
- g = this;
21
- }
22
-
23
- g.webrtcIeShim = f();
24
- }
25
- })(function () {
26
- var define, module, exports;
27
- return function () {
28
- function r(e, n, t) {
29
- function o(i, f) {
30
- if (!n[i]) {
31
- if (!e[i]) {
32
- var c = "function" == typeof require && require;
33
- if (!f && c) return c(i, !0);
34
- if (u) return u(i, !0);
35
- var a = new Error("Cannot find module '" + i + "'");
36
- throw a.code = "MODULE_NOT_FOUND", a;
37
- }
38
-
39
- var p = n[i] = {
40
- exports: {}
41
- };
42
- e[i][0].call(p.exports, function (r) {
43
- var n = e[i][1][r];
44
- return o(n || r);
45
- }, p, p.exports, r, e, n, t);
46
- }
47
-
48
- return n[i].exports;
49
- }
50
-
51
- for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) {
52
- o(t[i]);
53
- }
54
-
55
- return o;
56
- }
57
-
58
- return r;
59
- }()({
60
- 1: [function (require, module, exports) {
61
- exports.endianness = function () {
62
- return 'LE';
63
- };
64
-
65
- exports.hostname = function () {
66
- if (typeof location !== 'undefined') {
67
- return location.hostname;
68
- } else return '';
69
- };
70
-
71
- exports.loadavg = function () {
72
- return [];
73
- };
74
-
75
- exports.uptime = function () {
76
- return 0;
77
- };
78
-
79
- exports.freemem = function () {
80
- return Number.MAX_VALUE;
81
- };
82
-
83
- exports.totalmem = function () {
84
- return Number.MAX_VALUE;
85
- };
86
-
87
- exports.cpus = function () {
88
- return [];
89
- };
90
-
91
- exports.type = function () {
92
- return 'Browser';
93
- };
94
-
95
- exports.release = function () {
96
- if (typeof navigator !== 'undefined') {
97
- return navigator.appVersion;
98
- }
99
-
100
- return '';
101
- };
102
-
103
- exports.networkInterfaces = exports.getNetworkInterfaces = function () {
104
- return {};
105
- };
106
-
107
- exports.arch = function () {
108
- return 'javascript';
109
- };
110
-
111
- exports.platform = function () {
112
- return 'browser';
113
- };
114
-
115
- exports.tmpdir = exports.tmpDir = function () {
116
- return '/tmp';
117
- };
118
-
119
- exports.EOL = '\n';
120
-
121
- exports.homedir = function () {
122
- return '/';
123
- };
124
- }, {}],
125
- 2: [function (require, module, exports) {
126
- // shim for using process in browser
127
- var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
128
- // don't break things. But we need to wrap it in a try catch in case it is
129
- // wrapped in strict mode code which doesn't define any globals. It's inside a
130
- // function because try/catches deoptimize in certain engines.
131
-
132
- var cachedSetTimeout;
133
- var cachedClearTimeout;
134
-
135
- function defaultSetTimout() {
136
- throw new Error('setTimeout has not been defined');
137
- }
138
-
139
- function defaultClearTimeout() {
140
- throw new Error('clearTimeout has not been defined');
141
- }
142
-
143
- (function () {
144
- try {
145
- if (typeof setTimeout === 'function') {
146
- cachedSetTimeout = setTimeout;
147
- } else {
148
- cachedSetTimeout = defaultSetTimout;
149
- }
150
- } catch (e) {
151
- cachedSetTimeout = defaultSetTimout;
152
- }
153
-
154
- try {
155
- if (typeof clearTimeout === 'function') {
156
- cachedClearTimeout = clearTimeout;
157
- } else {
158
- cachedClearTimeout = defaultClearTimeout;
159
- }
160
- } catch (e) {
161
- cachedClearTimeout = defaultClearTimeout;
162
- }
163
- })();
164
-
165
- function runTimeout(fun) {
166
- if (cachedSetTimeout === setTimeout) {
167
- //normal enviroments in sane situations
168
- return setTimeout(fun, 0);
169
- } // if setTimeout wasn't available but was latter defined
170
-
171
-
172
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
173
- cachedSetTimeout = setTimeout;
174
- return setTimeout(fun, 0);
175
- }
176
-
177
- try {
178
- // when when somebody has screwed with setTimeout but no I.E. maddness
179
- return cachedSetTimeout(fun, 0);
180
- } catch (e) {
181
- try {
182
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
183
- return cachedSetTimeout.call(null, fun, 0);
184
- } catch (e) {
185
- // 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
186
- return cachedSetTimeout.call(this, fun, 0);
187
- }
188
- }
189
- }
190
-
191
- function runClearTimeout(marker) {
192
- if (cachedClearTimeout === clearTimeout) {
193
- //normal enviroments in sane situations
194
- return clearTimeout(marker);
195
- } // if clearTimeout wasn't available but was latter defined
196
-
197
-
198
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
199
- cachedClearTimeout = clearTimeout;
200
- return clearTimeout(marker);
201
- }
202
-
203
- try {
204
- // when when somebody has screwed with setTimeout but no I.E. maddness
205
- return cachedClearTimeout(marker);
206
- } catch (e) {
207
- try {
208
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
209
- return cachedClearTimeout.call(null, marker);
210
- } catch (e) {
211
- // 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.
212
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
213
- return cachedClearTimeout.call(this, marker);
214
- }
215
- }
216
- }
217
-
218
- var queue = [];
219
- var draining = false;
220
- var currentQueue;
221
- var queueIndex = -1;
222
-
223
- function cleanUpNextTick() {
224
- if (!draining || !currentQueue) {
225
- return;
226
- }
227
-
228
- draining = false;
229
-
230
- if (currentQueue.length) {
231
- queue = currentQueue.concat(queue);
232
- } else {
233
- queueIndex = -1;
234
- }
235
-
236
- if (queue.length) {
237
- drainQueue();
238
- }
239
- }
240
-
241
- function drainQueue() {
242
- if (draining) {
243
- return;
244
- }
245
-
246
- var timeout = runTimeout(cleanUpNextTick);
247
- draining = true;
248
- var len = queue.length;
249
-
250
- while (len) {
251
- currentQueue = queue;
252
- queue = [];
253
-
254
- while (++queueIndex < len) {
255
- if (currentQueue) {
256
- currentQueue[queueIndex].run();
257
- }
258
- }
259
-
260
- queueIndex = -1;
261
- len = queue.length;
262
- }
263
-
264
- currentQueue = null;
265
- draining = false;
266
- runClearTimeout(timeout);
267
- }
268
-
269
- process.nextTick = function (fun) {
270
- var args = new Array(arguments.length - 1);
271
-
272
- if (arguments.length > 1) {
273
- for (var i = 1; i < arguments.length; i++) {
274
- args[i - 1] = arguments[i];
275
- }
276
- }
277
-
278
- queue.push(new Item(fun, args));
279
-
280
- if (queue.length === 1 && !draining) {
281
- runTimeout(drainQueue);
282
- }
283
- }; // v8 likes predictible objects
284
-
285
-
286
- function Item(fun, array) {
287
- this.fun = fun;
288
- this.array = array;
289
- }
290
-
291
- Item.prototype.run = function () {
292
- this.fun.apply(null, this.array);
293
- };
294
-
295
- process.title = 'browser';
296
- process.browser = true;
297
- process.env = {};
298
- process.argv = [];
299
- process.version = ''; // empty string to avoid regexp issues
300
-
301
- process.versions = {};
302
-
303
- function noop() {}
304
-
305
- process.on = noop;
306
- process.addListener = noop;
307
- process.once = noop;
308
- process.off = noop;
309
- process.removeListener = noop;
310
- process.removeAllListeners = noop;
311
- process.emit = noop;
312
- process.prependListener = noop;
313
- process.prependOnceListener = noop;
314
-
315
- process.listeners = function (name) {
316
- return [];
317
- };
318
-
319
- process.binding = function (name) {
320
- throw new Error('process.binding is not supported');
321
- };
322
-
323
- process.cwd = function () {
324
- return '/';
325
- };
326
-
327
- process.chdir = function (dir) {
328
- throw new Error('process.chdir is not supported');
329
- };
330
-
331
- process.umask = function () {
332
- return 0;
333
- };
334
- }, {}],
335
- 3: [function (require, module, exports) {
336
- 'use strict';
337
-
338
- var browser = require('detect-browser').detect();
339
-
340
- var WebRTCProxy = require('./lib/WebRTCProxy.js'); //If it is not internet exploer, do nothign
341
-
342
-
343
- if (browser.name === 'ie' && WebRTCProxy) {
344
- //Helper functions to check video nodes
345
- var checkNewNode = function checkNewNode(node) {
346
- //If it is a video element
347
- if (node.nodeName.match(/video/i)) // Observe changes in the video element
348
- return VideoRenderer.handle(node); //Look in childs
349
-
350
- for (var j = 0; j < node.childNodes.length; j++) {
351
- checkNewNode(node.childNodes.item(j));
352
- }
353
- };
354
-
355
- var checkRemovedNode = function checkRemovedNode(node) {
356
- //If it is a video element
357
- if (node.nodeName.match(/video/i)) return VideoRenderer.unhandle(node); //Look in childs
358
-
359
- for (var j = 0; j < node.childNodes.length; j++) {
360
- checkRemovedNode(node.childNodes.item(j));
361
- }
362
- };
363
-
364
- var makeInterface = function makeInterface(Base) {
365
- //Interface with no constructor
366
- var Interface = function Interface() {
367
- throw new TypeError();
368
- }; //Set name
369
-
370
-
371
- Object.defineProperty(Interface, 'name', {
372
- enumerable: false,
373
- configurable: true,
374
- writable: false,
375
- value: Base.name
376
- }); //Create constructor and reset protocol chain
377
-
378
- Interface.prototype = Object.create(Base.prototype, {
379
- constructor: {
380
- value: Interface,
381
- configurable: true,
382
- writable: false
383
- }
384
- }); //Fix protocol chain
385
-
386
- Interface.__proto__ = Base.__proto__; //Make prototype read only
387
-
388
- Object.defineProperty(Interface, 'prototype', {
389
- writable: false
390
- }); //Ok
391
-
392
- return Interface;
393
- };
394
-
395
- var defineGlobalProperty = function defineGlobalProperty(name, value) {
396
- Object.defineProperty(window, name, {
397
- enumerable: false,
398
- configurable: true,
399
- writable: true,
400
- value: value
401
- });
402
- }; // Add objects to global
403
-
404
-
405
- var MediaDevices = require('./lib/MediaDevices.js');
406
-
407
- var VideoRenderer = require('./lib/VideoRenderer.js');
408
-
409
- navigator.mediaDevices = new MediaDevices();
410
-
411
- var RTCPeerConnection = require('./lib/RTCPeerConnection.js');
412
-
413
- var RTCSessionDescription = require('./lib/RTCSessionDescription.js');
414
-
415
- var RTCIceCandidate = require('./lib/RTCIceCandidate.js');
416
-
417
- var RTCRtpTransceiver = require('./lib/RTCRtpTransceiver.js');
418
-
419
- var RTCRtpReceiver = require('./lib/RTCRtpReceiver.js');
420
-
421
- var RTCRtpSender = require('./lib/RTCRtpSender.js');
422
-
423
- var RTCDataChannel = require('./lib/RTCDataChannel.js');
424
-
425
- var MediaStream = require('./lib/MediaStream.js');
426
-
427
- var MediaStreamTrack = require('./lib/MediaStreamTrack.js');
428
-
429
- var EventTarget = require('./lib/EventTarget.js').EventTarget;
430
-
431
- var WebRTCAdapter = {
432
- //Method called by demand in IE for bind video elements
433
- bindVideoElement: function bindVideoElement(element) {
434
- checkNewNode(element);
435
- },
436
- //Method called by demand in IE for unbind video elements
437
- unBindVideoElement: function unBindVideoElement(element) {
438
- checkRemovedNode(element);
439
- }
440
- };
441
- defineGlobalProperty('RTCPeerConnection', RTCPeerConnection);
442
- defineGlobalProperty('RTCSessionDescription', RTCSessionDescription);
443
- defineGlobalProperty('RTCIceCandidate', RTCIceCandidate);
444
- defineGlobalProperty('MediaStream', MediaStream);
445
- defineGlobalProperty('MediaStreamTrack', makeInterface(MediaStreamTrack));
446
- defineGlobalProperty('RTCRtpTransceiver', makeInterface(RTCRtpTransceiver));
447
- defineGlobalProperty('RTCRtpReceiver', makeInterface(RTCRtpReceiver));
448
- defineGlobalProperty('RTCRtpSender', makeInterface(RTCRtpSender));
449
- defineGlobalProperty('RTCDataChannel', makeInterface(RTCDataChannel));
450
- defineGlobalProperty('EventTarget', EventTarget);
451
- defineGlobalProperty('WebRTCAdapter', WebRTCProxy ? WebRTCAdapter : null); // DOM mutation observer to check when a new video element has been added to the DOM
452
- // TODO: Currently domObserver no observing, need to decide how to make it configurable to prevent performance issues.
453
-
454
- var domObserver = new MutationObserver(function (mutations) {
455
- for (var i = 0, numMutations = mutations.length; i < numMutations; i++) {
456
- var mutation = mutations[i]; // Check if there has been addition or deletion of nodes
457
-
458
- if (mutation.type !== 'childList') continue; // Check added nodes.
459
-
460
- for (var j = 0, numNodes = mutation.addedNodes.length; j < numNodes; j++) {
461
- //Check node recursively
462
- checkNewNode(mutation.addedNodes[j]);
463
- } // Check removed nodes.
464
-
465
-
466
- for (j = 0, numNodes = mutation.removedNodes.length; j < numNodes; j++) {
467
- //Check node recursively
468
- checkRemovedNode(mutation.removedNodes[j]);
469
- }
470
- }
471
- }); //Get all video elements already present
472
-
473
- var videos = document.getElementsByTagName('video'); //Handle them
474
-
475
- for (var i = 0; i < videos.length; ++i) {
476
- VideoRenderer.handle(videos[i]);
477
- }
478
- }
479
- }, {
480
- "./lib/EventTarget.js": 4,
481
- "./lib/MediaDevices.js": 6,
482
- "./lib/MediaStream.js": 7,
483
- "./lib/MediaStreamTrack.js": 8,
484
- "./lib/RTCDataChannel.js": 9,
485
- "./lib/RTCIceCandidate.js": 10,
486
- "./lib/RTCPeerConnection.js": 11,
487
- "./lib/RTCRtpReceiver.js": 12,
488
- "./lib/RTCRtpSender.js": 13,
489
- "./lib/RTCRtpTransceiver.js": 14,
490
- "./lib/RTCSessionDescription.js": 15,
491
- "./lib/VideoRenderer.js": 16,
492
- "./lib/WebRTCProxy.js": 17,
493
- "detect-browser": 18
494
- }],
495
- 4: [function (require, module, exports) {
496
- /**
497
- * @author Toru Nagashima <https://github.com/mysticatea>
498
- * @copyright 2015 Toru Nagashima. All rights reserved.
499
- * See LICENSE file in root directory for full license.
500
- */
501
- 'use strict';
502
- /**
503
- * @typedef {object} PrivateData
504
- * @property {EventTarget} eventTarget The event target.
505
- * @property {{type:string}} event The original event object.
506
- * @property {number} eventPhase The current event phase.
507
- * @property {EventTarget|null} currentTarget The current event target.
508
- * @property {boolean} canceled The flag to prevent default.
509
- * @property {boolean} stopped The flag to stop propagation immediately.
510
- * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null.
511
- * @property {number} timeStamp The unix time.
512
- * @private
513
- */
514
-
515
- /**
516
- * Private data for event wrappers.
517
- * @type {WeakMap<Event, PrivateData>}
518
- * @private
519
- */
520
-
521
- var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
522
- return _typeof2(obj);
523
- } : function (obj) {
524
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
525
- };
526
-
527
- var privateData = new WeakMap();
528
- /**
529
- * Cache for wrapper classes.
530
- * @type {WeakMap<Object, Function>}
531
- * @private
532
- */
533
-
534
- var wrappers = new WeakMap();
535
- /**
536
- * Get private data.
537
- * @param {Event} event The event object to get private data.
538
- * @returns {PrivateData} The private data of the event.
539
- * @private
540
- */
541
-
542
- function pd(event) {
543
- var retv = privateData.get(event);
544
- console.assert(retv != null, "'this' is expected an Event object, but got", event);
545
- return retv;
546
- }
547
- /**
548
- * @see https://dom.spec.whatwg.org/#interface-event
549
- * @private
550
- */
551
-
552
- /**
553
- * The event wrapper.
554
- * @constructor
555
- * @param {EventTarget} eventTarget The event target of this dispatching.
556
- * @param {Event|{type:string}} event The original event to wrap.
557
- */
558
-
559
-
560
- function Event(eventTarget, event) {
561
- privateData.set(this, {
562
- eventTarget: eventTarget,
563
- event: event,
564
- eventPhase: 2,
565
- currentTarget: eventTarget,
566
- canceled: false,
567
- stopped: false,
568
- passiveListener: null,
569
- timeStamp: event.timeStamp || Date.now()
570
- }); // https://heycam.github.io/webidl/#Unforgeable
571
-
572
- Object.defineProperty(this, "isTrusted", {
573
- value: false,
574
- enumerable: true
575
- }); // Define accessors
576
-
577
- var keys = Object.keys(event);
578
-
579
- for (var i = 0; i < keys.length; ++i) {
580
- var key = keys[i];
581
-
582
- if (!(key in this)) {
583
- Object.defineProperty(this, key, defineRedirectDescriptor(key));
584
- }
585
- }
586
- } // Should be enumerable, but class methods are not enumerable.
587
-
588
-
589
- Event.prototype = {
590
- /**
591
- * The type of this event.
592
- * @type {string}
593
- */
594
- get type() {
595
- return pd(this).event.type;
596
- },
597
-
598
- /**
599
- * The target of this event.
600
- * @type {EventTarget}
601
- */
602
- get target() {
603
- return pd(this).eventTarget;
604
- },
605
-
606
- /**
607
- * The target of this event.
608
- * @type {EventTarget}
609
- */
610
- get currentTarget() {
611
- return pd(this).currentTarget;
612
- },
613
-
614
- /**
615
- * @returns {EventTarget[]} The composed path of this event.
616
- */
617
- composedPath: function composedPath() {
618
- var currentTarget = pd(this).currentTarget;
619
-
620
- if (currentTarget == null) {
621
- return [];
622
- }
623
-
624
- return [currentTarget];
625
- },
626
-
627
- /**
628
- * Constant of NONE.
629
- * @type {number}
630
- */
631
- get NONE() {
632
- return 0;
633
- },
634
-
635
- /**
636
- * Constant of CAPTURING_PHASE.
637
- * @type {number}
638
- */
639
- get CAPTURING_PHASE() {
640
- return 1;
641
- },
642
-
643
- /**
644
- * Constant of AT_TARGET.
645
- * @type {number}
646
- */
647
- get AT_TARGET() {
648
- return 2;
649
- },
650
-
651
- /**
652
- * Constant of BUBBLING_PHASE.
653
- * @type {number}
654
- */
655
- get BUBBLING_PHASE() {
656
- return 3;
657
- },
658
-
659
- /**
660
- * The target of this event.
661
- * @type {number}
662
- */
663
- get eventPhase() {
664
- return pd(this).eventPhase;
665
- },
666
-
667
- /**
668
- * Stop event bubbling.
669
- * @returns {void}
670
- */
671
- stopPropagation: function stopPropagation() {
672
- var data = pd(this);
673
-
674
- if (typeof data.event.stopPropagation === "function") {
675
- data.event.stopPropagation();
676
- }
677
- },
678
-
679
- /**
680
- * Stop event bubbling.
681
- * @returns {void}
682
- */
683
- stopImmediatePropagation: function stopImmediatePropagation() {
684
- var data = pd(this);
685
- data.stopped = true;
686
-
687
- if (typeof data.event.stopImmediatePropagation === "function") {
688
- data.event.stopImmediatePropagation();
689
- }
690
- },
691
-
692
- /**
693
- * The flag to be bubbling.
694
- * @type {boolean}
695
- */
696
- get bubbles() {
697
- return Boolean(pd(this).event.bubbles);
698
- },
699
-
700
- /**
701
- * The flag to be cancelable.
702
- * @type {boolean}
703
- */
704
- get cancelable() {
705
- return Boolean(pd(this).event.cancelable);
706
- },
707
-
708
- /**
709
- * Cancel this event.
710
- * @returns {void}
711
- */
712
- preventDefault: function preventDefault() {
713
- var data = pd(this);
714
-
715
- if (data.passiveListener != null) {
716
- console.warn("Event#preventDefault() was called from a passive listener:", data.passiveListener);
717
- return;
718
- }
719
-
720
- if (!data.event.cancelable) {
721
- return;
722
- }
723
-
724
- data.canceled = true;
725
-
726
- if (typeof data.event.preventDefault === "function") {
727
- data.event.preventDefault();
728
- }
729
- },
730
-
731
- /**
732
- * The flag to indicate cancellation state.
733
- * @type {boolean}
734
- */
735
- get defaultPrevented() {
736
- return pd(this).canceled;
737
- },
738
-
739
- /**
740
- * The flag to be composed.
741
- * @type {boolean}
742
- */
743
- get composed() {
744
- return Boolean(pd(this).event.composed);
745
- },
746
-
747
- /**
748
- * The unix time of this event.
749
- * @type {number}
750
- */
751
- get timeStamp() {
752
- return pd(this).timeStamp;
753
- }
754
-
755
- }; // `constructor` is not enumerable.
756
-
757
- Object.defineProperty(Event.prototype, "constructor", {
758
- value: Event,
759
- configurable: true,
760
- writable: true
761
- }); // Ensure `event instanceof window.Event` is `true`.
762
-
763
- if (typeof window !== "undefined" && typeof window.Event !== "undefined") {
764
- Object.setPrototypeOf(Event.prototype, window.Event.prototype); // Make association for wrappers.
765
-
766
- wrappers.set(window.Event.prototype, Event);
767
- }
768
- /**
769
- * Get the property descriptor to redirect a given property.
770
- * @param {string} key Property name to define property descriptor.
771
- * @returns {PropertyDescriptor} The property descriptor to redirect the property.
772
- * @private
773
- */
774
-
775
-
776
- function defineRedirectDescriptor(key) {
777
- return {
778
- get: function get() {
779
- return pd(this).event[key];
780
- },
781
- set: function set(value) {
782
- pd(this).event[key] = value;
783
- },
784
- configurable: true,
785
- enumerable: true
786
- };
787
- }
788
- /**
789
- * Get the property descriptor to call a given method property.
790
- * @param {string} key Property name to define property descriptor.
791
- * @returns {PropertyDescriptor} The property descriptor to call the method property.
792
- * @private
793
- */
794
-
795
-
796
- function defineCallDescriptor(key) {
797
- return {
798
- value: function value() {
799
- var event = pd(this).event;
800
- return event[key].apply(event, arguments);
801
- },
802
- configurable: true,
803
- enumerable: true
804
- };
805
- }
806
- /**
807
- * Define new wrapper class.
808
- * @param {Function} BaseEvent The base wrapper class.
809
- * @param {Object} proto The prototype of the original event.
810
- * @returns {Function} The defined wrapper class.
811
- * @private
812
- */
813
-
814
-
815
- function defineWrapper(BaseEvent, proto) {
816
- var keys = Object.keys(proto);
817
-
818
- if (keys.length === 0) {
819
- return BaseEvent;
820
- }
821
- /** CustomEvent */
822
-
823
-
824
- function CustomEvent(eventTarget, event) {
825
- BaseEvent.call(this, eventTarget, event);
826
- }
827
-
828
- CustomEvent.prototype = Object.create(BaseEvent.prototype, {
829
- constructor: {
830
- value: CustomEvent,
831
- configurable: true,
832
- writable: true
833
- }
834
- }); // Define accessors.
835
-
836
- for (var i = 0; i < keys.length; ++i) {
837
- var key = keys[i];
838
-
839
- if (!(key in BaseEvent.prototype)) {
840
- var descriptor = Object.getOwnPropertyDescriptor(proto, key);
841
- var isFunc = typeof descriptor.value === "function";
842
- Object.defineProperty(CustomEvent.prototype, key, isFunc ? defineCallDescriptor(key) : defineRedirectDescriptor(key));
843
- }
844
- }
845
-
846
- return CustomEvent;
847
- }
848
- /**
849
- * Get the wrapper class of a given prototype.
850
- * @param {Object} proto The prototype of the original event to get its wrapper.
851
- * @returns {Function} The wrapper class.
852
- * @private
853
- */
854
-
855
-
856
- function getWrapper(proto) {
857
- if (proto == null || proto === Object.prototype) {
858
- return Event;
859
- }
860
-
861
- var wrapper = wrappers.get(proto);
862
-
863
- if (wrapper == null) {
864
- wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto);
865
- wrappers.set(proto, wrapper);
866
- }
867
-
868
- return wrapper;
869
- }
870
- /**
871
- * Wrap a given event to management a dispatching.
872
- * @param {EventTarget} eventTarget The event target of this dispatching.
873
- * @param {Object} event The event to wrap.
874
- * @returns {Event} The wrapper instance.
875
- * @private
876
- */
877
-
878
-
879
- function wrapEvent(eventTarget, event) {
880
- var Wrapper = getWrapper(Object.getPrototypeOf(event));
881
- return new Wrapper(eventTarget, event);
882
- }
883
- /**
884
- * Get the stopped flag of a given event.
885
- * @param {Event} event The event to get.
886
- * @returns {boolean} The flag to stop propagation immediately.
887
- * @private
888
- */
889
-
890
-
891
- function isStopped(event) {
892
- return pd(event).stopped;
893
- }
894
- /**
895
- * Set the current event phase of a given event.
896
- * @param {Event} event The event to set current target.
897
- * @param {number} eventPhase New event phase.
898
- * @returns {void}
899
- * @private
900
- */
901
-
902
-
903
- function setEventPhase(event, eventPhase) {
904
- pd(event).eventPhase = eventPhase;
905
- }
906
- /**
907
- * Set the current target of a given event.
908
- * @param {Event} event The event to set current target.
909
- * @param {EventTarget|null} currentTarget New current target.
910
- * @returns {void}
911
- * @private
912
- */
913
-
914
-
915
- function setCurrentTarget(event, currentTarget) {
916
- pd(event).currentTarget = currentTarget;
917
- }
918
- /**
919
- * Set a passive listener of a given event.
920
- * @param {Event} event The event to set current target.
921
- * @param {Function|null} passiveListener New passive listener.
922
- * @returns {void}
923
- * @private
924
- */
925
-
926
-
927
- function setPassiveListener(event, passiveListener) {
928
- pd(event).passiveListener = passiveListener;
929
- }
930
- /**
931
- * @typedef {object} ListenerNode
932
- * @property {Function} listener
933
- * @property {1|2|3} listenerType
934
- * @property {boolean} passive
935
- * @property {boolean} once
936
- * @property {ListenerNode|null} next
937
- * @private
938
- */
939
-
940
- /**
941
- * @type {WeakMap<object, Map<string, ListenerNode>>}
942
- * @private
943
- */
944
-
945
-
946
- var listenersMap = new WeakMap(); // Listener types
947
-
948
- var CAPTURE = 1;
949
- var BUBBLE = 2;
950
- var ATTRIBUTE = 3;
951
- /**
952
- * Check whether a given value is an object or not.
953
- * @param {any} x The value to check.
954
- * @returns {boolean} `true` if the value is an object.
955
- */
956
-
957
- function isObject(x) {
958
- return x !== null && (typeof x === "undefined" ? "undefined" : _typeof(x)) === "object"; //eslint-disable-line no-restricted-syntax
959
- }
960
- /**
961
- * Get listeners.
962
- * @param {EventTarget} eventTarget The event target to get.
963
- * @returns {Map<string, ListenerNode>} The listeners.
964
- * @private
965
- */
966
-
967
-
968
- function getListeners(eventTarget) {
969
- var listeners = listenersMap.get(eventTarget);
970
- console.assert(listeners != null, "'this' is expected an EventTarget object");
971
- return listeners || new Map();
972
- }
973
- /**
974
- * Get the property descriptor for the event attribute of a given event.
975
- * @param {string} eventName The event name to get property descriptor.
976
- * @returns {PropertyDescriptor} The property descriptor.
977
- * @private
978
- */
979
-
980
-
981
- function defineEventAttributeDescriptor(eventName) {
982
- return {
983
- get: function get() {
984
- var listeners = getListeners(this);
985
- var node = listeners.get(eventName);
986
-
987
- while (node != null) {
988
- if (node.listenerType === ATTRIBUTE) {
989
- return node.listener;
990
- }
991
-
992
- node = node.next;
993
- }
994
-
995
- return null;
996
- },
997
- set: function set(listener) {
998
- if (typeof listener !== "function" && !isObject(listener)) {
999
- listener = null; // eslint-disable-line no-param-reassign
1000
- }
1001
-
1002
- var listeners = getListeners(this); // Traverse to the tail while removing old value.
1003
-
1004
- var prev = null;
1005
- var node = listeners.get(eventName);
1006
-
1007
- while (node != null) {
1008
- if (node.listenerType === ATTRIBUTE) {
1009
- // Remove old value.
1010
- if (prev !== null) {
1011
- prev.next = node.next;
1012
- } else if (node.next !== null) {
1013
- listeners.set(eventName, node.next);
1014
- } else {
1015
- listeners["delete"](eventName);
1016
- }
1017
- } else {
1018
- prev = node;
1019
- }
1020
-
1021
- node = node.next;
1022
- } // Add new value.
1023
-
1024
-
1025
- if (listener !== null) {
1026
- var newNode = {
1027
- listener: listener,
1028
- listenerType: ATTRIBUTE,
1029
- passive: false,
1030
- once: false,
1031
- next: null
1032
- };
1033
-
1034
- if (prev === null) {
1035
- listeners.set(eventName, newNode);
1036
- } else {
1037
- prev.next = newNode;
1038
- }
1039
- }
1040
- },
1041
- configurable: true,
1042
- enumerable: true
1043
- };
1044
- }
1045
- /**
1046
- * Define an event attribute (e.g. `eventTarget.onclick`).
1047
- * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite.
1048
- * @param {string} eventName The event name to define.
1049
- * @returns {void}
1050
- */
1051
-
1052
-
1053
- function defineEventAttribute(eventTargetPrototype, eventName) {
1054
- Object.defineProperty(eventTargetPrototype, "on" + eventName, defineEventAttributeDescriptor(eventName));
1055
- }
1056
- /**
1057
- * Define a custom EventTarget with event attributes.
1058
- * @param {string[]} eventNames Event names for event attributes.
1059
- * @returns {EventTarget} The custom EventTarget.
1060
- * @private
1061
- */
1062
-
1063
-
1064
- function defineCustomEventTarget(eventNames) {
1065
- /** CustomEventTarget */
1066
- function CustomEventTarget() {
1067
- EventTarget.call(this);
1068
- }
1069
-
1070
- CustomEventTarget.prototype = Object.create(EventTarget.prototype, {
1071
- constructor: {
1072
- value: CustomEventTarget,
1073
- configurable: true,
1074
- writable: true
1075
- }
1076
- });
1077
-
1078
- for (var i = 0; i < eventNames.length; ++i) {
1079
- defineEventAttribute(CustomEventTarget.prototype, eventNames[i]);
1080
- }
1081
-
1082
- return CustomEventTarget;
1083
- }
1084
- /**
1085
- * EventTarget.
1086
- *
1087
- * - This is constructor if no arguments.
1088
- * - This is a function which returns a CustomEventTarget constructor if there are arguments.
1089
- *
1090
- * For example:
1091
- *
1092
- * class A extends EventTarget {}
1093
- * class B extends EventTarget("message") {}
1094
- * class C extends EventTarget("message", "error") {}
1095
- * class D extends EventTarget(["message", "error"]) {}
1096
- */
1097
-
1098
-
1099
- function EventTarget() {
1100
- /*eslint-disable consistent-return */
1101
- if (this instanceof EventTarget) {
1102
- listenersMap.set(this, new Map());
1103
- return;
1104
- }
1105
-
1106
- if (arguments.length === 1 && Array.isArray(arguments[0])) {
1107
- return defineCustomEventTarget(arguments[0]);
1108
- }
1109
-
1110
- if (arguments.length > 0) {
1111
- var types = new Array(arguments.length);
1112
-
1113
- for (var i = 0; i < arguments.length; ++i) {
1114
- types[i] = arguments[i];
1115
- }
1116
-
1117
- return defineCustomEventTarget(types);
1118
- }
1119
-
1120
- throw new TypeError("Cannot call a class as a function");
1121
- /*eslint-enable consistent-return */
1122
- } // Should be enumerable, but class methods are not enumerable.
1123
-
1124
-
1125
- EventTarget.prototype = {
1126
- /**
1127
- * Add a given listener to this event target.
1128
- * @param {string} eventName The event name to add.
1129
- * @param {Function} listener The listener to add.
1130
- * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
1131
- * @returns {boolean} `true` if the listener was added actually.
1132
- */
1133
- addEventListener: function addEventListener(eventName, listener, options) {
1134
- if (listener == null) {
1135
- return false;
1136
- }
1137
-
1138
- if (typeof listener !== "function" && !isObject(listener)) {
1139
- throw new TypeError("'listener' should be a function or an object.");
1140
- }
1141
-
1142
- var listeners = getListeners(this);
1143
- var optionsIsObj = isObject(options);
1144
- var capture = optionsIsObj ? Boolean(options.capture) : Boolean(options);
1145
- var listenerType = capture ? CAPTURE : BUBBLE;
1146
- var newNode = {
1147
- listener: listener,
1148
- listenerType: listenerType,
1149
- passive: optionsIsObj && Boolean(options.passive),
1150
- once: optionsIsObj && Boolean(options.once),
1151
- next: null
1152
- }; // Set it as the first node if the first node is null.
1153
-
1154
- var node = listeners.get(eventName);
1155
-
1156
- if (node === undefined) {
1157
- listeners.set(eventName, newNode);
1158
- return true;
1159
- } // Traverse to the tail while checking duplication..
1160
-
1161
-
1162
- var prev = null;
1163
-
1164
- while (node != null) {
1165
- if (node.listener === listener && node.listenerType === listenerType) {
1166
- // Should ignore duplication.
1167
- return false;
1168
- }
1169
-
1170
- prev = node;
1171
- node = node.next;
1172
- } // Add it.
1173
-
1174
-
1175
- prev.next = newNode;
1176
- return true;
1177
- },
1178
-
1179
- /**
1180
- * Remove a given listener from this event target.
1181
- * @param {string} eventName The event name to remove.
1182
- * @param {Function} listener The listener to remove.
1183
- * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.
1184
- * @returns {boolean} `true` if the listener was removed actually.
1185
- */
1186
- removeEventListener: function removeEventListener(eventName, listener, options) {
1187
- if (listener == null) {
1188
- return false;
1189
- }
1190
-
1191
- var listeners = getListeners(this);
1192
- var capture = isObject(options) ? Boolean(options.capture) : Boolean(options);
1193
- var listenerType = capture ? CAPTURE : BUBBLE;
1194
- var prev = null;
1195
- var node = listeners.get(eventName);
1196
-
1197
- while (node != null) {
1198
- if (node.listener === listener && node.listenerType === listenerType) {
1199
- if (prev !== null) {
1200
- prev.next = node.next;
1201
- } else if (node.next !== null) {
1202
- listeners.set(eventName, node.next);
1203
- } else {
1204
- listeners["delete"](eventName);
1205
- }
1206
-
1207
- return true;
1208
- }
1209
-
1210
- prev = node;
1211
- node = node.next;
1212
- }
1213
-
1214
- return false;
1215
- },
1216
-
1217
- /**
1218
- * Dispatch a given event.
1219
- * @param {Event|{type:string}} event The event to dispatch.
1220
- * @returns {boolean} `false` if canceled.
1221
- */
1222
- dispatchEvent: function dispatchEvent(event) {
1223
- if (event == null || typeof event.type !== "string") {
1224
- throw new TypeError("\"event.type\" should be a string.");
1225
- } // If listeners aren't registered, terminate.
1226
-
1227
-
1228
- var listeners = getListeners(this);
1229
- var eventName = event.type;
1230
- var node = listeners.get(eventName);
1231
-
1232
- if (node == null) {
1233
- return true;
1234
- } // Since we cannot rewrite several properties, so wrap object.
1235
-
1236
-
1237
- var wrappedEvent = wrapEvent(this, event); // This doesn't process capturing phase and bubbling phase.
1238
- // This isn't participating in a tree.
1239
-
1240
- var prev = null;
1241
-
1242
- while (node != null) {
1243
- // Remove this listener if it's once
1244
- if (node.once) {
1245
- if (prev !== null) {
1246
- prev.next = node.next;
1247
- } else if (node.next !== null) {
1248
- listeners.set(eventName, node.next);
1249
- } else {
1250
- listeners["delete"](eventName);
1251
- }
1252
- } else {
1253
- prev = node;
1254
- } // Call this listener
1255
-
1256
-
1257
- setPassiveListener(wrappedEvent, node.passive ? node.listener : null);
1258
-
1259
- if (typeof node.listener === "function") {
1260
- node.listener.call(this, wrappedEvent);
1261
- } else if (node.listenerType !== ATTRIBUTE && typeof node.listener.handleEvent === "function") {
1262
- node.listener.handleEvent(wrappedEvent);
1263
- } // Break if `event.stopImmediatePropagation` was called.
1264
-
1265
-
1266
- if (isStopped(wrappedEvent)) {
1267
- break;
1268
- }
1269
-
1270
- node = node.next;
1271
- }
1272
-
1273
- setPassiveListener(wrappedEvent, null);
1274
- setEventPhase(wrappedEvent, 0);
1275
- setCurrentTarget(wrappedEvent, null);
1276
- return !wrappedEvent.defaultPrevented;
1277
- }
1278
- }; // `constructor` is not enumerable.
1279
-
1280
- Object.defineProperty(EventTarget.prototype, "constructor", {
1281
- value: EventTarget,
1282
- configurable: true,
1283
- writable: true
1284
- }); // Ensure `eventTarget instanceof window.EventTarget` is `true`.
1285
-
1286
- if (typeof window !== "undefined" && typeof window.EventTarget !== "undefined") {
1287
- Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype);
1288
- }
1289
-
1290
- module.exports = EventTarget;
1291
- module.exports.EventTarget = module.exports["default"] = EventTarget;
1292
- module.exports.defineEventAttribute = defineEventAttribute;
1293
- }, {}],
1294
- 5: [function (require, module, exports) {
1295
- "use strict";
1296
-
1297
- function InvalidStateError() {
1298
- try {
1299
- var xhr = new XMLHttpRequest();
1300
- xhr.responseType = "blob";
1301
- } catch (e) {
1302
- return e;
1303
- }
1304
- }
1305
-
1306
- module.exports = InvalidStateError;
1307
- }, {}],
1308
- 6: [function (require, module, exports) {
1309
- 'use strict';
1310
-
1311
- var WebRTCProxy = require('./WebRTCProxy.js');
1312
-
1313
- var MediaStream = require('./MediaStream.js');
1314
-
1315
- var MediaStreamTrack = require('./MediaStreamTrack.js');
1316
-
1317
- var EventTarget = require('./EventTarget.js').EventTarget;
1318
-
1319
- var defineEventAttribute = require('./EventTarget.js').defineEventAttribute;
1320
- /*
1321
- interface MediaDevices : EventTarget {
1322
- attribute EventHandler ondevicechange;
1323
- Promise<sequence<MediaDeviceInfo>> enumerateDevices();
1324
- }
1325
- partial interface MediaDevices {
1326
- MediaTrackSupportedConstraints getSupportedConstraints();
1327
- Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints);
1328
- }
1329
- */
1330
-
1331
-
1332
- var MediaDevices = function MediaDevices() {
1333
- //Init event targetr
1334
- EventTarget.call(this);
1335
- }; //Inherit from Event Target
1336
-
1337
-
1338
- MediaDevices.prototype = Object.create(EventTarget.prototype, {
1339
- constructor: {
1340
- value: MediaDevices,
1341
- configurable: true,
1342
- writable: true
1343
- }
1344
- }); // Define Event Handlers
1345
-
1346
- defineEventAttribute(MediaDevices.prototype, 'devicechange');
1347
-
1348
- MediaDevices.prototype.enumerateDevices = function () {
1349
- return new Promise(function (resolve, reject) {
1350
- resolve([]);
1351
- });
1352
- };
1353
-
1354
- MediaDevices.prototype.getSupportedConstraints = function () {
1355
- throw 'Not supported yet';
1356
- };
1357
-
1358
- MediaDevices.prototype.getUserMedia = function (constraints) {
1359
- return new Promise(function (resolve, reject) {
1360
- var stream = new MediaStream(); //If we are being requested audio
1361
-
1362
- if (constraints.audio) {
1363
- var options = {}; //Get new track
1364
-
1365
- var track = WebRTCProxy.createLocalAudioTrack(options); //Add it to the stream
1366
-
1367
- stream.addTrack(new MediaStreamTrack(track));
1368
- } //If we are being requested video
1369
-
1370
-
1371
- if (constraints.video) {
1372
- var options = {}; //Get new track
1373
-
1374
- var track = WebRTCProxy.createLocalVideoTrack(options); //Add it to the stream
1375
-
1376
- stream.addTrack(new MediaStreamTrack(track));
1377
- } //Done
1378
-
1379
-
1380
- resolve(stream);
1381
- });
1382
- };
1383
-
1384
- Object.defineProperty(MediaDevices, 'name', {
1385
- enumerable: false,
1386
- configurable: true,
1387
- writable: false,
1388
- value: 'MediaDevices'
1389
- });
1390
- Object.defineProperty(MediaDevices, 'prototype', {
1391
- writable: false
1392
- });
1393
- module.exports = MediaDevices;
1394
- }, {
1395
- "./EventTarget.js": 4,
1396
- "./MediaStream.js": 7,
1397
- "./MediaStreamTrack.js": 8,
1398
- "./WebRTCProxy.js": 17
1399
- }],
1400
- 7: [function (require, module, exports) {
1401
- 'use strict';
1402
-
1403
- var MediaStreamTrack = require('./MediaStreamTrack');
1404
-
1405
- var EventTarget = require('./EventTarget.js').EventTarget;
1406
-
1407
- var defineEventAttribute = require('./EventTarget.js').defineEventAttribute;
1408
- /*
1409
- [Exposed=Window,
1410
- Constructor,
1411
- Constructor(MediaStream stream),
1412
- Constructor(sequence<MediaStreamTrack> tracks)]
1413
- interface MediaStream : EventTarget {
1414
- readonly attribute DOMString id;
1415
- sequence<MediaStreamTrack> getAudioTracks();
1416
- sequence<MediaStreamTrack> getVideoTracks();
1417
- sequence<MediaStreamTrack> getTracks();
1418
- MediaStreamTrack? getTrackById(DOMString trackId);
1419
- void addTrack(MediaStreamTrack track);
1420
- void removeTrack(MediaStreamTrack track);
1421
- MediaStream clone();
1422
- readonly attribute boolean active;
1423
- attribute EventHandler onaddtrack;
1424
- attribute EventHandler onremovetrack;
1425
- };
1426
- */
1427
-
1428
-
1429
- var count = 0;
1430
-
1431
- var MediaStream = function MediaStream(tracks, label) {
1432
- //Init event target
1433
- EventTarget.call(this); //Private vars
1434
-
1435
- this.priv = {
1436
- tracks: {}
1437
- }; //Actual WebRTC MediaStream supports MediaStream or array of MediaTracks as constructor input.
1438
- //Because of time constraints we implementing the support for array of tracks only.
1439
-
1440
- if (tracks) {
1441
- if (!(tracks instanceof Array)) {
1442
- throw new Error('tracks should be an array of MediaStreamTrack');
1443
- }
1444
-
1445
- for (var i = 0; i < tracks.length; ++i) {
1446
- if (!(tracks[i] instanceof MediaStreamTrack)) {
1447
- throw new Error('Each item in tracks array should be an instance of MediaStreamTrack');
1448
- }
1449
-
1450
- this.priv.tracks[tracks[i].id] = tracks[i];
1451
- }
1452
- }
1453
-
1454
- var id = label || 'stream-' + count++;
1455
- Object.defineProperty(this, 'id', {
1456
- enumerable: true,
1457
- configurable: false,
1458
- writable: false,
1459
- value: id
1460
- });
1461
- Object.defineProperty(this, 'active', {
1462
- enumerable: true,
1463
- configurable: false,
1464
- writable: false,
1465
- value: true
1466
- });
1467
- return this;
1468
- }; //Inherit from Event Target
1469
-
1470
-
1471
- MediaStream.prototype = Object.create(EventTarget.prototype, {
1472
- constructor: {
1473
- value: MediaStream,
1474
- configurable: true,
1475
- writable: true
1476
- }
1477
- });
1478
- MediaStream.__proto__ = EventTarget; // Define Event Handlers
1479
-
1480
- defineEventAttribute(MediaStream.prototype, 'addtrack');
1481
- defineEventAttribute(MediaStream.prototype, 'removetrack');
1482
-
1483
- MediaStream.prototype.getAudioTracks = function () {
1484
- var arr = [];
1485
-
1486
- for (var id in this.priv.tracks) {
1487
- if (this.priv.tracks[id].kind === 'audio') {
1488
- arr.push(this.priv.tracks[id]);
1489
- }
1490
- }
1491
-
1492
- return arr;
1493
- };
1494
-
1495
- MediaStream.prototype.getVideoTracks = function () {
1496
- var arr = [];
1497
-
1498
- for (var id in this.priv.tracks) {
1499
- if (this.priv.tracks[id].kind === 'video') {
1500
- arr.push(this.priv.tracks[id]);
1501
- }
1502
- }
1503
-
1504
- return arr;
1505
- };
1506
-
1507
- MediaStream.prototype.getTracks = function () {
1508
- var arr = [];
1509
-
1510
- for (var id in this.priv.tracks) {
1511
- arr.push(this.priv.tracks[id]);
1512
- }
1513
-
1514
- return arr;
1515
- };
1516
-
1517
- MediaStream.prototype.getTrackById = function (id) {
1518
- return this.priv.tracks[id];
1519
- };
1520
-
1521
- MediaStream.prototype.addTrack = function (track) {
1522
- //Check if already present
1523
- if (this.priv.tracks.hasOwnProperty(track.id)) return; //Add to track
1524
-
1525
- this.priv.tracks[track.id] = track;
1526
-
1527
- if (typeof this.priv.tracks[track.id].enabled !== 'boolean') {
1528
- this.priv.tracks[track.id].enabled = true;
1529
- } //Create event
1530
-
1531
-
1532
- var event = document.createEvent('Event');
1533
- event.initEvent('addtrack', false, false);
1534
- event.track = track; //Fire it
1535
-
1536
- this.dispatchEvent(event);
1537
- };
1538
-
1539
- MediaStream.prototype.removeTrack = function (track) {
1540
- //Check if it is not already present
1541
- if (!this.priv.tracks.hasOwnProperty(track.id)) return; //Add to track
1542
-
1543
- delete this.priv.tracks[track.id]; //Create event
1544
-
1545
- var event = document.createEvent('Event');
1546
- event.initEvent('removetrack', false, false);
1547
- event.track = track; //Fire it
1548
-
1549
- this.dispatchEvent(event);
1550
- };
1551
-
1552
- MediaStream.prototype.clone = function () {
1553
- return new MediaStream(this.getTracks());
1554
- };
1555
-
1556
- Object.defineProperty(MediaStream, 'name', {
1557
- enumerable: false,
1558
- configurable: true,
1559
- writable: false,
1560
- value: 'MediaStream'
1561
- });
1562
- Object.defineProperty(MediaStream, 'prototype', {
1563
- writable: false
1564
- });
1565
- module.exports = MediaStream;
1566
- }, {
1567
- "./EventTarget.js": 4,
1568
- "./MediaStreamTrack": 8
1569
- }],
1570
- 8: [function (require, module, exports) {
1571
- 'use strict';
1572
-
1573
- var EventTarget = require('./EventTarget.js').EventTarget;
1574
-
1575
- var defineEventAttribute = require('./EventTarget.js').defineEventAttribute;
1576
- /*
1577
- [Exposed=Window]
1578
- interface MediaStreamTrack : EventTarget {
1579
- readonly attribute DOMString kind;
1580
- readonly attribute DOMString id;
1581
- readonly attribute DOMString label;
1582
- attribute boolean enabled;
1583
- readonly attribute boolean muted;
1584
- attribute EventHandler onmute;
1585
- attribute EventHandler onunmute;
1586
- readonly attribute MediaStreamTrackState readyState;
1587
- attribute EventHandler onended;
1588
- MediaStreamTrack clone();
1589
- void stop();
1590
- MediaTrackCapabilities getCapabilities();
1591
- MediaTrackConstraints getConstraints();
1592
- MediaTrackSettings getSettings();
1593
- Promise<void> applyConstraints(optional MediaTrackConstraints constraints);
1594
- attribute EventHandler onoverconstrained;
1595
- };
1596
- partial interface MediaStreamTrack {
1597
- readonly attribute boolean isolated;
1598
- attribute EventHandler onisolationchange;
1599
- };
1600
- */
1601
-
1602
-
1603
- var MediaStreamTrack = function MediaStreamTrack(track) {
1604
- //Init event targetr
1605
- EventTarget.call(this); //Private vars
1606
-
1607
- var priv = this.priv = {
1608
- track: track,
1609
- muted: false,
1610
- enabled: true
1611
- };
1612
- Object.defineProperty(this, 'kind', {
1613
- enumerable: true,
1614
- configurable: false,
1615
- get: function get() {
1616
- return priv.track.kind;
1617
- }
1618
- });
1619
- Object.defineProperty(this, 'id', {
1620
- enumerable: true,
1621
- configurable: false,
1622
- get: function get() {
1623
- return priv.track.id;
1624
- }
1625
- });
1626
- Object.defineProperty(this, 'label', {
1627
- enumerable: true,
1628
- configurable: false,
1629
- get: function get() {
1630
- return priv.track.id;
1631
- }
1632
- });
1633
- Object.defineProperty(this, 'enabled', {
1634
- enumerable: true,
1635
- configurable: false,
1636
- get: function get() {
1637
- return priv.enabled;
1638
- },
1639
- set: function set(enabled) {
1640
- priv.enabled = !!enabled;
1641
- }
1642
- });
1643
- Object.defineProperty(this, 'muted', {
1644
- enumerable: true,
1645
- configurable: false,
1646
- get: function get() {
1647
- return priv.muted;
1648
- }
1649
- });
1650
- Object.defineProperty(this, 'readyState', {
1651
- enumerable: true,
1652
- configurable: false,
1653
- get: function get() {
1654
- return priv.track.state;
1655
- }
1656
- });
1657
- Object.defineProperty(this, 'isolated', {
1658
- enumerable: true,
1659
- configurable: false,
1660
- get: function get() {
1661
- return false;
1662
- }
1663
- });
1664
- return this;
1665
- }; //Inherit from Event Target
1666
-
1667
-
1668
- MediaStreamTrack.prototype = Object.create(EventTarget.prototype, {
1669
- constructor: {
1670
- value: MediaStreamTrack,
1671
- configurable: true,
1672
- writable: false
1673
- }
1674
- });
1675
- MediaStreamTrack.__proto__ = EventTarget; // Define Event Handlers
1676
- //TODO: fire them somehow
1677
-
1678
- defineEventAttribute(MediaStreamTrack.prototype, 'mute');
1679
- defineEventAttribute(MediaStreamTrack.prototype, 'unmute');
1680
- defineEventAttribute(MediaStreamTrack.prototype, 'ended');
1681
- defineEventAttribute(MediaStreamTrack.prototype, 'isolationchange');
1682
-
1683
- MediaStreamTrack.prototype.clone = function () {
1684
- return null;
1685
- };
1686
-
1687
- MediaStreamTrack.prototype.stop = function () {
1688
- this.priv.track.stop();
1689
- };
1690
-
1691
- MediaStreamTrack.prototype.getCapabilities = function () {};
1692
-
1693
- MediaStreamTrack.prototype.getConstraints = function () {};
1694
-
1695
- MediaStreamTrack.prototype.getSettings = function () {};
1696
-
1697
- MediaStreamTrack.prototype.applyConstraints = function () {};
1698
-
1699
- Object.defineProperty(MediaStreamTrack, 'name', {
1700
- enumerable: false,
1701
- configurable: true,
1702
- writable: false,
1703
- value: 'MediaStreamTrack'
1704
- });
1705
- module.exports = MediaStreamTrack;
1706
- }, {
1707
- "./EventTarget.js": 4
1708
- }],
1709
- 9: [function (require, module, exports) {
1710
- "use strict";
1711
-
1712
- var EventTarget = require("./EventTarget.js").EventTarget;
1713
-
1714
- var defineEventAttribute = require("./EventTarget.js").defineEventAttribute;
1715
-
1716
- var InvalidStateError = require("./InvalidStateError.js");
1717
- /*
1718
- [Exposed=Window]
1719
- interface RTCRTCDataChannel : EventTarget {
1720
- readonly attribute USVString label;
1721
- readonly attribute boolean ordered;
1722
- readonly attribute unsigned short? maxPacketLifeTime;
1723
- readonly attribute unsigned short? maxRetransmits;
1724
- readonly attribute USVString protocol;
1725
- readonly attribute boolean negotiated;
1726
- readonly attribute unsigned short? id;
1727
- readonly attribute RTCPriorityType priority;
1728
- readonly attribute RTCRTCDataChannelState readyState;
1729
- readonly attribute unsigned long bufferedAmount;
1730
- attribute unsigned long bufferedAmountLowThreshold;
1731
- attribute EventHandler onopen;
1732
- attribute EventHandler onbufferedamountlow;
1733
- attribute EventHandler onerror;
1734
- attribute EventHandler onclose;
1735
- void close();
1736
- attribute EventHandler onmessage;
1737
- attribute DOMString binaryType;
1738
- void send(USVString data);
1739
- void send(Blob data);
1740
- void send(ArrayBuffer data);
1741
- void send(ArrayBufferView data);
1742
- };
1743
- */
1744
-
1745
-
1746
- var RTCDataChannel = function RTCDataChannel(dataChannel) {
1747
- //Init event targetr
1748
- EventTarget.call(this); //Private vars
1749
-
1750
- var self = this;
1751
- var priv = this.priv = {
1752
- binaryType: "blob",
1753
- dataChannel: dataChannel
1754
- }; //Read only properties
1755
-
1756
- Object.defineProperty(this, 'label', {
1757
- enumerable: true,
1758
- configurable: false,
1759
- get: function get() {
1760
- return priv.dataChannel.label;
1761
- }
1762
- });
1763
- Object.defineProperty(this, 'ordered', {
1764
- enumerable: true,
1765
- configurable: false,
1766
- get: function get() {
1767
- return priv.dataChannel.ordered;
1768
- }
1769
- });
1770
- Object.defineProperty(this, 'maxPacketLifeTime', {
1771
- enumerable: true,
1772
- configurable: false,
1773
- get: function get() {
1774
- return priv.dataChannel.maxPacketLifeTime;
1775
- }
1776
- });
1777
- Object.defineProperty(this, 'protocol', {
1778
- enumerable: true,
1779
- configurable: false,
1780
- get: function get() {
1781
- return priv.dataChannel.protocol;
1782
- }
1783
- });
1784
- Object.defineProperty(this, 'negotiated', {
1785
- enumerable: true,
1786
- configurable: false,
1787
- get: function get() {
1788
- return priv.dataChannel.negotiated;
1789
- }
1790
- });
1791
- Object.defineProperty(this, 'id', {
1792
- enumerable: true,
1793
- configurable: false,
1794
- get: function get() {
1795
- return priv.dataChannel.id;
1796
- }
1797
- });
1798
- Object.defineProperty(this, 'priority', {
1799
- enumerable: true,
1800
- configurable: false,
1801
- get: function get() {
1802
- return priv.dataChannel.priority;
1803
- }
1804
- });
1805
- Object.defineProperty(this, 'readyState', {
1806
- enumerable: true,
1807
- configurable: false,
1808
- get: function get() {
1809
- return priv.dataChannel.readyState;
1810
- }
1811
- });
1812
- Object.defineProperty(this, 'bufferedAmount', {
1813
- enumerable: true,
1814
- configurable: false,
1815
- get: function get() {
1816
- return priv.dataChannel.bufferedAmount;
1817
- }
1818
- }); //Read & write
1819
-
1820
- Object.defineProperty(this, 'bufferedAmountLowThreshold', {
1821
- enumerable: true,
1822
- configurable: false,
1823
- get: function get() {
1824
- return priv.dataChannel.bufferedAmountLowThreshold;
1825
- },
1826
- set: function set(bufferedAmountLowThreshold) {
1827
- return priv.dataChannel.bufferedAmountLowThreshold = bufferedAmountLowThreshold;
1828
- }
1829
- });
1830
- Object.defineProperty(this, 'binaryType', {
1831
- enumerable: true,
1832
- configurable: false,
1833
- get: function get() {
1834
- return priv.dataChannel.bufferedAmount;
1835
- },
1836
- set: function set(binaryType) {
1837
- if (binaryType !== "blob" && binaryType !== "arraybuffer") throw new SyntaxError();
1838
- return priv.binaryType = binaryType;
1839
- }
1840
- });
1841
-
1842
- function createEvent(name) {
1843
- var e = document.createEvent("Event");
1844
- e.initEvent(name, false, false);
1845
- return e;
1846
- }
1847
-
1848
- function fire(name) {
1849
- self.dispatchEvent(createEvent(name));
1850
- } //Set event
1851
-
1852
-
1853
- priv.dataChannel.onopen = function () {
1854
- fire("open");
1855
- };
1856
-
1857
- priv.dataChannel.onbufferedamountlow = function () {
1858
- fire("bufferedamountlow");
1859
- };
1860
-
1861
- priv.dataChannel.onerror = function () {
1862
- fire("error");
1863
- };
1864
-
1865
- priv.dataChannel.onclose = function () {
1866
- fire("close");
1867
- };
1868
-
1869
- priv.dataChannel.onmessage = function (message) {
1870
- //Create event
1871
- var event = createEvent("message"); //Check if message is binary
1872
-
1873
- if (typeof message !== "string") {
1874
- //Create uint array
1875
- var array = new Uint8Array(message); //Check binary type
1876
-
1877
- if (priv.binaryType === "blob") {
1878
- //Create blob builder
1879
- var builder = new MSBlobBuilder(); //Append message
1880
-
1881
- builder.append(array); //Get blob
1882
-
1883
- event.data = builder.getBlob();
1884
- } else if (priv.binaryType === "arraybuffer") {
1885
- //Get array buffer
1886
- event.data = array.buffer;
1887
- } else return;
1888
- } else {
1889
- //It is a string
1890
- event.data = message;
1891
- } //Check if
1892
-
1893
-
1894
- self.dispatchEvent(event);
1895
- }; //Done
1896
-
1897
-
1898
- return this;
1899
- }; //Inherit from Event Target
1900
-
1901
-
1902
- RTCDataChannel.prototype = Object.create(EventTarget.prototype, {
1903
- constructor: {
1904
- value: RTCDataChannel,
1905
- configurable: true,
1906
- writable: true
1907
- }
1908
- });
1909
- RTCDataChannel.__proto__ = EventTarget; // Define Event Handlers
1910
-
1911
- defineEventAttribute(RTCDataChannel.prototype, "open");
1912
- defineEventAttribute(RTCDataChannel.prototype, "bufferedamountlow");
1913
- defineEventAttribute(RTCDataChannel.prototype, "error");
1914
- defineEventAttribute(RTCDataChannel.prototype, "close");
1915
- defineEventAttribute(RTCDataChannel.prototype, "message");
1916
-
1917
- RTCDataChannel.prototype.send = function (data) {
1918
- var self = this; //Check state
1919
-
1920
- if (this.readyState !== "open") throw new InvalidStateError();
1921
-
1922
- try {
1923
- //Check type
1924
- if (data instanceof Blob) {
1925
- var reader = new FileReader();
1926
-
1927
- reader.onloadend = function () {
1928
- //Create array from buffer
1929
- var array = new Uint8Array(reader.result); //Send it
1930
-
1931
- self.priv.dataChannel.send(array);
1932
- }; //Read data as array
1933
-
1934
-
1935
- reader.readAsArrayBuffer(data);
1936
- } else if (data instanceof ArrayBuffer) {
1937
- //Send it
1938
- this.priv.dataChannel.send(array);
1939
- } else if (typeof data === "string") {
1940
- //Send it
1941
- this.priv.dataChannel.send(data);
1942
- } else {
1943
- throw new TypeError();
1944
- }
1945
- } catch (e) {
1946
- throw InvalidStateError();
1947
- }
1948
- };
1949
-
1950
- RTCDataChannel.prototype.close = function () {
1951
- this.priv.dataChannel.close();
1952
- };
1953
-
1954
- Object.defineProperty(RTCDataChannel, 'name', {
1955
- enumerable: false,
1956
- configurable: true,
1957
- writable: false,
1958
- value: "RTCDataChannel"
1959
- });
1960
- Object.defineProperty(RTCDataChannel, 'prototype', {
1961
- writable: false
1962
- });
1963
- module.exports = RTCDataChannel;
1964
- }, {
1965
- "./EventTarget.js": 4,
1966
- "./InvalidStateError.js": 5
1967
- }],
1968
- 10: [function (require, module, exports) {
1969
- "use strict";
1970
-
1971
- var WebRTCProxy = require("./WebRTCProxy.js");
1972
- /*
1973
- interface RTCIceCandidate {
1974
- readonly attribute DOMString candidate;
1975
- readonly attribute DOMString? sdpMid;
1976
- readonly attribute unsigned short? sdpMLineIndex;
1977
- readonly attribute DOMString? foundation;
1978
- readonly attribute RTCIceComponent? component;
1979
- readonly attribute unsigned long? priority;
1980
- readonly attribute DOMString? ip;
1981
- readonly attribute RTCIceProtocol? protocol;
1982
- readonly attribute unsigned short? port;
1983
- readonly attribute RTCIceCandidateType? type;
1984
- readonly attribute RTCIceTcpCandidateType? tcpType;
1985
- readonly attribute DOMString? relatedAddress;
1986
- readonly attribute unsigned short? relatedPort;
1987
- readonly attribute DOMString? usernameFragment;
1988
- RTCIceCandidateInit toJSON();
1989
- };
1990
- */
1991
-
1992
-
1993
- var RTCIceCandidate = function RTCIceCandidate(iceCandidateInit) {
1994
- if (!iceCandidateInit) throw new TypeError(); //Get values from dictionary
1995
-
1996
- var candidate = iceCandidateInit.candidate;
1997
- var sdpMid = iceCandidateInit.sdpMid;
1998
- var sdpMLineIndex = iceCandidateInit.sdpMLineIndex;
1999
- var usernameFragment = iceCandidateInit.usernameFragment; //Not set yet
2000
-
2001
- var foundation;
2002
- var component;
2003
- var priority;
2004
- var ip;
2005
- var protocol;
2006
- var port;
2007
- var type;
2008
- var tcpType;
2009
- var relatedAddress;
2010
- var relatedPort; //Extended attributes to avoid parsing it twice
2011
-
2012
- if (iceCandidateInit.ext) {
2013
- foundation = iceCandidateInit.ext.foundation;
2014
- component = iceCandidateInit.ext.component;
2015
- priority = iceCandidateInit.ext.priority;
2016
- ip = iceCandidateInit.ext.ip;
2017
- protocol = iceCandidateInit.ext.protocol;
2018
- port = iceCandidateInit.ext.port;
2019
- type = iceCandidateInit.ext.type;
2020
- tcpType = iceCandidateInit.ext.tcpType;
2021
- relatedAddress = iceCandidateInit.ext.relatedAddress;
2022
- relatedPort = iceCandidateInit.ext.relatedPort;
2023
- } else {
2024
- try {
2025
- //Parse candidate
2026
- var parsed = WebRTCProxy.parseIceCandidate(candidate);
2027
- } catch (e) {
2028
- throw new TypeError();
2029
- } //Set parsed properties
2030
-
2031
-
2032
- foundation = parsed[0];
2033
- component = parsed[1];
2034
- priority = parsed[2];
2035
- ip = parsed[3];
2036
- protocol = parsed[4];
2037
- port = parsed[5];
2038
- type = parsed[6];
2039
- tcpType = parsed[7];
2040
- relatedAddress = parsed[8];
2041
- relatedPort = parsed[9];
2042
- if (!usernameFragment) usernameFragment = parsed[10];
2043
- } //Direct attributes from init
2044
-
2045
-
2046
- Object.defineProperty(this, "candidate", {
2047
- enumerable: true,
2048
- configurable: false,
2049
- get: function get() {
2050
- return candidate;
2051
- }
2052
- });
2053
- Object.defineProperty(this, "sdpMid", {
2054
- enumerable: true,
2055
- configurable: false,
2056
- get: function get() {
2057
- return sdpMid;
2058
- }
2059
- });
2060
- Object.defineProperty(this, "sdpMLineIndex", {
2061
- enumerable: true,
2062
- configurable: false,
2063
- get: function get() {
2064
- return sdpMLineIndex;
2065
- }
2066
- });
2067
- Object.defineProperty(this, "foundation", {
2068
- enumerable: true,
2069
- configurable: false,
2070
- get: function get() {
2071
- return foundation;
2072
- }
2073
- });
2074
- Object.defineProperty(this, "component", {
2075
- enumerable: true,
2076
- configurable: false,
2077
- get: function get() {
2078
- return component;
2079
- }
2080
- });
2081
- Object.defineProperty(this, "priority", {
2082
- enumerable: true,
2083
- configurable: false,
2084
- get: function get() {
2085
- return priority;
2086
- }
2087
- });
2088
- Object.defineProperty(this, "ip", {
2089
- enumerable: true,
2090
- configurable: false,
2091
- get: function get() {
2092
- return ip;
2093
- }
2094
- });
2095
- Object.defineProperty(this, "protocol", {
2096
- enumerable: true,
2097
- configurable: false,
2098
- get: function get() {
2099
- return protocol;
2100
- }
2101
- });
2102
- Object.defineProperty(this, "port", {
2103
- enumerable: true,
2104
- configurable: false,
2105
- get: function get() {
2106
- return port;
2107
- }
2108
- });
2109
- Object.defineProperty(this, "type", {
2110
- enumerable: true,
2111
- configurable: false,
2112
- get: function get() {
2113
- return type;
2114
- }
2115
- });
2116
- Object.defineProperty(this, "tcpType", {
2117
- enumerable: true,
2118
- configurable: false,
2119
- get: function get() {
2120
- return tcpType;
2121
- }
2122
- });
2123
- Object.defineProperty(this, "relatedAddress", {
2124
- enumerable: true,
2125
- configurable: false,
2126
- get: function get() {
2127
- return relatedAddress;
2128
- }
2129
- });
2130
- Object.defineProperty(this, "relatedPort", {
2131
- enumerable: true,
2132
- configurable: false,
2133
- get: function get() {
2134
- return relatedPort;
2135
- }
2136
- });
2137
- Object.defineProperty(this, "usernameFragment", {
2138
- enumerable: true,
2139
- configurable: false,
2140
- get: function get() {
2141
- return usernameFragment;
2142
- }
2143
- });
2144
- return this;
2145
- };
2146
-
2147
- RTCIceCandidate.prototype.toJSON = function () {
2148
- return {
2149
- candidate: this.candidate,
2150
- sdpMid: this.sdpMid,
2151
- sdpMLineIndex: this.sdpMLineIndex,
2152
- usernameFragment: this.usernameFragment
2153
- };
2154
- };
2155
-
2156
- Object.defineProperty(RTCIceCandidate, 'name', {
2157
- enumerable: false,
2158
- configurable: true,
2159
- writable: false,
2160
- value: "RTCIceCandidate"
2161
- });
2162
- Object.defineProperty(RTCIceCandidate, 'prototype', {
2163
- writable: false
2164
- });
2165
- module.exports = RTCIceCandidate;
2166
- }, {
2167
- "./WebRTCProxy.js": 17
2168
- }],
2169
- 11: [function (require, module, exports) {
2170
- "use strict";
2171
-
2172
- var _extends = Object.assign || function (target) {
2173
- for (var i = 1; i < arguments.length; i++) {
2174
- var source = arguments[i];
2175
-
2176
- for (var key in source) {
2177
- if (Object.prototype.hasOwnProperty.call(source, key)) {
2178
- target[key] = source[key];
2179
- }
2180
- }
2181
- }
2182
-
2183
- return target;
2184
- };
2185
-
2186
- var WebRTCProxy = require("./WebRTCProxy.js");
2187
-
2188
- var MediaStreamTrack = require("./MediaStreamTrack.js");
2189
-
2190
- var RTCSessionDescription = require("./RTCSessionDescription.js");
2191
-
2192
- var RTCIceCandidate = require("./RTCIceCandidate.js");
2193
-
2194
- var RTCRtpSender = require("./RTCRtpSender.js");
2195
-
2196
- var RTCRtpReceiver = require("./RTCRtpReceiver.js");
2197
-
2198
- var RTCRtpTransceiver = require("./RTCRtpTransceiver.js");
2199
-
2200
- var DataChannel = require("./RTCDataChannel.js");
2201
-
2202
- var InvalidStateError = require("./InvalidStateError.js");
2203
-
2204
- var EventTarget = require("./EventTarget.js").EventTarget;
2205
-
2206
- var defineEventAttribute = require("./EventTarget.js").defineEventAttribute;
2207
- /*
2208
- [Constructor(optional RTCConfiguration configuration),Exposed=Window]
2209
- interface RTCPeerConnection : EventTarget {
2210
- Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options);
2211
- Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options);
2212
- Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
2213
- readonly attribute RTCSessionDescription? localDescription;
2214
- readonly attribute RTCSessionDescription? currentLocalDescription;
2215
- readonly attribute RTCSessionDescription? pendingLocalDescription;
2216
- Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
2217
- readonly attribute RTCSessionDescription? remoteDescription;
2218
- readonly attribute RTCSessionDescription? currentRemoteDescription;
2219
- readonly attribute RTCSessionDescription? pendingRemoteDescription;
2220
- Promise<void> addIceCandidate((RTCIceCandidateInit or RTCIceCandidate) candidate);
2221
- readonly attribute RTCSignalingState signalingState;
2222
- readonly attribute RTCIceGatheringState iceGatheringState;
2223
- readonly attribute RTCIceConnectionState iceConnectionState;
2224
- readonly attribute RTCPeerConnectionState connectionState;
2225
- readonly attribute boolean? canTrickleIceCandidates;
2226
- static sequence<RTCIceServer> getDefaultIceServers();
2227
- RTCConfiguration getConfiguration();
2228
- void setConfiguration(RTCConfiguration configuration);
2229
- void close();
2230
- attribute EventHandler onnegotiationneeded;
2231
- attribute EventHandler onicecandidate;
2232
- attribute EventHandler onicecandidateerror;
2233
- attribute EventHandler onsignalingstatechange;
2234
- attribute EventHandler oniceconnectionstatechange;
2235
- attribute EventHandler onicegatheringstatechange;
2236
- attribute EventHandler onconnectionstatechange;
2237
- };
2238
- */
2239
-
2240
-
2241
- var RTCIceTransportPolicy = ["relay", "all"];
2242
- var RTCBundlePolicy = ["balanced", "max-compat", "max-bundle"];
2243
- var RTCRtcpMuxPolicy = ["negotiate", "require"];
2244
- var RTCIceCredentialType = ["password", "oauth"]; //Check if a value is valid in an enum
2245
-
2246
- function check(value, valid) {
2247
- for (var i = 0; i < valid.length; ++i) {
2248
- if (valid[i] === value) return;
2249
- }
2250
-
2251
- throw new TypeError(value + " not in " + JSON.stringify(valid));
2252
- }
2253
-
2254
- function checkRange(value, min, max) {
2255
- if (value < min || value > max) throw new TypeError(value + " not in [" + min + "," + max + "]");
2256
- }
2257
-
2258
- function checkNotNull(value) {
2259
- if (value === null) throw new TypeError("Null not allowed");
2260
- }
2261
-
2262
- function checkArray(value) {
2263
- if (!Array.isArray(value)) throw new TypeError("Must be an array");
2264
- }
2265
-
2266
- function createRTCConfiguration(configuration) {
2267
- /*
2268
- *
2269
- dictionary RTCConfiguration {
2270
- sequence<RTCIceServer> iceServers;
2271
- RTCIceTransportPolicy iceTransportPolicy = "all";
2272
- RTCBundlePolicy bundlePolicy = "balanced";
2273
- RTCRtcpMuxPolicy rtcpMuxPolicy = "require";
2274
- DOMString peerIdentity;
2275
- sequence<RTCCertificate> certificates;
2276
- [EnforceRange]
2277
- octet iceCandidatePoolSize = 0;
2278
- };
2279
- */
2280
- //Set configuration with default values
2281
- var sanitized = _extends({
2282
- iceServers: undefined,
2283
- iceTransportPolicy: "all",
2284
- bundlePolicy: "balanced",
2285
- rtcpMuxPolicy: "require",
2286
- iceCandidatePoolSize: 0,
2287
- certificates: undefined
2288
- }, //Remove undefined objects
2289
- configuration ? JSON.parse(JSON.stringify(configuration)) : {}); //Check valid values
2290
-
2291
-
2292
- checkNotNull(sanitized.iceServers); //Check array
2293
-
2294
- if (Array.isArray(sanitized.iceServers)) {
2295
- //Check each one
2296
- for (var i = 0; i < sanitized.iceServers.length; ++i) {
2297
- /*
2298
- *
2299
- dictionary RTCIceServer {
2300
- required (DOMString or sequence<DOMString>) urls;
2301
- DOMString username;
2302
- (DOMString or RTCOAuthCredential) credential;
2303
- RTCIceCredentialType credentialType = "password";
2304
- };
2305
- */
2306
- //Set defautls
2307
- var iceServer = sanitized.iceServers[i] = _extends({
2308
- credentialType: "password"
2309
- }, sanitized.iceServers[i]); //Check it is not null
2310
-
2311
-
2312
- checkNotNull(iceServer.urls); //If it is a sring fallback
2313
-
2314
- if (typeof iceServer.urls === "string") //Arraify
2315
- iceServer.urls = [iceServer.urls];
2316
- checkArray(iceServer.urls);
2317
- }
2318
- } //Check the others
2319
-
2320
-
2321
- check(sanitized.iceTransportPolicy, RTCIceTransportPolicy);
2322
- check(sanitized.bundlePolicy, RTCBundlePolicy);
2323
- check(sanitized.rtcpMuxPolicy, RTCRtcpMuxPolicy);
2324
- checkRange(sanitized.iceCandidatePoolSize, 0, 255); //Done
2325
-
2326
- return sanitized;
2327
- }
2328
-
2329
- var RTCPeerConnection = function RTCPeerConnection() {
2330
- var self = this; //Init event targetr
2331
-
2332
- EventTarget.call(this); //Create private args
2333
-
2334
- var priv = this.priv = {}; //Set configuration with default values
2335
-
2336
- priv.configuration = createRTCConfiguration(arguments.length ? JSON.parse(JSON.stringify(arguments[0])) : {}); //Other internal data
2337
-
2338
- priv.senders = {};
2339
- priv.remoteStreams = {};
2340
- priv.lastOffer = null;
2341
- priv.lastAnswer = null;
2342
- priv.isClosed = false;
2343
- var signalingState = "stable";
2344
- var iceGatheringState = "new";
2345
- var iceConnectionState = "new";
2346
- var connectionState = "new"; //TODO: Implement this
2347
-
2348
- var canTrickleIceCandidates = null;
2349
-
2350
- function toSessionDescription(sdp) {
2351
- return typeof sdp === "unknown" ? new RTCSessionDescription(sdp.toArray()) : null;
2352
- } //Define read only properties for each attribute
2353
- //The localDescription attribute must return pendingLocalDescription if it is not null and otherwise it must return currentLocalDescription .
2354
-
2355
-
2356
- Object.defineProperty(this, 'localDescription', {
2357
- enumerable: true,
2358
- configurable: false,
2359
- get: function get() {
2360
- return toSessionDescription(priv.pc.localDescription);
2361
- }
2362
- });
2363
- Object.defineProperty(this, 'currentLocalDescription', {
2364
- enumerable: true,
2365
- configurable: false,
2366
- get: function get() {
2367
- return toSessionDescription(priv.pc.currentLocalDescription);
2368
- }
2369
- });
2370
- Object.defineProperty(this, 'pendingLocalDescription', {
2371
- enumerable: true,
2372
- configurable: false,
2373
- get: function get() {
2374
- return toSessionDescription(priv.pc.pendingLocalDescription);
2375
- }
2376
- });
2377
- Object.defineProperty(this, 'remoteDescription', {
2378
- enumerable: true,
2379
- configurable: false,
2380
- get: function get() {
2381
- return toSessionDescription(priv.pc.remoteDescription);
2382
- }
2383
- });
2384
- Object.defineProperty(this, 'currentRemoteDescription', {
2385
- enumerable: true,
2386
- configurable: false,
2387
- get: function get() {
2388
- return toSessionDescription(priv.pc.currentRemoteDescription);
2389
- }
2390
- });
2391
- Object.defineProperty(this, 'pendingRemoteDescription', {
2392
- enumerable: true,
2393
- configurable: false,
2394
- get: function get() {
2395
- return toSessionDescription(priv.pc.pendingRemoteDescription);
2396
- }
2397
- });
2398
- Object.defineProperty(this, 'signalingState', {
2399
- enumerable: true,
2400
- configurable: false,
2401
- get: function get() {
2402
- return signalingState;
2403
- }
2404
- });
2405
- Object.defineProperty(this, 'iceGatheringState', {
2406
- enumerable: true,
2407
- configurable: false,
2408
- get: function get() {
2409
- return iceGatheringState;
2410
- }
2411
- });
2412
- Object.defineProperty(this, 'iceConnectionState', {
2413
- enumerable: true,
2414
- configurable: false,
2415
- get: function get() {
2416
- return iceConnectionState;
2417
- }
2418
- });
2419
- Object.defineProperty(this, 'connectionState', {
2420
- enumerable: true,
2421
- configurable: false,
2422
- get: function get() {
2423
- return connectionState;
2424
- }
2425
- });
2426
- Object.defineProperty(this, 'canTrickleIceCandidates', {
2427
- enumerable: true,
2428
- configurable: false,
2429
- get: function get() {
2430
- return canTrickleIceCandidates;
2431
- }
2432
- });
2433
-
2434
- function createEvent(name) {
2435
- var e = document.createEvent("Event");
2436
- e.initEvent(name, false, false);
2437
- return e;
2438
- }
2439
-
2440
- function fire(name) {
2441
- self.dispatchEvent(createEvent(name));
2442
- } // Create new native pc
2443
-
2444
-
2445
- priv.pc = WebRTCProxy.createPeerConnection(priv.configuration); //Event handlers
2446
-
2447
- priv.pc.onnegotiationneeded = function () {
2448
- fire("negotiationneeded");
2449
- };
2450
-
2451
- priv.pc.onicecandidate = function (candidate, sdpMid, sdpMLineIndex, foundation, component, priority, ip, protocol, port, type, tcpType, relatedAddress, relatedPort, usernameFragment, url) {
2452
- var e = createEvent("icecandidate");
2453
- if (candidate) e.candidate = new RTCIceCandidate({
2454
- candidate: candidate,
2455
- sdpMid: sdpMid,
2456
- sdpMLineIndex: sdpMLineIndex,
2457
- ext: {
2458
- foundation: foundation,
2459
- component: component,
2460
- priority: priority,
2461
- ip: ip,
2462
- protocol: protocol,
2463
- port: port,
2464
- type: type,
2465
- tcpType: tcpType,
2466
- relatedAddress: relatedAddress,
2467
- relatedPort: relatedPort
2468
- },
2469
- usernameFragment: usernameFragment
2470
- });else e.candidate = null;
2471
- e.url = url;
2472
- self.dispatchEvent(e);
2473
- };
2474
-
2475
- priv.pc.onicecandidateerror = function () {
2476
- fire("icecandidateerror");
2477
- };
2478
-
2479
- priv.pc.onsignalingstatechange = function (state) {
2480
- signalingState = state;
2481
- fire("signalingstatechange");
2482
-
2483
- if ("closed" === state) {
2484
- priv.isClosed = true;
2485
- delete priv.pc;
2486
- }
2487
- };
2488
-
2489
- priv.pc.oniceconnectionstatechange = function (state) {
2490
- iceConnectionState = state;
2491
- fire("iceconnectionstatechange");
2492
- };
2493
-
2494
- priv.pc.onicegatheringstatechange = function (state) {
2495
- iceGatheringState = state;
2496
- fire("icegatheringstatechange");
2497
- };
2498
-
2499
- priv.pc.onconnectionstatechange = function (state) {
2500
- connectionState = state;
2501
- fire("connectionState");
2502
- };
2503
-
2504
- priv.pc.onaddstream = function (label) {
2505
- //Create new stream
2506
- var stream = new MediaStream(null, label); //Get remote stream tracks
2507
-
2508
- priv.pc.getRemoteStreamTracks(label, function () {
2509
- //Parse arguments
2510
- var tracks = Array.prototype.slice.call(arguments, 0); //For each track
2511
-
2512
- for (var i = 0; i < tracks.length; ++i) {
2513
- //Create a wrapper
2514
- stream.addTrack(new MediaStreamTrack(tracks[i]));
2515
- } //Get all tracks
2516
-
2517
-
2518
- var mediaStreamTracks = stream.getTracks(); //For each track in stream
2519
-
2520
- for (var i = 0; i < mediaStreamTracks.length; ++i) {
2521
- //Create evnet
2522
- var event = createEvent("track"); //Add data
2523
-
2524
- event.track = mediaStreamTracks[i];
2525
- event.receiver = {
2526
- track: mediaStreamTracks[i]
2527
- };
2528
- event.transceiver = {
2529
- receiver: event.receiver
2530
- };
2531
- event.streams = [stream]; //Fire it
2532
-
2533
- self.dispatchEvent(event);
2534
- }
2535
- });
2536
- };
2537
-
2538
- priv.pc.onremovestream = function (label) {
2539
- //Delete from remote stream list
2540
- delete priv.remotes[label];
2541
- };
2542
-
2543
- priv.pc.ondatachannel = function (dataChannel) {
2544
- //Create event
2545
- var event = createEvent("datachannel"); //Create datachannel
2546
-
2547
- event.channel = new DataChannel(dataChannel); //Fire event
2548
-
2549
- self.dispatchEvent(event);
2550
- };
2551
- }; //Inherit from Event Target
2552
-
2553
-
2554
- RTCPeerConnection.prototype = Object.create(EventTarget.prototype, {
2555
- constructor: {
2556
- value: RTCPeerConnection,
2557
- configurable: true,
2558
- writable: true
2559
- }
2560
- });
2561
- RTCPeerConnection.__proto__ = EventTarget; // Define Event Handlers
2562
-
2563
- defineEventAttribute(RTCPeerConnection.prototype, "negotiationneeded");
2564
- defineEventAttribute(RTCPeerConnection.prototype, "icecandidate");
2565
- defineEventAttribute(RTCPeerConnection.prototype, "icecandidateerror");
2566
- defineEventAttribute(RTCPeerConnection.prototype, "signalingstatechange");
2567
- defineEventAttribute(RTCPeerConnection.prototype, "iceconnectionstatechange");
2568
- defineEventAttribute(RTCPeerConnection.prototype, "icegatheringstatechange");
2569
- defineEventAttribute(RTCPeerConnection.prototype, "connectionstatechange");
2570
- defineEventAttribute(RTCPeerConnection.prototype, "addtrack");
2571
-
2572
- RTCPeerConnection.prototype.getConfiguration = function () {
2573
- return this.priv.configuration;
2574
- };
2575
-
2576
- RTCPeerConnection.prototype.setConfiguration = function (configuration) {
2577
- var priv = this.priv;
2578
- if (!priv.pc || priv.isClosed) throw new InvalidStateError(); //Get configuration object from input
2579
-
2580
- var sanitized = createRTCConfiguration(configuration);
2581
-
2582
- try {
2583
- //Try to set it
2584
- priv.pc.setConfiguration(sanitized);
2585
- } catch (error) {
2586
- //Launch InvalidModificationError
2587
- var operationError = new Error(error);
2588
- operationError.name = "InvalidModificationError";
2589
- operationError.code = 13;
2590
- throw operationError;
2591
- } //Store new configuration
2592
-
2593
-
2594
- priv.configuration = sanitized;
2595
- };
2596
-
2597
- RTCPeerConnection.getDefaultIceServers = function () {
2598
- return [];
2599
- };
2600
-
2601
- RTCPeerConnection.prototype.createOffer = function (options) {
2602
- var priv = this.priv;
2603
- return new Promise(function (resolve, reject) {
2604
- if (!priv.pc || priv.isClosed) throw new InvalidStateError();
2605
- priv.pc.createOffer(function (type, sdp) {
2606
- priv.lastOffer = sdp;
2607
- resolve({
2608
- type: type,
2609
- sdp: sdp
2610
- });
2611
- }, function () {
2612
- reject(new InvalidStateError());
2613
- }, options);
2614
- });
2615
- };
2616
-
2617
- RTCPeerConnection.prototype.createAnswer = function (options) {
2618
- var self = this;
2619
- var priv = this.priv;
2620
- return new Promise(function (resolve, reject) {
2621
- if (!priv.pc || priv.isClosed) throw new InvalidStateError();
2622
- if (self.remoteDescription === null) throw new InvalidStateError();
2623
- priv.pc.createAnswer(function (type, sdp) {
2624
- priv.lastAnswer = sdp;
2625
- resolve({
2626
- type: type,
2627
- sdp: sdp
2628
- });
2629
- }, function () {
2630
- reject(new InvalidStateError());
2631
- }, options);
2632
- });
2633
- };
2634
-
2635
- RTCPeerConnection.prototype.setLocalDescription = function (description) {
2636
- var priv = this.priv; //If description.sdp is the empty string and description.type is "answer" or "pranswer", set description.sdp to lastAnswer.
2637
-
2638
- if (!description.sdp && ("answer" === description.type || "pranser" === description.type)) description.sdp = priv.lastAnswer; //If description.sdp is the empty string and description.type is "offer", set description.sdp to lastOffer.
2639
-
2640
- if (!description.sdp && "offer" === description.type) description.sdp = priv.lastOffer;
2641
- return new Promise(function (resolve, reject) {
2642
- if (!priv.pc || priv.isClosed) throw new InvalidStateError();
2643
- priv.pc.setLocalDescription(resolve, function () {
2644
- reject(new InvalidStateError());
2645
- }, description);
2646
- });
2647
- };
2648
-
2649
- RTCPeerConnection.prototype.setRemoteDescription = function (description) {
2650
- var priv = this.priv;
2651
- return new Promise(function (resolve, reject) {
2652
- if (!priv.pc || priv.isClosed) throw new InvalidStateError();
2653
- priv.pc.setRemoteDescription(resolve, function () {
2654
- reject(new InvalidStateError());
2655
- }, description);
2656
- });
2657
- };
2658
-
2659
- RTCPeerConnection.prototype.addIceCandidate = function (candidate) {
2660
- var self = this;
2661
- var priv = this.priv; //1. Let candidate be the method's argument.
2662
- //2. Let connection be the ``[`RTCPeerConnection`](#dom-rtcpeerconnection)`` object on which the method was invoked.
2663
- //3. If both sdpMid and sdpMLineIndex are `null`, return a promise [rejected](#dfn-rejected) with a newly [created](https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/#dfn-create-exception) `TypeError`.
2664
-
2665
- if (!candidate || typeof candidate.sdpMid !== "string" && typeof candidate.sdpMLineIndex !== "number") return Promise.reject(new TypeError()); //4. Return the result of [enqueuing](#enqueue-an-operation) the following steps to connection's operation queue:
2666
-
2667
- return new Promise(function (resolve, reject) {
2668
- //1. If ``[`remoteDescription`](#dom-rtcpeerconnection-remotedescription)`` is `null` return a promise [rejected](#dfn-rejected) with a newly [created](https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/#dfn-create-exception) `InvalidStateError`.
2669
- if (self.remoteDescription === null) throw new InvalidStateError();
2670
- /*
2671
- 2. Let p be a new promise.
2672
- 3. If candidate.sdpMid is not null, run the following steps:
2673
- 1. If candidate.sdpMid is not equal to the mid of any media description in ``[`remoteDescription`](#dom-rtcpeerconnection-remotedescription)`` , [reject](#dfn-rejected) p with a newly [created](https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/#dfn-create-exception) `OperationError` and abort these steps.
2674
- 4. Else, if candidate.sdpMLineIndex is not null, run the following steps:
2675
- 1. If candidate.sdpMLineIndex is equal to or larger than the number of media descriptions in ``[`remoteDescription`](#dom-rtcpeerconnection-remotedescription)`` , [reject](#dfn-rejected) p with a newly [created](https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/#dfn-create-exception) `OperationError` and abort these steps.
2676
- 5. If `candidate.usernameFragment` is neither `undefined` nor `null`, and is not equal to any username fragment present in the corresponding [media description](#dfn-media-description) of an applied remote description, [reject](#dfn-rejected) p with a newly [created](https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/#dfn-create-exception) `OperationError` and abort these steps.
2677
- 6. In parallel, add the ICE candidate candidate as described in \[[JSEP](#bib-JSEP)\] ([section 4.1.17.](https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-4.1.17)). Use `candidate.usernameFragment` to identify the ICE [generation](#dfn-generation); if `usernameFragment` is null, process the candidate for the most recent ICE [generation](#dfn-generation). If `candidate.candidate` is an empty string, process candidate as an end-of-candidates indication for the corresponding [media description](#dfn-media-description) and ICE candidate [generation](#dfn-generation).
2678
- 1. If candidate could not be successfully added the user agent _MUST_ queue a task that runs the following steps:
2679
- 1. If connection's [\[\[IsClosed\]\]](#dfn-x%5B%5Bisclosed%5D%5D) slot is `true`, then abort these steps.
2680
- 2. [Reject](#dfn-rejected) p with a `DOMException` object whose `name` attribute has the value `OperationError` and abort these steps.
2681
- 2. If candidate is applied successfully, the user agent _MUST_ queue a task that runs the following steps:
2682
- 1. If connection's [\[\[IsClosed\]\]](#dfn-x%5B%5Bisclosed%5D%5D) slot is `true`, then abort these steps.
2683
- 2. If ``connection.[`pendingRemoteDescription`](#dom-rtcpeerconnection-pendingremotedescription)`` is non-null, and represents the ICE [generation](#dfn-generation) for which candidate was processed, add candidate to ``connection.[`pendingRemoteDescription`](#dom-rtcpeerconnection-pendingremotedescription)`` .
2684
- 3. If ``connection.[`currentRemoteDescription`](#dom-rtcpeerconnection-currentremotedescription)`` is non-null, and represents the ICE [generation](#dfn-generation) for which candidate was processed, add candidate to ``connection.[`currentRemoteDescription`](#dom-rtcpeerconnection-currentremotedescription)`` .
2685
- 4. [Resolve](#dfn-resolved) p with `undefined`.
2686
- 7. Return p.
2687
- */
2688
-
2689
- try {
2690
- //Add ICE candidate nativelly
2691
- priv.pc.addIceCandidate(resolve, function () {
2692
- reject(new InvalidStateError());
2693
- }, candidate);
2694
- } catch (error) {
2695
- //Launch operation error
2696
- var operationError = new Error(error);
2697
- operationError.name = "OperationError";
2698
- operationError.code = 0;
2699
- throw operationError;
2700
- }
2701
- });
2702
- };
2703
-
2704
- RTCPeerConnection.prototype.close = function () {
2705
- var priv = this.priv;
2706
- if (!priv.pc || priv.isClosed) throw new InvalidStateError(); //Close it
2707
-
2708
- priv.pc.close(); //We are closed now, we can wait until callback
2709
-
2710
- priv.isClosed = true;
2711
- };
2712
- /*
2713
- partial interface RTCPeerConnection {
2714
- sequence<RTCRtpSender> getSenders();
2715
- sequence<RTCRtpReceiver> getReceivers();
2716
- sequence<RTCRtpTransceiver> getTransceivers();
2717
- RTCRtpSender addTrack(MediaStreamTrack track, MediaStream... streams);
2718
- void removeTrack(RTCRtpSender sender);
2719
- RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind, optional RTCRtpTransceiverInit init);
2720
- attribute EventHandler ontrack;
2721
- };
2722
- */
2723
-
2724
-
2725
- RTCPeerConnection.prototype.getSenders = function () {
2726
- throw "Not implemented";
2727
- };
2728
-
2729
- RTCPeerConnection.prototype.getReceivers = function () {
2730
- throw "Not implemented";
2731
- };
2732
-
2733
- RTCPeerConnection.prototype.getTransceivers = function () {
2734
- throw "Not implemented";
2735
- };
2736
-
2737
- RTCPeerConnection.prototype.addTrack = function () {
2738
- var priv = this.priv;
2739
- if (!priv.pc || priv.isClosed) throw new InvalidStateError(); //Parse arguments
2740
-
2741
- var track = arguments[0];
2742
- var streams = Array.prototype.slice.call(arguments, 1); //Ensure that we are attaching to at most 1, as it is not supported in libwebrtc
2743
-
2744
- if (streams.length > 1) throw new Error("Adding track to more than one stream is not currently supported"); //Get stream label, as it is the only param needed by libwebrtc
2745
-
2746
- var label = streams.length ? streams[0].id : ""; //Add native track to native object it only needs the stream label not the stream
2747
-
2748
- var sender = priv.pc.addTrack(track.priv.track, label); //Check result
2749
-
2750
- if (!sender) return null; //Create sender
2751
-
2752
- var rtpSender = new RTCRtpSender(sender); //Get native sender id
2753
-
2754
- var senderId = rtpSender.priv.id; //Add to senders
2755
-
2756
- priv.senders[senderId] = rtpSender;
2757
- return rtpSender;
2758
- };
2759
-
2760
- RTCPeerConnection.prototype.addTransceiver = function (trackOrKind, init) {
2761
- //TODO: Implement!
2762
- //Not really implemented just for passing tests
2763
- var sender = new RTCRtpSender(null, null);
2764
- var track = new MediaStreamTrack(null);
2765
- var receiver = new RTCRtpReceiver(track); //Return dummy object for now
2766
-
2767
- return new RTCRtpTransceiver(sender, receiver);
2768
- };
2769
- /*
2770
- * Legacy stream apis
2771
- */
2772
-
2773
-
2774
- RTCPeerConnection.prototype.addStream = function (stream) {
2775
- var tracks = stream.getTracks();
2776
-
2777
- for (var i = 0; i < tracks.length; ++i) {
2778
- this.addTrack(tracks[i], stream);
2779
- }
2780
- };
2781
-
2782
- RTCPeerConnection.prototype.removeTrack = function (rtpSender) {
2783
- var priv = this.priv;
2784
- if (!priv.pc || priv.isClosed) throw new InvalidStateError(); //Check if sender is invalid
2785
-
2786
- if (!rtpSender || !rtpSender.priv.sender || !rtpSender.priv.track) throw new InvalidStateError(); //Get native sender id
2787
-
2788
- var senderId = rtpSender.priv.id; //Check if senders is from this pc
2789
-
2790
- if (!priv.senders.hasOwnProperty(senderId)) throw new InvalidStateError(); //Pass the nateive object
2791
-
2792
- priv.pc.removeTrack(rtpSender.priv.sender); //Set sender track to null
2793
-
2794
- rtpSender.priv.track = null; //Remove from senders
2795
-
2796
- delete priv.senders[senderId];
2797
- };
2798
-
2799
- defineEventAttribute(RTCPeerConnection.prototype, "track");
2800
- /*
2801
- partial interface RTCPeerConnection {
2802
- readonly attribute RTCSctpTransport? sctp;
2803
- RTCDataChannel createDataChannel(USVString label,
2804
- optional RTCDataChannelInit dataChannelDict);
2805
- attribute EventHandler ondatachannel;
2806
- };
2807
- */
2808
-
2809
- RTCPeerConnection.prototype.createDataChannel = function (label, dataChannelDict) {
2810
- var priv = this.priv;
2811
- if (!priv.pc || priv.isClosed) throw new InvalidStateError(); //Check if we have a string label (can be empty)
2812
-
2813
- if (typeof label !== "string") return new TypeError(); //Create native datachannel
2814
-
2815
- var dataChannel = priv.pc.createDataChannel(label, dataChannelDict); //Check
2816
-
2817
- if (!dataChannel) return null; //Return wrapper
2818
-
2819
- return new DataChannel(dataChannel);
2820
- };
2821
-
2822
- defineEventAttribute(RTCPeerConnection.prototype, "datachannel");
2823
- Object.defineProperty(RTCPeerConnection, 'RTCPeerConnection', {
2824
- enumerable: false,
2825
- configurable: true,
2826
- writable: false,
2827
- value: "RTCPeerConnection"
2828
- });
2829
- Object.defineProperty(RTCPeerConnection, 'prototype', {
2830
- writable: false
2831
- });
2832
- module.exports = RTCPeerConnection;
2833
- }, {
2834
- "./EventTarget.js": 4,
2835
- "./InvalidStateError.js": 5,
2836
- "./MediaStreamTrack.js": 8,
2837
- "./RTCDataChannel.js": 9,
2838
- "./RTCIceCandidate.js": 10,
2839
- "./RTCRtpReceiver.js": 12,
2840
- "./RTCRtpSender.js": 13,
2841
- "./RTCRtpTransceiver.js": 14,
2842
- "./RTCSessionDescription.js": 15,
2843
- "./WebRTCProxy.js": 17
2844
- }],
2845
- 12: [function (require, module, exports) {
2846
- 'use strict';
2847
- /*
2848
- [Exposed=Window]
2849
- interface RTCRtpReceiver {
2850
- readonly attribute MediaStreamTrack track;
2851
- readonly attribute RTCDtlsTransport? transport;
2852
- readonly attribute RTCDtlsTransport? rtcpTransport;
2853
- // Feature at risk
2854
- static RTCRtpCapabilities getCapabilities(DOMString kind);
2855
- RTCRtpParameters getParameters();
2856
- sequence<RTCRtpContributingSource> getContributingSources();
2857
- sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
2858
- Promise<RTCStatsReport> getStats();
2859
- };
2860
- */
2861
-
2862
- var RTCRtpReceiver = function RTCRtpReceiver(track) {
2863
- var priv = {
2864
- track: track
2865
- }; //Read only
2866
-
2867
- Object.defineProperty(this, 'track', {
2868
- enumerable: true,
2869
- configurable: false,
2870
- get: function get() {
2871
- return priv.track;
2872
- }
2873
- }); //Not implemented
2874
-
2875
- Object.defineProperty(this, 'transport', {
2876
- enumerable: true,
2877
- configurable: false,
2878
- get: function get() {
2879
- return null;
2880
- }
2881
- });
2882
- Object.defineProperty(this, 'rtcpTransport', {
2883
- enumerable: true,
2884
- configurable: false,
2885
- get: function get() {
2886
- return null;
2887
- }
2888
- });
2889
- };
2890
-
2891
- RTCRtpReceiver.getCapabilities = function (kind) {
2892
- throw 'Not implemented yet';
2893
- };
2894
-
2895
- RTCRtpReceiver.getParameters = function () {
2896
- throw 'Not implemented yet';
2897
- };
2898
-
2899
- RTCRtpReceiver.getContributingSources = function () {
2900
- throw 'Not implemented yet';
2901
- };
2902
-
2903
- RTCRtpReceiver.getSynchronizationSources = function () {
2904
- throw 'Not implemented yet';
2905
- };
2906
-
2907
- RTCRtpReceiver.getStats = function () {
2908
- return Promise.reject(new Error('Not implemented yet'));
2909
- };
2910
-
2911
- Object.defineProperty(RTCRtpReceiver, 'name', {
2912
- enumerable: false,
2913
- configurable: true,
2914
- writable: false,
2915
- value: 'RTCRtpReceiver'
2916
- });
2917
- Object.defineProperty(RTCRtpReceiver, 'prototype', {
2918
- writable: false
2919
- });
2920
- module.exports = RTCRtpReceiver;
2921
- }, {}],
2922
- 13: [function (require, module, exports) {
2923
- 'use strict';
2924
- /*
2925
- [Exposed=Window]
2926
- interface RTCRtpSender {
2927
- readonly attribute MediaStreamTrack? track;
2928
- readonly attribute RTCDtlsTransport? transport;
2929
- readonly attribute RTCDtlsTransport? rtcpTransport;
2930
- // Feature at risk
2931
- static RTCRtpCapabilities getCapabilities(DOMString kind);
2932
- Promise<void> setParameters(optional RTCRtpParameters parameters);
2933
- RTCRtpParameters getParameters();
2934
- Promise<void> replaceTrack(MediaStreamTrack? withTrack);
2935
- Promise<RTCStatsReport> getStats();
2936
- };
2937
- */
2938
-
2939
- var RTCRtpSender = function RTCRtpSender(sender, track) {
2940
- //Add to map
2941
- this.priv = {
2942
- sender: sender,
2943
- track: track
2944
- };
2945
- Object.defineProperty(this, 'track', {
2946
- enumerable: true,
2947
- configurable: false,
2948
- get: function get() {
2949
- return priv.track;
2950
- }
2951
- });
2952
- Object.defineProperty(this, 'transport', {
2953
- enumerable: true,
2954
- configurable: false,
2955
- get: function get() {
2956
- new Error("Not supported yet");
2957
- }
2958
- });
2959
- Object.defineProperty(this, 'rtcpTransport', {
2960
- enumerable: true,
2961
- configurable: false,
2962
- get: function get() {
2963
- new Error("Not supported yet");
2964
- }
2965
- });
2966
- return this;
2967
- };
2968
-
2969
- RTCRtpSender.prototype.getCapabilities = function () {
2970
- throw new Error("Not supported yet");
2971
- };
2972
-
2973
- RTCRtpSender.prototype.setParameters = function () {
2974
- throw new Error("Not supported yet");
2975
- };
2976
-
2977
- RTCRtpSender.prototype.getParameters = function () {
2978
- throw new Error("Not supported yet");
2979
- };
2980
-
2981
- RTCRtpSender.prototype.replaceTrack = function () {
2982
- throw new Error("Not supported yet");
2983
- };
2984
-
2985
- RTCRtpSender.prototype.getStats = function () {
2986
- throw new Error("Not supported yet");
2987
- };
2988
-
2989
- Object.defineProperty(RTCRtpSender, 'name', {
2990
- enumerable: false,
2991
- configurable: true,
2992
- writable: false,
2993
- value: "RTCRtpSender"
2994
- });
2995
- Object.defineProperty(RTCRtpSender, 'prototype', {
2996
- writable: false
2997
- });
2998
- module.exports = RTCRtpSender;
2999
- }, {}],
3000
- 14: [function (require, module, exports) {
3001
- "use strict";
3002
- /*
3003
- [Exposed=Window]
3004
- interface RTCRtpTransceiver {
3005
- readonly attribute DOMString? mid;
3006
- [SameObject]
3007
- readonly attribute RTCRtpSender sender;
3008
- [SameObject]
3009
- readonly attribute RTCRtpReceiver receiver;
3010
- readonly attribute boolean stopped;
3011
- attribute RTCRtpTransceiverDirection direction;
3012
- readonly attribute RTCRtpTransceiverDirection? currentDirection;
3013
- void stop();
3014
- void setCodecPreferences(sequence<RTCRtpCodecCapability> codecs);
3015
- };
3016
- */
3017
-
3018
- var RTPRtcTransceiver = function RTPRtcTransceiver(sender, receiver) {
3019
- //Private attributes
3020
- var priv = this.priv = {
3021
- mid: null,
3022
- sender: sender,
3023
- receiver: receiver,
3024
- stopped: false,
3025
- direction: "sendrecv",
3026
- currentDirection: "sendrecv"
3027
- }; //Read only
3028
-
3029
- Object.defineProperty(this, "mid", {
3030
- enumerable: true,
3031
- configurable: false,
3032
- get: function get() {
3033
- return priv.mid;
3034
- }
3035
- });
3036
- Object.defineProperty(this, "sender", {
3037
- enumerable: true,
3038
- configurable: false,
3039
- get: function get() {
3040
- return priv.sender;
3041
- }
3042
- });
3043
- Object.defineProperty(this, "receiver", {
3044
- enumerable: true,
3045
- configurable: false,
3046
- get: function get() {
3047
- return priv.receiver;
3048
- }
3049
- });
3050
- Object.defineProperty(this, "stopped", {
3051
- enumerable: true,
3052
- configurable: false,
3053
- get: function get() {
3054
- return priv.stopped;
3055
- }
3056
- });
3057
- Object.defineProperty(this, "currentDirection", {
3058
- enumerable: true,
3059
- configurable: false,
3060
- get: function get() {
3061
- return priv.currentDirection;
3062
- }
3063
- }); //REad and write
3064
-
3065
- Object.defineProperty(this, "currentDirection", {
3066
- enumerable: true,
3067
- configurable: false,
3068
- get: function get() {
3069
- return priv.direction;
3070
- },
3071
- set: function set(direction) {
3072
- priv.direction = direction;
3073
- priv.currentDirection = direction;
3074
- return direction;
3075
- }
3076
- });
3077
- };
3078
-
3079
- RTPRtcTransceiver.prototype.stop = function () {
3080
- throw "Not implemented";
3081
- };
3082
-
3083
- Object.defineProperty(RTPRtcTransceiver, 'name', {
3084
- enumerable: false,
3085
- configurable: true,
3086
- writable: false,
3087
- value: "RTPRtcTransceiver"
3088
- });
3089
- Object.defineProperty(RTPRtcTransceiver, 'prototype', {
3090
- writable: false
3091
- });
3092
- module.exports = RTPRtcTransceiver;
3093
- }, {}],
3094
- 15: [function (require, module, exports) {
3095
- "use strict";
3096
- /*
3097
- [Constructor(RTCSessionDescriptionInit descriptionInitDict),
3098
- Exposed=Window]
3099
- interface RTCSessionDescription {
3100
- readonly attribute RTCSdpType type;
3101
- readonly attribute DOMString sdp;
3102
- [Default] object toJSON();
3103
- };
3104
- dictionary RTCSessionDescriptionInit {
3105
- required RTCSdpType type;
3106
- DOMString sdp = "";
3107
- };
3108
- */
3109
-
3110
- function RTCSessionDescription(descriptionInitDict) {
3111
- //Get values from dictionary
3112
- // we support custom constructor to pass array instead of object as "dictionary" from activexobject
3113
- var type = Array.isArray(descriptionInitDict) ? descriptionInitDict[0] : descriptionInitDict.type;
3114
- var sdp = Array.isArray(descriptionInitDict) ? descriptionInitDict[1] : descriptionInitDict.sdp; //Direct attributes from init
3115
-
3116
- Object.defineProperty(this, "type", {
3117
- enumerable: true,
3118
- configurable: false,
3119
- get: function get() {
3120
- return type;
3121
- }
3122
- });
3123
- Object.defineProperty(this, "sdp", {
3124
- enumerable: true,
3125
- configurable: false,
3126
- get: function get() {
3127
- return sdp;
3128
- }
3129
- });
3130
- return this;
3131
- }
3132
-
3133
- ;
3134
-
3135
- RTCSessionDescription.prototype.toJSON = function () {
3136
- return {
3137
- type: this.type,
3138
- sdp: this.sdp
3139
- };
3140
- };
3141
-
3142
- Object.defineProperty(RTCSessionDescription, 'name', {
3143
- enumerable: false,
3144
- configurable: true,
3145
- writable: false,
3146
- value: "RTCSessionDescription"
3147
- });
3148
- Object.defineProperty(RTCSessionDescription, 'prototype', {
3149
- writable: false
3150
- });
3151
- module.exports = RTCSessionDescription;
3152
- }, {}],
3153
- 16: [function (require, module, exports) {
3154
- "use strict"; // This obvserver checks when a video element has been set a srcObj
3155
-
3156
- var videoObserver = new MutationObserver(function (mutations) {
3157
- for (var i = 0, numMutations = mutations.length; i < numMutations; i++) {
3158
- var mutation = mutations[i]; // HTML video element.
3159
-
3160
- if (mutation.target.videoRenderer) mutation.target.videoRenderer.mutate(mutation);
3161
- }
3162
- });
3163
- var CLASSID = "CLSID:B8E874D9-72BA-4E54-B59B-3513081DF516";
3164
-
3165
- function VideoRenderer(video) {
3166
- var srcObject;
3167
- var self = this; //Store video element
3168
-
3169
- this.video = video; //Create a new video renderer object
3170
-
3171
- var object = this.object = document.createElement("object"); //Set csid
3172
-
3173
- this.object.classid = CLASSID; //Apped it hidden
3174
-
3175
- video.appendChild(this.object); // Add .src observer to the video element.
3176
-
3177
- videoObserver.observe(video, {
3178
- // Set to true if additions and removals of the target node's child elements (including text
3179
- // nodes) are to be observed.
3180
- childList: false,
3181
- // Set to true if mutations to target's attributes are to be observed.
3182
- attributes: true,
3183
- // Set to true if mutations to target's data are to be observed.
3184
- characterData: false,
3185
- // Set to true if mutations to not just target, but also target's descendants are to be observed.
3186
- subtree: false,
3187
- // Set to true if attributes is set to true and target's attribute value before the mutation
3188
- // needs to be recorded.
3189
- attributeOldValue: true,
3190
- // Set to true if characterData is set to true and target's data before the mutation needs to be
3191
- // recorded.
3192
- characterDataOldValue: false // Set to an array of attribute local names (without namespace) if not all attribute mutations
3193
- // need to be observed.
3194
- //attributeFilter: [ 'srcObject']
3195
-
3196
- }); // Define srcObject properties
3197
-
3198
- Object.defineProperty(video, 'srcObject', {
3199
- enumerable: true,
3200
- configurable: true,
3201
- get: function get() {
3202
- return srcObject;
3203
- },
3204
- set: function set(stream) {
3205
- //We need to fire metadata event when we get first resize
3206
- var needsmetadata = true; //Attach resize event
3207
-
3208
- object.onresize = function () {
3209
- //Create event
3210
- var event = document.createEvent("Event"); //Init metadata or resize event
3211
-
3212
- event.initEvent(needsmetadata ? "loadedmetadata" : "resize", false, false); //Dispatch it
3213
-
3214
- video.dispatchEvent(event); //No more medatada event
3215
-
3216
- needsmetadata = false;
3217
- }; //Get stream track video stream
3218
-
3219
-
3220
- var videoTracks = stream.getVideoTracks(); //If found any
3221
-
3222
- if (videoTracks.length) //Set native video track on video renderer object
3223
- object.setTrack(videoTracks[0].priv.track); //Store it
3224
-
3225
- srcObject = stream; //Show renderer
3226
-
3227
- self.show();
3228
- }
3229
- }); // Override properties
3230
-
3231
- Object.defineProperty(video, 'videoWidth', {
3232
- enumerable: true,
3233
- configurable: true,
3234
- get: function get() {
3235
- return object.videoWidth;
3236
- }
3237
- });
3238
- Object.defineProperty(video, 'videoHeight', {
3239
- enumerable: true,
3240
- configurable: true,
3241
- get: function get() {
3242
- return object.videoHeight;
3243
- }
3244
- }); //TODO: clone attributes
3245
- }
3246
-
3247
- VideoRenderer.prototype.mutate = function (mutation) {//Get mutation type
3248
- //TODO: clone attributes
3249
- };
3250
-
3251
- VideoRenderer.prototype.close = function () {
3252
- //Hide video object
3253
- this.hide(); //Unobserver video element
3254
-
3255
- videoObserver.disconnect(); //Remove srcObject property
3256
-
3257
- Object.defineProperty(this.video, 'srcObject', {});
3258
- Object.defineProperty(this.video, 'videoWidth', {});
3259
- Object.defineProperty(this.video, 'videoHeigth', {}); //delete object, IE only method
3260
-
3261
- this.object.removeNode(false);
3262
- delete this.object;
3263
- };
3264
-
3265
- VideoRenderer.handle = function (video) {
3266
- if (!video.videoRenderer) video.videoRenderer = new VideoRenderer(video);
3267
- };
3268
-
3269
- VideoRenderer.unhandle = function (video) {
3270
- if (video.videoRenderer) {
3271
- video.videoRenderer.close();
3272
- delete video.videoRenderer;
3273
- }
3274
- };
3275
-
3276
- VideoRenderer.prototype.show = function () {
3277
- //Check object is not shown
3278
- if (this.video !== this.object.parentElement) //Nothing
3279
- return; //Swap them
3280
-
3281
- this.video.parentNode.replaceChild(this.object, this.video);
3282
- this.object.appendChild(this.video);
3283
- };
3284
-
3285
- VideoRenderer.prototype.hide = function () {
3286
- //Check object is not shown
3287
- if (this.object !== this.video.parentElement) //Nothing
3288
- return; //Swap them
3289
-
3290
- this.object.parentNode.replaceChild(this.video, this.object);
3291
- this.video.appendChild(this.object);
3292
- };
3293
-
3294
- module.exports = VideoRenderer;
3295
- }, {}],
3296
- 17: [function (require, module, exports) {
3297
- 'use strict';
3298
-
3299
- var browser = require('detect-browser').detect();
3300
-
3301
- var WebRTCProxy = null; //If it is internet explorer
3302
-
3303
- if (browser.name === 'ie') {
3304
- // Create singleton
3305
- try {
3306
- WebRTCProxy = new ActiveXObject('Cosmo.WebRTCProxy.1');
3307
- } catch (e) {
3308
- console.error('TechSee WebRTC Plugin for IE is not installed');
3309
- }
3310
- }
3311
-
3312
- module.exports = WebRTCProxy;
3313
- }, {
3314
- "detect-browser": 18
3315
- }],
3316
- 18: [function (require, module, exports) {
3317
- (function (process) {
3318
- /**
3319
- # detect-browser
3320
- This is a package that attempts to detect a browser vendor and version (in
3321
- a semver compatible format) using a navigator useragent in a browser or
3322
- `process.version` in node.
3323
- ## NOTE: Version 2.x release
3324
- Release 2.0 introduces a breaking API change (hence the major release)
3325
- which requires invocation of a `detect` function rather than just inclusion of
3326
- the module. PR [#46](https://github.com/DamonOehlman/detect-browser/pull/46)
3327
- provides more context as to why this change has been made.
3328
- ## Example Usage
3329
- <<< examples/simple.js
3330
- Or you can use a switch statement:
3331
- <<< examples/switch.js
3332
- ## Adding additional browser support
3333
- The current list of browsers that can be detected by `detect-browser` is
3334
- not exhaustive. If you have a browser that you would like to add support for
3335
- then please submit a pull request with the implementation.
3336
- Creating an acceptable implementation requires two things:
3337
- 1. A test demonstrating that the regular expression you have defined identifies
3338
- your new browser correctly. Examples of this can be found in the
3339
- `test/logic.js` file.
3340
- 2. Write the actual regex to the `lib/detectBrowser.js` file. In most cases adding
3341
- the regex to the list of existing regexes will be suitable (if usage of `detect-brower`
3342
- returns `undefined` for instance), but in some cases you might have to add it before
3343
- an existing regex. This would be true for a case where you have a browser that
3344
- is a specialised variant of an existing browser but is identified as the
3345
- non-specialised case.
3346
- When writing the regular expression remember that you would write it containing a
3347
- single [capturing group](https://regexone.com/lesson/capturing_groups) which
3348
- captures the version number of the browser.
3349
- **/
3350
- function detect() {
3351
- var nodeVersion = getNodeVersion();
3352
-
3353
- if (nodeVersion) {
3354
- return nodeVersion;
3355
- } else if (typeof navigator !== 'undefined') {
3356
- return parseUserAgent(navigator.userAgent);
3357
- }
3358
-
3359
- return null;
3360
- }
3361
-
3362
- function detectOS(userAgentString) {
3363
- var rules = getOperatingSystemRules();
3364
- var detected = rules.filter(function (os) {
3365
- return os.rule && os.rule.test(userAgentString);
3366
- })[0];
3367
- return detected ? detected.name : null;
3368
- }
3369
-
3370
- function getNodeVersion() {
3371
- var isNode = typeof navigator === 'undefined' && typeof process !== 'undefined';
3372
- return isNode ? {
3373
- name: 'node',
3374
- version: process.version.slice(1),
3375
- os: require('os').type().toLowerCase()
3376
- } : null;
3377
- }
3378
-
3379
- function parseUserAgent(userAgentString) {
3380
- var browsers = getBrowserRules();
3381
-
3382
- if (!userAgentString) {
3383
- return null;
3384
- }
3385
-
3386
- var detected = browsers.map(function (browser) {
3387
- var match = browser.rule.exec(userAgentString);
3388
- var version = match && match[1].split(/[._]/).slice(0, 3);
3389
-
3390
- if (version && version.length < 3) {
3391
- version = version.concat(version.length == 1 ? [0, 0] : [0]);
3392
- }
3393
-
3394
- return match && {
3395
- name: browser.name,
3396
- version: version.join('.')
3397
- };
3398
- }).filter(Boolean)[0] || null;
3399
-
3400
- if (detected) {
3401
- detected.os = detectOS(userAgentString);
3402
- }
3403
-
3404
- return detected;
3405
- }
3406
-
3407
- function getBrowserRules() {
3408
- return buildRules([['edge', /Edge\/([0-9\._]+)/], ['yandexbrowser', /YaBrowser\/([0-9\._]+)/], ['vivaldi', /Vivaldi\/([0-9\.]+)/], ['kakaotalk', /KAKAOTALK\s([0-9\.]+)/], ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/], ['phantomjs', /PhantomJS\/([0-9\.]+)(:?\s|$)/], ['crios', /CriOS\/([0-9\.]+)(:?\s|$)/], ['firefox', /Firefox\/([0-9\.]+)(?:\s|$)/], ['fxios', /FxiOS\/([0-9\.]+)/], ['opera', /Opera\/([0-9\.]+)(?:\s|$)/], ['opera', /OPR\/([0-9\.]+)(:?\s|$)$/], ['ie', /Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/], ['ie', /MSIE\s([0-9\.]+);.*Trident\/[4-7].0/], ['ie', /MSIE\s(7\.0)/], ['bb10', /BB10;\sTouch.*Version\/([0-9\.]+)/], ['android', /Android\s([0-9\.]+)/], ['ios', /Version\/([0-9\._]+).*Mobile.*Safari.*/], ['safari', /Version\/([0-9\._]+).*Safari/]]);
3409
- }
3410
-
3411
- function getOperatingSystemRules() {
3412
- return buildRules([['iOS', /iP(hone|od|ad)/], ['Android OS', /Android/], ['BlackBerry OS', /BlackBerry|BB10/], ['Windows Mobile', /IEMobile/], ['Amazon OS', /Kindle/], ['Windows 3.11', /Win16/], ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/], ['Windows 98', /(Windows 98)|(Win98)/], ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/], ['Windows XP', /(Windows NT 5.1)|(Windows XP)/], ['Windows Server 2003', /(Windows NT 5.2)/], ['Windows Vista', /(Windows NT 6.0)/], ['Windows 7', /(Windows NT 6.1)/], ['Windows 8', /(Windows NT 6.2)/], ['Windows 8.1', /(Windows NT 6.3)/], ['Windows 10', /(Windows NT 10.0)/], ['Windows ME', /Windows ME/], ['Open BSD', /OpenBSD/], ['Sun OS', /SunOS/], ['Linux', /(Linux)|(X11)/], ['Mac OS', /(Mac_PowerPC)|(Macintosh)/], ['QNX', /QNX/], ['BeOS', /BeOS/], ['OS/2', /OS\/2/], ['Search Bot', /(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\/Teoma)|(ia_archiver)/]]);
3413
- }
3414
-
3415
- function buildRules(ruleTuples) {
3416
- return ruleTuples.map(function (tuple) {
3417
- return {
3418
- name: tuple[0],
3419
- rule: tuple[1]
3420
- };
3421
- });
3422
- }
3423
-
3424
- module.exports = {
3425
- detect: detect,
3426
- detectOS: detectOS,
3427
- getNodeVersion: getNodeVersion,
3428
- parseUserAgent: parseUserAgent
3429
- };
3430
- }).call(this, require('_process'));
3431
- }, {
3432
- "_process": 2,
3433
- "os": 1
3434
- }]
3435
- }, {}, [3])(3);
3436
- });
3437
- //# sourceMappingURL=webrtc-ie-shim.js.map