mirror of
https://github.com/logos-messaging/go-multiaddr.git
synced 2026-01-04 22:13:11 +00:00
80 lines
1.8 KiB
Go
80 lines
1.8 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
|
|
}
|
|
|
|
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
|
|
}
|