@@ -14,15 +14,15 @@ type FromNetAddrFunc func(a net.Addr) (ma.Multiaddr, error)
14
14
// ToNetAddrFunc is a generic function which converts a Multiaddress to net.Addr
15
15
type ToNetAddrFunc func (ma ma.Multiaddr ) (net.Addr , error )
16
16
17
- var defaultCodecs * CodecMap
17
+ var defaultCodecs = NewCodecMap ()
18
18
19
19
func init () {
20
- defaultCodecs = NewCodecMap ( )
21
- defaultCodecs .RegisterNetCodec ( tcpAddrSpec )
22
- defaultCodecs .RegisterNetCodec ( udpAddrSpec )
23
- defaultCodecs .RegisterNetCodec ( ip4AddrSpec )
24
- defaultCodecs . RegisterNetCodec ( ip6AddrSpec )
25
- defaultCodecs .RegisterNetCodec ( ipnetAddrSpec )
20
+ defaultCodecs . RegisterFromNetAddr ( parseTCPNetAddr , "tcp" , "tcp4" , "tcp6" )
21
+ defaultCodecs .RegisterFromNetAddr ( parseUDPNetAddr , "udp" , "udp4" , "udp6" )
22
+ defaultCodecs .RegisterFromNetAddr ( parseIPNetAddr , "ip" , "ip4" , "ip6" )
23
+ defaultCodecs .RegisterFromNetAddr ( parseIPPlusNetAddr , "ip+net" )
24
+
25
+ defaultCodecs .RegisterToNetAddr ( parseBasicNetMaddr , "tcp" , "udp" , "ip6" , "ip4" )
26
26
}
27
27
28
28
// CodecMap holds a map of NetCodecs indexed by their Protocol ID
@@ -39,7 +39,6 @@ type CodecMap struct {
39
39
// NewCodecMap initializes and returns a CodecMap object.
40
40
func NewCodecMap () * CodecMap {
41
41
return & CodecMap {
42
- codecs : make (map [string ]* NetCodec ),
43
42
addrParsers : make (map [string ]FromNetAddrFunc ),
44
43
maddrParsers : make (map [string ]ToNetAddrFunc ),
45
44
}
@@ -48,6 +47,13 @@ func NewCodecMap() *CodecMap {
48
47
// NetCodec is used to identify a network codec, that is, a network type for
49
48
// which we are able to translate multiaddresses into standard Go net.Addr
50
49
// and back.
50
+ //
51
+ // Deprecated: Unfortunately, these mappings aren't one to one. This abstraction
52
+ // assumes that multiple "networks" can map to a single multiaddr protocol but
53
+ // not the reverse. For example, this abstraction supports `tcp6, tcp4, tcp ->
54
+ // /tcp/` really well but doesn't support `ip -> {/ip4/, /ip6/}`.
55
+ //
56
+ // Please use `RegisterFromNetAddr` and `RegisterToNetAddr` directly.
51
57
type NetCodec struct {
52
58
// NetAddrNetworks is an array of strings that may be returned
53
59
// by net.Addr.Network() calls on addresses belonging to this type
@@ -76,49 +82,31 @@ func RegisterNetCodec(a *NetCodec) {
76
82
func (cm * CodecMap ) RegisterNetCodec (a * NetCodec ) {
77
83
cm .lk .Lock ()
78
84
defer cm .lk .Unlock ()
79
- cm .codecs [a .ProtocolName ] = a
80
85
for _ , n := range a .NetAddrNetworks {
81
86
cm .addrParsers [n ] = a .ParseNetAddr
82
87
}
83
88
84
89
cm .maddrParsers [a .ProtocolName ] = a .ConvertMultiaddr
85
90
}
86
91
87
- var tcpAddrSpec = & NetCodec {
88
- ProtocolName : "tcp" ,
89
- NetAddrNetworks : []string {"tcp" , "tcp4" , "tcp6" },
90
- ParseNetAddr : parseTCPNetAddr ,
91
- ConvertMultiaddr : parseBasicNetMaddr ,
92
- }
93
-
94
- var udpAddrSpec = & NetCodec {
95
- ProtocolName : "udp" ,
96
- NetAddrNetworks : []string {"udp" , "udp4" , "udp6" },
97
- ParseNetAddr : parseUDPNetAddr ,
98
- ConvertMultiaddr : parseBasicNetMaddr ,
99
- }
92
+ // RegisterFromNetAddr registers a conversion from net.Addr instances to multiaddrs
93
+ func (cm * CodecMap ) RegisterFromNetAddr (from FromNetAddrFunc , networks ... string ) {
94
+ cm .lk .Lock ()
95
+ defer cm .lk .Unlock ()
100
96
101
- var ip4AddrSpec = & NetCodec {
102
- ProtocolName : "ip4" ,
103
- NetAddrNetworks : []string {"ip4" },
104
- ParseNetAddr : parseIPNetAddr ,
105
- ConvertMultiaddr : parseBasicNetMaddr ,
97
+ for _ , n := range networks {
98
+ cm .addrParsers [n ] = from
99
+ }
106
100
}
107
101
108
- var ip6AddrSpec = & NetCodec {
109
- ProtocolName : "ip6" ,
110
- NetAddrNetworks : []string {"ip6" },
111
- ParseNetAddr : parseIPNetAddr ,
112
- ConvertMultiaddr : parseBasicNetMaddr ,
113
- }
102
+ // RegisterToNetAddr registers a conversion from multiaddrs to net.Addr instances
103
+ func (cm * CodecMap ) RegisterToNetAddr (to ToNetAddrFunc , protocols ... string ) {
104
+ cm .lk .Lock ()
105
+ defer cm .lk .Unlock ()
114
106
115
- var ipnetAddrSpec = & NetCodec {
116
- ProtocolName : "ip+net" ,
117
- NetAddrNetworks : []string {"ip+net" },
118
- ParseNetAddr : parseIPPlusNetAddr ,
119
- ConvertMultiaddr : func (ma.Multiaddr ) (net.Addr , error ) {
120
- return nil , fmt .Errorf ("converting ip+net multiaddr not supported" )
121
- },
107
+ for _ , p := range protocols {
108
+ cm .maddrParsers [p ] = to
109
+ }
122
110
}
123
111
124
112
func (cm * CodecMap ) getAddrParser (net string ) (FromNetAddrFunc , error ) {
0 commit comments