trtc-sdk-v5 5.2.0-beta.8 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -291,17 +291,98 @@
291
291
  'AudioMixer': AudioMixerOptions;
292
292
  'AIDenoiser': AIDenoiserOptions;
293
293
  'CDNStreaming': CDNStreamingOptions;
294
+ 'VirtualBackground': VirtualBackgroundOptions;
294
295
  };
295
296
  declare type PluginUpdateOptionsMap = {
296
297
  'AudioMixer': UpdateAudioMixerOptions;
297
298
  'CDNStreaming': CDNStreamingOptions;
299
+ 'VirtualBackground': UpdateVirtualBackgroundOptions;
298
300
  };
299
301
  declare type PluginStopOptionsMap = {
300
302
  'AudioMixer': StopAudioMixerOptions;
301
303
  'AIDenoiser': undefined;
302
304
  'CDNStreaming': CDNStreamingOptions;
305
+ 'VirtualBackground': undefined;
303
306
  };
307
+ declare interface TRTCStatistics {
308
+ rtt: number;
309
+ downLoss: number;
310
+ upLoss: number;
311
+ bytesSent: number;
312
+ bytesReceived: number;
313
+ localStatistics: LocalStatistic;
314
+ remoteStatistics: RemoteStatistic[];
315
+ }
316
+ interface LocalStatistic {
317
+ audio: {
318
+ bitrate: number;
319
+ audioLevel: number;
320
+ };
321
+ video: {
322
+ width: number;
323
+ height: number;
324
+ frameRate: number;
325
+ bitrate: number;
326
+ videoType: TRTCVideoType;
327
+ }[];
328
+ }
329
+ declare enum TRTCVideoType {
330
+ Big = "big",
331
+ Small = "small",
332
+ Sub = "sub"
333
+ }
334
+ interface RemoteStatistic {
335
+ audio: {
336
+ bitrate: number;
337
+ audioLevel: number;
338
+ };
339
+ video: {
340
+ width: number;
341
+ height: number;
342
+ frameRate: number;
343
+ bitrate: number;
344
+ videoType: TRTCVideoType;
345
+ }[];
346
+ userId: string;
347
+ }
304
348
 
349
+ /**
350
+ * @typedef TRTCStatistics TRTC 通话统计信息
351
+ * @property {number} rtt 从 SDK 与 云端的往返延时(一个网络包经历 “SDK -> 云端 -> SDK” 的总耗时),单位 ms。
352
+ * @property {number} upLoss 从 SDK 到云端的上行丢包率,单位 (%)
353
+ * @property {number} downLoss 从云端到 SDK 的下行丢包率,单位 (%)
354
+ * @property {number} bytesSent 总发送字节数(包含信令数据和音视频数据),单位:字节数(Bytes)。
355
+ * @property {number} bytesReceived 总接收字节数(包含信令数据和音视频数据),单位:字节数(Bytes)。
356
+ * @property {TRTCLocalStatistics} localStatistics 本地的音视频统计信息
357
+ * @property {TRTCRemoteStatistics[]} remoteStatistics 远端的音视频统计信息
358
+ */
359
+ /**
360
+ * 本地的音视频统计信息
361
+ * @typedef TRTCLocalStatistics
362
+ * @property {TRTCAudioStatistic} audio 本地音频统计信息
363
+ * @property {TRTCVideoStatistic[]} video 本地视频统计信息
364
+ */
365
+ /**
366
+ * 远端的音视频统计信息
367
+ * @typedef TRTCRemoteStatistics
368
+ * @property {string} userId 远端用户的 userId
369
+ * @property {TRTCAudioStatistic} audio 远端音频统计信息
370
+ * @property {TRTCVideoStatistic[]} video 远端视频统计信息
371
+ */
372
+ /**
373
+ * 音频统计信息
374
+ * @typedef TRTCAudioStatistic
375
+ * @property {number} bitrate 音频码率,单位:Kbps
376
+ * @property {number} audioLevel 音量大小,0 ~ 1 的浮点数。
377
+ */
378
+ /** 视频统计信息
379
+ * @typedef TRTCVideoStatistic
380
+ * @property {number} bitrate 视频码率,单位:Kbps
381
+ * @property {number} width 视频宽度
382
+ * @property {number} height 视频高度
383
+ * @property {number} frameRate 视频帧率
384
+ * @property {'big'|'small'|'sub'} videoType 视频类型,大流、小流、辅流。
385
+ */
305
386
  /**
306
387
  * **TRTC事件列表**<br>
307
388
  * <br>
@@ -339,7 +420,7 @@
339
420
  * @example
340
421
  * trtc.on(TRTC.EVENT.AUTOPLAY_FAILED, event => {
341
422
  * // 引导用户点击页面,当用户点击页面时,SDK 会自动恢复播放。
342
- * // v5.1.3+
423
+ * // 自 v5.1.3+ 新增 userId 参数,表示哪个用户出现自动播放失败。
343
424
  * console.log(event.userId);
344
425
  * });
345
426
  */
@@ -652,6 +733,20 @@
652
733
  * })
653
734
  */
654
735
  readonly SEI_MESSAGE: "sei-message";
736
+ /**
737
+ * @description 通话相关数据指标。<br>
738
+ *
739
+ * - 监听该事件后,SDK 会以 2s 一次的频率定时抛出该事件。
740
+ * - 您可以从该事件中可以获取通话的网络质量(rtt、丢包率)、上行和下行的音视频统计信息(音量大小、宽高、帧率、码率)等信息。详细参数说明请参考:{@link TRTCStatistics}
741
+ * @default 'statistics'
742
+ * @since v5.2.0
743
+ * @memberof module:EVENT
744
+ * @example
745
+ * trtc.on(TRTC.EVENT.STATISTICS, statistics => {
746
+ * console.warn(statistics.rtt, statistics.upLoss, statistics.downLoss);
747
+ * })
748
+ */
749
+ readonly STATISTICS: "statistics";
655
750
  };
656
751
  declare interface TRTCEventTypes {
657
752
  [TRTCEvent.ERROR]: [RtcError];
@@ -722,6 +817,7 @@
722
817
  data: Uint8Array;
723
818
  userId: string;
724
819
  }];
820
+ [TRTCEvent.STATISTICS]: [statistics: TRTCStatistics];
725
821
  }
726
822
  class TRTC extends EventEmitter<TRTCEventTypes> {
727
823
  /**
@@ -1252,48 +1348,10 @@
1252
1348
  * await trtc.setRemoteAudioVolume('123', 90);
1253
1349
  * */
1254
1350
  setRemoteAudioVolume(userId: string, volume: number): void;
1255
- /**
1256
- * 开启插件
1257
- *
1258
- * | pluginName | 插件名称 | 参考教程 | 参数类型 |
1259
- * | --- | --- | --- | --- |
1260
- * | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [AudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#AudioMixerOptions) |
1261
- * | 'AIDenoiser' | 降噪插件 | {@tutorial 35-advanced-ai-denoiser} | [AIDenoiserOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#AIDenoiserOptions) |
1262
- * | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#CDNStreamingOptions) |
1263
- *
1264
- * @param {PluginName} plugin
1265
- * @param {AudioMixerOptions|AIDenoiserOptions|CDNStreamingOptions} options
1266
- * @returns {Promise<void>}
1267
- */
1268
1351
  startPlugin<T extends keyof PluginStartOptionsMap, O extends PluginStartOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
1269
1352
  startPlugin<T extends keyof PluginStartOptionsMap, O extends PluginStartOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
1270
- /**
1271
- * 更新插件
1272
- *
1273
- * | pluginName | 插件名称 | 参考教程 | 参数类型 |
1274
- * | --- | --- | --- | --- |
1275
- * | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [UpdateAudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#UpdateAudioMixerOptions) |
1276
- * | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/global.html#CDNStreamingOptions) |
1277
- *
1278
- * @param {PluginName} plugin
1279
- * @param {UpdateAudioMixerOptions|CDNStreamingOptions} options
1280
- * @returns {Promise<void>}
1281
- */
1282
1353
  updatePlugin<T extends keyof PluginUpdateOptionsMap, O extends PluginUpdateOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
1283
1354
  updatePlugin<T extends keyof PluginUpdateOptionsMap, O extends PluginUpdateOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
1284
- /**
1285
- * 停止插件
1286
- *
1287
- * | pluginName | 插件名称 | 参考教程 | 参数类型 |
1288
- * | --- | --- | --- | --- |
1289
- * | 'AudioMixer' | 背景音乐插件 | {@tutorial 22-advanced-audio-mixer} | [StopAudioMixerOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/global.html#StopAudioMixerOptions) |
1290
- * | 'AIDenoiser' | 降噪插件 | {@tutorial 35-advanced-ai-denoiser} | |
1291
- * | 'CDNStreaming' | CDN混流插件 | {@tutorial 26-advanced-publish-cdn-stream} | [CDNStreamingOptions](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/global.html#CDNStreamingOptions) |
1292
- *
1293
- * @param {PluginName} plugin
1294
- * @param {StopAudioMixerOptions|StopAIDenoiserOptions|CDNStreamingOptions} options
1295
- * @returns {Promise<void>}
1296
- */
1297
1355
  stopPlugin<T extends keyof PluginStopOptionsMap, O extends PluginStopOptionsMap[T]>(plugin: O extends undefined ? never : T, options: O): Promise<any>;
1298
1356
  stopPlugin<T extends keyof PluginStopOptionsMap, O extends PluginStopOptionsMap[T]>(plugin: O extends undefined ? T : never): Promise<any>;
1299
1357
  /**
@@ -1408,6 +1466,7 @@
1408
1466
  readonly DEVICE_CHANGED: "device-changed";
1409
1467
  readonly PUBLISH_STATE_CHANGED: "publish-state-changed";
1410
1468
  readonly SEI_MESSAGE: "sei-message";
1469
+ readonly STATISTICS: "statistics";
1411
1470
  };
1412
1471
  static ERROR_CODE: {
1413
1472
  INVALID_PARAMETER: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trtc-sdk-v5",
3
- "version": "5.2.0-beta.8",
3
+ "version": "5.2.0",
4
4
  "description": "Tencent Cloud RTC SDK for Web",
5
5
  "main": "trtc.js",
6
6
  "types": "index.d.ts",
@@ -1 +1 @@
1
- var ne=Object.create;var H=Object.defineProperty,ue=Object.defineProperties,de=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyDescriptors,le=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols,he=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var $=(l,e,i)=>e in l?H(l,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):l[e]=i,I=(l,e)=>{for(var i in e||(e={}))X.call(e,i)&&$(l,i,e[i]);if(q)for(var i of q(e))ce.call(e,i)&&$(l,i,e[i]);return l},W=(l,e)=>ue(l,me(e));var pe=(l,e)=>()=>(e||l((e={exports:{}}).exports,e),e.exports);var ge=(l,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of le(e))!X.call(l,d)&&d!==i&&H(l,d,{get:()=>e[d],enumerable:!(u=de(e,d))||u.enumerable});return l};var z=(l,e,i)=>(i=l!=null?ne(he(l)):{},ge(e||!l||!l.__esModule?H(i,"default",{value:l,enumerable:!0}):i,l));var b=(l,e,i)=>($(l,typeof e!="symbol"?e+"":e,i),i);var V=pe((j,x)=>{(function(l){"use strict";function e(t,h){var r=(t&65535)+(h&65535),g=(t>>16)+(h>>16)+(r>>16);return g<<16|r&65535}function i(t,h){return t<<h|t>>>32-h}function u(t,h,r,g,T,C){return e(i(e(e(h,t),e(g,C)),T),r)}function d(t,h,r,g,T,C,f){return u(h&r|~h&g,t,h,T,C,f)}function c(t,h,r,g,T,C,f){return u(h&g|r&~g,t,h,T,C,f)}function m(t,h,r,g,T,C,f){return u(h^r^g,t,h,T,C,f)}function p(t,h,r,g,T,C,f){return u(r^(h|~g),t,h,T,C,f)}function S(t,h){t[h>>5]|=128<<h%32,t[(h+64>>>9<<4)+14]=h;var r,g,T,C,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,T=a,C=s,f=n,o=d(o,a,s,n,t[r],7,-680876936),n=d(n,o,a,s,t[r+1],12,-389564586),s=d(s,n,o,a,t[r+2],17,606105819),a=d(a,s,n,o,t[r+3],22,-1044525330),o=d(o,a,s,n,t[r+4],7,-176418897),n=d(n,o,a,s,t[r+5],12,1200080426),s=d(s,n,o,a,t[r+6],17,-1473231341),a=d(a,s,n,o,t[r+7],22,-45705983),o=d(o,a,s,n,t[r+8],7,1770035416),n=d(n,o,a,s,t[r+9],12,-1958414417),s=d(s,n,o,a,t[r+10],17,-42063),a=d(a,s,n,o,t[r+11],22,-1990404162),o=d(o,a,s,n,t[r+12],7,1804603682),n=d(n,o,a,s,t[r+13],12,-40341101),s=d(s,n,o,a,t[r+14],17,-1502002290),a=d(a,s,n,o,t[r+15],22,1236535329),o=c(o,a,s,n,t[r+1],5,-165796510),n=c(n,o,a,s,t[r+6],9,-1069501632),s=c(s,n,o,a,t[r+11],14,643717713),a=c(a,s,n,o,t[r],20,-373897302),o=c(o,a,s,n,t[r+5],5,-701558691),n=c(n,o,a,s,t[r+10],9,38016083),s=c(s,n,o,a,t[r+15],14,-660478335),a=c(a,s,n,o,t[r+4],20,-405537848),o=c(o,a,s,n,t[r+9],5,568446438),n=c(n,o,a,s,t[r+14],9,-1019803690),s=c(s,n,o,a,t[r+3],14,-187363961),a=c(a,s,n,o,t[r+8],20,1163531501),o=c(o,a,s,n,t[r+13],5,-1444681467),n=c(n,o,a,s,t[r+2],9,-51403784),s=c(s,n,o,a,t[r+7],14,1735328473),a=c(a,s,n,o,t[r+12],20,-1926607734),o=m(o,a,s,n,t[r+5],4,-378558),n=m(n,o,a,s,t[r+8],11,-2022574463),s=m(s,n,o,a,t[r+11],16,1839030562),a=m(a,s,n,o,t[r+14],23,-35309556),o=m(o,a,s,n,t[r+1],4,-1530992060),n=m(n,o,a,s,t[r+4],11,1272893353),s=m(s,n,o,a,t[r+7],16,-155497632),a=m(a,s,n,o,t[r+10],23,-1094730640),o=m(o,a,s,n,t[r+13],4,681279174),n=m(n,o,a,s,t[r],11,-358537222),s=m(s,n,o,a,t[r+3],16,-722521979),a=m(a,s,n,o,t[r+6],23,76029189),o=m(o,a,s,n,t[r+9],4,-640364487),n=m(n,o,a,s,t[r+12],11,-421815835),s=m(s,n,o,a,t[r+15],16,530742520),a=m(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,T),s=e(s,C),n=e(n,f);return[o,a,s,n]}function _(t){var h,r="",g=t.length*32;for(h=0;h<g;h+=8)r+=String.fromCharCode(t[h>>5]>>>h%32&255);return r}function D(t){var h,r=[];for(r[(t.length>>2)-1]=void 0,h=0;h<r.length;h+=1)r[h]=0;var g=t.length*8;for(h=0;h<g;h+=8)r[h>>5]|=(t.charCodeAt(h/8)&255)<<h%32;return r}function A(t){return _(S(D(t),t.length*8))}function U(t,h){var r,g=D(t),T=[],C=[],f;for(T[15]=C[15]=void 0,g.length>16&&(g=S(g,t.length*8)),r=0;r<16;r+=1)T[r]=g[r]^909522486,C[r]=g[r]^1549556828;return f=S(T.concat(D(h)),512+h.length*8),_(S(C.concat(f),512+128))}function E(t){var h="0123456789abcdef",r="",g,T;for(T=0;T<t.length;T+=1)g=t.charCodeAt(T),r+=h.charAt(g>>>4&15)+h.charAt(g&15);return r}function R(t){return unescape(encodeURIComponent(t))}function P(t){return A(R(t))}function F(t){return E(P(t))}function J(t,h){return U(R(t),R(h))}function se(t,h){return E(J(t,h))}function B(t,h,r){return h?r?J(h,t):se(h,t):r?P(t):F(t)}typeof define=="function"&&define.amd?define(function(){return B}):typeof x=="object"&&x.exports?x.exports=B:l.md5=B})(j)});var Y=z(V(),1);var N=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(N||{}),K=(i=>(i.Main="main",i.Sub="sub",i))(K||{});var v={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var M=class{constructor(e){b(this,"_room");b(this,"_log");b(this,"_paramsForGivenCDN");b(this,"_publishGivenCDNData",null);b(this,"_isPublishingGivenCDN",!1);this._room=e.room,this._log=e.log,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:d,message:c}=u.data;if(d===0)this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`startPublishGivenCDN failed, errCode: ${d}, errMsg: ${c}`),new Error(`startPublishGivenCDN failed, errCode: ${d} errMsg: ${c}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info(`stopPublishGivenCDN: ${JSON.stringify(this._publishGivenCDNData)}`),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:c}=this._publishGivenCDNData,m={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:c},p=await this._room.sendStopPublishCDN(m,!1),{code:S,message:_}=p.data;if(S===0)this.resetGivenCDN();else throw this._log.error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`),new Error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var y=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_config",null);b(this,"_data",null);b(this,"_givenCDNManager");this._core=e,this._room=e.room,this.cdnLog=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this.cdnLog.info(`startMixTranscode: ${e}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),d=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&d!==this._data.outputSessionId&&(this.cdnLog.info("startMixTranscode() streamId changed, stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:d,inputParam:i,outputParam:u});let{appId:c,bizId:m,url:p,streamId:S=""}=this._config.target;c&&m&&p&&(this._givenCDNManager||(this._givenCDNManager=new M(this._core)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:c,bizId:m,url:p,streamId:S}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let d={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this.cdnLog.info(`doStartMixTranscode: ${JSON.stringify(d)}`);let c=await this._room.sendStartMixTranscode(d),{code:m}=c.data,{message:p}=c.data;if(m===0)this._data=d;else throw m===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this.cdnLog.error(`startMixTranscode failed, errCode: ${m} errMsg: ${p}`),new Error(`startMixTranscode failed, errCode: ${m} errMsg: ${p}`)}async stopMixTranscode(){this.cdnLog.info(`stopMixTranscode: ${this.isMixing}`);try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this.cdnLog.info(`doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:d}=i.data;if(u===0)this.reset();else throw this.cdnLog.error(`stopMixTranscode failed, errCode: ${u} errMsg: ${d}`),new Error(`stopMixTranscode failed, errCode: ${u} errMsg: ${d}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Y.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:d=[]}=i,c=d.map(m=>({userId:m.fixedVideoUser.userId,roomId:this.getStringRoomId(m.fixedVideoUser.roomId,m.fixedVideoUser.strRoomId)||this._core.room.roomId,width:m.width||0,height:m.height||0,locationX:m.locationX||0,locationY:m.locationY||0,zOrder:m.zOrder||1,streamType:m.fixedVideoStreamType==="sub"?1:0,inputType:v.IT_PURE_VIDEO,renderMode:m.fillMode||0}));return u.forEach(m=>{let p=c.findIndex(S=>S.userId===m.userId&&S.room===this.getStringRoomId(m.roomId,m.strRoomId));p!==-1?c[p].inputType=v.IT_AUDIO_VIDEO:c.push({userId:m.userId,roomId:m.roomId||m.strRoomId,inputType:v.IT_PURE_AUDIO})}),c}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:d={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:d.backgroundColor||0,backgroundImg:d.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var w=z(V(),1);var L=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_paramsForTencentCDN");b(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this.cdnLog=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var d;this.cdnLog.info(`handlePublished: mediaType ${e.mediaType}, roomID ${(d=e==null?void 0:e.room)==null?void 0:d.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this.cdnLog.info("Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this.cdnLog.info("Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),d=I(I({},u),i);this._paramsForTencentCDN.set(e,d)}async startPublishTencentCDN(e){if(this.cdnLog.info(`startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),d=this.generatePublishCDNSessionId(e.publishMode),c=e.publishMode==="publish-sub-stream-to-cdn"?1:0,m={requestTime:Date.now(),sessionId:d,streamId:u,streamType:c};await this.doStartPublishTencentCDN(m,e.publishMode);let{appId:p,bizId:S,url:_}=e;if(p&&S&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new M(this._core),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:S,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this.cdnLog.info(`doStartPublishTencentCDN: ${JSON.stringify(e)}`);try{let c=0;for(;;){let m=await this._room.sendStartPublishCDN(e,!0),{code:p}=m.data,{message:S}=m.data;if(p===0){this.cdnLog.info(`doStartPublishTencentCDN: success ${JSON.stringify(m)}`),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&c<6)this.cdnLog.warn(`doStartPublishTencentCDN: retry...${c+1}/6, reason: ${S}`),c+=1,await new Promise(_=>setTimeout(_,500));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(S=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),new Error(`startPublishTencentCDN failed, errCode: ${p} errMsg: ${S}`)}}catch(u){throw this.cdnLog.error(`startPublishTencentCDN failed, error: ${u}`),this.changeDataStatus(i,{isPublished:!1}),u}}async stopPublishTencentCDN(e){let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,w.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this.cdnLog.info(`stopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:d,message:c}=u.data;if(d===0)this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else if(d===-102069)this.cdnLog.error("stopPublishTencentCDN failed, can not stopPublishTencentCDN in auto relayed-push mode"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN);else throw this.cdnLog.error(`stopPublishTencentCDN failed, errCode: ${d} errMsg: ${c}`),new Error(`stopPublishTencentCDN failed, errCode: ${d} errMsg: ${c}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,w.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,w.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Z=l=>typeof l=="string";function Se(l,e,i,u){if(!/^[A-Za-z\d_-]*$/.test(l))throw new Error("Invalid parameter streamId.")}function Te(l,e,i,u){if(Z(l))throw new Error("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");if(l===void 0)return;if(!(/^[1-9]\d*$/.test(String(l))&&l<4294967295))throw new Error("roomId must be an integer between [1, 4294967294].")}function Ce(l,e,i,u){if(!/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(l))throw new Error("strRoomId must be a valid string.")}var O={type:"number",notLessThanZero:!0},Q={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:Te},strRoomId:{type:"string",validate:Ce}}},ee={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Se},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},te={required:!1,type:"object",properties:{videoWidth:O,videoHeight:O,videoBitrate:W(I({},O),{allowEmpty:!1}),videoFramerate:{type:"number",validate(l,e,i,u){if(l<=0||l>30)throw new Error("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(l,e,i,u){if(l<1||l>8)throw new Error("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:O,audioBitrate:{type:"number",validate(l,e,i,u){if(l<32||l>192)throw new Error("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},re={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},Q)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},Q),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(l,e,i,u){if(l<1||l>15)throw new Error("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:O,height:O,locationX:O,locationY:O}}}}};function ie(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},ee),encoding:I({},te),mix:I({},re)},validate(e,i,u,d){var S,_;let{publishMode:c}=e.target,{encoding:m,mix:p}=e;if(c==="publish-mix-stream-to-cdn"){if(!m||!p)throw new Error("Invalid parameter mix & encoding, the value must be not empty.");if(p&&p.videoLayoutList){let D=0,A=0,U=[];if(p.videoLayoutList.forEach((P,F)=>{U.push(P.fixedVideoUser.userId),P.width+P.locationX>D&&(D=P.width+P.locationX),P.height+P.locationY>A&&(A=P.height+P.locationY)}),U.indexOf(l.room.userId)<0)throw new Error("Invalid parameter mix -> videoLayoutList, the value must be include self.");let E=(S=m==null?void 0:m.videoWidth)!=null?S:640,R=(_=m==null?void 0:m.videoHeight)!=null?_:480;if(E<D||R<A)throw new Error("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}}function oe(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},ee),encoding:I({},te),mix:I({},re)}}}function ae(l){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var G=0,k=class{constructor(e){this.core=e;b(this,"_mixTranscodeManager");b(this,"_publishCDNManager");b(this,"_core");b(this,"cdnLog");b(this,"_modeOptions");b(this,"seq");G=G+1,this.seq=G,this.cdnLog=e.log.createChild({id:`${this.getAlias()}${G}`}),this._core=e,this.cdnLog.info("CDNStreaming created"),this._modeOptions=new Map,this._mixTranscodeManager=new y(e,this.cdnLog),this._publishCDNManager=new L(e,this.cdnLog)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return ie(this._core);case"update":return oe(this._core);case"stop":return ae(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this.cdnLog.info(`Plugin CDNStreaming start: ${JSON.stringify(e)}`),this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){this.cdnLog.info(`Plugin CDNStreaming update: ${JSON.stringify(e)}`);let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(this.cdnLog.info(`Plugin CDNStreaming stop: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this.cdnLog.info(`Plugin CDNStreaming doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};b(k,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var tt=k;export{k as CDNStreaming,N as PublishMode,K as TRTCStreamType,tt as default};
1
+ var ue=Object.create;var V=Object.defineProperty,de=Object.defineProperties,me=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,ce=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,he=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var H=(m,e,i)=>e in m?V(m,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):m[e]=i,I=(m,e)=>{for(var i in e||(e={}))W.call(e,i)&&H(m,i,e[i]);if(X)for(var i of X(e))pe.call(e,i)&&H(m,i,e[i]);return m},z=(m,e)=>de(m,le(e));var ge=(m,e)=>()=>(e||m((e={exports:{}}).exports,e),e.exports);var Se=(m,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of ce(e))!W.call(m,d)&&d!==i&&V(m,d,{get:()=>e[d],enumerable:!(u=me(e,d))||u.enumerable});return m};var j=(m,e,i)=>(i=m!=null?ue(he(m)):{},Se(e||!m||!m.__esModule?V(i,"default",{value:m,enumerable:!0}):i,m));var S=(m,e,i)=>(H(m,typeof e!="symbol"?e+"":e,i),i);var K=ge((Y,w)=>{(function(m){"use strict";function e(t,c){var r=(t&65535)+(c&65535),g=(t>>16)+(c>>16)+(r>>16);return g<<16|r&65535}function i(t,c){return t<<c|t>>>32-c}function u(t,c,r,g,C,T){return e(i(e(e(c,t),e(g,T)),C),r)}function d(t,c,r,g,C,T,f){return u(c&r|~c&g,t,c,C,T,f)}function h(t,c,r,g,C,T,f){return u(c&g|r&~g,t,c,C,T,f)}function l(t,c,r,g,C,T,f){return u(c^r^g,t,c,C,T,f)}function p(t,c,r,g,C,T,f){return u(r^(c|~g),t,c,C,T,f)}function b(t,c){t[c>>5]|=128<<c%32,t[(c+64>>>9<<4)+14]=c;var r,g,C,T,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,C=a,T=s,f=n,o=d(o,a,s,n,t[r],7,-680876936),n=d(n,o,a,s,t[r+1],12,-389564586),s=d(s,n,o,a,t[r+2],17,606105819),a=d(a,s,n,o,t[r+3],22,-1044525330),o=d(o,a,s,n,t[r+4],7,-176418897),n=d(n,o,a,s,t[r+5],12,1200080426),s=d(s,n,o,a,t[r+6],17,-1473231341),a=d(a,s,n,o,t[r+7],22,-45705983),o=d(o,a,s,n,t[r+8],7,1770035416),n=d(n,o,a,s,t[r+9],12,-1958414417),s=d(s,n,o,a,t[r+10],17,-42063),a=d(a,s,n,o,t[r+11],22,-1990404162),o=d(o,a,s,n,t[r+12],7,1804603682),n=d(n,o,a,s,t[r+13],12,-40341101),s=d(s,n,o,a,t[r+14],17,-1502002290),a=d(a,s,n,o,t[r+15],22,1236535329),o=h(o,a,s,n,t[r+1],5,-165796510),n=h(n,o,a,s,t[r+6],9,-1069501632),s=h(s,n,o,a,t[r+11],14,643717713),a=h(a,s,n,o,t[r],20,-373897302),o=h(o,a,s,n,t[r+5],5,-701558691),n=h(n,o,a,s,t[r+10],9,38016083),s=h(s,n,o,a,t[r+15],14,-660478335),a=h(a,s,n,o,t[r+4],20,-405537848),o=h(o,a,s,n,t[r+9],5,568446438),n=h(n,o,a,s,t[r+14],9,-1019803690),s=h(s,n,o,a,t[r+3],14,-187363961),a=h(a,s,n,o,t[r+8],20,1163531501),o=h(o,a,s,n,t[r+13],5,-1444681467),n=h(n,o,a,s,t[r+2],9,-51403784),s=h(s,n,o,a,t[r+7],14,1735328473),a=h(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,C),s=e(s,T),n=e(n,f);return[o,a,s,n]}function _(t){var c,r="",g=t.length*32;for(c=0;c<g;c+=8)r+=String.fromCharCode(t[c>>5]>>>c%32&255);return r}function D(t){var c,r=[];for(r[(t.length>>2)-1]=void 0,c=0;c<r.length;c+=1)r[c]=0;var g=t.length*8;for(c=0;c<g;c+=8)r[c>>5]|=(t.charCodeAt(c/8)&255)<<c%32;return r}function R(t){return _(b(D(t),t.length*8))}function x(t,c){var r,g=D(t),C=[],T=[],f;for(C[15]=T[15]=void 0,g.length>16&&(g=b(g,t.length*8)),r=0;r<16;r+=1)C[r]=g[r]^909522486,T[r]=g[r]^1549556828;return f=b(C.concat(D(c)),512+c.length*8),_(b(T.concat(f),512+128))}function v(t){var c="0123456789abcdef",r="",g,C;for(C=0;C<t.length;C+=1)g=t.charCodeAt(C),r+=c.charAt(g>>>4&15)+c.charAt(g&15);return r}function y(t){return unescape(encodeURIComponent(t))}function O(t){return R(y(t))}function q(t){return v(O(t))}function J(t,c){return x(y(t),y(c))}function ne(t,c){return v(J(t,c))}function $(t,c,r){return c?r?J(c,t):ne(c,t):r?O(t):q(t)}typeof define=="function"&&define.amd?define(function(){return $}):typeof w=="object"&&w.exports?w.exports=$:m.md5=$})(Y)});var Z=j(K(),1);var M=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(M||{}),F=(i=>(i.Main="main",i.Sub="sub",i))(F||{});var k={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var A=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_paramsForGivenCDN");S(this,"_publishGivenCDNData",null);S(this,"_isPublishingGivenCDN",!1);this._core=e,this._room=e.room,this._log=i,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`[CDNStreaming] startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:d,message:h}=u.data;if(d===0)this._log.info("[CDNStreaming] server success: start given cdn."),this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`[CDNStreaming] server failed: start given cdn errCode: ${d} errMsg: ${h} options: ${JSON.stringify(e)}`),new Error(`[CDNStreaming] server failed: start given cdn errCode: ${d} errMsg: ${h}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info("[CDNStreaming] stopPublishGivenCDN"),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:h}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:d,pushStreamId:h},p=await this._room.sendStopPublishCDN(l,!1),{code:b,message:_}=p.data;if(b===0)this._log.info("[CDNStreaming] server success: stop given cdn."),this.resetGivenCDN();else throw this._log.error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_} data: ${JSON.stringify(l)}`),new Error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var U=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_config",null);S(this,"_data",null);S(this,"_givenCDNManager");this._core=e,this._room=e.room,this._log=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this._log.info(`startMixTranscode: ${JSON.stringify(e)}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),d=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&d!==this._data.outputSessionId&&(this._log.info("[CDNStreaming] streamId changed, auto stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:d,inputParam:i,outputParam:u});let{appId:h,bizId:l,url:p,streamId:b=""}=this._config.target;h&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new A(this._core,this._log)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:h,bizId:l,url:p,streamId:b}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let d={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this._log.info(`[CDNStreaming] doStartMixTranscode: ${JSON.stringify(d)}`);let h=await this._room.sendStartMixTranscode(d),{code:l}=h.data,{message:p}=h.data;if(l===0)this._log.info("[CDNStreaming] server success: start mix"),this._data=d;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this._log.info("[CDNStreaming] stopMixTranscode");try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this._log.info(`[CDNStreaming] doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:d}=i.data;if(u===0)this._log.info("[CDNStreaming] server success: stop mix"),this.reset();else throw this._log.error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${d}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${d}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this._log.info(`[CDNStreaming] handleJoined: ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this._log.info(`[CDNStreaming] handleRoomLeft: ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Z.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:d=[]}=i,h=d.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:k.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=h.findIndex(b=>b.userId===l.userId&&b.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?h[p].inputType=k.IT_AUDIO_VIDEO:h.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:k.IT_PURE_AUDIO})}),h}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:d={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:d.backgroundColor||0,backgroundImg:d.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var G=j(K(),1);var E=class{constructor(e,i){S(this,"_room");S(this,"_core");S(this,"_log");S(this,"_paramsForTencentCDN");S(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this._log=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var d;this._log.info(`[CDNStreaming] handlePublished: mediaType ${e.mediaType}, roomID ${(d=e==null?void 0:e.room)==null?void 0:d.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this._log.info("[CDNStreaming] handleRoomLeft"),this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this._log.info("[CDNStreaming] Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this._log.info("[CDNStreaming] Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),d=I(I({},u),i);this._paramsForTencentCDN.set(e,d)}async startPublishTencentCDN(e){if(this._log.info(`[CDNStreaming] startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),d=this.generatePublishCDNSessionId(e.publishMode),h=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:d,streamId:u,streamType:h};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:b,url:_}=e;if(p&&b&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new A(this._core,this._log),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:b,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let u=6,d=500,h=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:b}=l.data;if(p===0){this._log.info("[CDNStreaming] server success: start tencent cdn"),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&h<u)this._log.warn(`[CDNStreaming] doStartPublishTencentCDN: retry...${h+1}/6, reason: ${b}`),h+=1,await new Promise(_=>setTimeout(_,d));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(b=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`),new Error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`)}}async stopPublishTencentCDN(e){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,G.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this._log.info(`[CDNStreaming] doStopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:d}=u.data,{message:h}=u.data;if(d===0)this._log.info("[CDNStreaming] server success: stop tencent cdn"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else throw d===-102069&&(this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),h=`can not stop in auto relayed-push mode ${h}`),this._log.error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${d} errMsg: ${h}`),new Error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${d} errMsg: ${h}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,G.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,G.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Q=m=>typeof m=="string";function P(m){throw new Error(`[CDNStreaming] options error: ${m}`)}function Ce(m,e,i,u){/^[A-Za-z\d_-]*$/.test(m)||P("Invalid parameter streamId.")}function Te(m,e,i,u){if(Q(m))P("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");else{if(m===void 0)return;/^[1-9]\d*$/.test(String(m))&&m<4294967295||P("roomId must be an integer between [1, 4294967294].")}}function De(m,e,i,u){/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(m)||P("strRoomId must be a valid string.")}var N={type:"number",notLessThanZero:!0},ee={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:Te},strRoomId:{type:"string",validate:De}}},te={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Ce},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},re={required:!1,type:"object",properties:{videoWidth:N,videoHeight:N,videoBitrate:z(I({},N),{allowEmpty:!1}),videoFramerate:{type:"number",validate(m,e,i,u){(m<=0||m>30)&&P("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(m,e,i,u){(m<1||m>8)&&P("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:N,audioBitrate:{type:"number",validate(m,e,i,u){(m<32||m>192)&&P("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},ie={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},ee)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},ee),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(m,e,i,u){(m<1||m>15)&&P("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:N,height:N,locationX:N,locationY:N}}}}};function oe(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)},validate(e,i,u,d){var b,_;let{publishMode:h}=e.target,{encoding:l,mix:p}=e;if(h==="publish-mix-stream-to-cdn"&&((!l||!p)&&P("Invalid parameter mix & encoding, the value must be not empty."),p&&p.videoLayoutList)){let D=0,R=0,x=[];p.videoLayoutList.forEach((O,q)=>{x.push(O.fixedVideoUser.userId),O.width+O.locationX>D&&(D=O.width+O.locationX),O.height+O.locationY>R&&(R=O.height+O.locationY)}),x.indexOf(m.room.userId)<0&&P("Invalid parameter mix -> videoLayoutList, the value must be include self.");let v=(b=l==null?void 0:l.videoWidth)!=null?b:640,y=(_=l==null?void 0:l.videoHeight)!=null?_:480;(v<D||y<R)&&P("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}function ae(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)}}}function se(m){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var L=0,B=class{constructor(e){this.core=e;S(this,"_mixTranscodeManager");S(this,"_publishCDNManager");S(this,"_core");S(this,"_modeOptions");S(this,"seq");S(this,"_log");L=L+1,this.seq=L,this._log=e.log.createChild({id:`${this.getAlias()}${L}`}),this._log.info(`[CDNStreaming] created id=${this.getAlias()}${L}`),this._core=e,this._modeOptions=new Map,this._mixTranscodeManager=new U(e,this._log),this._publishCDNManager=new E(e,this._log)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return oe(this._core);case"update":return ae(this._core);case"stop":return se(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this._log.info(`[CDNStreaming] doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};S(B,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var rt=B;export{B as CDNStreaming,M as PublishMode,F as TRTCStreamType,rt as default};
@@ -1 +1 @@
1
- "use strict";var CDNStreaming=(()=>{var ue=Object.create;var y=Object.defineProperty,de=Object.defineProperties,me=Object.getOwnPropertyDescriptor,le=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols,ce=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var V=(d,e,i)=>e in d?y(d,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):d[e]=i,I=(d,e)=>{for(var i in e||(e={}))X.call(e,i)&&V(d,i,e[i]);if(q)for(var i of q(e))pe.call(e,i)&&V(d,i,e[i]);return d},W=(d,e)=>de(d,le(e));var ge=(d,e)=>()=>(e||d((e={exports:{}}).exports,e),e.exports),be=(d,e)=>{for(var i in e)y(d,i,{get:e[i],enumerable:!0})},z=(d,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of he(e))!X.call(d,m)&&m!==i&&y(d,m,{get:()=>e[m],enumerable:!(u=me(e,m))||u.enumerable});return d};var j=(d,e,i)=>(i=d!=null?ue(ce(d)):{},z(e||!d||!d.__esModule?y(i,"default",{value:d,enumerable:!0}):i,d)),Se=d=>z(y({},"__esModule",{value:!0}),d);var b=(d,e,i)=>(V(d,typeof e!="symbol"?e+"":e,i),i);var K=ge((Y,w)=>{(function(d){"use strict";function e(t,h){var r=(t&65535)+(h&65535),g=(t>>16)+(h>>16)+(r>>16);return g<<16|r&65535}function i(t,h){return t<<h|t>>>32-h}function u(t,h,r,g,T,C){return e(i(e(e(h,t),e(g,C)),T),r)}function m(t,h,r,g,T,C,f){return u(h&r|~h&g,t,h,T,C,f)}function c(t,h,r,g,T,C,f){return u(h&g|r&~g,t,h,T,C,f)}function l(t,h,r,g,T,C,f){return u(h^r^g,t,h,T,C,f)}function p(t,h,r,g,T,C,f){return u(r^(h|~g),t,h,T,C,f)}function S(t,h){t[h>>5]|=128<<h%32,t[(h+64>>>9<<4)+14]=h;var r,g,T,C,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,T=a,C=s,f=n,o=m(o,a,s,n,t[r],7,-680876936),n=m(n,o,a,s,t[r+1],12,-389564586),s=m(s,n,o,a,t[r+2],17,606105819),a=m(a,s,n,o,t[r+3],22,-1044525330),o=m(o,a,s,n,t[r+4],7,-176418897),n=m(n,o,a,s,t[r+5],12,1200080426),s=m(s,n,o,a,t[r+6],17,-1473231341),a=m(a,s,n,o,t[r+7],22,-45705983),o=m(o,a,s,n,t[r+8],7,1770035416),n=m(n,o,a,s,t[r+9],12,-1958414417),s=m(s,n,o,a,t[r+10],17,-42063),a=m(a,s,n,o,t[r+11],22,-1990404162),o=m(o,a,s,n,t[r+12],7,1804603682),n=m(n,o,a,s,t[r+13],12,-40341101),s=m(s,n,o,a,t[r+14],17,-1502002290),a=m(a,s,n,o,t[r+15],22,1236535329),o=c(o,a,s,n,t[r+1],5,-165796510),n=c(n,o,a,s,t[r+6],9,-1069501632),s=c(s,n,o,a,t[r+11],14,643717713),a=c(a,s,n,o,t[r],20,-373897302),o=c(o,a,s,n,t[r+5],5,-701558691),n=c(n,o,a,s,t[r+10],9,38016083),s=c(s,n,o,a,t[r+15],14,-660478335),a=c(a,s,n,o,t[r+4],20,-405537848),o=c(o,a,s,n,t[r+9],5,568446438),n=c(n,o,a,s,t[r+14],9,-1019803690),s=c(s,n,o,a,t[r+3],14,-187363961),a=c(a,s,n,o,t[r+8],20,1163531501),o=c(o,a,s,n,t[r+13],5,-1444681467),n=c(n,o,a,s,t[r+2],9,-51403784),s=c(s,n,o,a,t[r+7],14,1735328473),a=c(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,T),s=e(s,C),n=e(n,f);return[o,a,s,n]}function _(t){var h,r="",g=t.length*32;for(h=0;h<g;h+=8)r+=String.fromCharCode(t[h>>5]>>>h%32&255);return r}function D(t){var h,r=[];for(r[(t.length>>2)-1]=void 0,h=0;h<r.length;h+=1)r[h]=0;var g=t.length*8;for(h=0;h<g;h+=8)r[h>>5]|=(t.charCodeAt(h/8)&255)<<h%32;return r}function A(t){return _(S(D(t),t.length*8))}function x(t,h){var r,g=D(t),T=[],C=[],f;for(T[15]=C[15]=void 0,g.length>16&&(g=S(g,t.length*8)),r=0;r<16;r+=1)T[r]=g[r]^909522486,C[r]=g[r]^1549556828;return f=S(T.concat(D(h)),512+h.length*8),_(S(C.concat(f),512+128))}function v(t){var h="0123456789abcdef",r="",g,T;for(T=0;T<t.length;T+=1)g=t.charCodeAt(T),r+=h.charAt(g>>>4&15)+h.charAt(g&15);return r}function R(t){return unescape(encodeURIComponent(t))}function P(t){return A(R(t))}function F(t){return v(P(t))}function J(t,h){return x(R(t),R(h))}function ne(t,h){return v(J(t,h))}function H(t,h,r){return h?r?J(h,t):ne(h,t):r?P(t):F(t)}typeof define=="function"&&define.amd?define(function(){return H}):typeof w=="object"&&w.exports?w.exports=H:d.md5=H})(Y)});var Ie={};be(Ie,{CDNStreaming:()=>E,PublishMode:()=>M,TRTCStreamType:()=>G,default:()=>fe});var Z=j(K(),1);var M=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(M||{}),G=(i=>(i.Main="main",i.Sub="sub",i))(G||{});var k={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var N=class{constructor(e){b(this,"_room");b(this,"_log");b(this,"_paramsForGivenCDN");b(this,"_publishGivenCDNData",null);b(this,"_isPublishingGivenCDN",!1);this._room=e.room,this._log=e.log,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:m,message:c}=u.data;if(m===0)this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`startPublishGivenCDN failed, errCode: ${m}, errMsg: ${c}`),new Error(`startPublishGivenCDN failed, errCode: ${m} errMsg: ${c}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info(`stopPublishGivenCDN: ${JSON.stringify(this._publishGivenCDNData)}`),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:c}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:c},p=await this._room.sendStopPublishCDN(l,!1),{code:S,message:_}=p.data;if(S===0)this.resetGivenCDN();else throw this._log.error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`),new Error(`stopPublishGivenCDN failed, errCode: ${S} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var L=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_config",null);b(this,"_data",null);b(this,"_givenCDNManager");this._core=e,this._room=e.room,this.cdnLog=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this.cdnLog.info(`startMixTranscode: ${e}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),m=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&m!==this._data.outputSessionId&&(this.cdnLog.info("startMixTranscode() streamId changed, stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:m,inputParam:i,outputParam:u});let{appId:c,bizId:l,url:p,streamId:S=""}=this._config.target;c&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new N(this._core)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:c,bizId:l,url:p,streamId:S}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let m={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this.cdnLog.info(`doStartMixTranscode: ${JSON.stringify(m)}`);let c=await this._room.sendStartMixTranscode(m),{code:l}=c.data,{message:p}=c.data;if(l===0)this._data=m;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this.cdnLog.error(`startMixTranscode failed, errCode: ${l} errMsg: ${p}`),new Error(`startMixTranscode failed, errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this.cdnLog.info(`stopMixTranscode: ${this.isMixing}`);try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this.cdnLog.info(`doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:m}=i.data;if(u===0)this.reset();else throw this.cdnLog.error(`stopMixTranscode failed, errCode: ${u} errMsg: ${m}`),new Error(`stopMixTranscode failed, errCode: ${u} errMsg: ${m}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this.cdnLog.info(`handleJoined() ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Z.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:m=[]}=i,c=m.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:k.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=c.findIndex(S=>S.userId===l.userId&&S.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?c[p].inputType=k.IT_AUDIO_VIDEO:c.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:k.IT_PURE_AUDIO})}),c}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:m={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:m.backgroundColor||0,backgroundImg:m.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var B=j(K(),1);var U=class{constructor(e,i){b(this,"_core");b(this,"_room");b(this,"cdnLog");b(this,"_paramsForTencentCDN");b(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this.cdnLog=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var m;this.cdnLog.info(`handlePublished: mediaType ${e.mediaType}, roomID ${(m=e==null?void 0:e.room)==null?void 0:m.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this.cdnLog.info("Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this.cdnLog.info("Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),m=I(I({},u),i);this._paramsForTencentCDN.set(e,m)}async startPublishTencentCDN(e){if(this.cdnLog.info(`startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),m=this.generatePublishCDNSessionId(e.publishMode),c=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:m,streamId:u,streamType:c};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:S,url:_}=e;if(p&&S&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new N(this._core),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:S,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this.cdnLog.info(`doStartPublishTencentCDN: ${JSON.stringify(e)}`);try{let c=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:S}=l.data;if(p===0){this.cdnLog.info(`doStartPublishTencentCDN: success ${JSON.stringify(l)}`),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&c<6)this.cdnLog.warn(`doStartPublishTencentCDN: retry...${c+1}/6, reason: ${S}`),c+=1,await new Promise(_=>setTimeout(_,500));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(S=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),new Error(`startPublishTencentCDN failed, errCode: ${p} errMsg: ${S}`)}}catch(u){throw this.cdnLog.error(`startPublishTencentCDN failed, error: ${u}`),this.changeDataStatus(i,{isPublished:!1}),u}}async stopPublishTencentCDN(e){let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,B.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this.cdnLog.info(`stopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:m,message:c}=u.data;if(m===0)this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else if(m===-102069)this.cdnLog.error("stopPublishTencentCDN failed, can not stopPublishTencentCDN in auto relayed-push mode"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN);else throw this.cdnLog.error(`stopPublishTencentCDN failed, errCode: ${m} errMsg: ${c}`),new Error(`stopPublishTencentCDN failed, errCode: ${m} errMsg: ${c}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,B.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,B.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var Q=d=>typeof d=="string";function Ce(d,e,i,u){if(!/^[A-Za-z\d_-]*$/.test(d))throw new Error("Invalid parameter streamId.")}function De(d,e,i,u){if(Q(d))throw new Error("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");if(d===void 0)return;if(!(/^[1-9]\d*$/.test(String(d))&&d<4294967295))throw new Error("roomId must be an integer between [1, 4294967294].")}function _e(d,e,i,u){if(!/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(d))throw new Error("strRoomId must be a valid string.")}var O={type:"number",notLessThanZero:!0},ee={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:De},strRoomId:{type:"string",validate:_e}}},te={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:Ce},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},re={required:!1,type:"object",properties:{videoWidth:O,videoHeight:O,videoBitrate:W(I({},O),{allowEmpty:!1}),videoFramerate:{type:"number",validate(d,e,i,u){if(d<=0||d>30)throw new Error("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(d,e,i,u){if(d<1||d>8)throw new Error("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:O,audioBitrate:{type:"number",validate(d,e,i,u){if(d<32||d>192)throw new Error("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},ie={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},ee)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},ee),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(d,e,i,u){if(d<1||d>15)throw new Error("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:O,height:O,locationX:O,locationY:O}}}}};function oe(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)},validate(e,i,u,m){var S,_;let{publishMode:c}=e.target,{encoding:l,mix:p}=e;if(c==="publish-mix-stream-to-cdn"){if(!l||!p)throw new Error("Invalid parameter mix & encoding, the value must be not empty.");if(p&&p.videoLayoutList){let D=0,A=0,x=[];if(p.videoLayoutList.forEach((P,F)=>{x.push(P.fixedVideoUser.userId),P.width+P.locationX>D&&(D=P.width+P.locationX),P.height+P.locationY>A&&(A=P.height+P.locationY)}),x.indexOf(d.room.userId)<0)throw new Error("Invalid parameter mix -> videoLayoutList, the value must be include self.");let v=(S=l==null?void 0:l.videoWidth)!=null?S:640,R=(_=l==null?void 0:l.videoHeight)!=null?_:480;if(v<D||R<A)throw new Error("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}}function ae(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},te),encoding:I({},re),mix:I({},ie)}}}function se(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var $=0,E=class{constructor(e){this.core=e;b(this,"_mixTranscodeManager");b(this,"_publishCDNManager");b(this,"_core");b(this,"cdnLog");b(this,"_modeOptions");b(this,"seq");$=$+1,this.seq=$,this.cdnLog=e.log.createChild({id:`${this.getAlias()}${$}`}),this._core=e,this.cdnLog.info("CDNStreaming created"),this._modeOptions=new Map,this._mixTranscodeManager=new L(e,this.cdnLog),this._publishCDNManager=new U(e,this.cdnLog)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return oe(this._core);case"update":return ae(this._core);case"stop":return se(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this.cdnLog.info(`Plugin CDNStreaming start: ${JSON.stringify(e)}`),this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){this.cdnLog.info(`Plugin CDNStreaming update: ${JSON.stringify(e)}`);let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(this.cdnLog.info(`Plugin CDNStreaming stop: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this.cdnLog.info(`Plugin CDNStreaming doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};b(E,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var fe=E;return Se(Ie);})().default;
1
+ "use strict";var CDNStreaming=(()=>{var de=Object.create;var U=Object.defineProperty,me=Object.defineProperties,le=Object.getOwnPropertyDescriptor,ce=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,pe=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var K=(d,e,i)=>e in d?U(d,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):d[e]=i,I=(d,e)=>{for(var i in e||(e={}))W.call(e,i)&&K(d,i,e[i]);if(X)for(var i of X(e))ge.call(e,i)&&K(d,i,e[i]);return d},z=(d,e)=>me(d,ce(e));var Se=(d,e)=>()=>(e||d((e={exports:{}}).exports,e),e.exports),be=(d,e)=>{for(var i in e)U(d,i,{get:e[i],enumerable:!0})},j=(d,e,i,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of he(e))!W.call(d,m)&&m!==i&&U(d,m,{get:()=>e[m],enumerable:!(u=le(e,m))||u.enumerable});return d};var Y=(d,e,i)=>(i=d!=null?de(pe(d)):{},j(e||!d||!d.__esModule?U(i,"default",{value:d,enumerable:!0}):i,d)),Ce=d=>j(U({},"__esModule",{value:!0}),d);var S=(d,e,i)=>(K(d,typeof e!="symbol"?e+"":e,i),i);var F=Se((Z,G)=>{(function(d){"use strict";function e(t,c){var r=(t&65535)+(c&65535),g=(t>>16)+(c>>16)+(r>>16);return g<<16|r&65535}function i(t,c){return t<<c|t>>>32-c}function u(t,c,r,g,C,T){return e(i(e(e(c,t),e(g,T)),C),r)}function m(t,c,r,g,C,T,f){return u(c&r|~c&g,t,c,C,T,f)}function h(t,c,r,g,C,T,f){return u(c&g|r&~g,t,c,C,T,f)}function l(t,c,r,g,C,T,f){return u(c^r^g,t,c,C,T,f)}function p(t,c,r,g,C,T,f){return u(r^(c|~g),t,c,C,T,f)}function b(t,c){t[c>>5]|=128<<c%32,t[(c+64>>>9<<4)+14]=c;var r,g,C,T,f,o=1732584193,a=-271733879,s=-1732584194,n=271733878;for(r=0;r<t.length;r+=16)g=o,C=a,T=s,f=n,o=m(o,a,s,n,t[r],7,-680876936),n=m(n,o,a,s,t[r+1],12,-389564586),s=m(s,n,o,a,t[r+2],17,606105819),a=m(a,s,n,o,t[r+3],22,-1044525330),o=m(o,a,s,n,t[r+4],7,-176418897),n=m(n,o,a,s,t[r+5],12,1200080426),s=m(s,n,o,a,t[r+6],17,-1473231341),a=m(a,s,n,o,t[r+7],22,-45705983),o=m(o,a,s,n,t[r+8],7,1770035416),n=m(n,o,a,s,t[r+9],12,-1958414417),s=m(s,n,o,a,t[r+10],17,-42063),a=m(a,s,n,o,t[r+11],22,-1990404162),o=m(o,a,s,n,t[r+12],7,1804603682),n=m(n,o,a,s,t[r+13],12,-40341101),s=m(s,n,o,a,t[r+14],17,-1502002290),a=m(a,s,n,o,t[r+15],22,1236535329),o=h(o,a,s,n,t[r+1],5,-165796510),n=h(n,o,a,s,t[r+6],9,-1069501632),s=h(s,n,o,a,t[r+11],14,643717713),a=h(a,s,n,o,t[r],20,-373897302),o=h(o,a,s,n,t[r+5],5,-701558691),n=h(n,o,a,s,t[r+10],9,38016083),s=h(s,n,o,a,t[r+15],14,-660478335),a=h(a,s,n,o,t[r+4],20,-405537848),o=h(o,a,s,n,t[r+9],5,568446438),n=h(n,o,a,s,t[r+14],9,-1019803690),s=h(s,n,o,a,t[r+3],14,-187363961),a=h(a,s,n,o,t[r+8],20,1163531501),o=h(o,a,s,n,t[r+13],5,-1444681467),n=h(n,o,a,s,t[r+2],9,-51403784),s=h(s,n,o,a,t[r+7],14,1735328473),a=h(a,s,n,o,t[r+12],20,-1926607734),o=l(o,a,s,n,t[r+5],4,-378558),n=l(n,o,a,s,t[r+8],11,-2022574463),s=l(s,n,o,a,t[r+11],16,1839030562),a=l(a,s,n,o,t[r+14],23,-35309556),o=l(o,a,s,n,t[r+1],4,-1530992060),n=l(n,o,a,s,t[r+4],11,1272893353),s=l(s,n,o,a,t[r+7],16,-155497632),a=l(a,s,n,o,t[r+10],23,-1094730640),o=l(o,a,s,n,t[r+13],4,681279174),n=l(n,o,a,s,t[r],11,-358537222),s=l(s,n,o,a,t[r+3],16,-722521979),a=l(a,s,n,o,t[r+6],23,76029189),o=l(o,a,s,n,t[r+9],4,-640364487),n=l(n,o,a,s,t[r+12],11,-421815835),s=l(s,n,o,a,t[r+15],16,530742520),a=l(a,s,n,o,t[r+2],23,-995338651),o=p(o,a,s,n,t[r],6,-198630844),n=p(n,o,a,s,t[r+7],10,1126891415),s=p(s,n,o,a,t[r+14],15,-1416354905),a=p(a,s,n,o,t[r+5],21,-57434055),o=p(o,a,s,n,t[r+12],6,1700485571),n=p(n,o,a,s,t[r+3],10,-1894986606),s=p(s,n,o,a,t[r+10],15,-1051523),a=p(a,s,n,o,t[r+1],21,-2054922799),o=p(o,a,s,n,t[r+8],6,1873313359),n=p(n,o,a,s,t[r+15],10,-30611744),s=p(s,n,o,a,t[r+6],15,-1560198380),a=p(a,s,n,o,t[r+13],21,1309151649),o=p(o,a,s,n,t[r+4],6,-145523070),n=p(n,o,a,s,t[r+11],10,-1120210379),s=p(s,n,o,a,t[r+2],15,718787259),a=p(a,s,n,o,t[r+9],21,-343485551),o=e(o,g),a=e(a,C),s=e(s,T),n=e(n,f);return[o,a,s,n]}function _(t){var c,r="",g=t.length*32;for(c=0;c<g;c+=8)r+=String.fromCharCode(t[c>>5]>>>c%32&255);return r}function D(t){var c,r=[];for(r[(t.length>>2)-1]=void 0,c=0;c<r.length;c+=1)r[c]=0;var g=t.length*8;for(c=0;c<g;c+=8)r[c>>5]|=(t.charCodeAt(c/8)&255)<<c%32;return r}function R(t){return _(b(D(t),t.length*8))}function w(t,c){var r,g=D(t),C=[],T=[],f;for(C[15]=T[15]=void 0,g.length>16&&(g=b(g,t.length*8)),r=0;r<16;r+=1)C[r]=g[r]^909522486,T[r]=g[r]^1549556828;return f=b(C.concat(D(c)),512+c.length*8),_(b(T.concat(f),512+128))}function k(t){var c="0123456789abcdef",r="",g,C;for(C=0;C<t.length;C+=1)g=t.charCodeAt(C),r+=c.charAt(g>>>4&15)+c.charAt(g&15);return r}function y(t){return unescape(encodeURIComponent(t))}function O(t){return R(y(t))}function q(t){return k(O(t))}function J(t,c){return w(y(t),y(c))}function ue(t,c){return k(J(t,c))}function V(t,c,r){return c?r?J(c,t):ue(c,t):r?O(t):q(t)}typeof define=="function"&&define.amd?define(function(){return V}):typeof G=="object"&&G.exports?G.exports=V:d.md5=V})(Z)});var Oe={};be(Oe,{CDNStreaming:()=>v,PublishMode:()=>A,TRTCStreamType:()=>B,default:()=>Ie});var Q=Y(F(),1);var A=(u=>(u.PublishMainStreamToCDN="publish-main-stream-to-cdn",u.PublishSubStreamToCDN="publish-sub-stream-to-cdn",u.PublishMixStreamToCDN="publish-mix-stream-to-cdn",u))(A||{}),B=(i=>(i.Main="main",i.Sub="sub",i))(B||{});var $={IT_AUDIO_VIDEO:0,IT_PICTURE:2,IT_CANVAS:3,IT_PURE_AUDIO:4,IT_PURE_VIDEO:5};var M=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_paramsForGivenCDN");S(this,"_publishGivenCDNData",null);S(this,"_isPublishingGivenCDN",!1);this._core=e,this._room=e.room,this._log=i,this._paramsForGivenCDN=new Map([["publish-main-stream-to-cdn",null],["publish-sub-stream-to-cdn",null],["publish-mix-stream-to-cdn",null]])}async startPublishGivenCDN(e){this._log.info(`[CDNStreaming] startPublishGivenCDN() ${JSON.stringify(e)}`),this._paramsForGivenCDN.set(e.publishMode,e);let i={pushRequestTime:Date.now(),pushAppId:e.appId,pushBizId:e.bizId,pushCdnUrl:e.url,pushStreamType:this.convertStreamType(e==null?void 0:e.publishMode),pushStreamId:e.streamId};this._publishGivenCDNData=i;try{this._isPublishingGivenCDN&&await this.stopPublishGivenCDN();let u=await this._room.sendStartPublishCDN(i,!1),{code:m,message:h}=u.data;if(m===0)this._log.info("[CDNStreaming] server success: start given cdn."),this._isPublishingGivenCDN=!0;else throw this.resetGivenCDN(),this._log.error(`[CDNStreaming] server failed: start given cdn errCode: ${m} errMsg: ${h} options: ${JSON.stringify(e)}`),new Error(`[CDNStreaming] server failed: start given cdn errCode: ${m} errMsg: ${h}`)}catch(u){throw this.resetGivenCDN(),u}}async stopPublishGivenCDN(){if(this._log.info("[CDNStreaming] stopPublishGivenCDN"),!this._isPublishingGivenCDN||!this._publishGivenCDNData){this.resetGivenCDN();return}let{pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:h}=this._publishGivenCDNData,l={pushRequestTime:Date.now(),pushAppId:e,pushBizId:i,pushCdnUrl:u,pushStreamType:m,pushStreamId:h},p=await this._room.sendStopPublishCDN(l,!1),{code:b,message:_}=p.data;if(b===0)this._log.info("[CDNStreaming] server success: stop given cdn."),this.resetGivenCDN();else throw this._log.error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_} data: ${JSON.stringify(l)}`),new Error(`[CDNStreaming] server failed: stop given cdn errCode: ${b} errMsg: ${_}`)}resetGivenCDN(){this._publishGivenCDNData=null,this._isPublishingGivenCDN=!1}convertStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}};var E=class{constructor(e,i){S(this,"_core");S(this,"_room");S(this,"_log");S(this,"_config",null);S(this,"_data",null);S(this,"_givenCDNManager");this._core=e,this._room=e.room,this._log=i,this.reset()}get isMixing(){return!!this._data}get isStarted(){return!!this._config}get hasCustomCDN(){var e,i,u;return((e=this._config)==null?void 0:e.target.appId)&&((i=this._config)==null?void 0:i.target.bizId)&&((u=this._config)==null?void 0:u.target.url)}async startMixTranscode(e){if(this._log.info(`startMixTranscode: ${JSON.stringify(e)}`),this._config=e,this.installEvents(),!!this._core.room.isJoined)try{let i=this.getInputParam(e),u=this.getOutputParam(e),m=this.getOutputSessionId({config:e,roomId:this._room.roomId,userId:this._room.userId});this.isMixing&&this._data&&m!==this._data.outputSessionId&&(this._log.info("[CDNStreaming] streamId changed, auto stop mixing before start"),await this.doStopMixTranscode()),await this.doStartMixTranscode({outputSessionId:m,inputParam:i,outputParam:u});let{appId:h,bizId:l,url:p,streamId:b=""}=this._config.target;h&&l&&p&&(this._givenCDNManager||(this._givenCDNManager=new M(this._core,this._log)),await this._givenCDNManager.startPublishGivenCDN({publishMode:e.target.publishMode,appId:h,bizId:l,url:p,streamId:b}))}catch(i){throw this.reset(),i}}async doStartMixTranscode({outputSessionId:e,inputParam:i,outputParam:u}){let m={roomId:String(this._room.roomId),mcuRequestTime:Date.now(),outputSessionId:e,inputParam:i,outputParam:u};this._log.info(`[CDNStreaming] doStartMixTranscode: ${JSON.stringify(m)}`);let h=await this._room.sendStartMixTranscode(m),{code:l}=h.data,{message:p}=h.data;if(l===0)this._log.info("[CDNStreaming] server success: start mix"),this._data=m;else throw l===-102083&&(p=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${l} errMsg: ${p}`)}async stopMixTranscode(){this._log.info("[CDNStreaming] stopMixTranscode");try{this.isStarted&&this.isMixing&&(await this.doStopMixTranscode(),this._config&&this.hasCustomCDN&&this._givenCDNManager&&await this._givenCDNManager.stopPublishGivenCDN())}catch(e){throw e}this.reset()}async doStopMixTranscode(){let e={mcuRequestTime:Date.now(),outputSessionId:this._data.outputSessionId,streamType:this._data.outputParam.streamType};this._log.info(`[CDNStreaming] doStopMixTranscode: ${JSON.stringify(e)}`);let i=await this._room.sendStopMixTranscode(e),{code:u,message:m}=i.data;if(u===0)this._log.info("[CDNStreaming] server success: stop mix"),this.reset();else throw this._log.error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${m}`),new Error(`[CDNStreaming] server failed: start mix errCode: ${u} errMsg: ${m}`)}reset(){this._config=null,this._data=null,this.uninstallEvents()}installEvents(){this._core.room.on("joined",this.handleRoomJoined,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.room.off("joined",this.handleRoomJoined,this),this._core.room.off("left",this.handleRoomLeft,this)}async handleRoomJoined(){this._log.info(`[CDNStreaming] handleJoined: ${JSON.stringify(this._config)}`),this.isStarted&&this._config&&await this.startMixTranscode(this._config)}async handleRoomLeft(){this._log.info(`[CDNStreaming] handleRoomLeft: ${JSON.stringify(this._config)}`),this._data=null}getOutputSessionId({config:e,userId:i,roomId:u}){return this._core.utils.isString(e.target.streamId)&&e.target.streamId.length>0?e.target.streamId:(0,Q.default)(`${u}_${i}_main`)}getStringRoomId(e,i){return e?String(e):i}getInputParam(e){let{mix:i={}}=e,{audioMixUserList:u=[],videoLayoutList:m=[]}=i,h=m.map(l=>({userId:l.fixedVideoUser.userId,roomId:this.getStringRoomId(l.fixedVideoUser.roomId,l.fixedVideoUser.strRoomId)||this._core.room.roomId,width:l.width||0,height:l.height||0,locationX:l.locationX||0,locationY:l.locationY||0,zOrder:l.zOrder||1,streamType:l.fixedVideoStreamType==="sub"?1:0,inputType:$.IT_PURE_VIDEO,renderMode:l.fillMode||0}));return u.forEach(l=>{let p=h.findIndex(b=>b.userId===l.userId&&b.room===this.getStringRoomId(l.roomId,l.strRoomId));p!==-1?h[p].inputType=$.IT_AUDIO_VIDEO:h.push({userId:l.userId,roomId:l.roomId||l.strRoomId,inputType:$.IT_PURE_AUDIO})}),h}getOutputParam(e){let i=e.target.streamId||"",{encoding:u={},mix:m={}}=e;return{streamId:i,streamType:i.length>0?1:0,width:this._core.utils.isUndefined(u.videoWidth)?640:u.videoWidth,height:this._core.utils.isUndefined(u.videoHeight)?480:u.videoHeight,videoBps:u.videoBitrate||0,fps:u.videoFramerate||15,gop:u.videoGOP||2,audioSampleRate:u.audioSampleRate||48e3,audioBps:u.audioBitrate||64,audioChannels:u.audioChannels||1,backgroundColor:m.backgroundColor||0,backgroundImg:m.backgroundImage||"",extraInfo:"",videoCodec:2,audioCodec:0}}};var H=Y(F(),1);var L=class{constructor(e,i){S(this,"_room");S(this,"_core");S(this,"_log");S(this,"_paramsForTencentCDN");S(this,"_initParamsForTencentCDN",{isPublished:!1,isStarted:!1});this._core=e,this._room=e.room,this._log=i,this._paramsForTencentCDN=new Map([["publish-main-stream-to-cdn",this._initParamsForTencentCDN],["publish-sub-stream-to-cdn",this._initParamsForTencentCDN]])}installEvents(){this._core.innerEmitter.on("104",this.handlePublished,this),this._core.room.on("left",this.handleRoomLeft,this)}uninstallEvents(){this._core.innerEmitter.off("104",this.handlePublished,this),this._core.room.off("left",this.handleRoomLeft,this)}async handlePublished({track:e}){var m;this._log.info(`[CDNStreaming] handlePublished: mediaType ${e.mediaType}, roomID ${(m=e==null?void 0:e.room)==null?void 0:m.roomId}`);let i=e.mediaType===4?"publish-main-stream-to-cdn":"publish-sub-stream-to-cdn",u=this._paramsForTencentCDN.get(i)||null;u!=null&&u.target&&u.isStarted&&await this.startPublishTencentCDN(u.target)}async handleRoomLeft(){this._log.info("[CDNStreaming] handleRoomLeft"),this.changeDataStatus("publish-main-stream-to-cdn",{isPublished:!1}),this.changeDataStatus("publish-sub-stream-to-cdn",{isPublished:!1})}isStreamPublished(e){return e==="publish-main-stream-to-cdn"&&!this._room.isMainStreamPublished?(this._log.info("[CDNStreaming] Main stream has not already published, will auto reStart after published."),!1):e==="publish-sub-stream-to-cdn"&&!this._room.isAuxStreamPublished?(this._log.info("[CDNStreaming] Sub has not already published, will auto reStart after published."),!1):!0}changeDataStatus(e,i){let u=this._paramsForTencentCDN.get(e),m=I(I({},u),i);this._paramsForTencentCDN.set(e,m)}async startPublishTencentCDN(e){if(this._log.info(`[CDNStreaming] startPublishTencentCDN ${JSON.stringify(e)}`),this.installEvents(),this.changeDataStatus(e.publishMode,{target:e,isStarted:!0}),!this.isStreamPublished(e.publishMode))return;let i=e.streamId||"",u=this.generatePublishCDNStreamId(i,e.publishMode),m=this.generatePublishCDNSessionId(e.publishMode),h=e.publishMode==="publish-sub-stream-to-cdn"?1:0,l={requestTime:Date.now(),sessionId:m,streamId:u,streamType:h};await this.doStartPublishTencentCDN(l,e.publishMode);let{appId:p,bizId:b,url:_}=e;if(p&&b&&_){let D=this._paramsForTencentCDN.get(e.publishMode)||this._initParamsForTencentCDN;D!=null&&D.givenCDNManager||(D.givenCDNManager=new M(this._core,this._log),this._paramsForTencentCDN.set(e.publishMode,D)),await D.givenCDNManager.startPublishGivenCDN({publishMode:e.publishMode,appId:p,bizId:b,url:_,streamId:u})}}async doStartPublishTencentCDN(e,i){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let u=6,m=500,h=0;for(;;){let l=await this._room.sendStartPublishCDN(e,!0),{code:p}=l.data,{message:b}=l.data;if(p===0){this._log.info("[CDNStreaming] server success: start tencent cdn"),this.changeDataStatus(i,{isPublished:!0});break}else if(p===-10006&&h<u)this._log.warn(`[CDNStreaming] doStartPublishTencentCDN: retry...${h+1}/6, reason: ${b}`),h+=1,await new Promise(_=>setTimeout(_,m));else throw this.changeDataStatus(i,{isPublished:!1}),p===-102083&&(b=`Please enable relayed-push in ${this._core.constants.CLOUD_CONSOLE_URL} and try later, refer to ${this._core.constants.DOC_URL}tutorial-26-advanced-publish-cdn-stream.html`),this._log.error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`),new Error(`[CDNStreaming] server failed: start tencent cdn errCode: ${p} errMsg: ${b}`)}}async stopPublishTencentCDN(e){this._log.info(`[CDNStreaming] doStartPublishTencentCDN: ${JSON.stringify(e)}`);let i=this._paramsForTencentCDN.get(e)||this._initParamsForTencentCDN;if(i.isPublished){let{target:u}=i;u!=null&&u.bizId&&u.appId&&u.url&&(i!=null&&i.givenCDNManager)&&await(i==null?void 0:i.givenCDNManager.stopPublishGivenCDN()),await this.doStopPublishTencentCDN(e)}this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}async doStopPublishTencentCDN(e){let i={requestTime:Date.now(),sessionId:(0,H.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)};this._log.info(`[CDNStreaming] doStopPublishTencentCDN: ${JSON.stringify(i)}`);let u=await this._room.sendStopPublishCDN(i,!0),{code:m}=u.data,{message:h}=u.data;if(m===0)this._log.info("[CDNStreaming] server success: stop tencent cdn"),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),this.reset(e);else throw m===-102069&&(this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN),h=`can not stop in auto relayed-push mode ${h}`),this._log.error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${m} errMsg: ${h}`),new Error(`[CDNStreaming] server failed: stop tencent cdn errCode: ${m} errMsg: ${h}`)}reset(e){this.uninstallEvents(),this._paramsForTencentCDN.set(e,this._initParamsForTencentCDN)}generatePublishCDNStreamId(e,i){if(e===""){let u=`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(i)}`;return/^[A-Za-z\d_-]*$/.test(u)||(u=(0,H.default)(u)),`${this._room.sdkAppId}_${u}`}return e}convertPublishModeToStreamType(e){return e==="publish-main-stream-to-cdn"?"main":"aux"}generatePublishCDNSessionId(e){return(0,H.default)(`${this._room.roomId}_${this._room.userId}_${this.convertPublishModeToStreamType(e)}`)}};var ee=d=>typeof d=="string";function P(d){throw new Error(`[CDNStreaming] options error: ${d}`)}function De(d,e,i,u){/^[A-Za-z\d_-]*$/.test(d)||P("Invalid parameter streamId.")}function _e(d,e,i,u){if(ee(d))P("roomId must be an integer but go a string, use 'parseInt' to convert it or use 'strRoomId' instead.");else{if(d===void 0)return;/^[1-9]\d*$/.test(String(d))&&d<4294967295||P("roomId must be an integer between [1, 4294967294].")}}function fe(d,e,i,u){/^[A-Za-z\d\s!#$%&()+\-:;<=.>?@[\]^_{}|~,]{1,64}$/.test(d)||P("strRoomId must be a valid string.")}var N={type:"number",notLessThanZero:!0},te={type:"object",required:!0,properties:{userId:{required:!0,type:"string"},roomId:{type:["string","number"],validate:_e},strRoomId:{type:"string",validate:fe}}},re={required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]},streamId:{required:!1,type:"string",validate:De},appId:{type:"number",allowEmpty:!1},bizId:{type:"number",allowEmpty:!1},url:{type:"string",allowEmpty:!1}}},ie={required:!1,type:"object",properties:{videoWidth:N,videoHeight:N,videoBitrate:z(I({},N),{allowEmpty:!1}),videoFramerate:{type:"number",validate(d,e,i,u){(d<=0||d>30)&&P("Invalid parameter mixConfig -> videoFramerate, the value must be between (0, 30].")}},videoGOP:{type:"number",validate(d,e,i,u){(d<1||d>8)&&P("Invalid parameter mixConfig -> videoGOP, the value must be between [1, 8].")}},audioSampleRate:N,audioBitrate:{type:"number",validate(d,e,i,u){(d<32||d>192)&&P("Invalid parameter mixConfig -> audioBitrate, the value must be between [32, 192].")}},audioChannels:{type:"number",values:[1,2]}}},oe={required:!1,type:"object",properties:{backgroundColor:{type:"number"},backgroundImage:{type:"string"},audioMixUserList:{type:"array",arrayItem:I({},te)},videoLayoutList:{type:"array",required:!0,arrayItem:{type:"object",properties:{fixedVideoUser:I({},te),fixedVideoStreamType:{type:"string",required:!0,values:["main","sub"]},fillMode:{type:"number",values:[0,1,2,4]},zOrder:{type:"number",required:!0,validate(d,e,i,u){(d<1||d>15)&&P("Invalid parameter mix -> videoLayoutList -> zOrder, the value must be between [1, 15].")}},width:N,height:N,locationX:N,locationY:N}}}}};function ae(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},re),encoding:I({},ie),mix:I({},oe)},validate(e,i,u,m){var b,_;let{publishMode:h}=e.target,{encoding:l,mix:p}=e;if(h==="publish-mix-stream-to-cdn"&&((!l||!p)&&P("Invalid parameter mix & encoding, the value must be not empty."),p&&p.videoLayoutList)){let D=0,R=0,w=[];p.videoLayoutList.forEach((O,q)=>{w.push(O.fixedVideoUser.userId),O.width+O.locationX>D&&(D=O.width+O.locationX),O.height+O.locationY>R&&(R=O.height+O.locationY)}),w.indexOf(d.room.userId)<0&&P("Invalid parameter mix -> videoLayoutList, the value must be include self.");let k=(b=l==null?void 0:l.videoWidth)!=null?b:640,y=(_=l==null?void 0:l.videoHeight)!=null?_:480;(k<D||y<R)&&P("Invalid parameter encoding, the width and height of the mixed video must encompass all the mixed-in video streams.")}}}}function se(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:I({},re),encoding:I({},ie),mix:I({},oe)}}}function ne(d){return{name:"CDNStreamingOptions",type:"object",required:!0,allowEmpty:!1,properties:{target:{required:!0,properties:{publishMode:{required:!0,values:["publish-main-stream-to-cdn","publish-mix-stream-to-cdn","publish-sub-stream-to-cdn"]}}}}}}var x=0,v=class{constructor(e){this.core=e;S(this,"_mixTranscodeManager");S(this,"_publishCDNManager");S(this,"_core");S(this,"_modeOptions");S(this,"seq");S(this,"_log");x=x+1,this.seq=x,this._log=e.log.createChild({id:`${this.getAlias()}${x}`}),this._log.info(`[CDNStreaming] created id=${this.getAlias()}${x}`),this._core=e,this._modeOptions=new Map,this._mixTranscodeManager=new E(e,this._log),this._publishCDNManager=new L(e,this._log)}getName(){return"CDNStreaming"}getAlias(){return"cdn"}getValidateRule(e){switch(e){case"start":return ae(this._core);case"update":return se(this._core);case"stop":return ne(this._core)}}getGroup(e){return e.target.publishMode}async start(e){return this._modeOptions.set(e.target.publishMode,e),await this.doStart(e)}async update(e){let i=this._modeOptions.get(e.target.publishMode);return this._core.utils.deepMerge(i,e),await this.doStart(i)}async stop(e){switch(e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.stopMixTranscode();break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.stopPublishTencentCDN(e.target.publishMode);break}}this._modeOptions.delete(e.target.publishMode)}async doStart(e){switch(this._log.info(`[CDNStreaming] doStart: ${JSON.stringify(e)}`),e.target.publishMode){case"publish-mix-stream-to-cdn":{await this._mixTranscodeManager.startMixTranscode(e);break}case"publish-main-stream-to-cdn":case"publish-sub-stream-to-cdn":{await this._publishCDNManager.startPublishTencentCDN(e.target);break}}}};S(v,"TYPE",{PublishMode:{PublishMainStreamToCDN:"publish-main-stream-to-cdn",PublishSubStreamToCDN:"publish-sub-stream-to-cdn",PublishMixStreamToCDN:"publish-mix-stream-to-cdn"}});var Ie=v;return Ce(Oe);})().default;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rtc-plugin/cdn-streaming",
3
- "version": "5.2.0-beta.2",
3
+ "version": "5.2.0",
4
4
  "description": "TRTC Web SDK 5.x CDN streaming plugin",
5
5
  "main": "./cdn-streaming.esm.js",
6
6
  "author": "longyuqi <longyuqi@tencent.com>",
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@rtc-plugin/virtual-background",
3
+ "version": "5.2.0",
4
+ "description": "TRTC Web SDK 5.x virtual background plugin",
5
+ "main": "./virtual-background.esm.js",
6
+ "author": "longyuqi <longyuqi@tencent.com>",
7
+ "module": "./virtual-background.esm.js",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git@github.com:LiteAVSDK/TRTC_Web.git"
11
+ },
12
+ "homepage": "https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/en/tutorial-36-advanced-virtual-background.html",
13
+ "keywords": [
14
+ "webrtc",
15
+ "TRTC",
16
+ "rtc",
17
+ "call",
18
+ "video call",
19
+ "audio call",
20
+ "javascript",
21
+ "video",
22
+ "audio",
23
+ "camera",
24
+ "microphone",
25
+ "live streaming",
26
+ "real-time communication",
27
+ "blur background"
28
+ ],
29
+ "types": "./virtual-background.esm.d.ts"
30
+ }
@@ -0,0 +1,27 @@
1
+ export interface AuthParam {
2
+ sdkAppId: number;
3
+ userId: string;
4
+ userSig: string;
5
+ }
6
+
7
+ export interface VirtualBackgroundOptions {
8
+ sdkAppId: number;
9
+ userId: string;
10
+ userSig: string;
11
+ type?: 'image' | 'blur';
12
+ src?: string;
13
+ }
14
+
15
+
16
+ export interface UpdateVirtualBackgroundOptions {
17
+ type: 'image' | 'blur';
18
+ src?: string;
19
+ }
20
+
21
+ export declare class VirtualBackground {
22
+ start(options: VirtualBackgroundOptions): Promise<void>;
23
+ update(options: UpdateVirtualBackgroundOptions): Promise<void>;
24
+ stop(): Promise<void>;
25
+ }
26
+
27
+ export default VirtualBackground;