58 lines
901 B
Go
58 lines
901 B
Go
package proxy
|
|
|
|
import (
|
|
"io"
|
|
"net/url"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type Proxy struct {
|
|
coreURL string
|
|
}
|
|
|
|
func NewProxy(coreURL string) *Proxy {
|
|
return &Proxy{
|
|
coreURL: coreURL,
|
|
}
|
|
}
|
|
|
|
func (p *Proxy) DialCore(docID string) (*websocket.Conn, error) {
|
|
u, err := url.Parse(p.coreURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
u.Path = "/doc-" + docID
|
|
u.RawQuery = ""
|
|
|
|
coreConn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return coreConn, nil
|
|
}
|
|
|
|
func (p *Proxy) ProxyWS(src, dst *websocket.Conn, errCh chan<- error) {
|
|
for {
|
|
msgType, r, err := src.NextReader()
|
|
if err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
w, err := dst.NextWriter(msgType)
|
|
if err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if _, err := io.Copy(w, r); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := w.Close(); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
}
|
|
}
|