package proxy import ( "fmt" "github.com/gorilla/websocket" ) type WebsocketReadWriter struct { W *websocket.Conn } func (w *WebsocketReadWriter) Read(p []byte) (int, error) { t, m, err := w.W.ReadMessage() if err != nil { return 0, fmt.Errorf("error reading websocket: %w", err) } if t != websocket.BinaryMessage { return 0, fmt.Errorf("error reading websocket: only binary messages are supported") } if cap(p) < len(m) { return 0, fmt.Errorf("error reading websocket: outputbuffer too short for input") } if i := copy(p, m); i != len(m) { return 0, fmt.Errorf("error reading websocket: copy failed %d of %d", i, len(m)) } return len(m), nil } func (w *WebsocketReadWriter) Write(p []byte) (int, error) { if err := w.W.WriteMessage(websocket.BinaryMessage, p); err != nil { return 0, fmt.Errorf("error writing websocket: %w", err) } return len(p), nil } func (w *WebsocketReadWriter) Close() error { return w.W.Close() }