Current section
Files
Jump to
Current section
Files
lib/protocol/protocol.ex
defmodule Multiaddr.Protocol do
@moduledoc false
import Multiaddr.Utils.Constants, only: :macros
import Multiaddr.Protocol.Codes
alias Multiaddr.Transcoder
alias Multiaddr.Utils.Varint
defstruct [:name, :code, :vcode, :transcoder, path: false, size: 0]
define(
:proto_ip4,
%__MODULE__{
name: "ip4",
code: c_ip4(),
vcode: Varint.code_to_varint(c_ip4()),
size: 32,
transcoder: Transcoder.ip4_transcoder()
}
)
define(
:proto_tcp,
%__MODULE__{
name: "tcp",
code: c_tcp(),
vcode: Varint.code_to_varint(c_tcp()),
size: 16,
transcoder: Transcoder.port_transcoder()
}
)
define(
:proto_udp,
%__MODULE__{
name: "udp",
code: c_udp(),
vcode: Varint.code_to_varint(c_udp()),
size: 16,
transcoder: Transcoder.port_transcoder()
}
)
define(
:proto_dccp,
%__MODULE__{
name: "dccp",
code: c_dccp(),
vcode: Varint.code_to_varint(c_dccp()),
size: 16,
transcoder: Transcoder.port_transcoder()
}
)
define(
:proto_ip6,
%__MODULE__{
name: "ip6",
code: c_ip6(),
vcode: Varint.code_to_varint(c_ip6()),
size: 128,
transcoder: Transcoder.ip6_transcoder()
}
)
define(
:proto_ip6zone,
%__MODULE__{
name: "ip6zone",
code: c_ip6zone(),
vcode: Varint.code_to_varint(c_ip6zone()),
size: :prefixed_var_size,
transcoder: Transcoder.text_transcoder()
}
)
define(
:proto_dns,
%__MODULE__{
name: "dns",
code: c_dns(),
vcode: Varint.code_to_varint(c_dns()),
size: :prefixed_var_size,
transcoder: Transcoder.text_transcoder()
}
)
define(
:proto_dns4,
%__MODULE__{
name: "dns4",
code: c_dns4(),
vcode: Varint.code_to_varint(c_dns4()),
size: :prefixed_var_size,
transcoder: Transcoder.text_transcoder()
}
)
define(
:proto_dns6,
%__MODULE__{
name: "dns6",
code: c_dns6(),
vcode: Varint.code_to_varint(c_dns6()),
size: :prefixed_var_size,
transcoder: Transcoder.text_transcoder()
}
)
define(
:proto_dnsaddr,
%__MODULE__{
name: "dnsaddr",
code: c_dnsaddr(),
vcode: Varint.code_to_varint(c_dnsaddr()),
size: :prefixed_var_size,
transcoder: Transcoder.text_transcoder()
}
)
define(
:proto_sctp,
%__MODULE__{
name: "sctp",
code: c_sctp(),
vcode: Varint.code_to_varint(c_sctp()),
size: 16,
transcoder: Transcoder.port_transcoder()
}
)
define(
:proto_udt,
%__MODULE__{
name: "udt",
code: c_udt(),
vcode: Varint.code_to_varint(c_udt())
}
)
define(
:proto_utp,
%__MODULE__{
name: "utp",
code: c_utp(),
vcode: Varint.code_to_varint(c_utp())
}
)
define(
:proto_unix,
%__MODULE__{
name: "unix",
code: c_unix(),
vcode: Varint.code_to_varint(c_unix()),
size: :prefixed_var_size,
path: true,
transcoder: Transcoder.path_transcoder()
}
)
define(
:proto_p2p,
%__MODULE__{
# also "ipfs" (backwards compatibility)
name: "p2p",
code: c_p2p(),
vcode: Varint.code_to_varint(c_p2p()),
size: :prefixed_var_size,
transcoder: Transcoder.p2p_transcoder()
}
)
define(
:proto_onion,
%__MODULE__{
name: "onion",
code: c_onion(),
vcode: Varint.code_to_varint(c_onion()),
size: 96,
transcoder: Transcoder.onion_transcoder()
}
)
define(
:proto_onion3,
%__MODULE__{
name: "onion3",
code: c_onion3(),
vcode: Varint.code_to_varint(c_onion3()),
size: 296,
transcoder: Transcoder.onion3_transcoder()
}
)
define(
:proto_garlic64,
%__MODULE__{
name: "garlic64",
code: c_garlic64(),
vcode: Varint.code_to_varint(c_garlic64()),
size: :prefixed_var_size,
transcoder: Transcoder.garlic64_transcoder()
}
)
define(
:proto_garlic32,
%__MODULE__{
name: "garlic32",
code: c_garlic32(),
vcode: Varint.code_to_varint(c_garlic32()),
size: :prefixed_var_size,
transcoder: Transcoder.garlic32_transcoder()
}
)
define(
:proto_quic,
%__MODULE__{
name: "quic",
code: c_quic(),
vcode: Varint.code_to_varint(c_quic())
}
)
define(
:proto_http,
%__MODULE__{
name: "http",
code: c_http(),
vcode: Varint.code_to_varint(c_http())
}
)
define(
:proto_https,
%__MODULE__{
name: "https",
code: c_https(),
vcode: Varint.code_to_varint(c_https())
}
)
define(
:proto_ws,
%__MODULE__{
name: "ws",
code: c_ws(),
vcode: Varint.code_to_varint(c_ws())
}
)
define(
:proto_wss,
%__MODULE__{
name: "wss",
code: c_wss(),
vcode: Varint.code_to_varint(c_wss())
}
)
define(
:proto_p2p_webrtc_direct,
%__MODULE__{
name: "p2p-webrtc-direct",
code: c_p2p_webrtc_direct(),
vcode: Varint.code_to_varint(c_p2p_webrtc_direct())
}
)
define(
:proto_p2p_circuit,
%__MODULE__{
name: "p2p-circuit",
code: c_p2p_circuit(),
vcode: Varint.code_to_varint(c_p2p_circuit())
}
)
define(
:protocols_by_code,
%{
proto_ip4().code => proto_ip4(),
proto_tcp().code => proto_tcp(),
proto_udp().code => proto_udp(),
proto_dccp().code => proto_dccp(),
proto_ip6().code => proto_ip6(),
proto_ip6zone().code => proto_ip6zone(),
proto_dns().code => proto_dns(),
proto_dns4().code => proto_dns4(),
proto_dns6().code => proto_dns6(),
proto_dnsaddr().code => proto_dnsaddr(),
proto_sctp().code => proto_sctp(),
proto_udt().code => proto_udt(),
proto_utp().code => proto_utp(),
proto_unix().code => proto_unix(),
proto_p2p().code => proto_p2p(),
proto_onion().code => proto_onion(),
proto_onion3().code => proto_onion3(),
proto_garlic64().code => proto_garlic64(),
proto_garlic32().code => proto_garlic32(),
proto_quic().code => proto_quic(),
proto_http().code => proto_http(),
proto_https().code => proto_https(),
proto_ws().code => proto_ws(),
proto_wss().code => proto_wss(),
proto_p2p_webrtc_direct().code => proto_p2p_webrtc_direct(),
proto_p2p_circuit().code => proto_p2p_circuit()
}
)
define(
:protocols_by_name,
%{
proto_ip4().name => proto_ip4(),
proto_tcp().name => proto_tcp(),
proto_udp().name => proto_udp(),
proto_dccp().name => proto_dccp(),
proto_ip6().name => proto_ip6(),
proto_ip6zone().name => proto_ip6zone(),
proto_dns().name => proto_dns(),
proto_dns4().name => proto_dns4(),
proto_dns6().name => proto_dns6(),
proto_dnsaddr().name => proto_dnsaddr(),
proto_sctp().name => proto_sctp(),
proto_udt().name => proto_udt(),
proto_utp().name => proto_utp(),
proto_unix().name => proto_unix(),
# backwards compatibility
"ipfs" => proto_p2p(),
proto_p2p().name => proto_p2p(),
proto_onion().name => proto_onion(),
proto_onion3().name => proto_onion3(),
proto_garlic64().name => proto_garlic64(),
proto_garlic32().name => proto_garlic32(),
proto_quic().name => proto_quic(),
proto_http().name => proto_http(),
proto_https().name => proto_https(),
proto_ws().name => proto_ws(),
proto_wss().name => proto_wss(),
proto_p2p_webrtc_direct().name => proto_p2p_webrtc_direct(),
proto_p2p_circuit().name => proto_p2p_circuit()
}
)
end