mirror of
https://github.com/waku-org/go-multiaddr.git
synced 2025-02-23 11:38:20 +00:00
115 lines
2.7 KiB
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
|
|
}
|