/
generate-command.sh
executable file
·109 lines (92 loc) · 2.3 KB
/
generate-command.sh
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
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
# Create command Folder with files
mkdir command
touch command/main.go
cat <<EOM > command/main.go
package main
import (
gowsh "go-wsh"
"log"
"net/http"
"sync"
"time"
"github.com/gorilla/mux"
)
type runtime struct {
wg *sync.WaitGroup
http.Server
}
func newRuntime() *runtime {
return &runtime{
wg: &sync.WaitGroup{},
}
}
func (rt *runtime) loadConfiguration() {
log.Println("[INFO] Loading Configurations")
rt.Addr = "localhost:8080"
rt.WriteTimeout = time.Second * 15
rt.ReadTimeout = time.Second * 15
rt.IdleTimeout = time.Second * 60
}
func (rt *runtime) serveHTTP(routerHandles *mux.Router) {
defer rt.wg.Done()
rt.Handler = routerHandles
log.Printf("[INFO] HTTP server started at \"%s\"\n", rt.Addr)
log.Fatal(rt.ListenAndServe())
}
var (
hub *gowsh.EventHub
)
func main() {
log.Println("[INFO] Starting API")
rt := newRuntime()
rt.loadConfiguration()
rt.wg.Add(2)
log.Println("[INFO] Starting HTTP server")
go rt.serveHTTP(router())
log.Println("[INFO] Starting Websocket Hub")
hub = gowsh.NewEventHub()
go hub.Run()
rt.wg.Wait()
}
func router() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
ServeWs(hub, w, r)
})
r.HandleFunc("/ws/{group_id}", func(w http.ResponseWriter, r *http.Request) {
ServeWs(hub, w, r)
})
return r
}
var upgrader = gowsh.Upgrader
func ServeWs(hub *gowsh.EventHub, w http.ResponseWriter, r *http.Request) {
wsConn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("[ERRO] Creating websocket session: %v", err)
}
newClientSes := gowsh.NewClientSession()
newClientSes.WebsocketConnection = wsConn
newClientSes.EventsHub = hub
groupID := mux.Vars(r)["group_id"]
if groupID == "" {
newClientSes.Group = addClientGroup(groupID, newClientSes, hub)
} else {
group, isAdded := hub.ClientGroups[groupID]
if isAdded {
group.AddClientSession(newClientSes)
} else {
addClientGroup(groupID, newClientSes, hub)
}
newClientSes.Group = groupID
}
go newClientSes.WriteToSocket()
newClientSes.ReadFromSocket()
}
func addClientGroup(groupID string, newClientSes *gowsh.ClientSession, hub *gowsh.EventHub) string {
newClientGroup := gowsh.NewClientGroup(groupID)
newClientGroup.AddClientSession(newClientSes)
hub.AddGroup(newClientGroup)
return newClientGroup.ID
}
EOM