74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
|
package websocket
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"net/url"
|
||
|
|
||
|
ma "github.com/multiformats/go-multiaddr"
|
||
|
manet "github.com/multiformats/go-multiaddr-net"
|
||
|
)
|
||
|
|
||
|
// Addr is an implementation of net.Addr for WebSocket.
|
||
|
type Addr struct {
|
||
|
*url.URL
|
||
|
}
|
||
|
|
||
|
var _ net.Addr = (*Addr)(nil)
|
||
|
|
||
|
// Network returns the network type for a WebSocket, "websocket".
|
||
|
func (addr *Addr) Network() string {
|
||
|
return "websocket"
|
||
|
}
|
||
|
|
||
|
// NewAddr creates a new Addr using the given host string
|
||
|
func NewAddr(host string) *Addr {
|
||
|
return &Addr{
|
||
|
URL: &url.URL{
|
||
|
Host: host,
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func ConvertWebsocketMultiaddrToNetAddr(maddr ma.Multiaddr) (net.Addr, error) {
|
||
|
_, host, err := manet.DialArgs(maddr)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return NewAddr(host), nil
|
||
|
}
|
||
|
|
||
|
func ParseWebsocketNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||
|
wsa, ok := a.(*Addr)
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf("not a websocket address")
|
||
|
}
|
||
|
|
||
|
tcpaddr, err := net.ResolveTCPAddr("tcp", wsa.Host)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
tcpma, err := manet.FromNetAddr(tcpaddr)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
wsma, err := ma.NewMultiaddr("/ws")
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return tcpma.Encapsulate(wsma), nil
|
||
|
}
|
||
|
|
||
|
func parseMultiaddr(a ma.Multiaddr) (string, error) {
|
||
|
_, host, err := manet.DialArgs(a)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return "ws://" + host, nil
|
||
|
}
|