go-multiaddr/net/registry.go

98 lines
2.7 KiB
Go
Raw Normal View History

2016-05-03 13:23:57 -07:00
package manet
import (
"fmt"
"net"
"sync"
ma "github.com/multiformats/go-multiaddr"
2016-05-03 13:23:57 -07:00
)
// FromNetAddrFunc is a generic function which converts a net.Addr to Multiaddress
2016-05-14 18:02:25 -07:00
type FromNetAddrFunc func(a net.Addr) (ma.Multiaddr, error)
// ToNetAddrFunc is a generic function which converts a Multiaddress to net.Addr
2016-05-14 18:02:25 -07:00
type ToNetAddrFunc func(ma ma.Multiaddr) (net.Addr, error)
2016-05-03 13:23:57 -07:00
var defaultCodecs = NewCodecMap()
2016-05-03 13:23:57 -07:00
2016-05-14 18:02:25 -07:00
func init() {
RegisterFromNetAddr(parseTCPNetAddr, "tcp", "tcp4", "tcp6")
RegisterFromNetAddr(parseUDPNetAddr, "udp", "udp4", "udp6")
RegisterFromNetAddr(parseIPNetAddr, "ip", "ip4", "ip6")
RegisterFromNetAddr(parseIPPlusNetAddr, "ip+net")
RegisterFromNetAddr(parseUnixNetAddr, "unix")
RegisterToNetAddr(parseBasicNetMaddr, "tcp", "udp", "ip6", "ip4", "unix")
2016-05-14 18:02:25 -07:00
}
// CodecMap holds a map of NetCodecs indexed by their Protocol ID
// along with parsers for the addresses they use.
// It is used to keep a list of supported network address codecs (protocols
// which addresses can be converted to and from multiaddresses).
2016-05-14 18:02:25 -07:00
type CodecMap struct {
addrParsers map[string]FromNetAddrFunc
maddrParsers map[string]ToNetAddrFunc
lk sync.Mutex
}
// NewCodecMap initializes and returns a CodecMap object.
2016-05-14 18:02:25 -07:00
func NewCodecMap() *CodecMap {
return &CodecMap{
addrParsers: make(map[string]FromNetAddrFunc),
maddrParsers: make(map[string]ToNetAddrFunc),
}
}
// RegisterFromNetAddr registers a conversion from net.Addr instances to multiaddrs.
func RegisterFromNetAddr(from FromNetAddrFunc, networks ...string) {
defaultCodecs.RegisterFromNetAddr(from, networks...)
}
// RegisterToNetAddr registers a conversion from multiaddrs to net.Addr instances.
func RegisterToNetAddr(to ToNetAddrFunc, protocols ...string) {
defaultCodecs.RegisterToNetAddr(to, protocols...)
}
// RegisterFromNetAddr registers a conversion from net.Addr instances to multiaddrs
func (cm *CodecMap) RegisterFromNetAddr(from FromNetAddrFunc, networks ...string) {
cm.lk.Lock()
defer cm.lk.Unlock()
for _, n := range networks {
cm.addrParsers[n] = from
}
}
// RegisterToNetAddr registers a conversion from multiaddrs to net.Addr instances
func (cm *CodecMap) RegisterToNetAddr(to ToNetAddrFunc, protocols ...string) {
cm.lk.Lock()
defer cm.lk.Unlock()
for _, p := range protocols {
cm.maddrParsers[p] = to
}
2016-05-16 14:40:20 -07:00
}
2016-05-14 18:02:25 -07:00
func (cm *CodecMap) getAddrParser(net string) (FromNetAddrFunc, error) {
cm.lk.Lock()
defer cm.lk.Unlock()
2016-05-03 13:23:57 -07:00
2016-05-14 18:02:25 -07:00
parser, ok := cm.addrParsers[net]
2016-05-03 13:23:57 -07:00
if !ok {
return nil, fmt.Errorf("unknown network %v", net)
}
return parser, nil
}
2016-05-14 18:02:25 -07:00
func (cm *CodecMap) getMaddrParser(name string) (ToNetAddrFunc, error) {
cm.lk.Lock()
defer cm.lk.Unlock()
p, ok := cm.maddrParsers[name]
2016-05-03 13:23:57 -07:00
if !ok {
return nil, fmt.Errorf("network not supported: %s", name)
}
return p, nil
}