socket-chat.js 2.08 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);

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

                       // 连接失败回调
                        options.connectFailCb();
                    }
                } else {
                    clearInterval(connectId);
                }
            }, 5000);

        }, 1000);
    }

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

        socket.onmessage = options.onMessage || function() {
            console.log('received msg');
        };

        socket.onopen = options.onOpen || function() {
            console.log('websocket is open');
        };

        socket.onclose = options.onClose || function() {
            console.log('websocket is closed');
        };

        return socket;
    }
}

/**
 * 发送消息
 * @param msg 消息体
 */
function sendMsg(msg) {
    if (!window.WebSocket) {
        return;
    }
    if (socket.readyState === WebSocket.OPEN) {
        socket.send(JSON.stringify(msg));
    } else {
        options.socketClosedCb();
    }
}

module.exports = {
    init: socketInit,
    send: sendMsg
};