2020-10-04 03:46:29 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"sync"
|
2021-01-10 01:22:39 +00:00
|
|
|
|
|
|
|
"github.com/google/uuid"
|
2020-10-04 03:46:29 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type WebsocketBag struct {
|
2020-11-08 21:52:20 +00:00
|
|
|
mu sync.Mutex
|
2020-10-04 03:46:29 +00:00
|
|
|
conns map[uuid.UUID]*context.CancelFunc
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns the websocket bag which contains all of the currently open websocket connections
|
|
|
|
// for the server instance.
|
|
|
|
func (s *Server) Websockets() *WebsocketBag {
|
|
|
|
s.wsBagLocker.Lock()
|
|
|
|
defer s.wsBagLocker.Unlock()
|
|
|
|
|
|
|
|
if s.wsBag == nil {
|
|
|
|
s.wsBag = &WebsocketBag{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return s.wsBag
|
|
|
|
}
|
|
|
|
|
|
|
|
// Adds a new websocket connection to the stack.
|
|
|
|
func (w *WebsocketBag) Push(u uuid.UUID, cancel *context.CancelFunc) {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
|
|
|
|
|
|
|
if w.conns == nil {
|
|
|
|
w.conns = make(map[uuid.UUID]*context.CancelFunc)
|
|
|
|
}
|
|
|
|
|
|
|
|
w.conns[u] = cancel
|
|
|
|
}
|
|
|
|
|
|
|
|
// Removes a connection from the stack.
|
|
|
|
func (w *WebsocketBag) Remove(u uuid.UUID) {
|
|
|
|
w.mu.Lock()
|
|
|
|
delete(w.conns, u)
|
|
|
|
w.mu.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cancels all of the stored cancel functions which has the effect of disconnecting
|
|
|
|
// every listening websocket for the server.
|
|
|
|
func (w *WebsocketBag) CancelAll() {
|
|
|
|
w.mu.Lock()
|
|
|
|
w.mu.Unlock()
|
|
|
|
|
|
|
|
if w.conns != nil {
|
|
|
|
for _, cancel := range w.conns {
|
|
|
|
c := *cancel
|
|
|
|
c()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reset the connections.
|
|
|
|
w.conns = make(map[uuid.UUID]*context.CancelFunc)
|
2020-11-08 21:52:20 +00:00
|
|
|
}
|