class Server { protocol:string cmd:string constructor(cmd:string) { this.cmd = cmd } request(data:Object):any { if (SERVER_CONNECTION == true) { return } SERVER_CONNECTION = true console.log(data) if (this.cmd != "updateLog") { showElement("loading", true) UNDO = new Object() setConnectionState("busy") } switch(window.location.protocol) { case "http:": this.protocol = "ws://" break case "https:": this.protocol = "wss://" break } var wsHost:string = window.location.host if (wsHost == undefined || wsHost.length < 1) { wsHost = window.location.hostname } var url = this.protocol + wsHost + "/data/" + "?Token=" + getCookie("Token") data["cmd"] = this.cmd var ws = new WebSocket(url) var isLogUpdate:boolean = data["cmd"] == "updateLog" var responseReceived:boolean = false var requestFinished:boolean = false var timeoutMs:number = 12000 var requestTimeout:number var finishRequest = function(state:string, responseSuccess:boolean = false):void { if (requestFinished == true) { return } requestFinished = true SERVER_CONNECTION = false window.clearTimeout(requestTimeout) if (responseSuccess == true) { if (state == "online") { WS_FAILURE_COUNT = 0 } } else { WS_FAILURE_COUNT++ } if (isLogUpdate == false) { showElement("loading", false) } if (state != "") { setConnectionState(state) } } requestTimeout = window.setTimeout(function() { console.log("Websocket request timed out.") var timeoutState:string = "offline" if (isLogUpdate == true && WS_FAILURE_COUNT < 2) { timeoutState = "idle" } finishRequest(timeoutState, false) try { ws.close() } catch (err) { console.log(err) } }, timeoutMs) ws.onopen = function() { WS_AVAILABLE = true if (data["cmd"] != "updateLog") { setConnectionState("busy") } console.log("REQUEST (JS):"); console.log(data) console.log("REQUEST: (JSON)"); console.log(JSON.stringify(data)) this.send(JSON.stringify(data)); } ws.onerror = function(e) { console.log("No websocket connection to xTeVe could be established. Check your network configuration.") var errorState:string = "offline" if (isLogUpdate == true && WS_FAILURE_COUNT < 2) { errorState = "idle" } finishRequest(errorState, false) if (WS_AVAILABLE == false && isLogUpdate == false) { alert("No websocket connection to xTeVe could be established. Check your network configuration.") } } ws.onmessage = function (e) { responseReceived = true finishRequest("online", true) console.log("RESPONSE:"); var response = JSON.parse(e.data); console.log(response); if (response.hasOwnProperty("token")) { document.cookie = "Token=" + response["token"] } if (response["status"] == false) { setConnectionState("offline") alert(response["err"]) if (response.hasOwnProperty("reload")) { location.reload() } return } if (response.hasOwnProperty("logoURL")) { var div = (document.getElementById("channel-icon") as HTMLInputElement) div.value = response["logoURL"] div.className = "changed" return } switch (data["cmd"]) { case "updateLog": SERVER["log"] = response["log"] if (document.getElementById("content_log")) { showLogs(false) } return break; default: SERVER = new Object() SERVER = response break; } if (response.hasOwnProperty("openMenu")) { var menu = document.getElementById(response["openMenu"]) menu.click() showElement("popup", false) } if (response.hasOwnProperty("openLink")) { window.location = response["openLink"] } if (response.hasOwnProperty("alert")) { alert(response["alert"]) } if (response.hasOwnProperty("reload")) { location.reload() } if (response.hasOwnProperty("wizard")) { createLayout() configurationWizard[response["wizard"]].createWizard() return } createLayout() } ws.onclose = function() { if (responseReceived == true) { return } var closeState:string = "offline" if (isLogUpdate == true && WS_FAILURE_COUNT < 2) { closeState = "idle" } finishRequest(closeState, false) } } } var WS_FAILURE_COUNT:number = 0 function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); }