@rongcloud/plugin-rtc 5.4.4-alpha.1 → 5.4.5-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/Invoker.d.ts +8 -0
- package/dist/core/Store.d.ts +8 -4
- package/dist/core/command/AsyncCommand.d.ts +55 -0
- package/dist/core/command/AsyncSubscribeCommand.d.ts +28 -0
- package/dist/core/command/AsyncUnsubscribeCommand.d.ts +28 -0
- package/dist/core/command/AsyncUpdateSubscribeListCommand.d.ts +25 -0
- package/dist/core/command/BaseCommand.d.ts +9 -0
- package/dist/core/command/JoinRoomCommand.d.ts +2 -0
- package/dist/core/command/LeaveOtherRoomCommand.d.ts +2 -0
- package/dist/core/command/OnRemoteUserUnpubCommand.d.ts +2 -2
- package/dist/core/command/OnSignalReconnectedCommand.d.ts +2 -2
- package/dist/core/command/ParseRemoteResCommand.d.ts +5 -5
- package/dist/core/command/ParseUserStateCommand.d.ts +2 -2
- package/dist/core/command/{PubCommand.d.ts → PublishCommand.d.ts} +4 -2
- package/dist/core/command/{SubCommand.d.ts → SubscribeCommand.d.ts} +4 -4
- package/dist/core/command/{UnpubCommand.d.ts → UnpublishCommand.d.ts} +4 -2
- package/dist/core/command/UnpublishPrevCommand.d.ts +11 -0
- package/dist/core/command/{UnsubCommand.d.ts → UnsubscribeCommand.d.ts} +4 -4
- package/dist/core/command/{UpdateSubListCommand.d.ts → UpdateSubscribeListCommand.d.ts} +5 -5
- package/dist/core/enums/RCCommandKind.d.ts +12 -0
- package/dist/core/enums/RCLinkedListPoint.d.ts +6 -0
- package/dist/core/enums/RCLoggerTag.d.ts +13 -1
- package/dist/core/enums/RCRTCCode.d.ts +4 -2
- package/dist/core/enums/inner/RCRTCMessageType.d.ts +5 -1
- package/dist/core/interfaces.d.ts +19 -0
- package/dist/core/room/RCAbstractRoom.d.ts +30 -7
- package/dist/core/room/RCAudienceLivingRoom.d.ts +8 -0
- package/dist/core/tracks/RC3AnoiseTrack.d.ts +27 -0
- package/dist/core/tracks/RCLocalTrack.d.ts +14 -0
- package/dist/core/tracks/RCRemoteTrack.d.ts +6 -0
- package/dist/core/tracks/RCTrack.d.ts +5 -1
- package/dist/core/webrtc/RCRTCPeerCManager.d.ts +2 -0
- package/dist/core/webrtc/sdp/ASdpBuilder.d.ts +1 -1
- package/dist/index.d.ts +129 -18
- package/dist/index.esm.js +893 -166
- package/dist/index.js +893 -166
- package/dist/index.umd.js +893 -166
- package/package.json +2 -2
- package/dist/core/command/UnpubPrevCommand.d.ts +0 -6
package/dist/index.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* RCRTC - v5.4.
|
|
3
|
-
* CommitId -
|
|
4
|
-
*
|
|
2
|
+
* RCRTC - v5.4.5-alpha.1
|
|
3
|
+
* CommitId - 960e964ebd4294c2f095e87cf9e33935703b475e
|
|
4
|
+
* Fri Aug 12 2022 15:02:10 GMT+0800 (China Standard Time)
|
|
5
5
|
* ©2020 RongCloud, Inc. All rights reserved.
|
|
6
6
|
*/
|
|
7
7
|
(function (global, factory) {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
/** 获取屏幕共享流失败 */
|
|
82
82
|
RCRTCCode[RCRTCCode["GET_DISPLAY_MEDIA_FAILED"] = 53011] = "GET_DISPLAY_MEDIA_FAILED";
|
|
83
83
|
/** 权限问题导致获取媒体流被拒绝 */
|
|
84
|
-
RCRTCCode[RCRTCCode["
|
|
84
|
+
RCRTCCode[RCRTCCode["BROWSER_PERMISSION_DENIED"] = 53012] = "BROWSER_PERMISSION_DENIED";
|
|
85
85
|
/** 创建自定义流失败 */
|
|
86
86
|
RCRTCCode[RCRTCCode["CREATE_CUSTOM_TRACK_FAILED"] = 53013] = "CREATE_CUSTOM_TRACK_FAILED";
|
|
87
87
|
/** 无效的 TAG 定义 */
|
|
@@ -122,6 +122,8 @@
|
|
|
122
122
|
RCRTCCode[RCRTCCode["SOME_TRACKS_PUBLISH_FAILED"] = 53031] = "SOME_TRACKS_PUBLISH_FAILED";
|
|
123
123
|
/** electron 中 mac 系统暂不支持屏幕共享采集声音 */
|
|
124
124
|
RCRTCCode[RCRTCCode["MAC_IN_ELECTRON_NOT_SUPPORT_SCREEN_SHARE_WITH_AUDIO"] = 53032] = "MAC_IN_ELECTRON_NOT_SUPPORT_SCREEN_SHARE_WITH_AUDIO";
|
|
125
|
+
/** 获取媒体资源时,无系统权限 */
|
|
126
|
+
RCRTCCode[RCRTCCode["SYSTEM_PERMISSION_DENIED"] = 53033] = "SYSTEM_PERMISSION_DENIED";
|
|
125
127
|
})(exports.RCRTCCode || (exports.RCRTCCode = {}));
|
|
126
128
|
|
|
127
129
|
var RCLoggerTag;
|
|
@@ -734,6 +736,18 @@
|
|
|
734
736
|
* 设置 SDP 上的码率
|
|
735
737
|
*/
|
|
736
738
|
RCLoggerTag["L_RTC_SDP_BITRATE_O"] = "L_rtc_sdp_bitrate_O";
|
|
739
|
+
/**
|
|
740
|
+
* 3A 降噪
|
|
741
|
+
*/
|
|
742
|
+
RCLoggerTag["L_RTC_3ANOISE_NODE_O"] = "L_RTC_AAAnoiseNode_O";
|
|
743
|
+
/**
|
|
744
|
+
* 3A 降噪
|
|
745
|
+
*/
|
|
746
|
+
RCLoggerTag["L_RTC_3ANOISE_NODE_E"] = "L_RTC_AAAnoiseNode_E";
|
|
747
|
+
/**
|
|
748
|
+
* 3A 降噪
|
|
749
|
+
*/
|
|
750
|
+
RCLoggerTag["L_RTC_3ANOISE_NODE_STOP_O"] = "L_RTC_AAAnoiseNode_Stop_O";
|
|
737
751
|
})(RCLoggerTag || (RCLoggerTag = {}));
|
|
738
752
|
var RCLoggerStatus;
|
|
739
753
|
(function (RCLoggerStatus) {
|
|
@@ -6330,6 +6344,13 @@
|
|
|
6330
6344
|
__innerGetMediaStreamTrack() {
|
|
6331
6345
|
return this._msTrack;
|
|
6332
6346
|
}
|
|
6347
|
+
/**
|
|
6348
|
+
* 它返回 MediaStreamTrack 对象。
|
|
6349
|
+
* @returns 表示媒体源的 MediaStreamTrack 对象。
|
|
6350
|
+
*/
|
|
6351
|
+
get streamTrack() {
|
|
6352
|
+
return this._msTrack;
|
|
6353
|
+
}
|
|
6333
6354
|
/**
|
|
6334
6355
|
* 获取数据标识
|
|
6335
6356
|
* @returns
|
|
@@ -6424,8 +6445,7 @@
|
|
|
6424
6445
|
* @param element 用于承载媒体流的元素标签,音频流可传空
|
|
6425
6446
|
* @param volume 有效值为 0-100
|
|
6426
6447
|
*/
|
|
6427
|
-
play(element, options
|
|
6428
|
-
var _a, _b;
|
|
6448
|
+
play(element, options) {
|
|
6429
6449
|
return __awaiter(this, void 0, void 0, function* () {
|
|
6430
6450
|
engine.logger.info(RCLoggerTag.L_TRACK_PLAY_T, {
|
|
6431
6451
|
element,
|
|
@@ -6583,46 +6603,42 @@
|
|
|
6583
6603
|
logSource: engine.LogSource.RTC
|
|
6584
6604
|
});
|
|
6585
6605
|
};
|
|
6586
|
-
// 用户在 Video 标签上 设置的优化级最高,其次是选项中设置的 autoplay
|
|
6587
|
-
const autoplay = ((_a = this._element) === null || _a === void 0 ? void 0 : _a.getAttribute('autoplay')) === null ? options.autoplay : (_b = this._element) === null || _b === void 0 ? void 0 : _b.autoplay;
|
|
6588
6606
|
this._element.oncanplay = (evt) => __awaiter(this, void 0, void 0, function* () {
|
|
6589
|
-
var
|
|
6607
|
+
var _a, _b, _c;
|
|
6590
6608
|
// 可以播放
|
|
6591
|
-
logger.info(`HTMLMediaElement oncanplay -> id: ${(
|
|
6609
|
+
logger.info(`HTMLMediaElement oncanplay -> id: ${(_a = evt.target) === null || _a === void 0 ? void 0 : _a.id}, trackId: ${this._id}`);
|
|
6592
6610
|
engine.logger.info(RCLoggerTag.L_TRACK_PLAY_R, {
|
|
6593
6611
|
status: RCLoggerStatus.INFO,
|
|
6594
|
-
msg: `HTMLMediaElement oncanplay -> id: ${(
|
|
6612
|
+
msg: `HTMLMediaElement oncanplay -> id: ${(_b = evt.target) === null || _b === void 0 ? void 0 : _b.id}, trackId: ${this._id}`
|
|
6595
6613
|
}, {
|
|
6596
6614
|
logSource: engine.LogSource.RTC
|
|
6597
6615
|
});
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6606
|
-
|
|
6607
|
-
logger.error(`setSinkId failed -> ${error.message}`);
|
|
6608
|
-
engine.logger.error(RCLoggerTag.L_TRACK_PLAY_R, {
|
|
6609
|
-
status: RCLoggerStatus.FAILED,
|
|
6610
|
-
code: exports.RCRTCCode.NO_PERMISSION_TO_USE_REQUESTED_DEVICE,
|
|
6611
|
-
msg: 'No permission'
|
|
6612
|
-
}, {
|
|
6613
|
-
logSource: engine.LogSource.RTC
|
|
6614
|
-
});
|
|
6615
|
-
return;
|
|
6616
|
-
}
|
|
6617
|
-
logger.error(error);
|
|
6616
|
+
try {
|
|
6617
|
+
(_c = this._element) === null || _c === void 0 ? void 0 : _c.play();
|
|
6618
|
+
}
|
|
6619
|
+
catch (error) {
|
|
6620
|
+
/**
|
|
6621
|
+
* 检测是否有设置音频输出设备的权限
|
|
6622
|
+
*/
|
|
6623
|
+
if (error.message === 'No permission to use requested device') {
|
|
6624
|
+
logger.error(`setSinkId failed -> ${error.message}`);
|
|
6618
6625
|
engine.logger.error(RCLoggerTag.L_TRACK_PLAY_R, {
|
|
6619
6626
|
status: RCLoggerStatus.FAILED,
|
|
6620
|
-
code: exports.RCRTCCode.
|
|
6621
|
-
msg: '
|
|
6627
|
+
code: exports.RCRTCCode.NO_PERMISSION_TO_USE_REQUESTED_DEVICE,
|
|
6628
|
+
msg: 'No permission'
|
|
6622
6629
|
}, {
|
|
6623
6630
|
logSource: engine.LogSource.RTC
|
|
6624
6631
|
});
|
|
6632
|
+
return;
|
|
6625
6633
|
}
|
|
6634
|
+
logger.error(error);
|
|
6635
|
+
engine.logger.error(RCLoggerTag.L_TRACK_PLAY_R, {
|
|
6636
|
+
status: RCLoggerStatus.FAILED,
|
|
6637
|
+
code: exports.RCRTCCode.TRACK_PLAY_ERROR,
|
|
6638
|
+
msg: 'play error'
|
|
6639
|
+
}, {
|
|
6640
|
+
logSource: engine.LogSource.RTC
|
|
6641
|
+
});
|
|
6626
6642
|
}
|
|
6627
6643
|
});
|
|
6628
6644
|
this._element.onvolumechange = evt => {
|
|
@@ -6638,7 +6654,7 @@
|
|
|
6638
6654
|
});
|
|
6639
6655
|
};
|
|
6640
6656
|
this._element.srcObject = this._msStream;
|
|
6641
|
-
this._element.autoplay =
|
|
6657
|
+
this._element.autoplay = true;
|
|
6642
6658
|
// video 标签页面内播放
|
|
6643
6659
|
if (isVideoTrack) {
|
|
6644
6660
|
this._element.playsInline = true;
|
|
@@ -6740,6 +6756,106 @@
|
|
|
6740
6756
|
[exports.RCVideoBitrate.LEVEL5]: { max: 4000, min: 400 }
|
|
6741
6757
|
};
|
|
6742
6758
|
|
|
6759
|
+
class RC3AnoiseTrack {
|
|
6760
|
+
/**
|
|
6761
|
+
* 该函数接受一个布尔值作为参数,如果没有传递参数,该函数将默认为 true
|
|
6762
|
+
* @param {boolean} [isOpen=true] - 轨道是否开放。
|
|
6763
|
+
*/
|
|
6764
|
+
static setStatus(isOpen = true) {
|
|
6765
|
+
RC3AnoiseTrack.isOpen = isOpen;
|
|
6766
|
+
}
|
|
6767
|
+
/**
|
|
6768
|
+
* 它设置 worklet 模块和 wasm。
|
|
6769
|
+
* @param {string} module - 将用于创建工作集的模块的名称。
|
|
6770
|
+
* @param {string} wasm - Rust 编译器生成的 wasm 文件。
|
|
6771
|
+
*/
|
|
6772
|
+
static setWroklet(module, wasm) {
|
|
6773
|
+
RC3AnoiseTrack.workletModule = module;
|
|
6774
|
+
RC3AnoiseTrack.workletModule = wasm;
|
|
6775
|
+
}
|
|
6776
|
+
/**
|
|
6777
|
+
* 它创建一个 AudioContext,从输入流创建一个 MediaStreamSource,
|
|
6778
|
+
* 创建一个 MediaStreamDestination,创建一个 AudioWorkletNode,并将节点连接在一起。
|
|
6779
|
+
* @param {MediaStream} audioStream - 媒体流
|
|
6780
|
+
* @returns 一个媒体流对象。
|
|
6781
|
+
*/
|
|
6782
|
+
static transformStreamTrack(audioStream) {
|
|
6783
|
+
var _a;
|
|
6784
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
6785
|
+
/* 如果开关未打开则直接返回 音轨。 */
|
|
6786
|
+
if (!RC3AnoiseTrack.isOpen) {
|
|
6787
|
+
return new Promise(resolve => {
|
|
6788
|
+
resolve({
|
|
6789
|
+
track: audioStream === null || audioStream === void 0 ? void 0 : audioStream.getAudioTracks()[0],
|
|
6790
|
+
stop: () => { }
|
|
6791
|
+
});
|
|
6792
|
+
});
|
|
6793
|
+
}
|
|
6794
|
+
// 创建 AudioContext 并设定采集频率
|
|
6795
|
+
const audioCxt = new AudioContext({ sampleRate: 44100 });
|
|
6796
|
+
// 创建资源
|
|
6797
|
+
const renoise = audioCxt.createMediaStreamSource(audioStream);
|
|
6798
|
+
// 最终发布的音频载体
|
|
6799
|
+
const destination = audioCxt.createMediaStreamDestination();
|
|
6800
|
+
const AAAnoiseWorklet = yield audioCxt.audioWorklet.addModule(RC3AnoiseTrack.workletModule).then(() => {
|
|
6801
|
+
logger.info(RCLoggerTag.L_RTC_3ANOISE_NODE_O, {
|
|
6802
|
+
status: RCLoggerStatus.SUCCESSED,
|
|
6803
|
+
message: { msg: 'addModule RC3AnoiseTrack.workletModule success' }
|
|
6804
|
+
}, {
|
|
6805
|
+
logSource: engine.LogSource.RTC
|
|
6806
|
+
});
|
|
6807
|
+
return fetch(RC3AnoiseTrack.workletWasm, {
|
|
6808
|
+
credentials: 'same-origin'
|
|
6809
|
+
}).then(function (response) {
|
|
6810
|
+
return response.arrayBuffer();
|
|
6811
|
+
}).catch(error => {
|
|
6812
|
+
throw new Error(error.message);
|
|
6813
|
+
});
|
|
6814
|
+
}).then(buffer => {
|
|
6815
|
+
const AAAnoiseNode = new AudioWorkletNode(audioCxt, 'process-worklet', {
|
|
6816
|
+
numberOfInputs: 1,
|
|
6817
|
+
numberOfOutputs: 1,
|
|
6818
|
+
outputChannelCount: [1],
|
|
6819
|
+
processorOptions: {
|
|
6820
|
+
binary: buffer
|
|
6821
|
+
}
|
|
6822
|
+
});
|
|
6823
|
+
return AAAnoiseNode;
|
|
6824
|
+
}).catch(err => {
|
|
6825
|
+
logger.info(RCLoggerTag.L_RTC_3ANOISE_NODE_E, {
|
|
6826
|
+
status: RCLoggerStatus.FAILED,
|
|
6827
|
+
message: { msg: err.message }
|
|
6828
|
+
}, {
|
|
6829
|
+
logSource: engine.LogSource.RTC
|
|
6830
|
+
});
|
|
6831
|
+
});
|
|
6832
|
+
if (!AAAnoiseWorklet) {
|
|
6833
|
+
return new Promise(resolve => {
|
|
6834
|
+
resolve({
|
|
6835
|
+
track: audioStream === null || audioStream === void 0 ? void 0 : audioStream.getAudioTracks()[0],
|
|
6836
|
+
stop: () => { }
|
|
6837
|
+
});
|
|
6838
|
+
});
|
|
6839
|
+
}
|
|
6840
|
+
const stop = () => {
|
|
6841
|
+
logger.info(RCLoggerTag.L_RTC_3ANOISE_NODE_STOP_O, {
|
|
6842
|
+
status: RCLoggerStatus.SUCCESSED,
|
|
6843
|
+
message: { msg: 'call stop RC3AnoiseTrack.workletModule' }
|
|
6844
|
+
}, {
|
|
6845
|
+
logSource: engine.LogSource.RTC
|
|
6846
|
+
});
|
|
6847
|
+
AAAnoiseWorklet === null || AAAnoiseWorklet === void 0 ? void 0 : AAAnoiseWorklet.port.postMessage({ type: 'stop', msg: '' });
|
|
6848
|
+
};
|
|
6849
|
+
renoise.connect(AAAnoiseWorklet).connect(destination);
|
|
6850
|
+
const track = (_a = destination === null || destination === void 0 ? void 0 : destination.stream) === null || _a === void 0 ? void 0 : _a.getAudioTracks()[0];
|
|
6851
|
+
return { track, stop };
|
|
6852
|
+
});
|
|
6853
|
+
}
|
|
6854
|
+
}
|
|
6855
|
+
RC3AnoiseTrack.workletModule = 'https://cdn.ronghub.com/plugin-rtc/wasm/5.0.0-alpha.1/process-worklet.js';
|
|
6856
|
+
RC3AnoiseTrack.workletWasm = 'https://cdn.ronghub.com/plugin-rtc/wasm/5.0.0-alpha.1/AudioProcessing.wasm';
|
|
6857
|
+
RC3AnoiseTrack.isOpen = false;
|
|
6858
|
+
|
|
6743
6859
|
/* eslint no-dupe-class-members: 'off' */
|
|
6744
6860
|
class RCLocalTrack extends RCTrack {
|
|
6745
6861
|
constructor(tag, userId, kind, track) {
|
|
@@ -6871,6 +6987,7 @@
|
|
|
6871
6987
|
class RCLocalAudioTrack extends RCLocalTrack {
|
|
6872
6988
|
constructor(tag, userId, track) {
|
|
6873
6989
|
super(tag, userId, 'audio', track);
|
|
6990
|
+
this._stopProcess = () => { };
|
|
6874
6991
|
}
|
|
6875
6992
|
/**
|
|
6876
6993
|
* 它设置推荐的音频码率。
|
|
@@ -6898,6 +7015,31 @@
|
|
|
6898
7015
|
const [min = 1, start = max * 0.7 || 1] = args;
|
|
6899
7016
|
super.setBitrate(max, min, start);
|
|
6900
7017
|
}
|
|
7018
|
+
/**
|
|
7019
|
+
* @override __innerSetMediaStreamTrack
|
|
7020
|
+
* @params {track} MediaStreamTrack 添加音频流
|
|
7021
|
+
* @params {track} undefined 销毁音频流
|
|
7022
|
+
*/
|
|
7023
|
+
__innerSetMediaStreamTrack(track) {
|
|
7024
|
+
if (!track) {
|
|
7025
|
+
// 如果 track 为 undefined 则为销毁动作
|
|
7026
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7027
|
+
this._stopProcess();
|
|
7028
|
+
}
|
|
7029
|
+
else {
|
|
7030
|
+
// 是否开启3A降噪
|
|
7031
|
+
if (RC3AnoiseTrack.isOpen) {
|
|
7032
|
+
const audioStream = new MediaStream([track]);
|
|
7033
|
+
RC3AnoiseTrack.transformStreamTrack(audioStream).then(({ track, stop }) => {
|
|
7034
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7035
|
+
this._stopProcess = stop;
|
|
7036
|
+
});
|
|
7037
|
+
}
|
|
7038
|
+
else {
|
|
7039
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7040
|
+
}
|
|
7041
|
+
}
|
|
7042
|
+
}
|
|
6901
7043
|
}
|
|
6902
7044
|
class RCLocalVideoTrack extends RCLocalTrack {
|
|
6903
7045
|
constructor(tag, userId, track, _isTiny = false) {
|
|
@@ -6989,6 +7131,7 @@
|
|
|
6989
7131
|
class RCLocalFileAudioTrack extends RCLocalFileTrack {
|
|
6990
7132
|
constructor(tag, userId, track, element) {
|
|
6991
7133
|
super(tag, userId, 'audio', track, element);
|
|
7134
|
+
this._stopProcess = () => { };
|
|
6992
7135
|
}
|
|
6993
7136
|
_setLocalMuted(bool) {
|
|
6994
7137
|
if (this._resource) {
|
|
@@ -7001,6 +7144,31 @@
|
|
|
7001
7144
|
this._setLocalMuted(false);
|
|
7002
7145
|
return Promise.resolve({ code: exports.RCRTCCode.SUCCESS });
|
|
7003
7146
|
}
|
|
7147
|
+
/**
|
|
7148
|
+
* @override __innerSetMediaStreamTrack
|
|
7149
|
+
* @params {track} MediaStreamTrack 添加音频流
|
|
7150
|
+
* @params {track} undefined 销毁音频流
|
|
7151
|
+
*/
|
|
7152
|
+
__innerSetMediaStreamTrack(track) {
|
|
7153
|
+
if (!track) {
|
|
7154
|
+
// 如果 track 为 undefined 则为销毁动作
|
|
7155
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7156
|
+
this._stopProcess();
|
|
7157
|
+
}
|
|
7158
|
+
else {
|
|
7159
|
+
// 是否开启3A降噪
|
|
7160
|
+
if (RC3AnoiseTrack.isOpen) {
|
|
7161
|
+
const audioStream = new MediaStream([track]);
|
|
7162
|
+
RC3AnoiseTrack.transformStreamTrack(audioStream).then(({ track, stop }) => {
|
|
7163
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7164
|
+
this._stopProcess = stop;
|
|
7165
|
+
});
|
|
7166
|
+
}
|
|
7167
|
+
else {
|
|
7168
|
+
super.__innerSetMediaStreamTrack(track);
|
|
7169
|
+
}
|
|
7170
|
+
}
|
|
7171
|
+
}
|
|
7004
7172
|
}
|
|
7005
7173
|
class RCMicphoneAudioTrack extends RCLocalAudioTrack {
|
|
7006
7174
|
}
|
|
@@ -7048,6 +7216,16 @@
|
|
|
7048
7216
|
class RCRemoteVideoTrack extends RCRemoteTrack {
|
|
7049
7217
|
constructor(tag, userId, roomId) {
|
|
7050
7218
|
super(tag, userId, 'video', roomId);
|
|
7219
|
+
this._isSubTiny = false;
|
|
7220
|
+
}
|
|
7221
|
+
__innerSetIsTinyTrack(bool) {
|
|
7222
|
+
this._isSubTiny = bool;
|
|
7223
|
+
}
|
|
7224
|
+
/**
|
|
7225
|
+
* 是否订阅的小流
|
|
7226
|
+
*/
|
|
7227
|
+
isSubTiny() {
|
|
7228
|
+
return this._isSubTiny;
|
|
7051
7229
|
}
|
|
7052
7230
|
}
|
|
7053
7231
|
|
|
@@ -7518,6 +7696,10 @@
|
|
|
7518
7696
|
* 连麦的房间不再了或离线了,主直播房间会收到的消息通知
|
|
7519
7697
|
*/
|
|
7520
7698
|
RCRTCMessageType["OTHER_ROOM_OFFLINE"] = "RCRTC:otherRoomOffline";
|
|
7699
|
+
/**
|
|
7700
|
+
* 订阅、取消订阅动作成功
|
|
7701
|
+
*/
|
|
7702
|
+
RCRTCMessageType["ROOM_TASK_FINISH"] = "RCRTC:roomTaskFinish";
|
|
7521
7703
|
})(RCRTCMessageType || (RCRTCMessageType = {}));
|
|
7522
7704
|
|
|
7523
7705
|
exports.RCRTCPingResult = void 0;
|
|
@@ -7677,7 +7859,7 @@
|
|
|
7677
7859
|
'Content-Type': 'application/json;charset=UTF-8',
|
|
7678
7860
|
'Cache-Control': 'no-cache',
|
|
7679
7861
|
ClientType: `web|${browserInfo.browser}|${browserInfo.version}`,
|
|
7680
|
-
ClientVersion: "5.4.
|
|
7862
|
+
ClientVersion: "5.4.5-alpha.1",
|
|
7681
7863
|
'Client-Session-Id': getUUID(),
|
|
7682
7864
|
'Request-Id': Date.now().toString()
|
|
7683
7865
|
});
|
|
@@ -7999,7 +8181,7 @@
|
|
|
7999
8181
|
audioLevel = audioLevel / 32767;
|
|
8000
8182
|
}
|
|
8001
8183
|
const rate = 10 ** factor;
|
|
8002
|
-
return Math.
|
|
8184
|
+
return Math.round(audioLevel * rate);
|
|
8003
8185
|
};
|
|
8004
8186
|
/**
|
|
8005
8187
|
* 计算丢包率
|
|
@@ -8979,7 +9161,7 @@
|
|
|
8979
9161
|
for (let mid = 1; mid < streams.length; mid++) {
|
|
8980
9162
|
const stream = this.SDP.substring(streams[mid], streams[mid + 1]);
|
|
8981
9163
|
// 移除不需要发布资源的 ssrc
|
|
8982
|
-
const sendonlyStream =
|
|
9164
|
+
const sendonlyStream = ASdpBuilder.clearInactiveOrRecvonly(stream);
|
|
8983
9165
|
if (sendonlyStream) {
|
|
8984
9166
|
if (/^\bm=video\b/.test(stream)) {
|
|
8985
9167
|
this.videoStreams.push(stream);
|
|
@@ -8996,7 +9178,7 @@
|
|
|
8996
9178
|
* @param {string} stream - string - 要修改的 SDP 字符串
|
|
8997
9179
|
* @returns 正在返回流。
|
|
8998
9180
|
*/
|
|
8999
|
-
clearInactiveOrRecvonly(stream) {
|
|
9181
|
+
static clearInactiveOrRecvonly(stream) {
|
|
9000
9182
|
const recvonlyORinactive = /\ba=(recvonly|inactive)\b/.test(stream);
|
|
9001
9183
|
if (recvonlyORinactive) {
|
|
9002
9184
|
return stream.replace(/\r\na=(ssrc|msid)[^\r\n]+/ig, '');
|
|
@@ -9374,7 +9556,7 @@
|
|
|
9374
9556
|
offer.sdp = offer.sdp.replace(new RegExp(streamId, 'g'), msid);
|
|
9375
9557
|
}
|
|
9376
9558
|
if (offer.sdp) {
|
|
9377
|
-
offer.sdp =
|
|
9559
|
+
offer.sdp = ASdpBuilder.clearInactiveOrRecvonly(offer.sdp);
|
|
9378
9560
|
}
|
|
9379
9561
|
yield this._peer.setLocalDescription(offer);
|
|
9380
9562
|
return { type: 'offer', semantics: 'plan-b', sdp: offer.sdp };
|
|
@@ -9588,7 +9770,8 @@
|
|
|
9588
9770
|
const streamId = this._outboundStreams[msid].id;
|
|
9589
9771
|
sdp = sdp.replace(new RegExp(streamId, 'g'), msid);
|
|
9590
9772
|
}
|
|
9591
|
-
sdp = this.resetSdp(sdp)
|
|
9773
|
+
// sdp = this.resetSdp(sdp!)
|
|
9774
|
+
sdp = ASdpBuilder.clearInactiveOrRecvonly(sdp);
|
|
9592
9775
|
// 增加 a=ice-options:renomination 行
|
|
9593
9776
|
sdp = sdp.replace(/(a=ice-options:trickle)/g, '$1\r\na=ice-options:renomination');
|
|
9594
9777
|
offer.sdp = sdp;
|
|
@@ -9970,12 +10153,6 @@
|
|
|
9970
10153
|
* 获取 report 中的 iceCandidatePair、senders、receivers 中的所有字段
|
|
9971
10154
|
*/
|
|
9972
10155
|
const formatData = (_b = this.reportParser) === null || _b === void 0 ? void 0 : _b.formatRCRTCStateReport(data);
|
|
9973
|
-
engine.logger.info(RCLoggerTag.L_RTC_PEER_CONNECTION_GET_STATS_DATA_O, {
|
|
9974
|
-
status: RCLoggerStatus.SUCCESSED,
|
|
9975
|
-
formatData
|
|
9976
|
-
}, {
|
|
9977
|
-
logSource: engine.LogSource.RTC
|
|
9978
|
-
});
|
|
9979
10156
|
return formatData;
|
|
9980
10157
|
});
|
|
9981
10158
|
}
|
|
@@ -10275,7 +10452,7 @@
|
|
|
10275
10452
|
* 加入房间
|
|
10276
10453
|
*/
|
|
10277
10454
|
sendR1() {
|
|
10278
|
-
const rtcVersion = "5.4.
|
|
10455
|
+
const rtcVersion = "5.4.5-alpha.1";
|
|
10279
10456
|
const imVersion = this._context.getCoreVersion();
|
|
10280
10457
|
const platform = 'web';
|
|
10281
10458
|
const pcName = navigator.platform;
|
|
@@ -10477,11 +10654,14 @@
|
|
|
10477
10654
|
}
|
|
10478
10655
|
/**
|
|
10479
10656
|
* 创建一组 peerC
|
|
10657
|
+
* 为了适应多 peerConnection 的场景做出的冗余设计,对单 peerConnection 进行数组进行封装
|
|
10658
|
+
* 提示:useMutilPeerC 用户自定义的,没有明确场景,必须使用多 peerConnection
|
|
10480
10659
|
* @param pcName
|
|
10481
10660
|
* @returns
|
|
10482
10661
|
*/
|
|
10483
10662
|
createPeerCList(tracks) {
|
|
10484
10663
|
const peerCArr = [];
|
|
10664
|
+
// isPublish 判断tracks中的资源是否为本地发布资源 从而区分是订阅与发布
|
|
10485
10665
|
const isPub = this._isPub(tracks);
|
|
10486
10666
|
// 不使用多 peerConnection
|
|
10487
10667
|
if (!this._useMutilPeerC) {
|
|
@@ -10563,12 +10743,47 @@
|
|
|
10563
10743
|
}
|
|
10564
10744
|
}
|
|
10565
10745
|
|
|
10746
|
+
/* 定义命令类型 */
|
|
10747
|
+
var RCCommandKind;
|
|
10748
|
+
(function (RCCommandKind) {
|
|
10749
|
+
// 未定议的
|
|
10750
|
+
RCCommandKind[RCCommandKind["Unknow"] = 0] = "Unknow";
|
|
10751
|
+
// 发布资源
|
|
10752
|
+
RCCommandKind[RCCommandKind["Publish"] = 1] = "Publish";
|
|
10753
|
+
// 取消发布资源
|
|
10754
|
+
RCCommandKind[RCCommandKind["UnPublish"] = 2] = "UnPublish";
|
|
10755
|
+
// 加入房间
|
|
10756
|
+
RCCommandKind[RCCommandKind["JoinRoom"] = 3] = "JoinRoom";
|
|
10757
|
+
// 离开房间
|
|
10758
|
+
RCCommandKind[RCCommandKind["LeaveRoom"] = 4] = "LeaveRoom";
|
|
10759
|
+
// 更新订阅列表
|
|
10760
|
+
RCCommandKind[RCCommandKind["UpdateSubscribeTask"] = 5] = "UpdateSubscribeTask";
|
|
10761
|
+
// 资源订阅
|
|
10762
|
+
RCCommandKind[RCCommandKind["SubscribedTask"] = 6] = "SubscribedTask";
|
|
10763
|
+
// 取消资源订阅
|
|
10764
|
+
RCCommandKind[RCCommandKind["UnSubscribedTask"] = 7] = "UnSubscribedTask";
|
|
10765
|
+
// 异步事件命令
|
|
10766
|
+
RCCommandKind["AsyncCommand"] = "AsyncCommand";
|
|
10767
|
+
})(RCCommandKind || (RCCommandKind = {}));
|
|
10768
|
+
|
|
10769
|
+
// 描述 链表 中的位置
|
|
10770
|
+
var RCLinkedListPoint;
|
|
10771
|
+
(function (RCLinkedListPoint) {
|
|
10772
|
+
RCLinkedListPoint["NORMAL"] = "normal";
|
|
10773
|
+
RCLinkedListPoint["MIDDLE"] = "middle";
|
|
10774
|
+
RCLinkedListPoint["TAIL"] = "tail";
|
|
10775
|
+
})(RCLinkedListPoint || (RCLinkedListPoint = {}));
|
|
10776
|
+
|
|
10566
10777
|
var CommandPriority;
|
|
10567
10778
|
(function (CommandPriority) {
|
|
10568
10779
|
CommandPriority[CommandPriority["LOW"] = 0] = "LOW";
|
|
10569
10780
|
CommandPriority[CommandPriority["NORMAL"] = 1] = "NORMAL";
|
|
10570
10781
|
CommandPriority[CommandPriority["HIGH"] = 2] = "HIGH";
|
|
10571
10782
|
})(CommandPriority || (CommandPriority = {}));
|
|
10783
|
+
var CommandCode;
|
|
10784
|
+
(function (CommandCode) {
|
|
10785
|
+
CommandCode[CommandCode["Destroy"] = 40400] = "Destroy";
|
|
10786
|
+
})(CommandCode || (CommandCode = {}));
|
|
10572
10787
|
/**
|
|
10573
10788
|
* 命令基类
|
|
10574
10789
|
*/
|
|
@@ -10579,8 +10794,103 @@
|
|
|
10579
10794
|
get priority() {
|
|
10580
10795
|
return CommandPriority.LOW;
|
|
10581
10796
|
}
|
|
10797
|
+
/**
|
|
10798
|
+
* 它返回命令的种类。
|
|
10799
|
+
* @returns 命令的种类。
|
|
10800
|
+
*/
|
|
10801
|
+
get kind() {
|
|
10802
|
+
return RCCommandKind.Unknow;
|
|
10803
|
+
}
|
|
10582
10804
|
}
|
|
10583
10805
|
|
|
10806
|
+
class AsyncCommand extends BaseCommand {
|
|
10807
|
+
constructor(state = RCLinkedListPoint.NORMAL) {
|
|
10808
|
+
super();
|
|
10809
|
+
this.state = state;
|
|
10810
|
+
}
|
|
10811
|
+
get kind() {
|
|
10812
|
+
return RCCommandKind.AsyncCommand;
|
|
10813
|
+
}
|
|
10814
|
+
/**
|
|
10815
|
+
* `public setState(状态:RCLinkedListPoint):void`
|
|
10816
|
+
*
|
|
10817
|
+
* 该函数是公共的,它被称为 setState,它接受一个称为 state 的参数,它什么也不返回
|
|
10818
|
+
* @param {RCLinkedListPoint} state - 链表的状态。
|
|
10819
|
+
*/
|
|
10820
|
+
setState(state) {
|
|
10821
|
+
this.state = state;
|
|
10822
|
+
}
|
|
10823
|
+
/**
|
|
10824
|
+
* 该功能用于向房间发送消息,任务完成时向房间发送消息
|
|
10825
|
+
* @param {Store} store - 店铺
|
|
10826
|
+
* @param {RCRTCCode} code - 任务的状态码,即任务的状态码。
|
|
10827
|
+
* @param {ISubscribeAttr[]} tracks - 要订阅的Tracks
|
|
10828
|
+
*/
|
|
10829
|
+
pickoutSubscribed(subscribedTracks, originTracks) {
|
|
10830
|
+
// const roomId: string = store.roomId
|
|
10831
|
+
const { unsubscribe, subscribe } = this.calcSubscribeList(subscribedTracks, originTracks);
|
|
10832
|
+
// 收集成功任务日志列表
|
|
10833
|
+
// 清空列表
|
|
10834
|
+
AsyncCommand.AsyncSubscribeTasks = [];
|
|
10835
|
+
AsyncCommand.AsyncUnsubscribeTasks = [];
|
|
10836
|
+
AsyncCommand.AsyncUpdateSubscribeTasks = [];
|
|
10837
|
+
return { subscribe, unsubscribe };
|
|
10838
|
+
}
|
|
10839
|
+
calcSubscribeList(newTracks, oldTracks) {
|
|
10840
|
+
const unsubscribe = [];
|
|
10841
|
+
const unsubscribeSet = new Set();
|
|
10842
|
+
const subscribe = [];
|
|
10843
|
+
const subscribeSet = new Set();
|
|
10844
|
+
const subscribedTracks = this.formateTrack(newTracks);
|
|
10845
|
+
const originTracks = this.formateTrack(oldTracks);
|
|
10846
|
+
originTracks.forEach(item => {
|
|
10847
|
+
const key = `${item.track.getTrackId()}_SUB_${item.subTiny ? '0' : '1'}`;
|
|
10848
|
+
if (!this.trackInSubscribeList(item, subscribedTracks) && !unsubscribeSet.has(key)) {
|
|
10849
|
+
unsubscribe.push(item);
|
|
10850
|
+
unsubscribeSet.add(key);
|
|
10851
|
+
}
|
|
10852
|
+
});
|
|
10853
|
+
subscribedTracks.forEach(item => {
|
|
10854
|
+
const key = `${item.track.getTrackId()}_SUB_${item.subTiny ? '0' : '1'}`;
|
|
10855
|
+
if (!this.trackInSubscribeList(item, originTracks) && !subscribeSet.has(key)) {
|
|
10856
|
+
subscribe.push(item);
|
|
10857
|
+
subscribeSet.add(key);
|
|
10858
|
+
}
|
|
10859
|
+
});
|
|
10860
|
+
return { unsubscribe, subscribe };
|
|
10861
|
+
}
|
|
10862
|
+
/**
|
|
10863
|
+
* 它需要一个轨道数组并返回一个轨道数组。
|
|
10864
|
+
* @param {(RCRemoteTrack | ISubscribeAttr)[]} tracks - (RCRemoteTrack | ISubscribeAttr)[]
|
|
10865
|
+
* @returns 具有 track 属性的对象数组。
|
|
10866
|
+
*/
|
|
10867
|
+
formateTrack(tracks) {
|
|
10868
|
+
return tracks.map(item => {
|
|
10869
|
+
return item instanceof RCRemoteTrack ? { track: item, subTiny: false } : Object.assign({ subTiny: false }, item);
|
|
10870
|
+
});
|
|
10871
|
+
}
|
|
10872
|
+
/**
|
|
10873
|
+
* 它检查 Track 是否已经在订阅列表中。
|
|
10874
|
+
* @param {ISubscribeAttr} track - ISubscribeAttr:要添加到列表中的 track
|
|
10875
|
+
* @param {ISubscribeAttr[]} tracks - 需要订阅的 track 数组
|
|
10876
|
+
*/
|
|
10877
|
+
trackInSubscribeList(track, subscribedTracks) {
|
|
10878
|
+
if (subscribedTracks.length === 0) {
|
|
10879
|
+
return false;
|
|
10880
|
+
}
|
|
10881
|
+
const trackIndex = subscribedTracks.findIndex(item => {
|
|
10882
|
+
if (item.track.getTrackId() === track.track.getTrackId()) {
|
|
10883
|
+
return item.subTiny === track.subTiny;
|
|
10884
|
+
}
|
|
10885
|
+
return false;
|
|
10886
|
+
});
|
|
10887
|
+
return trackIndex > -1;
|
|
10888
|
+
}
|
|
10889
|
+
}
|
|
10890
|
+
AsyncCommand.AsyncSubscribeTasks = [];
|
|
10891
|
+
AsyncCommand.AsyncUnsubscribeTasks = [];
|
|
10892
|
+
AsyncCommand.AsyncUpdateSubscribeTasks = [];
|
|
10893
|
+
|
|
10584
10894
|
class ReadableStore {
|
|
10585
10895
|
constructor(context, service, peerMgr, roomId, crtUserId, roomMode, polarisReport, isUpgrade, isMainRoom) {
|
|
10586
10896
|
this.context = context;
|
|
@@ -10600,6 +10910,7 @@
|
|
|
10600
10910
|
* 已订阅参数
|
|
10601
10911
|
*/
|
|
10602
10912
|
this._subscribedList = [];
|
|
10913
|
+
this._collectSubscribeList = [];
|
|
10603
10914
|
/**
|
|
10604
10915
|
* cdn_uris 信令扩散数据
|
|
10605
10916
|
*/
|
|
@@ -10641,6 +10952,9 @@
|
|
|
10641
10952
|
getSubscribedList() {
|
|
10642
10953
|
return this._subscribedList;
|
|
10643
10954
|
}
|
|
10955
|
+
getCollectSubscribeList() {
|
|
10956
|
+
return this._collectSubscribeList;
|
|
10957
|
+
}
|
|
10644
10958
|
getPublishedResourceByTrackId(trackId) {
|
|
10645
10959
|
const { userId } = parseTrackId(trackId);
|
|
10646
10960
|
return this._roomResources[userId].find(item => getTrackId(item) === trackId);
|
|
@@ -10736,6 +11050,13 @@
|
|
|
10736
11050
|
setCDNUris(uris) {
|
|
10737
11051
|
this._CDNUris = uris;
|
|
10738
11052
|
}
|
|
11053
|
+
resetSubscribedList(subscribeList) {
|
|
11054
|
+
this._subscribedList.splice(0, this._subscribedList.length, ...subscribeList);
|
|
11055
|
+
this.resetCollectSubscribeList(subscribeList);
|
|
11056
|
+
}
|
|
11057
|
+
resetCollectSubscribeList(collectSubscribeList) {
|
|
11058
|
+
this._collectSubscribeList.splice(0, this._collectSubscribeList.length, ...collectSubscribeList);
|
|
11059
|
+
}
|
|
10739
11060
|
}
|
|
10740
11061
|
|
|
10741
11062
|
class BaseInvoker {
|
|
@@ -10769,6 +11090,9 @@
|
|
|
10769
11090
|
const { command, resolve, reject } = this._queue.shift();
|
|
10770
11091
|
let res;
|
|
10771
11092
|
try {
|
|
11093
|
+
/**
|
|
11094
|
+
* 说明:由于是先弹出 再执行 Command,所以不存在 在队列中正在执行的任务
|
|
11095
|
+
*/
|
|
10772
11096
|
res = yield command.execute(this._store, this);
|
|
10773
11097
|
}
|
|
10774
11098
|
catch (error) {
|
|
@@ -10786,6 +11110,16 @@
|
|
|
10786
11110
|
if (this._isDestroyed) {
|
|
10787
11111
|
return;
|
|
10788
11112
|
}
|
|
11113
|
+
// 合并具有相同功能的 Command
|
|
11114
|
+
// 由于 Subscribed 与 UnSubscribed 是全量订阅的,
|
|
11115
|
+
// 所以只要队列中存在中 Subscribed 或 UnSubscribed 则可以只执行最后一个
|
|
11116
|
+
const kind = command.kind;
|
|
11117
|
+
if (this._queue.length > 0) {
|
|
11118
|
+
if (kind === RCCommandKind.AsyncCommand) {
|
|
11119
|
+
// 重写 resolve, reject 并将使用新回调的进行包裹它
|
|
11120
|
+
({ command, resolve, reject } = this.commandOffset(command, resolve, reject));
|
|
11121
|
+
}
|
|
11122
|
+
}
|
|
10789
11123
|
// 根据 command 优先级确定其在队列中的位置
|
|
10790
11124
|
const priority = command.priority;
|
|
10791
11125
|
// 优化队列输入权重为 0 时直接插入队列最未端即可
|
|
@@ -10798,8 +11132,60 @@
|
|
|
10798
11132
|
const postion = index === -1 ? this._queue.length - 1 : index;
|
|
10799
11133
|
this._queue.splice(postion, 0, { command, resolve, reject });
|
|
10800
11134
|
}
|
|
10801
|
-
|
|
10802
|
-
|
|
11135
|
+
// 防止相同任务频繁处理
|
|
11136
|
+
// 在Push完成后创建一个微任务队列
|
|
11137
|
+
// 在队列内对相同的任务进行处理
|
|
11138
|
+
Promise.resolve().then(() => {
|
|
11139
|
+
this._execute();
|
|
11140
|
+
});
|
|
11141
|
+
// setTimeout(() => {
|
|
11142
|
+
// this._execute()
|
|
11143
|
+
// }, 1)
|
|
11144
|
+
});
|
|
11145
|
+
}
|
|
11146
|
+
/**
|
|
11147
|
+
* 查找出 RCCommandKind.AsyncCommand 类型的 Command,并将其从队列中删除
|
|
11148
|
+
* 并使用最新的一次 Command 接管它的 resolve & reject
|
|
11149
|
+
* @param resolve
|
|
11150
|
+
* @param reject
|
|
11151
|
+
* @returns 具有两个属性的对象,resolve 和 reject。
|
|
11152
|
+
*/
|
|
11153
|
+
commandOffset(command, resolve, reject) {
|
|
11154
|
+
// 因为一次只可以插入一个 Command 所以查找 只需要在队列最后查找一个即可
|
|
11155
|
+
const index = this._queue.length - 1;
|
|
11156
|
+
const item = this._queue[index];
|
|
11157
|
+
const hashSubscribTask = item.command.kind === RCCommandKind.AsyncCommand;
|
|
11158
|
+
// 如果队列中不存在则直接返回
|
|
11159
|
+
if (!hashSubscribTask) {
|
|
11160
|
+
return { command, resolve, reject };
|
|
11161
|
+
}
|
|
11162
|
+
const [task] = this._queue.splice(index, 1);
|
|
11163
|
+
if (task.command instanceof AsyncCommand) {
|
|
11164
|
+
task.command.setState(RCLinkedListPoint.MIDDLE);
|
|
11165
|
+
if (command instanceof AsyncCommand) {
|
|
11166
|
+
command.setState(RCLinkedListPoint.TAIL);
|
|
11167
|
+
}
|
|
11168
|
+
}
|
|
11169
|
+
// 重写 command execute 方法
|
|
11170
|
+
const oldexecute = command.execute;
|
|
11171
|
+
/* eslint no-useless-call: 'off' */
|
|
11172
|
+
command.execute = function (store, invoker) {
|
|
11173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
11174
|
+
task.command.execute.call(task.command, store, invoker);
|
|
11175
|
+
return oldexecute.call(command, store, invoker);
|
|
11176
|
+
});
|
|
11177
|
+
};
|
|
11178
|
+
return {
|
|
11179
|
+
command,
|
|
11180
|
+
resolve: (res) => {
|
|
11181
|
+
task.resolve.call(task, res);
|
|
11182
|
+
resolve(res);
|
|
11183
|
+
},
|
|
11184
|
+
reject: (error) => {
|
|
11185
|
+
task.reject.call(task, error);
|
|
11186
|
+
reject(error);
|
|
11187
|
+
}
|
|
11188
|
+
};
|
|
10803
11189
|
}
|
|
10804
11190
|
isDestroyed() {
|
|
10805
11191
|
return this._isDestroyed;
|
|
@@ -10835,7 +11221,12 @@
|
|
|
10835
11221
|
}
|
|
10836
11222
|
}
|
|
10837
11223
|
|
|
10838
|
-
|
|
11224
|
+
/**
|
|
11225
|
+
* 加入房间后,若房间中已存在己方发布的资源,表示之前未能完成正常退出流程
|
|
11226
|
+
* 需先清除房间内的己方资源,通知房间内其他人己方已取消当前资源的发布
|
|
11227
|
+
* 该步骤没有必要与 MediaServer 的交互,因后续资源变更交互为全量交互
|
|
11228
|
+
*/
|
|
11229
|
+
class UnpublishPrevCommand extends BaseCommand {
|
|
10839
11230
|
execute(store) {
|
|
10840
11231
|
return __awaiter(this, void 0, void 0, function* () {
|
|
10841
11232
|
const selfRes = store.getResourcesByUserId(store.crtUserId);
|
|
@@ -10868,6 +11259,9 @@
|
|
|
10868
11259
|
this.innerUserDatas = innerUserDatas;
|
|
10869
11260
|
this.outerUserDatas = outerUserDatas;
|
|
10870
11261
|
}
|
|
11262
|
+
get kind() {
|
|
11263
|
+
return RCCommandKind.JoinRoom;
|
|
11264
|
+
}
|
|
10871
11265
|
execute(store, invoker) {
|
|
10872
11266
|
var _a;
|
|
10873
11267
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -10955,7 +11349,7 @@
|
|
|
10955
11349
|
* 需先清除房间内的己方资源,通知房间内其他人己方已取消当前资源的发布
|
|
10956
11350
|
* 该步骤没有必要与 MediaServer 的交互,因后续资源变更交互为全量交互
|
|
10957
11351
|
*/
|
|
10958
|
-
selfRes.length > 0 && invoker.push(new
|
|
11352
|
+
selfRes.length > 0 && invoker.push(new UnpublishPrevCommand());
|
|
10959
11353
|
const CDNUris = (_a = data.roomInfo.filter((item) => { return item.key === 'cdn_uris'; })[0]) === null || _a === void 0 ? void 0 : _a.value;
|
|
10960
11354
|
CDNUris && store.setCDNUris(JSON.parse(CDNUris)[0]);
|
|
10961
11355
|
engine.logger.info(logTag, {
|
|
@@ -11143,7 +11537,7 @@
|
|
|
11143
11537
|
}
|
|
11144
11538
|
}
|
|
11145
11539
|
|
|
11146
|
-
class
|
|
11540
|
+
class UpdateSubscribeListCommand extends BaseCommand {
|
|
11147
11541
|
constructor(tracks, subhook, forceReq) {
|
|
11148
11542
|
super();
|
|
11149
11543
|
this.tracks = tracks;
|
|
@@ -11235,21 +11629,24 @@
|
|
|
11235
11629
|
const subSuccessTrackIds = subscribedList === null || subscribedList === void 0 ? void 0 : subscribedList.map(item => `${item.msid}_${item.mediaType}`);
|
|
11236
11630
|
const subSuccessList = attrs.filter(item => subSuccessTrackIds === null || subSuccessTrackIds === void 0 ? void 0 : subSuccessTrackIds.includes(item.track.getTrackId()));
|
|
11237
11631
|
const failedList = attrs.filter(item => !(subSuccessTrackIds === null || subSuccessTrackIds === void 0 ? void 0 : subSuccessTrackIds.includes(item.track.getTrackId())));
|
|
11238
|
-
// 更新 remoteTrack.isSubscribed
|
|
11632
|
+
// 更新 remoteTrack.isSubscribed、remoteTrack.isTinyTrack
|
|
11239
11633
|
const remoteTracks = store.getRemoteTracks();
|
|
11240
11634
|
for (const trackId in remoteTracks) {
|
|
11241
11635
|
const subed = subSuccessList.some(item => item.track.getTrackId() === trackId);
|
|
11242
11636
|
remoteTracks[trackId].__innerSetSubscribed(subed);
|
|
11637
|
+
const isTinyTrack = subSuccessList.some(item => (item.track.getTrackId() === trackId && item.subTiny));
|
|
11638
|
+
remoteTracks[trackId].isVideoTrack() && (remoteTracks[trackId].__innerSetIsTinyTrack(isTinyTrack));
|
|
11243
11639
|
}
|
|
11244
11640
|
// 更新本地订阅关系
|
|
11245
|
-
const sublist = store.getSubscribedList()
|
|
11246
|
-
sublist.splice(0, sublist.length, ...subSuccessList)
|
|
11641
|
+
// const sublist = store.getSubscribedList()
|
|
11642
|
+
// sublist.splice(0, sublist.length, ...subSuccessList)
|
|
11643
|
+
store.resetSubscribedList(subSuccessList);
|
|
11247
11644
|
return failedList.length ? { code: exports.RCRTCCode.SUCCESS, failedList } : { code: exports.RCRTCCode.SUCCESS };
|
|
11248
11645
|
});
|
|
11249
11646
|
}
|
|
11250
11647
|
}
|
|
11251
11648
|
|
|
11252
|
-
class
|
|
11649
|
+
class UnsubscribeCommand extends BaseCommand {
|
|
11253
11650
|
constructor(tracks, subhook) {
|
|
11254
11651
|
super();
|
|
11255
11652
|
this.tracks = tracks;
|
|
@@ -11279,7 +11676,6 @@
|
|
|
11279
11676
|
}
|
|
11280
11677
|
logger.info(`unsubscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
11281
11678
|
// 计算剩余订阅列表
|
|
11282
|
-
// const crtSubList = this._subscribedList.map(item => ({ ...item })).filter(item => !tracks.includes(item.track))
|
|
11283
11679
|
const crtSubList = store.getSubscribedList().map(item => (Object.assign({}, item))).filter(item => !tracks.includes(item.track));
|
|
11284
11680
|
// 北极星上报
|
|
11285
11681
|
store.polarisReport.sendR2(R2Action.SUBSCRIBE, R2Status.END, tracks.map(item => item.getTrackId()));
|
|
@@ -11289,8 +11685,7 @@
|
|
|
11289
11685
|
}, {
|
|
11290
11686
|
logSource: engine.LogSource.RTC
|
|
11291
11687
|
});
|
|
11292
|
-
|
|
11293
|
-
return new UpdateSubListCommand(crtSubList, this.subhook, false).execute(store, invoker);
|
|
11688
|
+
return new UpdateSubscribeListCommand(crtSubList, this.subhook, false).execute(store, invoker);
|
|
11294
11689
|
});
|
|
11295
11690
|
}
|
|
11296
11691
|
}
|
|
@@ -11372,7 +11767,7 @@
|
|
|
11372
11767
|
});
|
|
11373
11768
|
if (tracks.length) {
|
|
11374
11769
|
// await this.unsubscribe(tracks)
|
|
11375
|
-
yield new
|
|
11770
|
+
yield new UnsubscribeCommand(tracks, this.subhook).execute(store, invoker);
|
|
11376
11771
|
// tracks.forEach((item) => delete this._remoteTracks[item.getTrackId()])
|
|
11377
11772
|
tracks.forEach(item => store.removeRemoteTrack(item.getTrackId()));
|
|
11378
11773
|
}
|
|
@@ -11399,7 +11794,7 @@
|
|
|
11399
11794
|
// 需要替业务层取消订阅,业务层只需关注 UI 变化
|
|
11400
11795
|
const tracks = this.tracks;
|
|
11401
11796
|
// await this.unsubscribe(tracks)
|
|
11402
|
-
yield new
|
|
11797
|
+
yield new UnsubscribeCommand(tracks, this.subhook).execute(store, invoker);
|
|
11403
11798
|
tracks.forEach(item => {
|
|
11404
11799
|
item.__innerDestroy();
|
|
11405
11800
|
// delete this._remoteTracks[item.getTrackId()]
|
|
@@ -11410,90 +11805,6 @@
|
|
|
11410
11805
|
}
|
|
11411
11806
|
}
|
|
11412
11807
|
|
|
11413
|
-
class SubCommand extends BaseCommand {
|
|
11414
|
-
constructor(tracks, subhook, forceReq) {
|
|
11415
|
-
super();
|
|
11416
|
-
this.tracks = tracks;
|
|
11417
|
-
this.subhook = subhook;
|
|
11418
|
-
this.forceReq = forceReq;
|
|
11419
|
-
}
|
|
11420
|
-
execute(store, invoker) {
|
|
11421
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
11422
|
-
// 取消房间状态检查,房间销毁后,invoker 应直接清空,避免后续执行动作
|
|
11423
|
-
// const roomStatusCode = this._assertRoomDestroyed()
|
|
11424
|
-
// if (roomStatusCode) {
|
|
11425
|
-
// logger.error(`subscribe failed, room has been destroyed -> roomId: ${this._roomId}`)
|
|
11426
|
-
// return { code: RCRTCCode.ROOM_HAS_BEEN_DESTROYED }
|
|
11427
|
-
// }
|
|
11428
|
-
const { tracks, forceReq } = this;
|
|
11429
|
-
const roomId = store.roomId;
|
|
11430
|
-
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_T, {
|
|
11431
|
-
trackIds: tracks.map(getTrackIdFromAttr),
|
|
11432
|
-
forceReq
|
|
11433
|
-
}, {
|
|
11434
|
-
logSource: engine.LogSource.RTC
|
|
11435
|
-
});
|
|
11436
|
-
if (!engine.validate('tracks', tracks, () => {
|
|
11437
|
-
return engine.isArray(tracks) && tracks.length > 0 && tracks.every(item => {
|
|
11438
|
-
return item instanceof RCRemoteTrack || item.track instanceof RCRemoteTrack;
|
|
11439
|
-
});
|
|
11440
|
-
}, true)) {
|
|
11441
|
-
logger.warn(`subscribe failed, tracks is invalid -> roomId: ${roomId}`);
|
|
11442
|
-
engine.logger.error(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
11443
|
-
status: RCLoggerStatus.FAILED,
|
|
11444
|
-
code: exports.RCRTCCode.PARAMS_ERROR,
|
|
11445
|
-
msg: 'params error -> tracks'
|
|
11446
|
-
}, {
|
|
11447
|
-
logSource: engine.LogSource.RTC
|
|
11448
|
-
});
|
|
11449
|
-
return { code: exports.RCRTCCode.PARAMS_ERROR };
|
|
11450
|
-
}
|
|
11451
|
-
logger.info(`subscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
11452
|
-
// const crtSubList = this._subscribedList.map(item => ({ ...item }))
|
|
11453
|
-
const crtSubList = store.getSubscribedList().map(item => (Object.assign({}, item)));
|
|
11454
|
-
const attrs = tracks.map(item => {
|
|
11455
|
-
return item instanceof RCRemoteTrack ? { track: item } : item;
|
|
11456
|
-
});
|
|
11457
|
-
let changed = false;
|
|
11458
|
-
const R2TrackIds = [];
|
|
11459
|
-
attrs.forEach(item => {
|
|
11460
|
-
const trackId = item.track.getTrackId();
|
|
11461
|
-
R2TrackIds.push(trackId);
|
|
11462
|
-
const crt = crtSubList.find(tmp => tmp.track.getTrackId() === trackId);
|
|
11463
|
-
if (crt && crt.subTiny === item.subTiny) {
|
|
11464
|
-
return;
|
|
11465
|
-
}
|
|
11466
|
-
if (crt) {
|
|
11467
|
-
crt.subTiny = item.subTiny;
|
|
11468
|
-
}
|
|
11469
|
-
else {
|
|
11470
|
-
crtSubList.push(item);
|
|
11471
|
-
}
|
|
11472
|
-
changed = true;
|
|
11473
|
-
});
|
|
11474
|
-
if (!changed && !forceReq) {
|
|
11475
|
-
engine.logger.warn(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
11476
|
-
status: RCLoggerStatus.FAILED,
|
|
11477
|
-
code: '',
|
|
11478
|
-
msg: 'repeat subscribe'
|
|
11479
|
-
}, {
|
|
11480
|
-
logSource: engine.LogSource.RTC
|
|
11481
|
-
});
|
|
11482
|
-
return { code: exports.RCRTCCode.SUCCESS };
|
|
11483
|
-
}
|
|
11484
|
-
// 北极星上报
|
|
11485
|
-
store.polarisReport.sendR2(R2Action.SUBSCRIBE, R2Status.BEGIN, R2TrackIds);
|
|
11486
|
-
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
11487
|
-
trackIds: tracks.map(getTrackIdFromAttr),
|
|
11488
|
-
roomId
|
|
11489
|
-
}, {
|
|
11490
|
-
logSource: engine.LogSource.RTC
|
|
11491
|
-
});
|
|
11492
|
-
return new UpdateSubListCommand(crtSubList, this.subhook, true).execute(store, invoker);
|
|
11493
|
-
});
|
|
11494
|
-
}
|
|
11495
|
-
}
|
|
11496
|
-
|
|
11497
11808
|
class ParseRemoteResCommand extends BaseCommand {
|
|
11498
11809
|
constructor(msgContent, messageType, senderId, subhook, callback) {
|
|
11499
11810
|
super();
|
|
@@ -11575,7 +11886,7 @@
|
|
|
11575
11886
|
const trackIds = subedTracks.map(item => item.getTrackId());
|
|
11576
11887
|
logger.debug(`resub tracks -> ${JSON.stringify(trackIds)}`);
|
|
11577
11888
|
// const { code } = await push(() => this.__subscribe(subedTracks, true))
|
|
11578
|
-
const { code } = yield new
|
|
11889
|
+
const { code } = yield new UpdateSubscribeListCommand(subedTracks, this.subhook).execute(store, invoker);
|
|
11579
11890
|
if (code !== exports.RCRTCCode.SUCCESS) {
|
|
11580
11891
|
logger.error(`resub tracks failed -> code: ${code}, ids: ${JSON.stringify(trackIds)}`);
|
|
11581
11892
|
}
|
|
@@ -11631,15 +11942,101 @@
|
|
|
11631
11942
|
}
|
|
11632
11943
|
}
|
|
11633
11944
|
|
|
11945
|
+
class SubscribeCommand extends BaseCommand {
|
|
11946
|
+
constructor(tracks, subhook, forceReq) {
|
|
11947
|
+
super();
|
|
11948
|
+
this.tracks = tracks;
|
|
11949
|
+
this.subhook = subhook;
|
|
11950
|
+
this.forceReq = forceReq;
|
|
11951
|
+
}
|
|
11952
|
+
execute(store, invoker) {
|
|
11953
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
11954
|
+
// 取消房间状态检查,房间销毁后,invoker 应直接清空,避免后续执行动作
|
|
11955
|
+
// const roomStatusCode = this._assertRoomDestroyed()
|
|
11956
|
+
// if (roomStatusCode) {
|
|
11957
|
+
// logger.error(`subscribe failed, room has been destroyed -> roomId: ${this._roomId}`)
|
|
11958
|
+
// return { code: RCRTCCode.ROOM_HAS_BEEN_DESTROYED }
|
|
11959
|
+
// }
|
|
11960
|
+
const { tracks, forceReq } = this;
|
|
11961
|
+
const roomId = store.roomId;
|
|
11962
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_T, {
|
|
11963
|
+
trackIds: tracks.map(getTrackIdFromAttr),
|
|
11964
|
+
forceReq
|
|
11965
|
+
}, {
|
|
11966
|
+
logSource: engine.LogSource.RTC
|
|
11967
|
+
});
|
|
11968
|
+
if (!engine.validate('tracks', tracks, () => {
|
|
11969
|
+
return engine.isArray(tracks) && tracks.length > 0 && tracks.every(item => {
|
|
11970
|
+
return item instanceof RCRemoteTrack || item.track instanceof RCRemoteTrack;
|
|
11971
|
+
});
|
|
11972
|
+
}, true)) {
|
|
11973
|
+
logger.warn(`subscribe failed, tracks is invalid -> roomId: ${roomId}`);
|
|
11974
|
+
engine.logger.error(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
11975
|
+
status: RCLoggerStatus.FAILED,
|
|
11976
|
+
code: exports.RCRTCCode.PARAMS_ERROR,
|
|
11977
|
+
msg: 'params error -> tracks'
|
|
11978
|
+
}, {
|
|
11979
|
+
logSource: engine.LogSource.RTC
|
|
11980
|
+
});
|
|
11981
|
+
return { code: exports.RCRTCCode.PARAMS_ERROR };
|
|
11982
|
+
}
|
|
11983
|
+
logger.info(`subscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
11984
|
+
const crtSubList = store.getSubscribedList().map(item => (Object.assign({}, item)));
|
|
11985
|
+
const attrs = tracks.map(item => {
|
|
11986
|
+
return item instanceof RCRemoteTrack ? { track: item } : item;
|
|
11987
|
+
});
|
|
11988
|
+
let changed = false;
|
|
11989
|
+
const R2TrackIds = [];
|
|
11990
|
+
attrs.forEach(item => {
|
|
11991
|
+
const trackId = item.track.getTrackId();
|
|
11992
|
+
R2TrackIds.push(trackId);
|
|
11993
|
+
const crt = crtSubList.find(tmp => tmp.track.getTrackId() === trackId);
|
|
11994
|
+
if (crt && crt.subTiny === item.subTiny) {
|
|
11995
|
+
return;
|
|
11996
|
+
}
|
|
11997
|
+
if (crt) {
|
|
11998
|
+
crt.subTiny = item.subTiny;
|
|
11999
|
+
}
|
|
12000
|
+
else {
|
|
12001
|
+
crtSubList.push(item);
|
|
12002
|
+
}
|
|
12003
|
+
changed = true;
|
|
12004
|
+
});
|
|
12005
|
+
if (!changed && !forceReq) {
|
|
12006
|
+
engine.logger.warn(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
12007
|
+
status: RCLoggerStatus.FAILED,
|
|
12008
|
+
code: '',
|
|
12009
|
+
msg: 'repeat subscribe'
|
|
12010
|
+
}, {
|
|
12011
|
+
logSource: engine.LogSource.RTC
|
|
12012
|
+
});
|
|
12013
|
+
return { code: exports.RCRTCCode.SUCCESS };
|
|
12014
|
+
}
|
|
12015
|
+
// 北极星上报
|
|
12016
|
+
store.polarisReport.sendR2(R2Action.SUBSCRIBE, R2Status.BEGIN, R2TrackIds);
|
|
12017
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
12018
|
+
trackIds: tracks.map(getTrackIdFromAttr),
|
|
12019
|
+
roomId
|
|
12020
|
+
}, {
|
|
12021
|
+
logSource: engine.LogSource.RTC
|
|
12022
|
+
});
|
|
12023
|
+
return new UpdateSubscribeListCommand(crtSubList, this.subhook, true).execute(store, invoker);
|
|
12024
|
+
});
|
|
12025
|
+
}
|
|
12026
|
+
}
|
|
12027
|
+
|
|
11634
12028
|
/**
|
|
11635
12029
|
* 资源发布命令
|
|
11636
12030
|
*/
|
|
11637
|
-
class
|
|
12031
|
+
class PublishCommand extends BaseCommand {
|
|
11638
12032
|
constructor(tracks, pubhook) {
|
|
11639
12033
|
super();
|
|
11640
12034
|
this.tracks = tracks;
|
|
11641
12035
|
this.pubhook = pubhook;
|
|
11642
12036
|
}
|
|
12037
|
+
get kind() {
|
|
12038
|
+
return RCCommandKind.Publish;
|
|
12039
|
+
}
|
|
11643
12040
|
/**
|
|
11644
12041
|
* 从 pc 移除当次发布失败的资源
|
|
11645
12042
|
*/
|
|
@@ -11703,7 +12100,6 @@
|
|
|
11703
12100
|
// 客户端主动调用 api 发请求时,清除 ice 断线重连的定时器
|
|
11704
12101
|
pc.clearReTryExchangeTimer();
|
|
11705
12102
|
// 发送 /exchange 请求
|
|
11706
|
-
// const subscribeList = this._useMutilPeerC ? [] : this._subscribedList
|
|
11707
12103
|
const subscribeList = store.useMutilPeerC ? [] : store.getSubscribedList();
|
|
11708
12104
|
const reqBody = yield createExchangeParams(subscribeList, false, pc, store);
|
|
11709
12105
|
/**
|
|
@@ -11844,6 +12240,7 @@
|
|
|
11844
12240
|
*/
|
|
11845
12241
|
const pubTasks = [];
|
|
11846
12242
|
const { plist, pushOtherRooms } = this.pubhook(tracks);
|
|
12243
|
+
// 在不开启多 peerConnection 情况一下 plist = [ pc ]
|
|
11847
12244
|
for (let index = 0; index < plist.length; index++) {
|
|
11848
12245
|
const item = plist[index];
|
|
11849
12246
|
pubTasks.push(this.__publish(store, item, item.tracks, pushOtherRooms, invoker));
|
|
@@ -11862,12 +12259,15 @@
|
|
|
11862
12259
|
}
|
|
11863
12260
|
}
|
|
11864
12261
|
|
|
11865
|
-
class
|
|
12262
|
+
class UnpublishCommand extends BaseCommand {
|
|
11866
12263
|
constructor(tracks, unpubhook) {
|
|
11867
12264
|
super();
|
|
11868
12265
|
this.tracks = tracks;
|
|
11869
12266
|
this.unpubhook = unpubhook;
|
|
11870
12267
|
}
|
|
12268
|
+
get kind() {
|
|
12269
|
+
return RCCommandKind.UnPublish;
|
|
12270
|
+
}
|
|
11871
12271
|
__unpublish(store, invoker, peerCItem, tracks) {
|
|
11872
12272
|
return __awaiter(this, void 0, void 0, function* () {
|
|
11873
12273
|
const { pcName, pc } = peerCItem;
|
|
@@ -12311,6 +12711,260 @@
|
|
|
12311
12711
|
}
|
|
12312
12712
|
}
|
|
12313
12713
|
|
|
12714
|
+
/**
|
|
12715
|
+
* 更新订阅关系,为强制更新订阅关系,传入的 Tracks 都会被订阅
|
|
12716
|
+
*/
|
|
12717
|
+
class AsyncUpdateSubscribeListCommand extends AsyncCommand {
|
|
12718
|
+
constructor(tracks, subhook, callbacks, state = RCLinkedListPoint.NORMAL) {
|
|
12719
|
+
super(state);
|
|
12720
|
+
this.tracks = tracks;
|
|
12721
|
+
this.subhook = subhook;
|
|
12722
|
+
this.callbacks = callbacks;
|
|
12723
|
+
}
|
|
12724
|
+
execute(store, invoker) {
|
|
12725
|
+
var _a, _b, _c;
|
|
12726
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12727
|
+
const { tracks } = this;
|
|
12728
|
+
const roomId = store.roomId;
|
|
12729
|
+
logger.info(`unsubscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
12730
|
+
if (this.state === RCLinkedListPoint.NORMAL) {
|
|
12731
|
+
// 获取原订阅列表
|
|
12732
|
+
const originTracks = store.getSubscribedList().slice();
|
|
12733
|
+
const { code: updateSuscribeCode, failedList } = yield new UpdateSubscribeListCommand(tracks, this.subhook).execute(store, invoker);
|
|
12734
|
+
// 获取新的订阅列表
|
|
12735
|
+
const subscribedTracks = store.getSubscribedList().slice();
|
|
12736
|
+
// 计算订阅列表 Diff
|
|
12737
|
+
const { subscribe, unsubscribe } = this.pickoutSubscribed(subscribedTracks, originTracks);
|
|
12738
|
+
(_a = this.callbacks) === null || _a === void 0 ? void 0 : _a.onTaskCompleted({ code: updateSuscribeCode, subscribe, unsubscribe, failedList });
|
|
12739
|
+
return { code: updateSuscribeCode, failedList };
|
|
12740
|
+
}
|
|
12741
|
+
if (this.state === RCLinkedListPoint.TAIL) {
|
|
12742
|
+
// 自执行一次,计算出最终的 collectSubscribeList
|
|
12743
|
+
const { code: unsubscribeCode } = yield new AsyncUpdateSubscribeListCommand(this.tracks, this.subhook, this.callbacks, RCLinkedListPoint.MIDDLE).execute(store, invoker);
|
|
12744
|
+
// 拥塞队列处理完成的数据
|
|
12745
|
+
if (unsubscribeCode === exports.RCRTCCode.SUCCESS) {
|
|
12746
|
+
// 浅Copy 并对 store.getCollectSubscribeList 数据进行清空
|
|
12747
|
+
const tracks = store.getCollectSubscribeList().slice(0).map(item => item.track);
|
|
12748
|
+
const originTracks = store.getSubscribedList().slice();
|
|
12749
|
+
// 自执行一次,计算出最终的 collectSubscribeList
|
|
12750
|
+
const { code: updateSuscribeCode, failedList } = yield new UpdateSubscribeListCommand(tracks, this.subhook).execute(store, invoker);
|
|
12751
|
+
if (updateSuscribeCode !== exports.RCRTCCode.SUCCESS) {
|
|
12752
|
+
(_b = this.callbacks) === null || _b === void 0 ? void 0 : _b.onTaskCompleted({ code: updateSuscribeCode, subscribe: [], unsubscribe: [], failedList });
|
|
12753
|
+
return { code: updateSuscribeCode, failedList };
|
|
12754
|
+
}
|
|
12755
|
+
const subscribedTracks = store.getSubscribedList().slice(0);
|
|
12756
|
+
const { subscribe, unsubscribe } = this.pickoutSubscribed(subscribedTracks, originTracks);
|
|
12757
|
+
(_c = this.callbacks) === null || _c === void 0 ? void 0 : _c.onTaskCompleted({ code: updateSuscribeCode, subscribe, unsubscribe, failedList });
|
|
12758
|
+
return { code: updateSuscribeCode, failedList };
|
|
12759
|
+
}
|
|
12760
|
+
return { code: unsubscribeCode };
|
|
12761
|
+
}
|
|
12762
|
+
AsyncCommand.AsyncUpdateSubscribeTasks.splice(AsyncCommand.AsyncUpdateSubscribeTasks.length, 0, ...this.tracks);
|
|
12763
|
+
// 处理队列中频繁调用,时带来的频繁订阅的逻辑 只处理一部分
|
|
12764
|
+
return new Promise(resolve => {
|
|
12765
|
+
const formateTrack = tracks.map(item => {
|
|
12766
|
+
return item instanceof RCRemoteTrack ? { track: item } : item;
|
|
12767
|
+
});
|
|
12768
|
+
// 将需要订阅的数据 设置到订阅列表
|
|
12769
|
+
store.resetCollectSubscribeList(formateTrack);
|
|
12770
|
+
resolve({ code: exports.RCRTCCode.SUCCESS });
|
|
12771
|
+
});
|
|
12772
|
+
});
|
|
12773
|
+
}
|
|
12774
|
+
}
|
|
12775
|
+
|
|
12776
|
+
class AsyncSubscribeCommand extends AsyncCommand {
|
|
12777
|
+
constructor(tracks, subhook, callbacks, state = RCLinkedListPoint.NORMAL) {
|
|
12778
|
+
super(state);
|
|
12779
|
+
this.tracks = tracks;
|
|
12780
|
+
this.subhook = subhook;
|
|
12781
|
+
this.callbacks = callbacks;
|
|
12782
|
+
}
|
|
12783
|
+
execute(store, invoker) {
|
|
12784
|
+
var _a;
|
|
12785
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12786
|
+
const { tracks } = this;
|
|
12787
|
+
const roomId = store.roomId;
|
|
12788
|
+
// 队列中只有一个发布或者取消发布任务,没有进行操作合并时的处理
|
|
12789
|
+
if (this.state === RCLinkedListPoint.NORMAL) {
|
|
12790
|
+
// 获取原订阅列表
|
|
12791
|
+
const originTracks = store.getSubscribedList().slice();
|
|
12792
|
+
const { code: subscribeCode, failedList } = yield new SubscribeCommand(tracks, this.subhook).execute(store, invoker);
|
|
12793
|
+
// 获取新的订阅列表
|
|
12794
|
+
const subscribedTracks = store.getSubscribedList().slice();
|
|
12795
|
+
// 计算订阅列表 Diff
|
|
12796
|
+
const { subscribe, unsubscribe } = this.pickoutSubscribed(subscribedTracks, originTracks);
|
|
12797
|
+
(_a = this.callbacks) === null || _a === void 0 ? void 0 : _a.onTaskCompleted({ code: subscribeCode, subscribe, unsubscribe, failedList });
|
|
12798
|
+
return { code: subscribeCode, failedList };
|
|
12799
|
+
}
|
|
12800
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_T, {
|
|
12801
|
+
trackIds: tracks.map(getTrackIdFromAttr)
|
|
12802
|
+
}, {
|
|
12803
|
+
logSource: engine.LogSource.RTC
|
|
12804
|
+
});
|
|
12805
|
+
if (!engine.validate('tracks', tracks, () => {
|
|
12806
|
+
return engine.isArray(tracks) && tracks.length > 0 && tracks.every(item => {
|
|
12807
|
+
return item instanceof RCRemoteTrack || item.track instanceof RCRemoteTrack;
|
|
12808
|
+
});
|
|
12809
|
+
}, true)) {
|
|
12810
|
+
logger.warn(`subscribe failed, tracks is invalid -> roomId: ${roomId}`);
|
|
12811
|
+
engine.logger.error(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
12812
|
+
status: RCLoggerStatus.FAILED,
|
|
12813
|
+
code: exports.RCRTCCode.PARAMS_ERROR,
|
|
12814
|
+
msg: 'params error -> tracks'
|
|
12815
|
+
}, {
|
|
12816
|
+
logSource: engine.LogSource.RTC
|
|
12817
|
+
});
|
|
12818
|
+
return { code: exports.RCRTCCode.PARAMS_ERROR };
|
|
12819
|
+
}
|
|
12820
|
+
logger.info(`subscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
12821
|
+
const crtSubList = this.getSubscribedList(store).map(item => (Object.assign({}, item)));
|
|
12822
|
+
const formateTrack = tracks.map(item => {
|
|
12823
|
+
return item instanceof RCRemoteTrack ? { track: item } : item;
|
|
12824
|
+
});
|
|
12825
|
+
const R2TrackIds = [];
|
|
12826
|
+
// 查找所发布的 大流 是否存在及 小流 是否有变动
|
|
12827
|
+
formateTrack.forEach(item => {
|
|
12828
|
+
const trackId = item.track.getTrackId();
|
|
12829
|
+
// 收集ID上报日志
|
|
12830
|
+
R2TrackIds.push(trackId);
|
|
12831
|
+
const crt = crtSubList.find(tmp => tmp.track.getTrackId() === trackId);
|
|
12832
|
+
if (crt) {
|
|
12833
|
+
if (crt.subTiny === item.subTiny) {
|
|
12834
|
+
return;
|
|
12835
|
+
}
|
|
12836
|
+
crt.subTiny = item.subTiny;
|
|
12837
|
+
}
|
|
12838
|
+
else {
|
|
12839
|
+
crtSubList.push(item);
|
|
12840
|
+
}
|
|
12841
|
+
});
|
|
12842
|
+
// 北极星上报
|
|
12843
|
+
store.polarisReport.sendR2(R2Action.SUBSCRIBE, R2Status.BEGIN, R2TrackIds);
|
|
12844
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_SUBSCRIBE_R, {
|
|
12845
|
+
trackIds: tracks.map(getTrackIdFromAttr),
|
|
12846
|
+
roomId
|
|
12847
|
+
}, {
|
|
12848
|
+
logSource: engine.LogSource.RTC
|
|
12849
|
+
});
|
|
12850
|
+
if (this.state === RCLinkedListPoint.TAIL) {
|
|
12851
|
+
const { code: subscribeCode } = yield new AsyncSubscribeCommand(this.tracks, this.subhook, this.callbacks, RCLinkedListPoint.MIDDLE).execute(store, invoker);
|
|
12852
|
+
if (subscribeCode === exports.RCRTCCode.SUCCESS) {
|
|
12853
|
+
// 浅Copy 并对 store.getCollectSubscribeList 数据进行清空
|
|
12854
|
+
const tracks = store.getCollectSubscribeList().slice(0);
|
|
12855
|
+
return new AsyncUpdateSubscribeListCommand(tracks, this.subhook, this.callbacks).execute(store, invoker);
|
|
12856
|
+
}
|
|
12857
|
+
return { code: subscribeCode };
|
|
12858
|
+
}
|
|
12859
|
+
AsyncCommand.AsyncSubscribeTasks.splice(AsyncCommand.AsyncSubscribeTasks.length, 0, ...this.tracks);
|
|
12860
|
+
// 处理队列中频繁调用,时带来的频繁订阅的逻辑 只处理一部分
|
|
12861
|
+
return new Promise(resolve => {
|
|
12862
|
+
// 将数据写入到订阅列表中,最后一次变更(订阅|取消订阅)会再次处理它
|
|
12863
|
+
store.resetCollectSubscribeList(crtSubList);
|
|
12864
|
+
resolve({ code: exports.RCRTCCode.SUCCESS });
|
|
12865
|
+
});
|
|
12866
|
+
});
|
|
12867
|
+
}
|
|
12868
|
+
/**
|
|
12869
|
+
* 如果当前节点的状态为 MIDDLE,则返回 store 的订阅属性列表。否则,返回存储的订阅属性列表
|
|
12870
|
+
* @param {Store} store
|
|
12871
|
+
* @returns ISubscribeAttr 对象的数组。
|
|
12872
|
+
*/
|
|
12873
|
+
getSubscribedList(store) {
|
|
12874
|
+
if (this.state === RCLinkedListPoint.MIDDLE) {
|
|
12875
|
+
return store.getCollectSubscribeList();
|
|
12876
|
+
}
|
|
12877
|
+
return store.getSubscribedList();
|
|
12878
|
+
}
|
|
12879
|
+
}
|
|
12880
|
+
|
|
12881
|
+
class AsyncUnsubscribeCommand extends AsyncCommand {
|
|
12882
|
+
constructor(tracks, subhook, callbacks, state = RCLinkedListPoint.NORMAL) {
|
|
12883
|
+
super(state);
|
|
12884
|
+
this.tracks = tracks;
|
|
12885
|
+
this.subhook = subhook;
|
|
12886
|
+
this.callbacks = callbacks;
|
|
12887
|
+
}
|
|
12888
|
+
execute(store, invoker) {
|
|
12889
|
+
var _a;
|
|
12890
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12891
|
+
const tracks = this.tracks;
|
|
12892
|
+
const roomId = store.roomId;
|
|
12893
|
+
// 队列中只有一个发布或者取消发布任务,没有进行操作合并时的处理
|
|
12894
|
+
if (this.state === RCLinkedListPoint.NORMAL) {
|
|
12895
|
+
// 获取原订阅列表
|
|
12896
|
+
const originTracks = store.getSubscribedList().slice();
|
|
12897
|
+
const { code: unsubscribeCode, failedList } = yield new UnsubscribeCommand(tracks, this.subhook).execute(store, invoker);
|
|
12898
|
+
// 获取新的订阅列表
|
|
12899
|
+
const subscribedTracks = store.getSubscribedList().slice();
|
|
12900
|
+
// 计算出 Diff
|
|
12901
|
+
const { subscribe, unsubscribe } = this.pickoutSubscribed(subscribedTracks, originTracks);
|
|
12902
|
+
(_a = this.callbacks) === null || _a === void 0 ? void 0 : _a.onTaskCompleted({ code: unsubscribeCode, subscribe, unsubscribe, failedList });
|
|
12903
|
+
return { code: unsubscribeCode, failedList };
|
|
12904
|
+
}
|
|
12905
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_UNSUBSCRIBE_T, {
|
|
12906
|
+
trackIds: tracks.map(getTrackIdFromAttr)
|
|
12907
|
+
}, {
|
|
12908
|
+
logSource: engine.LogSource.RTC
|
|
12909
|
+
});
|
|
12910
|
+
if (!engine.validate('tracks', tracks, () => {
|
|
12911
|
+
return engine.isArray(tracks) && tracks.length > 0 && tracks.every(item => item instanceof RCRemoteTrack);
|
|
12912
|
+
}, true)) {
|
|
12913
|
+
logger.warn(`unsubscribe failed, tracks is invalid -> roomId: ${roomId}`);
|
|
12914
|
+
engine.logger.warn(RCLoggerTag.L_ABSTRACT_ROOM_UNSUBSCRIBE_R, {
|
|
12915
|
+
status: RCLoggerStatus.FAILED,
|
|
12916
|
+
code: exports.RCRTCCode.PARAMS_ERROR,
|
|
12917
|
+
msg: 'params error -> tracks'
|
|
12918
|
+
}, {
|
|
12919
|
+
logSource: engine.LogSource.RTC
|
|
12920
|
+
});
|
|
12921
|
+
return { code: exports.RCRTCCode.PARAMS_ERROR };
|
|
12922
|
+
}
|
|
12923
|
+
logger.info(`unsubscribe -> roomId: ${roomId}, tracks: ${tracks.map(getTrackIdFromAttr)}`);
|
|
12924
|
+
// 计算剩余订阅列表, 如果资源在取消订阅列表内则排除它
|
|
12925
|
+
const crtSubList = this.getSubscribedList(store).map(item => (Object.assign({}, item))).filter(item => !tracks.includes(item.track));
|
|
12926
|
+
// 北极星上报
|
|
12927
|
+
store.polarisReport.sendR2(R2Action.SUBSCRIBE, R2Status.END, tracks.map(item => item.getTrackId()));
|
|
12928
|
+
engine.logger.info(RCLoggerTag.L_ABSTRACT_ROOM_UNSUBSCRIBE_R, {
|
|
12929
|
+
trackIds: tracks.map(getTrackIdFromAttr),
|
|
12930
|
+
roomId
|
|
12931
|
+
}, {
|
|
12932
|
+
logSource: engine.LogSource.RTC
|
|
12933
|
+
});
|
|
12934
|
+
if (this.state === RCLinkedListPoint.TAIL) {
|
|
12935
|
+
// 自执行一次,计算出最终的 collectSubscribeList
|
|
12936
|
+
const { code: unsubscribeCode } = yield new AsyncUnsubscribeCommand(this.tracks, this.subhook, this.callbacks, RCLinkedListPoint.MIDDLE).execute(store, invoker);
|
|
12937
|
+
// 拥塞队列处理完成的数据
|
|
12938
|
+
if (unsubscribeCode === exports.RCRTCCode.SUCCESS) {
|
|
12939
|
+
// 浅Copy 并对 store.getCollectSubscribeList 数据进行清空
|
|
12940
|
+
const tracks = store.getCollectSubscribeList().slice(0).map(item => item.track);
|
|
12941
|
+
// 自执行一次,计算出最终的 collectSubscribeList
|
|
12942
|
+
return new AsyncUpdateSubscribeListCommand(tracks, this.subhook, this.callbacks).execute(store, invoker);
|
|
12943
|
+
}
|
|
12944
|
+
return { code: unsubscribeCode };
|
|
12945
|
+
}
|
|
12946
|
+
AsyncCommand.AsyncUnsubscribeTasks.splice(AsyncCommand.AsyncUnsubscribeTasks.length, 0, ...this.tracks);
|
|
12947
|
+
// 处理队列中频繁调用,时带来的频繁订阅的逻辑 只处理一部分
|
|
12948
|
+
return new Promise(resolve => {
|
|
12949
|
+
// 将需要订阅的数据 设置到订阅列表
|
|
12950
|
+
store.resetCollectSubscribeList(crtSubList);
|
|
12951
|
+
resolve({ code: exports.RCRTCCode.SUCCESS });
|
|
12952
|
+
});
|
|
12953
|
+
});
|
|
12954
|
+
}
|
|
12955
|
+
/**
|
|
12956
|
+
* 如果当前节点的状态为 MIDDLE,则返回 store 的订阅属性列表。否则,返回存储的订阅属性列表
|
|
12957
|
+
* @param {Store} store
|
|
12958
|
+
* @returns ISubscribeAttr 对象的数组。
|
|
12959
|
+
*/
|
|
12960
|
+
getSubscribedList(store) {
|
|
12961
|
+
if (this.state === RCLinkedListPoint.MIDDLE) {
|
|
12962
|
+
return store.getCollectSubscribeList();
|
|
12963
|
+
}
|
|
12964
|
+
return store.getSubscribedList();
|
|
12965
|
+
}
|
|
12966
|
+
}
|
|
12967
|
+
|
|
12314
12968
|
const RCAbstractRoomEvent = {
|
|
12315
12969
|
LEAVE: 'evt-leave'
|
|
12316
12970
|
};
|
|
@@ -12474,7 +13128,7 @@
|
|
|
12474
13128
|
// TODO 处理加入的 PK 房间断线情况
|
|
12475
13129
|
break;
|
|
12476
13130
|
default:
|
|
12477
|
-
this._callAppListener('onMessageReceive', message.messageType,
|
|
13131
|
+
this._callAppListener('onMessageReceive', message.messageType, content, message.senderUserId, message.messageUId);
|
|
12478
13132
|
break;
|
|
12479
13133
|
}
|
|
12480
13134
|
return true;
|
|
@@ -12876,7 +13530,7 @@
|
|
|
12876
13530
|
*/
|
|
12877
13531
|
publish(tracks) {
|
|
12878
13532
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12879
|
-
return this._invoker.push(new
|
|
13533
|
+
return this._invoker.push(new PublishCommand(tracks, this._pubhook.bind(this)));
|
|
12880
13534
|
});
|
|
12881
13535
|
}
|
|
12882
13536
|
/**
|
|
@@ -12913,7 +13567,7 @@
|
|
|
12913
13567
|
*/
|
|
12914
13568
|
unpublish(tracks) {
|
|
12915
13569
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12916
|
-
return this._invoker.push(new
|
|
13570
|
+
return this._invoker.push(new UnpublishCommand(tracks, (tracks, pcName) => {
|
|
12917
13571
|
return { pushOtherRooms: this._getPushOtherRoomsParams(), headers: this._getRTCReqestHeaders(pcName) };
|
|
12918
13572
|
}));
|
|
12919
13573
|
});
|
|
@@ -12967,18 +13621,60 @@
|
|
|
12967
13621
|
*/
|
|
12968
13622
|
subscribe(tracks) {
|
|
12969
13623
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12970
|
-
return this._invoker.push(new
|
|
13624
|
+
return this._invoker.push(new SubscribeCommand(tracks, this._subhook.bind(this)));
|
|
12971
13625
|
});
|
|
12972
13626
|
}
|
|
13627
|
+
/**
|
|
13628
|
+
* 它将订阅任务添加到队列中。
|
|
13629
|
+
* @param {(RCRemoteTrack | ISubscribeAttr)[]} tracks - (RCRemoteTrack | ISubscribeAttr)[]
|
|
13630
|
+
* @returns 一个用代码和失败列表解析为对象的承诺。
|
|
13631
|
+
*/
|
|
13632
|
+
addSubscribeTask(tracks) {
|
|
13633
|
+
this._invoker.push(new AsyncSubscribeCommand(tracks, this._subhook.bind(this), {
|
|
13634
|
+
onTaskCompleted: this._onTaskCompleted.bind(this)
|
|
13635
|
+
}));
|
|
13636
|
+
}
|
|
12973
13637
|
/**
|
|
12974
13638
|
* 取消订阅资源
|
|
12975
13639
|
* @param tracks 预取消远端资源
|
|
12976
13640
|
*/
|
|
12977
13641
|
unsubscribe(tracks) {
|
|
12978
13642
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12979
|
-
return this._invoker.push(new
|
|
13643
|
+
return this._invoker.push(new UnsubscribeCommand(tracks, this._subhook.bind(this)));
|
|
12980
13644
|
});
|
|
12981
13645
|
}
|
|
13646
|
+
/**
|
|
13647
|
+
* 它将取消订阅任务添加到队列中。
|
|
13648
|
+
* @param {RCRemoteTrack[]} tracks - 要取消订阅的曲目。
|
|
13649
|
+
* @returns 一个用代码和失败列表解析为对象的承诺。
|
|
13650
|
+
*/
|
|
13651
|
+
addUnsubscribeTask(tracks) {
|
|
13652
|
+
this._invoker.push(new AsyncUnsubscribeCommand(tracks, this._subhook.bind(this), {
|
|
13653
|
+
onTaskCompleted: this._onTaskCompleted.bind(this)
|
|
13654
|
+
}));
|
|
13655
|
+
}
|
|
13656
|
+
/**
|
|
13657
|
+
* 强制修改订阅列表,仅订阅数组中的资源,取消订阅其他已订阅资源。
|
|
13658
|
+
* 当参数为 `[]` 时,意味着不再订阅任何资源
|
|
13659
|
+
* @param tracks 变更的资源列表
|
|
13660
|
+
*/
|
|
13661
|
+
updateSubList(tracks) {
|
|
13662
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
13663
|
+
return this._invoker.push(new UpdateSubscribeListCommand(tracks, this._subhook.bind(this)));
|
|
13664
|
+
});
|
|
13665
|
+
}
|
|
13666
|
+
/**
|
|
13667
|
+
* 将任务添加到任务队列的函数。
|
|
13668
|
+
* @param {(RCRemoteTrack | ISubscribeAttr)[]} tracks - (RCRemoteTrack | ISubscribeAttr)[]
|
|
13669
|
+
*/
|
|
13670
|
+
addUpdateSubscribeListTask(tracks) {
|
|
13671
|
+
this._invoker.push(new AsyncUpdateSubscribeListCommand(tracks, this._subhook.bind(this), {
|
|
13672
|
+
onTaskCompleted: this._onTaskCompleted.bind(this)
|
|
13673
|
+
}));
|
|
13674
|
+
}
|
|
13675
|
+
_onTaskCompleted(content) {
|
|
13676
|
+
this._callAppListener('onTaskCompleted', content.code, content.subscribe, content.unsubscribe, content.failedList);
|
|
13677
|
+
}
|
|
12982
13678
|
/**
|
|
12983
13679
|
* 获取已发布的本地资源
|
|
12984
13680
|
* @param trackId
|
|
@@ -13002,15 +13698,12 @@
|
|
|
13002
13698
|
return this._store.getRemoteTrack(trackId) || null;
|
|
13003
13699
|
}
|
|
13004
13700
|
/**
|
|
13005
|
-
*
|
|
13006
|
-
*
|
|
13007
|
-
* @param tracks 变更的资源列表
|
|
13701
|
+
* 获取当前已经订阅的全量资源
|
|
13702
|
+
* returns subscribedTracks ISubscribeAttr[]
|
|
13008
13703
|
*/
|
|
13009
|
-
|
|
13010
|
-
|
|
13011
|
-
|
|
13012
|
-
return this._invoker.push(new UpdateSubListCommand(tracks, this._subhook.bind(this), false));
|
|
13013
|
-
});
|
|
13704
|
+
get subscribedTracks() {
|
|
13705
|
+
// 浅Copy 获取已经订阅的列表
|
|
13706
|
+
return this._store.getSubscribedList().slice();
|
|
13014
13707
|
}
|
|
13015
13708
|
/**
|
|
13016
13709
|
* 注册事件监听器,多次注册会导致后者覆盖前者,可以通过使用 `registerRoomEventListener(null)` 取消注册
|
|
@@ -14427,6 +15120,9 @@
|
|
|
14427
15120
|
this._joinedPKRooms = _joinedPKRooms;
|
|
14428
15121
|
this.isQuitPK = isQuitPK;
|
|
14429
15122
|
}
|
|
15123
|
+
get kind() {
|
|
15124
|
+
return RCCommandKind.LeaveRoom;
|
|
15125
|
+
}
|
|
14430
15126
|
/**
|
|
14431
15127
|
* 结束跨房间连麦
|
|
14432
15128
|
* @param roomId 需要结束连麦的房间 roomId
|
|
@@ -15142,7 +15838,7 @@
|
|
|
15142
15838
|
* 需先清除房间内的己方资源,通知房间内其他人己方已取消当前资源的发布
|
|
15143
15839
|
* 该步骤没有必要与 MediaServer 的交互,因后续资源变更交互为全量交互
|
|
15144
15840
|
*/
|
|
15145
|
-
selfRes.length > 0 && invoker.push(new
|
|
15841
|
+
selfRes.length > 0 && invoker.push(new UnpublishPrevCommand());
|
|
15146
15842
|
const CDNUris = (_a = data.roomInfo.filter((item) => { return item.key === 'cdn_uris'; })[0]) === null || _a === void 0 ? void 0 : _a.value;
|
|
15147
15843
|
CDNUris && store.setCDNUris(JSON.parse(CDNUris)[0]);
|
|
15148
15844
|
return { code, data };
|
|
@@ -16726,6 +17422,12 @@
|
|
|
16726
17422
|
return push(() => this._subscribeHandle(tracks, false), 'audience-sub');
|
|
16727
17423
|
});
|
|
16728
17424
|
}
|
|
17425
|
+
addSubscribeTask(tracks) {
|
|
17426
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17427
|
+
// TODO: 重构RCAudienceLivingRoom, 使用队列处理
|
|
17428
|
+
return push(() => this._subscribeHandle(tracks, false), 'audience-sub');
|
|
17429
|
+
});
|
|
17430
|
+
}
|
|
16729
17431
|
__unsubscribe(tracks) {
|
|
16730
17432
|
var _a;
|
|
16731
17433
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -16774,6 +17476,12 @@
|
|
|
16774
17476
|
return push(() => this.__unsubscribe(tracks), 'audience-unsub');
|
|
16775
17477
|
});
|
|
16776
17478
|
}
|
|
17479
|
+
addUnsubscribeTask(tracks) {
|
|
17480
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17481
|
+
// TODO: 重构RCAudienceLivingRoom, 使用队列处理
|
|
17482
|
+
return push(() => this.__unsubscribe(tracks), 'audience-unsub');
|
|
17483
|
+
});
|
|
17484
|
+
}
|
|
16777
17485
|
/**
|
|
16778
17486
|
* 退出房间并销毁当前房间实例,退出后该房间的所有方法将不可用
|
|
16779
17487
|
*/
|
|
@@ -16983,7 +17691,10 @@
|
|
|
16983
17691
|
}
|
|
16984
17692
|
catch (error) {
|
|
16985
17693
|
if (error.message === 'Permission denied') {
|
|
16986
|
-
return { code: exports.RCRTCCode.
|
|
17694
|
+
return { code: exports.RCRTCCode.BROWSER_PERMISSION_DENIED };
|
|
17695
|
+
}
|
|
17696
|
+
if (error.message === 'Permission denied by system') {
|
|
17697
|
+
return { code: exports.RCRTCCode.SYSTEM_PERMISSION_DENIED };
|
|
16987
17698
|
}
|
|
16988
17699
|
logger.error(`get user media failed -> ${error.message}`);
|
|
16989
17700
|
}
|
|
@@ -18192,7 +18903,7 @@
|
|
|
18192
18903
|
logger.error('Please use the https protocol or use `http://localhost` to open the page!');
|
|
18193
18904
|
return false;
|
|
18194
18905
|
}
|
|
18195
|
-
engine.VersionManage.add('plugin-rtc', "5.4.
|
|
18906
|
+
engine.VersionManage.add('plugin-rtc', "5.4.5-alpha.1");
|
|
18196
18907
|
if (!engine.VersionManage.validEngine(">=5.3.3-beem-alpha.2 || >=5.3.4")) {
|
|
18197
18908
|
logger.error(`The current engine version '${engine.VersionManage.getInfo().engine}' error, plugin-rtc required engine version at least '${">=5.3.3-beem-alpha.2 || >=5.3.4"}'.`);
|
|
18198
18909
|
return false;
|
|
@@ -18200,9 +18911,10 @@
|
|
|
18200
18911
|
return true;
|
|
18201
18912
|
},
|
|
18202
18913
|
setup(context, runtime, options = {}) {
|
|
18914
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
18203
18915
|
logger.setLogLevel(options.logLevel);
|
|
18204
18916
|
logger.setLogStdout(options.logStdout);
|
|
18205
|
-
logger.warn(`RCRTC Version: ${"5.4.
|
|
18917
|
+
logger.warn(`RCRTC Version: ${"5.4.5-alpha.1"}, Commit: ${"960e964ebd4294c2f095e87cf9e33935703b475e"}`);
|
|
18206
18918
|
logger.warn(`browserInfo.browser -> ${browserInfo.browser}`);
|
|
18207
18919
|
logger.warn(`browserInfo.supportsUnifiedPlan -> ${browserInfo.supportsUnifiedPlan}`);
|
|
18208
18920
|
logger.warn(`browserInfo.version -> ${browserInfo.version}`);
|
|
@@ -18218,6 +18930,21 @@
|
|
|
18218
18930
|
engine.assert('options.pingGap', options.pingGap, (value) => {
|
|
18219
18931
|
return engine.isNumber(value) && value >= 3000 && value <= 10000;
|
|
18220
18932
|
});
|
|
18933
|
+
if (options === null || options === void 0 ? void 0 : options.audio) {
|
|
18934
|
+
if ((_a = options.audio) === null || _a === void 0 ? void 0 : _a.workletModule) {
|
|
18935
|
+
RC3AnoiseTrack.workletModule = (_b = options.audio) === null || _b === void 0 ? void 0 : _b.workletModule;
|
|
18936
|
+
}
|
|
18937
|
+
if ((_c = options.audio) === null || _c === void 0 ? void 0 : _c.workletWasm) {
|
|
18938
|
+
RC3AnoiseTrack.workletWasm = (_d = options.audio) === null || _d === void 0 ? void 0 : _d.workletWasm;
|
|
18939
|
+
}
|
|
18940
|
+
/* 如果 workletModule 与 workletWasm 都配置了,则将 isOpen 配置为 true */
|
|
18941
|
+
if (((_e = options.audio) === null || _e === void 0 ? void 0 : _e.workletModule) && ((_f = options.audio) === null || _f === void 0 ? void 0 : _f.workletWasm)) {
|
|
18942
|
+
RC3AnoiseTrack.isOpen = true;
|
|
18943
|
+
}
|
|
18944
|
+
if (typeof ((_g = options.audio) === null || _g === void 0 ? void 0 : _g.isOpen) !== 'undefined') {
|
|
18945
|
+
RC3AnoiseTrack.isOpen = (_h = options.audio) === null || _h === void 0 ? void 0 : _h.isOpen;
|
|
18946
|
+
}
|
|
18947
|
+
}
|
|
18221
18948
|
return new RCRTCClient(context, runtime, options);
|
|
18222
18949
|
}
|
|
18223
18950
|
};
|