chat.js 2.53 KB
/**
 * socket 聊天
 *
 * @author: liqi <qi.li@yoho.cn>
 * @date: 2016/11/8
 */

var times,
    param,
    socket,
    server,
    servers,
    options,
    connectId,
    conversationMessage;

function _randomServer() {
    return servers[new Date().getTime() % servers.length];
}

/**
 * socket初始化
 * @param opts
 */
function socketInit(opts) {
    options = opts;
    servers = options.servers;
    server = _randomServer();
    conversationMessage = options.conversationMessage;
    param = JSON.stringify(conversationMessage);


    /**
     * 连接
     * @returns {WebSocket}
     */
    function socketConnect() {
        var socketIns = new WebSocket(server + '/im?param=' + param);

        socketIns.onmessage = options.onMessage || function() {};

        socketIns.onopen = options.onOpen || function() {};

        socketIns.onerror = options.onError || function() {};

        return socketIns || {};
    }

    if (window.WebSocket) {
        setTimeout(function() {
            times = 1;

            // socket对象存在或者正在链接
            if (socket || socket && socket.readyState === WebSocket.CONNECTING) {
                return;
            }

            socket = socketConnect();
            connectId = setInterval(function() {
                if (socket.readyState !== WebSocket.OPEN) {
                    if (times < 3) {
                        socket.close && socket.close();
                        socket = socketConnect();
                        times++;
                    } else {
                        clearInterval(connectId);
                        socket = null;

                        // 连接失败回调
                        options.connectFailCb();
                    }
                } else {
                    socket.onclose = options.onClose || function() {};

                    clearInterval(connectId);
                }
            }, 5000);

        }, 1000);
    }
}

/**
 * 发送消息
 * @param msg 消息体
 */
function sendMsg(msg) {
    if (!window.WebSocket) {
        return;
    }

    if (socket && socket.readyState === WebSocket.OPEN) {
        socket.send(JSON.stringify(msg));
    } else {
        options.socketClosedCb();
    }
}

/**
 * 链接可用
 * @returns {*|boolean}
 */
function isOpen() {
    return socket && socket.readyState === WebSocket.OPEN;
}

/**
 * 关闭socket
 */
function clearSocket() {
    if (socket) {
        socket = null;
    }
}

module.exports = {
    socket: socket,
    init: socketInit,
    clear: clearSocket,
    send: sendMsg,
    isOpen: isOpen
};