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