/
web.go
88 lines (78 loc) · 1.64 KB
/
web.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
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/websocket"
)
type webMsg struct {
Date string
From string
Subject string
Message string
Original string
}
type webAPI struct {
listeners []chan webMsg
}
func newWebAPI() *webAPI {
web := &webAPI{
listeners: []chan webMsg{},
}
go func() {
if err := web.serve(); err != nil {
log.Fatalf("Could not run web: %v\n", err)
}
}()
return web
}
func (web *webAPI) serve() error {
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
fs := http.FileServer(http.Dir("./html"))
http.Handle("/", fs)
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
websocket, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
log.Println("Websocket Connected!")
web.listen(websocket)
})
return http.ListenAndServe(":8080", nil)
}
func (web *webAPI) push(from, date, subject, message string, original string) error {
log.Printf("Listeners: %d\n", len(web.listeners))
for i := range web.listeners {
msg := webMsg{
Date: date,
From: from,
Subject: subject,
Message: message,
Original: original,
}
select {
case web.listeners[i] <- msg:
default:
}
}
return nil
}
func (web *webAPI) listen(conn *websocket.Conn) {
outCh := make(chan webMsg, 1)
web.listeners = append(web.listeners, outCh)
for msg := range outCh {
b, err := json.Marshal(msg)
if err != nil {
log.Printf("Error marshaling message: %v\n", err)
continue
}
if err := conn.WriteMessage(1, b); err != nil {
log.Printf("Client disconnected: %v\n", err)
return
}
}
}