mirror of
https://github.com/FluuxIO/go-xmpp
synced 2024-11-11 07:11:03 +00:00
7fa4b06705
This makes it possible to use a factory function to create a transport of the right type and not having to repeat the address when calling Transport.Connect()
52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package xmpp
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
|
|
"nhooyr.io/websocket"
|
|
)
|
|
|
|
type WebsocketTransport struct {
|
|
Config TransportConfiguration
|
|
wsConn *websocket.Conn
|
|
netConn net.Conn
|
|
ctx context.Context
|
|
}
|
|
|
|
func (t *WebsocketTransport) Connect() error {
|
|
t.ctx = context.Background()
|
|
|
|
ctx, cancel := context.WithTimeout(t.ctx, time.Duration(t.Config.ConnectTimeout)*time.Second)
|
|
defer cancel()
|
|
|
|
if !c.Insecure && strings.HasPrefix(address, "wss:") {
|
|
return errors.New("Websocket address is not secure")
|
|
}
|
|
wsConn, _, err := websocket.Dial(ctx, t.Config.Address, nil)
|
|
if err != nil {
|
|
t.wsConn = wsConn
|
|
t.netConn = websocket.NetConn(t.ctx, t.wsConn, websocket.MessageText)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (t WebsocketTransport) DoesStartTLS() bool {
|
|
return false
|
|
}
|
|
|
|
func (t WebsocketTransport) Read(p []byte) (n int, err error) {
|
|
return t.netConn.Read(p)
|
|
}
|
|
|
|
func (t WebsocketTransport) Write(p []byte) (n int, err error) {
|
|
return t.netConn.Write(p)
|
|
}
|
|
|
|
func (t WebsocketTransport) Close() error {
|
|
return t.netConn.Close()
|
|
}
|