@vtx/player 1.7.14 → 1.7.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/lib/api/fetch.js +91 -62
- package/lib/api/fetch.js.map +1 -1
- package/lib/api/index.js +63 -18
- package/lib/api/index.js.map +1 -1
- package/lib/api/types.d.ts +5 -5
- package/lib/bd/PlayerManager.js +68 -38
- package/lib/bd/PlayerManager.js.map +1 -1
- package/lib/bill-player/index.d.ts +1 -1
- package/lib/bill-player/index.js +121 -66
- package/lib/bill-player/index.js.map +1 -1
- package/lib/bill-player/style/css.js +9 -0
- package/lib/bill-player/style/css.js.map +1 -1
- package/lib/bill-player/style/index.js +9 -0
- package/lib/bill-player/style/index.js.map +1 -1
- package/lib/bill-player/style/index.less +297 -297
- package/lib/components/set-tag-video/index.js +34 -6
- package/lib/components/set-tag-video/index.js.map +1 -1
- package/lib/components/set-tag-video/style/css.js.map +1 -1
- package/lib/components/set-tag-video/style/index.js.map +1 -1
- package/lib/components/set-tag-video/style/index.less +125 -125
- package/lib/components/split-screen/index.d.ts +1 -1
- package/lib/components/split-screen/index.js +14 -3
- package/lib/components/split-screen/index.js.map +1 -1
- package/lib/components/split-screen/style/css.js.map +1 -1
- package/lib/components/split-screen/style/index.js.map +1 -1
- package/lib/components/tag-video/index.js +38 -10
- package/lib/components/tag-video/index.js.map +1 -1
- package/lib/components/tag-video/style/css.js.map +1 -1
- package/lib/components/tag-video/style/index.js.map +1 -1
- package/lib/components/tag-video/style/index.less +69 -69
- package/lib/components/video-scale/index.d.ts +1 -1
- package/lib/components/video-scale/index.js +9 -2
- package/lib/components/video-scale/index.js.map +1 -1
- package/lib/components/video-scale/style/css.js.map +1 -1
- package/lib/components/video-scale/style/index.js.map +1 -1
- package/lib/context/index.js +4 -0
- package/lib/context/index.js.map +1 -1
- package/lib/controls/index.d.ts +11 -11
- package/lib/controls/index.js +99 -34
- package/lib/controls/index.js.map +1 -1
- package/lib/controls/style/css.js +5 -0
- package/lib/controls/style/css.js.map +1 -1
- package/lib/controls/style/index.js +5 -0
- package/lib/controls/style/index.js.map +1 -1
- package/lib/controls/style/index.less +188 -188
- package/lib/h264/PlayerManager.js +27 -18
- package/lib/h264/PlayerManager.js.map +1 -1
- package/lib/history-control/index.d.ts +2 -2
- package/lib/history-control/index.js +121 -61
- package/lib/history-control/index.js.map +1 -1
- package/lib/history-control/style/css.js +6 -0
- package/lib/history-control/style/css.js.map +1 -1
- package/lib/history-control/style/index.js +6 -0
- package/lib/history-control/style/index.js.map +1 -1
- package/lib/history-control/style/index.less +252 -252
- package/lib/history-control-v2/components/grid-item/index.js +79 -38
- package/lib/history-control-v2/components/grid-item/index.js.map +1 -1
- package/lib/history-control-v2/components/panel/index.js +114 -44
- package/lib/history-control-v2/components/panel/index.js.map +1 -1
- package/lib/history-control-v2/context.js +2 -0
- package/lib/history-control-v2/context.js.map +1 -1
- package/lib/history-control-v2/index.d.ts +4 -4
- package/lib/history-control-v2/index.js +166 -97
- package/lib/history-control-v2/index.js.map +1 -1
- package/lib/history-control-v2/style/css.js +10 -0
- package/lib/history-control-v2/style/css.js.map +1 -1
- package/lib/history-control-v2/style/index.js +10 -0
- package/lib/history-control-v2/style/index.js.map +1 -1
- package/lib/history-control-v2/style/index.less +437 -437
- package/lib/history-control-v2/utils.js +21 -1
- package/lib/history-control-v2/utils.js.map +1 -1
- package/lib/history-player/index.d.ts +3 -3
- package/lib/history-player/index.js +210 -146
- package/lib/history-player/index.js.map +1 -1
- package/lib/history-player/style/css.js +3 -0
- package/lib/history-player/style/css.js.map +1 -1
- package/lib/history-player/style/index.js +3 -0
- package/lib/history-player/style/index.js.map +1 -1
- package/lib/history-player/style/index.less +102 -102
- package/lib/hooks/useSettings.js +6 -1
- package/lib/hooks/useSettings.js.map +1 -1
- package/lib/icc/PlayerManager.js +57 -26
- package/lib/icc/PlayerManager.js.map +1 -1
- package/lib/icc/api.d.ts +68 -0
- package/lib/icc/api.js +16 -2
- package/lib/icc/api.js.map +1 -1
- package/lib/icons/index.d.ts +36 -36
- package/lib/icons/index.js +171 -23
- package/lib/icons/index.js.map +1 -1
- package/lib/icons/index.less +32 -32
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -1
- package/lib/live-channel-player/index.d.ts +1 -1
- package/lib/live-channel-player/index.js +67 -31
- package/lib/live-channel-player/index.js.map +1 -1
- package/lib/live-channel-player/style/css.js +1 -0
- package/lib/live-channel-player/style/css.js.map +1 -1
- package/lib/live-channel-player/style/index.js +1 -0
- package/lib/live-channel-player/style/index.js.map +1 -1
- package/lib/live-control/index.d.ts +2 -2
- package/lib/live-control/index.js +86 -35
- package/lib/live-control/index.js.map +1 -1
- package/lib/live-control/style/css.js +4 -0
- package/lib/live-control/style/css.js.map +1 -1
- package/lib/live-control/style/index.js +4 -0
- package/lib/live-control/style/index.js.map +1 -1
- package/lib/live-control/style/index.less +99 -99
- package/lib/live-control-v2/index.d.ts +3 -3
- package/lib/live-control-v2/index.js +153 -65
- package/lib/live-control-v2/index.js.map +1 -1
- package/lib/live-control-v2/style/css.js +7 -0
- package/lib/live-control-v2/style/css.js.map +1 -1
- package/lib/live-control-v2/style/index.js +7 -0
- package/lib/live-control-v2/style/index.js.map +1 -1
- package/lib/live-control-v2/style/index.less +192 -192
- package/lib/live-player/index.js +136 -95
- package/lib/live-player/index.js.map +1 -1
- package/lib/live-player/style/css.js +2 -0
- package/lib/live-player/style/css.js.map +1 -1
- package/lib/live-player/style/index.js +2 -0
- package/lib/live-player/style/index.js.map +1 -1
- package/lib/live-player/style/index.less +75 -75
- package/lib/player/index.d.ts +1 -1
- package/lib/player/index.js +243 -78
- package/lib/player/index.js.map +1 -1
- package/lib/rsl/PlayerManager.js +64 -18
- package/lib/rsl/PlayerManager.js.map +1 -1
- package/lib/typings/@vtx/utils/index.d.ts +28 -28
- package/lib/typings/h5player.d.ts +146 -146
- package/lib/typings/webrtcplayer.d.ts +56 -56
- package/lib/typings/wsplayer.d.ts +99 -99
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +91 -12
- package/lib/utils/index.js.map +1 -1
- package/lib/vite-env.d.ts +1 -1
- package/lib/vtxHls/PlayerManager.js +20 -6
- package/lib/vtxHls/PlayerManager.js.map +1 -1
- package/lib/vtxHls/WhepManager.js +72 -9
- package/lib/vtxHls/WhepManager.js.map +1 -1
- package/lib/webrtc/PlayerManager.js +41 -28
- package/lib/webrtc/PlayerManager.js.map +1 -1
- package/package.json +124 -124
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
|
-
|
|
7
|
+
|
|
8
8
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
9
|
-
|
|
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
|
-
|
|
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","
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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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"}
|