RecordPlayBackParse.js 6.8 KB
import ByteBuffer  from 'libs/bytebuffer.min';
import Emiter from 'Emiter';
import MessageTypes from 'MessageTypes';
import Loger from 'Loger';

import pdu from 'pdus/index';
import PduType from 'pdus/PduType';
import PduConsts from 'pdus/PduConsts';
import ApeConsts from 'apes/ApeConsts';
import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Base64 from 'base64-js';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';

let parseBuffer;

// 日志对象
const loger = Loger.getLoger('RecordPlayBackParse');

class RecordPlayBackParse extends Emiter {
    constructor() {
        super();
        loger.log("RecordPlayBackParse");
        parseBuffer = new ByteBuffer( ByteBuffer.DEFAULT_CAPACITY,ByteBuffer.LITTLE_ENDIAN);
        parseBuffer.clear();
        console.log(parseBuffer);
        this._apes = {};
    }
    //method--------------------内部---------------------------------------------
    // 注册Ape
    registerApe(ape) {
        this._apes[ape._session_id] = ape;
    }

    // 录制回放EverSocket底层消息处理
    _everSocketMsgReceivedHandler(data) {
        let pduMsg = pdu.decode_pdu(data);
        let pduType = pduMsg.get("type");
        let pduData = pduMsg.get("data");
        //*************非常重要******************
        //客户端发送的所有125消息,MCU收到之后会痛120把消息返回给客户端,
        //所以需要把125消息type转换为120,因为MCU在录制的时候是直接录制客户端发送的消息而不是MCU转换之后的
        if(pduType==PduType.RCPDU_UNIFORM_SEND_DATA_REQUEST){
            pduMsg.type=PduType.RCPDU_SEND_DATA_REQUEST;
            pduType=PduType.RCPDU_SEND_DATA_REQUEST;
        }
        loger.log('pduType',pduType);
        switch (pduType) {
            case PduType.RCPDU_CONNECT_PROVIDER_RESPONSE:
                //加入课堂请求返回数据处理
                let joinConfPdu = pdu['RCConferenceJoinResponsePdu'].decode(pduData);
                let pduResultCode = joinConfPdu.result;
                loger.warn('RCPDU_CONNECT_PROVIDER_RESPONSE  ->pduResultCode:' + pduResultCode);
                switch (pduResultCode) {
                    case PduConsts.RET_SUCCESS:
                        //加入成功
                        this._updateMCUConfInfoDescription(joinConfPdu.classDescription);
                        this._emit(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this.classInfo);
                        break;
                    case PduConsts.RET_FULL_CAPACITY:
                        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_FULL);
                        break;
                    default:
                        loger.warn('JoinConfPdu-未知类型-等待处理.', pduResultCode);
                        break
                }
                break;
            case PduType.RCPDU_SEND_DATA_REQUEST:
                //先判断当前消息属于哪个APE 根据 sessionId来判断
                let ape = this._apes[pduMsg.sessionId];
                let sessionLabel = ApeConsts(pduMsg.sessionId);
                if (ape) {
                    let subTypeLabel = pdu.id2type(pduMsg.subType);
                    //loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);
                    //ape广播事件,只要ape中监听就能收到
                    ape._emit(pduMsg.subType, pduMsg.data);
                } else {
                    loger.warn(sessionLabel + '尚未注册');
                }
                break;
            default:
                loger.warn('PDU-未知类型-等待处理.', pduType);
        }
    }

    //method------------外部接口-------------------------------------
    //加载录制文件
    readyRecordPlay(){
        loger.log("读取回放数据");
        //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
        let url=`http://${ GlobalConfig.RecordServerIP}:${ GlobalConfig.RecordServerPort}/${GlobalConfig.recordFileName}`;
        console.log(url);
        fetch(url, {
            timeout: 90000
        })
            .then(ret => {
                if (ret.ok) {
                    return ret.arrayBuffer();
                } else {
                    loger.error(`读取回放数据-网络异常.状态码:${ret.status}`);
                    this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_RECORD_PLAY_BACK_DATA_FAILED);
                    throw '';
                }
            })
            .then(ret => {
                if (ret) {
                    loger.log('读取回放数据-完成');
                    this._loadRecordDataSuccess(ret);
                } else {
                    loger.warn('读取回放数据-失败.');
                    this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_RECORD_PLAY_BACK_DATA_FAILED);
                }
            })
            .catch(err => {
                loger.error(`读取回放数据.状态码:${err}`);
                this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_RECORD_PLAY_BACK_DATA_FAILED);
            });
    }

    _loadRecordDataSuccess(arrayBuffer){
        loger.log("获取录制回放数据的长度",arrayBuffer.byteLength);
        if(parseBuffer){
            parseBuffer.clear();
            parseBuffer.append(arrayBuffer);
        }
        this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS);
    }
    addArrayBuffer(arrayBuffer) {
        loger.log("addArrayBuffer", arrayBuffer.byteLength);
        parseBuffer.append(arrayBuffer, "binary");
    }

    read() {
        //loger.log("readUInt64", parseBuffer.readUInt64(0));
        //loger.log("readUInt32", parseBuffer.readUInt32(8));
        //loger.log("readByte", parseBuffer.readByte(12));
        let byteLength=parseBuffer.offset;
        parseBuffer.byteOffset=0;
        var position = 0;
        while (position<byteLength){
            var time =  parseBuffer.readUInt64(position, true);
            position += 8;
            var len = parseBuffer.readUInt32(position, true);
            position += 4;
            var byte = parseBuffer.buffer.slice(position, (position+len));
            position += len;
            console.log(time, len, byte);
            this._everSocketMsgReceivedHandler(byte);
        }
    }

    writeBuffer() {
        parseBuffer.writeUint64(123456789, 0).flip();
        parseBuffer.writeUint32(22211122, 8).flip();
    }

    startRecordPlayback(_param) {

    }

    stopRecordPlayback(_param) {

    }

    pauseRecordPlayback(_param) {

    }

    seekRecordPlayback(_param) {

    }
}

RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功

export default new RecordPlayBackParse;