tmpchat / cmd / signaling / main.go

@ 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))
}