iqiyi-player-switch

爱奇艺flash播放器与html5播放器随意切换,改善html5播放器播放体验。

当前为 2017-07-29 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name iqiyi-player-switch
  3. // @namespace https://github.com/gooyie/userscript-iqiyi-player-switch
  4. // @homepageURL https://github.com/gooyie/userscript-iqiyi-player-switch
  5. // @supportURL https://github.com/gooyie/userscript-iqiyi-player-switch/issues
  6. // @version 1.10.3
  7. // @description 爱奇艺flash播放器与html5播放器随意切换,改善html5播放器播放体验。
  8. // @author gooyie
  9. // @license MIT License
  10. //
  11. // @include *://*.iqiyi.com/*
  12. // @include *://v.baidu.com/*
  13. // @include *://music.baidu.com/mv/*
  14. // @include *://www.zybus.com/*
  15. // @grant GM_registerMenuCommand
  16. // @grant GM_xmlhttpRequest
  17. // @grant GM_addStyle
  18. // @grant GM_getValue
  19. // @grant GM_setValue
  20. // @grant GM_info
  21. // @grant unsafeWindow
  22. // @connect qiyi.com
  23. // @run-at document-start
  24. // ==/UserScript==
  25. /******/ (function(modules) { // webpackBootstrap
  26. /******/ // The module cache
  27. /******/ var installedModules = {};
  28. /******/
  29. /******/ // The require function
  30. /******/ function __webpack_require__(moduleId) {
  31. /******/
  32. /******/ // Check if module is in cache
  33. /******/ if(installedModules[moduleId]) {
  34. /******/ return installedModules[moduleId].exports;
  35. /******/ }
  36. /******/ // Create a new module (and put it into the cache)
  37. /******/ var module = installedModules[moduleId] = {
  38. /******/ i: moduleId,
  39. /******/ l: false,
  40. /******/ exports: {}
  41. /******/ };
  42. /******/
  43. /******/ // Execute the module function
  44. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  45. /******/
  46. /******/ // Flag the module as loaded
  47. /******/ module.l = true;
  48. /******/
  49. /******/ // Return the exports of the module
  50. /******/ return module.exports;
  51. /******/ }
  52. /******/
  53. /******/
  54. /******/ // expose the modules object (__webpack_modules__)
  55. /******/ __webpack_require__.m = modules;
  56. /******/
  57. /******/ // expose the module cache
  58. /******/ __webpack_require__.c = installedModules;
  59. /******/
  60. /******/ // define getter function for harmony exports
  61. /******/ __webpack_require__.d = function(exports, name, getter) {
  62. /******/ if(!__webpack_require__.o(exports, name)) {
  63. /******/ Object.defineProperty(exports, name, {
  64. /******/ configurable: false,
  65. /******/ enumerable: true,
  66. /******/ get: getter
  67. /******/ });
  68. /******/ }
  69. /******/ };
  70. /******/
  71. /******/ // getDefaultExport function for compatibility with non-harmony modules
  72. /******/ __webpack_require__.n = function(module) {
  73. /******/ var getter = module && module.__esModule ?
  74. /******/ function getDefault() { return module['default']; } :
  75. /******/ function getModuleExports() { return module; };
  76. /******/ __webpack_require__.d(getter, 'a', getter);
  77. /******/ return getter;
  78. /******/ };
  79. /******/
  80. /******/ // Object.prototype.hasOwnProperty.call
  81. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  82. /******/
  83. /******/ // __webpack_public_path__
  84. /******/ __webpack_require__.p = "";
  85. /******/
  86. /******/ // Load entry module and return exports
  87. /******/ return __webpack_require__(__webpack_require__.s = 8);
  88. /******/ })
  89. /************************************************************************/
  90. /******/ ([
  91. /* 0 */
  92. /***/ (function(module, exports, __webpack_require__) {
  93.  
  94. "use strict";
  95. /*
  96. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  97. *
  98. * Use of this source code is governed by a BSD-style license
  99. * that can be found in the LICENSE file in the root of the source
  100. * tree.
  101. */
  102. /* eslint-env node */
  103.  
  104.  
  105. var logDisabled_ = true;
  106. var deprecationWarnings_ = true;
  107.  
  108. // Utility methods.
  109. var utils = {
  110. disableLog: function(bool) {
  111. if (typeof bool !== 'boolean') {
  112. return new Error('Argument type: ' + typeof bool +
  113. '. Please use a boolean.');
  114. }
  115. logDisabled_ = bool;
  116. return (bool) ? 'adapter.js logging disabled' :
  117. 'adapter.js logging enabled';
  118. },
  119.  
  120. /**
  121. * Disable or enable deprecation warnings
  122. * @param {!boolean} bool set to true to disable warnings.
  123. */
  124. disableWarnings: function(bool) {
  125. if (typeof bool !== 'boolean') {
  126. return new Error('Argument type: ' + typeof bool +
  127. '. Please use a boolean.');
  128. }
  129. deprecationWarnings_ = !bool;
  130. return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');
  131. },
  132.  
  133. log: function() {
  134. if (typeof window === 'object') {
  135. if (logDisabled_) {
  136. return;
  137. }
  138. if (typeof console !== 'undefined' && typeof console.log === 'function') {
  139. console.log.apply(console, arguments);
  140. }
  141. }
  142. },
  143.  
  144. /**
  145. * Shows a deprecation warning suggesting the modern and spec-compatible API.
  146. */
  147. deprecated: function(oldMethod, newMethod) {
  148. if (!deprecationWarnings_) {
  149. return;
  150. }
  151. console.warn(oldMethod + ' is deprecated, please use ' + newMethod +
  152. ' instead.');
  153. },
  154.  
  155. /**
  156. * Extract browser version out of the provided user agent string.
  157. *
  158. * @param {!string} uastring userAgent string.
  159. * @param {!string} expr Regular expression used as match criteria.
  160. * @param {!number} pos position in the version string to be returned.
  161. * @return {!number} browser version.
  162. */
  163. extractVersion: function(uastring, expr, pos) {
  164. var match = uastring.match(expr);
  165. return match && match.length >= pos && parseInt(match[pos], 10);
  166. },
  167.  
  168. /**
  169. * Browser detector.
  170. *
  171. * @return {object} result containing browser and version
  172. * properties.
  173. */
  174. detectBrowser: function(window) {
  175. var navigator = window && window.navigator;
  176.  
  177. // Returned result object.
  178. var result = {};
  179. result.browser = null;
  180. result.version = null;
  181.  
  182. // Fail early if it's not a browser
  183. if (typeof window === 'undefined' || !window.navigator) {
  184. result.browser = 'Not a browser.';
  185. return result;
  186. }
  187.  
  188. // Firefox.
  189. if (navigator.mozGetUserMedia) {
  190. result.browser = 'firefox';
  191. result.version = this.extractVersion(navigator.userAgent,
  192. /Firefox\/(\d+)\./, 1);
  193. } else if (navigator.webkitGetUserMedia) {
  194. // Chrome, Chromium, Webview, Opera, all use the chrome shim for now
  195. if (window.webkitRTCPeerConnection) {
  196. result.browser = 'chrome';
  197. result.version = this.extractVersion(navigator.userAgent,
  198. /Chrom(e|ium)\/(\d+)\./, 2);
  199. } else { // Safari (in an unpublished version) or unknown webkit-based.
  200. if (navigator.userAgent.match(/Version\/(\d+).(\d+)/)) {
  201. result.browser = 'safari';
  202. result.version = this.extractVersion(navigator.userAgent,
  203. /AppleWebKit\/(\d+)\./, 1);
  204. } else { // unknown webkit-based browser.
  205. result.browser = 'Unsupported webkit-based browser ' +
  206. 'with GUM support but no WebRTC support.';
  207. return result;
  208. }
  209. }
  210. } else if (navigator.mediaDevices &&
  211. navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) { // Edge.
  212. result.browser = 'edge';
  213. result.version = this.extractVersion(navigator.userAgent,
  214. /Edge\/(\d+).(\d+)$/, 2);
  215. } else if (navigator.mediaDevices &&
  216. navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) {
  217. // Safari, with webkitGetUserMedia removed.
  218. result.browser = 'safari';
  219. result.version = this.extractVersion(navigator.userAgent,
  220. /AppleWebKit\/(\d+)\./, 1);
  221. } else { // Default fallthrough: not supported.
  222. result.browser = 'Not a supported browser.';
  223. return result;
  224. }
  225.  
  226. return result;
  227. },
  228.  
  229. // shimCreateObjectURL must be called before shimSourceObject to avoid loop.
  230.  
  231. shimCreateObjectURL: function(window) {
  232. var URL = window && window.URL;
  233.  
  234. if (!(typeof window === 'object' && window.HTMLMediaElement &&
  235. 'srcObject' in window.HTMLMediaElement.prototype)) {
  236. // Only shim CreateObjectURL using srcObject if srcObject exists.
  237. return undefined;
  238. }
  239.  
  240. var nativeCreateObjectURL = URL.createObjectURL.bind(URL);
  241. var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);
  242. var streams = new Map(), newId = 0;
  243.  
  244. URL.createObjectURL = function(stream) {
  245. if ('getTracks' in stream) {
  246. var url = 'polyblob:' + (++newId);
  247. streams.set(url, stream);
  248. utils.deprecated('URL.createObjectURL(stream)',
  249. 'elem.srcObject = stream');
  250. return url;
  251. }
  252. return nativeCreateObjectURL(stream);
  253. };
  254. URL.revokeObjectURL = function(url) {
  255. nativeRevokeObjectURL(url);
  256. streams.delete(url);
  257. };
  258.  
  259. var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,
  260. 'src');
  261. Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {
  262. get: function() {
  263. return dsc.get.apply(this);
  264. },
  265. set: function(url) {
  266. this.srcObject = streams.get(url) || null;
  267. return dsc.set.apply(this, [url]);
  268. }
  269. });
  270.  
  271. var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;
  272. window.HTMLMediaElement.prototype.setAttribute = function() {
  273. if (arguments.length === 2 &&
  274. ('' + arguments[0]).toLowerCase() === 'src') {
  275. this.srcObject = streams.get(arguments[1]) || null;
  276. }
  277. return nativeSetAttribute.apply(this, arguments);
  278. };
  279. }
  280. };
  281.  
  282. // Export.
  283. module.exports = {
  284. log: utils.log,
  285. deprecated: utils.deprecated,
  286. disableLog: utils.disableLog,
  287. disableWarnings: utils.disableWarnings,
  288. extractVersion: utils.extractVersion,
  289. shimCreateObjectURL: utils.shimCreateObjectURL,
  290. detectBrowser: utils.detectBrowser.bind(utils)
  291. };
  292.  
  293.  
  294. /***/ }),
  295. /* 1 */
  296. /***/ (function(module, exports, __webpack_require__) {
  297.  
  298. "use strict";
  299.  
  300.  
  301. Object.defineProperty(exports, "__esModule", {
  302. value: true
  303. });
  304.  
  305. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  306.  
  307. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  308.  
  309. /* eslint-disable no-console */
  310. var Logger = function () {
  311. function Logger(tag) {
  312. _classCallCheck(this, Logger);
  313.  
  314. this._tag = tag;
  315. }
  316.  
  317. _createClass(Logger, [{
  318. key: 'log',
  319. value: function log() {
  320. var _console;
  321.  
  322. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  323. args[_key] = arguments[_key];
  324. }
  325.  
  326. (_console = console).log.apply(_console, ['%c' + this.tag + '%c' + args.shift(), 'color: green; font-weight: bolder', 'color: blue'].concat(args));
  327. }
  328. }, {
  329. key: 'info',
  330. value: function info() {
  331. var _console2;
  332.  
  333. for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  334. args[_key2] = arguments[_key2];
  335. }
  336.  
  337. (_console2 = console).info.apply(_console2, [this.tag + args.shift()].concat(args));
  338. }
  339. }, {
  340. key: 'debug',
  341. value: function debug() {
  342. var _console3;
  343.  
  344. for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
  345. args[_key3] = arguments[_key3];
  346. }
  347.  
  348. (_console3 = console).debug.apply(_console3, [this.tag + args.shift()].concat(args));
  349. }
  350. }, {
  351. key: 'warn',
  352. value: function warn() {
  353. var _console4;
  354.  
  355. for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
  356. args[_key4] = arguments[_key4];
  357. }
  358.  
  359. (_console4 = console).warn.apply(_console4, [this.tag + args.shift()].concat(args));
  360. }
  361. }, {
  362. key: 'error',
  363. value: function error() {
  364. var _console5;
  365.  
  366. for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
  367. args[_key5] = arguments[_key5];
  368. }
  369.  
  370. (_console5 = console).error.apply(_console5, [this.tag + args.shift()].concat(args));
  371. }
  372. }, {
  373. key: 'tag',
  374. get: function get() {
  375. return this._tag;
  376. }
  377. }]);
  378.  
  379. return Logger;
  380. }();
  381.  
  382. exports.default = new Logger('[' + GM_info.script.name + ']');
  383.  
  384. /***/ }),
  385. /* 2 */
  386. /***/ (function(module, exports, __webpack_require__) {
  387.  
  388. "use strict";
  389.  
  390.  
  391. Object.defineProperty(exports, "__esModule", {
  392. value: true
  393. });
  394.  
  395. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  396.  
  397. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  398.  
  399. var Detector = function () {
  400. function Detector() {
  401. _classCallCheck(this, Detector);
  402. }
  403.  
  404. _createClass(Detector, null, [{
  405. key: 'isSupportHtml5',
  406. value: function isSupportHtml5() {
  407. var v = document.createElement('video');
  408. return !!(v.canPlayType('audio/mp4; codecs="mp4a.40.2"') && v.canPlayType('video/mp4; codecs="avc1.640029"') && v.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"'));
  409. }
  410. }, {
  411. key: 'isSupportVms',
  412. value: function isSupportVms() {
  413. return !!(window.MediaSource && window.URL && window.WebSocket && window.ReadableStream && (window.RTCSessionDescription || window.webkitRTCSessionDescription) && (window.RTCPeerConnection || window.webkitRTCPeerConnection) && (window.RTCIceCandidate || window.webkitRTCIceCandidate));
  414. }
  415. }, {
  416. key: 'isSupportM3u8',
  417. value: function isSupportM3u8() {
  418. var v = document.createElement('video');
  419. return !!(v.canPlayType('application/x-mpegurl') && v.canPlayType('application/vnd.apple.mpegurl'));
  420. }
  421. }, {
  422. key: 'isChrome',
  423. value: function isChrome() {
  424. return (/chrome/i.test(navigator.userAgent)
  425. );
  426. }
  427. }, {
  428. key: 'isFirefox',
  429. value: function isFirefox() {
  430. return (/firefox/i.test(navigator.userAgent)
  431. );
  432. }
  433. }, {
  434. key: 'isEdge',
  435. value: function isEdge() {
  436. return (/edge/i.test(navigator.userAgent)
  437. );
  438. }
  439. }, {
  440. key: 'isInnerFrame',
  441. value: function isInnerFrame() {
  442. return window.top !== window.self;
  443. }
  444. }, {
  445. key: 'isOutsite',
  446. value: function isOutsite() {
  447. return !/\.iqiyi\.com$/.test(location.host);
  448. }
  449. }, {
  450. key: 'hasFlashPlugin',
  451. value: function hasFlashPlugin() {
  452. var plugins = unsafeWindow.navigator.plugins;
  453. return !!(plugins['Shockwave Flash'] && plugins['Shockwave Flash'].description);
  454. }
  455. }, {
  456. key: 'isFullScreen',
  457. value: function isFullScreen() {
  458. return !!(document.fullscreen || document.webkitIsFullScreen || document.mozFullScreen || document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement);
  459. }
  460. }]);
  461.  
  462. return Detector;
  463. }();
  464.  
  465. exports.default = Detector;
  466.  
  467. /***/ }),
  468. /* 3 */
  469. /***/ (function(module, exports) {
  470.  
  471. var g;
  472.  
  473. // This works in non-strict mode
  474. g = (function() {
  475. return this;
  476. })();
  477.  
  478. try {
  479. // This works if eval is allowed (see CSP)
  480. g = g || Function("return this")() || (1,eval)("this");
  481. } catch(e) {
  482. // This works if the window reference is available
  483. if(typeof window === "object")
  484. g = window;
  485. }
  486.  
  487. // g can still be undefined, but nothing to do about it...
  488. // We return undefined, instead of nothing here, so it's
  489. // easier to handle this case. if(!global) { ...}
  490.  
  491. module.exports = g;
  492.  
  493.  
  494. /***/ }),
  495. /* 4 */
  496. /***/ (function(module, exports, __webpack_require__) {
  497.  
  498. "use strict";
  499.  
  500.  
  501. Object.defineProperty(exports, "__esModule", {
  502. value: true
  503. });
  504.  
  505. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  506.  
  507. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  508.  
  509. var Cookies = function () {
  510. function Cookies() {
  511. _classCallCheck(this, Cookies);
  512. }
  513.  
  514. _createClass(Cookies, null, [{
  515. key: 'get',
  516. value: function get(key) {
  517. var value = void 0;
  518. if (new RegExp('^[^\\x00-\\x20\\x7f\\(\\)<>@,;:\\\\\\"\\[\\]\\?=\\{\\}\\/\\u0080-\\uffff]+$').test(key)) {
  519. // eslint-disable-line no-control-regex
  520. var re = new RegExp('(^| )' + key + '=([^;]*)(;|$)');
  521. var rs = re.exec(document.cookie);
  522. value = rs ? rs[2] : '';
  523. }
  524. return value ? decodeURIComponent(value) : '';
  525. }
  526. }, {
  527. key: 'set',
  528. value: function set(k, v) {
  529. var o = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  530.  
  531. var n = o.expires;
  532. if ('number' == typeof o.expires) {
  533. n = new Date();
  534. n.setTime(n.getTime() + o.expires);
  535. }
  536. var key = k;
  537. var value = encodeURIComponent(v);
  538. var path = o.path ? '; path=' + o.path : '';
  539. var expires = n ? '; expires=' + n.toGMTString() : '';
  540. var domain = o.domain ? '; domain=' + o.domain : '';
  541. document.cookie = key + '=' + value + path + expires + domain;
  542. }
  543. }, {
  544. key: 'remove',
  545. value: function remove(k) {
  546. var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  547.  
  548. o.expires = new Date(0);
  549. this.set(k, '', o);
  550. }
  551. }]);
  552.  
  553. return Cookies;
  554. }();
  555.  
  556. exports.default = Cookies;
  557.  
  558. /***/ }),
  559. /* 5 */
  560. /***/ (function(module, exports, __webpack_require__) {
  561.  
  562. "use strict";
  563.  
  564.  
  565. Object.defineProperty(exports, "__esModule", {
  566. value: true
  567. });
  568.  
  569. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  570.  
  571. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  572.  
  573. var _logger = __webpack_require__(1);
  574.  
  575. var _logger2 = _interopRequireDefault(_logger);
  576.  
  577. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  578.  
  579. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  580.  
  581. var Hooker = function () {
  582. function Hooker() {
  583. _classCallCheck(this, Hooker);
  584. }
  585.  
  586. _createClass(Hooker, null, [{
  587. key: 'hookCall',
  588. value: function hookCall() {
  589. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  590.  
  591. var call = Function.prototype.call;
  592. Function.prototype.call = function () {
  593. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  594. args[_key] = arguments[_key];
  595. }
  596.  
  597. var ret = call.apply(this, args);
  598. try {
  599. if (args) cb.apply(undefined, args);
  600. } catch (err) {
  601. _logger2.default.error(err.stack);
  602. }
  603. return ret;
  604. };
  605.  
  606. Function.prototype.call.toString = Function.prototype.call.toLocaleString = function () {
  607. return 'function call() { [native code] }';
  608. };
  609. }
  610. }, {
  611. key: '_isFactoryCall',
  612. value: function _isFactoryCall(args) {
  613. // module.exports, module, module.exports, require
  614. return args.length === 4 && args[1] instanceof Object && args[1].hasOwnProperty('exports');
  615. }
  616. }, {
  617. key: 'hookFactoryCall',
  618. value: function hookFactoryCall() {
  619. var _this = this;
  620.  
  621. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  622.  
  623. this.hookCall(function () {
  624. for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  625. args[_key2] = arguments[_key2];
  626. }
  627.  
  628. if (_this._isFactoryCall(args)) cb.apply(undefined, args);
  629. });
  630. }
  631. }, {
  632. key: '_isJqueryFactoryCall',
  633. value: function _isJqueryFactoryCall(exports) {
  634. return exports.hasOwnProperty('fn') && exports.fn.hasOwnProperty('jquery');
  635. }
  636. }, {
  637. key: 'hookJquery',
  638. value: function hookJquery() {
  639. var _this2 = this;
  640.  
  641. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  642.  
  643. this.hookFactoryCall(function () {
  644. for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
  645. args[_key3] = arguments[_key3];
  646. }
  647.  
  648. if (_this2._isJqueryFactoryCall(args[1].exports)) cb(args[1].exports);
  649. });
  650. }
  651. }, {
  652. key: 'hookJqueryAjax',
  653. value: function hookJqueryAjax() {
  654. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  655.  
  656. this.hookJquery(function (exports) {
  657. var ajax = exports.ajax.bind(exports);
  658.  
  659. exports.ajax = function (url) {
  660. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  661.  
  662. if ((typeof url === 'undefined' ? 'undefined' : _typeof(url)) === 'object') {
  663. var _ref = [url.url, url];
  664. url = _ref[0];
  665. options = _ref[1];
  666. }
  667.  
  668. var isHijacked = cb(url, options);
  669. if (isHijacked) return;
  670.  
  671. return ajax(url, options);
  672. };
  673. });
  674. }
  675. }, {
  676. key: '_isHttpFactoryCall',
  677. value: function _isHttpFactoryCall() {
  678. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  679.  
  680. return exports.hasOwnProperty('jsonp') && exports.hasOwnProperty('ajax');
  681. }
  682. }, {
  683. key: 'hookHttp',
  684. value: function hookHttp() {
  685. var _this3 = this;
  686.  
  687. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  688.  
  689. this.hookFactoryCall(function () {
  690. for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
  691. args[_key4] = arguments[_key4];
  692. }
  693.  
  694. if (_this3._isHttpFactoryCall(args[1].exports)) cb(args[1].exports);
  695. });
  696. }
  697. }, {
  698. key: 'hookHttpJsonp',
  699. value: function hookHttpJsonp() {
  700. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  701.  
  702. this.hookHttp(function (exports) {
  703. var jsonp = exports.jsonp.bind(exports);
  704.  
  705. exports.jsonp = function (options) {
  706. var isHijacked = cb(options);
  707. if (isHijacked) return;
  708. return jsonp(options);
  709. };
  710. });
  711. }
  712. }, {
  713. key: '_isLogoFactoryCall',
  714. value: function _isLogoFactoryCall() {
  715. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  716.  
  717. return 'function' === typeof exports && exports.prototype.hasOwnProperty('showLogo');
  718. }
  719. }, {
  720. key: 'hookLogo',
  721. value: function hookLogo() {
  722. var _this4 = this;
  723.  
  724. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  725.  
  726. this.hookFactoryCall(function () {
  727. for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
  728. args[_key5] = arguments[_key5];
  729. }
  730.  
  731. if (_this4._isLogoFactoryCall(args[1].exports)) cb(args[1].exports);
  732. });
  733. }
  734. }, {
  735. key: '_isFullScreenFactoryCall',
  736. value: function _isFullScreenFactoryCall() {
  737. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  738.  
  739. return exports.__proto__ && exports.__proto__.hasOwnProperty('isFullScreen');
  740. }
  741. }, {
  742. key: 'hookFullScreen',
  743. value: function hookFullScreen() {
  744. var _this5 = this;
  745.  
  746. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  747.  
  748. this.hookFactoryCall(function () {
  749. for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
  750. args[_key6] = arguments[_key6];
  751. }
  752.  
  753. if (_this5._isFullScreenFactoryCall(args[1].exports)) cb(args[1].exports);
  754. });
  755. }
  756. }, {
  757. key: '_isWebFullScreenFactoryCall',
  758. value: function _isWebFullScreenFactoryCall() {
  759. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  760.  
  761. return exports.__proto__ && exports.__proto__.hasOwnProperty('isWebFullScreen');
  762. }
  763. }, {
  764. key: 'hookWebFullScreen',
  765. value: function hookWebFullScreen() {
  766. var _this6 = this;
  767.  
  768. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  769.  
  770. this.hookFactoryCall(function () {
  771. for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
  772. args[_key7] = arguments[_key7];
  773. }
  774.  
  775. if (_this6._isWebFullScreenFactoryCall(args[1].exports)) cb(args[1].exports);
  776. });
  777. }
  778. }, {
  779. key: 'hookWebFullScreenInit',
  780. value: function hookWebFullScreenInit() {
  781. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  782.  
  783. this.hookWebFullScreen(function (exports) {
  784. var init = exports.__proto__.init;
  785. exports.__proto__.init = function (wrapper, btn) {
  786. cb(this, wrapper, btn);
  787. init.apply(this, [wrapper, btn]);
  788. };
  789. });
  790. }
  791. }, {
  792. key: '_isPluginControlsFactoryCall',
  793. value: function _isPluginControlsFactoryCall() {
  794. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  795.  
  796. return 'function' === typeof exports && exports.prototype.hasOwnProperty('initFullScreen');
  797. }
  798. }, {
  799. key: 'hookPluginControls',
  800. value: function hookPluginControls() {
  801. var _this7 = this;
  802.  
  803. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  804.  
  805. this.hookFactoryCall(function () {
  806. for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
  807. args[_key8] = arguments[_key8];
  808. }
  809.  
  810. if (_this7._isPluginControlsFactoryCall(args[1].exports)) cb(args[1].exports);
  811. });
  812. }
  813. }, {
  814. key: 'hookPluginControlsInit',
  815. value: function hookPluginControlsInit() {
  816. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  817.  
  818. this.hookPluginControls(function (exports) {
  819. var init = exports.prototype.init;
  820. exports.prototype.init = function () {
  821. cb(this);
  822. init.apply(this);
  823. };
  824. });
  825. }
  826. }, {
  827. key: 'hookInitFullScreen',
  828. value: function hookInitFullScreen() {
  829. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  830.  
  831. this.hookPluginControls(function (exports) {
  832. var initFullScreen = exports.prototype.initFullScreen;
  833. exports.prototype.initFullScreen = function () {
  834. cb(this);
  835. initFullScreen.apply(this);
  836. };
  837. });
  838. }
  839. }, {
  840. key: '_isCoreFactoryCall',
  841. value: function _isCoreFactoryCall() {
  842. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  843.  
  844. return 'function' === typeof exports && exports.prototype.hasOwnProperty('getdefaultvds') && exports.prototype.hasOwnProperty('getMovieInfo');
  845. }
  846. }, {
  847. key: 'hookCore',
  848. value: function hookCore() {
  849. var _this8 = this;
  850.  
  851. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  852.  
  853. this.hookFactoryCall(function () {
  854. for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
  855. args[_key9] = arguments[_key9];
  856. }
  857.  
  858. if (_this8._isCoreFactoryCall(args[1].exports)) cb(args[1].exports);
  859. });
  860. }
  861. }, {
  862. key: '_isSkinBaseFactoryCall',
  863. value: function _isSkinBaseFactoryCall() {
  864. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  865.  
  866. return 'function' === typeof exports && exports.prototype.hasOwnProperty('_checkPlugin');
  867. }
  868. }, {
  869. key: 'hookSkinBase',
  870. value: function hookSkinBase() {
  871. var _this9 = this;
  872.  
  873. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  874.  
  875. this.hookFactoryCall(function () {
  876. for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
  877. args[_key10] = arguments[_key10];
  878. }
  879.  
  880. if (_this9._isSkinBaseFactoryCall(args[1].exports)) cb(args[1].exports);
  881. });
  882. }
  883. }, {
  884. key: '_isPluginHotKeysFactoryCall',
  885. value: function _isPluginHotKeysFactoryCall() {
  886. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  887.  
  888. return 'function' === typeof exports && exports.prototype.hasOwnProperty('_keydown');
  889. }
  890. }, {
  891. key: 'hookPluginHotKeys',
  892. value: function hookPluginHotKeys() {
  893. var _this10 = this;
  894.  
  895. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  896.  
  897. this.hookFactoryCall(function () {
  898. for (var _len11 = arguments.length, args = Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
  899. args[_key11] = arguments[_key11];
  900. }
  901.  
  902. if (_this10._isPluginHotKeysFactoryCall(args[1].exports)) cb(args[1].exports);
  903. });
  904. }
  905. }, {
  906. key: '_isFragmentFactoryCall',
  907. value: function _isFragmentFactoryCall() {
  908. var exports = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  909.  
  910. return 'function' === typeof exports && exports.prototype.hasOwnProperty('parseData');
  911. }
  912. }, {
  913. key: 'hookFragment',
  914. value: function hookFragment() {
  915. var _this11 = this;
  916.  
  917. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  918.  
  919. this.hookFactoryCall(function () {
  920. for (var _len12 = arguments.length, args = Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
  921. args[_key12] = arguments[_key12];
  922. }
  923.  
  924. if (_this11._isFragmentFactoryCall(args[1].exports)) cb(args[1].exports);
  925. });
  926. }
  927. }, {
  928. key: 'hookParseData',
  929. value: function hookParseData() {
  930. var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
  931.  
  932. this.hookFragment(function (exports) {
  933. var parseData = exports.prototype.parseData;
  934. exports.prototype.parseData = function () {
  935. for (var _len13 = arguments.length, args = Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
  936. args[_key13] = arguments[_key13];
  937. }
  938.  
  939. parseData.apply(this, args);
  940. cb(this);
  941. };
  942. });
  943. }
  944. }]);
  945.  
  946. return Hooker;
  947. }();
  948.  
  949. exports.default = Hooker;
  950.  
  951. /***/ }),
  952. /* 6 */
  953. /***/ (function(module, exports, __webpack_require__) {
  954.  
  955. "use strict";
  956.  
  957.  
  958. var required = __webpack_require__(24)
  959. , lolcation = __webpack_require__(25)
  960. , qs = __webpack_require__(26)
  961. , relativere = /^\/(?!\/)/;
  962.  
  963. /**
  964. * These are the parse instructions for the URL parsers, it informs the parser
  965. * about:
  966. *
  967. * 0. The char it Needs to parse, if it's a string it should be done using
  968. * indexOf, RegExp using exec and NaN means set as current value.
  969. * 1. The property we should set when parsing this value.
  970. * 2. Indication if it's backwards or forward parsing, when set as number it's
  971. * the value of extra chars that should be split off.
  972. * 3. Inherit from location if non existing in the parser.
  973. * 4. `toLowerCase` the resulting value.
  974. */
  975. var instructions = [
  976. ['#', 'hash'], // Extract from the back.
  977. ['?', 'query'], // Extract from the back.
  978. ['//', 'protocol', 2, 1, 1], // Extract from the front.
  979. ['/', 'pathname'], // Extract from the back.
  980. ['@', 'auth', 1], // Extract from the front.
  981. [NaN, 'host', undefined, 1, 1], // Set left over value.
  982. [/\:(\d+)$/, 'port'], // RegExp the back.
  983. [NaN, 'hostname', undefined, 1, 1] // Set left over.
  984. ];
  985.  
  986. /**
  987. * The actual URL instance. Instead of returning an object we've opted-in to
  988. * create an actual constructor as it's much more memory efficient and
  989. * faster and it pleases my CDO.
  990. *
  991. * @constructor
  992. * @param {String} address URL we want to parse.
  993. * @param {Boolean|function} parser Parser for the query string.
  994. * @param {Object} location Location defaults for relative paths.
  995. * @api public
  996. */
  997. function URL(address, location, parser) {
  998. if (!(this instanceof URL)) {
  999. return new URL(address, location, parser);
  1000. }
  1001.  
  1002. var relative = relativere.test(address)
  1003. , parse, instruction, index, key
  1004. , type = typeof location
  1005. , url = this
  1006. , i = 0;
  1007.  
  1008. //
  1009. // The following if statements allows this module two have compatibility with
  1010. // 2 different API:
  1011. //
  1012. // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments
  1013. // where the boolean indicates that the query string should also be parsed.
  1014. //
  1015. // 2. The `URL` interface of the browser which accepts a URL, object as
  1016. // arguments. The supplied object will be used as default values / fall-back
  1017. // for relative paths.
  1018. //
  1019. if ('object' !== type && 'string' !== type) {
  1020. parser = location;
  1021. location = null;
  1022. }
  1023.  
  1024. if (parser && 'function' !== typeof parser) {
  1025. parser = qs.parse;
  1026. }
  1027.  
  1028. location = lolcation(location);
  1029.  
  1030. for (; i < instructions.length; i++) {
  1031. instruction = instructions[i];
  1032. parse = instruction[0];
  1033. key = instruction[1];
  1034.  
  1035. if (parse !== parse) {
  1036. url[key] = address;
  1037. } else if ('string' === typeof parse) {
  1038. if (~(index = address.indexOf(parse))) {
  1039. if ('number' === typeof instruction[2]) {
  1040. url[key] = address.slice(0, index);
  1041. address = address.slice(index + instruction[2]);
  1042. } else {
  1043. url[key] = address.slice(index);
  1044. address = address.slice(0, index);
  1045. }
  1046. }
  1047. } else if (index = parse.exec(address)) {
  1048. url[key] = index[1];
  1049. address = address.slice(0, address.length - index[0].length);
  1050. }
  1051.  
  1052. url[key] = url[key] || (instruction[3] || ('port' === key && relative) ? location[key] || '' : '');
  1053.  
  1054. //
  1055. // Hostname, host and protocol should be lowercased so they can be used to
  1056. // create a proper `origin`.
  1057. //
  1058. if (instruction[4]) {
  1059. url[key] = url[key].toLowerCase();
  1060. }
  1061. }
  1062.  
  1063. //
  1064. // Also parse the supplied query string in to an object. If we're supplied
  1065. // with a custom parser as function use that instead of the default build-in
  1066. // parser.
  1067. //
  1068. if (parser) url.query = parser(url.query);
  1069.  
  1070. //
  1071. // We should not add port numbers if they are already the default port number
  1072. // for a given protocol. As the host also contains the port number we're going
  1073. // override it with the hostname which contains no port number.
  1074. //
  1075. if (!required(url.port, url.protocol)) {
  1076. url.host = url.hostname;
  1077. url.port = '';
  1078. }
  1079.  
  1080. //
  1081. // Parse down the `auth` for the username and password.
  1082. //
  1083. url.username = url.password = '';
  1084. if (url.auth) {
  1085. instruction = url.auth.split(':');
  1086. url.username = instruction[0] || '';
  1087. url.password = instruction[1] || '';
  1088. }
  1089.  
  1090. //
  1091. // The href is just the compiled result.
  1092. //
  1093. url.href = url.toString();
  1094. }
  1095.  
  1096. /**
  1097. * This is convenience method for changing properties in the URL instance to
  1098. * insure that they all propagate correctly.
  1099. *
  1100. * @param {String} prop Property we need to adjust.
  1101. * @param {Mixed} value The newly assigned value.
  1102. * @returns {URL}
  1103. * @api public
  1104. */
  1105. URL.prototype.set = function set(part, value, fn) {
  1106. var url = this;
  1107.  
  1108. if ('query' === part) {
  1109. if ('string' === typeof value && value.length) {
  1110. value = (fn || qs.parse)(value);
  1111. }
  1112.  
  1113. url[part] = value;
  1114. } else if ('port' === part) {
  1115. url[part] = value;
  1116.  
  1117. if (!required(value, url.protocol)) {
  1118. url.host = url.hostname;
  1119. url[part] = '';
  1120. } else if (value) {
  1121. url.host = url.hostname +':'+ value;
  1122. }
  1123. } else if ('hostname' === part) {
  1124. url[part] = value;
  1125.  
  1126. if (url.port) value += ':'+ url.port;
  1127. url.host = value;
  1128. } else if ('host' === part) {
  1129. url[part] = value;
  1130.  
  1131. if (/\:\d+/.test(value)) {
  1132. value = value.split(':');
  1133. url.hostname = value[0];
  1134. url.port = value[1];
  1135. }
  1136. } else {
  1137. url[part] = value;
  1138. }
  1139.  
  1140. url.href = url.toString();
  1141. return url;
  1142. };
  1143.  
  1144. /**
  1145. * Transform the properties back in to a valid and full URL string.
  1146. *
  1147. * @param {Function} stringify Optional query stringify function.
  1148. * @returns {String}
  1149. * @api public
  1150. */
  1151. URL.prototype.toString = function toString(stringify) {
  1152. if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;
  1153.  
  1154. var query
  1155. , url = this
  1156. , result = url.protocol +'//';
  1157.  
  1158. if (url.username) {
  1159. result += url.username;
  1160. if (url.password) result += ':'+ url.password;
  1161. result += '@';
  1162. }
  1163.  
  1164. result += url.hostname;
  1165. if (url.port) result += ':'+ url.port;
  1166.  
  1167. result += url.pathname;
  1168.  
  1169. query = 'object' === typeof url.query ? stringify(url.query) : url.query;
  1170. if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;
  1171.  
  1172. if (url.hash) result += url.hash;
  1173.  
  1174. return result;
  1175. };
  1176.  
  1177. //
  1178. // Expose the URL parser and some additional properties that might be useful for
  1179. // others.
  1180. //
  1181. URL.qs = qs;
  1182. URL.location = lolcation;
  1183. module.exports = URL;
  1184.  
  1185.  
  1186. /***/ }),
  1187. /* 7 */
  1188. /***/ (function(module, exports, __webpack_require__) {
  1189.  
  1190. "use strict";
  1191.  
  1192.  
  1193. Object.defineProperty(exports, "__esModule", {
  1194. value: true
  1195. });
  1196.  
  1197. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  1198.  
  1199. var _logger = __webpack_require__(1);
  1200.  
  1201. var _logger2 = _interopRequireDefault(_logger);
  1202.  
  1203. var _cookies = __webpack_require__(4);
  1204.  
  1205. var _cookies2 = _interopRequireDefault(_cookies);
  1206.  
  1207. var _blueimpMd = __webpack_require__(28);
  1208.  
  1209. var _blueimpMd2 = _interopRequireDefault(_blueimpMd);
  1210.  
  1211. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1212.  
  1213. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1214.  
  1215. var Faker = function () {
  1216. function Faker() {
  1217. _classCallCheck(this, Faker);
  1218. }
  1219.  
  1220. _createClass(Faker, null, [{
  1221. key: 'fakeMacPlatform',
  1222. value: function fakeMacPlatform() {
  1223. var PLAFORM_MAC = 'mac';
  1224. Object.defineProperty(unsafeWindow.navigator, 'platform', { get: function get() {
  1225. return PLAFORM_MAC;
  1226. } });
  1227. }
  1228. }, {
  1229. key: 'fakeSafari',
  1230. value: function fakeSafari() {
  1231. var UA_SAFARY = 'safari';
  1232. Object.defineProperty(unsafeWindow.navigator, 'userAgent', { get: function get() {
  1233. return UA_SAFARY;
  1234. } });
  1235. }
  1236. }, {
  1237. key: 'fakeChrome',
  1238. value: function fakeChrome() {
  1239. var UA_CHROME = 'chrome';
  1240. Object.defineProperty(unsafeWindow.navigator, 'userAgent', { get: function get() {
  1241. return UA_CHROME;
  1242. } });
  1243. }
  1244. }, {
  1245. key: 'fakeFlashPlugin',
  1246. value: function fakeFlashPlugin() {
  1247. var plugin = {
  1248. description: 'Shockwave Flash 26.0 r0',
  1249. filename: 'pepflashplayer64_26_0_0_131.dll',
  1250. length: 0,
  1251. name: 'Shockwave Flash'
  1252. };
  1253.  
  1254. Reflect.setPrototypeOf(plugin, Plugin.prototype);
  1255. unsafeWindow.navigator.plugins['Shockwave Flash'] = plugin;
  1256. }
  1257. }, {
  1258. key: '_calcSign',
  1259. value: function _calcSign(authcookie) {
  1260. var RESPONSE_KEY = '-0J1d9d^ESd)9jSsja';
  1261. return (0, _blueimpMd2.default)(authcookie.substring(5, 39).split('').reverse().join('') + '<1<' + RESPONSE_KEY);
  1262. }
  1263. }, {
  1264. key: 'fakeVipRes',
  1265. value: function fakeVipRes(authcookie) {
  1266. var json = {
  1267. code: 'A00000',
  1268. data: {
  1269. sign: this._calcSign(authcookie)
  1270. }
  1271. };
  1272. return json;
  1273. }
  1274. }, {
  1275. key: 'fakeAdRes',
  1276. value: function fakeAdRes() {
  1277. var json = {};
  1278. return json;
  1279. }
  1280. }, {
  1281. key: 'fakePassportCookie',
  1282. value: function fakePassportCookie() {
  1283. _cookies2.default.set('P00001', 'faked_passport', { domain: '.iqiyi.com' });
  1284. _logger2.default.log('faked passport cookie');
  1285. }
  1286. }]);
  1287.  
  1288. return Faker;
  1289. }();
  1290.  
  1291. exports.default = Faker;
  1292.  
  1293. /***/ }),
  1294. /* 8 */
  1295. /***/ (function(module, exports, __webpack_require__) {
  1296.  
  1297. "use strict";
  1298.  
  1299.  
  1300. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  1301.  
  1302. __webpack_require__(9);
  1303.  
  1304. var _logger = __webpack_require__(1);
  1305.  
  1306. var _logger2 = _interopRequireDefault(_logger);
  1307.  
  1308. var _cookies = __webpack_require__(4);
  1309.  
  1310. var _cookies2 = _interopRequireDefault(_cookies);
  1311.  
  1312. var _detector = __webpack_require__(2);
  1313.  
  1314. var _detector2 = _interopRequireDefault(_detector);
  1315.  
  1316. var _mocker = __webpack_require__(27);
  1317.  
  1318. var _mocker2 = _interopRequireDefault(_mocker);
  1319.  
  1320. var _patcher = __webpack_require__(29);
  1321.  
  1322. var _patcher2 = _interopRequireDefault(_patcher);
  1323.  
  1324. var _outsite = __webpack_require__(30);
  1325.  
  1326. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1327.  
  1328. var PLAYER_TYPE = {
  1329. Html5VOD: 'h5_VOD',
  1330. FlashVOD: 'flash_VOD'
  1331. };
  1332.  
  1333. function forceHtml5() {
  1334. _logger2.default.log('setting player_forcedType cookie as ' + PLAYER_TYPE.Html5VOD);
  1335. _cookies2.default.set('player_forcedType', PLAYER_TYPE.Html5VOD, { domain: '.iqiyi.com' });
  1336. }
  1337.  
  1338. function forceFlash() {
  1339. _logger2.default.log('setting player_forcedType cookie as ' + PLAYER_TYPE.FlashVOD);
  1340. _cookies2.default.set('player_forcedType', PLAYER_TYPE.FlashVOD, { domain: '.iqiyi.com' });
  1341. }
  1342.  
  1343. function clean() {
  1344. _cookies2.default.remove('player_forcedType', { domain: '.iqiyi.com' });
  1345. if (_cookies2.default.get('P00001') === 'faked_passport') _cookies2.default.remove('P00001', { domain: '.iqiyi.com' });
  1346. _logger2.default.log('removed cookies.');
  1347. }
  1348.  
  1349. function switchTo(toType) {
  1350. _logger2.default.log('switching to ' + toType + ' ...');
  1351.  
  1352. GM_setValue('player_forcedType', toType);
  1353. document.location.reload();
  1354. }
  1355.  
  1356. function registerMenu() {
  1357. var MENU_NAME = {
  1358. HTML5: 'HTML5播放器',
  1359. FLASH: 'Flash播放器'
  1360. };
  1361.  
  1362. var currType = GM_getValue('player_forcedType', PLAYER_TYPE.Html5VOD); // 默认为Html5播放器,免去切换。
  1363.  
  1364. var _ref = currType === PLAYER_TYPE.Html5VOD ? [PLAYER_TYPE.FlashVOD, MENU_NAME.FLASH] : [PLAYER_TYPE.Html5VOD, MENU_NAME.HTML5],
  1365. _ref2 = _slicedToArray(_ref, 2),
  1366. toType = _ref2[0],
  1367. name = _ref2[1];
  1368.  
  1369. GM_registerMenuCommand(name, function () {
  1370. return switchTo(toType);
  1371. }, null);
  1372. _logger2.default.log('registered menu.');
  1373. }
  1374.  
  1375. //=============================================================================
  1376.  
  1377. registerMenu();
  1378.  
  1379. var currType = GM_getValue('player_forcedType', PLAYER_TYPE.Html5VOD);
  1380. if (currType === PLAYER_TYPE.Html5VOD) {
  1381. if (_detector2.default.isSupportHtml5()) {
  1382. forceHtml5();
  1383. _mocker2.default.mock();
  1384. _patcher2.default.patchShortcuts();
  1385.  
  1386. if (_detector2.default.isInnerFrame()) (0, _outsite.adaptIframe)();
  1387. if (_detector2.default.isOutsite()) (0, _outsite.replaceFlash)();
  1388. } else {
  1389. alert('╮(╯▽╰)╭ 你的浏览器播放不了html5视频~~~~');
  1390. }
  1391. } else {
  1392. forceFlash();
  1393. }
  1394.  
  1395. window.addEventListener('unload', function () {
  1396. return clean();
  1397. });
  1398.  
  1399. /***/ }),
  1400. /* 9 */
  1401. /***/ (function(module, exports, __webpack_require__) {
  1402.  
  1403. "use strict";
  1404.  
  1405.  
  1406. __webpack_require__(10);
  1407.  
  1408. __webpack_require__(21);
  1409.  
  1410. var _src = __webpack_require__(22);
  1411.  
  1412. var _src2 = _interopRequireDefault(_src);
  1413.  
  1414. var _logger = __webpack_require__(1);
  1415.  
  1416. var _logger2 = _interopRequireDefault(_logger);
  1417.  
  1418. var _detector = __webpack_require__(2);
  1419.  
  1420. var _detector2 = _interopRequireDefault(_detector);
  1421.  
  1422. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  1423.  
  1424. function isVideoReq(url) {
  1425. var u = new URL(url);
  1426. return u.pathname.startsWith('/videos/') && u.pathname.endsWith('.f4v');
  1427. }
  1428.  
  1429. if (_detector2.default.isFirefox()) {
  1430. var fetch = unsafeWindow.fetch.bind(unsafeWindow);
  1431.  
  1432. unsafeWindow.fetch = function (url, opts) {
  1433. if (isVideoReq(url)) {
  1434. _logger2.default.log('fetching stream ' + url);
  1435. return (0, _src2.default)(url, opts); // xhr with moz-chunked-arraybuffer
  1436. } else {
  1437. return fetch(url, opts);
  1438. }
  1439. };
  1440. }
  1441.  
  1442. /***/ }),
  1443. /* 10 */
  1444. /***/ (function(module, exports, __webpack_require__) {
  1445.  
  1446. "use strict";
  1447. /* WEBPACK VAR INJECTION */(function(global) {/*
  1448. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  1449. *
  1450. * Use of this source code is governed by a BSD-style license
  1451. * that can be found in the LICENSE file in the root of the source
  1452. * tree.
  1453. */
  1454. /* eslint-env node */
  1455.  
  1456.  
  1457.  
  1458. var adapterFactory = __webpack_require__(11);
  1459. module.exports = adapterFactory({window: global.window});
  1460.  
  1461. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
  1462.  
  1463. /***/ }),
  1464. /* 11 */
  1465. /***/ (function(module, exports, __webpack_require__) {
  1466.  
  1467. "use strict";
  1468. /*
  1469. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  1470. *
  1471. * Use of this source code is governed by a BSD-style license
  1472. * that can be found in the LICENSE file in the root of the source
  1473. * tree.
  1474. */
  1475. /* eslint-env node */
  1476.  
  1477.  
  1478.  
  1479. // Shimming starts here.
  1480. module.exports = function(dependencies, opts) {
  1481. var window = dependencies && dependencies.window;
  1482.  
  1483. var options = Object.assign({
  1484. shimChrome: true,
  1485. shimFirefox: true,
  1486. shimEdge: true,
  1487. shimSafari: true,
  1488. }, opts);
  1489.  
  1490. // Utils.
  1491. var utils = __webpack_require__(0);
  1492. var logging = utils.log;
  1493. var browserDetails = utils.detectBrowser(window);
  1494.  
  1495. // Export to the adapter global object visible in the browser.
  1496. var adapter = {
  1497. browserDetails: browserDetails,
  1498. extractVersion: utils.extractVersion,
  1499. disableLog: utils.disableLog,
  1500. disableWarnings: utils.disableWarnings
  1501. };
  1502.  
  1503. // Uncomment the line below if you want logging to occur, including logging
  1504. // for the switch statement below. Can also be turned on in the browser via
  1505. // adapter.disableLog(false), but then logging from the switch statement below
  1506. // will not appear.
  1507. // require('./utils').disableLog(false);
  1508.  
  1509. // Browser shims.
  1510. var chromeShim = __webpack_require__(12) || null;
  1511. var edgeShim = __webpack_require__(14) || null;
  1512. var firefoxShim = __webpack_require__(18) || null;
  1513. var safariShim = __webpack_require__(20) || null;
  1514.  
  1515. // Shim browser if found.
  1516. switch (browserDetails.browser) {
  1517. case 'chrome':
  1518. if (!chromeShim || !chromeShim.shimPeerConnection ||
  1519. !options.shimChrome) {
  1520. logging('Chrome shim is not included in this adapter release.');
  1521. return adapter;
  1522. }
  1523. logging('adapter.js shimming chrome.');
  1524. // Export to the adapter global object visible in the browser.
  1525. adapter.browserShim = chromeShim;
  1526.  
  1527. chromeShim.shimGetUserMedia(window);
  1528. chromeShim.shimMediaStream(window);
  1529. utils.shimCreateObjectURL(window);
  1530. chromeShim.shimSourceObject(window);
  1531. chromeShim.shimPeerConnection(window);
  1532. chromeShim.shimOnTrack(window);
  1533. chromeShim.shimAddTrack(window);
  1534. chromeShim.shimGetSendersWithDtmf(window);
  1535. break;
  1536. case 'firefox':
  1537. if (!firefoxShim || !firefoxShim.shimPeerConnection ||
  1538. !options.shimFirefox) {
  1539. logging('Firefox shim is not included in this adapter release.');
  1540. return adapter;
  1541. }
  1542. logging('adapter.js shimming firefox.');
  1543. // Export to the adapter global object visible in the browser.
  1544. adapter.browserShim = firefoxShim;
  1545.  
  1546. firefoxShim.shimGetUserMedia(window);
  1547. utils.shimCreateObjectURL(window);
  1548. firefoxShim.shimSourceObject(window);
  1549. firefoxShim.shimPeerConnection(window);
  1550. firefoxShim.shimOnTrack(window);
  1551. break;
  1552. case 'edge':
  1553. if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {
  1554. logging('MS edge shim is not included in this adapter release.');
  1555. return adapter;
  1556. }
  1557. logging('adapter.js shimming edge.');
  1558. // Export to the adapter global object visible in the browser.
  1559. adapter.browserShim = edgeShim;
  1560.  
  1561. edgeShim.shimGetUserMedia(window);
  1562. utils.shimCreateObjectURL(window);
  1563. edgeShim.shimPeerConnection(window);
  1564. edgeShim.shimReplaceTrack(window);
  1565. break;
  1566. case 'safari':
  1567. if (!safariShim || !options.shimSafari) {
  1568. logging('Safari shim is not included in this adapter release.');
  1569. return adapter;
  1570. }
  1571. logging('adapter.js shimming safari.');
  1572. // Export to the adapter global object visible in the browser.
  1573. adapter.browserShim = safariShim;
  1574. // shim window.URL.createObjectURL Safari (technical preview)
  1575. utils.shimCreateObjectURL(window);
  1576. safariShim.shimRTCIceServerUrls(window);
  1577. safariShim.shimCallbacksAPI(window);
  1578. safariShim.shimLocalStreamsAPI(window);
  1579. safariShim.shimRemoteStreamsAPI(window);
  1580. safariShim.shimGetUserMedia(window);
  1581. break;
  1582. default:
  1583. logging('Unsupported browser!');
  1584. break;
  1585. }
  1586.  
  1587. return adapter;
  1588. };
  1589.  
  1590.  
  1591. /***/ }),
  1592. /* 12 */
  1593. /***/ (function(module, exports, __webpack_require__) {
  1594.  
  1595. "use strict";
  1596.  
  1597. /*
  1598. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  1599. *
  1600. * Use of this source code is governed by a BSD-style license
  1601. * that can be found in the LICENSE file in the root of the source
  1602. * tree.
  1603. */
  1604. /* eslint-env node */
  1605.  
  1606. var utils = __webpack_require__(0);
  1607. var logging = utils.log;
  1608.  
  1609. var chromeShim = {
  1610. shimMediaStream: function(window) {
  1611. window.MediaStream = window.MediaStream || window.webkitMediaStream;
  1612. },
  1613.  
  1614. shimOnTrack: function(window) {
  1615. if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in
  1616. window.RTCPeerConnection.prototype)) {
  1617. Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {
  1618. get: function() {
  1619. return this._ontrack;
  1620. },
  1621. set: function(f) {
  1622. var self = this;
  1623. if (this._ontrack) {
  1624. this.removeEventListener('track', this._ontrack);
  1625. this.removeEventListener('addstream', this._ontrackpoly);
  1626. }
  1627. this.addEventListener('track', this._ontrack = f);
  1628. this.addEventListener('addstream', this._ontrackpoly = function(e) {
  1629. // onaddstream does not fire when a track is added to an existing
  1630. // stream. But stream.onaddtrack is implemented so we use that.
  1631. e.stream.addEventListener('addtrack', function(te) {
  1632. var receiver;
  1633. if (window.RTCPeerConnection.prototype.getReceivers) {
  1634. receiver = self.getReceivers().find(function(r) {
  1635. return r.track.id === te.track.id;
  1636. });
  1637. } else {
  1638. receiver = {track: te.track};
  1639. }
  1640.  
  1641. var event = new Event('track');
  1642. event.track = te.track;
  1643. event.receiver = receiver;
  1644. event.streams = [e.stream];
  1645. self.dispatchEvent(event);
  1646. });
  1647. e.stream.getTracks().forEach(function(track) {
  1648. var receiver;
  1649. if (window.RTCPeerConnection.prototype.getReceivers) {
  1650. receiver = self.getReceivers().find(function(r) {
  1651. return r.track.id === track.id;
  1652. });
  1653. } else {
  1654. receiver = {track: track};
  1655. }
  1656. var event = new Event('track');
  1657. event.track = track;
  1658. event.receiver = receiver;
  1659. event.streams = [e.stream];
  1660. this.dispatchEvent(event);
  1661. }.bind(this));
  1662. }.bind(this));
  1663. }
  1664. });
  1665. }
  1666. },
  1667.  
  1668. shimGetSendersWithDtmf: function(window) {
  1669. if (typeof window === 'object' && window.RTCPeerConnection &&
  1670. !('getSenders' in window.RTCPeerConnection.prototype) &&
  1671. 'createDTMFSender' in window.RTCPeerConnection.prototype) {
  1672. var shimSenderWithDtmf = function(pc, track) {
  1673. return {
  1674. track: track,
  1675. get dtmf() {
  1676. if (this._dtmf === undefined) {
  1677. if (track.kind === 'audio') {
  1678. this._dtmf = pc.createDTMFSender(track);
  1679. } else {
  1680. this._dtmf = null;
  1681. }
  1682. }
  1683. return this._dtmf;
  1684. }
  1685. };
  1686. };
  1687.  
  1688. // shim addTrack when getSenders is not available.
  1689. if (!window.RTCPeerConnection.prototype.getSenders) {
  1690. window.RTCPeerConnection.prototype.getSenders = function() {
  1691. return this._senders || [];
  1692. };
  1693. var origAddTrack = window.RTCPeerConnection.prototype.addTrack;
  1694. window.RTCPeerConnection.prototype.addTrack = function(track, stream) {
  1695. var pc = this;
  1696. var sender = origAddTrack.apply(pc, arguments);
  1697. if (!sender) {
  1698. sender = shimSenderWithDtmf(pc, track);
  1699. pc._senders.push(sender);
  1700. }
  1701. return sender;
  1702. };
  1703. }
  1704. var origAddStream = window.RTCPeerConnection.prototype.addStream;
  1705. window.RTCPeerConnection.prototype.addStream = function(stream) {
  1706. var pc = this;
  1707. pc._senders = pc._senders || [];
  1708. origAddStream.apply(pc, [stream]);
  1709. stream.getTracks().forEach(function(track) {
  1710. pc._senders.push(shimSenderWithDtmf(pc, track));
  1711. });
  1712. };
  1713.  
  1714. var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;
  1715. window.RTCPeerConnection.prototype.removeStream = function(stream) {
  1716. var pc = this;
  1717. pc._senders = pc._senders || [];
  1718. origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);
  1719.  
  1720. stream.getTracks().forEach(function(track) {
  1721. var sender = pc._senders.find(function(s) {
  1722. return s.track === track;
  1723. });
  1724. if (sender) {
  1725. pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender
  1726. }
  1727. });
  1728. };
  1729. } else if (typeof window === 'object' && window.RTCPeerConnection &&
  1730. 'getSenders' in window.RTCPeerConnection.prototype &&
  1731. 'createDTMFSender' in window.RTCPeerConnection.prototype &&
  1732. window.RTCRtpSender &&
  1733. !('dtmf' in window.RTCRtpSender.prototype)) {
  1734. var origGetSenders = window.RTCPeerConnection.prototype.getSenders;
  1735. window.RTCPeerConnection.prototype.getSenders = function() {
  1736. var pc = this;
  1737. var senders = origGetSenders.apply(pc, []);
  1738. senders.forEach(function(sender) {
  1739. sender._pc = pc;
  1740. });
  1741. return senders;
  1742. };
  1743.  
  1744. Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {
  1745. get: function() {
  1746. if (this._dtmf === undefined) {
  1747. if (this.track.kind === 'audio') {
  1748. this._dtmf = this._pc.createDTMFSender(this.track);
  1749. } else {
  1750. this._dtmf = null;
  1751. }
  1752. }
  1753. return this._dtmf;
  1754. },
  1755. });
  1756. }
  1757. },
  1758.  
  1759. shimSourceObject: function(window) {
  1760. var URL = window && window.URL;
  1761.  
  1762. if (typeof window === 'object') {
  1763. if (window.HTMLMediaElement &&
  1764. !('srcObject' in window.HTMLMediaElement.prototype)) {
  1765. // Shim the srcObject property, once, when HTMLMediaElement is found.
  1766. Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {
  1767. get: function() {
  1768. return this._srcObject;
  1769. },
  1770. set: function(stream) {
  1771. var self = this;
  1772. // Use _srcObject as a private property for this shim
  1773. this._srcObject = stream;
  1774. if (this.src) {
  1775. URL.revokeObjectURL(this.src);
  1776. }
  1777.  
  1778. if (!stream) {
  1779. this.src = '';
  1780. return undefined;
  1781. }
  1782. this.src = URL.createObjectURL(stream);
  1783. // We need to recreate the blob url when a track is added or
  1784. // removed. Doing it manually since we want to avoid a recursion.
  1785. stream.addEventListener('addtrack', function() {
  1786. if (self.src) {
  1787. URL.revokeObjectURL(self.src);
  1788. }
  1789. self.src = URL.createObjectURL(stream);
  1790. });
  1791. stream.addEventListener('removetrack', function() {
  1792. if (self.src) {
  1793. URL.revokeObjectURL(self.src);
  1794. }
  1795. self.src = URL.createObjectURL(stream);
  1796. });
  1797. }
  1798. });
  1799. }
  1800. }
  1801. },
  1802.  
  1803. shimAddTrack: function(window) {
  1804. // shim addTrack (when getSenders is available)
  1805. if (window.RTCPeerConnection.prototype.addTrack) {
  1806. return;
  1807. }
  1808.  
  1809. // also shim pc.getLocalStreams when addTrack is shimmed
  1810. // to return the original streams.
  1811. var origGetLocalStreams = window.RTCPeerConnection.prototype
  1812. .getLocalStreams;
  1813. window.RTCPeerConnection.prototype.getLocalStreams = function() {
  1814. var self = this;
  1815. var nativeStreams = origGetLocalStreams.apply(this);
  1816. self._reverseStreams = self._reverseStreams || {};
  1817. return nativeStreams.map(function(stream) {
  1818. return self._reverseStreams[stream.id];
  1819. });
  1820. };
  1821.  
  1822. var origAddStream = window.RTCPeerConnection.prototype.addStream;
  1823. window.RTCPeerConnection.prototype.addStream = function(stream) {
  1824. var pc = this;
  1825. pc._streams = pc._streams || {};
  1826. pc._reverseStreams = pc._reverseStreams || {};
  1827.  
  1828. // Add identity mapping for consistency with addTrack.
  1829. // Unless this is being used with a stream from addTrack.
  1830. if (!pc._reverseStreams[stream.id]) {
  1831. pc._streams[stream.id] = stream;
  1832. pc._reverseStreams[stream.id] = stream;
  1833. }
  1834. origAddStream.apply(pc, [stream]);
  1835. };
  1836.  
  1837. var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;
  1838. window.RTCPeerConnection.prototype.removeStream = function(stream) {
  1839. var pc = this;
  1840. pc._streams = pc._streams || {};
  1841. pc._reverseStreams = pc._reverseStreams || {};
  1842.  
  1843. origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);
  1844. delete pc._reverseStreams[(pc._streams[stream.id] ?
  1845. pc._streams[stream.id].id : stream.id)];
  1846. delete pc._streams[stream.id];
  1847. };
  1848.  
  1849. window.RTCPeerConnection.prototype.addTrack = function(track, stream) {
  1850. var pc = this;
  1851. if (pc.signalingState === 'closed') {
  1852. throw new DOMException(
  1853. 'The RTCPeerConnection\'s signalingState is \'closed\'.',
  1854. 'InvalidStateError');
  1855. }
  1856. var streams = [].slice.call(arguments, 1);
  1857. if (streams.length !== 1 ||
  1858. !streams[0].getTracks().find(function(t) {
  1859. return t === track;
  1860. })) {
  1861. // this is not fully correct but all we can manage without
  1862. // [[associated MediaStreams]] internal slot.
  1863. throw new DOMException(
  1864. 'The adapter.js addTrack polyfill only supports a single ' +
  1865. ' stream which is associated with the specified track.',
  1866. 'NotSupportedError');
  1867. }
  1868.  
  1869. var alreadyExists = pc.getSenders().find(function(s) {
  1870. return s.track === track;
  1871. });
  1872. if (alreadyExists) {
  1873. throw new DOMException('Track already exists.',
  1874. 'InvalidAccessError');
  1875. }
  1876.  
  1877. pc._streams = pc._streams || {};
  1878. pc._reverseStreams = pc._reverseStreams || {};
  1879. var oldStream = pc._streams[stream.id];
  1880. if (oldStream) {
  1881. // this is using odd Chrome behaviour, use with caution:
  1882. // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815
  1883. oldStream.addTrack(track);
  1884. pc.dispatchEvent(new Event('negotiationneeded'));
  1885. } else {
  1886. var newStream = new window.MediaStream([track]);
  1887. pc._streams[stream.id] = newStream;
  1888. pc._reverseStreams[newStream.id] = stream;
  1889. pc.addStream(newStream);
  1890. }
  1891. return pc.getSenders().find(function(s) {
  1892. return s.track === track;
  1893. });
  1894. };
  1895. },
  1896.  
  1897. shimPeerConnection: function(window) {
  1898. var browserDetails = utils.detectBrowser(window);
  1899.  
  1900. // The RTCPeerConnection object.
  1901. if (!window.RTCPeerConnection) {
  1902. window.RTCPeerConnection = function(pcConfig, pcConstraints) {
  1903. // Translate iceTransportPolicy to iceTransports,
  1904. // see https://code.google.com/p/webrtc/issues/detail?id=4869
  1905. // this was fixed in M56 along with unprefixing RTCPeerConnection.
  1906. logging('PeerConnection');
  1907. if (pcConfig && pcConfig.iceTransportPolicy) {
  1908. pcConfig.iceTransports = pcConfig.iceTransportPolicy;
  1909. }
  1910.  
  1911. return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);
  1912. };
  1913. window.RTCPeerConnection.prototype =
  1914. window.webkitRTCPeerConnection.prototype;
  1915. // wrap static methods. Currently just generateCertificate.
  1916. if (window.webkitRTCPeerConnection.generateCertificate) {
  1917. Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {
  1918. get: function() {
  1919. return window.webkitRTCPeerConnection.generateCertificate;
  1920. }
  1921. });
  1922. }
  1923. } else {
  1924. // migrate from non-spec RTCIceServer.url to RTCIceServer.urls
  1925. var OrigPeerConnection = window.RTCPeerConnection;
  1926. window.RTCPeerConnection = function(pcConfig, pcConstraints) {
  1927. if (pcConfig && pcConfig.iceServers) {
  1928. var newIceServers = [];
  1929. for (var i = 0; i < pcConfig.iceServers.length; i++) {
  1930. var server = pcConfig.iceServers[i];
  1931. if (!server.hasOwnProperty('urls') &&
  1932. server.hasOwnProperty('url')) {
  1933. console.warn('RTCIceServer.url is deprecated! Use urls instead.');
  1934. server = JSON.parse(JSON.stringify(server));
  1935. server.urls = server.url;
  1936. newIceServers.push(server);
  1937. } else {
  1938. newIceServers.push(pcConfig.iceServers[i]);
  1939. }
  1940. }
  1941. pcConfig.iceServers = newIceServers;
  1942. }
  1943. return new OrigPeerConnection(pcConfig, pcConstraints);
  1944. };
  1945. window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;
  1946. // wrap static methods. Currently just generateCertificate.
  1947. Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {
  1948. get: function() {
  1949. return OrigPeerConnection.generateCertificate;
  1950. }
  1951. });
  1952. }
  1953.  
  1954. var origGetStats = window.RTCPeerConnection.prototype.getStats;
  1955. window.RTCPeerConnection.prototype.getStats = function(selector,
  1956. successCallback, errorCallback) {
  1957. var self = this;
  1958. var args = arguments;
  1959.  
  1960. // If selector is a function then we are in the old style stats so just
  1961. // pass back the original getStats format to avoid breaking old users.
  1962. if (arguments.length > 0 && typeof selector === 'function') {
  1963. return origGetStats.apply(this, arguments);
  1964. }
  1965.  
  1966. // When spec-style getStats is supported, return those when called with
  1967. // either no arguments or the selector argument is null.
  1968. if (origGetStats.length === 0 && (arguments.length === 0 ||
  1969. typeof arguments[0] !== 'function')) {
  1970. return origGetStats.apply(this, []);
  1971. }
  1972.  
  1973. var fixChromeStats_ = function(response) {
  1974. var standardReport = {};
  1975. var reports = response.result();
  1976. reports.forEach(function(report) {
  1977. var standardStats = {
  1978. id: report.id,
  1979. timestamp: report.timestamp,
  1980. type: {
  1981. localcandidate: 'local-candidate',
  1982. remotecandidate: 'remote-candidate'
  1983. }[report.type] || report.type
  1984. };
  1985. report.names().forEach(function(name) {
  1986. standardStats[name] = report.stat(name);
  1987. });
  1988. standardReport[standardStats.id] = standardStats;
  1989. });
  1990.  
  1991. return standardReport;
  1992. };
  1993.  
  1994. // shim getStats with maplike support
  1995. var makeMapStats = function(stats) {
  1996. return new Map(Object.keys(stats).map(function(key) {
  1997. return [key, stats[key]];
  1998. }));
  1999. };
  2000.  
  2001. if (arguments.length >= 2) {
  2002. var successCallbackWrapper_ = function(response) {
  2003. args[1](makeMapStats(fixChromeStats_(response)));
  2004. };
  2005.  
  2006. return origGetStats.apply(this, [successCallbackWrapper_,
  2007. arguments[0]]);
  2008. }
  2009.  
  2010. // promise-support
  2011. return new Promise(function(resolve, reject) {
  2012. origGetStats.apply(self, [
  2013. function(response) {
  2014. resolve(makeMapStats(fixChromeStats_(response)));
  2015. }, reject]);
  2016. }).then(successCallback, errorCallback);
  2017. };
  2018.  
  2019. // add promise support -- natively available in Chrome 51
  2020. if (browserDetails.version < 51) {
  2021. ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']
  2022. .forEach(function(method) {
  2023. var nativeMethod = window.RTCPeerConnection.prototype[method];
  2024. window.RTCPeerConnection.prototype[method] = function() {
  2025. var args = arguments;
  2026. var self = this;
  2027. var promise = new Promise(function(resolve, reject) {
  2028. nativeMethod.apply(self, [args[0], resolve, reject]);
  2029. });
  2030. if (args.length < 2) {
  2031. return promise;
  2032. }
  2033. return promise.then(function() {
  2034. args[1].apply(null, []);
  2035. },
  2036. function(err) {
  2037. if (args.length >= 3) {
  2038. args[2].apply(null, [err]);
  2039. }
  2040. });
  2041. };
  2042. });
  2043. }
  2044.  
  2045. // promise support for createOffer and createAnswer. Available (without
  2046. // bugs) since M52: crbug/619289
  2047. if (browserDetails.version < 52) {
  2048. ['createOffer', 'createAnswer'].forEach(function(method) {
  2049. var nativeMethod = window.RTCPeerConnection.prototype[method];
  2050. window.RTCPeerConnection.prototype[method] = function() {
  2051. var self = this;
  2052. if (arguments.length < 1 || (arguments.length === 1 &&
  2053. typeof arguments[0] === 'object')) {
  2054. var opts = arguments.length === 1 ? arguments[0] : undefined;
  2055. return new Promise(function(resolve, reject) {
  2056. nativeMethod.apply(self, [resolve, reject, opts]);
  2057. });
  2058. }
  2059. return nativeMethod.apply(this, arguments);
  2060. };
  2061. });
  2062. }
  2063.  
  2064. // shim implicit creation of RTCSessionDescription/RTCIceCandidate
  2065. ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']
  2066. .forEach(function(method) {
  2067. var nativeMethod = window.RTCPeerConnection.prototype[method];
  2068. window.RTCPeerConnection.prototype[method] = function() {
  2069. arguments[0] = new ((method === 'addIceCandidate') ?
  2070. window.RTCIceCandidate :
  2071. window.RTCSessionDescription)(arguments[0]);
  2072. return nativeMethod.apply(this, arguments);
  2073. };
  2074. });
  2075.  
  2076. // support for addIceCandidate(null or undefined)
  2077. var nativeAddIceCandidate =
  2078. window.RTCPeerConnection.prototype.addIceCandidate;
  2079. window.RTCPeerConnection.prototype.addIceCandidate = function() {
  2080. if (!arguments[0]) {
  2081. if (arguments[1]) {
  2082. arguments[1].apply(null);
  2083. }
  2084. return Promise.resolve();
  2085. }
  2086. return nativeAddIceCandidate.apply(this, arguments);
  2087. };
  2088. }
  2089. };
  2090.  
  2091.  
  2092. // Expose public methods.
  2093. module.exports = {
  2094. shimMediaStream: chromeShim.shimMediaStream,
  2095. shimOnTrack: chromeShim.shimOnTrack,
  2096. shimAddTrack: chromeShim.shimAddTrack,
  2097. shimGetSendersWithDtmf: chromeShim.shimGetSendersWithDtmf,
  2098. shimSourceObject: chromeShim.shimSourceObject,
  2099. shimPeerConnection: chromeShim.shimPeerConnection,
  2100. shimGetUserMedia: __webpack_require__(13)
  2101. };
  2102.  
  2103.  
  2104. /***/ }),
  2105. /* 13 */
  2106. /***/ (function(module, exports, __webpack_require__) {
  2107.  
  2108. "use strict";
  2109. /*
  2110. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  2111. *
  2112. * Use of this source code is governed by a BSD-style license
  2113. * that can be found in the LICENSE file in the root of the source
  2114. * tree.
  2115. */
  2116. /* eslint-env node */
  2117.  
  2118. var utils = __webpack_require__(0);
  2119. var logging = utils.log;
  2120.  
  2121. // Expose public methods.
  2122. module.exports = function(window) {
  2123. var browserDetails = utils.detectBrowser(window);
  2124. var navigator = window && window.navigator;
  2125.  
  2126. var constraintsToChrome_ = function(c) {
  2127. if (typeof c !== 'object' || c.mandatory || c.optional) {
  2128. return c;
  2129. }
  2130. var cc = {};
  2131. Object.keys(c).forEach(function(key) {
  2132. if (key === 'require' || key === 'advanced' || key === 'mediaSource') {
  2133. return;
  2134. }
  2135. var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};
  2136. if (r.exact !== undefined && typeof r.exact === 'number') {
  2137. r.min = r.max = r.exact;
  2138. }
  2139. var oldname_ = function(prefix, name) {
  2140. if (prefix) {
  2141. return prefix + name.charAt(0).toUpperCase() + name.slice(1);
  2142. }
  2143. return (name === 'deviceId') ? 'sourceId' : name;
  2144. };
  2145. if (r.ideal !== undefined) {
  2146. cc.optional = cc.optional || [];
  2147. var oc = {};
  2148. if (typeof r.ideal === 'number') {
  2149. oc[oldname_('min', key)] = r.ideal;
  2150. cc.optional.push(oc);
  2151. oc = {};
  2152. oc[oldname_('max', key)] = r.ideal;
  2153. cc.optional.push(oc);
  2154. } else {
  2155. oc[oldname_('', key)] = r.ideal;
  2156. cc.optional.push(oc);
  2157. }
  2158. }
  2159. if (r.exact !== undefined && typeof r.exact !== 'number') {
  2160. cc.mandatory = cc.mandatory || {};
  2161. cc.mandatory[oldname_('', key)] = r.exact;
  2162. } else {
  2163. ['min', 'max'].forEach(function(mix) {
  2164. if (r[mix] !== undefined) {
  2165. cc.mandatory = cc.mandatory || {};
  2166. cc.mandatory[oldname_(mix, key)] = r[mix];
  2167. }
  2168. });
  2169. }
  2170. });
  2171. if (c.advanced) {
  2172. cc.optional = (cc.optional || []).concat(c.advanced);
  2173. }
  2174. return cc;
  2175. };
  2176.  
  2177. var shimConstraints_ = function(constraints, func) {
  2178. constraints = JSON.parse(JSON.stringify(constraints));
  2179. if (constraints && typeof constraints.audio === 'object') {
  2180. var remap = function(obj, a, b) {
  2181. if (a in obj && !(b in obj)) {
  2182. obj[b] = obj[a];
  2183. delete obj[a];
  2184. }
  2185. };
  2186. constraints = JSON.parse(JSON.stringify(constraints));
  2187. remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');
  2188. remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');
  2189. constraints.audio = constraintsToChrome_(constraints.audio);
  2190. }
  2191. if (constraints && typeof constraints.video === 'object') {
  2192. // Shim facingMode for mobile & surface pro.
  2193. var face = constraints.video.facingMode;
  2194. face = face && ((typeof face === 'object') ? face : {ideal: face});
  2195. var getSupportedFacingModeLies = browserDetails.version < 61;
  2196.  
  2197. if ((face && (face.exact === 'user' || face.exact === 'environment' ||
  2198. face.ideal === 'user' || face.ideal === 'environment')) &&
  2199. !(navigator.mediaDevices.getSupportedConstraints &&
  2200. navigator.mediaDevices.getSupportedConstraints().facingMode &&
  2201. !getSupportedFacingModeLies)) {
  2202. delete constraints.video.facingMode;
  2203. var matches;
  2204. if (face.exact === 'environment' || face.ideal === 'environment') {
  2205. matches = ['back', 'rear'];
  2206. } else if (face.exact === 'user' || face.ideal === 'user') {
  2207. matches = ['front'];
  2208. }
  2209. if (matches) {
  2210. // Look for matches in label, or use last cam for back (typical).
  2211. return navigator.mediaDevices.enumerateDevices()
  2212. .then(function(devices) {
  2213. devices = devices.filter(function(d) {
  2214. return d.kind === 'videoinput';
  2215. });
  2216. var dev = devices.find(function(d) {
  2217. return matches.some(function(match) {
  2218. return d.label.toLowerCase().indexOf(match) !== -1;
  2219. });
  2220. });
  2221. if (!dev && devices.length && matches.indexOf('back') !== -1) {
  2222. dev = devices[devices.length - 1]; // more likely the back cam
  2223. }
  2224. if (dev) {
  2225. constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :
  2226. {ideal: dev.deviceId};
  2227. }
  2228. constraints.video = constraintsToChrome_(constraints.video);
  2229. logging('chrome: ' + JSON.stringify(constraints));
  2230. return func(constraints);
  2231. });
  2232. }
  2233. }
  2234. constraints.video = constraintsToChrome_(constraints.video);
  2235. }
  2236. logging('chrome: ' + JSON.stringify(constraints));
  2237. return func(constraints);
  2238. };
  2239.  
  2240. var shimError_ = function(e) {
  2241. return {
  2242. name: {
  2243. PermissionDeniedError: 'NotAllowedError',
  2244. InvalidStateError: 'NotReadableError',
  2245. DevicesNotFoundError: 'NotFoundError',
  2246. ConstraintNotSatisfiedError: 'OverconstrainedError',
  2247. TrackStartError: 'NotReadableError',
  2248. MediaDeviceFailedDueToShutdown: 'NotReadableError',
  2249. MediaDeviceKillSwitchOn: 'NotReadableError'
  2250. }[e.name] || e.name,
  2251. message: e.message,
  2252. constraint: e.constraintName,
  2253. toString: function() {
  2254. return this.name + (this.message && ': ') + this.message;
  2255. }
  2256. };
  2257. };
  2258.  
  2259. var getUserMedia_ = function(constraints, onSuccess, onError) {
  2260. shimConstraints_(constraints, function(c) {
  2261. navigator.webkitGetUserMedia(c, onSuccess, function(e) {
  2262. onError(shimError_(e));
  2263. });
  2264. });
  2265. };
  2266.  
  2267. navigator.getUserMedia = getUserMedia_;
  2268.  
  2269. // Returns the result of getUserMedia as a Promise.
  2270. var getUserMediaPromise_ = function(constraints) {
  2271. return new Promise(function(resolve, reject) {
  2272. navigator.getUserMedia(constraints, resolve, reject);
  2273. });
  2274. };
  2275.  
  2276. if (!navigator.mediaDevices) {
  2277. navigator.mediaDevices = {
  2278. getUserMedia: getUserMediaPromise_,
  2279. enumerateDevices: function() {
  2280. return new Promise(function(resolve) {
  2281. var kinds = {audio: 'audioinput', video: 'videoinput'};
  2282. return window.MediaStreamTrack.getSources(function(devices) {
  2283. resolve(devices.map(function(device) {
  2284. return {label: device.label,
  2285. kind: kinds[device.kind],
  2286. deviceId: device.id,
  2287. groupId: ''};
  2288. }));
  2289. });
  2290. });
  2291. },
  2292. getSupportedConstraints: function() {
  2293. return {
  2294. deviceId: true, echoCancellation: true, facingMode: true,
  2295. frameRate: true, height: true, width: true
  2296. };
  2297. }
  2298. };
  2299. }
  2300.  
  2301. // A shim for getUserMedia method on the mediaDevices object.
  2302. // TODO(KaptenJansson) remove once implemented in Chrome stable.
  2303. if (!navigator.mediaDevices.getUserMedia) {
  2304. navigator.mediaDevices.getUserMedia = function(constraints) {
  2305. return getUserMediaPromise_(constraints);
  2306. };
  2307. } else {
  2308. // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia
  2309. // function which returns a Promise, it does not accept spec-style
  2310. // constraints.
  2311. var origGetUserMedia = navigator.mediaDevices.getUserMedia.
  2312. bind(navigator.mediaDevices);
  2313. navigator.mediaDevices.getUserMedia = function(cs) {
  2314. return shimConstraints_(cs, function(c) {
  2315. return origGetUserMedia(c).then(function(stream) {
  2316. if (c.audio && !stream.getAudioTracks().length ||
  2317. c.video && !stream.getVideoTracks().length) {
  2318. stream.getTracks().forEach(function(track) {
  2319. track.stop();
  2320. });
  2321. throw new DOMException('', 'NotFoundError');
  2322. }
  2323. return stream;
  2324. }, function(e) {
  2325. return Promise.reject(shimError_(e));
  2326. });
  2327. });
  2328. };
  2329. }
  2330.  
  2331. // Dummy devicechange event methods.
  2332. // TODO(KaptenJansson) remove once implemented in Chrome stable.
  2333. if (typeof navigator.mediaDevices.addEventListener === 'undefined') {
  2334. navigator.mediaDevices.addEventListener = function() {
  2335. logging('Dummy mediaDevices.addEventListener called.');
  2336. };
  2337. }
  2338. if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {
  2339. navigator.mediaDevices.removeEventListener = function() {
  2340. logging('Dummy mediaDevices.removeEventListener called.');
  2341. };
  2342. }
  2343. };
  2344.  
  2345.  
  2346. /***/ }),
  2347. /* 14 */
  2348. /***/ (function(module, exports, __webpack_require__) {
  2349.  
  2350. "use strict";
  2351. /*
  2352. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  2353. *
  2354. * Use of this source code is governed by a BSD-style license
  2355. * that can be found in the LICENSE file in the root of the source
  2356. * tree.
  2357. */
  2358. /* eslint-env node */
  2359.  
  2360.  
  2361. var utils = __webpack_require__(0);
  2362. var shimRTCPeerConnection = __webpack_require__(15);
  2363.  
  2364. module.exports = {
  2365. shimGetUserMedia: __webpack_require__(17),
  2366. shimPeerConnection: function(window) {
  2367. var browserDetails = utils.detectBrowser(window);
  2368.  
  2369. if (window.RTCIceGatherer) {
  2370. // ORTC defines an RTCIceCandidate object but no constructor.
  2371. // Not implemented in Edge.
  2372. if (!window.RTCIceCandidate) {
  2373. window.RTCIceCandidate = function(args) {
  2374. return args;
  2375. };
  2376. }
  2377. // ORTC does not have a session description object but
  2378. // other browsers (i.e. Chrome) that will support both PC and ORTC
  2379. // in the future might have this defined already.
  2380. if (!window.RTCSessionDescription) {
  2381. window.RTCSessionDescription = function(args) {
  2382. return args;
  2383. };
  2384. }
  2385. // this adds an additional event listener to MediaStrackTrack that signals
  2386. // when a tracks enabled property was changed. Workaround for a bug in
  2387. // addStream, see below. No longer required in 15025+
  2388. if (browserDetails.version < 15025) {
  2389. var origMSTEnabled = Object.getOwnPropertyDescriptor(
  2390. window.MediaStreamTrack.prototype, 'enabled');
  2391. Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {
  2392. set: function(value) {
  2393. origMSTEnabled.set.call(this, value);
  2394. var ev = new Event('enabled');
  2395. ev.enabled = value;
  2396. this.dispatchEvent(ev);
  2397. }
  2398. });
  2399. }
  2400. }
  2401.  
  2402. // ORTC defines the DTMF sender a bit different.
  2403. // https://github.com/w3c/ortc/issues/714
  2404. if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {
  2405. Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {
  2406. get: function() {
  2407. if (this._dtmf === undefined) {
  2408. if (this.track.kind === 'audio') {
  2409. this._dtmf = new window.RTCDtmfSender(this);
  2410. } else if (this.track.kind === 'video') {
  2411. this._dtmf = null;
  2412. }
  2413. }
  2414. return this._dtmf;
  2415. }
  2416. });
  2417. }
  2418.  
  2419. window.RTCPeerConnection =
  2420. shimRTCPeerConnection(window, browserDetails.version);
  2421. },
  2422. shimReplaceTrack: function(window) {
  2423. // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614
  2424. if (window.RTCRtpSender &&
  2425. !('replaceTrack' in window.RTCRtpSender.prototype)) {
  2426. window.RTCRtpSender.prototype.replaceTrack =
  2427. window.RTCRtpSender.prototype.setTrack;
  2428. }
  2429. }
  2430. };
  2431.  
  2432.  
  2433. /***/ }),
  2434. /* 15 */
  2435. /***/ (function(module, exports, __webpack_require__) {
  2436.  
  2437. "use strict";
  2438. /*
  2439. * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
  2440. *
  2441. * Use of this source code is governed by a BSD-style license
  2442. * that can be found in the LICENSE file in the root of the source
  2443. * tree.
  2444. */
  2445. /* eslint-env node */
  2446.  
  2447.  
  2448. var SDPUtils = __webpack_require__(16);
  2449.  
  2450. // sort tracks such that they follow an a-v-a-v...
  2451. // pattern.
  2452. function sortTracks(tracks) {
  2453. var audioTracks = tracks.filter(function(track) {
  2454. return track.kind === 'audio';
  2455. });
  2456. var videoTracks = tracks.filter(function(track) {
  2457. return track.kind === 'video';
  2458. });
  2459. tracks = [];
  2460. while (audioTracks.length || videoTracks.length) {
  2461. if (audioTracks.length) {
  2462. tracks.push(audioTracks.shift());
  2463. }
  2464. if (videoTracks.length) {
  2465. tracks.push(videoTracks.shift());
  2466. }
  2467. }
  2468. return tracks;
  2469. }
  2470.  
  2471. // Edge does not like
  2472. // 1) stun:
  2473. // 2) turn: that does not have all of turn:host:port?transport=udp
  2474. // 3) turn: with ipv6 addresses
  2475. // 4) turn: occurring muliple times
  2476. function filterIceServers(iceServers, edgeVersion) {
  2477. var hasTurn = false;
  2478. iceServers = JSON.parse(JSON.stringify(iceServers));
  2479. return iceServers.filter(function(server) {
  2480. if (server && (server.urls || server.url)) {
  2481. var urls = server.urls || server.url;
  2482. if (server.url && !server.urls) {
  2483. console.warn('RTCIceServer.url is deprecated! Use urls instead.');
  2484. }
  2485. var isString = typeof urls === 'string';
  2486. if (isString) {
  2487. urls = [urls];
  2488. }
  2489. urls = urls.filter(function(url) {
  2490. var validTurn = url.indexOf('turn:') === 0 &&
  2491. url.indexOf('transport=udp') !== -1 &&
  2492. url.indexOf('turn:[') === -1 &&
  2493. !hasTurn;
  2494.  
  2495. if (validTurn) {
  2496. hasTurn = true;
  2497. return true;
  2498. }
  2499. return url.indexOf('stun:') === 0 && edgeVersion >= 14393;
  2500. });
  2501.  
  2502. delete server.url;
  2503. server.urls = isString ? urls[0] : urls;
  2504. return !!urls.length;
  2505. }
  2506. return false;
  2507. });
  2508. }
  2509.  
  2510. // Determines the intersection of local and remote capabilities.
  2511. function getCommonCapabilities(localCapabilities, remoteCapabilities) {
  2512. var commonCapabilities = {
  2513. codecs: [],
  2514. headerExtensions: [],
  2515. fecMechanisms: []
  2516. };
  2517.  
  2518. var findCodecByPayloadType = function(pt, codecs) {
  2519. pt = parseInt(pt, 10);
  2520. for (var i = 0; i < codecs.length; i++) {
  2521. if (codecs[i].payloadType === pt ||
  2522. codecs[i].preferredPayloadType === pt) {
  2523. return codecs[i];
  2524. }
  2525. }
  2526. };
  2527.  
  2528. var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {
  2529. var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);
  2530. var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);
  2531. return lCodec && rCodec &&
  2532. lCodec.name.toLowerCase() === rCodec.name.toLowerCase();
  2533. };
  2534.  
  2535. localCapabilities.codecs.forEach(function(lCodec) {
  2536. for (var i = 0; i < remoteCapabilities.codecs.length; i++) {
  2537. var rCodec = remoteCapabilities.codecs[i];
  2538. if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&
  2539. lCodec.clockRate === rCodec.clockRate) {
  2540. if (lCodec.name.toLowerCase() === 'rtx' &&
  2541. lCodec.parameters && rCodec.parameters.apt) {
  2542. // for RTX we need to find the local rtx that has a apt
  2543. // which points to the same local codec as the remote one.
  2544. if (!rtxCapabilityMatches(lCodec, rCodec,
  2545. localCapabilities.codecs, remoteCapabilities.codecs)) {
  2546. continue;
  2547. }
  2548. }
  2549. rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy
  2550. // number of channels is the highest common number of channels
  2551. rCodec.numChannels = Math.min(lCodec.numChannels,
  2552. rCodec.numChannels);
  2553. // push rCodec so we reply with offerer payload type
  2554. commonCapabilities.codecs.push(rCodec);
  2555.  
  2556. // determine common feedback mechanisms
  2557. rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {
  2558. for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {
  2559. if (lCodec.rtcpFeedback[j].type === fb.type &&
  2560. lCodec.rtcpFeedback[j].parameter === fb.parameter) {
  2561. return true;
  2562. }
  2563. }
  2564. return false;
  2565. });
  2566. // FIXME: also need to determine .parameters
  2567. // see https://github.com/openpeer/ortc/issues/569
  2568. break;
  2569. }
  2570. }
  2571. });
  2572.  
  2573. localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {
  2574. for (var i = 0; i < remoteCapabilities.headerExtensions.length;
  2575. i++) {
  2576. var rHeaderExtension = remoteCapabilities.headerExtensions[i];
  2577. if (lHeaderExtension.uri === rHeaderExtension.uri) {
  2578. commonCapabilities.headerExtensions.push(rHeaderExtension);
  2579. break;
  2580. }
  2581. }
  2582. });
  2583.  
  2584. // FIXME: fecMechanisms
  2585. return commonCapabilities;
  2586. }
  2587.  
  2588. // is action=setLocalDescription with type allowed in signalingState
  2589. function isActionAllowedInSignalingState(action, type, signalingState) {
  2590. return {
  2591. offer: {
  2592. setLocalDescription: ['stable', 'have-local-offer'],
  2593. setRemoteDescription: ['stable', 'have-remote-offer']
  2594. },
  2595. answer: {
  2596. setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],
  2597. setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']
  2598. }
  2599. }[type][action].indexOf(signalingState) !== -1;
  2600. }
  2601.  
  2602. module.exports = function(window, edgeVersion) {
  2603. var RTCPeerConnection = function(config) {
  2604. var self = this;
  2605.  
  2606. var _eventTarget = document.createDocumentFragment();
  2607. ['addEventListener', 'removeEventListener', 'dispatchEvent']
  2608. .forEach(function(method) {
  2609. self[method] = _eventTarget[method].bind(_eventTarget);
  2610. });
  2611.  
  2612. this.needNegotiation = false;
  2613.  
  2614. this.onicecandidate = null;
  2615. this.onaddstream = null;
  2616. this.ontrack = null;
  2617. this.onremovestream = null;
  2618. this.onsignalingstatechange = null;
  2619. this.oniceconnectionstatechange = null;
  2620. this.onicegatheringstatechange = null;
  2621. this.onnegotiationneeded = null;
  2622. this.ondatachannel = null;
  2623. this.canTrickleIceCandidates = null;
  2624.  
  2625. this.localStreams = [];
  2626. this.remoteStreams = [];
  2627. this.getLocalStreams = function() {
  2628. return self.localStreams;
  2629. };
  2630. this.getRemoteStreams = function() {
  2631. return self.remoteStreams;
  2632. };
  2633.  
  2634. this.localDescription = new window.RTCSessionDescription({
  2635. type: '',
  2636. sdp: ''
  2637. });
  2638. this.remoteDescription = new window.RTCSessionDescription({
  2639. type: '',
  2640. sdp: ''
  2641. });
  2642. this.signalingState = 'stable';
  2643. this.iceConnectionState = 'new';
  2644. this.iceGatheringState = 'new';
  2645.  
  2646. this.iceOptions = {
  2647. gatherPolicy: 'all',
  2648. iceServers: []
  2649. };
  2650. if (config && config.iceTransportPolicy) {
  2651. switch (config.iceTransportPolicy) {
  2652. case 'all':
  2653. case 'relay':
  2654. this.iceOptions.gatherPolicy = config.iceTransportPolicy;
  2655. break;
  2656. default:
  2657. // don't set iceTransportPolicy.
  2658. break;
  2659. }
  2660. }
  2661. this.usingBundle = config && config.bundlePolicy === 'max-bundle';
  2662.  
  2663. if (config && config.iceServers) {
  2664. this.iceOptions.iceServers = filterIceServers(config.iceServers,
  2665. edgeVersion);
  2666. }
  2667. this._config = config || {};
  2668.  
  2669. // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...
  2670. // everything that is needed to describe a SDP m-line.
  2671. this.transceivers = [];
  2672.  
  2673. // since the iceGatherer is currently created in createOffer but we
  2674. // must not emit candidates until after setLocalDescription we buffer
  2675. // them in this array.
  2676. this._localIceCandidatesBuffer = [];
  2677.  
  2678. this._sdpSessionId = SDPUtils.generateSessionId();
  2679. };
  2680.  
  2681. RTCPeerConnection.prototype._emitGatheringStateChange = function() {
  2682. var event = new Event('icegatheringstatechange');
  2683. this.dispatchEvent(event);
  2684. if (this.onicegatheringstatechange !== null) {
  2685. this.onicegatheringstatechange(event);
  2686. }
  2687. };
  2688.  
  2689. RTCPeerConnection.prototype._emitBufferedCandidates = function() {
  2690. var self = this;
  2691. var sections = SDPUtils.splitSections(self.localDescription.sdp);
  2692. // FIXME: need to apply ice candidates in a way which is async but
  2693. // in-order
  2694. this._localIceCandidatesBuffer.forEach(function(event) {
  2695. var end = !event.candidate || Object.keys(event.candidate).length === 0;
  2696. if (end) {
  2697. for (var j = 1; j < sections.length; j++) {
  2698. if (sections[j].indexOf('\r\na=end-of-candidates\r\n') === -1) {
  2699. sections[j] += 'a=end-of-candidates\r\n';
  2700. }
  2701. }
  2702. } else {
  2703. sections[event.candidate.sdpMLineIndex + 1] +=
  2704. 'a=' + event.candidate.candidate + '\r\n';
  2705. }
  2706. self.localDescription.sdp = sections.join('');
  2707. self.dispatchEvent(event);
  2708. if (self.onicecandidate !== null) {
  2709. self.onicecandidate(event);
  2710. }
  2711. if (!event.candidate && self.iceGatheringState !== 'complete') {
  2712. var complete = self.transceivers.every(function(transceiver) {
  2713. return transceiver.iceGatherer &&
  2714. transceiver.iceGatherer.state === 'completed';
  2715. });
  2716. if (complete && self.iceGatheringStateChange !== 'complete') {
  2717. self.iceGatheringState = 'complete';
  2718. self._emitGatheringStateChange();
  2719. }
  2720. }
  2721. });
  2722. this._localIceCandidatesBuffer = [];
  2723. };
  2724.  
  2725. RTCPeerConnection.prototype.getConfiguration = function() {
  2726. return this._config;
  2727. };
  2728.  
  2729. // internal helper to create a transceiver object.
  2730. // (whih is not yet the same as the WebRTC 1.0 transceiver)
  2731. RTCPeerConnection.prototype._createTransceiver = function(kind) {
  2732. var hasBundleTransport = this.transceivers.length > 0;
  2733. var transceiver = {
  2734. track: null,
  2735. iceGatherer: null,
  2736. iceTransport: null,
  2737. dtlsTransport: null,
  2738. localCapabilities: null,
  2739. remoteCapabilities: null,
  2740. rtpSender: null,
  2741. rtpReceiver: null,
  2742. kind: kind,
  2743. mid: null,
  2744. sendEncodingParameters: null,
  2745. recvEncodingParameters: null,
  2746. stream: null,
  2747. wantReceive: true
  2748. };
  2749. if (this.usingBundle && hasBundleTransport) {
  2750. transceiver.iceTransport = this.transceivers[0].iceTransport;
  2751. transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;
  2752. } else {
  2753. var transports = this._createIceAndDtlsTransports();
  2754. transceiver.iceTransport = transports.iceTransport;
  2755. transceiver.dtlsTransport = transports.dtlsTransport;
  2756. }
  2757. this.transceivers.push(transceiver);
  2758. return transceiver;
  2759. };
  2760.  
  2761. RTCPeerConnection.prototype.addTrack = function(track, stream) {
  2762. var transceiver;
  2763. for (var i = 0; i < this.transceivers.length; i++) {
  2764. if (!this.transceivers[i].track &&
  2765. this.transceivers[i].kind === track.kind) {
  2766. transceiver = this.transceivers[i];
  2767. }
  2768. }
  2769. if (!transceiver) {
  2770. transceiver = this._createTransceiver(track.kind);
  2771. }
  2772.  
  2773. transceiver.track = track;
  2774. transceiver.stream = stream;
  2775. transceiver.rtpSender = new window.RTCRtpSender(track,
  2776. transceiver.dtlsTransport);
  2777.  
  2778. this._maybeFireNegotiationNeeded();
  2779. return transceiver.rtpSender;
  2780. };
  2781.  
  2782. RTCPeerConnection.prototype.addStream = function(stream) {
  2783. var self = this;
  2784. if (edgeVersion >= 15025) {
  2785. this.localStreams.push(stream);
  2786. stream.getTracks().forEach(function(track) {
  2787. self.addTrack(track, stream);
  2788. });
  2789. } else {
  2790. // Clone is necessary for local demos mostly, attaching directly
  2791. // to two different senders does not work (build 10547).
  2792. // Fixed in 15025 (or earlier)
  2793. var clonedStream = stream.clone();
  2794. stream.getTracks().forEach(function(track, idx) {
  2795. var clonedTrack = clonedStream.getTracks()[idx];
  2796. track.addEventListener('enabled', function(event) {
  2797. clonedTrack.enabled = event.enabled;
  2798. });
  2799. });
  2800. clonedStream.getTracks().forEach(function(track) {
  2801. self.addTrack(track, clonedStream);
  2802. });
  2803. this.localStreams.push(clonedStream);
  2804. }
  2805. this._maybeFireNegotiationNeeded();
  2806. };
  2807.  
  2808. RTCPeerConnection.prototype.removeStream = function(stream) {
  2809. var idx = this.localStreams.indexOf(stream);
  2810. if (idx > -1) {
  2811. this.localStreams.splice(idx, 1);
  2812. this._maybeFireNegotiationNeeded();
  2813. }
  2814. };
  2815.  
  2816. RTCPeerConnection.prototype.getSenders = function() {
  2817. return this.transceivers.filter(function(transceiver) {
  2818. return !!transceiver.rtpSender;
  2819. })
  2820. .map(function(transceiver) {
  2821. return transceiver.rtpSender;
  2822. });
  2823. };
  2824.  
  2825. RTCPeerConnection.prototype.getReceivers = function() {
  2826. return this.transceivers.filter(function(transceiver) {
  2827. return !!transceiver.rtpReceiver;
  2828. })
  2829. .map(function(transceiver) {
  2830. return transceiver.rtpReceiver;
  2831. });
  2832. };
  2833.  
  2834. // Create ICE gatherer and hook it up.
  2835. RTCPeerConnection.prototype._createIceGatherer = function(mid,
  2836. sdpMLineIndex) {
  2837. var self = this;
  2838. var iceGatherer = new window.RTCIceGatherer(self.iceOptions);
  2839. iceGatherer.onlocalcandidate = function(evt) {
  2840. var event = new Event('icecandidate');
  2841. event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};
  2842.  
  2843. var cand = evt.candidate;
  2844. var end = !cand || Object.keys(cand).length === 0;
  2845. // Edge emits an empty object for RTCIceCandidateComplete‥
  2846. if (end) {
  2847. // polyfill since RTCIceGatherer.state is not implemented in
  2848. // Edge 10547 yet.
  2849. if (iceGatherer.state === undefined) {
  2850. iceGatherer.state = 'completed';
  2851. }
  2852. } else {
  2853. // RTCIceCandidate doesn't have a component, needs to be added
  2854. cand.component = 1;
  2855. event.candidate.candidate = SDPUtils.writeCandidate(cand);
  2856. }
  2857.  
  2858. // update local description.
  2859. var sections = SDPUtils.splitSections(self.localDescription.sdp);
  2860. if (!end) {
  2861. sections[event.candidate.sdpMLineIndex + 1] +=
  2862. 'a=' + event.candidate.candidate + '\r\n';
  2863. } else {
  2864. sections[event.candidate.sdpMLineIndex + 1] +=
  2865. 'a=end-of-candidates\r\n';
  2866. }
  2867. self.localDescription.sdp = sections.join('');
  2868. var transceivers = self._pendingOffer ? self._pendingOffer :
  2869. self.transceivers;
  2870. var complete = transceivers.every(function(transceiver) {
  2871. return transceiver.iceGatherer &&
  2872. transceiver.iceGatherer.state === 'completed';
  2873. });
  2874.  
  2875. // Emit candidate if localDescription is set.
  2876. // Also emits null candidate when all gatherers are complete.
  2877. switch (self.iceGatheringState) {
  2878. case 'new':
  2879. if (!end) {
  2880. self._localIceCandidatesBuffer.push(event);
  2881. }
  2882. if (end && complete) {
  2883. self._localIceCandidatesBuffer.push(
  2884. new Event('icecandidate'));
  2885. }
  2886. break;
  2887. case 'gathering':
  2888. self._emitBufferedCandidates();
  2889. if (!end) {
  2890. self.dispatchEvent(event);
  2891. if (self.onicecandidate !== null) {
  2892. self.onicecandidate(event);
  2893. }
  2894. }
  2895. if (complete) {
  2896. self.dispatchEvent(new Event('icecandidate'));
  2897. if (self.onicecandidate !== null) {
  2898. self.onicecandidate(new Event('icecandidate'));
  2899. }
  2900. self.iceGatheringState = 'complete';
  2901. self._emitGatheringStateChange();
  2902. }
  2903. break;
  2904. case 'complete':
  2905. // should not happen... currently!
  2906. break;
  2907. default: // no-op.
  2908. break;
  2909. }
  2910. };
  2911. return iceGatherer;
  2912. };
  2913.  
  2914. // Create ICE transport and DTLS transport.
  2915. RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {
  2916. var self = this;
  2917. var iceTransport = new window.RTCIceTransport(null);
  2918. iceTransport.onicestatechange = function() {
  2919. self._updateConnectionState();
  2920. };
  2921.  
  2922. var dtlsTransport = new window.RTCDtlsTransport(iceTransport);
  2923. dtlsTransport.ondtlsstatechange = function() {
  2924. self._updateConnectionState();
  2925. };
  2926. dtlsTransport.onerror = function() {
  2927. // onerror does not set state to failed by itself.
  2928. Object.defineProperty(dtlsTransport, 'state',
  2929. {value: 'failed', writable: true});
  2930. self._updateConnectionState();
  2931. };
  2932.  
  2933. return {
  2934. iceTransport: iceTransport,
  2935. dtlsTransport: dtlsTransport
  2936. };
  2937. };
  2938.  
  2939. // Destroy ICE gatherer, ICE transport and DTLS transport.
  2940. // Without triggering the callbacks.
  2941. RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(
  2942. sdpMLineIndex) {
  2943. var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;
  2944. if (iceGatherer) {
  2945. delete iceGatherer.onlocalcandidate;
  2946. delete this.transceivers[sdpMLineIndex].iceGatherer;
  2947. }
  2948. var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;
  2949. if (iceTransport) {
  2950. delete iceTransport.onicestatechange;
  2951. delete this.transceivers[sdpMLineIndex].iceTransport;
  2952. }
  2953. var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;
  2954. if (dtlsTransport) {
  2955. delete dtlsTransport.ondtlsstatechange;
  2956. delete dtlsTransport.onerror;
  2957. delete this.transceivers[sdpMLineIndex].dtlsTransport;
  2958. }
  2959. };
  2960.  
  2961. // Start the RTP Sender and Receiver for a transceiver.
  2962. RTCPeerConnection.prototype._transceive = function(transceiver,
  2963. send, recv) {
  2964. var params = getCommonCapabilities(transceiver.localCapabilities,
  2965. transceiver.remoteCapabilities);
  2966. if (send && transceiver.rtpSender) {
  2967. params.encodings = transceiver.sendEncodingParameters;
  2968. params.rtcp = {
  2969. cname: SDPUtils.localCName,
  2970. compound: transceiver.rtcpParameters.compound
  2971. };
  2972. if (transceiver.recvEncodingParameters.length) {
  2973. params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;
  2974. }
  2975. transceiver.rtpSender.send(params);
  2976. }
  2977. if (recv && transceiver.rtpReceiver) {
  2978. // remove RTX field in Edge 14942
  2979. if (transceiver.kind === 'video'
  2980. && transceiver.recvEncodingParameters
  2981. && edgeVersion < 15019) {
  2982. transceiver.recvEncodingParameters.forEach(function(p) {
  2983. delete p.rtx;
  2984. });
  2985. }
  2986. params.encodings = transceiver.recvEncodingParameters;
  2987. params.rtcp = {
  2988. cname: transceiver.rtcpParameters.cname,
  2989. compound: transceiver.rtcpParameters.compound
  2990. };
  2991. if (transceiver.sendEncodingParameters.length) {
  2992. params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;
  2993. }
  2994. transceiver.rtpReceiver.receive(params);
  2995. }
  2996. };
  2997.  
  2998. RTCPeerConnection.prototype.setLocalDescription = function(description) {
  2999. var self = this;
  3000.  
  3001. if (!isActionAllowedInSignalingState('setLocalDescription',
  3002. description.type, this.signalingState)) {
  3003. var e = new Error('Can not set local ' + description.type +
  3004. ' in state ' + this.signalingState);
  3005. e.name = 'InvalidStateError';
  3006. if (arguments.length > 2 && typeof arguments[2] === 'function') {
  3007. window.setTimeout(arguments[2], 0, e);
  3008. }
  3009. return Promise.reject(e);
  3010. }
  3011.  
  3012. var sections;
  3013. var sessionpart;
  3014. if (description.type === 'offer') {
  3015. // FIXME: What was the purpose of this empty if statement?
  3016. // if (!this._pendingOffer) {
  3017. // } else {
  3018. if (this._pendingOffer) {
  3019. // VERY limited support for SDP munging. Limited to:
  3020. // * changing the order of codecs
  3021. sections = SDPUtils.splitSections(description.sdp);
  3022. sessionpart = sections.shift();
  3023. sections.forEach(function(mediaSection, sdpMLineIndex) {
  3024. var caps = SDPUtils.parseRtpParameters(mediaSection);
  3025. self._pendingOffer[sdpMLineIndex].localCapabilities = caps;
  3026. });
  3027. this.transceivers = this._pendingOffer;
  3028. delete this._pendingOffer;
  3029. }
  3030. } else if (description.type === 'answer') {
  3031. sections = SDPUtils.splitSections(self.remoteDescription.sdp);
  3032. sessionpart = sections.shift();
  3033. var isIceLite = SDPUtils.matchPrefix(sessionpart,
  3034. 'a=ice-lite').length > 0;
  3035. sections.forEach(function(mediaSection, sdpMLineIndex) {
  3036. var transceiver = self.transceivers[sdpMLineIndex];
  3037. var iceGatherer = transceiver.iceGatherer;
  3038. var iceTransport = transceiver.iceTransport;
  3039. var dtlsTransport = transceiver.dtlsTransport;
  3040. var localCapabilities = transceiver.localCapabilities;
  3041. var remoteCapabilities = transceiver.remoteCapabilities;
  3042.  
  3043. var rejected = SDPUtils.isRejected(mediaSection);
  3044.  
  3045. if (!rejected && !transceiver.isDatachannel) {
  3046. var remoteIceParameters = SDPUtils.getIceParameters(
  3047. mediaSection, sessionpart);
  3048. var remoteDtlsParameters = SDPUtils.getDtlsParameters(
  3049. mediaSection, sessionpart);
  3050. if (isIceLite) {
  3051. remoteDtlsParameters.role = 'server';
  3052. }
  3053.  
  3054. if (!self.usingBundle || sdpMLineIndex === 0) {
  3055. iceTransport.start(iceGatherer, remoteIceParameters,
  3056. isIceLite ? 'controlling' : 'controlled');
  3057. dtlsTransport.start(remoteDtlsParameters);
  3058. }
  3059.  
  3060. // Calculate intersection of capabilities.
  3061. var params = getCommonCapabilities(localCapabilities,
  3062. remoteCapabilities);
  3063.  
  3064. // Start the RTCRtpSender. The RTCRtpReceiver for this
  3065. // transceiver has already been started in setRemoteDescription.
  3066. self._transceive(transceiver,
  3067. params.codecs.length > 0,
  3068. false);
  3069. }
  3070. });
  3071. }
  3072.  
  3073. this.localDescription = {
  3074. type: description.type,
  3075. sdp: description.sdp
  3076. };
  3077. switch (description.type) {
  3078. case 'offer':
  3079. this._updateSignalingState('have-local-offer');
  3080. break;
  3081. case 'answer':
  3082. this._updateSignalingState('stable');
  3083. break;
  3084. default:
  3085. throw new TypeError('unsupported type "' + description.type +
  3086. '"');
  3087. }
  3088.  
  3089. // If a success callback was provided, emit ICE candidates after it
  3090. // has been executed. Otherwise, emit callback after the Promise is
  3091. // resolved.
  3092. var hasCallback = arguments.length > 1 &&
  3093. typeof arguments[1] === 'function';
  3094. if (hasCallback) {
  3095. var cb = arguments[1];
  3096. window.setTimeout(function() {
  3097. cb();
  3098. if (self.iceGatheringState === 'new') {
  3099. self.iceGatheringState = 'gathering';
  3100. self._emitGatheringStateChange();
  3101. }
  3102. self._emitBufferedCandidates();
  3103. }, 0);
  3104. }
  3105. var p = Promise.resolve();
  3106. p.then(function() {
  3107. if (!hasCallback) {
  3108. if (self.iceGatheringState === 'new') {
  3109. self.iceGatheringState = 'gathering';
  3110. self._emitGatheringStateChange();
  3111. }
  3112. // Usually candidates will be emitted earlier.
  3113. window.setTimeout(self._emitBufferedCandidates.bind(self), 500);
  3114. }
  3115. });
  3116. return p;
  3117. };
  3118.  
  3119. RTCPeerConnection.prototype.setRemoteDescription = function(description) {
  3120. var self = this;
  3121.  
  3122. if (!isActionAllowedInSignalingState('setRemoteDescription',
  3123. description.type, this.signalingState)) {
  3124. var e = new Error('Can not set remote ' + description.type +
  3125. ' in state ' + this.signalingState);
  3126. e.name = 'InvalidStateError';
  3127. if (arguments.length > 2 && typeof arguments[2] === 'function') {
  3128. window.setTimeout(arguments[2], 0, e);
  3129. }
  3130. return Promise.reject(e);
  3131. }
  3132.  
  3133. var streams = {};
  3134. var receiverList = [];
  3135. var sections = SDPUtils.splitSections(description.sdp);
  3136. var sessionpart = sections.shift();
  3137. var isIceLite = SDPUtils.matchPrefix(sessionpart,
  3138. 'a=ice-lite').length > 0;
  3139. var usingBundle = SDPUtils.matchPrefix(sessionpart,
  3140. 'a=group:BUNDLE ').length > 0;
  3141. this.usingBundle = usingBundle;
  3142. var iceOptions = SDPUtils.matchPrefix(sessionpart,
  3143. 'a=ice-options:')[0];
  3144. if (iceOptions) {
  3145. this.canTrickleIceCandidates = iceOptions.substr(14).split(' ')
  3146. .indexOf('trickle') >= 0;
  3147. } else {
  3148. this.canTrickleIceCandidates = false;
  3149. }
  3150.  
  3151. sections.forEach(function(mediaSection, sdpMLineIndex) {
  3152. var lines = SDPUtils.splitLines(mediaSection);
  3153. var kind = SDPUtils.getKind(mediaSection);
  3154. var rejected = SDPUtils.isRejected(mediaSection);
  3155. var protocol = lines[0].substr(2).split(' ')[2];
  3156.  
  3157. var direction = SDPUtils.getDirection(mediaSection, sessionpart);
  3158. var remoteMsid = SDPUtils.parseMsid(mediaSection);
  3159.  
  3160. var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();
  3161.  
  3162. // Reject datachannels which are not implemented yet.
  3163. if (kind === 'application' && protocol === 'DTLS/SCTP') {
  3164. self.transceivers[sdpMLineIndex] = {
  3165. mid: mid,
  3166. isDatachannel: true
  3167. };
  3168. return;
  3169. }
  3170.  
  3171. var transceiver;
  3172. var iceGatherer;
  3173. var iceTransport;
  3174. var dtlsTransport;
  3175. var rtpReceiver;
  3176. var sendEncodingParameters;
  3177. var recvEncodingParameters;
  3178. var localCapabilities;
  3179.  
  3180. var track;
  3181. // FIXME: ensure the mediaSection has rtcp-mux set.
  3182. var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);
  3183. var remoteIceParameters;
  3184. var remoteDtlsParameters;
  3185. if (!rejected) {
  3186. remoteIceParameters = SDPUtils.getIceParameters(mediaSection,
  3187. sessionpart);
  3188. remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,
  3189. sessionpart);
  3190. remoteDtlsParameters.role = 'client';
  3191. }
  3192. recvEncodingParameters =
  3193. SDPUtils.parseRtpEncodingParameters(mediaSection);
  3194.  
  3195. var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);
  3196.  
  3197. var isComplete = SDPUtils.matchPrefix(mediaSection,
  3198. 'a=end-of-candidates', sessionpart).length > 0;
  3199. var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')
  3200. .map(function(cand) {
  3201. return SDPUtils.parseCandidate(cand);
  3202. })
  3203. .filter(function(cand) {
  3204. return cand.component === '1' || cand.component === 1;
  3205. });
  3206.  
  3207. // Check if we can use BUNDLE and dispose transports.
  3208. if ((description.type === 'offer' || description.type === 'answer') &&
  3209. !rejected && usingBundle && sdpMLineIndex > 0 &&
  3210. self.transceivers[sdpMLineIndex]) {
  3211. self._disposeIceAndDtlsTransports(sdpMLineIndex);
  3212. self.transceivers[sdpMLineIndex].iceGatherer =
  3213. self.transceivers[0].iceGatherer;
  3214. self.transceivers[sdpMLineIndex].iceTransport =
  3215. self.transceivers[0].iceTransport;
  3216. self.transceivers[sdpMLineIndex].dtlsTransport =
  3217. self.transceivers[0].dtlsTransport;
  3218. if (self.transceivers[sdpMLineIndex].rtpSender) {
  3219. self.transceivers[sdpMLineIndex].rtpSender.setTransport(
  3220. self.transceivers[0].dtlsTransport);
  3221. }
  3222. if (self.transceivers[sdpMLineIndex].rtpReceiver) {
  3223. self.transceivers[sdpMLineIndex].rtpReceiver.setTransport(
  3224. self.transceivers[0].dtlsTransport);
  3225. }
  3226. }
  3227. if (description.type === 'offer' && !rejected) {
  3228. transceiver = self.transceivers[sdpMLineIndex] ||
  3229. self._createTransceiver(kind);
  3230. transceiver.mid = mid;
  3231.  
  3232. if (!transceiver.iceGatherer) {
  3233. transceiver.iceGatherer = usingBundle && sdpMLineIndex > 0 ?
  3234. self.transceivers[0].iceGatherer :
  3235. self._createIceGatherer(mid, sdpMLineIndex);
  3236. }
  3237.  
  3238. if (isComplete && cands.length &&
  3239. (!usingBundle || sdpMLineIndex === 0)) {
  3240. transceiver.iceTransport.setRemoteCandidates(cands);
  3241. }
  3242.  
  3243. localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);
  3244.  
  3245. // filter RTX until additional stuff needed for RTX is implemented
  3246. // in adapter.js
  3247. if (edgeVersion < 15019) {
  3248. localCapabilities.codecs = localCapabilities.codecs.filter(
  3249. function(codec) {
  3250. return codec.name !== 'rtx';
  3251. });
  3252. }
  3253.  
  3254. sendEncodingParameters = [{
  3255. ssrc: (2 * sdpMLineIndex + 2) * 1001
  3256. }];
  3257.  
  3258. if (direction === 'sendrecv' || direction === 'sendonly') {
  3259. rtpReceiver = new window.RTCRtpReceiver(transceiver.dtlsTransport,
  3260. kind);
  3261.  
  3262. track = rtpReceiver.track;
  3263. // FIXME: does not work with Plan B.
  3264. if (remoteMsid) {
  3265. if (!streams[remoteMsid.stream]) {
  3266. streams[remoteMsid.stream] = new window.MediaStream();
  3267. Object.defineProperty(streams[remoteMsid.stream], 'id', {
  3268. get: function() {
  3269. return remoteMsid.stream;
  3270. }
  3271. });
  3272. }
  3273. Object.defineProperty(track, 'id', {
  3274. get: function() {
  3275. return remoteMsid.track;
  3276. }
  3277. });
  3278. streams[remoteMsid.stream].addTrack(track);
  3279. receiverList.push([track, rtpReceiver,
  3280. streams[remoteMsid.stream]]);
  3281. } else {
  3282. if (!streams.default) {
  3283. streams.default = new window.MediaStream();
  3284. }
  3285. streams.default.addTrack(track);
  3286. receiverList.push([track, rtpReceiver, streams.default]);
  3287. }
  3288. }
  3289.  
  3290. transceiver.localCapabilities = localCapabilities;
  3291. transceiver.remoteCapabilities = remoteCapabilities;
  3292. transceiver.rtpReceiver = rtpReceiver;
  3293. transceiver.rtcpParameters = rtcpParameters;
  3294. transceiver.sendEncodingParameters = sendEncodingParameters;
  3295. transceiver.recvEncodingParameters = recvEncodingParameters;
  3296.  
  3297. // Start the RTCRtpReceiver now. The RTPSender is started in
  3298. // setLocalDescription.
  3299. self._transceive(self.transceivers[sdpMLineIndex],
  3300. false,
  3301. direction === 'sendrecv' || direction === 'sendonly');
  3302. } else if (description.type === 'answer' && !rejected) {
  3303. transceiver = self.transceivers[sdpMLineIndex];
  3304. iceGatherer = transceiver.iceGatherer;
  3305. iceTransport = transceiver.iceTransport;
  3306. dtlsTransport = transceiver.dtlsTransport;
  3307. rtpReceiver = transceiver.rtpReceiver;
  3308. sendEncodingParameters = transceiver.sendEncodingParameters;
  3309. localCapabilities = transceiver.localCapabilities;
  3310.  
  3311. self.transceivers[sdpMLineIndex].recvEncodingParameters =
  3312. recvEncodingParameters;
  3313. self.transceivers[sdpMLineIndex].remoteCapabilities =
  3314. remoteCapabilities;
  3315. self.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;
  3316.  
  3317. if (!usingBundle || sdpMLineIndex === 0) {
  3318. if ((isIceLite || isComplete) && cands.length) {
  3319. iceTransport.setRemoteCandidates(cands);
  3320. }
  3321. iceTransport.start(iceGatherer, remoteIceParameters,
  3322. 'controlling');
  3323. dtlsTransport.start(remoteDtlsParameters);
  3324. }
  3325.  
  3326. self._transceive(transceiver,
  3327. direction === 'sendrecv' || direction === 'recvonly',
  3328. direction === 'sendrecv' || direction === 'sendonly');
  3329.  
  3330. if (rtpReceiver &&
  3331. (direction === 'sendrecv' || direction === 'sendonly')) {
  3332. track = rtpReceiver.track;
  3333. if (remoteMsid) {
  3334. if (!streams[remoteMsid.stream]) {
  3335. streams[remoteMsid.stream] = new window.MediaStream();
  3336. }
  3337. streams[remoteMsid.stream].addTrack(track);
  3338. receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);
  3339. } else {
  3340. if (!streams.default) {
  3341. streams.default = new window.MediaStream();
  3342. }
  3343. streams.default.addTrack(track);
  3344. receiverList.push([track, rtpReceiver, streams.default]);
  3345. }
  3346. } else {
  3347. // FIXME: actually the receiver should be created later.
  3348. delete transceiver.rtpReceiver;
  3349. }
  3350. }
  3351. });
  3352.  
  3353. this.remoteDescription = {
  3354. type: description.type,
  3355. sdp: description.sdp
  3356. };
  3357. switch (description.type) {
  3358. case 'offer':
  3359. this._updateSignalingState('have-remote-offer');
  3360. break;
  3361. case 'answer':
  3362. this._updateSignalingState('stable');
  3363. break;
  3364. default:
  3365. throw new TypeError('unsupported type "' + description.type +
  3366. '"');
  3367. }
  3368. Object.keys(streams).forEach(function(sid) {
  3369. var stream = streams[sid];
  3370. if (stream.getTracks().length) {
  3371. self.remoteStreams.push(stream);
  3372. var event = new Event('addstream');
  3373. event.stream = stream;
  3374. self.dispatchEvent(event);
  3375. if (self.onaddstream !== null) {
  3376. window.setTimeout(function() {
  3377. self.onaddstream(event);
  3378. }, 0);
  3379. }
  3380.  
  3381. receiverList.forEach(function(item) {
  3382. var track = item[0];
  3383. var receiver = item[1];
  3384. if (stream.id !== item[2].id) {
  3385. return;
  3386. }
  3387. var trackEvent = new Event('track');
  3388. trackEvent.track = track;
  3389. trackEvent.receiver = receiver;
  3390. trackEvent.streams = [stream];
  3391. self.dispatchEvent(trackEvent);
  3392. if (self.ontrack !== null) {
  3393. window.setTimeout(function() {
  3394. self.ontrack(trackEvent);
  3395. }, 0);
  3396. }
  3397. });
  3398. }
  3399. });
  3400.  
  3401. // check whether addIceCandidate({}) was called within four seconds after
  3402. // setRemoteDescription.
  3403. window.setTimeout(function() {
  3404. if (!(self && self.transceivers)) {
  3405. return;
  3406. }
  3407. self.transceivers.forEach(function(transceiver) {
  3408. if (transceiver.iceTransport &&
  3409. transceiver.iceTransport.state === 'new' &&
  3410. transceiver.iceTransport.getRemoteCandidates().length > 0) {
  3411. console.warn('Timeout for addRemoteCandidate. Consider sending ' +
  3412. 'an end-of-candidates notification');
  3413. transceiver.iceTransport.addRemoteCandidate({});
  3414. }
  3415. });
  3416. }, 4000);
  3417.  
  3418. if (arguments.length > 1 && typeof arguments[1] === 'function') {
  3419. window.setTimeout(arguments[1], 0);
  3420. }
  3421. return Promise.resolve();
  3422. };
  3423.  
  3424. RTCPeerConnection.prototype.close = function() {
  3425. this.transceivers.forEach(function(transceiver) {
  3426. /* not yet
  3427. if (transceiver.iceGatherer) {
  3428. transceiver.iceGatherer.close();
  3429. }
  3430. */
  3431. if (transceiver.iceTransport) {
  3432. transceiver.iceTransport.stop();
  3433. }
  3434. if (transceiver.dtlsTransport) {
  3435. transceiver.dtlsTransport.stop();
  3436. }
  3437. if (transceiver.rtpSender) {
  3438. transceiver.rtpSender.stop();
  3439. }
  3440. if (transceiver.rtpReceiver) {
  3441. transceiver.rtpReceiver.stop();
  3442. }
  3443. });
  3444. // FIXME: clean up tracks, local streams, remote streams, etc
  3445. this._updateSignalingState('closed');
  3446. };
  3447.  
  3448. // Update the signaling state.
  3449. RTCPeerConnection.prototype._updateSignalingState = function(newState) {
  3450. this.signalingState = newState;
  3451. var event = new Event('signalingstatechange');
  3452. this.dispatchEvent(event);
  3453. if (this.onsignalingstatechange !== null) {
  3454. this.onsignalingstatechange(event);
  3455. }
  3456. };
  3457.  
  3458. // Determine whether to fire the negotiationneeded event.
  3459. RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {
  3460. var self = this;
  3461. if (this.signalingState !== 'stable' || this.needNegotiation === true) {
  3462. return;
  3463. }
  3464. this.needNegotiation = true;
  3465. window.setTimeout(function() {
  3466. if (self.needNegotiation === false) {
  3467. return;
  3468. }
  3469. self.needNegotiation = false;
  3470. var event = new Event('negotiationneeded');
  3471. self.dispatchEvent(event);
  3472. if (self.onnegotiationneeded !== null) {
  3473. self.onnegotiationneeded(event);
  3474. }
  3475. }, 0);
  3476. };
  3477.  
  3478. // Update the connection state.
  3479. RTCPeerConnection.prototype._updateConnectionState = function() {
  3480. var self = this;
  3481. var newState;
  3482. var states = {
  3483. 'new': 0,
  3484. closed: 0,
  3485. connecting: 0,
  3486. checking: 0,
  3487. connected: 0,
  3488. completed: 0,
  3489. disconnected: 0,
  3490. failed: 0
  3491. };
  3492. this.transceivers.forEach(function(transceiver) {
  3493. states[transceiver.iceTransport.state]++;
  3494. states[transceiver.dtlsTransport.state]++;
  3495. });
  3496. // ICETransport.completed and connected are the same for this purpose.
  3497. states.connected += states.completed;
  3498.  
  3499. newState = 'new';
  3500. if (states.failed > 0) {
  3501. newState = 'failed';
  3502. } else if (states.connecting > 0 || states.checking > 0) {
  3503. newState = 'connecting';
  3504. } else if (states.disconnected > 0) {
  3505. newState = 'disconnected';
  3506. } else if (states.new > 0) {
  3507. newState = 'new';
  3508. } else if (states.connected > 0 || states.completed > 0) {
  3509. newState = 'connected';
  3510. }
  3511.  
  3512. if (newState !== self.iceConnectionState) {
  3513. self.iceConnectionState = newState;
  3514. var event = new Event('iceconnectionstatechange');
  3515. this.dispatchEvent(event);
  3516. if (this.oniceconnectionstatechange !== null) {
  3517. this.oniceconnectionstatechange(event);
  3518. }
  3519. }
  3520. };
  3521.  
  3522. RTCPeerConnection.prototype.createOffer = function() {
  3523. var self = this;
  3524. if (this._pendingOffer) {
  3525. throw new Error('createOffer called while there is a pending offer.');
  3526. }
  3527. var offerOptions;
  3528. if (arguments.length === 1 && typeof arguments[0] !== 'function') {
  3529. offerOptions = arguments[0];
  3530. } else if (arguments.length === 3) {
  3531. offerOptions = arguments[2];
  3532. }
  3533.  
  3534. var numAudioTracks = this.transceivers.filter(function(t) {
  3535. return t.kind === 'audio';
  3536. }).length;
  3537. var numVideoTracks = this.transceivers.filter(function(t) {
  3538. return t.kind === 'video';
  3539. }).length;
  3540.  
  3541. // Determine number of audio and video tracks we need to send/recv.
  3542. if (offerOptions) {
  3543. // Reject Chrome legacy constraints.
  3544. if (offerOptions.mandatory || offerOptions.optional) {
  3545. throw new TypeError(
  3546. 'Legacy mandatory/optional constraints not supported.');
  3547. }
  3548. if (offerOptions.offerToReceiveAudio !== undefined) {
  3549. if (offerOptions.offerToReceiveAudio === true) {
  3550. numAudioTracks = 1;
  3551. } else if (offerOptions.offerToReceiveAudio === false) {
  3552. numAudioTracks = 0;
  3553. } else {
  3554. numAudioTracks = offerOptions.offerToReceiveAudio;
  3555. }
  3556. }
  3557. if (offerOptions.offerToReceiveVideo !== undefined) {
  3558. if (offerOptions.offerToReceiveVideo === true) {
  3559. numVideoTracks = 1;
  3560. } else if (offerOptions.offerToReceiveVideo === false) {
  3561. numVideoTracks = 0;
  3562. } else {
  3563. numVideoTracks = offerOptions.offerToReceiveVideo;
  3564. }
  3565. }
  3566. }
  3567.  
  3568. this.transceivers.forEach(function(transceiver) {
  3569. if (transceiver.kind === 'audio') {
  3570. numAudioTracks--;
  3571. if (numAudioTracks < 0) {
  3572. transceiver.wantReceive = false;
  3573. }
  3574. } else if (transceiver.kind === 'video') {
  3575. numVideoTracks--;
  3576. if (numVideoTracks < 0) {
  3577. transceiver.wantReceive = false;
  3578. }
  3579. }
  3580. });
  3581.  
  3582. // Create M-lines for recvonly streams.
  3583. while (numAudioTracks > 0 || numVideoTracks > 0) {
  3584. if (numAudioTracks > 0) {
  3585. this._createTransceiver('audio');
  3586. numAudioTracks--;
  3587. }
  3588. if (numVideoTracks > 0) {
  3589. this._createTransceiver('video');
  3590. numVideoTracks--;
  3591. }
  3592. }
  3593. // reorder tracks
  3594. var transceivers = sortTracks(this.transceivers);
  3595.  
  3596. var sdp = SDPUtils.writeSessionBoilerplate(this._sdpSessionId);
  3597. transceivers.forEach(function(transceiver, sdpMLineIndex) {
  3598. // For each track, create an ice gatherer, ice transport,
  3599. // dtls transport, potentially rtpsender and rtpreceiver.
  3600. var track = transceiver.track;
  3601. var kind = transceiver.kind;
  3602. var mid = SDPUtils.generateIdentifier();
  3603. transceiver.mid = mid;
  3604.  
  3605. if (!transceiver.iceGatherer) {
  3606. transceiver.iceGatherer = self.usingBundle && sdpMLineIndex > 0 ?
  3607. transceivers[0].iceGatherer :
  3608. self._createIceGatherer(mid, sdpMLineIndex);
  3609. }
  3610.  
  3611. var localCapabilities = window.RTCRtpSender.getCapabilities(kind);
  3612. // filter RTX until additional stuff needed for RTX is implemented
  3613. // in adapter.js
  3614. if (edgeVersion < 15019) {
  3615. localCapabilities.codecs = localCapabilities.codecs.filter(
  3616. function(codec) {
  3617. return codec.name !== 'rtx';
  3618. });
  3619. }
  3620. localCapabilities.codecs.forEach(function(codec) {
  3621. // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552
  3622. // by adding level-asymmetry-allowed=1
  3623. if (codec.name === 'H264' &&
  3624. codec.parameters['level-asymmetry-allowed'] === undefined) {
  3625. codec.parameters['level-asymmetry-allowed'] = '1';
  3626. }
  3627. });
  3628.  
  3629. // generate an ssrc now, to be used later in rtpSender.send
  3630. var sendEncodingParameters = [{
  3631. ssrc: (2 * sdpMLineIndex + 1) * 1001
  3632. }];
  3633. if (track) {
  3634. // add RTX
  3635. if (edgeVersion >= 15019 && kind === 'video') {
  3636. sendEncodingParameters[0].rtx = {
  3637. ssrc: (2 * sdpMLineIndex + 1) * 1001 + 1
  3638. };
  3639. }
  3640. }
  3641.  
  3642. if (transceiver.wantReceive) {
  3643. transceiver.rtpReceiver = new window.RTCRtpReceiver(
  3644. transceiver.dtlsTransport,
  3645. kind
  3646. );
  3647. }
  3648.  
  3649. transceiver.localCapabilities = localCapabilities;
  3650. transceiver.sendEncodingParameters = sendEncodingParameters;
  3651. });
  3652.  
  3653. // always offer BUNDLE and dispose on return if not supported.
  3654. if (this._config.bundlePolicy !== 'max-compat') {
  3655. sdp += 'a=group:BUNDLE ' + transceivers.map(function(t) {
  3656. return t.mid;
  3657. }).join(' ') + '\r\n';
  3658. }
  3659. sdp += 'a=ice-options:trickle\r\n';
  3660.  
  3661. transceivers.forEach(function(transceiver, sdpMLineIndex) {
  3662. sdp += SDPUtils.writeMediaSection(transceiver,
  3663. transceiver.localCapabilities, 'offer', transceiver.stream);
  3664. sdp += 'a=rtcp-rsize\r\n';
  3665. });
  3666.  
  3667. this._pendingOffer = transceivers;
  3668. var desc = new window.RTCSessionDescription({
  3669. type: 'offer',
  3670. sdp: sdp
  3671. });
  3672. if (arguments.length && typeof arguments[0] === 'function') {
  3673. window.setTimeout(arguments[0], 0, desc);
  3674. }
  3675. return Promise.resolve(desc);
  3676. };
  3677.  
  3678. RTCPeerConnection.prototype.createAnswer = function() {
  3679. var sdp = SDPUtils.writeSessionBoilerplate(this._sdpSessionId);
  3680. if (this.usingBundle) {
  3681. sdp += 'a=group:BUNDLE ' + this.transceivers.map(function(t) {
  3682. return t.mid;
  3683. }).join(' ') + '\r\n';
  3684. }
  3685. this.transceivers.forEach(function(transceiver, sdpMLineIndex) {
  3686. if (transceiver.isDatachannel) {
  3687. sdp += 'm=application 0 DTLS/SCTP 5000\r\n' +
  3688. 'c=IN IP4 0.0.0.0\r\n' +
  3689. 'a=mid:' + transceiver.mid + '\r\n';
  3690. return;
  3691. }
  3692.  
  3693. // FIXME: look at direction.
  3694. if (transceiver.stream) {
  3695. var localTrack;
  3696. if (transceiver.kind === 'audio') {
  3697. localTrack = transceiver.stream.getAudioTracks()[0];
  3698. } else if (transceiver.kind === 'video') {
  3699. localTrack = transceiver.stream.getVideoTracks()[0];
  3700. }
  3701. if (localTrack) {
  3702. // add RTX
  3703. if (edgeVersion >= 15019 && transceiver.kind === 'video') {
  3704. transceiver.sendEncodingParameters[0].rtx = {
  3705. ssrc: (2 * sdpMLineIndex + 2) * 1001 + 1
  3706. };
  3707. }
  3708. }
  3709. }
  3710.  
  3711. // Calculate intersection of capabilities.
  3712. var commonCapabilities = getCommonCapabilities(
  3713. transceiver.localCapabilities,
  3714. transceiver.remoteCapabilities);
  3715.  
  3716. var hasRtx = commonCapabilities.codecs.filter(function(c) {
  3717. return c.name.toLowerCase() === 'rtx';
  3718. }).length;
  3719. if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {
  3720. delete transceiver.sendEncodingParameters[0].rtx;
  3721. }
  3722.  
  3723. sdp += SDPUtils.writeMediaSection(transceiver, commonCapabilities,
  3724. 'answer', transceiver.stream);
  3725. if (transceiver.rtcpParameters &&
  3726. transceiver.rtcpParameters.reducedSize) {
  3727. sdp += 'a=rtcp-rsize\r\n';
  3728. }
  3729. });
  3730.  
  3731. var desc = new window.RTCSessionDescription({
  3732. type: 'answer',
  3733. sdp: sdp
  3734. });
  3735. if (arguments.length && typeof arguments[0] === 'function') {
  3736. window.setTimeout(arguments[0], 0, desc);
  3737. }
  3738. return Promise.resolve(desc);
  3739. };
  3740.  
  3741. RTCPeerConnection.prototype.addIceCandidate = function(candidate) {
  3742. if (!candidate) {
  3743. for (var j = 0; j < this.transceivers.length; j++) {
  3744. this.transceivers[j].iceTransport.addRemoteCandidate({});
  3745. if (this.usingBundle) {
  3746. return Promise.resolve();
  3747. }
  3748. }
  3749. } else {
  3750. var mLineIndex = candidate.sdpMLineIndex;
  3751. if (candidate.sdpMid) {
  3752. for (var i = 0; i < this.transceivers.length; i++) {
  3753. if (this.transceivers[i].mid === candidate.sdpMid) {
  3754. mLineIndex = i;
  3755. break;
  3756. }
  3757. }
  3758. }
  3759. var transceiver = this.transceivers[mLineIndex];
  3760. if (transceiver) {
  3761. var cand = Object.keys(candidate.candidate).length > 0 ?
  3762. SDPUtils.parseCandidate(candidate.candidate) : {};
  3763. // Ignore Chrome's invalid candidates since Edge does not like them.
  3764. if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {
  3765. return Promise.resolve();
  3766. }
  3767. // Ignore RTCP candidates, we assume RTCP-MUX.
  3768. if (cand.component &&
  3769. !(cand.component === '1' || cand.component === 1)) {
  3770. return Promise.resolve();
  3771. }
  3772. transceiver.iceTransport.addRemoteCandidate(cand);
  3773.  
  3774. // update the remoteDescription.
  3775. var sections = SDPUtils.splitSections(this.remoteDescription.sdp);
  3776. sections[mLineIndex + 1] += (cand.type ? candidate.candidate.trim()
  3777. : 'a=end-of-candidates') + '\r\n';
  3778. this.remoteDescription.sdp = sections.join('');
  3779. }
  3780. }
  3781. if (arguments.length > 1 && typeof arguments[1] === 'function') {
  3782. window.setTimeout(arguments[1], 0);
  3783. }
  3784. return Promise.resolve();
  3785. };
  3786.  
  3787. RTCPeerConnection.prototype.getStats = function() {
  3788. var promises = [];
  3789. this.transceivers.forEach(function(transceiver) {
  3790. ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',
  3791. 'dtlsTransport'].forEach(function(method) {
  3792. if (transceiver[method]) {
  3793. promises.push(transceiver[method].getStats());
  3794. }
  3795. });
  3796. });
  3797. var cb = arguments.length > 1 && typeof arguments[1] === 'function' &&
  3798. arguments[1];
  3799. var fixStatsType = function(stat) {
  3800. return {
  3801. inboundrtp: 'inbound-rtp',
  3802. outboundrtp: 'outbound-rtp',
  3803. candidatepair: 'candidate-pair',
  3804. localcandidate: 'local-candidate',
  3805. remotecandidate: 'remote-candidate'
  3806. }[stat.type] || stat.type;
  3807. };
  3808. return new Promise(function(resolve) {
  3809. // shim getStats with maplike support
  3810. var results = new Map();
  3811. Promise.all(promises).then(function(res) {
  3812. res.forEach(function(result) {
  3813. Object.keys(result).forEach(function(id) {
  3814. result[id].type = fixStatsType(result[id]);
  3815. results.set(id, result[id]);
  3816. });
  3817. });
  3818. if (cb) {
  3819. window.setTimeout(cb, 0, results);
  3820. }
  3821. resolve(results);
  3822. });
  3823. });
  3824. };
  3825. return RTCPeerConnection;
  3826. };
  3827.  
  3828.  
  3829. /***/ }),
  3830. /* 16 */
  3831. /***/ (function(module, exports, __webpack_require__) {
  3832.  
  3833. "use strict";
  3834. /* eslint-env node */
  3835.  
  3836.  
  3837. // SDP helpers.
  3838. var SDPUtils = {};
  3839.  
  3840. // Generate an alphanumeric identifier for cname or mids.
  3841. // TODO: use UUIDs instead? https://gist.github.com/jed/982883
  3842. SDPUtils.generateIdentifier = function() {
  3843. return Math.random().toString(36).substr(2, 10);
  3844. };
  3845.  
  3846. // The RTCP CNAME used by all peerconnections from the same JS.
  3847. SDPUtils.localCName = SDPUtils.generateIdentifier();
  3848.  
  3849. // Splits SDP into lines, dealing with both CRLF and LF.
  3850. SDPUtils.splitLines = function(blob) {
  3851. return blob.trim().split('\n').map(function(line) {
  3852. return line.trim();
  3853. });
  3854. };
  3855. // Splits SDP into sessionpart and mediasections. Ensures CRLF.
  3856. SDPUtils.splitSections = function(blob) {
  3857. var parts = blob.split('\nm=');
  3858. return parts.map(function(part, index) {
  3859. return (index > 0 ? 'm=' + part : part).trim() + '\r\n';
  3860. });
  3861. };
  3862.  
  3863. // Returns lines that start with a certain prefix.
  3864. SDPUtils.matchPrefix = function(blob, prefix) {
  3865. return SDPUtils.splitLines(blob).filter(function(line) {
  3866. return line.indexOf(prefix) === 0;
  3867. });
  3868. };
  3869.  
  3870. // Parses an ICE candidate line. Sample input:
  3871. // candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8
  3872. // rport 55996"
  3873. SDPUtils.parseCandidate = function(line) {
  3874. var parts;
  3875. // Parse both variants.
  3876. if (line.indexOf('a=candidate:') === 0) {
  3877. parts = line.substring(12).split(' ');
  3878. } else {
  3879. parts = line.substring(10).split(' ');
  3880. }
  3881.  
  3882. var candidate = {
  3883. foundation: parts[0],
  3884. component: parseInt(parts[1], 10),
  3885. protocol: parts[2].toLowerCase(),
  3886. priority: parseInt(parts[3], 10),
  3887. ip: parts[4],
  3888. port: parseInt(parts[5], 10),
  3889. // skip parts[6] == 'typ'
  3890. type: parts[7]
  3891. };
  3892.  
  3893. for (var i = 8; i < parts.length; i += 2) {
  3894. switch (parts[i]) {
  3895. case 'raddr':
  3896. candidate.relatedAddress = parts[i + 1];
  3897. break;
  3898. case 'rport':
  3899. candidate.relatedPort = parseInt(parts[i + 1], 10);
  3900. break;
  3901. case 'tcptype':
  3902. candidate.tcpType = parts[i + 1];
  3903. break;
  3904. default: // extension handling, in particular ufrag
  3905. candidate[parts[i]] = parts[i + 1];
  3906. break;
  3907. }
  3908. }
  3909. return candidate;
  3910. };
  3911.  
  3912. // Translates a candidate object into SDP candidate attribute.
  3913. SDPUtils.writeCandidate = function(candidate) {
  3914. var sdp = [];
  3915. sdp.push(candidate.foundation);
  3916. sdp.push(candidate.component);
  3917. sdp.push(candidate.protocol.toUpperCase());
  3918. sdp.push(candidate.priority);
  3919. sdp.push(candidate.ip);
  3920. sdp.push(candidate.port);
  3921.  
  3922. var type = candidate.type;
  3923. sdp.push('typ');
  3924. sdp.push(type);
  3925. if (type !== 'host' && candidate.relatedAddress &&
  3926. candidate.relatedPort) {
  3927. sdp.push('raddr');
  3928. sdp.push(candidate.relatedAddress); // was: relAddr
  3929. sdp.push('rport');
  3930. sdp.push(candidate.relatedPort); // was: relPort
  3931. }
  3932. if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {
  3933. sdp.push('tcptype');
  3934. sdp.push(candidate.tcpType);
  3935. }
  3936. if (candidate.ufrag) {
  3937. sdp.push('ufrag');
  3938. sdp.push(candidate.ufrag);
  3939. }
  3940. return 'candidate:' + sdp.join(' ');
  3941. };
  3942.  
  3943. // Parses an ice-options line, returns an array of option tags.
  3944. // a=ice-options:foo bar
  3945. SDPUtils.parseIceOptions = function(line) {
  3946. return line.substr(14).split(' ');
  3947. }
  3948.  
  3949. // Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:
  3950. // a=rtpmap:111 opus/48000/2
  3951. SDPUtils.parseRtpMap = function(line) {
  3952. var parts = line.substr(9).split(' ');
  3953. var parsed = {
  3954. payloadType: parseInt(parts.shift(), 10) // was: id
  3955. };
  3956.  
  3957. parts = parts[0].split('/');
  3958.  
  3959. parsed.name = parts[0];
  3960. parsed.clockRate = parseInt(parts[1], 10); // was: clockrate
  3961. // was: channels
  3962. parsed.numChannels = parts.length === 3 ? parseInt(parts[2], 10) : 1;
  3963. return parsed;
  3964. };
  3965.  
  3966. // Generate an a=rtpmap line from RTCRtpCodecCapability or
  3967. // RTCRtpCodecParameters.
  3968. SDPUtils.writeRtpMap = function(codec) {
  3969. var pt = codec.payloadType;
  3970. if (codec.preferredPayloadType !== undefined) {
  3971. pt = codec.preferredPayloadType;
  3972. }
  3973. return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +
  3974. (codec.numChannels !== 1 ? '/' + codec.numChannels : '') + '\r\n';
  3975. };
  3976.  
  3977. // Parses an a=extmap line (headerextension from RFC 5285). Sample input:
  3978. // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
  3979. // a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset
  3980. SDPUtils.parseExtmap = function(line) {
  3981. var parts = line.substr(9).split(' ');
  3982. return {
  3983. id: parseInt(parts[0], 10),
  3984. direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',
  3985. uri: parts[1]
  3986. };
  3987. };
  3988.  
  3989. // Generates a=extmap line from RTCRtpHeaderExtensionParameters or
  3990. // RTCRtpHeaderExtension.
  3991. SDPUtils.writeExtmap = function(headerExtension) {
  3992. return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +
  3993. (headerExtension.direction && headerExtension.direction !== 'sendrecv'
  3994. ? '/' + headerExtension.direction
  3995. : '') +
  3996. ' ' + headerExtension.uri + '\r\n';
  3997. };
  3998.  
  3999. // Parses an ftmp line, returns dictionary. Sample input:
  4000. // a=fmtp:96 vbr=on;cng=on
  4001. // Also deals with vbr=on; cng=on
  4002. SDPUtils.parseFmtp = function(line) {
  4003. var parsed = {};
  4004. var kv;
  4005. var parts = line.substr(line.indexOf(' ') + 1).split(';');
  4006. for (var j = 0; j < parts.length; j++) {
  4007. kv = parts[j].trim().split('=');
  4008. parsed[kv[0].trim()] = kv[1];
  4009. }
  4010. return parsed;
  4011. };
  4012.  
  4013. // Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.
  4014. SDPUtils.writeFmtp = function(codec) {
  4015. var line = '';
  4016. var pt = codec.payloadType;
  4017. if (codec.preferredPayloadType !== undefined) {
  4018. pt = codec.preferredPayloadType;
  4019. }
  4020. if (codec.parameters && Object.keys(codec.parameters).length) {
  4021. var params = [];
  4022. Object.keys(codec.parameters).forEach(function(param) {
  4023. params.push(param + '=' + codec.parameters[param]);
  4024. });
  4025. line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n';
  4026. }
  4027. return line;
  4028. };
  4029.  
  4030. // Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:
  4031. // a=rtcp-fb:98 nack rpsi
  4032. SDPUtils.parseRtcpFb = function(line) {
  4033. var parts = line.substr(line.indexOf(' ') + 1).split(' ');
  4034. return {
  4035. type: parts.shift(),
  4036. parameter: parts.join(' ')
  4037. };
  4038. };
  4039. // Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.
  4040. SDPUtils.writeRtcpFb = function(codec) {
  4041. var lines = '';
  4042. var pt = codec.payloadType;
  4043. if (codec.preferredPayloadType !== undefined) {
  4044. pt = codec.preferredPayloadType;
  4045. }
  4046. if (codec.rtcpFeedback && codec.rtcpFeedback.length) {
  4047. // FIXME: special handling for trr-int?
  4048. codec.rtcpFeedback.forEach(function(fb) {
  4049. lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +
  4050. (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +
  4051. '\r\n';
  4052. });
  4053. }
  4054. return lines;
  4055. };
  4056.  
  4057. // Parses an RFC 5576 ssrc media attribute. Sample input:
  4058. // a=ssrc:3735928559 cname:something
  4059. SDPUtils.parseSsrcMedia = function(line) {
  4060. var sp = line.indexOf(' ');
  4061. var parts = {
  4062. ssrc: parseInt(line.substr(7, sp - 7), 10)
  4063. };
  4064. var colon = line.indexOf(':', sp);
  4065. if (colon > -1) {
  4066. parts.attribute = line.substr(sp + 1, colon - sp - 1);
  4067. parts.value = line.substr(colon + 1);
  4068. } else {
  4069. parts.attribute = line.substr(sp + 1);
  4070. }
  4071. return parts;
  4072. };
  4073.  
  4074. // Extracts the MID (RFC 5888) from a media section.
  4075. // returns the MID or undefined if no mid line was found.
  4076. SDPUtils.getMid = function(mediaSection) {
  4077. var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];
  4078. if (mid) {
  4079. return mid.substr(6);
  4080. }
  4081. }
  4082.  
  4083. SDPUtils.parseFingerprint = function(line) {
  4084. var parts = line.substr(14).split(' ');
  4085. return {
  4086. algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.
  4087. value: parts[1]
  4088. };
  4089. };
  4090.  
  4091. // Extracts DTLS parameters from SDP media section or sessionpart.
  4092. // FIXME: for consistency with other functions this should only
  4093. // get the fingerprint line as input. See also getIceParameters.
  4094. SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {
  4095. var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,
  4096. 'a=fingerprint:');
  4097. // Note: a=setup line is ignored since we use the 'auto' role.
  4098. // Note2: 'algorithm' is not case sensitive except in Edge.
  4099. return {
  4100. role: 'auto',
  4101. fingerprints: lines.map(SDPUtils.parseFingerprint)
  4102. };
  4103. };
  4104.  
  4105. // Serializes DTLS parameters to SDP.
  4106. SDPUtils.writeDtlsParameters = function(params, setupType) {
  4107. var sdp = 'a=setup:' + setupType + '\r\n';
  4108. params.fingerprints.forEach(function(fp) {
  4109. sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n';
  4110. });
  4111. return sdp;
  4112. };
  4113. // Parses ICE information from SDP media section or sessionpart.
  4114. // FIXME: for consistency with other functions this should only
  4115. // get the ice-ufrag and ice-pwd lines as input.
  4116. SDPUtils.getIceParameters = function(mediaSection, sessionpart) {
  4117. var lines = SDPUtils.splitLines(mediaSection);
  4118. // Search in session part, too.
  4119. lines = lines.concat(SDPUtils.splitLines(sessionpart));
  4120. var iceParameters = {
  4121. usernameFragment: lines.filter(function(line) {
  4122. return line.indexOf('a=ice-ufrag:') === 0;
  4123. })[0].substr(12),
  4124. password: lines.filter(function(line) {
  4125. return line.indexOf('a=ice-pwd:') === 0;
  4126. })[0].substr(10)
  4127. };
  4128. return iceParameters;
  4129. };
  4130.  
  4131. // Serializes ICE parameters to SDP.
  4132. SDPUtils.writeIceParameters = function(params) {
  4133. return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' +
  4134. 'a=ice-pwd:' + params.password + '\r\n';
  4135. };
  4136.  
  4137. // Parses the SDP media section and returns RTCRtpParameters.
  4138. SDPUtils.parseRtpParameters = function(mediaSection) {
  4139. var description = {
  4140. codecs: [],
  4141. headerExtensions: [],
  4142. fecMechanisms: [],
  4143. rtcp: []
  4144. };
  4145. var lines = SDPUtils.splitLines(mediaSection);
  4146. var mline = lines[0].split(' ');
  4147. for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]
  4148. var pt = mline[i];
  4149. var rtpmapline = SDPUtils.matchPrefix(
  4150. mediaSection, 'a=rtpmap:' + pt + ' ')[0];
  4151. if (rtpmapline) {
  4152. var codec = SDPUtils.parseRtpMap(rtpmapline);
  4153. var fmtps = SDPUtils.matchPrefix(
  4154. mediaSection, 'a=fmtp:' + pt + ' ');
  4155. // Only the first a=fmtp:<pt> is considered.
  4156. codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};
  4157. codec.rtcpFeedback = SDPUtils.matchPrefix(
  4158. mediaSection, 'a=rtcp-fb:' + pt + ' ')
  4159. .map(SDPUtils.parseRtcpFb);
  4160. description.codecs.push(codec);
  4161. // parse FEC mechanisms from rtpmap lines.
  4162. switch (codec.name.toUpperCase()) {
  4163. case 'RED':
  4164. case 'ULPFEC':
  4165. description.fecMechanisms.push(codec.name.toUpperCase());
  4166. break;
  4167. default: // only RED and ULPFEC are recognized as FEC mechanisms.
  4168. break;
  4169. }
  4170. }
  4171. }
  4172. SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {
  4173. description.headerExtensions.push(SDPUtils.parseExtmap(line));
  4174. });
  4175. // FIXME: parse rtcp.
  4176. return description;
  4177. };
  4178.  
  4179. // Generates parts of the SDP media section describing the capabilities /
  4180. // parameters.
  4181. SDPUtils.writeRtpDescription = function(kind, caps) {
  4182. var sdp = '';
  4183.  
  4184. // Build the mline.
  4185. sdp += 'm=' + kind + ' ';
  4186. sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.
  4187. sdp += ' UDP/TLS/RTP/SAVPF ';
  4188. sdp += caps.codecs.map(function(codec) {
  4189. if (codec.preferredPayloadType !== undefined) {
  4190. return codec.preferredPayloadType;
  4191. }
  4192. return codec.payloadType;
  4193. }).join(' ') + '\r\n';
  4194.  
  4195. sdp += 'c=IN IP4 0.0.0.0\r\n';
  4196. sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n';
  4197.  
  4198. // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.
  4199. caps.codecs.forEach(function(codec) {
  4200. sdp += SDPUtils.writeRtpMap(codec);
  4201. sdp += SDPUtils.writeFmtp(codec);
  4202. sdp += SDPUtils.writeRtcpFb(codec);
  4203. });
  4204. var maxptime = 0;
  4205. caps.codecs.forEach(function(codec) {
  4206. if (codec.maxptime > maxptime) {
  4207. maxptime = codec.maxptime;
  4208. }
  4209. });
  4210. if (maxptime > 0) {
  4211. sdp += 'a=maxptime:' + maxptime + '\r\n';
  4212. }
  4213. sdp += 'a=rtcp-mux\r\n';
  4214.  
  4215. caps.headerExtensions.forEach(function(extension) {
  4216. sdp += SDPUtils.writeExtmap(extension);
  4217. });
  4218. // FIXME: write fecMechanisms.
  4219. return sdp;
  4220. };
  4221.  
  4222. // Parses the SDP media section and returns an array of
  4223. // RTCRtpEncodingParameters.
  4224. SDPUtils.parseRtpEncodingParameters = function(mediaSection) {
  4225. var encodingParameters = [];
  4226. var description = SDPUtils.parseRtpParameters(mediaSection);
  4227. var hasRed = description.fecMechanisms.indexOf('RED') !== -1;
  4228. var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;
  4229.  
  4230. // filter a=ssrc:... cname:, ignore PlanB-msid
  4231. var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
  4232. .map(function(line) {
  4233. return SDPUtils.parseSsrcMedia(line);
  4234. })
  4235. .filter(function(parts) {
  4236. return parts.attribute === 'cname';
  4237. });
  4238. var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;
  4239. var secondarySsrc;
  4240.  
  4241. var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')
  4242. .map(function(line) {
  4243. var parts = line.split(' ');
  4244. parts.shift();
  4245. return parts.map(function(part) {
  4246. return parseInt(part, 10);
  4247. });
  4248. });
  4249. if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {
  4250. secondarySsrc = flows[0][1];
  4251. }
  4252.  
  4253. description.codecs.forEach(function(codec) {
  4254. if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {
  4255. var encParam = {
  4256. ssrc: primarySsrc,
  4257. codecPayloadType: parseInt(codec.parameters.apt, 10),
  4258. rtx: {
  4259. ssrc: secondarySsrc
  4260. }
  4261. };
  4262. encodingParameters.push(encParam);
  4263. if (hasRed) {
  4264. encParam = JSON.parse(JSON.stringify(encParam));
  4265. encParam.fec = {
  4266. ssrc: secondarySsrc,
  4267. mechanism: hasUlpfec ? 'red+ulpfec' : 'red'
  4268. };
  4269. encodingParameters.push(encParam);
  4270. }
  4271. }
  4272. });
  4273. if (encodingParameters.length === 0 && primarySsrc) {
  4274. encodingParameters.push({
  4275. ssrc: primarySsrc
  4276. });
  4277. }
  4278.  
  4279. // we support both b=AS and b=TIAS but interpret AS as TIAS.
  4280. var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');
  4281. if (bandwidth.length) {
  4282. if (bandwidth[0].indexOf('b=TIAS:') === 0) {
  4283. bandwidth = parseInt(bandwidth[0].substr(7), 10);
  4284. } else if (bandwidth[0].indexOf('b=AS:') === 0) {
  4285. // use formula from JSEP to convert b=AS to TIAS value.
  4286. bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95
  4287. - (50 * 40 * 8);
  4288. } else {
  4289. bandwidth = undefined;
  4290. }
  4291. encodingParameters.forEach(function(params) {
  4292. params.maxBitrate = bandwidth;
  4293. });
  4294. }
  4295. return encodingParameters;
  4296. };
  4297.  
  4298. // parses http://draft.ortc.org/#rtcrtcpparameters*
  4299. SDPUtils.parseRtcpParameters = function(mediaSection) {
  4300. var rtcpParameters = {};
  4301.  
  4302. var cname;
  4303. // Gets the first SSRC. Note that with RTX there might be multiple
  4304. // SSRCs.
  4305. var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
  4306. .map(function(line) {
  4307. return SDPUtils.parseSsrcMedia(line);
  4308. })
  4309. .filter(function(obj) {
  4310. return obj.attribute === 'cname';
  4311. })[0];
  4312. if (remoteSsrc) {
  4313. rtcpParameters.cname = remoteSsrc.value;
  4314. rtcpParameters.ssrc = remoteSsrc.ssrc;
  4315. }
  4316.  
  4317. // Edge uses the compound attribute instead of reducedSize
  4318. // compound is !reducedSize
  4319. var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');
  4320. rtcpParameters.reducedSize = rsize.length > 0;
  4321. rtcpParameters.compound = rsize.length === 0;
  4322.  
  4323. // parses the rtcp-mux attrіbute.
  4324. // Note that Edge does not support unmuxed RTCP.
  4325. var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');
  4326. rtcpParameters.mux = mux.length > 0;
  4327.  
  4328. return rtcpParameters;
  4329. };
  4330.  
  4331. // parses either a=msid: or a=ssrc:... msid lines and returns
  4332. // the id of the MediaStream and MediaStreamTrack.
  4333. SDPUtils.parseMsid = function(mediaSection) {
  4334. var parts;
  4335. var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');
  4336. if (spec.length === 1) {
  4337. parts = spec[0].substr(7).split(' ');
  4338. return {stream: parts[0], track: parts[1]};
  4339. }
  4340. var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
  4341. .map(function(line) {
  4342. return SDPUtils.parseSsrcMedia(line);
  4343. })
  4344. .filter(function(parts) {
  4345. return parts.attribute === 'msid';
  4346. });
  4347. if (planB.length > 0) {
  4348. parts = planB[0].value.split(' ');
  4349. return {stream: parts[0], track: parts[1]};
  4350. }
  4351. };
  4352.  
  4353. // Generate a session ID for SDP.
  4354. // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1
  4355. // recommends using a cryptographically random +ve 64-bit value
  4356. // but right now this should be acceptable and within the right range
  4357. SDPUtils.generateSessionId = function() {
  4358. return Math.random().toString().substr(2, 21);
  4359. };
  4360.  
  4361. // Write boilder plate for start of SDP
  4362. // sessId argument is optional - if not supplied it will
  4363. // be generated randomly
  4364. // sessVersion is optional and defaults to 2
  4365. SDPUtils.writeSessionBoilerplate = function(sessId, sessVer) {
  4366. var sessionId;
  4367. var version = sessVer !== undefined ? sessVer : 2;
  4368. if (sessId) {
  4369. sessionId = sessId;
  4370. } else {
  4371. sessionId = SDPUtils.generateSessionId();
  4372. }
  4373. // FIXME: sess-id should be an NTP timestamp.
  4374. return 'v=0\r\n' +
  4375. 'o=thisisadapterortc ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\r\n' +
  4376. 's=-\r\n' +
  4377. 't=0 0\r\n';
  4378. };
  4379.  
  4380. SDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {
  4381. var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);
  4382.  
  4383. // Map ICE parameters (ufrag, pwd) to SDP.
  4384. sdp += SDPUtils.writeIceParameters(
  4385. transceiver.iceGatherer.getLocalParameters());
  4386.  
  4387. // Map DTLS parameters to SDP.
  4388. sdp += SDPUtils.writeDtlsParameters(
  4389. transceiver.dtlsTransport.getLocalParameters(),
  4390. type === 'offer' ? 'actpass' : 'active');
  4391.  
  4392. sdp += 'a=mid:' + transceiver.mid + '\r\n';
  4393.  
  4394. if (transceiver.direction) {
  4395. sdp += 'a=' + transceiver.direction + '\r\n';
  4396. } else if (transceiver.rtpSender && transceiver.rtpReceiver) {
  4397. sdp += 'a=sendrecv\r\n';
  4398. } else if (transceiver.rtpSender) {
  4399. sdp += 'a=sendonly\r\n';
  4400. } else if (transceiver.rtpReceiver) {
  4401. sdp += 'a=recvonly\r\n';
  4402. } else {
  4403. sdp += 'a=inactive\r\n';
  4404. }
  4405.  
  4406. if (transceiver.rtpSender) {
  4407. // spec.
  4408. var msid = 'msid:' + stream.id + ' ' +
  4409. transceiver.rtpSender.track.id + '\r\n';
  4410. sdp += 'a=' + msid;
  4411.  
  4412. // for Chrome.
  4413. sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +
  4414. ' ' + msid;
  4415. if (transceiver.sendEncodingParameters[0].rtx) {
  4416. sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +
  4417. ' ' + msid;
  4418. sdp += 'a=ssrc-group:FID ' +
  4419. transceiver.sendEncodingParameters[0].ssrc + ' ' +
  4420. transceiver.sendEncodingParameters[0].rtx.ssrc +
  4421. '\r\n';
  4422. }
  4423. }
  4424. // FIXME: this should be written by writeRtpDescription.
  4425. sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +
  4426. ' cname:' + SDPUtils.localCName + '\r\n';
  4427. if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {
  4428. sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +
  4429. ' cname:' + SDPUtils.localCName + '\r\n';
  4430. }
  4431. return sdp;
  4432. };
  4433.  
  4434. // Gets the direction from the mediaSection or the sessionpart.
  4435. SDPUtils.getDirection = function(mediaSection, sessionpart) {
  4436. // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.
  4437. var lines = SDPUtils.splitLines(mediaSection);
  4438. for (var i = 0; i < lines.length; i++) {
  4439. switch (lines[i]) {
  4440. case 'a=sendrecv':
  4441. case 'a=sendonly':
  4442. case 'a=recvonly':
  4443. case 'a=inactive':
  4444. return lines[i].substr(2);
  4445. default:
  4446. // FIXME: What should happen here?
  4447. }
  4448. }
  4449. if (sessionpart) {
  4450. return SDPUtils.getDirection(sessionpart);
  4451. }
  4452. return 'sendrecv';
  4453. };
  4454.  
  4455. SDPUtils.getKind = function(mediaSection) {
  4456. var lines = SDPUtils.splitLines(mediaSection);
  4457. var mline = lines[0].split(' ');
  4458. return mline[0].substr(2);
  4459. };
  4460.  
  4461. SDPUtils.isRejected = function(mediaSection) {
  4462. return mediaSection.split(' ', 2)[1] === '0';
  4463. };
  4464.  
  4465. // Expose public methods.
  4466. module.exports = SDPUtils;
  4467.  
  4468.  
  4469. /***/ }),
  4470. /* 17 */
  4471. /***/ (function(module, exports, __webpack_require__) {
  4472.  
  4473. "use strict";
  4474. /*
  4475. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  4476. *
  4477. * Use of this source code is governed by a BSD-style license
  4478. * that can be found in the LICENSE file in the root of the source
  4479. * tree.
  4480. */
  4481. /* eslint-env node */
  4482.  
  4483.  
  4484. // Expose public methods.
  4485. module.exports = function(window) {
  4486. var navigator = window && window.navigator;
  4487.  
  4488. var shimError_ = function(e) {
  4489. return {
  4490. name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,
  4491. message: e.message,
  4492. constraint: e.constraint,
  4493. toString: function() {
  4494. return this.name;
  4495. }
  4496. };
  4497. };
  4498.  
  4499. // getUserMedia error shim.
  4500. var origGetUserMedia = navigator.mediaDevices.getUserMedia.
  4501. bind(navigator.mediaDevices);
  4502. navigator.mediaDevices.getUserMedia = function(c) {
  4503. return origGetUserMedia(c).catch(function(e) {
  4504. return Promise.reject(shimError_(e));
  4505. });
  4506. };
  4507. };
  4508.  
  4509.  
  4510. /***/ }),
  4511. /* 18 */
  4512. /***/ (function(module, exports, __webpack_require__) {
  4513.  
  4514. "use strict";
  4515. /*
  4516. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  4517. *
  4518. * Use of this source code is governed by a BSD-style license
  4519. * that can be found in the LICENSE file in the root of the source
  4520. * tree.
  4521. */
  4522. /* eslint-env node */
  4523.  
  4524.  
  4525. var utils = __webpack_require__(0);
  4526.  
  4527. var firefoxShim = {
  4528. shimOnTrack: function(window) {
  4529. if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in
  4530. window.RTCPeerConnection.prototype)) {
  4531. Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {
  4532. get: function() {
  4533. return this._ontrack;
  4534. },
  4535. set: function(f) {
  4536. if (this._ontrack) {
  4537. this.removeEventListener('track', this._ontrack);
  4538. this.removeEventListener('addstream', this._ontrackpoly);
  4539. }
  4540. this.addEventListener('track', this._ontrack = f);
  4541. this.addEventListener('addstream', this._ontrackpoly = function(e) {
  4542. e.stream.getTracks().forEach(function(track) {
  4543. var event = new Event('track');
  4544. event.track = track;
  4545. event.receiver = {track: track};
  4546. event.streams = [e.stream];
  4547. this.dispatchEvent(event);
  4548. }.bind(this));
  4549. }.bind(this));
  4550. }
  4551. });
  4552. }
  4553. },
  4554.  
  4555. shimSourceObject: function(window) {
  4556. // Firefox has supported mozSrcObject since FF22, unprefixed in 42.
  4557. if (typeof window === 'object') {
  4558. if (window.HTMLMediaElement &&
  4559. !('srcObject' in window.HTMLMediaElement.prototype)) {
  4560. // Shim the srcObject property, once, when HTMLMediaElement is found.
  4561. Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {
  4562. get: function() {
  4563. return this.mozSrcObject;
  4564. },
  4565. set: function(stream) {
  4566. this.mozSrcObject = stream;
  4567. }
  4568. });
  4569. }
  4570. }
  4571. },
  4572.  
  4573. shimPeerConnection: function(window) {
  4574. var browserDetails = utils.detectBrowser(window);
  4575.  
  4576. if (typeof window !== 'object' || !(window.RTCPeerConnection ||
  4577. window.mozRTCPeerConnection)) {
  4578. return; // probably media.peerconnection.enabled=false in about:config
  4579. }
  4580. // The RTCPeerConnection object.
  4581. if (!window.RTCPeerConnection) {
  4582. window.RTCPeerConnection = function(pcConfig, pcConstraints) {
  4583. if (browserDetails.version < 38) {
  4584. // .urls is not supported in FF < 38.
  4585. // create RTCIceServers with a single url.
  4586. if (pcConfig && pcConfig.iceServers) {
  4587. var newIceServers = [];
  4588. for (var i = 0; i < pcConfig.iceServers.length; i++) {
  4589. var server = pcConfig.iceServers[i];
  4590. if (server.hasOwnProperty('urls')) {
  4591. for (var j = 0; j < server.urls.length; j++) {
  4592. var newServer = {
  4593. url: server.urls[j]
  4594. };
  4595. if (server.urls[j].indexOf('turn') === 0) {
  4596. newServer.username = server.username;
  4597. newServer.credential = server.credential;
  4598. }
  4599. newIceServers.push(newServer);
  4600. }
  4601. } else {
  4602. newIceServers.push(pcConfig.iceServers[i]);
  4603. }
  4604. }
  4605. pcConfig.iceServers = newIceServers;
  4606. }
  4607. }
  4608. return new window.mozRTCPeerConnection(pcConfig, pcConstraints);
  4609. };
  4610. window.RTCPeerConnection.prototype =
  4611. window.mozRTCPeerConnection.prototype;
  4612.  
  4613. // wrap static methods. Currently just generateCertificate.
  4614. if (window.mozRTCPeerConnection.generateCertificate) {
  4615. Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {
  4616. get: function() {
  4617. return window.mozRTCPeerConnection.generateCertificate;
  4618. }
  4619. });
  4620. }
  4621.  
  4622. window.RTCSessionDescription = window.mozRTCSessionDescription;
  4623. window.RTCIceCandidate = window.mozRTCIceCandidate;
  4624. }
  4625.  
  4626. // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.
  4627. ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']
  4628. .forEach(function(method) {
  4629. var nativeMethod = window.RTCPeerConnection.prototype[method];
  4630. window.RTCPeerConnection.prototype[method] = function() {
  4631. arguments[0] = new ((method === 'addIceCandidate') ?
  4632. window.RTCIceCandidate :
  4633. window.RTCSessionDescription)(arguments[0]);
  4634. return nativeMethod.apply(this, arguments);
  4635. };
  4636. });
  4637.  
  4638. // support for addIceCandidate(null or undefined)
  4639. var nativeAddIceCandidate =
  4640. window.RTCPeerConnection.prototype.addIceCandidate;
  4641. window.RTCPeerConnection.prototype.addIceCandidate = function() {
  4642. if (!arguments[0]) {
  4643. if (arguments[1]) {
  4644. arguments[1].apply(null);
  4645. }
  4646. return Promise.resolve();
  4647. }
  4648. return nativeAddIceCandidate.apply(this, arguments);
  4649. };
  4650.  
  4651. // shim getStats with maplike support
  4652. var makeMapStats = function(stats) {
  4653. var map = new Map();
  4654. Object.keys(stats).forEach(function(key) {
  4655. map.set(key, stats[key]);
  4656. map[key] = stats[key];
  4657. });
  4658. return map;
  4659. };
  4660.  
  4661. var modernStatsTypes = {
  4662. inboundrtp: 'inbound-rtp',
  4663. outboundrtp: 'outbound-rtp',
  4664. candidatepair: 'candidate-pair',
  4665. localcandidate: 'local-candidate',
  4666. remotecandidate: 'remote-candidate'
  4667. };
  4668.  
  4669. var nativeGetStats = window.RTCPeerConnection.prototype.getStats;
  4670. window.RTCPeerConnection.prototype.getStats = function(
  4671. selector,
  4672. onSucc,
  4673. onErr
  4674. ) {
  4675. return nativeGetStats.apply(this, [selector || null])
  4676. .then(function(stats) {
  4677. if (browserDetails.version < 48) {
  4678. stats = makeMapStats(stats);
  4679. }
  4680. if (browserDetails.version < 53 && !onSucc) {
  4681. // Shim only promise getStats with spec-hyphens in type names
  4682. // Leave callback version alone; misc old uses of forEach before Map
  4683. try {
  4684. stats.forEach(function(stat) {
  4685. stat.type = modernStatsTypes[stat.type] || stat.type;
  4686. });
  4687. } catch (e) {
  4688. if (e.name !== 'TypeError') {
  4689. throw e;
  4690. }
  4691. // Avoid TypeError: "type" is read-only, in old versions. 34-43ish
  4692. stats.forEach(function(stat, i) {
  4693. stats.set(i, Object.assign({}, stat, {
  4694. type: modernStatsTypes[stat.type] || stat.type
  4695. }));
  4696. });
  4697. }
  4698. }
  4699. return stats;
  4700. })
  4701. .then(onSucc, onErr);
  4702. };
  4703. }
  4704. };
  4705.  
  4706. // Expose public methods.
  4707. module.exports = {
  4708. shimOnTrack: firefoxShim.shimOnTrack,
  4709. shimSourceObject: firefoxShim.shimSourceObject,
  4710. shimPeerConnection: firefoxShim.shimPeerConnection,
  4711. shimGetUserMedia: __webpack_require__(19)
  4712. };
  4713.  
  4714.  
  4715. /***/ }),
  4716. /* 19 */
  4717. /***/ (function(module, exports, __webpack_require__) {
  4718.  
  4719. "use strict";
  4720. /*
  4721. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  4722. *
  4723. * Use of this source code is governed by a BSD-style license
  4724. * that can be found in the LICENSE file in the root of the source
  4725. * tree.
  4726. */
  4727. /* eslint-env node */
  4728.  
  4729.  
  4730. var utils = __webpack_require__(0);
  4731. var logging = utils.log;
  4732.  
  4733. // Expose public methods.
  4734. module.exports = function(window) {
  4735. var browserDetails = utils.detectBrowser(window);
  4736. var navigator = window && window.navigator;
  4737. var MediaStreamTrack = window && window.MediaStreamTrack;
  4738.  
  4739. var shimError_ = function(e) {
  4740. return {
  4741. name: {
  4742. InternalError: 'NotReadableError',
  4743. NotSupportedError: 'TypeError',
  4744. PermissionDeniedError: 'NotAllowedError',
  4745. SecurityError: 'NotAllowedError'
  4746. }[e.name] || e.name,
  4747. message: {
  4748. 'The operation is insecure.': 'The request is not allowed by the ' +
  4749. 'user agent or the platform in the current context.'
  4750. }[e.message] || e.message,
  4751. constraint: e.constraint,
  4752. toString: function() {
  4753. return this.name + (this.message && ': ') + this.message;
  4754. }
  4755. };
  4756. };
  4757.  
  4758. // getUserMedia constraints shim.
  4759. var getUserMedia_ = function(constraints, onSuccess, onError) {
  4760. var constraintsToFF37_ = function(c) {
  4761. if (typeof c !== 'object' || c.require) {
  4762. return c;
  4763. }
  4764. var require = [];
  4765. Object.keys(c).forEach(function(key) {
  4766. if (key === 'require' || key === 'advanced' || key === 'mediaSource') {
  4767. return;
  4768. }
  4769. var r = c[key] = (typeof c[key] === 'object') ?
  4770. c[key] : {ideal: c[key]};
  4771. if (r.min !== undefined ||
  4772. r.max !== undefined || r.exact !== undefined) {
  4773. require.push(key);
  4774. }
  4775. if (r.exact !== undefined) {
  4776. if (typeof r.exact === 'number') {
  4777. r. min = r.max = r.exact;
  4778. } else {
  4779. c[key] = r.exact;
  4780. }
  4781. delete r.exact;
  4782. }
  4783. if (r.ideal !== undefined) {
  4784. c.advanced = c.advanced || [];
  4785. var oc = {};
  4786. if (typeof r.ideal === 'number') {
  4787. oc[key] = {min: r.ideal, max: r.ideal};
  4788. } else {
  4789. oc[key] = r.ideal;
  4790. }
  4791. c.advanced.push(oc);
  4792. delete r.ideal;
  4793. if (!Object.keys(r).length) {
  4794. delete c[key];
  4795. }
  4796. }
  4797. });
  4798. if (require.length) {
  4799. c.require = require;
  4800. }
  4801. return c;
  4802. };
  4803. constraints = JSON.parse(JSON.stringify(constraints));
  4804. if (browserDetails.version < 38) {
  4805. logging('spec: ' + JSON.stringify(constraints));
  4806. if (constraints.audio) {
  4807. constraints.audio = constraintsToFF37_(constraints.audio);
  4808. }
  4809. if (constraints.video) {
  4810. constraints.video = constraintsToFF37_(constraints.video);
  4811. }
  4812. logging('ff37: ' + JSON.stringify(constraints));
  4813. }
  4814. return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {
  4815. onError(shimError_(e));
  4816. });
  4817. };
  4818.  
  4819. // Returns the result of getUserMedia as a Promise.
  4820. var getUserMediaPromise_ = function(constraints) {
  4821. return new Promise(function(resolve, reject) {
  4822. getUserMedia_(constraints, resolve, reject);
  4823. });
  4824. };
  4825.  
  4826. // Shim for mediaDevices on older versions.
  4827. if (!navigator.mediaDevices) {
  4828. navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,
  4829. addEventListener: function() { },
  4830. removeEventListener: function() { }
  4831. };
  4832. }
  4833. navigator.mediaDevices.enumerateDevices =
  4834. navigator.mediaDevices.enumerateDevices || function() {
  4835. return new Promise(function(resolve) {
  4836. var infos = [
  4837. {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},
  4838. {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}
  4839. ];
  4840. resolve(infos);
  4841. });
  4842. };
  4843.  
  4844. if (browserDetails.version < 41) {
  4845. // Work around http://bugzil.la/1169665
  4846. var orgEnumerateDevices =
  4847. navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);
  4848. navigator.mediaDevices.enumerateDevices = function() {
  4849. return orgEnumerateDevices().then(undefined, function(e) {
  4850. if (e.name === 'NotFoundError') {
  4851. return [];
  4852. }
  4853. throw e;
  4854. });
  4855. };
  4856. }
  4857. if (browserDetails.version < 49) {
  4858. var origGetUserMedia = navigator.mediaDevices.getUserMedia.
  4859. bind(navigator.mediaDevices);
  4860. navigator.mediaDevices.getUserMedia = function(c) {
  4861. return origGetUserMedia(c).then(function(stream) {
  4862. // Work around https://bugzil.la/802326
  4863. if (c.audio && !stream.getAudioTracks().length ||
  4864. c.video && !stream.getVideoTracks().length) {
  4865. stream.getTracks().forEach(function(track) {
  4866. track.stop();
  4867. });
  4868. throw new DOMException('The object can not be found here.',
  4869. 'NotFoundError');
  4870. }
  4871. return stream;
  4872. }, function(e) {
  4873. return Promise.reject(shimError_(e));
  4874. });
  4875. };
  4876. }
  4877. if (!(browserDetails.version > 55 &&
  4878. 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {
  4879. var remap = function(obj, a, b) {
  4880. if (a in obj && !(b in obj)) {
  4881. obj[b] = obj[a];
  4882. delete obj[a];
  4883. }
  4884. };
  4885.  
  4886. var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.
  4887. bind(navigator.mediaDevices);
  4888. navigator.mediaDevices.getUserMedia = function(c) {
  4889. if (typeof c === 'object' && typeof c.audio === 'object') {
  4890. c = JSON.parse(JSON.stringify(c));
  4891. remap(c.audio, 'autoGainControl', 'mozAutoGainControl');
  4892. remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');
  4893. }
  4894. return nativeGetUserMedia(c);
  4895. };
  4896.  
  4897. if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {
  4898. var nativeGetSettings = MediaStreamTrack.prototype.getSettings;
  4899. MediaStreamTrack.prototype.getSettings = function() {
  4900. var obj = nativeGetSettings.apply(this, arguments);
  4901. remap(obj, 'mozAutoGainControl', 'autoGainControl');
  4902. remap(obj, 'mozNoiseSuppression', 'noiseSuppression');
  4903. return obj;
  4904. };
  4905. }
  4906.  
  4907. if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {
  4908. var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;
  4909. MediaStreamTrack.prototype.applyConstraints = function(c) {
  4910. if (this.kind === 'audio' && typeof c === 'object') {
  4911. c = JSON.parse(JSON.stringify(c));
  4912. remap(c, 'autoGainControl', 'mozAutoGainControl');
  4913. remap(c, 'noiseSuppression', 'mozNoiseSuppression');
  4914. }
  4915. return nativeApplyConstraints.apply(this, [c]);
  4916. };
  4917. }
  4918. }
  4919. navigator.getUserMedia = function(constraints, onSuccess, onError) {
  4920. if (browserDetails.version < 44) {
  4921. return getUserMedia_(constraints, onSuccess, onError);
  4922. }
  4923. // Replace Firefox 44+'s deprecation warning with unprefixed version.
  4924. console.warn('navigator.getUserMedia has been replaced by ' +
  4925. 'navigator.mediaDevices.getUserMedia');
  4926. navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);
  4927. };
  4928. };
  4929.  
  4930.  
  4931. /***/ }),
  4932. /* 20 */
  4933. /***/ (function(module, exports, __webpack_require__) {
  4934.  
  4935. "use strict";
  4936. /*
  4937. * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
  4938. *
  4939. * Use of this source code is governed by a BSD-style license
  4940. * that can be found in the LICENSE file in the root of the source
  4941. * tree.
  4942. */
  4943.  
  4944. var utils = __webpack_require__(0);
  4945.  
  4946. var safariShim = {
  4947. // TODO: DrAlex, should be here, double check against LayoutTests
  4948.  
  4949. // TODO: once the back-end for the mac port is done, add.
  4950. // TODO: check for webkitGTK+
  4951. // shimPeerConnection: function() { },
  4952.  
  4953. shimLocalStreamsAPI: function(window) {
  4954. if (typeof window !== 'object' || !window.RTCPeerConnection) {
  4955. return;
  4956. }
  4957. if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {
  4958. window.RTCPeerConnection.prototype.getLocalStreams = function() {
  4959. if (!this._localStreams) {
  4960. this._localStreams = [];
  4961. }
  4962. return this._localStreams;
  4963. };
  4964. }
  4965. if (!('getStreamById' in window.RTCPeerConnection.prototype)) {
  4966. window.RTCPeerConnection.prototype.getStreamById = function(id) {
  4967. var result = null;
  4968. if (this._localStreams) {
  4969. this._localStreams.forEach(function(stream) {
  4970. if (stream.id === id) {
  4971. result = stream;
  4972. }
  4973. });
  4974. }
  4975. if (this._remoteStreams) {
  4976. this._remoteStreams.forEach(function(stream) {
  4977. if (stream.id === id) {
  4978. result = stream;
  4979. }
  4980. });
  4981. }
  4982. return result;
  4983. };
  4984. }
  4985. if (!('addStream' in window.RTCPeerConnection.prototype)) {
  4986. var _addTrack = window.RTCPeerConnection.prototype.addTrack;
  4987. window.RTCPeerConnection.prototype.addStream = function(stream) {
  4988. if (!this._localStreams) {
  4989. this._localStreams = [];
  4990. }
  4991. if (this._localStreams.indexOf(stream) === -1) {
  4992. this._localStreams.push(stream);
  4993. }
  4994. var self = this;
  4995. stream.getTracks().forEach(function(track) {
  4996. _addTrack.call(self, track, stream);
  4997. });
  4998. };
  4999.  
  5000. window.RTCPeerConnection.prototype.addTrack = function(track, stream) {
  5001. if (stream) {
  5002. if (!this._localStreams) {
  5003. this._localStreams = [stream];
  5004. } else if (this._localStreams.indexOf(stream) === -1) {
  5005. this._localStreams.push(stream);
  5006. }
  5007. }
  5008. _addTrack.call(this, track, stream);
  5009. };
  5010. }
  5011. if (!('removeStream' in window.RTCPeerConnection.prototype)) {
  5012. window.RTCPeerConnection.prototype.removeStream = function(stream) {
  5013. if (!this._localStreams) {
  5014. this._localStreams = [];
  5015. }
  5016. var index = this._localStreams.indexOf(stream);
  5017. if (index === -1) {
  5018. return;
  5019. }
  5020. this._localStreams.splice(index, 1);
  5021. var self = this;
  5022. var tracks = stream.getTracks();
  5023. this.getSenders().forEach(function(sender) {
  5024. if (tracks.indexOf(sender.track) !== -1) {
  5025. self.removeTrack(sender);
  5026. }
  5027. });
  5028. };
  5029. }
  5030. },
  5031. shimRemoteStreamsAPI: function(window) {
  5032. if (typeof window !== 'object' || !window.RTCPeerConnection) {
  5033. return;
  5034. }
  5035. if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {
  5036. window.RTCPeerConnection.prototype.getRemoteStreams = function() {
  5037. return this._remoteStreams ? this._remoteStreams : [];
  5038. };
  5039. }
  5040. if (!('onaddstream' in window.RTCPeerConnection.prototype)) {
  5041. Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {
  5042. get: function() {
  5043. return this._onaddstream;
  5044. },
  5045. set: function(f) {
  5046. if (this._onaddstream) {
  5047. this.removeEventListener('addstream', this._onaddstream);
  5048. this.removeEventListener('track', this._onaddstreampoly);
  5049. }
  5050. this.addEventListener('addstream', this._onaddstream = f);
  5051. this.addEventListener('track', this._onaddstreampoly = function(e) {
  5052. var stream = e.streams[0];
  5053. if (!this._remoteStreams) {
  5054. this._remoteStreams = [];
  5055. }
  5056. if (this._remoteStreams.indexOf(stream) >= 0) {
  5057. return;
  5058. }
  5059. this._remoteStreams.push(stream);
  5060. var event = new Event('addstream');
  5061. event.stream = e.streams[0];
  5062. this.dispatchEvent(event);
  5063. }.bind(this));
  5064. }
  5065. });
  5066. }
  5067. },
  5068. shimCallbacksAPI: function(window) {
  5069. if (typeof window !== 'object' || !window.RTCPeerConnection) {
  5070. return;
  5071. }
  5072. var prototype = window.RTCPeerConnection.prototype;
  5073. var createOffer = prototype.createOffer;
  5074. var createAnswer = prototype.createAnswer;
  5075. var setLocalDescription = prototype.setLocalDescription;
  5076. var setRemoteDescription = prototype.setRemoteDescription;
  5077. var addIceCandidate = prototype.addIceCandidate;
  5078.  
  5079. prototype.createOffer = function(successCallback, failureCallback) {
  5080. var options = (arguments.length >= 2) ? arguments[2] : arguments[0];
  5081. var promise = createOffer.apply(this, [options]);
  5082. if (!failureCallback) {
  5083. return promise;
  5084. }
  5085. promise.then(successCallback, failureCallback);
  5086. return Promise.resolve();
  5087. };
  5088.  
  5089. prototype.createAnswer = function(successCallback, failureCallback) {
  5090. var options = (arguments.length >= 2) ? arguments[2] : arguments[0];
  5091. var promise = createAnswer.apply(this, [options]);
  5092. if (!failureCallback) {
  5093. return promise;
  5094. }
  5095. promise.then(successCallback, failureCallback);
  5096. return Promise.resolve();
  5097. };
  5098.  
  5099. var withCallback = function(description, successCallback, failureCallback) {
  5100. var promise = setLocalDescription.apply(this, [description]);
  5101. if (!failureCallback) {
  5102. return promise;
  5103. }
  5104. promise.then(successCallback, failureCallback);
  5105. return Promise.resolve();
  5106. };
  5107. prototype.setLocalDescription = withCallback;
  5108.  
  5109. withCallback = function(description, successCallback, failureCallback) {
  5110. var promise = setRemoteDescription.apply(this, [description]);
  5111. if (!failureCallback) {
  5112. return promise;
  5113. }
  5114. promise.then(successCallback, failureCallback);
  5115. return Promise.resolve();
  5116. };
  5117. prototype.setRemoteDescription = withCallback;
  5118.  
  5119. withCallback = function(candidate, successCallback, failureCallback) {
  5120. var promise = addIceCandidate.apply(this, [candidate]);
  5121. if (!failureCallback) {
  5122. return promise;
  5123. }
  5124. promise.then(successCallback, failureCallback);
  5125. return Promise.resolve();
  5126. };
  5127. prototype.addIceCandidate = withCallback;
  5128. },
  5129. shimGetUserMedia: function(window) {
  5130. var navigator = window && window.navigator;
  5131.  
  5132. if (!navigator.getUserMedia) {
  5133. if (navigator.webkitGetUserMedia) {
  5134. navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
  5135. } else if (navigator.mediaDevices &&
  5136. navigator.mediaDevices.getUserMedia) {
  5137. navigator.getUserMedia = function(constraints, cb, errcb) {
  5138. navigator.mediaDevices.getUserMedia(constraints)
  5139. .then(cb, errcb);
  5140. }.bind(navigator);
  5141. }
  5142. }
  5143. },
  5144. shimRTCIceServerUrls: function(window) {
  5145. // migrate from non-spec RTCIceServer.url to RTCIceServer.urls
  5146. var OrigPeerConnection = window.RTCPeerConnection;
  5147. window.RTCPeerConnection = function(pcConfig, pcConstraints) {
  5148. if (pcConfig && pcConfig.iceServers) {
  5149. var newIceServers = [];
  5150. for (var i = 0; i < pcConfig.iceServers.length; i++) {
  5151. var server = pcConfig.iceServers[i];
  5152. if (!server.hasOwnProperty('urls') &&
  5153. server.hasOwnProperty('url')) {
  5154. utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');
  5155. server = JSON.parse(JSON.stringify(server));
  5156. server.urls = server.url;
  5157. delete server.url;
  5158. newIceServers.push(server);
  5159. } else {
  5160. newIceServers.push(pcConfig.iceServers[i]);
  5161. }
  5162. }
  5163. pcConfig.iceServers = newIceServers;
  5164. }
  5165. return new OrigPeerConnection(pcConfig, pcConstraints);
  5166. };
  5167. window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;
  5168. // wrap static methods. Currently just generateCertificate.
  5169. Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {
  5170. get: function() {
  5171. return OrigPeerConnection.generateCertificate;
  5172. }
  5173. });
  5174. }
  5175. };
  5176.  
  5177. // Expose public methods.
  5178. module.exports = {
  5179. shimCallbacksAPI: safariShim.shimCallbacksAPI,
  5180. shimLocalStreamsAPI: safariShim.shimLocalStreamsAPI,
  5181. shimRemoteStreamsAPI: safariShim.shimRemoteStreamsAPI,
  5182. shimGetUserMedia: safariShim.shimGetUserMedia,
  5183. shimRTCIceServerUrls: safariShim.shimRTCIceServerUrls
  5184. // TODO
  5185. // shimPeerConnection: safariShim.shimPeerConnection
  5186. };
  5187.  
  5188.  
  5189. /***/ }),
  5190. /* 21 */
  5191. /***/ (function(module, exports, __webpack_require__) {
  5192.  
  5193. var require;var require;(function(f){if(true){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.default = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
  5194. "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var _require=_dereq_("./spec/reference-implementation/lib/readable-stream"),ReadableStream=_require.ReadableStream,_require2=_dereq_("./spec/reference-implementation/lib/writable-stream"),WritableStream=_require2.WritableStream,ByteLengthQueuingStrategy=_dereq_("./spec/reference-implementation/lib/byte-length-queuing-strategy"),CountQueuingStrategy=_dereq_("./spec/reference-implementation/lib/count-queuing-strategy"),TransformStream=_dereq_("./spec/reference-implementation/lib/transform-stream").TransformStream;exports.ByteLengthQueuingStrategy=ByteLengthQueuingStrategy,exports.CountQueuingStrategy=CountQueuingStrategy,exports.TransformStream=TransformStream,exports.ReadableStream=ReadableStream,exports.WritableStream=WritableStream;var interfaces={ReadableStream:ReadableStream,WritableStream:WritableStream,ByteLengthQueuingStrategy:ByteLengthQueuingStrategy,CountQueuingStrategy:CountQueuingStrategy,TransformStream:TransformStream};exports.default=interfaces,"undefined"!=typeof window&&Object.assign(window,interfaces);
  5195.  
  5196. },{"./spec/reference-implementation/lib/byte-length-queuing-strategy":3,"./spec/reference-implementation/lib/count-queuing-strategy":4,"./spec/reference-implementation/lib/readable-stream":7,"./spec/reference-implementation/lib/transform-stream":8,"./spec/reference-implementation/lib/writable-stream":9}],2:[function(_dereq_,module,exports){
  5197.  
  5198. },{}],3:[function(_dereq_,module,exports){
  5199. "use strict";function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var a=r[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(r,t,a){return t&&e(r.prototype,t),a&&e(r,a),r}}(),_require=_dereq_("./helpers.js"),createDataProperty=_require.createDataProperty;module.exports=function(){function e(r){var t=r.highWaterMark;_classCallCheck(this,e),createDataProperty(this,"highWaterMark",t)}return _createClass(e,[{key:"size",value:function(e){return e.byteLength}}]),e}();
  5200.  
  5201. },{"./helpers.js":5}],4:[function(_dereq_,module,exports){
  5202. "use strict";function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var a=r[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(r,t,a){return t&&e(r.prototype,t),a&&e(r,a),r}}(),_require=_dereq_("./helpers.js"),createDataProperty=_require.createDataProperty;module.exports=function(){function e(r){var t=r.highWaterMark;_classCallCheck(this,e),createDataProperty(this,"highWaterMark",t)}return _createClass(e,[{key:"size",value:function(){return 1}}]),e}();
  5203.  
  5204. },{"./helpers.js":5}],5:[function(_dereq_,module,exports){
  5205. "use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)}function IsPropertyKey(e){return"string"==typeof e||"symbol"===("undefined"==typeof e?"undefined":_typeof(e))}function Call(e,r,t){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,r,t)}var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};exports.typeIsObject=function(e){return"object"===("undefined"==typeof e?"undefined":_typeof(e))&&null!==e||"function"==typeof e},exports.createDataProperty=function(e,r,t){Object.defineProperty(e,r,{value:t,writable:!0,enumerable:!0,configurable:!0})},exports.createArrayFromList=function(e){return e.slice()},exports.ArrayBufferCopy=function(e,r,t,o,n){new Uint8Array(e).set(new Uint8Array(t,o,n),r)},exports.CreateIterResultObject=function(e,r){var t={};return Object.defineProperty(t,"value",{value:e,enumerable:!0,writable:!0,configurable:!0}),Object.defineProperty(t,"done",{value:r,enumerable:!0,writable:!0,configurable:!0}),t},exports.IsFiniteNonNegativeNumber=function(e){return!Number.isNaN(e)&&(e!==1/0&&!(e<0))},exports.InvokeOrNoop=function(e,r,t){var o=e[r];if(void 0!==o)return Call(o,e,t)},exports.PromiseInvokeOrNoop=function(e,r,t){try{return Promise.resolve(exports.InvokeOrNoop(e,r,t))}catch(e){return Promise.reject(e)}},exports.PromiseInvokeOrPerformFallback=function(e,r,t,o,n){var i=void 0;try{i=e[r]}catch(e){return Promise.reject(e)}if(void 0===i)return o.apply(void 0,_toConsumableArray(n));try{return Promise.resolve(Call(i,e,t))}catch(e){return Promise.reject(e)}},exports.PromiseInvokeOrFallbackOrNoop=function(e,r,t,o,n){return exports.PromiseInvokeOrPerformFallback(e,r,t,exports.PromiseInvokeOrNoop,[e,o,n])},exports.SameRealmTransfer=function(e){return e},exports.ValidateAndNormalizeHighWaterMark=function(e){if(e=Number(e),Number.isNaN(e)||e<0)throw new RangeError("highWaterMark property of a queuing strategy must be non-negative and non-NaN");return e},exports.ValidateAndNormalizeQueuingStrategy=function(e,r){if(void 0!==e&&"function"!=typeof e)throw new TypeError("size property of a queuing strategy must be a function");return r=exports.ValidateAndNormalizeHighWaterMark(r),{size:e,highWaterMark:r}};
  5206.  
  5207. },{}],6:[function(_dereq_,module,exports){
  5208. "use strict";var _require=_dereq_("./helpers.js"),IsFiniteNonNegativeNumber=_require.IsFiniteNonNegativeNumber;exports.DequeueValue=function(e){var t=e.shift();return e._totalSize-=t.size,t.value},exports.EnqueueValueWithSize=function(e,t,i){if(i=Number(i),!IsFiniteNonNegativeNumber(i))throw new RangeError("Size must be a finite, non-NaN, non-negative number.");e.push({value:t,size:i}),void 0===e._totalSize&&(e._totalSize=0),e._totalSize+=i},exports.GetTotalQueueSize=function(e){return void 0===e._totalSize&&(e._totalSize=0),e._totalSize},exports.PeekQueueValue=function(e){var t=e[0];return t.value};
  5209.  
  5210. },{"./helpers.js":5}],7:[function(_dereq_,module,exports){
  5211. "use strict";function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function AcquireReadableStreamBYOBReader(e){return new ReadableStreamBYOBReader(e)}function AcquireReadableStreamDefaultReader(e){return new ReadableStreamDefaultReader(e)}function IsReadableStream(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")}function IsReadableStreamDisturbed(e){return e._disturbed}function IsReadableStreamLocked(e){return void 0!==e._reader}function ReadableStreamTee(e,r){var t=AcquireReadableStreamDefaultReader(e),a={closedOrErrored:!1,canceled1:!1,canceled2:!1,reason1:void 0,reason2:void 0};a.promise=new Promise(function(e){a._resolve=e});var l=create_ReadableStreamTeePullFunction();l._reader=t,l._teeState=a,l._cloneForBranch2=r;var o=create_ReadableStreamTeeBranch1CancelFunction();o._stream=e,o._teeState=a;var n=create_ReadableStreamTeeBranch2CancelFunction();n._stream=e,n._teeState=a;var i=Object.create(Object.prototype);createDataProperty(i,"pull",l),createDataProperty(i,"cancel",o);var d=new ReadableStream(i),s=Object.create(Object.prototype);createDataProperty(s,"pull",l),createDataProperty(s,"cancel",n);var u=new ReadableStream(s);return l._branch1=d._readableStreamController,l._branch2=u._readableStreamController,t._closedPromise.catch(function(e){a.closedOrErrored!==!0&&(ReadableStreamDefaultControllerError(l._branch1,e),ReadableStreamDefaultControllerError(l._branch2,e),a.closedOrErrored=!0)}),[d,u]}function create_ReadableStreamTeePullFunction(){function e(){var r=e._reader,t=e._branch1,a=e._branch2,l=e._teeState;return ReadableStreamDefaultReaderRead(r).then(function(e){var r=e.value,o=e.done;if(o===!0&&l.closedOrErrored===!1&&(l.canceled1===!1&&ReadableStreamDefaultControllerClose(t),l.canceled2===!1&&ReadableStreamDefaultControllerClose(a),l.closedOrErrored=!0),l.closedOrErrored!==!0){var n=r,i=r;l.canceled1===!1&&ReadableStreamDefaultControllerEnqueue(t,n),l.canceled2===!1&&ReadableStreamDefaultControllerEnqueue(a,i)}})}return e}function create_ReadableStreamTeeBranch1CancelFunction(){function e(r){var t=e._stream,a=e._teeState;if(a.canceled1=!0,a.reason1=r,a.canceled2===!0){var l=createArrayFromList([a.reason1,a.reason2]),o=ReadableStreamCancel(t,l);a._resolve(o)}return a.promise}return e}function create_ReadableStreamTeeBranch2CancelFunction(){function e(r){var t=e._stream,a=e._teeState;if(a.canceled2=!0,a.reason2=r,a.canceled1===!0){var l=createArrayFromList([a.reason1,a.reason2]),o=ReadableStreamCancel(t,l);a._resolve(o)}return a.promise}return e}function ReadableStreamAddReadIntoRequest(e){var r=new Promise(function(r,t){var a={_resolve:r,_reject:t};e._reader._readIntoRequests.push(a)});return r}function ReadableStreamAddReadRequest(e){var r=new Promise(function(r,t){var a={_resolve:r,_reject:t};e._reader._readRequests.push(a)});return r}function ReadableStreamCancel(e,r){if(e._disturbed=!0,"closed"===e._state)return Promise.resolve(void 0);if("errored"===e._state)return Promise.reject(e._storedError);ReadableStreamClose(e);var t=e._readableStreamController[InternalCancel](r);return t.then(function(){})}function ReadableStreamClose(e){e._state="closed";var r=e._reader;if(void 0!==r){if(IsReadableStreamDefaultReader(r)===!0){var t=!0,a=!1,l=void 0;try{for(var o,n=r._readRequests[Symbol.iterator]();!(t=(o=n.next()).done);t=!0){var i=o.value._resolve;i(CreateIterResultObject(void 0,!0))}}catch(e){a=!0,l=e}finally{try{!t&&n.return&&n.return()}finally{if(a)throw l}}r._readRequests=[]}defaultReaderClosedPromiseResolve(r)}}function ReadableStreamError(e,r){e._state="errored",e._storedError=r;var t=e._reader;if(void 0!==t){if(IsReadableStreamDefaultReader(t)===!0){var a=!0,l=!1,o=void 0;try{for(var n,i=t._readRequests[Symbol.iterator]();!(a=(n=i.next()).done);a=!0){var d=n.value;d._reject(r)}}catch(e){l=!0,o=e}finally{try{!a&&i.return&&i.return()}finally{if(l)throw o}}t._readRequests=[]}else{var s=!0,u=!1,c=void 0;try{for(var b,R=t._readIntoRequests[Symbol.iterator]();!(s=(b=R.next()).done);s=!0){var m=b.value;m._reject(r)}}catch(e){u=!0,c=e}finally{try{!s&&R.return&&R.return()}finally{if(u)throw c}}t._readIntoRequests=[]}defaultReaderClosedPromiseReject(t,r),t._closedPromise.catch(function(){})}}function ReadableStreamFulfillReadIntoRequest(e,r,t){var a=e._reader,l=a._readIntoRequests.shift();l._resolve(CreateIterResultObject(r,t))}function ReadableStreamFulfillReadRequest(e,r,t){var a=e._reader,l=a._readRequests.shift();l._resolve(CreateIterResultObject(r,t))}function ReadableStreamGetNumReadIntoRequests(e){return e._reader._readIntoRequests.length}function ReadableStreamGetNumReadRequests(e){return e._reader._readRequests.length}function ReadableStreamHasBYOBReader(e){var r=e._reader;return void 0!==r&&IsReadableStreamBYOBReader(r)!==!1}function ReadableStreamHasDefaultReader(e){var r=e._reader;return void 0!==r&&IsReadableStreamDefaultReader(r)!==!1}function IsReadableStreamBYOBReader(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")}function IsReadableStreamDefaultReader(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readRequests")}function ReadableStreamReaderGenericInitialize(e,r){e._ownerReadableStream=r,r._reader=e,"readable"===r._state?defaultReaderClosedPromiseInitialize(e):"closed"===r._state?defaultReaderClosedPromiseInitializeAsResolved(e):(defaultReaderClosedPromiseInitializeAsRejected(e,r._storedError),e._closedPromise.catch(function(){}))}function ReadableStreamReaderGenericCancel(e,r){var t=e._ownerReadableStream;return ReadableStreamCancel(t,r)}function ReadableStreamReaderGenericRelease(e){"readable"===e._ownerReadableStream._state?defaultReaderClosedPromiseReject(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):defaultReaderClosedPromiseResetToRejected(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),e._closedPromise.catch(function(){}),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function ReadableStreamBYOBReaderRead(e,r){var t=e._ownerReadableStream;return t._disturbed=!0,"errored"===t._state?Promise.reject(t._storedError):ReadableByteStreamControllerPullInto(t._readableStreamController,r)}function ReadableStreamDefaultReaderRead(e){var r=e._ownerReadableStream;return r._disturbed=!0,"closed"===r._state?Promise.resolve(CreateIterResultObject(void 0,!0)):"errored"===r._state?Promise.reject(r._storedError):r._readableStreamController[InternalPull]()}function IsReadableStreamDefaultController(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_underlyingSource")}function ReadableStreamDefaultControllerCallPullIfNeeded(e){var r=ReadableStreamDefaultControllerShouldCallPull(e);if(r!==!1){if(e._pulling===!0)return void(e._pullAgain=!0);e._pulling=!0;var t=PromiseInvokeOrNoop(e._underlyingSource,"pull",[e]);t.then(function(){if(e._pulling=!1,e._pullAgain===!0)return e._pullAgain=!1,ReadableStreamDefaultControllerCallPullIfNeeded(e)},function(r){ReadableStreamDefaultControllerErrorIfNeeded(e,r)}).catch(rethrowAssertionErrorRejection)}}function ReadableStreamDefaultControllerShouldCallPull(e){var r=e._controlledReadableStream;if("closed"===r._state||"errored"===r._state)return!1;if(e._closeRequested===!0)return!1;if(e._started===!1)return!1;if(IsReadableStreamLocked(r)===!0&&ReadableStreamGetNumReadRequests(r)>0)return!0;var t=ReadableStreamDefaultControllerGetDesiredSize(e);return t>0}function ReadableStreamDefaultControllerClose(e){var r=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&ReadableStreamClose(r)}function ReadableStreamDefaultControllerEnqueue(e,r){var t=e._controlledReadableStream;if(IsReadableStreamLocked(t)===!0&&ReadableStreamGetNumReadRequests(t)>0)ReadableStreamFulfillReadRequest(t,r,!1);else{var a=1;if(void 0!==e._strategySize)try{a=e._strategySize(r)}catch(r){throw ReadableStreamDefaultControllerErrorIfNeeded(e,r),r}try{EnqueueValueWithSize(e._queue,r,a)}catch(r){throw ReadableStreamDefaultControllerErrorIfNeeded(e,r),r}}ReadableStreamDefaultControllerCallPullIfNeeded(e)}function ReadableStreamDefaultControllerError(e,r){var t=e._controlledReadableStream;e._queue=[],ReadableStreamError(t,r)}function ReadableStreamDefaultControllerErrorIfNeeded(e,r){"readable"===e._controlledReadableStream._state&&ReadableStreamDefaultControllerError(e,r)}function ReadableStreamDefaultControllerGetDesiredSize(e){var r=GetTotalQueueSize(e._queue);return e._strategyHWM-r}function IsReadableByteStreamController(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_underlyingByteSource")}function IsReadableStreamBYOBRequest(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")}function ReadableByteStreamControllerCallPullIfNeeded(e){var r=ReadableByteStreamControllerShouldCallPull(e);if(r!==!1){if(e._pulling===!0)return void(e._pullAgain=!0);e._pulling=!0;var t=PromiseInvokeOrNoop(e._underlyingByteSource,"pull",[e]);t.then(function(){e._pulling=!1,e._pullAgain===!0&&(e._pullAgain=!1,ReadableByteStreamControllerCallPullIfNeeded(e))},function(r){"readable"===e._controlledReadableStream._state&&ReadableByteStreamControllerError(e,r)}).catch(rethrowAssertionErrorRejection)}}function ReadableByteStreamControllerClearPendingPullIntos(e){ReadableByteStreamControllerInvalidateBYOBRequest(e),e._pendingPullIntos=[]}function ReadableByteStreamControllerCommitPullIntoDescriptor(e,r){var t=!1;"closed"===e._state&&(t=!0);var a=ReadableByteStreamControllerConvertPullIntoDescriptor(r);"default"===r.readerType?ReadableStreamFulfillReadRequest(e,a,t):ReadableStreamFulfillReadIntoRequest(e,a,t)}function ReadableByteStreamControllerConvertPullIntoDescriptor(e){var r=e.bytesFilled,t=e.elementSize;return new e.ctor(e.buffer,e.byteOffset,r/t)}function ReadableByteStreamControllerEnqueueChunkToQueue(e,r,t,a){e._queue.push({buffer:r,byteOffset:t,byteLength:a}),e._totalQueuedBytes+=a}function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,r){var t=r.elementSize,a=r.bytesFilled-r.bytesFilled%t,l=Math.min(e._totalQueuedBytes,r.byteLength-r.bytesFilled),o=r.bytesFilled+l,n=o-o%t,i=l,d=!1;n>a&&(i=n-r.bytesFilled,d=!0);for(var s=e._queue;i>0;){var u=s[0],c=Math.min(i,u.byteLength),b=r.byteOffset+r.bytesFilled;ArrayBufferCopy(r.buffer,b,u.buffer,u.byteOffset,c),u.byteLength===c?s.shift():(u.byteOffset+=c,u.byteLength-=c),e._totalQueuedBytes-=c,ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,c,r),i-=c}return d}function ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,r,t){ReadableByteStreamControllerInvalidateBYOBRequest(e),t.bytesFilled+=r}function ReadableByteStreamControllerHandleQueueDrain(e){0===e._totalQueuedBytes&&e._closeRequested===!0?ReadableStreamClose(e._controlledReadableStream):ReadableByteStreamControllerCallPullIfNeeded(e)}function ReadableByteStreamControllerInvalidateBYOBRequest(e){void 0!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=void 0,e._byobRequest=void 0)}function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e){for(;e._pendingPullIntos.length>0;){if(0===e._totalQueuedBytes)return;var r=e._pendingPullIntos[0];ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,r)===!0&&(ReadableByteStreamControllerShiftPendingPullInto(e),ReadableByteStreamControllerCommitPullIntoDescriptor(e._controlledReadableStream,r))}}function ReadableByteStreamControllerPullInto(e,r){var t=e._controlledReadableStream,a=1;r.constructor!==DataView&&(a=r.constructor.BYTES_PER_ELEMENT);var l=r.constructor,o={buffer:r.buffer,byteOffset:r.byteOffset,byteLength:r.byteLength,bytesFilled:0,elementSize:a,ctor:l,readerType:"byob"};if(e._pendingPullIntos.length>0)return o.buffer=SameRealmTransfer(o.buffer),e._pendingPullIntos.push(o),ReadableStreamAddReadIntoRequest(t);if("closed"===t._state){var n=new r.constructor(r.buffer,r.byteOffset,0);return Promise.resolve(CreateIterResultObject(n,!0))}if(e._totalQueuedBytes>0){if(ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(e,o)===!0){var i=ReadableByteStreamControllerConvertPullIntoDescriptor(o);return ReadableByteStreamControllerHandleQueueDrain(e),Promise.resolve(CreateIterResultObject(i,!1))}if(e._closeRequested===!0){var d=new TypeError("Insufficient bytes to fill elements in the given buffer");return ReadableByteStreamControllerError(e,d),Promise.reject(d)}}o.buffer=SameRealmTransfer(o.buffer),e._pendingPullIntos.push(o);var s=ReadableStreamAddReadIntoRequest(t);return ReadableByteStreamControllerCallPullIfNeeded(e),s}function ReadableByteStreamControllerRespondInClosedState(e,r){r.buffer=SameRealmTransfer(r.buffer);for(var t=e._controlledReadableStream;ReadableStreamGetNumReadIntoRequests(t)>0;){var a=ReadableByteStreamControllerShiftPendingPullInto(e);ReadableByteStreamControllerCommitPullIntoDescriptor(t,a)}}function ReadableByteStreamControllerRespondInReadableState(e,r,t){if(t.bytesFilled+r>t.byteLength)throw new RangeError("bytesWritten out of range");if(ReadableByteStreamControllerFillHeadPullIntoDescriptor(e,r,t),!(t.bytesFilled<t.elementSize)){ReadableByteStreamControllerShiftPendingPullInto(e);var a=t.bytesFilled%t.elementSize;if(a>0){var l=t.byteOffset+t.bytesFilled,o=t.buffer.slice(l-a,l);ReadableByteStreamControllerEnqueueChunkToQueue(e,o,0,o.byteLength)}t.buffer=SameRealmTransfer(t.buffer),t.bytesFilled-=a,ReadableByteStreamControllerCommitPullIntoDescriptor(e._controlledReadableStream,t),ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e)}}function ReadableByteStreamControllerRespondInternal(e,r){var t=e._pendingPullIntos[0],a=e._controlledReadableStream;if("closed"===a._state){if(0!==r)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream");ReadableByteStreamControllerRespondInClosedState(e,t)}else ReadableByteStreamControllerRespondInReadableState(e,r,t)}function ReadableByteStreamControllerShiftPendingPullInto(e){var r=e._pendingPullIntos.shift();return ReadableByteStreamControllerInvalidateBYOBRequest(e),r}function ReadableByteStreamControllerShouldCallPull(e){var r=e._controlledReadableStream;return"readable"===r._state&&(e._closeRequested!==!0&&(e._started!==!1&&(!!(ReadableStreamHasDefaultReader(r)&&ReadableStreamGetNumReadRequests(r)>0)||(!!(ReadableStreamHasBYOBReader(r)&&ReadableStreamGetNumReadIntoRequests(r)>0)||ReadableByteStreamControllerGetDesiredSize(e)>0))))}function ReadableByteStreamControllerClose(e){var r=e._controlledReadableStream;if(e._totalQueuedBytes>0)return void(e._closeRequested=!0);if(e._pendingPullIntos.length>0){var t=e._pendingPullIntos[0];if(t.bytesFilled>0){var a=new TypeError("Insufficient bytes to fill elements in the given buffer");throw ReadableByteStreamControllerError(e,a),a}}ReadableStreamClose(r)}function ReadableByteStreamControllerEnqueue(e,r){var t=e._controlledReadableStream,a=r.buffer,l=r.byteOffset,o=r.byteLength,n=SameRealmTransfer(a);if(ReadableStreamHasDefaultReader(t)===!0)if(0===ReadableStreamGetNumReadRequests(t))ReadableByteStreamControllerEnqueueChunkToQueue(e,n,l,o);else{var i=new Uint8Array(n,l,o);ReadableStreamFulfillReadRequest(t,i,!1)}else ReadableStreamHasBYOBReader(t)===!0?(ReadableByteStreamControllerEnqueueChunkToQueue(e,n,l,o),ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(e)):ReadableByteStreamControllerEnqueueChunkToQueue(e,n,l,o)}function ReadableByteStreamControllerError(e,r){var t=e._controlledReadableStream;ReadableByteStreamControllerClearPendingPullIntos(e),e._queue=[],ReadableStreamError(t,r)}function ReadableByteStreamControllerGetDesiredSize(e){return e._strategyHWM-e._totalQueuedBytes}function ReadableByteStreamControllerRespond(e,r){if(r=Number(r),IsFiniteNonNegativeNumber(r)===!1)throw new RangeError("bytesWritten must be a finite");ReadableByteStreamControllerRespondInternal(e,r)}function ReadableByteStreamControllerRespondWithNewView(e,r){var t=e._pendingPullIntos[0];if(t.byteOffset+t.bytesFilled!==r.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(t.byteLength!==r.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");t.buffer=r.buffer,ReadableByteStreamControllerRespondInternal(e,r.byteLength)}function streamBrandCheckException(e){return new TypeError("ReadableStream.prototype."+e+" can only be used on a ReadableStream")}function readerLockException(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function defaultReaderBrandCheckException(e){return new TypeError("ReadableStreamDefaultReader.prototype."+e+" can only be used on a ReadableStreamDefaultReader")}function defaultReaderClosedPromiseInitialize(e){e._closedPromise=new Promise(function(r,t){e._closedPromise_resolve=r,e._closedPromise_reject=t})}function defaultReaderClosedPromiseInitializeAsRejected(e,r){e._closedPromise=Promise.reject(r),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultReaderClosedPromiseInitializeAsResolved(e){e._closedPromise=Promise.resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultReaderClosedPromiseReject(e,r){e._closedPromise_reject(r),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultReaderClosedPromiseResetToRejected(e,r){e._closedPromise=Promise.reject(r)}function defaultReaderClosedPromiseResolve(e){e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function byobReaderBrandCheckException(e){return new TypeError("ReadableStreamBYOBReader.prototype."+e+" can only be used on a ReadableStreamBYOBReader")}function defaultControllerBrandCheckException(e){return new TypeError("ReadableStreamDefaultController.prototype."+e+" can only be used on a ReadableStreamDefaultController")}function byobRequestBrandCheckException(e){return new TypeError("ReadableStreamBYOBRequest.prototype."+e+" can only be used on a ReadableStreamBYOBRequest")}function byteStreamControllerBrandCheckException(e){return new TypeError("ReadableByteStreamController.prototype."+e+" can only be used on a ReadableByteStreamController")}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var a=r[t];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(r,t,a){return t&&e(r.prototype,t),a&&e(r,a),r}}(),_require=_dereq_("./helpers.js"),ArrayBufferCopy=_require.ArrayBufferCopy,CreateIterResultObject=_require.CreateIterResultObject,IsFiniteNonNegativeNumber=_require.IsFiniteNonNegativeNumber,InvokeOrNoop=_require.InvokeOrNoop,PromiseInvokeOrNoop=_require.PromiseInvokeOrNoop,SameRealmTransfer=_require.SameRealmTransfer,ValidateAndNormalizeQueuingStrategy=_require.ValidateAndNormalizeQueuingStrategy,ValidateAndNormalizeHighWaterMark=_require.ValidateAndNormalizeHighWaterMark,_require2=_dereq_("./helpers.js"),createArrayFromList=_require2.createArrayFromList,createDataProperty=_require2.createDataProperty,typeIsObject=_require2.typeIsObject,_require3=_dereq_("./utils.js"),rethrowAssertionErrorRejection=_require3.rethrowAssertionErrorRejection,_require4=_dereq_("./queue-with-sizes.js"),DequeueValue=_require4.DequeueValue,EnqueueValueWithSize=_require4.EnqueueValueWithSize,GetTotalQueueSize=_require4.GetTotalQueueSize,_require5=_dereq_("./writable-stream.js"),AcquireWritableStreamDefaultWriter=_require5.AcquireWritableStreamDefaultWriter,IsWritableStream=_require5.IsWritableStream,IsWritableStreamLocked=_require5.IsWritableStreamLocked,WritableStreamAbort=_require5.WritableStreamAbort,WritableStreamDefaultWriterCloseWithErrorPropagation=_require5.WritableStreamDefaultWriterCloseWithErrorPropagation,WritableStreamDefaultWriterRelease=_require5.WritableStreamDefaultWriterRelease,WritableStreamDefaultWriterWrite=_require5.WritableStreamDefaultWriterWrite,InternalCancel=Symbol("[[Cancel]]"),InternalPull=Symbol("[[Pull]]"),ReadableStream=function(){function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.size,l=t.highWaterMark;_classCallCheck(this,e),this._state="readable",this._reader=void 0,this._storedError=void 0,this._disturbed=!1,this._readableStreamController=void 0;var o=r.type,n=String(o);if("bytes"===n)void 0===l&&(l=0),this._readableStreamController=new ReadableByteStreamController(this,r,l);else{if(void 0!==o)throw new RangeError("Invalid type is specified");void 0===l&&(l=1),this._readableStreamController=new ReadableStreamDefaultController(this,r,a,l)}}return _createClass(e,[{key:"cancel",value:function(e){return IsReadableStream(this)===!1?Promise.reject(streamBrandCheckException("cancel")):IsReadableStreamLocked(this)===!0?Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")):ReadableStreamCancel(this,e)}},{key:"getReader",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e.mode;if(IsReadableStream(this)===!1)throw streamBrandCheckException("getReader");if("byob"===r){if(IsReadableByteStreamController(this._readableStreamController)===!1)throw new TypeError("Cannot get a ReadableStreamBYOBReader for a stream not constructed with a byte source");return AcquireReadableStreamBYOBReader(this)}if(void 0===r)return AcquireReadableStreamDefaultReader(this);throw new RangeError("Invalid mode is specified")}},{key:"pipeThrough",value:function(e,r){var t=e.writable,a=e.readable;return this.pipeTo(t,r),a}},{key:"pipeTo",value:function(e){var r=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.preventClose,l=t.preventAbort,o=t.preventCancel;if(IsReadableStream(this)===!1)return Promise.reject(streamBrandCheckException("pipeTo"));if(IsWritableStream(e)===!1)return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));if(a=Boolean(a),l=Boolean(l),o=Boolean(o),IsReadableStreamLocked(this)===!0)return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream"));if(IsWritableStreamLocked(e)===!0)return Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream"));var n=AcquireReadableStreamDefaultReader(this),i=AcquireWritableStreamDefaultWriter(e),d=!1,s=Promise.resolve();return new Promise(function(t,u){function c(){return s=Promise.resolve(),d===!0?Promise.resolve():i._readyPromise.then(function(){return ReadableStreamDefaultReaderRead(n).then(function(e){var r=e.value,t=e.done;if(t!==!0)return s=WritableStreamDefaultWriterWrite(i,r)})}).then(c)}function b(e,r,t){"errored"===e._state?t(e._storedError):r.catch(t).catch(rethrowAssertionErrorRejection)}function R(e,r,t){"closed"===e._state?t():r.then(t).catch(rethrowAssertionErrorRejection)}function m(){return s.catch(function(){})}function f(e,r,t){d!==!0&&(d=!0,m().then(function(){return e().then(function(){return S(r,t)},function(e){return S(!0,e)})}).catch(rethrowAssertionErrorRejection))}function h(e,r){d!==!0&&(d=!0,m().then(function(){S(e,r)}).catch(rethrowAssertionErrorRejection))}function S(e,r){WritableStreamDefaultWriterRelease(i),ReadableStreamReaderGenericRelease(n),e?u(r):t(void 0)}b(r,n._closedPromise,function(r){l===!1?f(function(){return WritableStreamAbort(e,r)},!0,r):h(!0,r)}),b(e,i._closedPromise,function(e){o===!1?f(function(){return ReadableStreamCancel(r,e)},!0,e):h(!0,e)}),R(r,n._closedPromise,function(){a===!1?f(function(){return WritableStreamDefaultWriterCloseWithErrorPropagation(i)}):h()}),"closing"!==e._state&&"closed"!==e._state||!function(){var e=new TypeError("the destination writable stream closed before all data could be piped to it");o===!1?f(function(){return ReadableStreamCancel(r,e)},!0,e):h(!0,e)}(),c().catch(function(e){s=Promise.resolve(),rethrowAssertionErrorRejection(e)})})}},{key:"tee",value:function(){if(IsReadableStream(this)===!1)throw streamBrandCheckException("tee");var e=ReadableStreamTee(this,!1);return createArrayFromList(e)}},{key:"locked",get:function(){if(IsReadableStream(this)===!1)throw streamBrandCheckException("locked");return IsReadableStreamLocked(this)}}]),e}();module.exports={ReadableStream:ReadableStream,IsReadableStreamDisturbed:IsReadableStreamDisturbed,ReadableStreamDefaultControllerClose:ReadableStreamDefaultControllerClose,ReadableStreamDefaultControllerEnqueue:ReadableStreamDefaultControllerEnqueue,ReadableStreamDefaultControllerError:ReadableStreamDefaultControllerError,ReadableStreamDefaultControllerGetDesiredSize:ReadableStreamDefaultControllerGetDesiredSize};var ReadableStreamDefaultReader=function(){function e(r){if(_classCallCheck(this,e),IsReadableStream(r)===!1)throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance");if(IsReadableStreamLocked(r)===!0)throw new TypeError("This stream has already been locked for exclusive reading by another reader");ReadableStreamReaderGenericInitialize(this,r),this._readRequests=[]}return _createClass(e,[{key:"cancel",value:function(e){return IsReadableStreamDefaultReader(this)===!1?Promise.reject(defaultReaderBrandCheckException("cancel")):void 0===this._ownerReadableStream?Promise.reject(readerLockException("cancel")):ReadableStreamReaderGenericCancel(this,e)}},{key:"read",value:function(){return IsReadableStreamDefaultReader(this)===!1?Promise.reject(defaultReaderBrandCheckException("read")):void 0===this._ownerReadableStream?Promise.reject(readerLockException("read from")):ReadableStreamDefaultReaderRead(this)}},{key:"releaseLock",value:function(){if(IsReadableStreamDefaultReader(this)===!1)throw defaultReaderBrandCheckException("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");ReadableStreamReaderGenericRelease(this)}}},{key:"closed",get:function(){return IsReadableStreamDefaultReader(this)===!1?Promise.reject(defaultReaderBrandCheckException("closed")):this._closedPromise}}]),e}(),ReadableStreamBYOBReader=function(){function e(r){if(_classCallCheck(this,e),!IsReadableStream(r))throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source");if(IsReadableStreamLocked(r))throw new TypeError("This stream has already been locked for exclusive reading by another reader");ReadableStreamReaderGenericInitialize(this,r),this._readIntoRequests=[]}return _createClass(e,[{key:"cancel",value:function(e){return IsReadableStreamBYOBReader(this)?void 0===this._ownerReadableStream?Promise.reject(readerLockException("cancel")):ReadableStreamReaderGenericCancel(this,e):Promise.reject(byobReaderBrandCheckException("cancel"))}},{key:"read",value:function(e){return IsReadableStreamBYOBReader(this)?void 0===this._ownerReadableStream?Promise.reject(readerLockException("read from")):ArrayBuffer.isView(e)?0===e.byteLength?Promise.reject(new TypeError("view must have non-zero byteLength")):ReadableStreamBYOBReaderRead(this,e):Promise.reject(new TypeError("view must be an array buffer view")):Promise.reject(byobReaderBrandCheckException("read"))}},{key:"releaseLock",value:function(){if(!IsReadableStreamBYOBReader(this))throw byobReaderBrandCheckException("releaseLock");if(void 0!==this._ownerReadableStream){if(this._readIntoRequests.length>0)throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");ReadableStreamReaderGenericRelease(this)}}},{key:"closed",get:function(){return IsReadableStreamBYOBReader(this)?this._closedPromise:Promise.reject(byobReaderBrandCheckException("closed"))}}]),e}(),ReadableStreamDefaultController=function(){function e(r,t,a,l){if(_classCallCheck(this,e),IsReadableStream(r)===!1)throw new TypeError("ReadableStreamDefaultController can only be constructed with a ReadableStream instance");if(void 0!==r._readableStreamController)throw new TypeError("ReadableStreamDefaultController instances can only be created by the ReadableStream constructor");this._controlledReadableStream=r,this._underlyingSource=t,this._queue=[],this._started=!1,this._closeRequested=!1,this._pullAgain=!1,this._pulling=!1;var o=ValidateAndNormalizeQueuingStrategy(a,l);this._strategySize=o.size,this._strategyHWM=o.highWaterMark;var n=this,i=InvokeOrNoop(t,"start",[this]);Promise.resolve(i).then(function(){n._started=!0,ReadableStreamDefaultControllerCallPullIfNeeded(n)},function(e){ReadableStreamDefaultControllerErrorIfNeeded(n,e)}).catch(rethrowAssertionErrorRejection)}return _createClass(e,[{key:"close",value:function(){if(IsReadableStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("close");if(this._closeRequested===!0)throw new TypeError("The stream has already been closed; do not close it again!");var e=this._controlledReadableStream._state;if("readable"!==e)throw new TypeError("The stream (in "+e+" state) is not in the readable state and cannot be closed");ReadableStreamDefaultControllerClose(this)}},{key:"enqueue",value:function(e){if(IsReadableStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("enqueue");if(this._closeRequested===!0)throw new TypeError("stream is closed or draining");var r=this._controlledReadableStream._state;if("readable"!==r)throw new TypeError("The stream (in "+r+" state) is not in the readable state and cannot be enqueued to");return ReadableStreamDefaultControllerEnqueue(this,e)}},{key:"error",value:function(e){if(IsReadableStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("error");var r=this._controlledReadableStream;if("readable"!==r._state)throw new TypeError("The stream is "+r._state+" and so cannot be errored");ReadableStreamDefaultControllerError(this,e)}},{key:InternalCancel,value:function(e){return this._queue=[],PromiseInvokeOrNoop(this._underlyingSource,"cancel",[e])}},{key:InternalPull,value:function(){var e=this._controlledReadableStream;if(this._queue.length>0){var r=DequeueValue(this._queue);return this._closeRequested===!0&&0===this._queue.length?ReadableStreamClose(e):ReadableStreamDefaultControllerCallPullIfNeeded(this),Promise.resolve(CreateIterResultObject(r,!1))}var t=ReadableStreamAddReadRequest(e);return ReadableStreamDefaultControllerCallPullIfNeeded(this),t}},{key:"desiredSize",get:function(){if(IsReadableStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("desiredSize");return ReadableStreamDefaultControllerGetDesiredSize(this)}}]),e}(),ReadableStreamBYOBRequest=function(){function e(r,t){_classCallCheck(this,e),this._associatedReadableByteStreamController=r,this._view=t}return _createClass(e,[{key:"respond",value:function(e){if(IsReadableStreamBYOBRequest(this)===!1)throw byobRequestBrandCheckException("respond");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController,e)}},{key:"respondWithNewView",value:function(e){if(IsReadableStreamBYOBRequest(this)===!1)throw byobRequestBrandCheckException("respond");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");if(!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController,e)}},{key:"view",get:function(){return this._view}}]),e}(),ReadableByteStreamController=function(){function e(r,t,a){if(_classCallCheck(this,e),IsReadableStream(r)===!1)throw new TypeError("ReadableByteStreamController can only be constructed with a ReadableStream instance given a byte source");if(void 0!==r._readableStreamController)throw new TypeError("ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte source");
  5212. this._controlledReadableStream=r,this._underlyingByteSource=t,this._pullAgain=!1,this._pulling=!1,ReadableByteStreamControllerClearPendingPullIntos(this),this._queue=[],this._totalQueuedBytes=0,this._closeRequested=!1,this._started=!1,this._strategyHWM=ValidateAndNormalizeHighWaterMark(a);var l=t.autoAllocateChunkSize;if(void 0!==l&&(Number.isInteger(l)===!1||l<=0))throw new RangeError("autoAllocateChunkSize must be a positive integer");this._autoAllocateChunkSize=l,this._pendingPullIntos=[];var o=this,n=InvokeOrNoop(t,"start",[this]);Promise.resolve(n).then(function(){o._started=!0,ReadableByteStreamControllerCallPullIfNeeded(o)},function(e){"readable"===r._state&&ReadableByteStreamControllerError(o,e)}).catch(rethrowAssertionErrorRejection)}return _createClass(e,[{key:"close",value:function(){if(IsReadableByteStreamController(this)===!1)throw byteStreamControllerBrandCheckException("close");if(this._closeRequested===!0)throw new TypeError("The stream has already been closed; do not close it again!");var e=this._controlledReadableStream._state;if("readable"!==e)throw new TypeError("The stream (in "+e+" state) is not in the readable state and cannot be closed");ReadableByteStreamControllerClose(this)}},{key:"enqueue",value:function(e){if(IsReadableByteStreamController(this)===!1)throw byteStreamControllerBrandCheckException("enqueue");if(this._closeRequested===!0)throw new TypeError("stream is closed or draining");var r=this._controlledReadableStream._state;if("readable"!==r)throw new TypeError("The stream (in "+r+" state) is not in the readable state and cannot be enqueued to");if(!ArrayBuffer.isView(e))throw new TypeError("You can only enqueue array buffer views when using a ReadableByteStreamController");ReadableByteStreamControllerEnqueue(this,e)}},{key:"error",value:function(e){if(IsReadableByteStreamController(this)===!1)throw byteStreamControllerBrandCheckException("error");var r=this._controlledReadableStream;if("readable"!==r._state)throw new TypeError("The stream is "+r._state+" and so cannot be errored");ReadableByteStreamControllerError(this,e)}},{key:InternalCancel,value:function(e){if(this._pendingPullIntos.length>0){var r=this._pendingPullIntos[0];r.bytesFilled=0}return this._queue=[],this._totalQueuedBytes=0,PromiseInvokeOrNoop(this._underlyingByteSource,"cancel",[e])}},{key:InternalPull,value:function(){var e=this._controlledReadableStream;if(0===ReadableStreamGetNumReadRequests(e)){if(this._totalQueuedBytes>0){var r=this._queue.shift();this._totalQueuedBytes-=r.byteLength,ReadableByteStreamControllerHandleQueueDrain(this);var t=void 0;try{t=new Uint8Array(r.buffer,r.byteOffset,r.byteLength)}catch(e){return Promise.reject(e)}return Promise.resolve(CreateIterResultObject(t,!1))}var a=this._autoAllocateChunkSize;if(void 0!==a){var l=void 0;try{l=new ArrayBuffer(a)}catch(e){return Promise.reject(e)}var o={buffer:l,byteOffset:0,byteLength:a,bytesFilled:0,elementSize:1,ctor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o)}}var n=ReadableStreamAddReadRequest(e);return ReadableByteStreamControllerCallPullIfNeeded(this),n}},{key:"byobRequest",get:function(){if(IsReadableByteStreamController(this)===!1)throw byteStreamControllerBrandCheckException("byobRequest");if(void 0===this._byobRequest&&this._pendingPullIntos.length>0){var e=this._pendingPullIntos[0],r=new Uint8Array(e.buffer,e.byteOffset+e.bytesFilled,e.byteLength-e.bytesFilled);this._byobRequest=new ReadableStreamBYOBRequest(this,r)}return this._byobRequest}},{key:"desiredSize",get:function(){if(IsReadableByteStreamController(this)===!1)throw byteStreamControllerBrandCheckException("desiredSize");return ReadableByteStreamControllerGetDesiredSize(this)}}]),e}();
  5213.  
  5214. },{"./helpers.js":5,"./queue-with-sizes.js":6,"./utils.js":2,"./writable-stream.js":9}],8:[function(_dereq_,module,exports){
  5215. "use strict";function _classCallCheck(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function TransformStreamCloseReadable(r){if(r._errored===!0)throw new TypeError("TransformStream is already errored");if(r._readableClosed===!0)throw new TypeError("Readable side is already closed");TransformStreamCloseReadableInternal(r)}function TransformStreamEnqueueToReadable(r,e){if(r._errored===!0)throw new TypeError("TransformStream is already errored");if(r._readableClosed===!0)throw new TypeError("Readable side is already closed");var a=r._readableController;try{ReadableStreamDefaultControllerEnqueue(a,e)}catch(e){throw r._readableClosed=!0,TransformStreamErrorIfNeeded(r,e),r._storedError}var t=ReadableStreamDefaultControllerGetDesiredSize(a),o=t<=0;o===!0&&r._backpressure===!1&&TransformStreamSetBackpressure(r,!0)}function TransformStreamError(r,e){if(r._errored===!0)throw new TypeError("TransformStream is already errored");TransformStreamErrorInternal(r,e)}function TransformStreamCloseReadableInternal(r){try{ReadableStreamDefaultControllerClose(r._readableController)}catch(r){}r._readableClosed=!0}function TransformStreamErrorIfNeeded(r,e){r._errored===!1&&TransformStreamErrorInternal(r,e)}function TransformStreamErrorInternal(r,e){r._errored=!0,r._storedError=e,r._writableDone===!1&&WritableStreamDefaultControllerError(r._writableController,e),r._readableClosed===!1&&ReadableStreamDefaultControllerError(r._readableController,e)}function TransformStreamReadableReadyPromise(r){return r._backpressure===!1?Promise.resolve():r._backpressureChangePromise}function TransformStreamSetBackpressure(r,e){void 0!==r._backpressureChangePromise&&r._backpressureChangePromise_resolve(e),r._backpressureChangePromise=new Promise(function(e){r._backpressureChangePromise_resolve=e}),r._backpressureChangePromise.then(function(r){}),r._backpressure=e}function TransformStreamDefaultTransform(r,e){var a=e._controlledTransformStream;return TransformStreamEnqueueToReadable(a,r),Promise.resolve()}function TransformStreamTransform(r,e){r._transforming=!0;var a=r._transformer,t=r._transformStreamController,o=PromiseInvokeOrPerformFallback(a,"transform",[e,t],TransformStreamDefaultTransform,[e,t]);return o.then(function(){return r._transforming=!1,TransformStreamReadableReadyPromise(r)},function(e){return TransformStreamErrorIfNeeded(r,e),Promise.reject(e)})}function IsTransformStreamDefaultController(r){return!!typeIsObject(r)&&!!Object.prototype.hasOwnProperty.call(r,"_controlledTransformStream")}function IsTransformStream(r){return!!typeIsObject(r)&&!!Object.prototype.hasOwnProperty.call(r,"_transformStreamController")}function defaultControllerBrandCheckException(r){return new TypeError("TransformStreamDefaultController.prototype."+r+" can only be used on a TransformStreamDefaultController")}function streamBrandCheckException(r){return new TypeError("TransformStream.prototype."+r+" can only be used on a TransformStream")}var _createClass=function(){function r(r,e){for(var a=0;a<e.length;a++){var t=e[a];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,t.key,t)}}return function(e,a,t){return a&&r(e.prototype,a),t&&r(e,t),e}}(),_require=_dereq_("./helpers.js"),InvokeOrNoop=_require.InvokeOrNoop,PromiseInvokeOrPerformFallback=_require.PromiseInvokeOrPerformFallback,PromiseInvokeOrNoop=_require.PromiseInvokeOrNoop,typeIsObject=_require.typeIsObject,_require2=_dereq_("./readable-stream.js"),ReadableStream=_require2.ReadableStream,ReadableStreamDefaultControllerClose=_require2.ReadableStreamDefaultControllerClose,ReadableStreamDefaultControllerEnqueue=_require2.ReadableStreamDefaultControllerEnqueue,ReadableStreamDefaultControllerError=_require2.ReadableStreamDefaultControllerError,ReadableStreamDefaultControllerGetDesiredSize=_require2.ReadableStreamDefaultControllerGetDesiredSize,_require3=_dereq_("./writable-stream.js"),WritableStream=_require3.WritableStream,WritableStreamDefaultControllerError=_require3.WritableStreamDefaultControllerError,TransformStreamSink=function(){function r(e,a){_classCallCheck(this,r),this._transformStream=e,this._startPromise=a}return _createClass(r,[{key:"start",value:function(r){var e=this._transformStream;return e._writableController=r,this._startPromise.then(function(){return TransformStreamReadableReadyPromise(e)})}},{key:"write",value:function(r){var e=this._transformStream;return TransformStreamTransform(e,r)}},{key:"abort",value:function(){var r=this._transformStream;r._writableDone=!0,TransformStreamErrorInternal(r,new TypeError("Writable side aborted"))}},{key:"close",value:function(){var r=this._transformStream;r._writableDone=!0;var e=PromiseInvokeOrNoop(r._transformer,"flush",[r._transformStreamController]);return e.then(function(){return r._errored===!0?Promise.reject(r._storedError):(r._readableClosed===!1&&TransformStreamCloseReadableInternal(r),Promise.resolve())}).catch(function(e){return TransformStreamErrorIfNeeded(r,e),Promise.reject(r._storedError)})}}]),r}(),TransformStreamSource=function(){function r(e,a){_classCallCheck(this,r),this._transformStream=e,this._startPromise=a}return _createClass(r,[{key:"start",value:function(r){var e=this._transformStream;return e._readableController=r,this._startPromise.then(function(){return e._backpressure===!0?Promise.resolve():e._backpressureChangePromise})}},{key:"pull",value:function(){var r=this._transformStream;return TransformStreamSetBackpressure(r,!1),r._backpressureChangePromise}},{key:"cancel",value:function(){var r=this._transformStream;r._readableClosed=!0,TransformStreamErrorInternal(r,new TypeError("Readable side canceled"))}}]),r}(),TransformStreamDefaultController=function(){function r(e){if(_classCallCheck(this,r),IsTransformStream(e)===!1)throw new TypeError("TransformStreamDefaultController can only be constructed with a TransformStream instance");if(void 0!==e._transformStreamController)throw new TypeError("TransformStreamDefaultController instances can only be created by the TransformStream constructor");this._controlledTransformStream=e}return _createClass(r,[{key:"enqueue",value:function(r){if(IsTransformStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("enqueue");TransformStreamEnqueueToReadable(this._controlledTransformStream,r)}},{key:"close",value:function(){if(IsTransformStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("close");TransformStreamCloseReadable(this._controlledTransformStream)}},{key:"error",value:function(r){if(IsTransformStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("error");TransformStreamError(this._controlledTransformStream,r)}},{key:"desiredSize",get:function(){if(IsTransformStreamDefaultController(this)===!1)throw defaultControllerBrandCheckException("desiredSize");var r=this._controlledTransformStream,e=r._readableController;return ReadableStreamDefaultControllerGetDesiredSize(e)}}]),r}(),TransformStream=function(){function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};_classCallCheck(this,r),this._transformer=e;var a=e.readableStrategy,t=e.writableStrategy;this._transforming=!1,this._errored=!1,this._storedError=void 0,this._writableController=void 0,this._readableController=void 0,this._transformStreamController=void 0,this._writableDone=!1,this._readableClosed=!1,this._backpressure=void 0,this._backpressureChangePromise=void 0,this._backpressureChangePromise_resolve=void 0,this._transformStreamController=new TransformStreamDefaultController(this);var o=void 0,n=new Promise(function(r){o=r}),s=new TransformStreamSource(this,n);this._readable=new ReadableStream(s,a);var l=new TransformStreamSink(this,n);this._writable=new WritableStream(l,t);var i=ReadableStreamDefaultControllerGetDesiredSize(this._readableController);TransformStreamSetBackpressure(this,i<=0);var m=this,f=InvokeOrNoop(e,"start",[m._transformStreamController]);o(f),n.catch(function(r){m._errored===!1&&(m._errored=!0,m._storedError=r)})}return _createClass(r,[{key:"readable",get:function(){if(IsTransformStream(this)===!1)throw streamBrandCheckException("readable");return this._readable}},{key:"writable",get:function(){if(IsTransformStream(this)===!1)throw streamBrandCheckException("writable");return this._writable}}]),r}();module.exports={TransformStream:TransformStream};
  5216.  
  5217. },{"./helpers.js":5,"./readable-stream.js":7,"./writable-stream.js":9}],9:[function(_dereq_,module,exports){
  5218. "use strict";function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function AcquireWritableStreamDefaultWriter(e){return new WritableStreamDefaultWriter(e)}function IsWritableStream(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")}function IsWritableStreamLocked(e){return void 0!==e._writer}function WritableStreamAbort(e,r){var t=e._state;if("closed"===t)return Promise.resolve(void 0);if("errored"===t)return Promise.reject(e._storedError);var i=new TypeError("Aborted");WritableStreamError(e,i);var o=e._writableStreamController;if(o._writing===!0||o._inClose===!0){var a=new Promise(function(r,t){var i={_resolve:r,_reject:t};e._pendingAbortRequest=i});return o._writing===!0?a.then(function(){return WritableStreamDefaultControllerAbort(e._writableStreamController,r)}):a}return WritableStreamDefaultControllerAbort(e._writableStreamController,r)}function WritableStreamAddWriteRequest(e){var r=new Promise(function(r,t){var i={_resolve:r,_reject:t};e._writeRequests.push(i)});return r}function WritableStreamError(e,r){var t=e._state;e._state="errored",e._storedError=r;var i=e._writableStreamController;(void 0===i||i._writing===!1&&i._inClose===!1)&&WritableStreamRejectPromisesInReactionToError(e);var o=e._writer;void 0!==o&&("writable"===t&&WritableStreamDefaultControllerGetBackpressure(e._writableStreamController)===!0?defaultWriterReadyPromiseReject(o,r):defaultWriterReadyPromiseResetToRejected(o,r),o._readyPromise.catch(function(){}))}function WritableStreamFinishClose(e){"closing"===e._state?(defaultWriterClosedPromiseResolve(e._writer),e._state="closed"):(defaultWriterClosedPromiseReject(e._writer,e._storedError),e._writer._closedPromise.catch(function(){})),void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)}function WritableStreamRejectPromisesInReactionToError(e){var r=e._storedError,t=!0,i=!1,o=void 0;try{for(var a,l=e._writeRequests[Symbol.iterator]();!(t=(a=l.next()).done);t=!0){var n=a.value;n._reject(r)}}catch(e){i=!0,o=e}finally{try{!t&&l.return&&l.return()}finally{if(i)throw o}}e._writeRequests=[],void 0!==e._pendingCloseRequest&&(e._pendingCloseRequest._reject(r),e._pendingCloseRequest=void 0);var s=e._writer;void 0!==s&&(defaultWriterClosedPromiseReject(s,r),s._closedPromise.catch(function(){}))}function WritableStreamUpdateBackpressure(e,r){var t=e._writer;void 0!==t&&(r===!0?defaultWriterReadyPromiseReset(t):defaultWriterReadyPromiseResolve(t))}function IsWritableStreamDefaultWriter(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")}function WritableStreamDefaultWriterAbort(e,r){var t=e._ownerWritableStream;return WritableStreamAbort(t,r)}function WritableStreamDefaultWriterClose(e){var r=e._ownerWritableStream,t=r._state;if("closed"===t||"errored"===t)return Promise.reject(new TypeError("The stream (in "+t+" state) is not in the writable state and cannot be closed"));var i=new Promise(function(e,t){var i={_resolve:e,_reject:t};r._pendingCloseRequest=i});return WritableStreamDefaultControllerGetBackpressure(r._writableStreamController)===!0&&defaultWriterReadyPromiseResolve(e),r._state="closing",WritableStreamDefaultControllerClose(r._writableStreamController),i}function WritableStreamDefaultWriterCloseWithErrorPropagation(e){var r=e._ownerWritableStream,t=r._state;return"closing"===t||"closed"===t?Promise.resolve():"errored"===t?Promise.reject(r._storedError):WritableStreamDefaultWriterClose(e)}function WritableStreamDefaultWriterGetDesiredSize(e){var r=e._ownerWritableStream,t=r._state;return"errored"===t?null:"closed"===t?0:WritableStreamDefaultControllerGetDesiredSize(r._writableStreamController)}function WritableStreamDefaultWriterRelease(e){var r=e._ownerWritableStream,t=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness"),i=r._state;"writable"===i||"closing"===i||void 0!==r._pendingAbortRequest?defaultWriterClosedPromiseReject(e,t):defaultWriterClosedPromiseResetToRejected(e,t),e._closedPromise.catch(function(){}),"writable"===i&&WritableStreamDefaultControllerGetBackpressure(r._writableStreamController)===!0?defaultWriterReadyPromiseReject(e,t):defaultWriterReadyPromiseResetToRejected(e,t),e._readyPromise.catch(function(){}),r._writer=void 0,e._ownerWritableStream=void 0}function WritableStreamDefaultWriterWrite(e,r){var t=e._ownerWritableStream,i=t._state;if("closed"===i||"errored"===i)return Promise.reject(new TypeError("The stream (in "+i+" state) is not in the writable state and cannot be written to"));var o=WritableStreamAddWriteRequest(t);return WritableStreamDefaultControllerWrite(t._writableStreamController,r),o}function WritableStreamDefaultControllerAbort(e,r){e._queue=[];var t=PromiseInvokeOrFallbackOrNoop(e._underlyingSink,"abort",[r],"close",[e]);return t.then(function(){})}function WritableStreamDefaultControllerClose(e){EnqueueValueWithSize(e._queue,"close",0),WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)}function WritableStreamDefaultControllerGetDesiredSize(e){var r=GetTotalQueueSize(e._queue);return e._strategyHWM-r}function WritableStreamDefaultControllerWrite(e,r){var t=e._controlledWritableStream,i=1;if(void 0!==e._strategySize)try{i=e._strategySize(r)}catch(r){return void WritableStreamDefaultControllerErrorIfNeeded(e,r)}var o={chunk:r},a=WritableStreamDefaultControllerGetBackpressure(e);try{EnqueueValueWithSize(e._queue,o,i)}catch(r){return void WritableStreamDefaultControllerErrorIfNeeded(e,r)}if("writable"===t._state){var l=WritableStreamDefaultControllerGetBackpressure(e);a!==l&&WritableStreamUpdateBackpressure(t,l)}WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)}function IsWritableStreamDefaultController(e){return!!typeIsObject(e)&&!!Object.prototype.hasOwnProperty.call(e,"_underlyingSink")}function WritableStreamDefaultControllerAdvanceQueueIfNeeded(e){if("closed"!==e._controlledWritableStream._state&&"errored"!==e._controlledWritableStream._state&&e._started!==!1&&e._writing!==!0&&0!==e._queue.length){var r=PeekQueueValue(e._queue);"close"===r?WritableStreamDefaultControllerProcessClose(e):WritableStreamDefaultControllerProcessWrite(e,r.chunk)}}function WritableStreamDefaultControllerErrorIfNeeded(e,r){"writable"!==e._controlledWritableStream._state&&"closing"!==e._controlledWritableStream._state||WritableStreamDefaultControllerError(e,r)}function WritableStreamDefaultControllerProcessClose(e){var r=e._controlledWritableStream;DequeueValue(e._queue),e._inClose=!0;var t=PromiseInvokeOrNoop(e._underlyingSink,"close",[e]);t.then(function(){e._inClose=!1,"closing"!==r._state&&"errored"!==r._state||(r._pendingCloseRequest._resolve(void 0),r._pendingCloseRequest=void 0,WritableStreamFinishClose(r))},function(t){e._inClose=!1,r._pendingCloseRequest._reject(t),r._pendingCloseRequest=void 0,void 0!==r._pendingAbortRequest&&(r._pendingAbortRequest._reject(t),r._pendingAbortRequest=void 0),WritableStreamDefaultControllerErrorIfNeeded(e,t)}).catch(rethrowAssertionErrorRejection)}function WritableStreamDefaultControllerProcessWrite(e,r){e._writing=!0;var t=e._controlledWritableStream;t._pendingWriteRequest=t._writeRequests.shift();var i=PromiseInvokeOrNoop(e._underlyingSink,"write",[r,e]);i.then(function(){var r=t._state;if(e._writing=!1,t._pendingWriteRequest._resolve(void 0),t._pendingWriteRequest=void 0,"errored"===r)return WritableStreamRejectPromisesInReactionToError(t),void(void 0!==t._pendingAbortRequest&&(t._pendingAbortRequest._resolve(),t._pendingAbortRequest=void 0));var i=WritableStreamDefaultControllerGetBackpressure(e);if(DequeueValue(e._queue),"closing"!==r){var o=WritableStreamDefaultControllerGetBackpressure(e);i!==o&&WritableStreamUpdateBackpressure(e._controlledWritableStream,o)}WritableStreamDefaultControllerAdvanceQueueIfNeeded(e)},function(r){e._writing=!1,t._pendingWriteRequest._reject(r),t._pendingWriteRequest=void 0,"errored"===t._state&&(t._storedError=r,WritableStreamRejectPromisesInReactionToError(t)),void 0!==t._pendingAbortRequest&&(t._pendingAbortRequest._reject(r),t._pendingAbortRequest=void 0),WritableStreamDefaultControllerErrorIfNeeded(e,r)}).catch(rethrowAssertionErrorRejection)}function WritableStreamDefaultControllerGetBackpressure(e){var r=WritableStreamDefaultControllerGetDesiredSize(e);return r<=0}function WritableStreamDefaultControllerError(e,r){var t=e._controlledWritableStream;WritableStreamError(t,r),e._queue=[]}function streamBrandCheckException(e){return new TypeError("WritableStream.prototype."+e+" can only be used on a WritableStream")}function defaultWriterBrandCheckException(e){return new TypeError("WritableStreamDefaultWriter.prototype."+e+" can only be used on a WritableStreamDefaultWriter")}function defaultWriterLockException(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function defaultWriterClosedPromiseInitialize(e){e._closedPromise=new Promise(function(r,t){e._closedPromise_resolve=r,e._closedPromise_reject=t})}function defaultWriterClosedPromiseInitializeAsRejected(e,r){e._closedPromise=Promise.reject(r),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultWriterClosedPromiseInitializeAsResolved(e){e._closedPromise=Promise.resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultWriterClosedPromiseReject(e,r){e._closedPromise_reject(r),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultWriterClosedPromiseResetToRejected(e,r){e._closedPromise=Promise.reject(r)}function defaultWriterClosedPromiseResolve(e){e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function defaultWriterReadyPromiseInitialize(e){e._readyPromise=new Promise(function(r,t){e._readyPromise_resolve=r,e._readyPromise_reject=t})}function defaultWriterReadyPromiseInitializeAsResolved(e){e._readyPromise=Promise.resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0}function defaultWriterReadyPromiseReject(e,r){e._readyPromise_reject(r),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0}function defaultWriterReadyPromiseReset(e){e._readyPromise=new Promise(function(r,t){e._readyPromise_resolve=r,e._readyPromise_reject=t})}function defaultWriterReadyPromiseResetToRejected(e,r){e._readyPromise=Promise.reject(r)}function defaultWriterReadyPromiseResolve(e){e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0}var _createClass=function(){function e(e,r){for(var t=0;t<r.length;t++){var i=r[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(r,t,i){return t&&e(r.prototype,t),i&&e(r,i),r}}(),_require=_dereq_("./helpers.js"),InvokeOrNoop=_require.InvokeOrNoop,PromiseInvokeOrNoop=_require.PromiseInvokeOrNoop,PromiseInvokeOrFallbackOrNoop=_require.PromiseInvokeOrFallbackOrNoop,ValidateAndNormalizeQueuingStrategy=_require.ValidateAndNormalizeQueuingStrategy,typeIsObject=_require.typeIsObject,_require2=_dereq_("./utils.js"),rethrowAssertionErrorRejection=_require2.rethrowAssertionErrorRejection,_require3=_dereq_("./queue-with-sizes.js"),DequeueValue=_require3.DequeueValue,EnqueueValueWithSize=_require3.EnqueueValueWithSize,GetTotalQueueSize=_require3.GetTotalQueueSize,PeekQueueValue=_require3.PeekQueueValue,WritableStream=function(){function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.size,o=t.highWaterMark,a=void 0===o?1:o;_classCallCheck(this,e),this._state="writable",this._storedError=void 0,this._writer=void 0,this._writableStreamController=void 0,this._writeRequests=[],this._pendingWriteRequest=void 0,this._pendingCloseRequest=void 0,this._pendingAbortRequest=void 0;var l=r.type;if(void 0!==l)throw new RangeError("Invalid type is specified");this._writableStreamController=new WritableStreamDefaultController(this,r,i,a)}return _createClass(e,[{key:"abort",value:function(e){return IsWritableStream(this)===!1?Promise.reject(streamBrandCheckException("abort")):IsWritableStreamLocked(this)===!0?Promise.reject(new TypeError("Cannot abort a stream that already has a writer")):WritableStreamAbort(this,e)}},{key:"getWriter",value:function(){if(IsWritableStream(this)===!1)throw streamBrandCheckException("getWriter");return AcquireWritableStreamDefaultWriter(this)}},{key:"locked",get:function(){if(IsWritableStream(this)===!1)throw streamBrandCheckException("locked");return IsWritableStreamLocked(this)}}]),e}();module.exports={AcquireWritableStreamDefaultWriter:AcquireWritableStreamDefaultWriter,IsWritableStream:IsWritableStream,IsWritableStreamLocked:IsWritableStreamLocked,WritableStream:WritableStream,WritableStreamAbort:WritableStreamAbort,WritableStreamDefaultControllerError:WritableStreamDefaultControllerError,WritableStreamDefaultWriterCloseWithErrorPropagation:WritableStreamDefaultWriterCloseWithErrorPropagation,WritableStreamDefaultWriterRelease:WritableStreamDefaultWriterRelease,WritableStreamDefaultWriterWrite:WritableStreamDefaultWriterWrite};var WritableStreamDefaultWriter=function(){function e(r){if(_classCallCheck(this,e),IsWritableStream(r)===!1)throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance");if(IsWritableStreamLocked(r)===!0)throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=r,r._writer=this;var t=r._state;"writable"===t||"closing"===t?defaultWriterClosedPromiseInitialize(this):"closed"===t?defaultWriterClosedPromiseInitializeAsResolved(this):(defaultWriterClosedPromiseInitializeAsRejected(this,r._storedError),this._closedPromise.catch(function(){})),"writable"===t&&WritableStreamDefaultControllerGetBackpressure(r._writableStreamController)===!0?defaultWriterReadyPromiseInitialize(this):defaultWriterReadyPromiseInitializeAsResolved(this,void 0)}return _createClass(e,[{key:"abort",value:function(e){return IsWritableStreamDefaultWriter(this)===!1?Promise.reject(defaultWriterBrandCheckException("abort")):void 0===this._ownerWritableStream?Promise.reject(defaultWriterLockException("abort")):WritableStreamDefaultWriterAbort(this,e)}},{key:"close",value:function(){if(IsWritableStreamDefaultWriter(this)===!1)return Promise.reject(defaultWriterBrandCheckException("close"));var e=this._ownerWritableStream;return void 0===e?Promise.reject(defaultWriterLockException("close")):"closing"===e._state?Promise.reject(new TypeError("cannot close an already-closing stream")):WritableStreamDefaultWriterClose(this)}},{key:"releaseLock",value:function(){if(IsWritableStreamDefaultWriter(this)===!1)throw defaultWriterBrandCheckException("releaseLock");var e=this._ownerWritableStream;void 0!==e&&WritableStreamDefaultWriterRelease(this)}},{key:"write",value:function(e){if(IsWritableStreamDefaultWriter(this)===!1)return Promise.reject(defaultWriterBrandCheckException("write"));var r=this._ownerWritableStream;return void 0===r?Promise.reject(defaultWriterLockException("write to")):"closing"===r._state?Promise.reject(new TypeError("Cannot write to an already-closed stream")):WritableStreamDefaultWriterWrite(this,e)}},{key:"closed",get:function(){return IsWritableStreamDefaultWriter(this)===!1?Promise.reject(defaultWriterBrandCheckException("closed")):this._closedPromise}},{key:"desiredSize",get:function(){if(IsWritableStreamDefaultWriter(this)===!1)throw defaultWriterBrandCheckException("desiredSize");if(void 0===this._ownerWritableStream)throw defaultWriterLockException("desiredSize");return WritableStreamDefaultWriterGetDesiredSize(this)}},{key:"ready",get:function(){return IsWritableStreamDefaultWriter(this)===!1?Promise.reject(defaultWriterBrandCheckException("ready")):this._readyPromise}}]),e}(),WritableStreamDefaultController=function(){function e(r,t,i,o){if(_classCallCheck(this,e),IsWritableStream(r)===!1)throw new TypeError("WritableStreamDefaultController can only be constructed with a WritableStream instance");if(void 0!==r._writableStreamController)throw new TypeError("WritableStreamDefaultController instances can only be created by the WritableStream constructor");this._controlledWritableStream=r,this._underlyingSink=t,this._queue=[],this._started=!1,this._writing=!1,this._inClose=!1;var a=ValidateAndNormalizeQueuingStrategy(i,o);this._strategySize=a.size,this._strategyHWM=a.highWaterMark;var l=WritableStreamDefaultControllerGetBackpressure(this);l===!0&&WritableStreamUpdateBackpressure(r,l);var n=this,s=InvokeOrNoop(t,"start",[this]);Promise.resolve(s).then(function(){n._started=!0,WritableStreamDefaultControllerAdvanceQueueIfNeeded(n)},function(e){WritableStreamDefaultControllerErrorIfNeeded(n,e)}).catch(rethrowAssertionErrorRejection)}return _createClass(e,[{key:"error",value:function(e){if(IsWritableStreamDefaultController(this)===!1)throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController");var r=this._controlledWritableStream._state;if("closed"===r||"errored"===r)throw new TypeError("The stream is "+r+" and so cannot be errored");WritableStreamDefaultControllerError(this,e)}}]),e}();
  5219.  
  5220. },{"./helpers.js":5,"./queue-with-sizes.js":6,"./utils.js":2}]},{},[1])(1)
  5221. });
  5222. //# sourceMappingURL=polyfill.min.js.map
  5223.  
  5224.  
  5225. /***/ }),
  5226. /* 22 */
  5227. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5228.  
  5229. "use strict";
  5230. Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
  5231.  
  5232. // CONCATENATED MODULE: ../node_modules/fetch-readablestream/src/fetch.js
  5233. // thin wrapper around `fetch()` to ensure we only expose the properties provided by
  5234. // the XHR polyfil; / fetch-readablestream Response API.
  5235. function fetchRequest(url, options) {
  5236. return fetch(url, options)
  5237. .then(r => {
  5238. return {
  5239. body: r.body,
  5240. headers: r.headers,
  5241. ok: r.ok,
  5242. status: r.status,
  5243. statusText: r.statusText,
  5244. url: r.url
  5245. };
  5246. });
  5247. }
  5248.  
  5249. // CONCATENATED MODULE: ../node_modules/fetch-readablestream/src/polyfill/Headers.js
  5250. // Headers is a partial polyfill for the HTML5 Headers class.
  5251. class Headers_Headers {
  5252. constructor(h = {}) {
  5253. this.h = {};
  5254. if (h instanceof Headers_Headers) {
  5255. h.forEach((value, key) => this.append(key, value));
  5256. }
  5257. Object.getOwnPropertyNames(h)
  5258. .forEach(key => this.append(key, h[key]));
  5259. }
  5260. append(key, value) {
  5261. key = key.toLowerCase();
  5262. if (!Array.isArray(this.h[key])) {
  5263. this.h[key] = [];
  5264. }
  5265. this.h[key].push(value);
  5266. }
  5267. set(key, value) {
  5268. this.h[key.toLowerCase()] = [ value ];
  5269. }
  5270. has(key) {
  5271. return Array.isArray(this.h[key.toLowerCase()]);
  5272. }
  5273. get(key) {
  5274. key = key.toLowerCase();
  5275. if (Array.isArray(this.h[key])) {
  5276. return this.h[key][0];
  5277. }
  5278. }
  5279. getAll(key) {
  5280. return this.h[key.toLowerCase()].concat();
  5281. }
  5282. entries() {
  5283. const items = [];
  5284. this.forEach((value, key) => { items.push([key, value]) });
  5285. return makeIterator(items);
  5286. }
  5287.  
  5288. // forEach is not part of the official spec.
  5289. forEach(callback, thisArg) {
  5290. Object.getOwnPropertyNames(this.h)
  5291. .forEach(key => {
  5292. this.h[key].forEach(value => callback.call(thisArg, value, key, this));
  5293. }, this);
  5294. }
  5295. }
  5296.  
  5297. function makeIterator(items) {
  5298. return {
  5299. next() {
  5300. const value = items.shift();
  5301. return {
  5302. done: value === undefined,
  5303. value: value
  5304. }
  5305. },
  5306. [Symbol.iterator]() {
  5307. return this;
  5308. }
  5309. };
  5310. }
  5311. // CONCATENATED MODULE: ../node_modules/fetch-readablestream/src/xhr.js
  5312. /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_original__ = __webpack_require__(23);
  5313. /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_original___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_original__);
  5314.  
  5315.  
  5316.  
  5317. function makeXhrTransport({ responseType, responseParserFactory }) {
  5318. return function xhrTransport(url, options) {
  5319. const xhr = new XMLHttpRequest();
  5320. const responseParser = responseParserFactory();
  5321.  
  5322. let responseStreamController;
  5323. let cancelled = false;
  5324.  
  5325. const responseStream = new ReadableStream({
  5326. start(c) {
  5327. responseStreamController = c
  5328. },
  5329. cancel() {
  5330. cancelled = true;
  5331. xhr.abort()
  5332. }
  5333. });
  5334.  
  5335. const { method = 'GET' } = options;
  5336.  
  5337. xhr.open(method, url);
  5338. xhr.responseType = responseType;
  5339. xhr.withCredentials = (options.credentials === 'include' || (options.credentials === 'same-origin' && __WEBPACK_IMPORTED_MODULE_1_original___default.a.same(url, location.origin)));
  5340. if (options.headers) {
  5341. for (const pair of options.headers.entries()) {
  5342. xhr.setRequestHeader(pair[0], pair[1]);
  5343. }
  5344. }
  5345.  
  5346. return new Promise((resolve, reject) => {
  5347. if (options.body && (method === 'GET' || method === 'HEAD')) {
  5348. reject(new TypeError("Failed to execute 'fetchStream' on 'Window': Request with GET/HEAD method cannot have body"))
  5349. }
  5350.  
  5351. xhr.onreadystatechange = function () {
  5352. if (xhr.readyState === xhr.HEADERS_RECEIVED) {
  5353. return resolve({
  5354. body: responseStream,
  5355. headers: parseResposneHeaders(xhr.getAllResponseHeaders()),
  5356. ok: xhr.status >= 200 && xhr.status < 300,
  5357. status: xhr.status,
  5358. statusText: xhr.statusText,
  5359. url: makeResponseUrl(xhr.responseURL, url)
  5360. });
  5361. }
  5362. };
  5363.  
  5364. xhr.onerror = function () {
  5365. return reject(new TypeError('Network request failed'));
  5366. };
  5367.  
  5368. xhr.ontimeout = function() {
  5369. reject(new TypeError('Network request failed'))
  5370. };
  5371.  
  5372. xhr.onprogress = function () {
  5373. if (!cancelled) {
  5374. const bytes = responseParser(xhr.response);
  5375. responseStreamController.enqueue(bytes);
  5376. }
  5377. };
  5378.  
  5379. xhr.onload = function () {
  5380. responseStreamController.close();
  5381. };
  5382.  
  5383. xhr.send(options.body);
  5384. });
  5385. }
  5386. }
  5387.  
  5388. function makeHeaders() {
  5389. // Prefer the native method if provided by the browser.
  5390. if (typeof Headers !== 'undefined') {
  5391. return new Headers();
  5392. }
  5393. return new Headers_Headers();
  5394. }
  5395.  
  5396. function makeResponseUrl(responseUrl, requestUrl) {
  5397. if (!responseUrl) {
  5398. // best guess; note this will not correctly handle redirects.
  5399. if (requestUrl.substring(0, 4) !== "http") {
  5400. return location.origin + requestUrl;
  5401. }
  5402. return requestUrl;
  5403. }
  5404. return responseUrl;
  5405. }
  5406.  
  5407. function parseResposneHeaders(str) {
  5408. const hdrs = makeHeaders();
  5409. if (str) {
  5410. const pairs = str.split('\u000d\u000a');
  5411. for (let i = 0; i < pairs.length; i++) {
  5412. const p = pairs[i];
  5413. const index = p.indexOf('\u003a\u0020');
  5414. if (index > 0) {
  5415. const key = p.substring(0, index);
  5416. const value = p.substring(index + 2);
  5417. hdrs.append(key, value);
  5418. }
  5419. }
  5420. }
  5421. return hdrs;
  5422. }
  5423. // CONCATENATED MODULE: ../node_modules/fetch-readablestream/src/defaultTransportFactory.js
  5424.  
  5425.  
  5426.  
  5427. // selected is used to cache the detected transport.
  5428. let selected = null;
  5429.  
  5430. // defaultTransportFactory selects the most appropriate transport based on the
  5431. // capabilities of the current environment.
  5432. function defaultTransportFactory() {
  5433. if (!selected) {
  5434. selected = detectTransport();
  5435. }
  5436. return selected;
  5437. }
  5438.  
  5439. function detectTransport() {
  5440. if (typeof Response !== 'undefined' && Response.prototype.hasOwnProperty("body")) {
  5441. // fetch with ReadableStream support.
  5442. return fetchRequest;
  5443. }
  5444.  
  5445. const mozChunked = 'moz-chunked-arraybuffer';
  5446. if (supportsXhrResponseType(mozChunked)) {
  5447. // Firefox, ArrayBuffer support.
  5448. return makeXhrTransport({
  5449. responseType: mozChunked,
  5450. responseParserFactory: function () {
  5451. return response => new Uint8Array(response);
  5452. }
  5453. });
  5454. }
  5455.  
  5456. // Bog-standard, expensive, text concatenation with byte encoding :(
  5457. return makeXhrTransport({
  5458. responseType: 'text',
  5459. responseParserFactory: function () {
  5460. const encoder = new TextEncoder();
  5461. let offset = 0;
  5462. return function (response) {
  5463. const chunk = response.substr(offset);
  5464. offset = response.length;
  5465. return encoder.encode(chunk, { stream: true });
  5466. }
  5467. }
  5468. });
  5469. }
  5470.  
  5471. function supportsXhrResponseType(type) {
  5472. try {
  5473. const tmpXhr = new XMLHttpRequest();
  5474. tmpXhr.responseType = type;
  5475. return tmpXhr.responseType === type;
  5476. } catch (e) { /* IE throws on setting responseType to an unsupported value */ }
  5477. return false;
  5478. }
  5479.  
  5480. // CONCATENATED MODULE: ../node_modules/fetch-readablestream/src/index.js
  5481. /* harmony export (immutable) */ __webpack_exports__["default"] = fetchStream;
  5482.  
  5483.  
  5484. function fetchStream(url, options = {}) {
  5485. let transport = options.transport;
  5486. if (!transport) {
  5487. transport = fetchStream.transportFactory();
  5488. }
  5489.  
  5490. return transport(url, options);
  5491. }
  5492.  
  5493. // override this function to delegate to an alternative transport function selection
  5494. // strategy; useful when testing.
  5495. fetchStream.transportFactory = defaultTransportFactory;
  5496.  
  5497. /***/ }),
  5498. /* 23 */
  5499. /***/ (function(module, exports, __webpack_require__) {
  5500.  
  5501. "use strict";
  5502.  
  5503.  
  5504. var parse = __webpack_require__(6);
  5505.  
  5506. /**
  5507. * Transform an URL to a valid origin value.
  5508. *
  5509. * @param {String|Object} url URL to transform to it's origin.
  5510. * @returns {String} The origin.
  5511. * @api public
  5512. */
  5513. function origin(url) {
  5514. if ('string' === typeof url) url = parse(url);
  5515.  
  5516. //
  5517. // 6.2. ASCII Serialization of an Origin
  5518. // http://tools.ietf.org/html/rfc6454#section-6.2
  5519. //
  5520. if (!url.protocol || !url.hostname) return 'null';
  5521.  
  5522. //
  5523. // 4. Origin of a URI
  5524. // http://tools.ietf.org/html/rfc6454#section-4
  5525. //
  5526. // States that url.scheme, host should be converted to lower case. This also
  5527. // makes it easier to match origins as everything is just lower case.
  5528. //
  5529. return (url.protocol +'//'+ url.host).toLowerCase();
  5530. }
  5531.  
  5532. /**
  5533. * Check if the origins are the same.
  5534. *
  5535. * @param {String} a URL or origin of a.
  5536. * @param {String} b URL or origin of b.
  5537. * @returns {Boolean}
  5538. * @api public
  5539. */
  5540. origin.same = function same(a, b) {
  5541. return origin(a) === origin(b);
  5542. };
  5543.  
  5544. //
  5545. // Expose the origin
  5546. //
  5547. module.exports = origin;
  5548.  
  5549.  
  5550. /***/ }),
  5551. /* 24 */
  5552. /***/ (function(module, exports, __webpack_require__) {
  5553.  
  5554. "use strict";
  5555.  
  5556.  
  5557. /**
  5558. * Check if we're required to add a port number.
  5559. *
  5560. * @see https://url.spec.whatwg.org/#default-port
  5561. * @param {Number|String} port Port number we need to check
  5562. * @param {String} protocol Protocol we need to check against.
  5563. * @returns {Boolean} Is it a default port for the given protocol
  5564. * @api private
  5565. */
  5566. module.exports = function required(port, protocol) {
  5567. protocol = protocol.split(':')[0];
  5568. port = +port;
  5569.  
  5570. if (!port) return false;
  5571.  
  5572. switch (protocol) {
  5573. case 'http':
  5574. case 'ws':
  5575. return port !== 80;
  5576.  
  5577. case 'https':
  5578. case 'wss':
  5579. return port !== 443;
  5580.  
  5581. case 'ftp':
  5582. return port !== 21;
  5583.  
  5584. case 'gopher':
  5585. return port !== 70;
  5586.  
  5587. case 'file':
  5588. return false;
  5589. }
  5590.  
  5591. return port !== 0;
  5592. };
  5593.  
  5594.  
  5595. /***/ }),
  5596. /* 25 */
  5597. /***/ (function(module, exports, __webpack_require__) {
  5598.  
  5599. "use strict";
  5600. /* WEBPACK VAR INJECTION */(function(global) {
  5601.  
  5602. /**
  5603. * These properties should not be copied or inherited from. This is only needed
  5604. * for all non blob URL's as the a blob URL does not include a hash, only the
  5605. * origin.
  5606. *
  5607. * @type {Object}
  5608. * @private
  5609. */
  5610. var ignore = { hash: 1, query: 1 }
  5611. , URL;
  5612.  
  5613. /**
  5614. * The location object differs when your code is loaded through a normal page,
  5615. * Worker or through a worker using a blob. And with the blobble begins the
  5616. * trouble as the location object will contain the URL of the blob, not the
  5617. * location of the page where our code is loaded in. The actual origin is
  5618. * encoded in the `pathname` so we can thankfully generate a good "default"
  5619. * location from it so we can generate proper relative URL's again.
  5620. *
  5621. * @param {Object} loc Optional default location object.
  5622. * @returns {Object} lolcation object.
  5623. * @api public
  5624. */
  5625. module.exports = function lolcation(loc) {
  5626. loc = loc || global.location || {};
  5627. URL = URL || __webpack_require__(6);
  5628.  
  5629. var finaldestination = {}
  5630. , type = typeof loc
  5631. , key;
  5632.  
  5633. if ('blob:' === loc.protocol) {
  5634. finaldestination = new URL(unescape(loc.pathname), {});
  5635. } else if ('string' === type) {
  5636. finaldestination = new URL(loc, {});
  5637. for (key in ignore) delete finaldestination[key];
  5638. } else if ('object' === type) for (key in loc) {
  5639. if (key in ignore) continue;
  5640. finaldestination[key] = loc[key];
  5641. }
  5642.  
  5643. return finaldestination;
  5644. };
  5645.  
  5646. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
  5647.  
  5648. /***/ }),
  5649. /* 26 */
  5650. /***/ (function(module, exports, __webpack_require__) {
  5651.  
  5652. "use strict";
  5653.  
  5654.  
  5655. var has = Object.prototype.hasOwnProperty;
  5656.  
  5657. /**
  5658. * Simple query string parser.
  5659. *
  5660. * @param {String} query The query string that needs to be parsed.
  5661. * @returns {Object}
  5662. * @api public
  5663. */
  5664. function querystring(query) {
  5665. var parser = /([^=?&]+)=?([^&]*)/g
  5666. , result = {}
  5667. , part;
  5668.  
  5669. //
  5670. // Little nifty parsing hack, leverage the fact that RegExp.exec increments
  5671. // the lastIndex property so we can continue executing this loop until we've
  5672. // parsed all results.
  5673. //
  5674. for (;
  5675. part = parser.exec(query);
  5676. result[decodeURIComponent(part[1])] = decodeURIComponent(part[2])
  5677. );
  5678.  
  5679. return result;
  5680. }
  5681.  
  5682. /**
  5683. * Transform a query string to an object.
  5684. *
  5685. * @param {Object} obj Object that should be transformed.
  5686. * @param {String} prefix Optional prefix.
  5687. * @returns {String}
  5688. * @api public
  5689. */
  5690. function querystringify(obj, prefix) {
  5691. prefix = prefix || '';
  5692.  
  5693. var pairs = [];
  5694.  
  5695. //
  5696. // Optionally prefix with a '?' if needed
  5697. //
  5698. if ('string' !== typeof prefix) prefix = '?';
  5699.  
  5700. for (var key in obj) {
  5701. if (has.call(obj, key)) {
  5702. pairs.push(encodeURIComponent(key) +'='+ encodeURIComponent(obj[key]));
  5703. }
  5704. }
  5705.  
  5706. return pairs.length ? prefix + pairs.join('&') : '';
  5707. }
  5708.  
  5709. //
  5710. // Expose the module.
  5711. //
  5712. exports.stringify = querystringify;
  5713. exports.parse = querystring;
  5714.  
  5715.  
  5716. /***/ }),
  5717. /* 27 */
  5718. /***/ (function(module, exports, __webpack_require__) {
  5719.  
  5720. "use strict";
  5721.  
  5722.  
  5723. Object.defineProperty(exports, "__esModule", {
  5724. value: true
  5725. });
  5726.  
  5727. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  5728.  
  5729. var _detector = __webpack_require__(2);
  5730.  
  5731. var _detector2 = _interopRequireDefault(_detector);
  5732.  
  5733. var _cookies = __webpack_require__(4);
  5734.  
  5735. var _cookies2 = _interopRequireDefault(_cookies);
  5736.  
  5737. var _hooker = __webpack_require__(5);
  5738.  
  5739. var _hooker2 = _interopRequireDefault(_hooker);
  5740.  
  5741. var _faker = __webpack_require__(7);
  5742.  
  5743. var _faker2 = _interopRequireDefault(_faker);
  5744.  
  5745. var _logger = __webpack_require__(1);
  5746.  
  5747. var _logger2 = _interopRequireDefault(_logger);
  5748.  
  5749. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  5750.  
  5751. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  5752.  
  5753. var Mocker = function () {
  5754. function Mocker() {
  5755. _classCallCheck(this, Mocker);
  5756. }
  5757.  
  5758. _createClass(Mocker, null, [{
  5759. key: 'mock',
  5760. value: function mock() {
  5761. this.mockForBestDefintion();
  5762. this.mockAd();
  5763. this.mockVip();
  5764. this.mockLogo();
  5765. this.mockCheckPlugin();
  5766. }
  5767. }, {
  5768. key: 'mockToUseVms',
  5769. value: function mockToUseVms() {
  5770. _faker2.default.fakeChrome();
  5771. }
  5772. }, {
  5773. key: 'mockToUseM3u8',
  5774. value: function mockToUseM3u8() {
  5775. _faker2.default.fakeMacPlatform();
  5776. _faker2.default.fakeSafari();
  5777. }
  5778. }, {
  5779. key: 'mockForBestDefintion',
  5780. value: function mockForBestDefintion() {
  5781. // fall-back
  5782. if (_detector2.default.isSupportVms()) {
  5783. if (!_detector2.default.isChrome()) this.mockToUseVms(); // vms, 1080p or higher
  5784. } else if (_detector2.default.isSupportM3u8()) {
  5785. this.mockToUseM3u8(); // tmts m3u8
  5786. } else {
  5787. // by default, tmts mp4 ...
  5788. }
  5789. }
  5790. }, {
  5791. key: '_isAdReq',
  5792. value: function _isAdReq(url) {
  5793. var AD_URL = 'http://t7z.cupid.iqiyi.com/show2';
  5794. return url.indexOf(AD_URL) === 0;
  5795. }
  5796. }, {
  5797. key: 'mockAd',
  5798. value: function mockAd() {
  5799. var _this = this;
  5800.  
  5801. _hooker2.default.hookJqueryAjax(function (url, options) {
  5802. if (_this._isAdReq(url)) {
  5803. var res = _faker2.default.fakeAdRes();
  5804. (options.complete || options.success)({ responseJSON: res }, 'success');
  5805. _logger2.default.log('mocked ad request ' + url);
  5806. return true;
  5807. }
  5808. });
  5809. }
  5810. }, {
  5811. key: '_isCheckVipReq',
  5812. value: function _isCheckVipReq(url) {
  5813. var CHECK_VIP_URL = 'https://cmonitor.iqiyi.com/apis/user/check_vip.action';
  5814. return url === CHECK_VIP_URL;
  5815. }
  5816. }, {
  5817. key: '_isLogin',
  5818. value: function _isLogin() {
  5819. return !!_cookies2.default.get('P00001');
  5820. }
  5821. }, {
  5822. key: 'mockVip',
  5823. value: function mockVip() {
  5824. var _this2 = this;
  5825.  
  5826. if (!this._isLogin()) _faker2.default.fakePassportCookie();
  5827.  
  5828. _hooker2.default.hookHttpJsonp(function (options) {
  5829. var url = options.url;
  5830.  
  5831. if (_this2._isCheckVipReq(url)) {
  5832. var res = _faker2.default.fakeVipRes(options.params.authcookie);
  5833. options.success(res);
  5834. _logger2.default.log('mocked check vip request ' + url);
  5835. return true;
  5836. }
  5837. });
  5838. }
  5839. }, {
  5840. key: 'mockLogo',
  5841. value: function mockLogo() {
  5842. _hooker2.default.hookLogo(function (exports) {
  5843. return exports.prototype.showLogo = function () {};
  5844. });
  5845. }
  5846. }, {
  5847. key: 'mockCheckPlugin',
  5848. value: function mockCheckPlugin() {
  5849. _hooker2.default.hookSkinBase(function (exports) {
  5850. exports.prototype._checkPlugin = function () {};
  5851. });
  5852. }
  5853. }]);
  5854.  
  5855. return Mocker;
  5856. }();
  5857.  
  5858. exports.default = Mocker;
  5859.  
  5860. /***/ }),
  5861. /* 28 */
  5862. /***/ (function(module, exports, __webpack_require__) {
  5863.  
  5864. var __WEBPACK_AMD_DEFINE_RESULT__;/*
  5865. * JavaScript MD5
  5866. * https://github.com/blueimp/JavaScript-MD5
  5867. *
  5868. * Copyright 2011, Sebastian Tschan
  5869. * https://blueimp.net
  5870. *
  5871. * Licensed under the MIT license:
  5872. * https://opensource.org/licenses/MIT
  5873. *
  5874. * Based on
  5875. * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  5876. * Digest Algorithm, as defined in RFC 1321.
  5877. * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
  5878. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
  5879. * Distributed under the BSD License
  5880. * See http://pajhome.org.uk/crypt/md5 for more info.
  5881. */
  5882.  
  5883. /* global define */
  5884.  
  5885. ;(function ($) {
  5886. 'use strict'
  5887.  
  5888. /*
  5889. * Add integers, wrapping at 2^32. This uses 16-bit operations internally
  5890. * to work around bugs in some JS interpreters.
  5891. */
  5892. function safeAdd (x, y) {
  5893. var lsw = (x & 0xFFFF) + (y & 0xFFFF)
  5894. var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
  5895. return (msw << 16) | (lsw & 0xFFFF)
  5896. }
  5897.  
  5898. /*
  5899. * Bitwise rotate a 32-bit number to the left.
  5900. */
  5901. function bitRotateLeft (num, cnt) {
  5902. return (num << cnt) | (num >>> (32 - cnt))
  5903. }
  5904.  
  5905. /*
  5906. * These functions implement the four basic operations the algorithm uses.
  5907. */
  5908. function md5cmn (q, a, b, x, s, t) {
  5909. return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
  5910. }
  5911. function md5ff (a, b, c, d, x, s, t) {
  5912. return md5cmn((b & c) | ((~b) & d), a, b, x, s, t)
  5913. }
  5914. function md5gg (a, b, c, d, x, s, t) {
  5915. return md5cmn((b & d) | (c & (~d)), a, b, x, s, t)
  5916. }
  5917. function md5hh (a, b, c, d, x, s, t) {
  5918. return md5cmn(b ^ c ^ d, a, b, x, s, t)
  5919. }
  5920. function md5ii (a, b, c, d, x, s, t) {
  5921. return md5cmn(c ^ (b | (~d)), a, b, x, s, t)
  5922. }
  5923.  
  5924. /*
  5925. * Calculate the MD5 of an array of little-endian words, and a bit length.
  5926. */
  5927. function binlMD5 (x, len) {
  5928. /* append padding */
  5929. x[len >> 5] |= 0x80 << (len % 32)
  5930. x[(((len + 64) >>> 9) << 4) + 14] = len
  5931.  
  5932. var i
  5933. var olda
  5934. var oldb
  5935. var oldc
  5936. var oldd
  5937. var a = 1732584193
  5938. var b = -271733879
  5939. var c = -1732584194
  5940. var d = 271733878
  5941.  
  5942. for (i = 0; i < x.length; i += 16) {
  5943. olda = a
  5944. oldb = b
  5945. oldc = c
  5946. oldd = d
  5947.  
  5948. a = md5ff(a, b, c, d, x[i], 7, -680876936)
  5949. d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
  5950. c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
  5951. b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
  5952. a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
  5953. d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
  5954. c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
  5955. b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
  5956. a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
  5957. d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
  5958. c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
  5959. b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
  5960. a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
  5961. d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
  5962. c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
  5963. b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)
  5964.  
  5965. a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
  5966. d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
  5967. c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
  5968. b = md5gg(b, c, d, a, x[i], 20, -373897302)
  5969. a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
  5970. d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
  5971. c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
  5972. b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
  5973. a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
  5974. d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
  5975. c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
  5976. b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
  5977. a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
  5978. d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
  5979. c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
  5980. b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)
  5981.  
  5982. a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
  5983. d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
  5984. c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
  5985. b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
  5986. a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
  5987. d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
  5988. c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
  5989. b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
  5990. a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
  5991. d = md5hh(d, a, b, c, x[i], 11, -358537222)
  5992. c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
  5993. b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
  5994. a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
  5995. d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
  5996. c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
  5997. b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)
  5998.  
  5999. a = md5ii(a, b, c, d, x[i], 6, -198630844)
  6000. d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
  6001. c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
  6002. b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
  6003. a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
  6004. d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
  6005. c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
  6006. b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
  6007. a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
  6008. d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
  6009. c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
  6010. b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
  6011. a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
  6012. d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
  6013. c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
  6014. b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)
  6015.  
  6016. a = safeAdd(a, olda)
  6017. b = safeAdd(b, oldb)
  6018. c = safeAdd(c, oldc)
  6019. d = safeAdd(d, oldd)
  6020. }
  6021. return [a, b, c, d]
  6022. }
  6023.  
  6024. /*
  6025. * Convert an array of little-endian words to a string
  6026. */
  6027. function binl2rstr (input) {
  6028. var i
  6029. var output = ''
  6030. var length32 = input.length * 32
  6031. for (i = 0; i < length32; i += 8) {
  6032. output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF)
  6033. }
  6034. return output
  6035. }
  6036.  
  6037. /*
  6038. * Convert a raw string to an array of little-endian words
  6039. * Characters >255 have their high-byte silently ignored.
  6040. */
  6041. function rstr2binl (input) {
  6042. var i
  6043. var output = []
  6044. output[(input.length >> 2) - 1] = undefined
  6045. for (i = 0; i < output.length; i += 1) {
  6046. output[i] = 0
  6047. }
  6048. var length8 = input.length * 8
  6049. for (i = 0; i < length8; i += 8) {
  6050. output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32)
  6051. }
  6052. return output
  6053. }
  6054.  
  6055. /*
  6056. * Calculate the MD5 of a raw string
  6057. */
  6058. function rstrMD5 (s) {
  6059. return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
  6060. }
  6061.  
  6062. /*
  6063. * Calculate the HMAC-MD5, of a key and some data (raw strings)
  6064. */
  6065. function rstrHMACMD5 (key, data) {
  6066. var i
  6067. var bkey = rstr2binl(key)
  6068. var ipad = []
  6069. var opad = []
  6070. var hash
  6071. ipad[15] = opad[15] = undefined
  6072. if (bkey.length > 16) {
  6073. bkey = binlMD5(bkey, key.length * 8)
  6074. }
  6075. for (i = 0; i < 16; i += 1) {
  6076. ipad[i] = bkey[i] ^ 0x36363636
  6077. opad[i] = bkey[i] ^ 0x5C5C5C5C
  6078. }
  6079. hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
  6080. return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
  6081. }
  6082.  
  6083. /*
  6084. * Convert a raw string to a hex string
  6085. */
  6086. function rstr2hex (input) {
  6087. var hexTab = '0123456789abcdef'
  6088. var output = ''
  6089. var x
  6090. var i
  6091. for (i = 0; i < input.length; i += 1) {
  6092. x = input.charCodeAt(i)
  6093. output += hexTab.charAt((x >>> 4) & 0x0F) +
  6094. hexTab.charAt(x & 0x0F)
  6095. }
  6096. return output
  6097. }
  6098.  
  6099. /*
  6100. * Encode a string as utf-8
  6101. */
  6102. function str2rstrUTF8 (input) {
  6103. return unescape(encodeURIComponent(input))
  6104. }
  6105.  
  6106. /*
  6107. * Take string arguments and return either raw or hex encoded strings
  6108. */
  6109. function rawMD5 (s) {
  6110. return rstrMD5(str2rstrUTF8(s))
  6111. }
  6112. function hexMD5 (s) {
  6113. return rstr2hex(rawMD5(s))
  6114. }
  6115. function rawHMACMD5 (k, d) {
  6116. return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
  6117. }
  6118. function hexHMACMD5 (k, d) {
  6119. return rstr2hex(rawHMACMD5(k, d))
  6120. }
  6121.  
  6122. function md5 (string, key, raw) {
  6123. if (!key) {
  6124. if (!raw) {
  6125. return hexMD5(string)
  6126. }
  6127. return rawMD5(string)
  6128. }
  6129. if (!raw) {
  6130. return hexHMACMD5(key, string)
  6131. }
  6132. return rawHMACMD5(key, string)
  6133. }
  6134.  
  6135. if (true) {
  6136. !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {
  6137. return md5
  6138. }.call(exports, __webpack_require__, exports, module),
  6139. __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))
  6140. } else if (typeof module === 'object' && module.exports) {
  6141. module.exports = md5
  6142. } else {
  6143. $.md5 = md5
  6144. }
  6145. }(this))
  6146.  
  6147.  
  6148. /***/ }),
  6149. /* 29 */
  6150. /***/ (function(module, exports, __webpack_require__) {
  6151.  
  6152. "use strict";
  6153.  
  6154.  
  6155. Object.defineProperty(exports, "__esModule", {
  6156. value: true
  6157. });
  6158.  
  6159. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  6160.  
  6161. var _logger = __webpack_require__(1);
  6162.  
  6163. var _logger2 = _interopRequireDefault(_logger);
  6164.  
  6165. var _detector = __webpack_require__(2);
  6166.  
  6167. var _detector2 = _interopRequireDefault(_detector);
  6168.  
  6169. var _hooker = __webpack_require__(5);
  6170.  
  6171. var _hooker2 = _interopRequireDefault(_hooker);
  6172.  
  6173. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  6174.  
  6175. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  6176.  
  6177. var Patcher = function () {
  6178. function Patcher() {
  6179. _classCallCheck(this, Patcher);
  6180. }
  6181.  
  6182. _createClass(Patcher, null, [{
  6183. key: '_patchWebFullScreen',
  6184. value: function _patchWebFullScreen() {
  6185. _hooker2.default.hookWebFullScreenInit(function (that, wrapper, btn) {
  6186. btn.on('toggle', that.toggle.bind(that));
  6187. });
  6188. }
  6189. }, {
  6190. key: '_patchInitFullScreen',
  6191. value: function _patchInitFullScreen() {
  6192. this._patchWebFullScreen();
  6193.  
  6194. _hooker2.default.hookInitFullScreen(function (that) {
  6195. that.core.on('togglefullscreen', function () {
  6196. that._fullscreenBtn.fire('click', { data: null });
  6197. });
  6198.  
  6199. that.core.on('togglewebfullscreen', function () {
  6200. that._webfullscreenBtn.fire('toggle', { data: null });
  6201. });
  6202. });
  6203. }
  6204. }, {
  6205. key: '_patchPluginControls',
  6206. value: function _patchPluginControls() {
  6207. _hooker2.default.hookPluginControlsInit(function (that) {
  6208. that.core.on('showtip', function (event) {
  6209. that.setcontroltip.apply(that, [{ str: event.data, x: that._process.offset().left, y: 3, cut: true, timeout: true }]);
  6210. if (that.$plugin.hasClass('process_hidden')) {
  6211. that._controltips.css('top', '-25px');
  6212. } else if (that.$plugin.hasClass('bottom-hide')) {
  6213. that._controltips.css('top', '-38px');
  6214. }
  6215. });
  6216. });
  6217. }
  6218. }, {
  6219. key: '_obtainFlvInfo',
  6220. value: function _obtainFlvInfo() {
  6221. var _this = this;
  6222.  
  6223. _hooker2.default.hookParseData(function (that) {
  6224. return _this._flvInfo = that.flvInfo;
  6225. });
  6226. }
  6227. }, {
  6228. key: '_patchCore',
  6229. value: function _patchCore() {
  6230. var self = this;
  6231.  
  6232. this._patchPluginControls();
  6233. this._patchInitFullScreen();
  6234. this._obtainFlvInfo();
  6235.  
  6236. _hooker2.default.hookCore(function (exports) {
  6237. exports.prototype._showTip = function (msg) {
  6238. this.fire({ type: 'showtip', data: msg });
  6239. };
  6240.  
  6241. exports.prototype.getFPS = function () {
  6242. if (self._flvInfo) {
  6243. return self._flvInfo.videoConfigTag.sps.frame_rate.fps;
  6244. } else {
  6245. return 25; // f4v极速以上,动画23.976、电影24、电视剧25。
  6246. }
  6247. };
  6248.  
  6249. exports.prototype.previousFrame = function () {
  6250. var video = this.video();
  6251. var seekTime = Math.max(0, Math.min(this.getDuration(), video.currentTime - 1 / this.getFPS()));
  6252. video.currentTime = seekTime;
  6253. this._showTip('上一帧');
  6254. };
  6255.  
  6256. exports.prototype.nextFrame = function () {
  6257. var video = this.video();
  6258. var seekTime = Math.max(0, Math.min(this.getDuration(), video.currentTime + 1 / this.getFPS()));
  6259. video.currentTime = seekTime;
  6260. this._showTip('下一帧');
  6261. };
  6262.  
  6263. exports.prototype.seek = function () {
  6264. var _engine;
  6265.  
  6266. var video = this.video();
  6267. var playbackRate = video.playbackRate;
  6268. (_engine = this._engine).seek.apply(_engine, arguments);
  6269. video.playbackRate = playbackRate;
  6270. };
  6271.  
  6272. exports.prototype.stepSeek = function (stepTime) {
  6273. var seekTime = Math.max(0, Math.min(this.getDuration(), this.getCurrenttime() + stepTime));
  6274. var msg = void 0;
  6275.  
  6276. if (Math.abs(stepTime) < 60) {
  6277. msg = stepTime > 0 ? '\u6B65\u8FDB\uFF1A' + stepTime + '\u79D2' : '\u6B65\u9000\uFF1A' + Math.abs(stepTime) + '\u79D2';
  6278. } else {
  6279. msg = stepTime > 0 ? '\u6B65\u8FDB\uFF1A' + stepTime / 60 + '\u5206\u949F' : '\u6B65\u9000\uFF1A' + Math.abs(stepTime) / 60 + '\u5206\u949F';
  6280. }
  6281. this._showTip(msg);
  6282.  
  6283. this.seek(seekTime, true);
  6284. };
  6285.  
  6286. exports.prototype.rangeSeek = function (range) {
  6287. var duration = this.getDuration();
  6288. var seekTime = Math.max(0, Math.min(duration, duration * range));
  6289. this.seek(seekTime, true);
  6290. this._showTip('定位:' + (range * 100).toFixed(0) + '%');
  6291. };
  6292.  
  6293. exports.prototype.toggleMute = function () {
  6294. if (this.getMuted()) {
  6295. this.setMuted(false);
  6296. this._showTip('取消静音');
  6297. } else {
  6298. this.setMuted(true);
  6299. this._showTip('静音');
  6300. }
  6301. };
  6302.  
  6303. exports.prototype.adjustVolume = function (value) {
  6304. var volume = this.getVolume() + value;
  6305. volume = Math.max(0, Math.min(1, volume.toFixed(2)));
  6306. this.setVolume(volume);
  6307. this.fire({ type: 'keyvolumechange' });
  6308. };
  6309.  
  6310. exports.prototype.adjustPlaybackRate = function (value) {
  6311. var video = this.video();
  6312. var playbackRate = Math.max(0.2, Math.min(5, video.playbackRate + value));
  6313. video.playbackRate = playbackRate;
  6314. this._showTip('\u64AD\u653E\u901F\u7387\uFF1A' + playbackRate.toFixed(1).replace(/\.0+$/, ''));
  6315. };
  6316.  
  6317. exports.prototype.resetPlaybackRate = function () {
  6318. var video = this.video();
  6319. video.playbackRate = 1;
  6320. this._showTip('恢复播放速率');
  6321. };
  6322.  
  6323. exports.prototype.hasPreVideo = function () {
  6324. return this._getVideoIndexInList(this._movieinfo.tvid) > 0 || this._getVideoIndexInList(this._movieinfo.oldTvid) > 0;
  6325. };
  6326.  
  6327. exports.prototype.playNext = function () {
  6328. if (this.hasNextVideo()) {
  6329. this._showTip('播放下一集');
  6330. this.switchNextVideo();
  6331. } else {
  6332. this._showTip('没有下一集哦');
  6333. }
  6334. };
  6335.  
  6336. exports.prototype.playPre = function () {
  6337. if (this.hasPreVideo()) {
  6338. this._showTip('播放上一集');
  6339. this.switchPreVideo();
  6340. } else {
  6341. this._showTip('没有上一集哦');
  6342. }
  6343. };
  6344. });
  6345. }
  6346. }, {
  6347. key: '_patchKeyShortcuts',
  6348. value: function _patchKeyShortcuts() {
  6349. _hooker2.default.hookPluginHotKeys(function (exports) {
  6350. exports.prototype.init = function () {
  6351. document.addEventListener('keydown', this._keydown.bind(this));
  6352. };
  6353.  
  6354. exports.prototype._isValidTarget = function (target) {
  6355. return target.nodeName === 'BODY' || target.nodeName == 'VIDEO' || target.classList.contains('pw-video'); // 全局
  6356. // return target.nodeName === 'VIDEO' || target.classList.contains('pw-video'); // 非全局
  6357. };
  6358.  
  6359. exports.prototype._keydown = function (event) {
  6360. if (!this._isValidTarget(event.target)) return;
  6361.  
  6362. switch (event.keyCode) {
  6363. case 32:
  6364. // Spacebar
  6365. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6366. if (this.core.isPaused()) {
  6367. this.core.play(true);
  6368. this.core._showTip('播放');
  6369. } else {
  6370. this.core.pause(true);
  6371. this.core._showTip('暂停');
  6372. }
  6373. } else {
  6374. return;
  6375. }
  6376. break;
  6377. case 39: // → Arrow Right
  6378. case 37:
  6379. {
  6380. // ← Arrow Left
  6381. var stepTime = void 0;
  6382. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6383. stepTime = 39 === event.keyCode ? 5 : -5;
  6384. } else if (event.ctrlKey && !event.shiftKey && !event.altKey) {
  6385. stepTime = 39 === event.keyCode ? 30 : -30;
  6386. } else if (!event.ctrlKey && event.shiftKey && !event.altKey) {
  6387. stepTime = 39 === event.keyCode ? 60 : -60;
  6388. } else if (event.ctrlKey && !event.shiftKey && event.altKey) {
  6389. stepTime = 39 === event.keyCode ? 3e2 : -3e2; // 5分钟
  6390. } else {
  6391. return;
  6392. }
  6393.  
  6394. this.core.stepSeek(stepTime);
  6395. break;
  6396. }
  6397. case 38: // ↑ Arrow Up
  6398. case 40:
  6399. // ↓ Arrow Down
  6400. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6401. this.core.adjustVolume(38 === event.keyCode ? 0.05 : -0.05);
  6402. } else {
  6403. return;
  6404. }
  6405. break;
  6406. case 77:
  6407. // M
  6408. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6409. this.core.toggleMute();
  6410. } else {
  6411. return;
  6412. }
  6413. break;
  6414. case 13:
  6415. // Enter
  6416. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6417. this.core.fire({ type: 'togglefullscreen' });
  6418. } else if (event.ctrlKey && !event.shiftKey && !event.altKey) {
  6419. this.core.fire({ type: 'togglewebfullscreen' });
  6420. } else {
  6421. return;
  6422. }
  6423. break;
  6424. case 67: // C
  6425. case 88:
  6426. // X
  6427. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6428. this.core.adjustPlaybackRate(67 === event.keyCode ? 0.1 : -0.1);
  6429. } else {
  6430. return;
  6431. }
  6432. break;
  6433. case 90:
  6434. // Z
  6435. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6436. this.core.resetPlaybackRate();
  6437. } else {
  6438. return;
  6439. }
  6440. break;
  6441. case 68: // D
  6442. case 70:
  6443. // F
  6444. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6445. this.core.pause(true);
  6446. if (event.keyCode === 68) {
  6447. this.core.previousFrame();
  6448. } else {
  6449. this.core.nextFrame();
  6450. }
  6451. } else {
  6452. return;
  6453. }
  6454. break;
  6455. case 80: // P
  6456. case 78:
  6457. // N
  6458. if (!event.ctrlKey && event.shiftKey && !event.altKey) {
  6459. if (event.keyCode === 78) {
  6460. this.core.playNext();
  6461. } else {
  6462. this.core.playPre();
  6463. }
  6464. } else {
  6465. return;
  6466. }
  6467. break;
  6468. default:
  6469. if (event.keyCode >= 48 && event.keyCode <= 57) {
  6470. // 0 ~ 9
  6471. if (!event.ctrlKey && !event.shiftKey && !event.altKey) {
  6472. this.core.rangeSeek((event.keyCode - 48) * 0.1);
  6473. } else {
  6474. return;
  6475. }
  6476. } else {
  6477. return;
  6478. }
  6479. }
  6480.  
  6481. event.preventDefault();
  6482. event.stopPropagation();
  6483. };
  6484.  
  6485. _logger2.default.log('添加键盘快捷键');
  6486. });
  6487. }
  6488. }, {
  6489. key: '_patchMouseShortcuts',
  6490. value: function _patchMouseShortcuts() {
  6491. _hooker2.default.hookPluginControlsInit(function (that) {
  6492. document.addEventListener('wheel', function (event) {
  6493. if (!_detector2.default.isFullScreen()) return;
  6494.  
  6495. var delta = event.wheelDelta || event.detail || event.deltaY && -event.deltaY;
  6496. that.core.adjustVolume(delta > 0 ? 0.05 : -0.05);
  6497. });
  6498.  
  6499. _logger2.default.log('添加鼠标快捷键');
  6500. });
  6501. }
  6502. }, {
  6503. key: 'patchShortcuts',
  6504. value: function patchShortcuts() {
  6505. this._patchCore();
  6506.  
  6507. this._patchKeyShortcuts();
  6508. this._patchMouseShortcuts();
  6509. }
  6510. }]);
  6511.  
  6512. return Patcher;
  6513. }();
  6514.  
  6515. exports.default = Patcher;
  6516.  
  6517. /***/ }),
  6518. /* 30 */
  6519. /***/ (function(module, exports, __webpack_require__) {
  6520.  
  6521. "use strict";
  6522.  
  6523.  
  6524. Object.defineProperty(exports, "__esModule", {
  6525. value: true
  6526. });
  6527. exports.adaptIframe = exports.replaceFlash = undefined;
  6528.  
  6529. var _regenerator = __webpack_require__(31);
  6530.  
  6531. var _regenerator2 = _interopRequireDefault(_regenerator);
  6532.  
  6533. var embedSrc = function () {
  6534. var _ref = _asyncToGenerator(_regenerator2.default.mark(function _callee(targetNode, _ref2) {
  6535. var tvid = _ref2.tvid,
  6536. vid = _ref2.vid;
  6537. var url;
  6538. return _regenerator2.default.wrap(function _callee$(_context) {
  6539. while (1) {
  6540. switch (_context.prev = _context.next) {
  6541. case 0:
  6542. targetNode.innerHTML = '<div class="' + GM_info.script.name + ' info">\u6B63\u5728\u83B7\u53D6\u89C6\u9891\u6E90...</div>';
  6543.  
  6544. _context.prev = 1;
  6545. _context.next = 4;
  6546. return (0, _utils.getVideoUrl)(tvid, vid);
  6547.  
  6548. case 4:
  6549. url = _context.sent;
  6550.  
  6551. _logger2.default.log('source url: %s', url);
  6552. targetNode.innerHTML = '<iframe id="innerFrame" src="' + url + '" frameborder="0" allowfullscreen="true" width="100%" height="100%"></iframe>';
  6553. _context.next = 12;
  6554. break;
  6555.  
  6556. case 9:
  6557. _context.prev = 9;
  6558. _context.t0 = _context['catch'](1);
  6559.  
  6560. targetNode.innerHTML = '<div class="' + GM_info.script.name + ' error"><p>\u83B7\u53D6\u89C6\u9891\u6E90\u51FA\u9519\uFF01</p><p>' + _context.t0.message + '</p></div>';
  6561.  
  6562. case 12:
  6563. case 'end':
  6564. return _context.stop();
  6565. }
  6566. }
  6567. }, _callee, this, [[1, 9]]);
  6568. }));
  6569.  
  6570. return function embedSrc(_x, _x2) {
  6571. return _ref.apply(this, arguments);
  6572. };
  6573. }();
  6574.  
  6575. var _logger = __webpack_require__(1);
  6576.  
  6577. var _logger2 = _interopRequireDefault(_logger);
  6578.  
  6579. var _hooker = __webpack_require__(5);
  6580.  
  6581. var _hooker2 = _interopRequireDefault(_hooker);
  6582.  
  6583. var _faker = __webpack_require__(7);
  6584.  
  6585. var _faker2 = _interopRequireDefault(_faker);
  6586.  
  6587. var _detector = __webpack_require__(2);
  6588.  
  6589. var _detector2 = _interopRequireDefault(_detector);
  6590.  
  6591. var _utils = __webpack_require__(34);
  6592.  
  6593. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  6594.  
  6595. function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
  6596.  
  6597. function replaceFlash() {
  6598. if (!_detector2.default.hasFlashPlugin()) _faker2.default.fakeFlashPlugin();
  6599.  
  6600. var observer = new MutationObserver(function (records, self) {
  6601. var _iteratorNormalCompletion = true;
  6602. var _didIteratorError = false;
  6603. var _iteratorError = undefined;
  6604.  
  6605. try {
  6606. for (var _iterator = records[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  6607. var record = _step.value;
  6608.  
  6609. if (record.type !== 'childList' || !record.addedNodes) continue;
  6610.  
  6611. var _iteratorNormalCompletion2 = true;
  6612. var _didIteratorError2 = false;
  6613. var _iteratorError2 = undefined;
  6614.  
  6615. try {
  6616. for (var _iterator2 = record.addedNodes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
  6617. var node = _step2.value;
  6618.  
  6619. if (node.nodeName !== 'OBJECT' && node.nodeName !== 'EMBED') continue;
  6620. _logger2.default.log('finded node', node);
  6621.  
  6622. var text = node.outerHTML;
  6623. var vid = (0, _utils.findVid)(text);
  6624. var tvid = (0, _utils.findTvid)(text);
  6625.  
  6626. if (tvid && vid) {
  6627. _logger2.default.log('finded tvid: %s, vid: %s', tvid, vid);
  6628. embedSrc(node.parentNode, { tvid: tvid, vid: vid });
  6629. self.disconnect();
  6630. _logger2.default.log('stoped observation');
  6631. }
  6632. }
  6633. } catch (err) {
  6634. _didIteratorError2 = true;
  6635. _iteratorError2 = err;
  6636. } finally {
  6637. try {
  6638. if (!_iteratorNormalCompletion2 && _iterator2.return) {
  6639. _iterator2.return();
  6640. }
  6641. } finally {
  6642. if (_didIteratorError2) {
  6643. throw _iteratorError2;
  6644. }
  6645. }
  6646. }
  6647. }
  6648. } catch (err) {
  6649. _didIteratorError = true;
  6650. _iteratorError = err;
  6651. } finally {
  6652. try {
  6653. if (!_iteratorNormalCompletion && _iterator.return) {
  6654. _iterator.return();
  6655. }
  6656. } finally {
  6657. if (_didIteratorError) {
  6658. throw _iteratorError;
  6659. }
  6660. }
  6661. }
  6662. });
  6663.  
  6664. observer.observe(document.body || document.documentElement, { subtree: true, childList: true });
  6665. _logger2.default.log('started observation');
  6666. }
  6667.  
  6668. function adaptIframe() {
  6669. var style = '\n body[class|="qypage"] {\n overflow: hidden !important;\n background: #000 !important;\n visibility: hidden;\n }\n\n .mod-func {\n display: none !important;\n }\n\n .' + GM_info.script.name + '.info {\n width: 20em;\n height: 5em;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n margin: auto;\n text-align: center;\n line-height: 5em;\n font-size: 1em;\n color: #ccc;\n }\n\n .' + GM_info.script.name + '.error {\n height: 3em;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n margin: auto;\n text-align: center;\n font-size: 1em;\n color: #c00;\n }\n ';
  6670.  
  6671. GM_addStyle(style);
  6672.  
  6673. _hooker2.default.hookWebFullScreen(function (exports) {
  6674. var init = exports.__proto__.init;
  6675. exports.__proto__.init = function (wrapper, btn) {
  6676. init.apply(this, [wrapper, btn]);
  6677. this.enter();
  6678.  
  6679. btn[0].style.display = 'none';
  6680. document.body.style.visibility = 'visible';
  6681. };
  6682.  
  6683. exports.__proto__.exit = function () {};
  6684. });
  6685.  
  6686. _hooker2.default.hookCore(function (exports) {
  6687. exports.prototype.hasNextVideo = function () {
  6688. return null;
  6689. };
  6690. });
  6691. }
  6692.  
  6693. exports.replaceFlash = replaceFlash;
  6694. exports.adaptIframe = adaptIframe;
  6695.  
  6696. /***/ }),
  6697. /* 31 */
  6698. /***/ (function(module, exports, __webpack_require__) {
  6699.  
  6700. module.exports = __webpack_require__(32);
  6701.  
  6702.  
  6703. /***/ }),
  6704. /* 32 */
  6705. /***/ (function(module, exports, __webpack_require__) {
  6706.  
  6707. /* WEBPACK VAR INJECTION */(function(global) {// This method of obtaining a reference to the global object needs to be
  6708. // kept identical to the way it is obtained in runtime.js
  6709. var g =
  6710. typeof global === "object" ? global :
  6711. typeof window === "object" ? window :
  6712. typeof self === "object" ? self : this;
  6713.  
  6714. // Use `getOwnPropertyNames` because not all browsers support calling
  6715. // `hasOwnProperty` on the global `self` object in a worker. See #183.
  6716. var hadRuntime = g.regeneratorRuntime &&
  6717. Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
  6718.  
  6719. // Save the old regeneratorRuntime in case it needs to be restored later.
  6720. var oldRuntime = hadRuntime && g.regeneratorRuntime;
  6721.  
  6722. // Force reevalutation of runtime.js.
  6723. g.regeneratorRuntime = undefined;
  6724.  
  6725. module.exports = __webpack_require__(33);
  6726.  
  6727. if (hadRuntime) {
  6728. // Restore the original runtime.
  6729. g.regeneratorRuntime = oldRuntime;
  6730. } else {
  6731. // Remove the global property added by runtime.js.
  6732. try {
  6733. delete g.regeneratorRuntime;
  6734. } catch(e) {
  6735. g.regeneratorRuntime = undefined;
  6736. }
  6737. }
  6738.  
  6739. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
  6740.  
  6741. /***/ }),
  6742. /* 33 */
  6743. /***/ (function(module, exports, __webpack_require__) {
  6744.  
  6745. /* WEBPACK VAR INJECTION */(function(global) {/**
  6746. * Copyright (c) 2014, Facebook, Inc.
  6747. * All rights reserved.
  6748. *
  6749. * This source code is licensed under the BSD-style license found in the
  6750. * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
  6751. * additional grant of patent rights can be found in the PATENTS file in
  6752. * the same directory.
  6753. */
  6754.  
  6755. !(function(global) {
  6756. "use strict";
  6757.  
  6758. var Op = Object.prototype;
  6759. var hasOwn = Op.hasOwnProperty;
  6760. var undefined; // More compressible than void 0.
  6761. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  6762. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  6763. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  6764. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  6765.  
  6766. var inModule = typeof module === "object";
  6767. var runtime = global.regeneratorRuntime;
  6768. if (runtime) {
  6769. if (inModule) {
  6770. // If regeneratorRuntime is defined globally and we're in a module,
  6771. // make the exports object identical to regeneratorRuntime.
  6772. module.exports = runtime;
  6773. }
  6774. // Don't bother evaluating the rest of this file if the runtime was
  6775. // already defined globally.
  6776. return;
  6777. }
  6778.  
  6779. // Define the runtime globally (as expected by generated code) as either
  6780. // module.exports (if we're in a module) or a new, empty object.
  6781. runtime = global.regeneratorRuntime = inModule ? module.exports : {};
  6782.  
  6783. function wrap(innerFn, outerFn, self, tryLocsList) {
  6784. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  6785. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  6786. var generator = Object.create(protoGenerator.prototype);
  6787. var context = new Context(tryLocsList || []);
  6788.  
  6789. // The ._invoke method unifies the implementations of the .next,
  6790. // .throw, and .return methods.
  6791. generator._invoke = makeInvokeMethod(innerFn, self, context);
  6792.  
  6793. return generator;
  6794. }
  6795. runtime.wrap = wrap;
  6796.  
  6797. // Try/catch helper to minimize deoptimizations. Returns a completion
  6798. // record like context.tryEntries[i].completion. This interface could
  6799. // have been (and was previously) designed to take a closure to be
  6800. // invoked without arguments, but in all the cases we care about we
  6801. // already have an existing method we want to call, so there's no need
  6802. // to create a new function object. We can even get away with assuming
  6803. // the method takes exactly one argument, since that happens to be true
  6804. // in every case, so we don't have to touch the arguments object. The
  6805. // only additional allocation required is the completion record, which
  6806. // has a stable shape and so hopefully should be cheap to allocate.
  6807. function tryCatch(fn, obj, arg) {
  6808. try {
  6809. return { type: "normal", arg: fn.call(obj, arg) };
  6810. } catch (err) {
  6811. return { type: "throw", arg: err };
  6812. }
  6813. }
  6814.  
  6815. var GenStateSuspendedStart = "suspendedStart";
  6816. var GenStateSuspendedYield = "suspendedYield";
  6817. var GenStateExecuting = "executing";
  6818. var GenStateCompleted = "completed";
  6819.  
  6820. // Returning this object from the innerFn has the same effect as
  6821. // breaking out of the dispatch switch statement.
  6822. var ContinueSentinel = {};
  6823.  
  6824. // Dummy constructor functions that we use as the .constructor and
  6825. // .constructor.prototype properties for functions that return Generator
  6826. // objects. For full spec compliance, you may wish to configure your
  6827. // minifier not to mangle the names of these two functions.
  6828. function Generator() {}
  6829. function GeneratorFunction() {}
  6830. function GeneratorFunctionPrototype() {}
  6831.  
  6832. // This is a polyfill for %IteratorPrototype% for environments that
  6833. // don't natively support it.
  6834. var IteratorPrototype = {};
  6835. IteratorPrototype[iteratorSymbol] = function () {
  6836. return this;
  6837. };
  6838.  
  6839. var getProto = Object.getPrototypeOf;
  6840. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  6841. if (NativeIteratorPrototype &&
  6842. NativeIteratorPrototype !== Op &&
  6843. hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  6844. // This environment has a native %IteratorPrototype%; use it instead
  6845. // of the polyfill.
  6846. IteratorPrototype = NativeIteratorPrototype;
  6847. }
  6848.  
  6849. var Gp = GeneratorFunctionPrototype.prototype =
  6850. Generator.prototype = Object.create(IteratorPrototype);
  6851. GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  6852. GeneratorFunctionPrototype.constructor = GeneratorFunction;
  6853. GeneratorFunctionPrototype[toStringTagSymbol] =
  6854. GeneratorFunction.displayName = "GeneratorFunction";
  6855.  
  6856. // Helper for defining the .next, .throw, and .return methods of the
  6857. // Iterator interface in terms of a single ._invoke method.
  6858. function defineIteratorMethods(prototype) {
  6859. ["next", "throw", "return"].forEach(function(method) {
  6860. prototype[method] = function(arg) {
  6861. return this._invoke(method, arg);
  6862. };
  6863. });
  6864. }
  6865.  
  6866. runtime.isGeneratorFunction = function(genFun) {
  6867. var ctor = typeof genFun === "function" && genFun.constructor;
  6868. return ctor
  6869. ? ctor === GeneratorFunction ||
  6870. // For the native GeneratorFunction constructor, the best we can
  6871. // do is to check its .name property.
  6872. (ctor.displayName || ctor.name) === "GeneratorFunction"
  6873. : false;
  6874. };
  6875.  
  6876. runtime.mark = function(genFun) {
  6877. if (Object.setPrototypeOf) {
  6878. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  6879. } else {
  6880. genFun.__proto__ = GeneratorFunctionPrototype;
  6881. if (!(toStringTagSymbol in genFun)) {
  6882. genFun[toStringTagSymbol] = "GeneratorFunction";
  6883. }
  6884. }
  6885. genFun.prototype = Object.create(Gp);
  6886. return genFun;
  6887. };
  6888.  
  6889. // Within the body of any async function, `await x` is transformed to
  6890. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  6891. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  6892. // meant to be awaited.
  6893. runtime.awrap = function(arg) {
  6894. return { __await: arg };
  6895. };
  6896.  
  6897. function AsyncIterator(generator) {
  6898. function invoke(method, arg, resolve, reject) {
  6899. var record = tryCatch(generator[method], generator, arg);
  6900. if (record.type === "throw") {
  6901. reject(record.arg);
  6902. } else {
  6903. var result = record.arg;
  6904. var value = result.value;
  6905. if (value &&
  6906. typeof value === "object" &&
  6907. hasOwn.call(value, "__await")) {
  6908. return Promise.resolve(value.__await).then(function(value) {
  6909. invoke("next", value, resolve, reject);
  6910. }, function(err) {
  6911. invoke("throw", err, resolve, reject);
  6912. });
  6913. }
  6914.  
  6915. return Promise.resolve(value).then(function(unwrapped) {
  6916. // When a yielded Promise is resolved, its final value becomes
  6917. // the .value of the Promise<{value,done}> result for the
  6918. // current iteration. If the Promise is rejected, however, the
  6919. // result for this iteration will be rejected with the same
  6920. // reason. Note that rejections of yielded Promises are not
  6921. // thrown back into the generator function, as is the case
  6922. // when an awaited Promise is rejected. This difference in
  6923. // behavior between yield and await is important, because it
  6924. // allows the consumer to decide what to do with the yielded
  6925. // rejection (swallow it and continue, manually .throw it back
  6926. // into the generator, abandon iteration, whatever). With
  6927. // await, by contrast, there is no opportunity to examine the
  6928. // rejection reason outside the generator function, so the
  6929. // only option is to throw it from the await expression, and
  6930. // let the generator function handle the exception.
  6931. result.value = unwrapped;
  6932. resolve(result);
  6933. }, reject);
  6934. }
  6935. }
  6936.  
  6937. if (typeof global.process === "object" && global.process.domain) {
  6938. invoke = global.process.domain.bind(invoke);
  6939. }
  6940.  
  6941. var previousPromise;
  6942.  
  6943. function enqueue(method, arg) {
  6944. function callInvokeWithMethodAndArg() {
  6945. return new Promise(function(resolve, reject) {
  6946. invoke(method, arg, resolve, reject);
  6947. });
  6948. }
  6949.  
  6950. return previousPromise =
  6951. // If enqueue has been called before, then we want to wait until
  6952. // all previous Promises have been resolved before calling invoke,
  6953. // so that results are always delivered in the correct order. If
  6954. // enqueue has not been called before, then it is important to
  6955. // call invoke immediately, without waiting on a callback to fire,
  6956. // so that the async generator function has the opportunity to do
  6957. // any necessary setup in a predictable way. This predictability
  6958. // is why the Promise constructor synchronously invokes its
  6959. // executor callback, and why async functions synchronously
  6960. // execute code before the first await. Since we implement simple
  6961. // async functions in terms of async generators, it is especially
  6962. // important to get this right, even though it requires care.
  6963. previousPromise ? previousPromise.then(
  6964. callInvokeWithMethodAndArg,
  6965. // Avoid propagating failures to Promises returned by later
  6966. // invocations of the iterator.
  6967. callInvokeWithMethodAndArg
  6968. ) : callInvokeWithMethodAndArg();
  6969. }
  6970.  
  6971. // Define the unified helper method that is used to implement .next,
  6972. // .throw, and .return (see defineIteratorMethods).
  6973. this._invoke = enqueue;
  6974. }
  6975.  
  6976. defineIteratorMethods(AsyncIterator.prototype);
  6977. AsyncIterator.prototype[asyncIteratorSymbol] = function () {
  6978. return this;
  6979. };
  6980. runtime.AsyncIterator = AsyncIterator;
  6981.  
  6982. // Note that simple async functions are implemented on top of
  6983. // AsyncIterator objects; they just return a Promise for the value of
  6984. // the final result produced by the iterator.
  6985. runtime.async = function(innerFn, outerFn, self, tryLocsList) {
  6986. var iter = new AsyncIterator(
  6987. wrap(innerFn, outerFn, self, tryLocsList)
  6988. );
  6989.  
  6990. return runtime.isGeneratorFunction(outerFn)
  6991. ? iter // If outerFn is a generator, return the full iterator.
  6992. : iter.next().then(function(result) {
  6993. return result.done ? result.value : iter.next();
  6994. });
  6995. };
  6996.  
  6997. function makeInvokeMethod(innerFn, self, context) {
  6998. var state = GenStateSuspendedStart;
  6999.  
  7000. return function invoke(method, arg) {
  7001. if (state === GenStateExecuting) {
  7002. throw new Error("Generator is already running");
  7003. }
  7004.  
  7005. if (state === GenStateCompleted) {
  7006. if (method === "throw") {
  7007. throw arg;
  7008. }
  7009.  
  7010. // Be forgiving, per 25.3.3.3.3 of the spec:
  7011. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  7012. return doneResult();
  7013. }
  7014.  
  7015. context.method = method;
  7016. context.arg = arg;
  7017.  
  7018. while (true) {
  7019. var delegate = context.delegate;
  7020. if (delegate) {
  7021. var delegateResult = maybeInvokeDelegate(delegate, context);
  7022. if (delegateResult) {
  7023. if (delegateResult === ContinueSentinel) continue;
  7024. return delegateResult;
  7025. }
  7026. }
  7027.  
  7028. if (context.method === "next") {
  7029. // Setting context._sent for legacy support of Babel's
  7030. // function.sent implementation.
  7031. context.sent = context._sent = context.arg;
  7032.  
  7033. } else if (context.method === "throw") {
  7034. if (state === GenStateSuspendedStart) {
  7035. state = GenStateCompleted;
  7036. throw context.arg;
  7037. }
  7038.  
  7039. context.dispatchException(context.arg);
  7040.  
  7041. } else if (context.method === "return") {
  7042. context.abrupt("return", context.arg);
  7043. }
  7044.  
  7045. state = GenStateExecuting;
  7046.  
  7047. var record = tryCatch(innerFn, self, context);
  7048. if (record.type === "normal") {
  7049. // If an exception is thrown from innerFn, we leave state ===
  7050. // GenStateExecuting and loop back for another invocation.
  7051. state = context.done
  7052. ? GenStateCompleted
  7053. : GenStateSuspendedYield;
  7054.  
  7055. if (record.arg === ContinueSentinel) {
  7056. continue;
  7057. }
  7058.  
  7059. return {
  7060. value: record.arg,
  7061. done: context.done
  7062. };
  7063.  
  7064. } else if (record.type === "throw") {
  7065. state = GenStateCompleted;
  7066. // Dispatch the exception by looping back around to the
  7067. // context.dispatchException(context.arg) call above.
  7068. context.method = "throw";
  7069. context.arg = record.arg;
  7070. }
  7071. }
  7072. };
  7073. }
  7074.  
  7075. // Call delegate.iterator[context.method](context.arg) and handle the
  7076. // result, either by returning a { value, done } result from the
  7077. // delegate iterator, or by modifying context.method and context.arg,
  7078. // setting context.delegate to null, and returning the ContinueSentinel.
  7079. function maybeInvokeDelegate(delegate, context) {
  7080. var method = delegate.iterator[context.method];
  7081. if (method === undefined) {
  7082. // A .throw or .return when the delegate iterator has no .throw
  7083. // method always terminates the yield* loop.
  7084. context.delegate = null;
  7085.  
  7086. if (context.method === "throw") {
  7087. if (delegate.iterator.return) {
  7088. // If the delegate iterator has a return method, give it a
  7089. // chance to clean up.
  7090. context.method = "return";
  7091. context.arg = undefined;
  7092. maybeInvokeDelegate(delegate, context);
  7093.  
  7094. if (context.method === "throw") {
  7095. // If maybeInvokeDelegate(context) changed context.method from
  7096. // "return" to "throw", let that override the TypeError below.
  7097. return ContinueSentinel;
  7098. }
  7099. }
  7100.  
  7101. context.method = "throw";
  7102. context.arg = new TypeError(
  7103. "The iterator does not provide a 'throw' method");
  7104. }
  7105.  
  7106. return ContinueSentinel;
  7107. }
  7108.  
  7109. var record = tryCatch(method, delegate.iterator, context.arg);
  7110.  
  7111. if (record.type === "throw") {
  7112. context.method = "throw";
  7113. context.arg = record.arg;
  7114. context.delegate = null;
  7115. return ContinueSentinel;
  7116. }
  7117.  
  7118. var info = record.arg;
  7119.  
  7120. if (! info) {
  7121. context.method = "throw";
  7122. context.arg = new TypeError("iterator result is not an object");
  7123. context.delegate = null;
  7124. return ContinueSentinel;
  7125. }
  7126.  
  7127. if (info.done) {
  7128. // Assign the result of the finished delegate to the temporary
  7129. // variable specified by delegate.resultName (see delegateYield).
  7130. context[delegate.resultName] = info.value;
  7131.  
  7132. // Resume execution at the desired location (see delegateYield).
  7133. context.next = delegate.nextLoc;
  7134.  
  7135. // If context.method was "throw" but the delegate handled the
  7136. // exception, let the outer generator proceed normally. If
  7137. // context.method was "next", forget context.arg since it has been
  7138. // "consumed" by the delegate iterator. If context.method was
  7139. // "return", allow the original .return call to continue in the
  7140. // outer generator.
  7141. if (context.method !== "return") {
  7142. context.method = "next";
  7143. context.arg = undefined;
  7144. }
  7145.  
  7146. } else {
  7147. // Re-yield the result returned by the delegate method.
  7148. return info;
  7149. }
  7150.  
  7151. // The delegate iterator is finished, so forget it and continue with
  7152. // the outer generator.
  7153. context.delegate = null;
  7154. return ContinueSentinel;
  7155. }
  7156.  
  7157. // Define Generator.prototype.{next,throw,return} in terms of the
  7158. // unified ._invoke helper method.
  7159. defineIteratorMethods(Gp);
  7160.  
  7161. Gp[toStringTagSymbol] = "Generator";
  7162.  
  7163. // A Generator should always return itself as the iterator object when the
  7164. // @@iterator function is called on it. Some browsers' implementations of the
  7165. // iterator prototype chain incorrectly implement this, causing the Generator
  7166. // object to not be returned from this call. This ensures that doesn't happen.
  7167. // See https://github.com/facebook/regenerator/issues/274 for more details.
  7168. Gp[iteratorSymbol] = function() {
  7169. return this;
  7170. };
  7171.  
  7172. Gp.toString = function() {
  7173. return "[object Generator]";
  7174. };
  7175.  
  7176. function pushTryEntry(locs) {
  7177. var entry = { tryLoc: locs[0] };
  7178.  
  7179. if (1 in locs) {
  7180. entry.catchLoc = locs[1];
  7181. }
  7182.  
  7183. if (2 in locs) {
  7184. entry.finallyLoc = locs[2];
  7185. entry.afterLoc = locs[3];
  7186. }
  7187.  
  7188. this.tryEntries.push(entry);
  7189. }
  7190.  
  7191. function resetTryEntry(entry) {
  7192. var record = entry.completion || {};
  7193. record.type = "normal";
  7194. delete record.arg;
  7195. entry.completion = record;
  7196. }
  7197.  
  7198. function Context(tryLocsList) {
  7199. // The root entry object (effectively a try statement without a catch
  7200. // or a finally block) gives us a place to store values thrown from
  7201. // locations where there is no enclosing try statement.
  7202. this.tryEntries = [{ tryLoc: "root" }];
  7203. tryLocsList.forEach(pushTryEntry, this);
  7204. this.reset(true);
  7205. }
  7206.  
  7207. runtime.keys = function(object) {
  7208. var keys = [];
  7209. for (var key in object) {
  7210. keys.push(key);
  7211. }
  7212. keys.reverse();
  7213.  
  7214. // Rather than returning an object with a next method, we keep
  7215. // things simple and return the next function itself.
  7216. return function next() {
  7217. while (keys.length) {
  7218. var key = keys.pop();
  7219. if (key in object) {
  7220. next.value = key;
  7221. next.done = false;
  7222. return next;
  7223. }
  7224. }
  7225.  
  7226. // To avoid creating an additional object, we just hang the .value
  7227. // and .done properties off the next function object itself. This
  7228. // also ensures that the minifier will not anonymize the function.
  7229. next.done = true;
  7230. return next;
  7231. };
  7232. };
  7233.  
  7234. function values(iterable) {
  7235. if (iterable) {
  7236. var iteratorMethod = iterable[iteratorSymbol];
  7237. if (iteratorMethod) {
  7238. return iteratorMethod.call(iterable);
  7239. }
  7240.  
  7241. if (typeof iterable.next === "function") {
  7242. return iterable;
  7243. }
  7244.  
  7245. if (!isNaN(iterable.length)) {
  7246. var i = -1, next = function next() {
  7247. while (++i < iterable.length) {
  7248. if (hasOwn.call(iterable, i)) {
  7249. next.value = iterable[i];
  7250. next.done = false;
  7251. return next;
  7252. }
  7253. }
  7254.  
  7255. next.value = undefined;
  7256. next.done = true;
  7257.  
  7258. return next;
  7259. };
  7260.  
  7261. return next.next = next;
  7262. }
  7263. }
  7264.  
  7265. // Return an iterator with no values.
  7266. return { next: doneResult };
  7267. }
  7268. runtime.values = values;
  7269.  
  7270. function doneResult() {
  7271. return { value: undefined, done: true };
  7272. }
  7273.  
  7274. Context.prototype = {
  7275. constructor: Context,
  7276.  
  7277. reset: function(skipTempReset) {
  7278. this.prev = 0;
  7279. this.next = 0;
  7280. // Resetting context._sent for legacy support of Babel's
  7281. // function.sent implementation.
  7282. this.sent = this._sent = undefined;
  7283. this.done = false;
  7284. this.delegate = null;
  7285.  
  7286. this.method = "next";
  7287. this.arg = undefined;
  7288.  
  7289. this.tryEntries.forEach(resetTryEntry);
  7290.  
  7291. if (!skipTempReset) {
  7292. for (var name in this) {
  7293. // Not sure about the optimal order of these conditions:
  7294. if (name.charAt(0) === "t" &&
  7295. hasOwn.call(this, name) &&
  7296. !isNaN(+name.slice(1))) {
  7297. this[name] = undefined;
  7298. }
  7299. }
  7300. }
  7301. },
  7302.  
  7303. stop: function() {
  7304. this.done = true;
  7305.  
  7306. var rootEntry = this.tryEntries[0];
  7307. var rootRecord = rootEntry.completion;
  7308. if (rootRecord.type === "throw") {
  7309. throw rootRecord.arg;
  7310. }
  7311.  
  7312. return this.rval;
  7313. },
  7314.  
  7315. dispatchException: function(exception) {
  7316. if (this.done) {
  7317. throw exception;
  7318. }
  7319.  
  7320. var context = this;
  7321. function handle(loc, caught) {
  7322. record.type = "throw";
  7323. record.arg = exception;
  7324. context.next = loc;
  7325.  
  7326. if (caught) {
  7327. // If the dispatched exception was caught by a catch block,
  7328. // then let that catch block handle the exception normally.
  7329. context.method = "next";
  7330. context.arg = undefined;
  7331. }
  7332.  
  7333. return !! caught;
  7334. }
  7335.  
  7336. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  7337. var entry = this.tryEntries[i];
  7338. var record = entry.completion;
  7339.  
  7340. if (entry.tryLoc === "root") {
  7341. // Exception thrown outside of any try block that could handle
  7342. // it, so set the completion value of the entire function to
  7343. // throw the exception.
  7344. return handle("end");
  7345. }
  7346.  
  7347. if (entry.tryLoc <= this.prev) {
  7348. var hasCatch = hasOwn.call(entry, "catchLoc");
  7349. var hasFinally = hasOwn.call(entry, "finallyLoc");
  7350.  
  7351. if (hasCatch && hasFinally) {
  7352. if (this.prev < entry.catchLoc) {
  7353. return handle(entry.catchLoc, true);
  7354. } else if (this.prev < entry.finallyLoc) {
  7355. return handle(entry.finallyLoc);
  7356. }
  7357.  
  7358. } else if (hasCatch) {
  7359. if (this.prev < entry.catchLoc) {
  7360. return handle(entry.catchLoc, true);
  7361. }
  7362.  
  7363. } else if (hasFinally) {
  7364. if (this.prev < entry.finallyLoc) {
  7365. return handle(entry.finallyLoc);
  7366. }
  7367.  
  7368. } else {
  7369. throw new Error("try statement without catch or finally");
  7370. }
  7371. }
  7372. }
  7373. },
  7374.  
  7375. abrupt: function(type, arg) {
  7376. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  7377. var entry = this.tryEntries[i];
  7378. if (entry.tryLoc <= this.prev &&
  7379. hasOwn.call(entry, "finallyLoc") &&
  7380. this.prev < entry.finallyLoc) {
  7381. var finallyEntry = entry;
  7382. break;
  7383. }
  7384. }
  7385.  
  7386. if (finallyEntry &&
  7387. (type === "break" ||
  7388. type === "continue") &&
  7389. finallyEntry.tryLoc <= arg &&
  7390. arg <= finallyEntry.finallyLoc) {
  7391. // Ignore the finally entry if control is not jumping to a
  7392. // location outside the try/catch block.
  7393. finallyEntry = null;
  7394. }
  7395.  
  7396. var record = finallyEntry ? finallyEntry.completion : {};
  7397. record.type = type;
  7398. record.arg = arg;
  7399.  
  7400. if (finallyEntry) {
  7401. this.method = "next";
  7402. this.next = finallyEntry.finallyLoc;
  7403. return ContinueSentinel;
  7404. }
  7405.  
  7406. return this.complete(record);
  7407. },
  7408.  
  7409. complete: function(record, afterLoc) {
  7410. if (record.type === "throw") {
  7411. throw record.arg;
  7412. }
  7413.  
  7414. if (record.type === "break" ||
  7415. record.type === "continue") {
  7416. this.next = record.arg;
  7417. } else if (record.type === "return") {
  7418. this.rval = this.arg = record.arg;
  7419. this.method = "return";
  7420. this.next = "end";
  7421. } else if (record.type === "normal" && afterLoc) {
  7422. this.next = afterLoc;
  7423. }
  7424.  
  7425. return ContinueSentinel;
  7426. },
  7427.  
  7428. finish: function(finallyLoc) {
  7429. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  7430. var entry = this.tryEntries[i];
  7431. if (entry.finallyLoc === finallyLoc) {
  7432. this.complete(entry.completion, entry.afterLoc);
  7433. resetTryEntry(entry);
  7434. return ContinueSentinel;
  7435. }
  7436. }
  7437. },
  7438.  
  7439. "catch": function(tryLoc) {
  7440. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  7441. var entry = this.tryEntries[i];
  7442. if (entry.tryLoc === tryLoc) {
  7443. var record = entry.completion;
  7444. if (record.type === "throw") {
  7445. var thrown = record.arg;
  7446. resetTryEntry(entry);
  7447. }
  7448. return thrown;
  7449. }
  7450. }
  7451.  
  7452. // The context.catch method must only be called with a location
  7453. // argument that corresponds to a known catch block.
  7454. throw new Error("illegal catch attempt");
  7455. },
  7456.  
  7457. delegateYield: function(iterable, resultName, nextLoc) {
  7458. this.delegate = {
  7459. iterator: values(iterable),
  7460. resultName: resultName,
  7461. nextLoc: nextLoc
  7462. };
  7463.  
  7464. if (this.method === "next") {
  7465. // Deliberately forget the last sent value so that we don't
  7466. // accidentally pass it on to the delegate.
  7467. this.arg = undefined;
  7468. }
  7469.  
  7470. return ContinueSentinel;
  7471. }
  7472. };
  7473. })(
  7474. // Among the various tricks for obtaining a reference to the global
  7475. // object, this seems to be the most reliable technique that does not
  7476. // use indirect eval (which violates Content Security Policy).
  7477. typeof global === "object" ? global :
  7478. typeof window === "object" ? window :
  7479. typeof self === "object" ? self : this
  7480. );
  7481.  
  7482. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
  7483.  
  7484. /***/ }),
  7485. /* 34 */
  7486. /***/ (function(module, exports, __webpack_require__) {
  7487.  
  7488. "use strict";
  7489.  
  7490.  
  7491. Object.defineProperty(exports, "__esModule", {
  7492. value: true
  7493. });
  7494.  
  7495. function getVideoUrl(tvid, vid) {
  7496. return new Promise(function (resolve, reject) {
  7497. GM_xmlhttpRequest({
  7498. url: 'http://cache.video.qiyi.com/jp/vi/' + tvid + '/' + vid + '/?callback=callback',
  7499. method: 'GET',
  7500. timeout: 8e3,
  7501. onload: function onload(details) {
  7502. try {
  7503. var json = JSON.parse(/callback\s*\(\s*(\{.*\})\s*\)/.exec(details.responseText)[1]);
  7504. resolve(json.vu);
  7505. } catch (err) {
  7506. reject(err);
  7507. }
  7508. },
  7509. onerror: reject,
  7510. onabort: reject,
  7511. ontimeout: reject
  7512. });
  7513. });
  7514. }
  7515.  
  7516. function findVid(text) {
  7517. var result = /vid=([\da-z]+)/i.exec(text);
  7518. return result ? result[1] : null;
  7519. }
  7520.  
  7521. function findTvid(text) {
  7522. var result = /tvid=(\d+)/i.exec(text);
  7523. return result ? result[1] : null;
  7524. }
  7525.  
  7526. exports.getVideoUrl = getVideoUrl;
  7527. exports.findVid = findVid;
  7528. exports.findTvid = findTvid;
  7529.  
  7530. /***/ })
  7531. /******/ ]);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址