/** * SDKTransceiver: * 处理Window的消息发送和接受 */ import SDKPacket from "./SDKPacket"; import SDKPacketHandler from "./SDKPacketHandler"; import SDKPacketPool from "./SDKPacketPool"; import * as SDKRegistCommand from "../SDKConst/SDKRegistCommand"; import * as SDKLogicsCore from "../SDKLogics/SDKLogicsCore"; import SDKUserInfo from "../SDKLogics/SDKUserInfo"; export default class SDKTransceiver { private static ORDER_ID: number = 1; private static SEND_COUNT: number = 0; private static RECEIVE_COUNT: number = 0; protected _packetHandler: SDKPacketHandler; constructor() { this.reset(); this.addMessageEvent(); } /** * 监听window消息事件 */ private addMessageEvent(): void { console.log("添加监听事件。。。。。。"); window.addEventListener('message', this.receiveMsg.bind(this), false); // if(window.parent){ // window.parent.addEventListener('message', this.receiveMsg.bind(this),false); // } } private removeMessageEvent(): void { window.removeEventListener('message', this.receiveMsg.bind(this), false); } /** * 检测数据包是否合法。。。不合法的不给发送 * @param packet 数据包 */ private checkSendPacket(packet: SDKPacket): boolean { if (packet == undefined || packet.name == "") { return false; } return true; } /** * 向数据包追加参数数据 * @param packet 数据包 */ private appendParamsToPacket(packet: SDKPacket): void { let secene: cc.Scene; SDKTransceiver.ORDER_ID++; packet.id = SDKLogicsCore.parameterVo.gameId; packet.source = 'game'; packet.orderId = SDKTransceiver.ORDER_ID; packet.sendTime = new Date().getTime(); packet.sendId = SDKLogicsCore.parameterVo.userId; secene = cc.director.getScene(); if (secene != null) { packet.secene = secene.name; } } /** * 向数据包添加派发对象 * @param packet 数据包 */ private appendMobilesToPacket(packet: SDKPacket): void { packet.clearMobiles(); packet.clearNotSaveMobiles(); if (SDKRegistCommand.EVENT_CHECK.indexOf(packet.name) != -1) { if (SDKLogicsCore.controllState.controllerId != "") { if (SDKLogicsCore.controllState.controllerId == "-1") { packet.addToUserId(SDKLogicsCore.userInfos.getTeacherId()); packet.addNotSaveMobiles(SDKLogicsCore.userInfos.getTeacherId()); } else { packet.addToUserId(SDKLogicsCore.controllState.controllerId); packet.addNotSaveMobiles(SDKLogicsCore.controllState.controllerId); } } return; } if (SDKRegistCommand.EVENTS_LIST.indexOf(packet.name) != -1) { if (packet.name == SDKRegistCommand.GAEM_READY || packet.name == SDKRegistCommand.TEACH_MODLE_CHANGE) { packet.addToUserId(SDKLogicsCore.parameterVo.userId); } else if (packet.name == SDKRegistCommand.GET_GAME_HISTORY) { packet.addToUserId(packet.data); } return; } if (SDKLogicsCore.parameterVo.isStudent() && SDKLogicsCore.controllState.isOwn() && !SDKLogicsCore.controllState.isFullOwn()) { packet.addToUserId(SDKLogicsCore.parameterVo.userId); packet.addToUserId(SDKLogicsCore.userInfos.getTeacherId()); packet.addNotSaveMobiles(SDKLogicsCore.userInfos.getTeacherId()); } if (SDKLogicsCore.parameterVo.isTeacher() && SDKLogicsCore.controllState.isOwn() && !SDKLogicsCore.controllState.isFullOwn()) { packet.addToUserId(SDKLogicsCore.parameterVo.userId); } } /** * 默认将消息转发给所有人包括不在线的人 */ private messageToAll(packet: SDKPacket): void { let index = 0, count = 0; let userInfo : SDKUserInfo; if (packet.toMobiles == null || packet.toMobiles.length == 0) { count = SDKLogicsCore.userInfos.getCount(); for (index = 0; index < count; index++) { userInfo = SDKLogicsCore.userInfos.getUserInfoByIndex(index); if(userInfo != null){ packet.addToUserId(userInfo.userId); } } } } /** * 将事件消息数据转换成 数据包 * @param data 事件消息数据 */ public messageToPacket(data: any): SDKPacket { let packet: SDKPacket; packet = SDKPacketPool.Acquire(data["action"]); packet.id = data["id"]; packet.source = data["source"]; packet.data = data["data"]; packet.toMobiles = data["toMobiles"]; packet.notSaveMobile = data["notSaveMobile"]; packet.sendId = data["_sendId"]; packet.secene = data["_secene"]; packet.sendName = data["_sendName"]; packet.orderId = data["_orderId"]; packet.sendTime = data["_sendTime"]; packet.isMainFrame = data["_isMainFrame"]; return packet; } /** * window 接受到的事件 * @param event 消息事件 */ private receiveMsg(event: MessageEvent): void { let packet: SDKPacket; console.log("原始消息。。。。", event.data); packet = this.messageToPacket(event.data); SDKTransceiver.RECEIVE_COUNT++; console.log("*********接受消息:", packet.name, SDKTransceiver.RECEIVE_COUNT); if (this._packetHandler) { this._packetHandler.recevieMsg(packet); } } /** * 发送数据包 * @param packet 数据包 * @param target 数据包接受者 */ public sendPacket(packet: SDKPacket, target: Window = window.parent && window.parent.window) { if (!this.checkSendPacket(packet)) { console.error("send packet is error...", packet); return; } this.appendParamsToPacket(packet); if (SDKLogicsCore.parameterVo.isGamePreview()) { if (this._packetHandler) { this._packetHandler.dispatcherCMD(packet); } return; } if (!SDKLogicsCore.parameterVo.isGameClass() && !SDKLogicsCore.parameterVo.isSplitScreen()) { console.log("发送消息错误:不是上课模式,也不是分屏模式,请检测发送消息的逻辑代码"); return; } if (!SDKLogicsCore.controllState.isOwn() && SDKRegistCommand.EVENTS_LIST.indexOf(packet.name) == -1 && SDKRegistCommand.EVENT_CHECK.indexOf(packet.name) == -1) { console.error("发送消息有误......"); if (!SDKLogicsCore.controllState.isOwn()) { console.log("发送消息错误:自己没有操作权限.当前权限ID:", SDKLogicsCore.controllState.controllerId); } else { console.log("发送消息错误:不是SDKRegistCommand.EVENTS_LIST里的系统消息:", packet.name); } return; } if (SDKLogicsCore.parameterVo.isZMG()) { this.appendMobilesToPacket(packet); this.messageToAll(packet); } target.postMessage(packet, '*'); SDKTransceiver.SEND_COUNT++; console.log("*********发送消息:", packet, SDKTransceiver.SEND_COUNT); if (this._packetHandler) { this._packetHandler.sendToReceive(packet); } } /** * 发送消息 * @param name 消息名称 * @param data 消息数据 * @param target 发送的目标 */ public sendMsg(name: string, data: any = null, isMainIframe: boolean = true, target?: Window): void { if (name && name == "") { return; } let packet: SDKPacket = SDKPacketPool.Acquire(name); packet.data = data; packet.isMainFrame = isMainIframe; if (target) { this.sendPacket(packet, target); } else { this.sendPacket(packet); } } public set packetHandler(value: SDKPacketHandler) { this._packetHandler = value; } public get packetHandler(): SDKPacketHandler { return this._packetHandler; } public reset(): void { SDKTransceiver.ORDER_ID = 1; SDKTransceiver.SEND_COUNT = 0; SDKTransceiver.RECEIVE_COUNT = 0; } public destroy(): void { this._packetHandler = null; this.removeMessageEvent(); } }