go-multiaddr/registry.go

115 lines
2.7 KiB
Go

package manet
import (
"fmt"
"net"
"sync"
ma "github.com/jbenet/go-multiaddr"
)
type AddrParser func(a net.Addr) (ma.Multiaddr, error)
type MaddrParser func(ma ma.Multiaddr) (net.Addr, error)
var maddrParsers map[string]MaddrParser
var addrParsers map[string]AddrParser
var addrParsersLock sync.Mutex
type AddressSpec struct {
// NetNames is an array of strings that may be returned
// by net.Addr.Network() calls on addresses belonging to this type
NetNames []string
// Key is the string value for Multiaddr address keys
Key string
// ParseNetAddr parses a net.Addr belonging to this type into a multiaddr
ParseNetAddr AddrParser
// ConvertMultiaddr converts a multiaddr of this type back into a net.Addr
ConvertMultiaddr MaddrParser
// Protocol returns the multiaddr protocol struct for this type
Protocol ma.Protocol
}
func RegisterAddressType(a *AddressSpec) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
for _, n := range a.NetNames {
addrParsers[n] = a.ParseNetAddr
}
maddrParsers[a.Key] = a.ConvertMultiaddr
}
func init() {
addrParsers = make(map[string]AddrParser)
maddrParsers = make(map[string]MaddrParser)
RegisterAddressType(tcpAddrSpec)
RegisterAddressType(udpAddrSpec)
RegisterAddressType(utpAddrSpec)
RegisterAddressType(ip4AddrSpec)
RegisterAddressType(ip6AddrSpec)
addrParsers["ip+net"] = parseIpPlusNetAddr
}
var tcpAddrSpec = &AddressSpec{
Key: "tcp",
NetNames: []string{"tcp", "tcp4", "tcp6"},
ParseNetAddr: parseTcpNetAddr,
ConvertMultiaddr: parseBasicNetMaddr,
}
var udpAddrSpec = &AddressSpec{
Key: "udp",
NetNames: []string{"udp", "udp4", "udp6"},
ParseNetAddr: parseUdpNetAddr,
ConvertMultiaddr: parseBasicNetMaddr,
}
var utpAddrSpec = &AddressSpec{
Key: "utp",
NetNames: []string{"utp", "utp4", "utp6"},
ParseNetAddr: parseUtpNetAddr,
ConvertMultiaddr: parseBasicNetMaddr,
}
var ip4AddrSpec = &AddressSpec{
Key: "ip4",
NetNames: []string{"ip4"},
ParseNetAddr: parseIpNetAddr,
ConvertMultiaddr: parseBasicNetMaddr,
}
var ip6AddrSpec = &AddressSpec{
Key: "ip6",
NetNames: []string{"ip6"},
ParseNetAddr: parseIpNetAddr,
ConvertMultiaddr: parseBasicNetMaddr,
}
func getAddrParser(net string) (AddrParser, error) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
parser, ok := addrParsers[net]
if !ok {
return nil, fmt.Errorf("unknown network %v", net)
}
return parser, nil
}
func getMaddrParser(name string) (MaddrParser, error) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
p, ok := maddrParsers[name]
if !ok {
return nil, fmt.Errorf("network not supported: %s", name)
}
return p, nil
}