Repository navigation
Expand file tree
/
Copy pathserver.go
More file actions
98 lines (77 loc) · 2.02 KB
/
Copy pathserver.go
File metadata and controls
98 lines (77 loc) · 2.02 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"github.com/lesismal/nbio/nbhttp/websocket"
)
type mercureeServer struct {
upgrader *websocket.Upgrader
clients *clientList
}
func newMercureeServer() *mercureeServer {
upgrader := websocket.NewUpgrader()
upgrader.KeepaliveTime = getKeepaliveTimeout()
upgrader.CheckOrigin = func(r *http.Request) bool {
return true
}
server := &mercureeServer{
upgrader: upgrader,
clients: newClientList(),
}
upgrader.OnMessage(func(c *websocket.Conn, messageType websocket.MessageType, b []byte) {
data := string(b)
if data == "PING" {
c.WriteMessage(websocket.TextMessage, []byte("PONG"))
} else {
log.Println("WARNING: received an unsupported message from " + c.RemoteAddr().String() + " -> " + data)
}
})
return server
}
func (s *mercureeServer) subscriber() gin.HandlerFunc {
return func(c *gin.Context) {
topics := c.GetStringSlice("topics")
conn, err := s.upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
panic(err)
}
client := &mercureeClient{
conn: conn,
topics: make(map[string]bool),
}
for _, topic := range topics {
client.topics[topic] = true
}
client.conn.OnClose(func(h *websocket.Conn, err error) {
if client.conn != h {
return
}
log.Println("INFO: connection closed from " + h.RemoteAddr().String())
if err != nil && err.Error() != "EOF" {
log.Println("ERROR: connection closed with error: " + err.Error())
}
s.clients.removeClient(client)
})
s.clients.addClient(client)
log.Println("INFO: new connection from " + conn.RemoteAddr().String() + " subscribed to " + strings.Join(topics, ", ") + ".")
}
}
func (s *mercureeServer) publish(topic, data string) {
s.clients.broadcast(topic, data)
}
func getKeepaliveTimeout() time.Duration {
e := os.Getenv("KEEPALIVE_TIMEOUT")
if e == "" {
return time.Minute * 10
}
d, err := strconv.Atoi(e)
if err != nil {
return time.Minute * 10
}
return time.Duration(d) * time.Minute
}