/
webSocketService.go
76 lines (67 loc) · 1.68 KB
/
webSocketService.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package status
import (
"sync"
"github.com/airenas/listgo/internal/pkg/cmdapp"
)
var idConnectionMap = make(map[string]map[WsConn]bool)
var connectionIDMap = make(map[WsConn]string)
var mapLock = sync.Mutex{}
// WsConn is interface for websocket handling in status service
type WsConn interface {
ReadMessage() (messageType int, p []byte, err error)
Close() error
WriteJSON(v interface{}) error
}
func handleConnection(conn WsConn) {
defer deleteConnection(conn)
defer conn.Close()
for {
cmdapp.Log.Infof("handleConnection")
_, message, err := conn.ReadMessage()
if err != nil {
cmdapp.Log.Error(err)
break
} else {
saveConnection(conn, string(message))
}
}
cmdapp.Log.Infof("handleConnection finish")
}
func deleteConnection(conn WsConn) {
mapLock.Lock()
defer mapLock.Unlock()
deleteConnectionNoSync(conn)
}
func deleteConnectionNoSync(conn WsConn) {
cmdapp.Log.Info("deleteConnection")
id, found := connectionIDMap[conn]
if found {
conns, found := idConnectionMap[id]
if found {
delete(conns, conn)
if len(conns) == 0 {
delete(idConnectionMap, id)
}
}
}
delete(connectionIDMap, conn)
cmdapp.Log.Infof("deleteConnection finish: %d", len(connectionIDMap))
}
func saveConnection(conn WsConn, id string) {
cmdapp.Log.Infof("saveConnection")
mapLock.Lock()
defer mapLock.Unlock()
deleteConnectionNoSync(conn)
connectionIDMap[conn] = id
conns, found := idConnectionMap[id]
if !found {
conns = map[WsConn]bool{}
idConnectionMap[id] = conns
}
conns[conn] = true
cmdapp.Log.Infof("saveConnection finish: %d", len(connectionIDMap))
}
func getConnections(id string) (map[WsConn]bool, bool) {
r, found := idConnectionMap[id]
return r, found
}