54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type WS struct {
|
|
upgrader websocket.Upgrader
|
|
}
|
|
|
|
func NewWS() *WS {
|
|
return &WS{
|
|
upgrader: websocket.Upgrader{
|
|
ReadBufferSize: 10240,
|
|
WriteBufferSize: 10240,
|
|
CheckOrigin: func(_ *http.Request) bool { return true },
|
|
},
|
|
}
|
|
}
|
|
|
|
func (ws *WS) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
if err := ws.serveHTTP(w, r); err != nil {
|
|
log.Println(r.URL.Path, err)
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
}
|
|
|
|
func (ws *WS) serveHTTP(w http.ResponseWriter, r *http.Request) error {
|
|
conn, err := ws.upgrader.Upgrade(w, r, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for {
|
|
mt, r, err := conn.NextReader()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
w, err := conn.NextWriter(mt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err := io.Copy(w, r); err != nil { // todo impl broadcast to channel;; sync map to all channels, goes to a forking reader-writer pipe, all listeners to broadcast read from pipe
|
|
return err
|
|
}
|
|
if err := w.Close(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|