@ 3797ec25a55762f2aa49e7f479d306cef67a6882 | history
package main
import (
"encoding/json"
"github.com/gorilla/websocket"
"github.com/ianschenck/envflag"
"log"
"net/http"
"net/url"
"tmpchat"
)
var chat = &tmpchat.Chat{
Channels: make(map[string]*tmpchat.Channel),
}
var turnstile = &tmpchat.Turnstile{}
type signalingHandler struct{
frontendURL string
}
func (h signalingHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
params := r.URL.Query()
var channelName, userID string
if vals, ok := params["channelName"]; ok {
channelName = vals[0]
}
if vals, ok := params["userID"]; ok {
userID = vals[0]
}
// if ok := turnstile.Admit(userID); !ok {
// w.WriteHeader(http.StatusForbidden)
// return
//}
upgrader := websocket.Upgrader{
CheckOrigin: func(*http.Request) bool {
var origin string
if vals, ok := r.Header["Origin"]; ok {
origin = vals[0]
}
originURL, err := url.Parse(origin)
if err != nil {
return false
}
return originURL.String() == h.frontendURL
},
}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade: ", err)
return
}
chat.Materialize(channelName).Members.Set(userID, conn)
defer chat.Collect(channelName, userID)
for {
_, rawSignal, err := conn.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
message := tmpchat.Message{}
if err := json.Unmarshal(rawSignal, &message); err != nil {
continue
}
if ch, ok := chat.Get(channelName); ok {
ch.Messages <- message
}
}
}
func main() {
var frontendURL string
envflag.StringVar(&frontendURL, "TMPCHAT_SIGNALING_URL", "http://localhost:8080", "")
envflag.Parse()
http.Handle("/", signalingHandler{frontendURL})
log.Fatal(http.ListenAndServe(":5050", nil))
}