libs5-go/net/ws.go

98 lines
1.8 KiB
Go
Raw Normal View History

2024-01-06 11:33:46 +00:00
package net
import (
"context"
2024-01-06 11:33:46 +00:00
"git.lumeweb.com/LumeWeb/libs5-go/encoding"
"net/url"
"nhooyr.io/websocket"
)
var (
_ PeerFactory = (*WebSocketPeer)(nil)
_ PeerStatic = (*WebSocketPeer)(nil)
_ Peer = (*WebSocketPeer)(nil)
2024-01-06 11:33:46 +00:00
)
type WebSocketPeer struct {
BasePeer
2024-01-07 11:47:19 +00:00
socket *websocket.Conn
2024-01-06 11:33:46 +00:00
}
func (p *WebSocketPeer) Connect(uri *url.URL) (interface{}, error) {
dial, _, err := websocket.Dial(context.Background(), uri.String(), nil)
2024-01-06 11:33:46 +00:00
if err != nil {
return nil, err
2024-01-06 11:33:46 +00:00
}
return dial, nil
}
func (p *WebSocketPeer) NewPeer(options *TransportPeerConfig) (Peer, error) {
peer := &WebSocketPeer{
BasePeer: BasePeer{
connectionURIs: options.Uris,
socket: options.Socket,
},
2024-01-07 11:47:19 +00:00
socket: options.Socket.(*websocket.Conn),
}
return peer, nil
}
func (p *WebSocketPeer) SendMessage(message []byte) error {
2024-01-07 11:47:19 +00:00
err := p.socket.Write(context.Background(), websocket.MessageBinary, message)
if err != nil {
return err
}
return nil
2024-01-06 11:33:46 +00:00
}
func (p *WebSocketPeer) RenderLocationURI() string {
return "WebSocket client"
2024-01-06 11:33:46 +00:00
}
func (p *WebSocketPeer) ListenForMessages(callback EventCallback, options ListenerOptions) {
2024-01-06 11:33:46 +00:00
for {
2024-01-07 11:47:19 +00:00
_, message, err := p.socket.Read(context.Background())
2024-01-06 11:33:46 +00:00
if err != nil {
if options.OnError != nil {
(*options.OnError)(err)
2024-01-06 11:33:46 +00:00
}
break
}
err = callback(message)
if err != nil {
if options.OnError != nil {
(*options.OnError)(err)
2024-01-06 11:33:46 +00:00
}
}
}
if options.OnClose != nil {
(*options.OnClose)()
2024-01-06 11:33:46 +00:00
}
}
func (p *WebSocketPeer) End() error {
2024-01-07 11:47:19 +00:00
err := p.socket.Close(websocket.StatusNormalClosure, "")
2024-01-06 11:33:46 +00:00
if err != nil {
return err
2024-01-06 11:33:46 +00:00
}
return nil
2024-01-06 11:33:46 +00:00
}
func (p *WebSocketPeer) SetId(id *encoding.NodeId) {
p.id = id
2024-01-06 11:33:46 +00:00
}
func (p *WebSocketPeer) SetChallenge(challenge []byte) {
p.challenge = challenge
}
func (p *WebSocketPeer) GetChallenge() []byte {
return p.challenge
}