Files
tinypin/client/ws.js
2021-01-29 14:23:37 -06:00

91 lines
2.5 KiB
JavaScript

// decorate on web socket functions. if web sockets fail to work, the app should keep working anyway.
// if you want to permanently disable websockets, just remove the src include
// the websocket is ONLY used to broadcast refresh notifications, no interesting data is passed
// across the wire. this is done because it can be harder to support certain security and proxy
// modes for different browsers, particularly client ssl certifacts are not passed by safari.
//
// by not passing any interesting data, it's reasonably safe to let the websocket remain open
window.socketConnected = false;
window.socket = null;
// keep-alive
setInterval(() => {
if ( window.socket && window.socket.readyState != WebSocket.OPEN ){
console.log("web socket reconnect");
window.socket = socketConnect();
} else {
window.socket.send(".");
}
}, 30000);
window.addEventListener("socket-connect", () => {
socketConnect();
});
async function socketConnect(){
if ( !window.uid ){
console.log("no user id, can't open a socket");
return false;
}
if ( window.socketConnected ){
console.log("web socket already connected");
return true;
}
window.socketConnected = false;
let s = new WebSocket(getSocketUrl());
s.onopen = async (e) => {
console.log("web socket connected");
// wait 50ms to see if the socket stays connected
await sleep(50);
if ( s.readyState == WebSocket.OPEN ){
console.log("web socket appears operational");
document.body.classList.add("socketConnected");
window.socketConnected = true;
return true;
} else {
console.log("web socket connect failed");
return false;
}
};
s.onmessage = (e) => {
console.log("web socket message: " + e.data);
let msg = JSON.parse(e.data);
window.dispatchEvent(new CustomEvent("broadcast", {detail: msg}));
}
s.onclose = (e) => {
console.log("web socket closed");
document.body.classList.remove("socketConnected");
window.socketConnected = false;
}
s.onerror = (e) => {
console.log("web socket error: " + e.message);
}
window.socket = s;
}
function getSocketUrl(){
var loc = window.location, new_uri;
if (loc.protocol === "https:") {
new_uri = "wss:";
} else {
new_uri = "ws:";
}
new_uri += "//" + loc.host;
new_uri += "/ws/" + window.uid;
return new_uri;
}