JavaScript-WebSocket

JavaScript-WebSocket

這篇介紹JavaScript-WebSocket。

Example:

/* global postAjax /
/
global ObjectUtil /
/
global $j */
// eslint-disable-next-line no-var

var MobileWebSocket = (function mobileWebSocket() {
let webSocket = null;
let count = 0;


const createWebSocket = () => {
    if (ObjectUtil.isObject(webSocket)) {
        return;
    }
    postAjax({
        url: "API Path",
        data: {
        },
        success(response) {
            if (response.status === "200") {
                if ("WebSocket" in window) {
                    let tempWS = null;
                    if (window.location.protocol === "https:") {
                        tempWS = new WebSocket("wss://" + window.location.hostname + response.path + "?token=" + response.token);
                    } else {
                        tempWS = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + response.path + "?token=" + response.token);
                    }
                    tempWS.onerror = () => {
                        console.warn("WebSocket error");
                        if (ObjectUtil.isObject(webSocket)) {
                            webSocket.close();
                        }
                        webSocket = null;
                    };

                    tempWS.onopen = () => {
                        heartCheck.start();
                        console.log("WebSocket connected");
                    };

                    tempWS.onmessage = (event) => {
                        count = 0;
                        //Do something action
                    };

                    tempWS.onclose = () => {
                        console.log("WebSocket closed");
                        if (ObjectUtil.isObject(webSocket)) {
                            webSocket.close();
                        }
                        webSocket = null;
                    };

                    webSocket = tempWS;
                    window.onbeforeunload = () => {
                        try {
                            webSocket.close();
                        } catch (e) {
                            // nothing to be done
                        }
                    };
                } else {
                    console.log("webSocket is not supported");
                }
            }
        }
    });
};

const heartCheck = {
    heartbeatTimeout: 10000, // ms
    hearbeatTask: null,
    hearbeatContent: "{\"router\":\"heartbeat\"}",
    start() {
        if (ObjectUtil.isObject(this.hearbeatTask)) {
            clearInterval(this.hearbeatTask);
            this.hearbeatTask = null;
        }
        this.hearbeatTask = setInterval(() => {
            console.log("---beat:" + new Date());
            try {
                count += 1;
                if (webSocket === null) {
                    count = 0;
                    createWebSocket();
                    return;
                }
                if (count >= 3) {
                    count = 0;
                    if (ObjectUtil.isObject(webSocket)) {
                        webSocket.close();
                    }
                    webSocket = null;
                    return;
                }
                if (ObjectUtil.isObject(webSocket)) {
                    webSocket.send(this.hearbeatContent);
                }
            } catch (e) {
                // nothing to be done
            }
        }, this.heartbeatTimeout);
    }
};
heartCheck.start();
const connect = () => {
    createWebSocket();
};
return {
    connect
};

}());

Object.freeze(MobileWebSocket);