effusion v0.1.0 Effusion.PWP.Messages View Source

Encode and decode Peer Wire Protocol (PWP) messages.

Link to this section Summary

Functions

Decodes a binary into a peer wire protocol message

Encode a peer wire protocol message into a binary

Link to this section Functions

Decodes a binary into a peer wire protocol message.

Incoming binaries are assumed not to have the four-byte message length at the beginning of the binary. Set the “packet” option on a gen_tcp socket to 4 so that the socket validates and handles the message length for you.

Examples

iex> Effusion.PWP.Messages.decode(<<>>)
{:ok, :keepalive}

iex> Effusion.PWP.Messages.decode(<<0>>)
{:ok, :choke}

iex> Effusion.PWP.Messages.decode(<<1>>)
{:ok, :unchoke}

iex> Effusion.PWP.Messages.decode(<<2>>)
{:ok, :interested}

iex> Effusion.PWP.Messages.decode(<<3>>)
{:ok, :uninterested}

iex> Effusion.PWP.Messages.decode(<<4, 4201 :: 32>>)
{:ok, {:have, 4201}}

iex> Effusion.PWP.Messages.decode(<<5, 0b11110001>>)
{:ok, {:bitfield, <<241>>}}

iex> Effusion.PWP.Messages.decode(<<6, 4201 :: 32, 69 :: 32, 12 :: 32>>)
{:ok, {:request, %{index: 4201, offset: 69, size: 12}}}

iex> Effusion.PWP.Messages.decode(<<7, 4201 :: 32, 69 :: 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0>>)
{:ok, {:piece, %{index: 4201, offset: 69, data: <<1, 2, 3, 4, 5, 6, 7, 8, 9, 0>>}}}

iex> Effusion.PWP.Messages.decode(<<8, 4201 :: 32, 69 :: 32, 12 :: 32>>)
{:ok, {:cancel, %{index: 4201, offset: 69, size: 12}}}

iex> Effusion.PWP.Messages.decode(<<42>>)
{:error, :invalid}

iex> Effusion.PWP.Messages.decode(<<42, "with payload">>)
{:error, :invalid}

iex> Effusion.PWP.Messages.decode(<<0, "this shouldn't be here">>)
{:error, :no_payload_allowed}

Encode a peer wire protocol message into a binary.

Examples

iex> Effusion.PWP.Messages.encode(:notamessage)
{:error, {:unknown_message, :notamessage}}

iex> Effusion.PWP.Messages.encode(:keepalive)
{:ok, <<>>}

iex> Effusion.PWP.Messages.encode(:choke)
{:ok, <<0>>}

iex> Effusion.PWP.Messages.encode(:unchoke)
{:ok, <<1>>}

iex> Effusion.PWP.Messages.encode(:interested)
{:ok, <<2>>}

iex> Effusion.PWP.Messages.encode(:uninterested)
{:ok, <<3>>}

iex> Effusion.PWP.Messages.encode({:have, 690042})
{:ok, <<4, 690042 :: 32>>}

iex> Effusion.PWP.Messages.encode({:bitfield, <<0b0000_0000>>})
{:ok, <<5, 0>>}

iex> Effusion.PWP.Messages.encode({:request, 420, 69, 666})
{:ok, <<6, 0, 0, 1, 164, 0, 0, 0, 69, 0, 0, 2, 154>>}

iex> Effusion.PWP.Messages.encode({:piece, 420, 69, <<1, 2, 3, 4, 5>>})
{:ok, <<7, 0, 0, 1, 164, 0, 0, 0, 69, 1, 2, 3, 4, 5>>}

iex> Effusion.PWP.Messages.encode({:cancel, 420, 69, 666})
{:ok, <<8, 0, 0, 1, 164, 0, 0, 0, 69, 0, 0, 2, 154>>}
Link to this macro is_all_uint32(a, b) View Source (macro)
Link to this macro is_all_uint32(a, b, c) View Source (macro)
Link to this macro is_under_max_bitfield_size(s) View Source (macro)
Link to this macro is_under_max_block_size(s) View Source (macro)