69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
// Package websocket implements a websocket based transport for go-libp2p.
|
|
package websocket
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/libp2p/go-libp2p-core/peer"
|
|
"github.com/libp2p/go-libp2p-core/transport"
|
|
tptu "github.com/libp2p/go-libp2p-transport-upgrader"
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
mafmt "github.com/multiformats/go-multiaddr-fmt"
|
|
manet "github.com/multiformats/go-multiaddr/net"
|
|
)
|
|
|
|
// WsProtocol is the multiaddr protocol definition for this transport.
|
|
//
|
|
// Deprecated: use `ma.ProtocolWithCode(ma.P_WS)
|
|
var WsProtocol = ma.ProtocolWithCode(ma.P_WS)
|
|
|
|
// WsFmt is multiaddr formatter for WsProtocol
|
|
var WsFmt = mafmt.And(mafmt.TCP, mafmt.Base(ma.P_WS))
|
|
|
|
// WsCodec is the multiaddr-net codec definition for the websocket transport
|
|
var WsCodec = &manet.NetCodec{
|
|
NetAddrNetworks: []string{"websocket"},
|
|
ProtocolName: "ws",
|
|
ConvertMultiaddr: ConvertWebsocketMultiaddrToNetAddr,
|
|
ParseNetAddr: ParseWebsocketNetAddr,
|
|
}
|
|
|
|
// This is _not_ WsFmt because we want the transport to stick to dialing fully
|
|
// resolved addresses.
|
|
var dialMatcher = mafmt.And(mafmt.IP, mafmt.Base(ma.P_TCP), mafmt.Base(ma.P_WS))
|
|
|
|
func init() {
|
|
manet.RegisterNetCodec(WsCodec)
|
|
}
|
|
|
|
var _ transport.Transport = (*WebsocketTransport)(nil)
|
|
|
|
// WebsocketTransport is the actual go-libp2p transport
|
|
type WebsocketTransport struct {
|
|
Upgrader *tptu.Upgrader
|
|
}
|
|
|
|
func New(u *tptu.Upgrader) *WebsocketTransport {
|
|
return &WebsocketTransport{u}
|
|
}
|
|
|
|
func (t *WebsocketTransport) CanDial(a ma.Multiaddr) bool {
|
|
return dialMatcher.Matches(a)
|
|
}
|
|
|
|
func (t *WebsocketTransport) Protocols() []int {
|
|
return []int{WsProtocol.Code}
|
|
}
|
|
|
|
func (t *WebsocketTransport) Proxy() bool {
|
|
return false
|
|
}
|
|
|
|
func (t *WebsocketTransport) Dial(ctx context.Context, raddr ma.Multiaddr, p peer.ID) (transport.CapableConn, error) {
|
|
macon, err := t.maDial(ctx, raddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return t.Upgrader.UpgradeOutbound(ctx, t, macon, p)
|
|
}
|