Current section
Files
Jump to
Current section
Files
lib/slipstream/connection.ex
defmodule Slipstream.Connection do
@moduledoc false
# the Connection _is_ the socket client
# Connection interfaces with :gun and any module that implements the
# Slipstream behaviour to offer websocket client functionality
use GenServer, restart: :temporary
alias Slipstream.Connection.{State, Pipeline, Telemetry}
def start_link(init_arg) do
GenServer.start_link(__MODULE__, init_arg)
end
@impl GenServer
def init(%Slipstream.Commands.OpenConnection{
socket: %Slipstream.Socket{socket_pid: socket_pid},
config: config
}) do
initial_state = State.new(config, socket_pid)
metadata = Telemetry.begin(initial_state)
state = %State{initial_state | metadata: metadata}
{:ok, state, {:continue, :connect}}
end
@impl GenServer
def handle_continue(:connect, state) do
Pipeline.handle(:connect, state)
end
@impl GenServer
def handle_info(message, state) do
Pipeline.handle(message, state)
end
@impl GenServer
def handle_call(message, _from, state) do
Pipeline.handle(message, state)
end
@impl GenServer
def terminate(reason, state) do
Telemetry.conclude(state, reason)
state
end
end