import Sdk, { uiconstants, ErrorModel, Emitter } from '../sdk'; /** * KRtClient * @description KEDACOM WEBRTC SDK */ class KRtcCilent extends Emitter { /** * constructor * @constructor * @description 构造方法 * @param {object} paramters - 参数对象 * @param {string} [paramters.clientId] - 需要获取信息的实例id * * @example * // 示例1: * let krtcCilent = new KRtcCilent(); * // 示例2: * let krtcCilent = new KRtcCilent({ * clientId: "CLIENT12345678" * }); */ constructor(paramters = {}) { paramters = { ...paramters, preVersion: true } super(paramters); this.clientId = paramters.clientId; let singleSdk = new Sdk(paramters); this._singleSdk = singleSdk; this._addEventOnSingleSdk() } /** * @function getClientIds * @description 静态方法 获取可用的SDK实例ID列表 * @return {Array.<string>} clientIds - 包含所有 ClientId 字符串的数组 * @return {string} clientIds.item - ClientId 字符串 * * @example * // 示例: * let clientIdArr = KRtcCilent.getClientIds(); */ static getClientIds(paramters = {}) { return Sdk.getClientIds(paramters); } /** * @function getVersion * @description 静态方法 获取可用的SDK的版本号 * @return {string} 当前sdk的版本号,例如:V6.1.0.4.0.20210518202928 * * @example * // 示例: * KRtcClient.getVersion(); */ static getVersion() { return Sdk.getVersion(); } /* * @function getClientInfo(暂不提供) * @description 静态方法 获取可用的SDK实例ID列表 * @param {object} paramters - 参数对象 * @param {string} paramters.clientId - 需要获取信息的实例id * @return {JSON} 实例的详细信息 * * @example * // 示例: * let clientInfo = KRtcCilent.getClientInfo({ * clientId: "CLIENT12345678" * }); */ static getClientInfo(paramters = {}) { return Sdk.getClientInfo(paramters); } /** * getVersion * @description 实例方法 获取当前SDK的版本号 * @return {string} 当前sdk的版本号,例如:V6.1.0.4.0.20210518202928 * * @example * // 示例: * krtcClient.getVersion(); */ getVersion() { return Sdk.getVersion(); } /* * getClientInfo(暂不提供) * @description 获取可用的SDK实例ID列表 * @return {JSON} 实例信息 */ getClientInfo() { return Sdk.getClientInfo(this.clientId); } /* * getUserInfo(暂不提供) * @description 实例方法 获取当前SDK实例登录的用户信息 * @return {JSON} 登录的用户信息 */ getUserInfo() { return this._singleSdk.getUserInfo(); } /** * getUserId * @description 实例方法 获取当前SDK实例登录的用户ID * @return {string} 字符串,eg:"1234560000000" * * @example * // 示例: * let userId = krtcCilent.getUserId(); */ getUserId() { return this._singleSdk.getUserId() || ""; } /** * getNickname * @description 获取当前用户昵称 * @return {String} nickName - 当前用户昵称,字符串,eg:"游客9527" * * @example * // 示例: * let nickname = krtcCilent.getNickname(); */ getNickname() { return this._singleSdk.getNickname(); } /** * getRoomInfo * @description 获取当前的会议详情,如果还没入会,则返回空对象 * @return {Json} roomInfo - 当前所处会议的详情 */ getRoomInfo() { return this._singleSdk.getRoomInfo() || {}; } /** * getStatsInfo * @description 获取订阅/发布流信息 * @return {JSON} 主流音视频发布订阅,双流发布订阅信息 * */ getStatsInfo() { return this._singleSdk.getStatsInfo(); } /** * getRoomId * @description 获取当前的会议号码,如果还没入会,则返回空字符串 * @return {String} roomId - 当前的会议号码,字符串,eg:"6660001" * * @example * // 示例: * let roomId = krtcCilent.getRoomId(); */ getRoomId() { return this._singleSdk.getRoomId(); } /** * getUserList * @description 获取当前的会议的终端列表,如果还没入会,则返回空数组 * @return {Array} Array<UserInfo> 当前会议的终端列表 */ getUserList() { return this._singleSdk.getUserList() || []; } /** * getCurrentCamera * @description 获取当前使用的摄像头 * @return {string} 字符串 */ getCurrentCamera() { return this._singleSdk.getCurrentCamera(); } /** * getCurrentMicrophone * @description 获取当前使用的麦克风 * @return {string} 字符串 */ getCurrentMicrophone() { return this._singleSdk.getCurrentMicrophone(); } /** * getCurrentLoudspeaker * @description 获取当前使用的扬声器 * @return {string} 字符串 */ getCurrentLoudspeaker() { return this._singleSdk.getCurrentLoudspeaker(); } /** * init * @description 初始化SDK * @param {object} paramters - 参数对象 * @param {string} [paramters.debug] - 是否在浏览器控制台输出调试日志 * @param {string} paramters.hostname - 服务的地址或域名 * @param {string} [paramters.port] - 端口,默认443标准端口 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.init({ * hostname: "172.16.186.220", * success: function(data) { * console.log("初始化成功"); * }, * error: function(data) { * console.log("初始化失败"); * } * }); */ init(paramters = {}) { this._singleSdk.init(paramters) return this; } /** * autoLogin(暂不提供) * @description 免登录用户登录 * @param {object} paramters - 参数对象 * @param {string} paramters.roomId - 会议e164 * @param {string} paramters.nickname - 免登录用户昵称 * @param {string} paramters.hostname - 服务的地址或域名 * @param {string} paramters.port - 端口 * @param {boolean} paramters.autoPubLocalStream - 是否自动发布本机音视频流 * @param {boolean} paramters.autoSubAllVideoStream - 自动订阅所有视频流 * @param {function} paramters.success - 成功回调 * @param {function} paramters.error - 失败回调 * @return {object} KRtcCilent 实例 */ autoLogin(paramters = {}) { this._singleSdk.autoLogin(paramters); return this; } /** * login * @description 登录 * @param {object} paramters - 参数对象 * @param {string} [paramters.userId] - 用户名ID,可选参数,若不传入或为空时分配免登陆账号 * @param {string} paramters.nickname - 用户昵称 * @param {string} paramters.appToken - 应用token * @param {boolean} paramters.autoPubLocalStream - 是否自动发布本机音视频流 * @param {boolean} paramters.autoSubAllVideoStream - 自动订阅所有视频流 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} SkyClient 实例 * * @example * // 示例1:使用用户Id为 1234560000000,登录 * krtcClient.login({ * userId: "1234560000000", * nickname: "172.16.186.220", * appToken: "TOKEN12345678" * }); * // 示例2:使用系统分配账号登录 * krtcClient.login({ * nickname: "172.16.186.220", * appToken: "TOKEN12345678", * success: function(data) { * console.log("登录成功"); * }, * error: function(data) { * console.log("登录失败"); * } * }); */ login(paramters = {}) { this.krtcLogin(paramters); return this; } //krtc登录 krtcLogin(paramters = {}) { this._singleSdk.krtcLogin(paramters); return this; } /** * join * @description 加入会议 * @param {object} paramters - 参数对象 * @param {string} paramters.roomId - 会议E164 * @param {string} [paramters.password] - 密码 * @param {string} [paramters.onAudioReceived] - 接收到声音的回调处理,参数:{ audioTrack: audioTrack } * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.join({ * roomId: "6660001", * password: "", * success: function(data) { * console.log("入会成功"); * }, * error: function(data) { * console.log("入会失败"); * } * }); */ join(paramters = {}) { paramters.meetingE164 = paramters.roomId; this._singleSdk.join(paramters); return this; } /** * accept * @description 接受被呼 * @param {object} paramters - 参数对象 * @param {string} paramters.roomId - 会议E164 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.accept({ * roomId: "6660001", * success: function(data) { * console.log("入会成功"); * }, * error: function(data) { * console.log("入会失败"); * } * }); */ accept(paramters = {}) { paramters.meetingE164 = paramters.roomId; this._singleSdk.accept(paramters); return this; } /** * reject * @description 拒绝被呼 * @param {object} paramters - 参数对象 * @param {string} paramters.roomId - 会议E164 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.reject({ * roomId: "6660001", * success: function(data) { * console.log("拒绝成功"); * }, * error: function(data) { * console.log("拒绝失败"); * } * }); */ reject(paramters = {}) { paramters.meetingE164 = paramters.roomId; this._singleSdk.reject(paramters); return this; } /** * exit * @description 离开会议 * @param {object} paramters - 参数对象 * @param {string} [paramters.reason] - 离会原因 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.exit({ * reason: "正常离会" * }); */ exit(paramters = {}) { this._singleSdk.exit(paramters); return this; } /** * destroy * @description 销毁sdk */ destroy() { console.log("执行销毁") this._singleSdk.destroy(); return this; } /** * subscribe * @description 终端订阅(如果已订阅会直接返回,不做处理) * @param {object} paramters - 参数对象 * @param {string} paramters.userId - 终端id,终端列表返回的终端 编号信息,订阅辅流时可不传 * @param {string} paramters.mediaType - 码流标识:'audio'-订阅音频(暂不支持),'video'-订阅主流视频,'dualvideo'-订阅辅流视频 * @param {string} paramters.quality - 视频流分层标识: low-低分辨率层、middle-中分辨率层、high-高分辨率层 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例1:订阅用户ID为 6660001 的主流视频低分辨率 * krtcClient.subscribe({ * userId: "6660001", * mediaType: "video", * quality: "low" * }); * // 示例2:订阅辅流视频高分辨率 * krtcClient.subscribe({ * mediaType: "dualvideo", * quality: "high" * }); */ subscribe(paramters = {}) { let { userId, mediaType, quality, error } = paramters; let dual = (mediaType == "dualvideo") ? true : false; let confvmp = (mediaType == "confvmp") ? true : false; let mtid = this._getMtidFromUserId(userId,dual,confvmp); let layer = quality; if (!mtid) { let errorModel = new ErrorModel(null, null, "该终端不存在") error && error(errorModel) return this; } paramters = { ...paramters, mtid, dual, layer,confvmp } this._singleSdk.subscribe(paramters); return this; } /** * subscribeChange * @description 终端订阅改变(如果已订阅会直接返回,不做处理) * @param {object} paramters - 参数对象 * @param {string} paramters.userId - 终端id,终端列表返回的终端 编号信息,订阅辅流时可不传 * @param {string} paramters.mediaType - 码流标识:'audio'-订阅音频(暂不支持),'video'-订阅主流视频,'dualvideo'-订阅辅流视频 * @param {string} paramters.quality - 视频流分层标识: low-低分辨率层、middle-中分辨率层、high-高分辨率层 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例1:改变订阅用户ID为 6660001 的主流视频低分辨率 * krtcClient.subscribeChange({ * userId: "6660001", * mediaType: "video", * quality: "low" * }); * // 示例2:改变订阅辅流视频高分辨率 * krtcClient.subscribeChange({ * mediaType: "dualvideo", * quality: "high" * }); */ subscribeChange(paramters) { let { userId, mediaType, quality, error } = paramters; let dual = (mediaType == "dualvideo") ? true : false; let confvmp = (mediaType == "confvmp") ? true : false; let mtid = this._getMtidFromUserId(userId,dual,confvmp); let layer = quality; if (!mtid) { let errorModel = new ErrorModel(null, null, "该终端不存在") error && error(errorModel) return this; } paramters = { ...paramters, mtid, dual, layer,confvmp } this._singleSdk.subscribeChange(paramters) return this; } /** * unsubscribe * @description 终端取消订阅(如果已订阅会直接返回,不做处理) * @param {object} paramters - 参数对象 * @param {string} paramters.userId - 终端id,终端列表返回的终端 编号信息,订阅辅流时可不传 * @param {string} paramters.mediaType - 码流标识:'audio'-音频(暂不支持),'video'-主流视频,'dualvideo'-辅流视频 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例1:取消订阅用户ID为 6660001 的主流视频低分辨率 * krtcClient.unsubscribe({ * userId: "6660001", * mediaType: "video", * quality: "low" * }); * // 示例2:取消订阅辅流视频高分辨率 * krtcClient.unsubscribe({ * mediaType: "dualvideo", * quality: "high" * }); */ unsubscribe(paramters) { let { userId, mediaType, error } = paramters; let dual = (mediaType == "dualvideo") ? true : false; let confvmp = (mediaType == "confvmp") ? true : false; let mtid = this._getMtidFromUserId(userId,dual,confvmp); if (!mtid) { let errorModel = new ErrorModel(null, null, "该终端不存在") error && error(errorModel) return this; } paramters = { ...paramters, mtid, dual,confvmp } this._singleSdk.unsubscribe(paramters) return this; } /** * * @typedef {Object} DeviceInfoModel - 返回结果对象 * @property {boolean} DeviceInfoModel.success - 是否获取设备成功 * @property {Array<DeviceInfo>} DeviceInfoModel.data 设备列表(Array) * @property {DeviceInfo} DeviceInfoModel.data.DeviceInfo 单个设备详情 * @property {string} DeviceInfoModel.data.DeviceInfo.deviceId 设备id * @property {string} DeviceInfoModel.data.DeviceInfo.groupId 设备 groupId * @property {string} DeviceInfoModel.data.DeviceInfo.kind 设备类型 * @property {string} DeviceInfoModel.data.DeviceInfo.label 设备别名 */ /** * listMicrophone * @description 获取麦克风列表 * @param {object} paramters - 参数对象 * @param {string} [paramters.keyword] - 搜索关键字 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {DeviceInfoModel} DeviceInfoModel - Json 自定义对象 * * @example * // 示例: * krtcClient.listMicrophone({ * keyword: "" * }); */ listMicrophone(paramters = {}) { let model = this._singleSdk.listMicrophone(paramters) return model; } /** * enableMicrophone * @description 开启麦克风 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 设备id * @param {string} [paramters.autoGainControl] - 麦克风增益:true-开启麦克风增益,false-关闭麦克风增益,缺省默认为false * @param {function} [paramters.success] - 成功回调,参数:{ audioTrack: audioTrack } * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.enableMicrophone({ * deviceId: "MICROPHONE12345678", * autoGainControl: true * }); */ enableMicrophone(paramters = {}) { this._singleSdk.enableMicrophone(paramters) return this; } /** * disableMicrophone * @description 关闭麦克风 * @param {object} paramters - 参数对象 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.disableMicrophone(); */ disableMicrophone(paramters = {}) { this._singleSdk.disableMicrophone(paramters) return this; } /** * changeMicrophone * @description 切换麦克风 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 设备id * @param {string} [paramters.autoGainControl] - 麦克风增益:true-开启麦克风增益,false-关闭麦克风增益,缺省默认为false * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 * * @example * // 示例: * krtcClient.changeMicrophone({ * deviceId: "MICROPHONE12345678", * autoGainControl: true * }); */ changeMicrophone(paramters = {}) { this._singleSdk.changeMicrophone(paramters) return this; } /** * testMicrophone(暂不提供) * @description 测试麦克风 * @return {JSON} * abandon */ testMicrophone(paramters = {}) { this._singleSdk.testMicrophone(paramters); return false; } /** * testMicrophoneVolume * @description 获取麦克风测试音量 * @param {object} paramters - 参数对象 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {number} 麦克风音量值 * * @example * // 示例:可定时获取测试音量用于显示麦克风的能量值 * let volume = krtcClient.testMicrophoneVolume(); */ testMicrophoneVolume(paramters = {}) { let volume = this._singleSdk.testMicrophone(paramters); return volume || "0"; } /** * listCamera * @description 获取摄像头列表 * @param {object} paramters - 参数对象 * @param {string} [paramters.keyword] - 搜索关键字 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @returns {Object} model - 返回结果 * @returns {boolean} model.success 调用是否成功 * @returns {Array} model.data 设备列表 * * @example * // 示例: * krtcClient.listCamera({ * keyword: "" * }); */ listCamera(paramters = {}) { let model = this._singleSdk.listCamera(paramters) return model.data; } /** * enableCamera * @description 开启摄像头 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 扬声器设备id,优先于facingMode * @param {number} paramters.width - 视频宽度 * @param {number} paramters.height - 视频高度 * @param {number} paramters.definition - 分辨率,值为360P,720P * @param {string} paramters.facingMode - 移动设备的前后置摄像头:environment-后置摄像头,user-前置摄像头 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ enableCamera(paramters = {}) { this._singleSdk.enableCamera(paramters) return this; } /** * disableCamera * @description 关闭摄像头 * @param {object} paramters - 参数对象 * @param {boolean} paramters.isTest - 是否测试模式:true-是,false-否 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ disableCamera(paramters = {}) { this._singleSdk.disableCamera(paramters) return this; } /** * changeCamera * @description 切换摄像头 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 扬声器设备id,优先于facingMode * @param {number} paramters.width - 视频宽度 * @param {number} paramters.height - 视频高度 * @param {string} paramters.facingMode - 移动设备的前后置摄像头:environment-后置摄像头,user-前置摄像头 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ changeCamera(paramters = {}) { this._singleSdk.enableCamera(paramters) return this; } /** * listLoudspeaker * @description 获取扬声器列表 * @param {object} paramters - 参数对象 * @param {string} [paramters.keyword] - 搜索关键字 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {DeviceInfoModel} 扬声器列表 (JSON) 自定义对象 * * @example * // 示例: * krtcClient.listLoudspeaker({ * keyword: "" * }); */ listLoudspeaker(paramters = {}) { let model = this._singleSdk.listLoudspeaker(paramters) return model; } /** * enableLoudspeaker * @description 开启扬声器 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 扬声器设备id * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ enableLoudspeaker(paramters = {}) { this._singleSdk.enableLoudspeaker(paramters) return this; } /** * disableLoudspeaker * @description 关闭扬声器 * @param {object} paramters - 参数对象 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ disableLoudspeaker(paramters = {}) { this._singleSdk.disableLoudspeaker(paramters) return this; } /** * changeLoudspeaker * @description 切换扬声器 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 扬声器设备id * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ changeLoudspeaker(paramters = {}) { this._singleSdk.changeLoudspeaker(paramters) return this; } /** * testLoudspeaker * @description 开始测试扬声器 * @param {object} paramters - 参数对象 * @param {boolean} paramters.playstatus - 当前是否正在播放,true-正在播放,false-未播放 * @param {string} paramters.deviceId - 扬声器设备id * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ testLoudspeaker(paramters = {}) { this._singleSdk.testLoudspeaker(paramters); return this; } /** * stopTestLoudspeaker * @description 停止测试扬声器 * @param {object} paramters - 参数对象 * @param {string} paramters.deviceId - 扬声器设备id * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ stopTestLoudspeaker(paramters = {}) { this._singleSdk.stopTestLoudspeaker(paramters); return this; } /** * testLoudspeakerVolume * @description 获取扬声器测试音量 * @return {string} 扬声器音量值 */ testLoudspeakerVolume() { let volume = this._singleSdk.stopTestLoudspeaker(paramters); return volume || "0"; } /** * enableShare * @description 开启屏幕共享 * @param {object} paramters - 参数对象 * @param {number} paramters.width - 视频宽度 * @param {number} paramters.height - 视频高度 * @param {number} paramters.frameRate - 视频最大帧率 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ enableShare(paramters = {}) { this._singleSdk.enableShare(paramters); return this; } /** * disableShare * @description 关闭屏幕共享 * @param {object} paramters - 参数对象 * @param {function} [paramters.success] - 成功回调 * @param {function} [paramters.error] - 失败回调 * @return {object} KRtcCilent 实例 */ disableShare(paramters = {}) { this._singleSdk.disableShare(paramters); return this; } // 由UserId转换为 mtid _getMtidFromUserId(userId,dual,confvmp) { let { mtList } = this._singleSdk.sdkStore; let peers = mtList.peers; let mtid; for (let key in peers) { let peer = peers[key] if (peer.e164 == userId) { mtid = peer.mtId; break; }else if(confvmp){ mtid = "confvmp"; break; } } return mtid || ""; } // 由Mtid 转换为UserId _getUserIdFromMtid(mtid) { let { mtList } = this._singleSdk.sdkStore; let peers = mtList.peers; return peers[mtid] ? peers[mtid]["e164"] : ""; } _addEventOnSingleSdk() { let that = this; let eventList = Object.values(uiconstants); eventList.forEach(eventName => { this._singleSdk.on(eventName, function (data) { // console.log("_addEventOnSingleSdk eventName = ", eventName) // console.log("_addEventOnSingleSdk data = ", data) that.emit(eventName, data) }) }); } } export default KRtcCilent; export { uiconstants };