李勇

新增第三方消息广播消息通道

此 diff 太大无法显示。
... ... @@ -26,7 +26,7 @@
"spec": ">=2.0.0 <3.0.0",
"type": "range"
},
"_requiredBy": [
"_//this._emitdBy": [
"/strip-ansi"
],
"_resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.0.0.tgz",
... ...
... ... @@ -17,6 +17,7 @@ import VideoApe from 'apes/VideoApe';
import AudioApe from 'apes/AudioApe';
import DocApe from 'apes/DocApe';
import WhiteBoardApe from 'apes/WhiteBoardApe';
import ThirdMessage from 'apes/ThirdMessage';
import EngineUtils from "EngineUtils";
import GlobalConfig from 'GlobalConfig';
import ApeConsts from 'apes/ApeConsts';
... ... @@ -28,7 +29,7 @@ import MediaModule from 'apes/MediaModule';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.28.0.201705031", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.29.1.20170601", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -41,6 +42,7 @@ let _audio_ape;
let _doc_ape;
let _whiteboard_ape;
let _recordPlayback;
let _thirdMessage;
//MCUClient 外部实例化主类
export default class MessageEntrance extends Emiter {
... ... @@ -60,6 +62,9 @@ export default class MessageEntrance extends Emiter {
//全局的Error处理
this.on(MessageTypes.MCU_ERROR, this._mcuErrorHandler.bind(this));
//
_thirdMessage=new ThirdMessage();
// Sass平台层
_sass = Sass;
_sass.on('*', (type, data) => this._emit(type, data));
... ...
... ... @@ -45,6 +45,7 @@ class ConferApe extends Ape {
this.on(pdu.RCPDU_SEND_CONFERENCE_DATA_REQUEST, this.conferMsgComingHandler.bind(this));//这个是课堂消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理
this.on(pdu.RCPDU_CONFERENCE_RECORD_REQUEST, this.onSendConferRecordRequestHandler.bind(this));//发送录制和停止录制消息
this.on(pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST, this.onThirdBroadcastDataHandler.bind(this));//第三方广播消息
}
//加入课堂
... ... @@ -633,6 +634,49 @@ class ConferApe extends Ape {
}
}
//-------------第三方消息------------------------------
//发送第三方广播消息
sendThirdBroadcastData(_param){
loger.log("发送第三方广播消息->",_param);
if (this._classInfo == null || EngineUtils.isEmptyObject(this._classInfo)) {
loger.log('发送第三方广播消息->失败->SDK还未初始化数据!');
if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
return;
}
return;
}
let thirdBroadcastSendPdu = new pdu['RCThirdSendBroadcastDataRequestPdu'];
thirdBroadcastSendPdu.type = pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST;
thirdBroadcastSendPdu.initiator = this._classInfo.nodeId;//发起人
thirdBroadcastSendPdu.peer = parseInt(_param.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
thirdBroadcastSendPdu.isPublic = true;
thirdBroadcastSendPdu.message = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.message);
if (!thirdBroadcastSendPdu.isPublic && 0 != thirdBroadcastSendPdu.peer) {
//发送给制定的人
this.send(thirdBroadcastSendPdu);
} else {
//发送给所有人
this.sendChatUniform(thirdBroadcastSendPdu);
}
}
//监听第三方消息通道消息
onThirdBroadcastDataHandler(_data){
//loger.log("监听第三方消息通道消息->",_data);
var thirdBroadcastReceivePdu = pdu['RCThirdSendBroadcastDataRequestPdu'].decode(_data);
var thirdMessage = {};
thirdMessage.fromNodeID = thirdBroadcastReceivePdu.initiator;
thirdMessage.toNodeID = thirdBroadcastReceivePdu.peer;
thirdMessage.message = this._rCArrayBufferUtil.uint8ArrayToStr(thirdBroadcastReceivePdu.userData, 2);
loger.log("监听第三方消息通道消息->", thirdMessage);
}
//------------------第三方消息 end-----------------------------------------
onSendConferRecordRequestHandler(_data) {
try {
let conferRecordSendPdu = pdu['RCConferenceRecordRequestPdu'].decode(_data);
... ...
require('messenger');
import Emiter from 'Emiter';
import McuObj from 'mcu';
import Loger from 'Loger';
let loger = Loger.getLoger('ThirdMessage');
class ThirdMessage extends Emiter{
constructor(){
super();
// 初始化消息通道
this.messenger = new Messenger('xuedianyunIframe', 'ParentMessengerChannel');
this.messenger.addTarget(window.parent, 'parent');
this.messenger.listen(this.reciveThirdMessage.bind(this))
loger.log('ThirdMessage->');
}
//发送消息
sendMessage(){
// 根据自己的业务组装对象
let jsonObj = {
username: 'sdk',
message: 'sdk->hello world',
}
this.messenger.send(JSON.stringify(jsonObj));
}
reciveThirdMessage(_data){
loger.log('来自父级页面的的消息:', _data);
// **发送前必须转JSON格式**
this.sendMessage();
}
}
export default ThirdMessage;
\ No newline at end of file
... ...
/**
* __ ___
* / |/ /___ _____ _____ ___ ____ ____ _ ___ _____
* / /|_/ // _ \ / ___// ___// _ \ / __ \ / __ `// _ \ / ___/
* / / / // __/(__ )(__ )/ __// / / // /_/ // __// /
* /_/ /_/ \___//____//____/ \___//_/ /_/ \__, / \___//_/
* /____/
*
* @description MessengerJS, a common cross-document communicate solution.
* @author biqing kwok
* @version 2.0
* @license release under MIT license
*/
window.Messenger = (function () {
// 消息前缀, 建议使用自己的项目名, 避免多项目之间的冲突
// !注意 消息前缀应使用字符串类型
var prefix = "[PROJECT_NAME]",
supportPostMessage = 'postMessage' in window;
// Target 类, 消息对象
function Target(target, name, prefix) {
var errMsg = '';
if (arguments.length < 2) {
errMsg = 'target error - target and name are both required';
} else if (typeof target != 'object') {
errMsg = 'target error - target itself must be window object';
} else if (typeof name != 'string') {
errMsg = 'target error - target name must be string type';
}
if (errMsg) {
throw new Error(errMsg);
}
this.target = target;
this.name = name;
this.prefix = prefix;
}
// 往 target 发送消息, 出于安全考虑, 发送消息会带上前缀
if (supportPostMessage) {
// IE8+ 以及现代浏览器支持
Target.prototype.send = function (msg) {
this.target.postMessage(this.prefix + '|' + this.name + '__Messenger__' + msg, '*');
};
} else {
// 兼容IE 6/7
Target.prototype.send = function (msg) {
var targetFunc = window.navigator[this.prefix + this.name];
if (typeof targetFunc == 'function') {
targetFunc(this.prefix + msg, window);
} else {
throw new Error("target callback function is not defined");
}
};
}
// 信使类
// 创建Messenger实例时指定, 必须指定Messenger的名字, (可选)指定项目名, 以避免Mashup类应用中的冲突
// !注意: 父子页面中projectName必须保持一致, 否则无法匹配
function Messenger(messengerName, projectName) {
this.targets = {};
this.name = messengerName;
this.listenFunc = [];
this.prefix = projectName || prefix;
this.initListen();
}
// 添加一个消息对象
Messenger.prototype.addTarget = function (target, name) {
var targetObj = new Target(target, name, this.prefix);
this.targets[name] = targetObj;
};
// 初始化消息监听
Messenger.prototype.initListen = function () {
var self = this;
var generalCallback = function (msg) {
debugger;
if (typeof msg == 'object' && msg.data) {
msg = msg.data;
}
var msgPairs = msg.split('__Messenger__');
var msg = msgPairs[1];
var pairs = msgPairs[0].split('|');
var prefix = pairs[0];
var name = pairs[1];
for (var i = 0; i < self.listenFunc.length; i++) {
if (prefix + name === self.prefix + self.name) {
self.listenFunc[i](msg);
}
}
};
if (supportPostMessage) {
if ('addEventListener' in document) {
window.addEventListener('message', generalCallback, false);
} else if ('attachEvent' in document) {
window.attachEvent('onmessage', generalCallback);
}
} else {
// 兼容IE 6/7
window.navigator[this.prefix + this.name] = generalCallback;
}
};
// 监听消息
Messenger.prototype.listen = function (callback) {
var i = 0;
var len = this.listenFunc.length;
var cbIsExist = false;
for (; i < len; i++) {
if (this.listenFunc[i] == callback) {
cbIsExist = true;
break;
}
}
if (!cbIsExist) {
this.listenFunc.push(callback);
}
};
// 注销监听
Messenger.prototype.clear = function () {
this.listenFunc = [];
};
// 广播消息
Messenger.prototype.send = function (msg) {
var targets = this.targets,
target;
for (target in targets) {
if (targets.hasOwnProperty(target)) {
targets[target].send(msg);
}
}
};
return Messenger;
})();
... ...
... ... @@ -704,6 +704,13 @@ message RCConferenceSendDataRequestPdu {
optional uint32 action_type = 5;//消息的指令类型
}
message RCThirdSendBroadcastDataRequestPdu {
optional uint32 initiator = 1;
optional uint32 peer = 2;
optional bool is_public = 3;
optional bytes message = 4;
}
message RCChatSendDataRequestPdu {
optional uint32 initiator = 1;
optional uint32 peer = 2;
... ...