2021-06-25 09:55:49 -04:00
import { io } from "socket.io-client" ;
import { useToast } from 'vue-toastification'
const toast = useToast ( )
let storage = localStorage ;
let socket ;
export default {
data ( ) {
return {
socket : {
token : null ,
firstConnect : true ,
connected : false ,
} ,
allowLoginDialog : false , // Allowed to show login dialog, but "loggedIn" have to be true too. This exists because prevent the login dialog show 0.1s in first before the socket server auth-ed.
loggedIn : false ,
monitorList : [
] ,
importantHeartbeatList : [
2021-06-27 04:10:55 -04:00
] ,
heartbeatList : {
} ,
2021-06-25 09:55:49 -04:00
}
} ,
created ( ) {
socket = io ( "http://localhost:3001" , {
transports : [ 'websocket' ]
} ) ;
socket . on ( 'monitorList' , ( data ) => {
this . monitorList = data ;
} ) ;
2021-06-27 04:10:55 -04:00
socket . on ( 'heartbeat' , ( data ) => {
if ( ! ( data . monitorID in this . heartbeatList ) ) {
this . heartbeatList [ data . monitorID ] = [ ] ;
}
this . heartbeatList [ data . monitorID ] . push ( data )
} ) ;
2021-06-25 09:55:49 -04:00
socket . on ( 'disconnect' , ( ) => {
this . socket . connected = false ;
} ) ;
socket . on ( 'connect' , ( ) => {
this . socket . connected = true ;
this . socket . firstConnect = false ;
if ( storage . token ) {
this . loginByToken ( storage . token )
} else {
this . allowLoginDialog = true ;
}
} ) ;
} ,
methods : {
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
getSocket ( ) {
return socket ;
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
toastRes ( res ) {
if ( res . ok ) {
toast . success ( res . msg ) ;
} else {
toast . error ( res . msg ) ;
}
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
login ( username , password , callback ) {
socket . emit ( "login" , {
username ,
password ,
} , ( res ) => {
if ( res . ok ) {
storage . token = res . token ;
this . socket . token = res . token ;
this . loggedIn = true ;
// Trigger Chrome Save Password
history . pushState ( { } , '' )
}
callback ( res )
} )
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
loginByToken ( token ) {
socket . emit ( "loginByToken" , token , ( res ) => {
this . allowLoginDialog = true ;
if ( ! res . ok ) {
this . logout ( )
} else {
this . loggedIn = true ;
}
} )
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
logout ( ) {
storage . removeItem ( "token" ) ;
this . socket . token = null ;
this . loggedIn = false ;
socket . emit ( "logout" , ( ) => {
toast . success ( "Logout Successfully" )
} )
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
add ( monitor , callback ) {
socket . emit ( "add" , monitor , callback )
} ,
2021-06-27 04:10:55 -04:00
2021-06-25 09:55:49 -04:00
deleteMonitor ( monitorID , callback ) {
socket . emit ( "deleteMonitor" , monitorID , callback )
} ,
} ,
computed : {
2021-06-27 04:10:55 -04:00
lastHeartbeatList ( ) {
let result = { }
for ( let monitorID in this . heartbeatList ) {
let index = this . heartbeatList [ monitorID ] . length - 1 ;
result [ monitorID ] = this . heartbeatList [ monitorID ] [ index ] ;
}
return result ;
} ,
statusList ( ) {
let result = { }
2021-06-25 09:55:49 -04:00
2021-06-27 04:10:55 -04:00
let unknown = {
text : "Unknown" ,
color : "secondary"
}
for ( let monitorID in this . lastHeartbeatList ) {
let lastHeartBeat = this . lastHeartbeatList [ monitorID ]
if ( ! lastHeartBeat ) {
result [ monitorID ] = unknown ;
} else if ( lastHeartBeat . status === 1 ) {
result [ monitorID ] = {
text : "Up" ,
color : "primary"
} ;
} else if ( lastHeartBeat . status === 0 ) {
result [ monitorID ] = {
text : "Down" ,
color : "danger"
} ;
} else {
result [ monitorID ] = unknown ;
}
}
return result ;
}
2021-06-25 09:55:49 -04:00
}
}