gracefully exit websocket on server exit

This commit is contained in:
Roland Osborne 2022-01-14 14:14:51 -08:00
parent a9ce9c938e
commit 2327c774f3

View File

@ -30,6 +30,7 @@ type accountRevision struct {
} }
var wsSync sync.Mutex var wsSync sync.Mutex
var wsExit = make(chan bool, 1)
var statusListener = make(map[uint][]chan<-[]byte) var statusListener = make(map[uint][]chan<-[]byte)
var upgrader = websocket.Upgrader{} var upgrader = websocket.Upgrader{}
@ -52,7 +53,7 @@ func Status(w http.ResponseWriter, r *http.Request) {
err = store.DB.Model(&Revision{}).Where("ID = ?", act).First(&ar).Error err = store.DB.Model(&Revision{}).Where("ID = ?", act).First(&ar).Error
if err != nil { if err != nil {
log.Println("Status - failed to get account revision") log.Println("Status - failed to get account revision")
return // return
} }
rev := getRevision(ar) rev := getRevision(ar)
@ -78,11 +79,18 @@ func Status(w http.ResponseWriter, r *http.Request) {
defer RemoveStatusListener(act, c) defer RemoveStatusListener(act, c)
// send revision until channel is closed // send revision until channel is closed
for msg := range c { for {
select {
case msg := <-c:
err = conn.WriteMessage(websocket.TextMessage, msg) err = conn.WriteMessage(websocket.TextMessage, msg)
if err != nil { if err != nil {
log.Println("Status - failed to send revision, closing") log.Println("Status - failed to send revision, closing")
return return
}
case <-wsExit:
log.Println("Status - server exit")
wsExit<-true
return
} }
} }
} }
@ -99,6 +107,10 @@ func getRevision(rev accountRevision) Revision {
return r return r
} }
func ExitStatus() {
wsExit <- true
}
func SetStatus(act uint) { func SetStatus(act uint) {
// get revisions for the account // get revisions for the account