View Source Xander.Handshake.Response (Xander v0.2.0)
This module is responsible for validating and parsing the handshake response from a Cardano node.
Summary
Functions
Validates the handshake response from a Cardano node.
Functions
Validates the handshake response from a Cardano node.
Examples
# Valid msgAcceptVersion response
iex> payload = CBOR.encode([1, 32784, [764824073, %{"versions" => [1, 2, 3]}]])
iex> response = Xander.Util.plex_encode(payload)
iex> {:ok, result} = Xander.Handshake.Response.validate(response)
iex> result.type == :msg_accept_version and result.version_number == 32784
true
# Unsupported version in msgAcceptVersion
iex> payload = CBOR.encode([1, 12345, [764824073, %{"versions" => [1, 2, 3]}]])
iex> response = Xander.Util.plex_encode(payload)
iex> Xander.Handshake.Response.validate(response)
{:error, "Only versions [32783, 32784, 32785] are supported."}
# Version mismatch refuse response
iex> payload = CBOR.encode([2, [0, <<1, 2, 3, 4>>]])
iex> response = Xander.Util.plex_encode(payload)
iex> {:refused, result} = Xander.Handshake.Response.validate(response)
iex> result.type
:version_mismatch
# Handshake decode error refuse response
iex> payload = CBOR.encode([2, [1, 32784, "decode error"]])
iex> response = Xander.Util.plex_encode(payload)
iex> {:refused, result} = Xander.Handshake.Response.validate(response)
iex> result.type
:handshake_decode_error
# Refused version refuse response
iex> payload = CBOR.encode([2, [2, 32784, "refused"]])
iex> response = Xander.Util.plex_encode(payload)
iex> {:refused, result} = Xander.Handshake.Response.validate(response)
iex> result.type
:refused
# Unknown refuse reason
iex> payload = CBOR.encode([2, [99, "unknown"]])
iex> response = Xander.Util.plex_encode(payload)
iex> {:refused, result} = Xander.Handshake.Response.validate(response)
iex> result.type
:unknown_refuse_reason
# Query reply response
iex> tag = %CBOR.Tag{tag: :bytes, value: "supported"}
iex> payload = CBOR.encode([3, %{tag => [32783, 32784, 32785]}])
iex> response = Xander.Util.plex_encode(payload)
iex> Xander.Handshake.Response.validate(response)
{:versions, %{%CBOR.Tag{tag: :bytes, value: "supported"} => [32783, 32784, 32785]}}
# Unknown message type
iex> payload = CBOR.encode([99, "unknown"])
iex> response = Xander.Util.plex_encode(payload)
iex> Xander.Handshake.Response.validate(response)
{:error, "Unknown message format"}
# Error in CBOR decoding
iex> response = <<0, 1, 2, 3>> # Invalid CBOR
iex> Xander.Handshake.Response.validate(response)
{:error, :invalid_format}