ServerCheck.js 9.4 KB
import Emiter from 'Emiter';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import MD5 from "md5";
import ApeConsts from 'apes/ApeConsts';
import iphunter from 'iphunter';
import Server from "config/Server";
import fetchJsonp from 'fetch-jsonp';

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

//ip选点流程的状态
let isRequestMcuCallback = false;//是否获取最佳mcu返回
let isRequestMsCallback = false;//是否获取ms最佳返回
let isTestFromSass=false;
let isTestFromServer=false;

let tempMcuIp="";
let tempMcuPort="";
let tempMsIp="";
let tempMsPort="";
class ServerCheck extends Emiter {
    constructor() {
        super();

    }

    //根据userIp获取ip相关的信息,参数是userIp
    getUserIpInfo(token, userIp) {
        //重置ip选点流程状态
        isRequestMcuCallback = false;
        isRequestMsCallback = false;
        isTestFromSass=false;
        isTestFromServer=false;

        let userIpInfo = new Object;
        userIpInfo.ret = -1;

        let ip = userIp;
        let md5Str = MD5("addr=" + ip + "&token=b657c3507b324353e09c1958ee956a98efceb3e3");//("addr=" + ip + "&token=b657c3507b324353e09c1958ee956a98efceb3e3"),转成MD5
        let timestamp = new Date().getTime();
        let location = `http://ipapi.ipip.net/find?addr=${ip}&sid=14&uid=5237&sig=${md5Str}&_=${timestamp}`;
        loger.log('获取IP信息 ', userIp, location);

        fetchJsonp(location, {
            timeout: 3000,
        }).then(function (response) {
            return response.json()
        }).then(function (json) {
            loger.log('获取IP信息返回', json)
            if (json) {
                userIpInfo.ret = json.ret;
                userIpInfo.country = json.data[0];//国家
                userIpInfo.province = json.data[1];//省份
                userIpInfo.city = json.data[2];//城市
                userIpInfo.isp = json.data[4];//运营商
            }
            this.serverGetUserIpInfoCallback(userIpInfo);
        }.bind(this)).catch(function (ex) {
            loger.log('获取IP信息失败', ex.message)
            this.serverGetUserIpInfoCallback(userIpInfo);
        }.bind(this));
    }

    //获取ip信息返回
    serverGetUserIpInfoCallback(userIpInfo) {
        loger.log("获取IP详情,开始处理", userIpInfo);
        if (userIpInfo.ret == "ok") {
            GlobalConfig.country = userIpInfo.country;//国家
            GlobalConfig.city = userIpInfo.city;//城市
            GlobalConfig.province = userIpInfo.province;//服务商
            GlobalConfig.isp = userIpInfo.isp;//服务商
            loger.log("获取ip详情成功,country:" + GlobalConfig.country + ",city:" + GlobalConfig.city + ",isp:" + GlobalConfig.isp);
            this._chooseBestIpFromServer();
        }
        else {
            loger.log("获取ip详情失败");
            this._chooseBestIpFromSassParam();
        }
    }

    //从IPIP服务列表中选择最快的IP
    _chooseBestIpFromServer() {
        loger.log("从IPIP服务列表中选择最快的IP");
        isRequestMcuCallback=false;
        isRequestMsCallback=false;
        isTestFromServer=true;
        isTestFromSass=false;

        let mcuIpGroup =this._returnServerMS();
        let msIpGroup = this._returnServerMCU();
        this.getBestMcuServer(mcuIpGroup);
        this.getBestMsServer(msIpGroup);
    }
    //从Sass返回的msList   mcuList中选点
    _chooseBestIpFromSassParam() {
        loger.log("从Sass服务列表中选择最快的IP");
        isRequestMcuCallback=false;
        isRequestMsCallback=false;
        isTestFromServer=true;
        isTestFromSass=true;
        //MCU
        let mcuIpGroup = [];
        let speedTestPort = ':8080';//测速端口统一
        for (let i = 0; i < GlobalConfig.mcuList.length; i++) {
            let ipPort = GlobalConfig.mcuList[i].ip+speedTestPort;
            mcuIpGroup.push(ipPort)
        }
        this.getBestMcuServer(mcuIpGroup);


        //MS
        let msIpGroup = [];
        for (let i = 0; i < GlobalConfig.msList.length; i++) {
            let ipPort = GlobalConfig.msList[i].ip+speedTestPort;
            msIpGroup.push(ipPort)
        }
        this.getBestMsServer(msIpGroup);
    }


    //获取最快的MCU服务器地址,参数是一个ip数组
    getBestMcuServer(_param) {
        loger.log('getBestMcuServer ', _param);
        if(_param==null||_param.length<1){
            this._getBestMcuServerCallbackHandler("")
            return;
        }
        iphunter(_param, function (fatest_ip_response) {
            if (!fatest_ip_response) {
                loger.warn('getBestMcuServer -> nothing!');
                this._getBestMcuServerCallbackHandler("")
            } else {
                loger.log('getBestMcuServer done -> ', fatest_ip_response);
                this._getBestMcuServerCallbackHandler(fatest_ip_response)
            }
        }.bind(this), 3000);
    }

    //获取最快的MS服务器地址,参数是一个ip数组
    getBestMsServer(_param) {
        loger.log('getBestMsServer ', _param);
        if(_param==null||_param.length<1){
            this._getBestMsServerCallbackHandler("")
            return;
        }
        iphunter(_param, function (fatest_ip_response) {
            if (!fatest_ip_response) {
                loger.warn('getBestMsServer -> nothing!');
                this._getBestMsServerCallbackHandler("");
            } else {
                loger.log('getBestMsServer done -> ', fatest_ip_response);
                this._getBestMsServerCallbackHandler(fatest_ip_response);
            }
        }.bind(this), 3000);
    }

    _getBestMcuServerCallbackHandler(_data) {
        loger.log("_getBestMcuServerCallbackHandler", _data);
        if (isRequestMcuCallback) {
            loger.log("_getBestMcuServerCallbackHandler,已经有返回");
            return;
        }
        isRequestMcuCallback = true;
        if (_data) {
            let server = _data.split(":");
            if (server[0]) {
               tempMcuIp= server[0];
            }
            if (server[1]) {
                tempMcuPort = server[1];
            }
        }
        //loger.log("_getBestMcuServerCallbackHandler",tempMcuIp,tempMcuPort);
        this._startConnectMcu();
    }

    _getBestMsServerCallbackHandler(_data) {
        loger.log("_getBestMsServerCallbackHandler", _data);
        if (isRequestMsCallback) {
            loger.log("_getBestMsServerCallbackHandler,已经有返回");
            return;
        }
        isRequestMsCallback = true;
        if (_data) {
            let server = _data.split(":");
            if (server[0]) {
                tempMsIp= server[0];
            }
            if (server[1]) {
               tempMsPort= server[1];
            }
        }
        //loger.log("_getBestMsServerCallbackHandler", tempMsIp,tempMsPort);
        this._startConnectMcu();
    }

    //ip选点结束,开始连接MCU
    _startConnectMcu() {
        if (isRequestMcuCallback && isRequestMsCallback) {
            if (isTestFromServer && !isTestFromSass) {
                //从Server服务列表中选点结束,如果没有选到合适的,从Sass的列表中获取
                if(!tempMcuIp||!tempMsIp){
                    this._chooseBestIpFromSassParam();
                }else {
                    this._emit(ServerCheck.SEVER_CHECK_BEST_IP_SUCCESS);
                }
            } else {
                //从Sass返回的服务列表中选点结束
                this._emit(ServerCheck.SEVER_CHECK_BEST_IP_SUCCESS);
            }
        } else {
            loger.warn("_startConnectMcu 正在选点", isRequestMcuCallback, isRequestMsCallback);
        }
    }

    //检测MCU连接地址
    _returnServerMCU(country, province, ctiy, isp, jsona) {
        let arr=[];
        return arr;
    }
    //检测MS连接地址
    //Config.ipInfo
    _returnServerMS(country, province, ctiy, isp, jsona) {
        let arr = [];
     /*   let acquire = false;
        if (isp != "") {
            for (let obja in jsona.MS.isp) {
                if (isp.indexOf(obja.idc) != -1) {
                    arr = obja.mslist;
                    acquire = true;
                    break;
                }
            }
        }
        if (country == "中国" && !acquire) {
            for (let obja in jsona.MS.china) {
                if (obja.province.indexOf(province) != -1 && province != "") {
                    arr = obja.mslist;
                    acquire = true;
                    break;
                }
            }
            if (!acquire) {
                arr = jsona.MS.china[jsona.MS.china.length - 1].mslist;
                acquire = true;
            }
        }

        if (country != "中国" && country != "") {
            for (let obja:Object in jsona.MS.international) {
                if (obja.country.indexOf(country) != -1) {
                    arr = obja.mslist;
                    acquire = true;
                    break;
                }
            }
            if (!acquire) {
                arr = jsona.MS.international[jsona.MS.international.length - 1].mslist;
                acquire = true;
            }
        }
        else if (!acquire) {
            arr = jsona.MS.Default;
        }

        loger.info("ms匹配结束;" + arr.length);*/
        return arr;
    }
}

ServerCheck.prototype.SEVER_CHECK_BEST_IP_SUCCESS = ServerCheck.SEVER_CHECK_BEST_IP_SUCCESS = 'severCheck_checkBestIpSuccess_message';//获取最快的MS地址
export default new ServerCheck;