mirror of
https://github.com/pierre42100/ComunicWeb
synced 2024-11-26 22:09:21 +00:00
132 lines
2.6 KiB
JavaScript
132 lines
2.6 KiB
JavaScript
/**
|
|
* Main client websocket
|
|
*
|
|
* @author Pierre HUBERT
|
|
*/
|
|
|
|
|
|
class WsMessage {
|
|
constructor(info) {
|
|
this.title = info.title
|
|
this.id = info.id
|
|
this.data = info.data
|
|
}
|
|
|
|
get hasId() {
|
|
return this.id.length > 0
|
|
}
|
|
}
|
|
|
|
class UserWebSocket {
|
|
|
|
/**
|
|
* Connect to server
|
|
*/
|
|
static async Connect() {
|
|
|
|
try {
|
|
await this.Disconnect();
|
|
|
|
console.log("Connect to websocket");
|
|
|
|
// Generate an access token
|
|
const token = (await api("ws/token", null, true)).token;
|
|
|
|
// Determine websocket URL
|
|
const url = ComunicWeb.__config.apiURL.replace("http", "ws") + "ws?token=" + token
|
|
|
|
// Connect to websocket
|
|
this.ws = new WebSocket(url);
|
|
|
|
// Wait for connection
|
|
this.ws.addEventListener("open", () => console.log("Connected to websocket!"))
|
|
this.ws.addEventListener("error", (e) => this.Error(e))
|
|
this.ws.addEventListener("close", (e) => this.Closed(e));
|
|
|
|
// Handle incoming messages
|
|
this.ws.addEventListener("message", (e) => {
|
|
this.ProcessMessage(new WsMessage(JSON.parse(e.data)));
|
|
})
|
|
|
|
} catch(e) {
|
|
this.Error(e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handles websocket errors
|
|
*/
|
|
static async Error(e) {
|
|
console.error(e)
|
|
notify("Could not connect to websocket ! Try to refresh the page...", "danger");
|
|
}
|
|
|
|
/**
|
|
* When we get disconnected from the websocket
|
|
*/
|
|
static async Closed(e) {
|
|
console.error("WS closed", e)
|
|
|
|
// Check if the server was gracefully stopped
|
|
if(!this.hasOwnProperty("ws"))
|
|
return;
|
|
|
|
const num_seconds = ComunicWeb.__config.productionMode ? 5 : 0.8;
|
|
|
|
notify("Disconnected from the server, page will be reloaded in "+num_seconds+" seconds !", "danger");
|
|
|
|
setTimeout(() => {
|
|
ComunicWeb.common.system.reset();
|
|
}, num_seconds*1000);
|
|
}
|
|
|
|
/**
|
|
* Disconnect from server
|
|
*/
|
|
static async Disconnect() {
|
|
console.log("Disconnect from websocket");
|
|
|
|
// Disconnect, if reuired
|
|
if(this.hasOwnProperty("ws")) {
|
|
if(this.ws.readyState == WebSocket.OPEN)
|
|
this.ws.close()
|
|
delete this.ws
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Process an incoming message
|
|
*
|
|
* @param {WsMessage} msg The incoming message
|
|
*/
|
|
static async ProcessMessage(msg) {
|
|
|
|
// Check if the message is not associated if any request
|
|
if(!msg.hasId)
|
|
this.ProcessDetachedMessage(msg)
|
|
|
|
else
|
|
throw Error("Attached message to request are not supported yet!");
|
|
|
|
}
|
|
|
|
/**
|
|
* Process detached message
|
|
* @param {WsMessage} msg Incoming message
|
|
*/
|
|
static async ProcessDetachedMessage(msg) {
|
|
|
|
switch(msg.title) {
|
|
|
|
case "number_notifs":
|
|
SendEvent("newNumberNotifs", msg.data)
|
|
break;
|
|
|
|
case "number_unread_conversations":
|
|
SendEvent("newNumberUnreadConvs", msg.data)
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
} |