Packages
extreme
1.1.0
1.1.4
1.1.3
1.1.2
1.1.1
1.1.1-rc01
1.1.0
1.1.0-rc9
1.1.0-rc8
1.1.0-rc7
1.1.0-rc6
1.1.0-rc5
1.1.0-rc4
1.1.0-rc3
1.1.0-rc2
1.1.0-rc1
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
Elixir TCP client for EventStore.
Current section
Files
Jump to
Current section
Files
lib/extreme/connection_impl.ex
defmodule Extreme.ConnectionImpl do
@moduledoc """
Set of connection related functions meant to be used from `Extreme.Connection` only!
"""
alias Extreme.RequestManager
alias Extreme.Connection.State
require Logger
def execute(message, %State{socket: socket}),
do: :gen_tcp.send(socket, message)
def receive_package(pkg, %State{socket: socket, received_data: received_data} = state) do
:inet.setopts(socket, active: :once)
state = _process_package(received_data <> pkg, state)
{:ok, state}
end
defp _process_package(
<<message_length::32-unsigned-little-integer, content::binary-size(message_length),
rest::binary>>,
%State{} = state
) do
# Handle binary data containing zero, one or many messages
# All messages start with a 32 bit unsigned little endian integer of the content length + a binary body of that size
:ok = RequestManager.process_server_message(state.base_name, content)
_process_package(rest, state)
end
# No full message left, keep state in GenServer to reprocess once more data arrives
defp _process_package(package_with_incomplete_message, %State{} = state),
do: %{state | received_data: package_with_incomplete_message}
end