mirror of
https://github.com/slynn1324/tinypin
synced 2025-12-12 14:25:35 +00:00
91 lines
2.5 KiB
JavaScript
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;
|
|
}
|
|
|