2020-10-16 19:12:53 +02:00
|
|
|
package ws
|
2020-10-08 18:21:27 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
)
|
|
|
|
|
|
|
|
// BlockIDClientPair is a tuple of BlockID and WebSocket connection
|
|
|
|
type BlockIDClientPair struct {
|
|
|
|
BlockID string
|
|
|
|
Client *websocket.Conn
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListenerSession is a WebSocket session that is notified of changes to blocks
|
|
|
|
type ListenerSession struct {
|
|
|
|
mu sync.RWMutex
|
|
|
|
blockIDClientPairs []BlockIDClientPair
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddListener adds a listener for a blockID's change
|
|
|
|
func (s *ListenerSession) AddListener(client *websocket.Conn, blockID string) {
|
|
|
|
var p = BlockIDClientPair{Client: client, BlockID: blockID}
|
|
|
|
s.mu.Lock()
|
|
|
|
s.blockIDClientPairs = append(s.blockIDClientPairs, p)
|
|
|
|
s.mu.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
// RemoveListener removes a webSocket listener
|
|
|
|
func (s *ListenerSession) RemoveListener(client *websocket.Conn) {
|
|
|
|
s.mu.Lock()
|
|
|
|
var newValue = []BlockIDClientPair{}
|
|
|
|
for _, p := range s.blockIDClientPairs {
|
|
|
|
if p.Client != client {
|
|
|
|
newValue = append(newValue, p)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s.mu.Unlock()
|
|
|
|
|
|
|
|
s.blockIDClientPairs = newValue
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetListeners returns the listeners to a blockID's changes
|
|
|
|
func (s *ListenerSession) GetListeners(blockID string) []*websocket.Conn {
|
|
|
|
var results = []*websocket.Conn{}
|
|
|
|
|
|
|
|
s.mu.Lock()
|
|
|
|
for _, p := range s.blockIDClientPairs {
|
|
|
|
if p.BlockID == blockID {
|
|
|
|
results = append(results, p.Client)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s.mu.Unlock()
|
|
|
|
|
|
|
|
return results
|
|
|
|
}
|