Current section
Files
Jump to
Current section
Files
lib/frame/ping.ex
defmodule Kadabra.Frame.Ping do
@moduledoc false
defstruct [:data, ack: false]
alias Kadabra.Frame
alias Kadabra.Frame.Flags
@type t :: %__MODULE__{
ack: boolean,
data: <<_::64>>
}
@doc ~S"""
Returns new unacked ping frame.
## Examples
iex> Kadabra.Frame.Ping.new
%Kadabra.Frame.Ping{data: <<0, 0, 0, 0, 0, 0, 0, 0>>,
ack: false}
"""
@spec new() :: t
def new do
%__MODULE__{
data: <<0, 0, 0, 0, 0, 0, 0, 0>>,
ack: false
}
end
@doc ~S"""
Initializes a new `Frame.Ping` given a `Frame`.
## Examples
iex> frame = %Kadabra.Frame{payload: <<0, 0, 0, 0, 0, 0, 0, 0>>,
...> flags: 0x1, type: 0x6}
iex> Kadabra.Frame.Ping.new(frame)
%Kadabra.Frame.Ping{data: <<0, 0, 0, 0, 0, 0, 0, 0>>, ack: true}
"""
@spec new(Frame.t) :: t
def new(%Frame{type: 0x6, payload: data, flags: flags}) do
%__MODULE__{
data: data,
ack: Flags.ack?(flags)
}
end
end
defimpl Kadabra.Encodable, for: Kadabra.Frame.Ping do
alias Kadabra.Http2
alias Kadabra.Frame.Flags
def to_bin(frame) do
ack = if frame.ack, do: Flags.ack, else: 0x0
Http2.build_frame(0x6, ack, 0x0, frame.data)
end
end