@vtx/player 1.7.14 → 1.7.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +2 -2
  2. package/lib/api/fetch.js +91 -62
  3. package/lib/api/fetch.js.map +1 -1
  4. package/lib/api/index.js +63 -18
  5. package/lib/api/index.js.map +1 -1
  6. package/lib/api/types.d.ts +5 -5
  7. package/lib/bd/PlayerManager.js +68 -38
  8. package/lib/bd/PlayerManager.js.map +1 -1
  9. package/lib/bill-player/index.d.ts +1 -1
  10. package/lib/bill-player/index.js +121 -66
  11. package/lib/bill-player/index.js.map +1 -1
  12. package/lib/bill-player/style/css.js +9 -0
  13. package/lib/bill-player/style/css.js.map +1 -1
  14. package/lib/bill-player/style/index.js +9 -0
  15. package/lib/bill-player/style/index.js.map +1 -1
  16. package/lib/bill-player/style/index.less +297 -297
  17. package/lib/components/set-tag-video/index.js +34 -6
  18. package/lib/components/set-tag-video/index.js.map +1 -1
  19. package/lib/components/set-tag-video/style/css.js.map +1 -1
  20. package/lib/components/set-tag-video/style/index.js.map +1 -1
  21. package/lib/components/set-tag-video/style/index.less +125 -125
  22. package/lib/components/split-screen/index.d.ts +1 -1
  23. package/lib/components/split-screen/index.js +14 -3
  24. package/lib/components/split-screen/index.js.map +1 -1
  25. package/lib/components/split-screen/style/css.js.map +1 -1
  26. package/lib/components/split-screen/style/index.js.map +1 -1
  27. package/lib/components/tag-video/index.js +38 -10
  28. package/lib/components/tag-video/index.js.map +1 -1
  29. package/lib/components/tag-video/style/css.js.map +1 -1
  30. package/lib/components/tag-video/style/index.js.map +1 -1
  31. package/lib/components/tag-video/style/index.less +69 -69
  32. package/lib/components/video-scale/index.d.ts +1 -1
  33. package/lib/components/video-scale/index.js +9 -2
  34. package/lib/components/video-scale/index.js.map +1 -1
  35. package/lib/components/video-scale/style/css.js.map +1 -1
  36. package/lib/components/video-scale/style/index.js.map +1 -1
  37. package/lib/context/index.js +4 -0
  38. package/lib/context/index.js.map +1 -1
  39. package/lib/controls/index.d.ts +11 -11
  40. package/lib/controls/index.js +99 -34
  41. package/lib/controls/index.js.map +1 -1
  42. package/lib/controls/style/css.js +5 -0
  43. package/lib/controls/style/css.js.map +1 -1
  44. package/lib/controls/style/index.js +5 -0
  45. package/lib/controls/style/index.js.map +1 -1
  46. package/lib/controls/style/index.less +188 -188
  47. package/lib/h264/PlayerManager.js +27 -18
  48. package/lib/h264/PlayerManager.js.map +1 -1
  49. package/lib/history-control/index.d.ts +2 -2
  50. package/lib/history-control/index.js +121 -61
  51. package/lib/history-control/index.js.map +1 -1
  52. package/lib/history-control/style/css.js +6 -0
  53. package/lib/history-control/style/css.js.map +1 -1
  54. package/lib/history-control/style/index.js +6 -0
  55. package/lib/history-control/style/index.js.map +1 -1
  56. package/lib/history-control/style/index.less +252 -252
  57. package/lib/history-control-v2/components/grid-item/index.js +79 -38
  58. package/lib/history-control-v2/components/grid-item/index.js.map +1 -1
  59. package/lib/history-control-v2/components/panel/index.js +114 -44
  60. package/lib/history-control-v2/components/panel/index.js.map +1 -1
  61. package/lib/history-control-v2/context.js +2 -0
  62. package/lib/history-control-v2/context.js.map +1 -1
  63. package/lib/history-control-v2/index.d.ts +4 -4
  64. package/lib/history-control-v2/index.js +166 -97
  65. package/lib/history-control-v2/index.js.map +1 -1
  66. package/lib/history-control-v2/style/css.js +10 -0
  67. package/lib/history-control-v2/style/css.js.map +1 -1
  68. package/lib/history-control-v2/style/index.js +10 -0
  69. package/lib/history-control-v2/style/index.js.map +1 -1
  70. package/lib/history-control-v2/style/index.less +437 -437
  71. package/lib/history-control-v2/utils.js +21 -1
  72. package/lib/history-control-v2/utils.js.map +1 -1
  73. package/lib/history-player/index.d.ts +3 -3
  74. package/lib/history-player/index.js +210 -146
  75. package/lib/history-player/index.js.map +1 -1
  76. package/lib/history-player/style/css.js +3 -0
  77. package/lib/history-player/style/css.js.map +1 -1
  78. package/lib/history-player/style/index.js +3 -0
  79. package/lib/history-player/style/index.js.map +1 -1
  80. package/lib/history-player/style/index.less +102 -102
  81. package/lib/hooks/useSettings.js +6 -1
  82. package/lib/hooks/useSettings.js.map +1 -1
  83. package/lib/icc/PlayerManager.js +57 -26
  84. package/lib/icc/PlayerManager.js.map +1 -1
  85. package/lib/icc/api.d.ts +68 -0
  86. package/lib/icc/api.js +16 -2
  87. package/lib/icc/api.js.map +1 -1
  88. package/lib/icons/index.d.ts +36 -36
  89. package/lib/icons/index.js +171 -23
  90. package/lib/icons/index.js.map +1 -1
  91. package/lib/icons/index.less +32 -32
  92. package/lib/index.js +10 -0
  93. package/lib/index.js.map +1 -1
  94. package/lib/live-channel-player/index.d.ts +1 -1
  95. package/lib/live-channel-player/index.js +67 -31
  96. package/lib/live-channel-player/index.js.map +1 -1
  97. package/lib/live-channel-player/style/css.js +1 -0
  98. package/lib/live-channel-player/style/css.js.map +1 -1
  99. package/lib/live-channel-player/style/index.js +1 -0
  100. package/lib/live-channel-player/style/index.js.map +1 -1
  101. package/lib/live-control/index.d.ts +2 -2
  102. package/lib/live-control/index.js +86 -35
  103. package/lib/live-control/index.js.map +1 -1
  104. package/lib/live-control/style/css.js +4 -0
  105. package/lib/live-control/style/css.js.map +1 -1
  106. package/lib/live-control/style/index.js +4 -0
  107. package/lib/live-control/style/index.js.map +1 -1
  108. package/lib/live-control/style/index.less +99 -99
  109. package/lib/live-control-v2/index.d.ts +3 -3
  110. package/lib/live-control-v2/index.js +141 -108
  111. package/lib/live-control-v2/index.js.map +1 -1
  112. package/lib/live-control-v2/style/css.js +7 -0
  113. package/lib/live-control-v2/style/css.js.map +1 -1
  114. package/lib/live-control-v2/style/index.js +7 -0
  115. package/lib/live-control-v2/style/index.js.map +1 -1
  116. package/lib/live-control-v2/style/index.less +192 -192
  117. package/lib/live-player/index.js +136 -95
  118. package/lib/live-player/index.js.map +1 -1
  119. package/lib/live-player/style/css.js +2 -0
  120. package/lib/live-player/style/css.js.map +1 -1
  121. package/lib/live-player/style/index.js +2 -0
  122. package/lib/live-player/style/index.js.map +1 -1
  123. package/lib/live-player/style/index.less +75 -75
  124. package/lib/player/index.d.ts +1 -1
  125. package/lib/player/index.js +244 -79
  126. package/lib/player/index.js.map +1 -1
  127. package/lib/rsl/PlayerManager.js +64 -18
  128. package/lib/rsl/PlayerManager.js.map +1 -1
  129. package/lib/typings/@vtx/utils/index.d.ts +28 -28
  130. package/lib/typings/h5player.d.ts +146 -146
  131. package/lib/typings/webrtcplayer.d.ts +56 -56
  132. package/lib/typings/wsplayer.d.ts +99 -99
  133. package/lib/utils/index.d.ts +1 -1
  134. package/lib/utils/index.js +91 -12
  135. package/lib/utils/index.js.map +1 -1
  136. package/lib/vite-env.d.ts +1 -1
  137. package/lib/vtxHls/PlayerManager.js +20 -6
  138. package/lib/vtxHls/PlayerManager.js.map +1 -1
  139. package/lib/vtxHls/WhepManager.js +72 -9
  140. package/lib/vtxHls/WhepManager.js.map +1 -1
  141. package/lib/webrtc/PlayerManager.js +41 -28
  142. package/lib/webrtc/PlayerManager.js.map +1 -1
  143. package/package.json +125 -125
package/lib/vite-env.d.ts CHANGED
@@ -1 +1 @@
1
- /// <reference types="vite/client" />
1
+ /// <reference types="vite/client" />
@@ -4,26 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports["default"] = void 0;
7
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
7
+
8
8
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9
- 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, _toPropertyKey(descriptor.key), descriptor); } }
9
+
10
+ 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); } }
11
+
10
12
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
11
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
12
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+
13
14
  var VtxHlsPlayerManager = /*#__PURE__*/function () {
14
15
  function VtxHlsPlayerManager(opt) {
15
16
  _classCallCheck(this, VtxHlsPlayerManager);
17
+
16
18
  this.url = opt.url;
17
19
  this.video = opt.video;
18
20
  this.player = null;
19
21
  this.timer = null;
20
22
  this.initPlayer();
21
- }
22
- //初始化视频插件
23
+ } //初始化视频插件
24
+
25
+
23
26
  _createClass(VtxHlsPlayerManager, [{
24
27
  key: "initPlayer",
25
28
  value: function initPlayer() {
26
29
  var _this = this;
30
+
27
31
  var video = this.video;
28
32
  var hls = new Hls({
29
33
  maxLiveSyncPlaybackRate: 1.5
@@ -34,7 +38,9 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
34
38
  _this.player.recoverMediaError();
35
39
  } else if (data.fatal) {
36
40
  _this.timer && clearTimeout(_this.timer);
41
+
37
42
  _this.player.destroy();
43
+
38
44
  _this.timer = setTimeout(function () {
39
45
  return _this.initPlayer(video);
40
46
  }, 300);
@@ -52,6 +58,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
52
58
  * 倍速播放
53
59
  * @param {number} speed 速率 0.125 0.25 0.5 1 2 4 8 共7种速率
54
60
  */
61
+
55
62
  }, {
56
63
  key: "playSpeed",
57
64
  value: function playSpeed(speed) {
@@ -61,6 +68,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
61
68
  * 关闭播放器
62
69
  * @param {number} index 可选,关闭指定索引的窗口的播放器,不传则表示关闭所有播放器
63
70
  */
71
+
64
72
  }, {
65
73
  key: "close",
66
74
  value: function close() {
@@ -78,6 +86,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
78
86
  /**
79
87
  * 设置全屏
80
88
  */
89
+
81
90
  }, {
82
91
  key: "setFullScreen",
83
92
  value: function setFullScreen() {
@@ -87,6 +96,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
87
96
  * 设置窗口自适应还是拉伸
88
97
  * @param {string} playerAdapter selfAdaption 自适应 | stretching 拉伸
89
98
  */
99
+
90
100
  }, {
91
101
  key: "setPlayerAdapter",
92
102
  value: function setPlayerAdapter(playerAdapter) {
@@ -96,6 +106,7 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
96
106
  * 控制视频播放器显示的路数: 1 4 9 16 25,不会超过最大显示路数
97
107
  * @param {number} number
98
108
  */
109
+
99
110
  }, {
100
111
  key: "setPlayerNum",
101
112
  value: function setPlayerNum(number) {
@@ -105,14 +116,17 @@ var VtxHlsPlayerManager = /*#__PURE__*/function () {
105
116
  * 设置选中的播放器的索引
106
117
  * @param {number} index
107
118
  */
119
+
108
120
  }, {
109
121
  key: "setSelectIndex",
110
122
  value: function setSelectIndex(index) {
111
123
  this.player.setSelectIndex(index);
112
124
  }
113
125
  }]);
126
+
114
127
  return VtxHlsPlayerManager;
115
128
  }();
129
+
116
130
  var _default = VtxHlsPlayerManager;
117
131
  exports["default"] = _default;
118
132
  //# sourceMappingURL=PlayerManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlayerManager.js","names":["VtxHlsPlayerManager","opt","_classCallCheck","url","video","player","timer","initPlayer","_createClass","key","value","_this","hls","Hls","maxLiveSyncPlaybackRate","on","Events","ERROR","evt","data","type","ErrorTypes","MEDIA_ERROR","recoverMediaError","fatal","clearTimeout","destroy","setTimeout","MEDIA_ATTACHED","loadSource","concat","MANIFEST_PARSED","play","attachMedia","playSpeed","speed","recordPlayer","close","resize","setSize","setFullScreen","fullScreen","setPlayerAdapter","playerAdapter","setPlayerNum","number","setSelectIndex","index","_default","exports"],"sources":["vtxHls/PlayerManager.js"],"sourcesContent":["class VtxHlsPlayerManager {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.player = null;\n this.timer = null;\n this.initPlayer();\n }\n //初始化视频插件\n initPlayer() {\n const video = this.video;\n const hls = new Hls({\n maxLiveSyncPlaybackRate: 1.5,\n });\n this.player = hls;\n this.player.on(Hls.Events.ERROR, (evt, data) => {\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n this.player.recoverMediaError();\n }\n else if (data.fatal) {\n this.timer && clearTimeout(this.timer);\n this.player.destroy();\n this.timer = setTimeout(() => this.initPlayer(video), 300);\n }\n });\n this.player.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.player.loadSource(`${this.url}index.m3u8`);\n });\n this.player.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n this.player.attachMedia(video);\n }\n /**\n * 倍速播放\n * @param {number} speed 速率 0.125 0.25 0.5 1 2 4 8 共7种速率\n */\n playSpeed(speed) {\n this.recordPlayer && this.recordPlayer.playSpeed(speed);\n }\n /**\n * 关闭播放器\n * @param {number} index 可选,关闭指定索引的窗口的播放器,不传则表示关闭所有播放器\n */\n close() {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n this.timer = null;\n }\n }\n resize() {\n this.player && this.player.setSize();\n }\n /**\n * 设置全屏\n */\n setFullScreen() {\n this.player.fullScreen();\n }\n /**\n * 设置窗口自适应还是拉伸\n * @param {string} playerAdapter selfAdaption 自适应 | stretching 拉伸\n */\n setPlayerAdapter(playerAdapter) {\n this.player.setPlayerAdapter(playerAdapter);\n }\n /**\n * 控制视频播放器显示的路数: 1 4 9 16 25,不会超过最大显示路数\n * @param {number} number\n */\n setPlayerNum(number) {\n this.player.setPlayerNum(number);\n }\n /**\n * 设置选中的播放器的索引\n * @param {number} index\n */\n setSelectIndex(index) {\n this.player.setSelectIndex(index);\n }\n}\nexport default VtxHlsPlayerManager;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PlayerManager.js","names":["VtxHlsPlayerManager","opt","url","video","player","timer","initPlayer","hls","Hls","maxLiveSyncPlaybackRate","on","Events","ERROR","evt","data","type","ErrorTypes","MEDIA_ERROR","recoverMediaError","fatal","clearTimeout","destroy","setTimeout","MEDIA_ATTACHED","loadSource","MANIFEST_PARSED","play","attachMedia","speed","recordPlayer","playSpeed","setSize","fullScreen","playerAdapter","setPlayerAdapter","number","setPlayerNum","index","setSelectIndex"],"sources":["vtxHls/PlayerManager.js"],"sourcesContent":["class VtxHlsPlayerManager {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.player = null;\n this.timer = null;\n this.initPlayer();\n }\n //初始化视频插件\n initPlayer() {\n const video = this.video;\n const hls = new Hls({\n maxLiveSyncPlaybackRate: 1.5,\n });\n this.player = hls;\n this.player.on(Hls.Events.ERROR, (evt, data) => {\n if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n this.player.recoverMediaError();\n }\n else if (data.fatal) {\n this.timer && clearTimeout(this.timer);\n this.player.destroy();\n this.timer = setTimeout(() => this.initPlayer(video), 300);\n }\n });\n this.player.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.player.loadSource(`${this.url}index.m3u8`);\n });\n this.player.on(Hls.Events.MANIFEST_PARSED, () => {\n video.play();\n });\n this.player.attachMedia(video);\n }\n /**\n * 倍速播放\n * @param {number} speed 速率 0.125 0.25 0.5 1 2 4 8 共7种速率\n */\n playSpeed(speed) {\n this.recordPlayer && this.recordPlayer.playSpeed(speed);\n }\n /**\n * 关闭播放器\n * @param {number} index 可选,关闭指定索引的窗口的播放器,不传则表示关闭所有播放器\n */\n close() {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n this.timer = null;\n }\n }\n resize() {\n this.player && this.player.setSize();\n }\n /**\n * 设置全屏\n */\n setFullScreen() {\n this.player.fullScreen();\n }\n /**\n * 设置窗口自适应还是拉伸\n * @param {string} playerAdapter selfAdaption 自适应 | stretching 拉伸\n */\n setPlayerAdapter(playerAdapter) {\n this.player.setPlayerAdapter(playerAdapter);\n }\n /**\n * 控制视频播放器显示的路数: 1 4 9 16 25,不会超过最大显示路数\n * @param {number} number\n */\n setPlayerNum(number) {\n this.player.setPlayerNum(number);\n }\n /**\n * 设置选中的播放器的索引\n * @param {number} index\n */\n setSelectIndex(index) {\n this.player.setSelectIndex(index);\n }\n}\nexport default VtxHlsPlayerManager;\n"],"mappings":";;;;;;;;;;;;;IAAMA,mB;EACF,6BAAYC,GAAZ,EAAiB;IAAA;;IACb,KAAKC,GAAL,GAAWD,GAAG,CAACC,GAAf;IACA,KAAKC,KAAL,GAAaF,GAAG,CAACE,KAAjB;IACA,KAAKC,MAAL,GAAc,IAAd;IACA,KAAKC,KAAL,GAAa,IAAb;IACA,KAAKC,UAAL;EACH,C,CACD;;;;;WACA,sBAAa;MAAA;;MACT,IAAMH,KAAK,GAAG,KAAKA,KAAnB;MACA,IAAMI,GAAG,GAAG,IAAIC,GAAJ,CAAQ;QAChBC,uBAAuB,EAAE;MADT,CAAR,CAAZ;MAGA,KAAKL,MAAL,GAAcG,GAAd;MACA,KAAKH,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWC,KAA1B,EAAiC,UAACC,GAAD,EAAMC,IAAN,EAAe;QAC5C,IAAIA,IAAI,CAACC,IAAL,KAAcP,GAAG,CAACQ,UAAJ,CAAeC,WAAjC,EAA8C;UAC1C,KAAI,CAACb,MAAL,CAAYc,iBAAZ;QACH,CAFD,MAGK,IAAIJ,IAAI,CAACK,KAAT,EAAgB;UACjB,KAAI,CAACd,KAAL,IAAce,YAAY,CAAC,KAAI,CAACf,KAAN,CAA1B;;UACA,KAAI,CAACD,MAAL,CAAYiB,OAAZ;;UACA,KAAI,CAAChB,KAAL,GAAaiB,UAAU,CAAC;YAAA,OAAM,KAAI,CAAChB,UAAL,CAAgBH,KAAhB,CAAN;UAAA,CAAD,EAA+B,GAA/B,CAAvB;QACH;MACJ,CATD;MAUA,KAAKC,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWY,cAA1B,EAA0C,YAAM;QAC5C,KAAI,CAACnB,MAAL,CAAYoB,UAAZ,WAA0B,KAAI,CAACtB,GAA/B;MACH,CAFD;MAGA,KAAKE,MAAL,CAAYM,EAAZ,CAAeF,GAAG,CAACG,MAAJ,CAAWc,eAA1B,EAA2C,YAAM;QAC7CtB,KAAK,CAACuB,IAAN;MACH,CAFD;MAGA,KAAKtB,MAAL,CAAYuB,WAAZ,CAAwBxB,KAAxB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,mBAAUyB,KAAV,EAAiB;MACb,KAAKC,YAAL,IAAqB,KAAKA,YAAL,CAAkBC,SAAlB,CAA4BF,KAA5B,CAArB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,iBAAQ;MACJ,IAAI,KAAKxB,MAAT,EAAiB;QACb,KAAKA,MAAL,CAAYiB,OAAZ;QACA,KAAKjB,MAAL,GAAc,IAAd;QACA,KAAKC,KAAL,GAAa,IAAb;MACH;IACJ;;;WACD,kBAAS;MACL,KAAKD,MAAL,IAAe,KAAKA,MAAL,CAAY2B,OAAZ,EAAf;IACH;IACD;AACJ;AACA;;;;WACI,yBAAgB;MACZ,KAAK3B,MAAL,CAAY4B,UAAZ;IACH;IACD;AACJ;AACA;AACA;;;;WACI,0BAAiBC,aAAjB,EAAgC;MAC5B,KAAK7B,MAAL,CAAY8B,gBAAZ,CAA6BD,aAA7B;IACH;IACD;AACJ;AACA;AACA;;;;WACI,sBAAaE,MAAb,EAAqB;MACjB,KAAK/B,MAAL,CAAYgC,YAAZ,CAAyBD,MAAzB;IACH;IACD;AACJ;AACA;AACA;;;;WACI,wBAAeE,KAAf,EAAsB;MAClB,KAAKjC,MAAL,CAAYkC,cAAZ,CAA2BD,KAA3B;IACH;;;;;;eAEUrC,mB"}
@@ -1,78 +1,99 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports["default"] = void 0;
7
+
8
8
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9
- 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, _toPropertyKey(descriptor.key), descriptor); } }
9
+
10
+ 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); } }
11
+
10
12
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
11
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
12
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+
13
14
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
+
14
16
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
17
+
18
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
19
+
16
20
  var restartPause = 2000;
21
+
17
22
  var linkToIceServers = function linkToIceServers(links) {
18
23
  return links !== null ? links.split(', ').map(function (link) {
19
24
  var m = link.match(/^<(.+?)>; rel="ice-server"(; username="(.*?)"; credential="(.*?)"; credential-type="password")?/i);
20
25
  var ret = {
21
26
  urls: [m[1]]
22
27
  };
28
+
23
29
  if (m[3] !== undefined) {
24
30
  ret.username = unquoteCredential(m[3]);
25
31
  ret.credential = unquoteCredential(m[4]);
26
32
  ret.credentialType = 'password';
27
33
  }
34
+
28
35
  return ret;
29
36
  }) : [];
30
37
  };
38
+
31
39
  var editOffer = function editOffer(offer) {
32
40
  var sections = offer.sdp.split('m=');
41
+
33
42
  for (var i = 0; i < sections.length; i++) {
34
43
  var section = sections[i];
44
+
35
45
  if (section.startsWith('audio')) {
36
46
  sections[i] = enableStereoOpus(section);
37
47
  }
38
48
  }
49
+
39
50
  offer.sdp = sections.join('m=');
40
51
  };
52
+
41
53
  var enableStereoOpus = function enableStereoOpus(section) {
42
54
  var opusPayloadFormat = '';
43
55
  var lines = section.split('\r\n');
56
+
44
57
  for (var i = 0; i < lines.length; i++) {
45
58
  if (lines[i].startsWith('a=rtpmap:') && lines[i].toLowerCase().includes('opus/')) {
46
59
  opusPayloadFormat = lines[i].slice('a=rtpmap:'.length).split(' ')[0];
47
60
  break;
48
61
  }
49
62
  }
63
+
50
64
  if (opusPayloadFormat === '') {
51
65
  return section;
52
66
  }
67
+
53
68
  for (var _i = 0; _i < lines.length; _i++) {
54
69
  if (lines[_i].startsWith('a=fmtp:' + opusPayloadFormat + ' ')) {
55
70
  if (!lines[_i].includes('stereo')) {
56
71
  lines[_i] += ';stereo=1';
57
72
  }
73
+
58
74
  if (!lines[_i].includes('sprop-stereo')) {
59
75
  lines[_i] += ';sprop-stereo=1';
60
76
  }
61
77
  }
62
78
  }
79
+
63
80
  return lines.join('\r\n');
64
81
  };
82
+
65
83
  var parseOffer = function parseOffer(offer) {
66
84
  var ret = {
67
85
  iceUfrag: '',
68
86
  icePwd: '',
69
87
  medias: []
70
88
  };
89
+
71
90
  var _iterator = _createForOfIteratorHelper(offer.split('\r\n')),
72
- _step;
91
+ _step;
92
+
73
93
  try {
74
94
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
75
95
  var line = _step.value;
96
+
76
97
  if (line.startsWith('m=')) {
77
98
  ret.medias.push(line.slice('m='.length));
78
99
  } else if (ret.iceUfrag === '' && line.startsWith('a=ice-ufrag:')) {
@@ -86,19 +107,25 @@ var parseOffer = function parseOffer(offer) {
86
107
  } finally {
87
108
  _iterator.f();
88
109
  }
110
+
89
111
  return ret;
90
112
  };
113
+
91
114
  var generateSdpFragment = function generateSdpFragment(offerData, candidates) {
92
115
  var candidatesByMedia = {};
116
+
93
117
  var _iterator2 = _createForOfIteratorHelper(candidates),
94
- _step2;
118
+ _step2;
119
+
95
120
  try {
96
121
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
97
122
  var candidate = _step2.value;
98
123
  var _mid = candidate.sdpMLineIndex;
124
+
99
125
  if (candidatesByMedia[_mid] === undefined) {
100
126
  candidatesByMedia[_mid] = [];
101
127
  }
128
+
102
129
  candidatesByMedia[_mid].push(candidate);
103
130
  }
104
131
  } catch (err) {
@@ -106,17 +133,23 @@ var generateSdpFragment = function generateSdpFragment(offerData, candidates) {
106
133
  } finally {
107
134
  _iterator2.f();
108
135
  }
136
+
109
137
  var frag = 'a=ice-ufrag:' + offerData.iceUfrag + '\r\n' + 'a=ice-pwd:' + offerData.icePwd + '\r\n';
110
138
  var mid = 0;
139
+
111
140
  var _iterator3 = _createForOfIteratorHelper(offerData.medias),
112
- _step3;
141
+ _step3;
142
+
113
143
  try {
114
144
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
115
145
  var media = _step3.value;
146
+
116
147
  if (candidatesByMedia[mid] !== undefined) {
117
148
  frag += 'm=' + media + '\r\n' + 'a=mid:' + mid + '\r\n';
149
+
118
150
  var _iterator4 = _createForOfIteratorHelper(candidatesByMedia[mid]),
119
- _step4;
151
+ _step4;
152
+
120
153
  try {
121
154
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
122
155
  var _candidate = _step4.value;
@@ -128,6 +161,7 @@ var generateSdpFragment = function generateSdpFragment(offerData, candidates) {
128
161
  _iterator4.f();
129
162
  }
130
163
  }
164
+
131
165
  mid++;
132
166
  }
133
167
  } catch (err) {
@@ -135,11 +169,14 @@ var generateSdpFragment = function generateSdpFragment(offerData, candidates) {
135
169
  } finally {
136
170
  _iterator3.f();
137
171
  }
172
+
138
173
  return frag;
139
174
  };
175
+
140
176
  var WHEPClient = /*#__PURE__*/function () {
141
177
  function WHEPClient(opt) {
142
178
  _classCallCheck(this, WHEPClient);
179
+
143
180
  this.url = opt.url;
144
181
  this.video = opt.video;
145
182
  this.pc = null;
@@ -148,10 +185,12 @@ var WHEPClient = /*#__PURE__*/function () {
148
185
  this.queuedCandidates = [];
149
186
  this.start();
150
187
  }
188
+
151
189
  _createClass(WHEPClient, [{
152
190
  key: "start",
153
191
  value: function start() {
154
192
  var _this = this;
193
+
155
194
  console.log('requesting ICE servers');
156
195
  fetch(new URL('whep', this.url), {
157
196
  method: 'OPTIONS'
@@ -159,6 +198,7 @@ var WHEPClient = /*#__PURE__*/function () {
159
198
  return _this.onIceServers(res);
160
199
  })["catch"](function (err) {
161
200
  console.log('error: ' + err);
201
+
162
202
  _this.scheduleRestart();
163
203
  });
164
204
  }
@@ -166,6 +206,7 @@ var WHEPClient = /*#__PURE__*/function () {
166
206
  key: "onIceServers",
167
207
  value: function onIceServers(res) {
168
208
  var _this2 = this;
209
+
169
210
  this.pc = new RTCPeerConnection({
170
211
  iceServers: linkToIceServers(res.headers.get('Link'))
171
212
  });
@@ -176,16 +217,20 @@ var WHEPClient = /*#__PURE__*/function () {
176
217
  this.pc.addTransceiver('audio', {
177
218
  direction: direction
178
219
  });
220
+
179
221
  this.pc.onicecandidate = function (evt) {
180
222
  return _this2.onLocalCandidate(evt);
181
223
  };
224
+
182
225
  this.pc.oniceconnectionstatechange = function () {
183
226
  return _this2.onConnectionState();
184
227
  };
228
+
185
229
  this.pc.ontrack = function (evt) {
186
230
  console.log('new track:', evt.track.kind);
187
231
  _this2.video.srcObject = evt.streams[0];
188
232
  };
233
+
189
234
  this.pc.createOffer().then(function (offer) {
190
235
  return _this2.onLocalOffer(offer);
191
236
  });
@@ -194,6 +239,7 @@ var WHEPClient = /*#__PURE__*/function () {
194
239
  key: "onLocalOffer",
195
240
  value: function onLocalOffer(offer) {
196
241
  var _this3 = this;
242
+
197
243
  editOffer(offer);
198
244
  this.offerData = parseOffer(offer.sdp);
199
245
  this.pc.setLocalDescription(offer);
@@ -208,6 +254,7 @@ var WHEPClient = /*#__PURE__*/function () {
208
254
  if (res.status !== 201) {
209
255
  throw new Error('bad status code');
210
256
  }
257
+
211
258
  _this3.sessionUrl = new URL(res.headers.get('location'), _this3.url).toString();
212
259
  return res.text();
213
260
  }).then(function (sdp) {
@@ -217,6 +264,7 @@ var WHEPClient = /*#__PURE__*/function () {
217
264
  }));
218
265
  })["catch"](function (err) {
219
266
  console.log('error: ' + err);
267
+
220
268
  _this3.scheduleRestart();
221
269
  });
222
270
  }
@@ -226,7 +274,9 @@ var WHEPClient = /*#__PURE__*/function () {
226
274
  if (this.restartTimeout !== null) {
227
275
  return;
228
276
  }
277
+
229
278
  console.log('peer connection state:', this.pc.iceConnectionState);
279
+
230
280
  switch (this.pc.iceConnectionState) {
231
281
  case 'disconnected':
232
282
  this.scheduleRestart();
@@ -238,7 +288,9 @@ var WHEPClient = /*#__PURE__*/function () {
238
288
  if (this.restartTimeout !== null) {
239
289
  return;
240
290
  }
291
+
241
292
  this.pc.setRemoteDescription(answer);
293
+
242
294
  if (this.queuedCandidates.length !== 0) {
243
295
  this.sendLocalCandidates(this.queuedCandidates);
244
296
  this.queuedCandidates = [];
@@ -250,6 +302,7 @@ var WHEPClient = /*#__PURE__*/function () {
250
302
  if (this.restartTimeout !== null) {
251
303
  return;
252
304
  }
305
+
253
306
  if (evt.candidate !== null) {
254
307
  if (this.sessionUrl === '') {
255
308
  this.queuedCandidates.push(evt.candidate);
@@ -262,6 +315,7 @@ var WHEPClient = /*#__PURE__*/function () {
262
315
  key: "sendLocalCandidates",
263
316
  value: function sendLocalCandidates(candidates) {
264
317
  var _this4 = this;
318
+
265
319
  fetch(this.sessionUrl + window.location.search, {
266
320
  method: 'PATCH',
267
321
  headers: {
@@ -275,6 +329,7 @@ var WHEPClient = /*#__PURE__*/function () {
275
329
  }
276
330
  })["catch"](function (err) {
277
331
  console.log('error: ' + err);
332
+
278
333
  _this4.scheduleRestart();
279
334
  });
280
335
  }
@@ -282,17 +337,22 @@ var WHEPClient = /*#__PURE__*/function () {
282
337
  key: "scheduleRestart",
283
338
  value: function scheduleRestart() {
284
339
  var _this5 = this;
340
+
285
341
  if (this.restartTimeout !== null) {
286
342
  return;
287
343
  }
344
+
288
345
  if (this.pc !== null) {
289
346
  this.pc.close();
290
347
  this.pc = null;
291
348
  }
349
+
292
350
  this.restartTimeout = window.setTimeout(function () {
293
351
  _this5.restartTimeout = null;
352
+
294
353
  _this5.start();
295
354
  }, restartPause);
355
+
296
356
  if (this.sessionUrl) {
297
357
  fetch(this.sessionUrl, {
298
358
  method: 'DELETE'
@@ -304,11 +364,14 @@ var WHEPClient = /*#__PURE__*/function () {
304
364
  console.log('delete session error: ' + err);
305
365
  });
306
366
  }
367
+
307
368
  this.sessionUrl = '';
308
369
  this.queuedCandidates = [];
309
370
  }
310
371
  }]);
372
+
311
373
  return WHEPClient;
312
374
  }();
375
+
313
376
  exports["default"] = WHEPClient;
314
377
  //# sourceMappingURL=WhepManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WhepManager.js","names":["restartPause","linkToIceServers","links","split","map","link","m","match","ret","urls","undefined","username","unquoteCredential","credential","credentialType","editOffer","offer","sections","sdp","i","length","section","startsWith","enableStereoOpus","join","opusPayloadFormat","lines","toLowerCase","includes","slice","parseOffer","iceUfrag","icePwd","medias","_iterator","_createForOfIteratorHelper","_step","s","n","done","line","value","push","err","e","f","generateSdpFragment","offerData","candidates","candidatesByMedia","_iterator2","_step2","candidate","mid","sdpMLineIndex","frag","_iterator3","_step3","media","_iterator4","_step4","WHEPClient","opt","_classCallCheck","url","video","pc","restartTimeout","sessionUrl","queuedCandidates","start","_createClass","key","_this","console","log","fetch","URL","method","then","res","onIceServers","scheduleRestart","_this2","RTCPeerConnection","iceServers","headers","get","direction","addTransceiver","onicecandidate","evt","onLocalCandidate","oniceconnectionstatechange","onConnectionState","ontrack","track","kind","srcObject","streams","createOffer","onLocalOffer","_this3","setLocalDescription","body","status","Error","toString","text","onRemoteAnswer","RTCSessionDescription","type","iceConnectionState","answer","setRemoteDescription","sendLocalCandidates","_this4","window","location","search","_this5","close","setTimeout","exports"],"sources":["vtxHls/WhepManager.js"],"sourcesContent":["const restartPause = 2000;\nconst linkToIceServers = (links) => links !== null\n ? links.split(', ').map((link) => {\n const m = link.match(/^<(.+?)>; rel=\"ice-server\"(; username=\"(.*?)\"; credential=\"(.*?)\"; credential-type=\"password\")?/i);\n const ret = {\n urls: [m[1]],\n };\n if (m[3] !== undefined) {\n ret.username = unquoteCredential(m[3]);\n ret.credential = unquoteCredential(m[4]);\n ret.credentialType = 'password';\n }\n return ret;\n })\n : [];\nconst editOffer = (offer) => {\n const sections = offer.sdp.split('m=');\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (section.startsWith('audio')) {\n sections[i] = enableStereoOpus(section);\n }\n }\n offer.sdp = sections.join('m=');\n};\nconst enableStereoOpus = (section) => {\n let opusPayloadFormat = '';\n let lines = section.split('\\r\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('a=rtpmap:') && lines[i].toLowerCase().includes('opus/')) {\n opusPayloadFormat = lines[i].slice('a=rtpmap:'.length).split(' ')[0];\n break;\n }\n }\n if (opusPayloadFormat === '') {\n return section;\n }\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('a=fmtp:' + opusPayloadFormat + ' ')) {\n if (!lines[i].includes('stereo')) {\n lines[i] += ';stereo=1';\n }\n if (!lines[i].includes('sprop-stereo')) {\n lines[i] += ';sprop-stereo=1';\n }\n }\n }\n return lines.join('\\r\\n');\n};\nconst parseOffer = (offer) => {\n const ret = {\n iceUfrag: '',\n icePwd: '',\n medias: [],\n };\n for (const line of offer.split('\\r\\n')) {\n if (line.startsWith('m=')) {\n ret.medias.push(line.slice('m='.length));\n }\n else if (ret.iceUfrag === '' && line.startsWith('a=ice-ufrag:')) {\n ret.iceUfrag = line.slice('a=ice-ufrag:'.length);\n }\n else if (ret.icePwd === '' && line.startsWith('a=ice-pwd:')) {\n ret.icePwd = line.slice('a=ice-pwd:'.length);\n }\n }\n return ret;\n};\nconst generateSdpFragment = (offerData, candidates) => {\n const candidatesByMedia = {};\n for (const candidate of candidates) {\n const mid = candidate.sdpMLineIndex;\n if (candidatesByMedia[mid] === undefined) {\n candidatesByMedia[mid] = [];\n }\n candidatesByMedia[mid].push(candidate);\n }\n let frag = 'a=ice-ufrag:' + offerData.iceUfrag + '\\r\\n' + 'a=ice-pwd:' + offerData.icePwd + '\\r\\n';\n let mid = 0;\n for (const media of offerData.medias) {\n if (candidatesByMedia[mid] !== undefined) {\n frag += 'm=' + media + '\\r\\n' + 'a=mid:' + mid + '\\r\\n';\n for (const candidate of candidatesByMedia[mid]) {\n frag += 'a=' + candidate.candidate + '\\r\\n';\n }\n }\n mid++;\n }\n return frag;\n};\nexport default class WHEPClient {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.pc = null;\n this.restartTimeout = null;\n this.sessionUrl = '';\n this.queuedCandidates = [];\n this.start();\n }\n start() {\n console.log('requesting ICE servers');\n fetch(new URL('whep', this.url), {\n method: 'OPTIONS',\n })\n .then((res) => this.onIceServers(res))\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n onIceServers(res) {\n this.pc = new RTCPeerConnection({\n iceServers: linkToIceServers(res.headers.get('Link')),\n });\n const direction = 'sendrecv';\n this.pc.addTransceiver('video', { direction });\n this.pc.addTransceiver('audio', { direction });\n this.pc.onicecandidate = (evt) => this.onLocalCandidate(evt);\n this.pc.oniceconnectionstatechange = () => this.onConnectionState();\n this.pc.ontrack = (evt) => {\n console.log('new track:', evt.track.kind);\n this.video.srcObject = evt.streams[0];\n };\n this.pc.createOffer().then((offer) => this.onLocalOffer(offer));\n }\n onLocalOffer(offer) {\n editOffer(offer);\n this.offerData = parseOffer(offer.sdp);\n this.pc.setLocalDescription(offer);\n console.log('sending offer');\n fetch(new URL('whep', this.url), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sdp',\n },\n body: offer.sdp,\n })\n .then((res) => {\n if (res.status !== 201) {\n throw new Error('bad status code');\n }\n this.sessionUrl = new URL(res.headers.get('location'), this.url).toString();\n return res.text();\n })\n .then((sdp) => this.onRemoteAnswer(new RTCSessionDescription({\n type: 'answer',\n sdp,\n })))\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n onConnectionState() {\n if (this.restartTimeout !== null) {\n return;\n }\n console.log('peer connection state:', this.pc.iceConnectionState);\n switch (this.pc.iceConnectionState) {\n case 'disconnected':\n this.scheduleRestart();\n }\n }\n onRemoteAnswer(answer) {\n if (this.restartTimeout !== null) {\n return;\n }\n this.pc.setRemoteDescription(answer);\n if (this.queuedCandidates.length !== 0) {\n this.sendLocalCandidates(this.queuedCandidates);\n this.queuedCandidates = [];\n }\n }\n onLocalCandidate(evt) {\n if (this.restartTimeout !== null) {\n return;\n }\n if (evt.candidate !== null) {\n if (this.sessionUrl === '') {\n this.queuedCandidates.push(evt.candidate);\n }\n else {\n this.sendLocalCandidates([evt.candidate]);\n }\n }\n }\n sendLocalCandidates(candidates) {\n fetch(this.sessionUrl + window.location.search, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/trickle-ice-sdpfrag',\n 'If-Match': '*',\n },\n body: generateSdpFragment(this.offerData, candidates),\n })\n .then((res) => {\n if (res.status !== 204) {\n throw new Error('bad status code');\n }\n })\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n scheduleRestart() {\n if (this.restartTimeout !== null) {\n return;\n }\n if (this.pc !== null) {\n this.pc.close();\n this.pc = null;\n }\n this.restartTimeout = window.setTimeout(() => {\n this.restartTimeout = null;\n this.start();\n }, restartPause);\n if (this.sessionUrl) {\n fetch(this.sessionUrl, {\n method: 'DELETE',\n })\n .then((res) => {\n if (res.status !== 200) {\n throw new Error('bad status code');\n }\n })\n .catch((err) => {\n console.log('delete session error: ' + err);\n });\n }\n this.sessionUrl = '';\n this.queuedCandidates = [];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WhepManager.js","names":["restartPause","linkToIceServers","links","split","map","link","m","match","ret","urls","undefined","username","unquoteCredential","credential","credentialType","editOffer","offer","sections","sdp","i","length","section","startsWith","enableStereoOpus","join","opusPayloadFormat","lines","toLowerCase","includes","slice","parseOffer","iceUfrag","icePwd","medias","line","push","generateSdpFragment","offerData","candidates","candidatesByMedia","candidate","mid","sdpMLineIndex","frag","media","WHEPClient","opt","url","video","pc","restartTimeout","sessionUrl","queuedCandidates","start","console","log","fetch","URL","method","then","res","onIceServers","err","scheduleRestart","RTCPeerConnection","iceServers","headers","get","direction","addTransceiver","onicecandidate","evt","onLocalCandidate","oniceconnectionstatechange","onConnectionState","ontrack","track","kind","srcObject","streams","createOffer","onLocalOffer","setLocalDescription","body","status","Error","toString","text","onRemoteAnswer","RTCSessionDescription","type","iceConnectionState","answer","setRemoteDescription","sendLocalCandidates","window","location","search","close","setTimeout"],"sources":["vtxHls/WhepManager.js"],"sourcesContent":["const restartPause = 2000;\nconst linkToIceServers = (links) => links !== null\n ? links.split(', ').map((link) => {\n const m = link.match(/^<(.+?)>; rel=\"ice-server\"(; username=\"(.*?)\"; credential=\"(.*?)\"; credential-type=\"password\")?/i);\n const ret = {\n urls: [m[1]],\n };\n if (m[3] !== undefined) {\n ret.username = unquoteCredential(m[3]);\n ret.credential = unquoteCredential(m[4]);\n ret.credentialType = 'password';\n }\n return ret;\n })\n : [];\nconst editOffer = (offer) => {\n const sections = offer.sdp.split('m=');\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (section.startsWith('audio')) {\n sections[i] = enableStereoOpus(section);\n }\n }\n offer.sdp = sections.join('m=');\n};\nconst enableStereoOpus = (section) => {\n let opusPayloadFormat = '';\n let lines = section.split('\\r\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('a=rtpmap:') && lines[i].toLowerCase().includes('opus/')) {\n opusPayloadFormat = lines[i].slice('a=rtpmap:'.length).split(' ')[0];\n break;\n }\n }\n if (opusPayloadFormat === '') {\n return section;\n }\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].startsWith('a=fmtp:' + opusPayloadFormat + ' ')) {\n if (!lines[i].includes('stereo')) {\n lines[i] += ';stereo=1';\n }\n if (!lines[i].includes('sprop-stereo')) {\n lines[i] += ';sprop-stereo=1';\n }\n }\n }\n return lines.join('\\r\\n');\n};\nconst parseOffer = (offer) => {\n const ret = {\n iceUfrag: '',\n icePwd: '',\n medias: [],\n };\n for (const line of offer.split('\\r\\n')) {\n if (line.startsWith('m=')) {\n ret.medias.push(line.slice('m='.length));\n }\n else if (ret.iceUfrag === '' && line.startsWith('a=ice-ufrag:')) {\n ret.iceUfrag = line.slice('a=ice-ufrag:'.length);\n }\n else if (ret.icePwd === '' && line.startsWith('a=ice-pwd:')) {\n ret.icePwd = line.slice('a=ice-pwd:'.length);\n }\n }\n return ret;\n};\nconst generateSdpFragment = (offerData, candidates) => {\n const candidatesByMedia = {};\n for (const candidate of candidates) {\n const mid = candidate.sdpMLineIndex;\n if (candidatesByMedia[mid] === undefined) {\n candidatesByMedia[mid] = [];\n }\n candidatesByMedia[mid].push(candidate);\n }\n let frag = 'a=ice-ufrag:' + offerData.iceUfrag + '\\r\\n' + 'a=ice-pwd:' + offerData.icePwd + '\\r\\n';\n let mid = 0;\n for (const media of offerData.medias) {\n if (candidatesByMedia[mid] !== undefined) {\n frag += 'm=' + media + '\\r\\n' + 'a=mid:' + mid + '\\r\\n';\n for (const candidate of candidatesByMedia[mid]) {\n frag += 'a=' + candidate.candidate + '\\r\\n';\n }\n }\n mid++;\n }\n return frag;\n};\nexport default class WHEPClient {\n constructor(opt) {\n this.url = opt.url;\n this.video = opt.video;\n this.pc = null;\n this.restartTimeout = null;\n this.sessionUrl = '';\n this.queuedCandidates = [];\n this.start();\n }\n start() {\n console.log('requesting ICE servers');\n fetch(new URL('whep', this.url), {\n method: 'OPTIONS',\n })\n .then((res) => this.onIceServers(res))\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n onIceServers(res) {\n this.pc = new RTCPeerConnection({\n iceServers: linkToIceServers(res.headers.get('Link')),\n });\n const direction = 'sendrecv';\n this.pc.addTransceiver('video', { direction });\n this.pc.addTransceiver('audio', { direction });\n this.pc.onicecandidate = (evt) => this.onLocalCandidate(evt);\n this.pc.oniceconnectionstatechange = () => this.onConnectionState();\n this.pc.ontrack = (evt) => {\n console.log('new track:', evt.track.kind);\n this.video.srcObject = evt.streams[0];\n };\n this.pc.createOffer().then((offer) => this.onLocalOffer(offer));\n }\n onLocalOffer(offer) {\n editOffer(offer);\n this.offerData = parseOffer(offer.sdp);\n this.pc.setLocalDescription(offer);\n console.log('sending offer');\n fetch(new URL('whep', this.url), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/sdp',\n },\n body: offer.sdp,\n })\n .then((res) => {\n if (res.status !== 201) {\n throw new Error('bad status code');\n }\n this.sessionUrl = new URL(res.headers.get('location'), this.url).toString();\n return res.text();\n })\n .then((sdp) => this.onRemoteAnswer(new RTCSessionDescription({\n type: 'answer',\n sdp,\n })))\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n onConnectionState() {\n if (this.restartTimeout !== null) {\n return;\n }\n console.log('peer connection state:', this.pc.iceConnectionState);\n switch (this.pc.iceConnectionState) {\n case 'disconnected':\n this.scheduleRestart();\n }\n }\n onRemoteAnswer(answer) {\n if (this.restartTimeout !== null) {\n return;\n }\n this.pc.setRemoteDescription(answer);\n if (this.queuedCandidates.length !== 0) {\n this.sendLocalCandidates(this.queuedCandidates);\n this.queuedCandidates = [];\n }\n }\n onLocalCandidate(evt) {\n if (this.restartTimeout !== null) {\n return;\n }\n if (evt.candidate !== null) {\n if (this.sessionUrl === '') {\n this.queuedCandidates.push(evt.candidate);\n }\n else {\n this.sendLocalCandidates([evt.candidate]);\n }\n }\n }\n sendLocalCandidates(candidates) {\n fetch(this.sessionUrl + window.location.search, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/trickle-ice-sdpfrag',\n 'If-Match': '*',\n },\n body: generateSdpFragment(this.offerData, candidates),\n })\n .then((res) => {\n if (res.status !== 204) {\n throw new Error('bad status code');\n }\n })\n .catch((err) => {\n console.log('error: ' + err);\n this.scheduleRestart();\n });\n }\n scheduleRestart() {\n if (this.restartTimeout !== null) {\n return;\n }\n if (this.pc !== null) {\n this.pc.close();\n this.pc = null;\n }\n this.restartTimeout = window.setTimeout(() => {\n this.restartTimeout = null;\n this.start();\n }, restartPause);\n if (this.sessionUrl) {\n fetch(this.sessionUrl, {\n method: 'DELETE',\n })\n .then((res) => {\n if (res.status !== 200) {\n throw new Error('bad status code');\n }\n })\n .catch((err) => {\n console.log('delete session error: ' + err);\n });\n }\n this.sessionUrl = '';\n this.queuedCandidates = [];\n }\n}\n"],"mappings":"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"}