Packages

https://dagger.io SDK for Elixir

Current section

Files

Jump to
dagger_ex lib dagger engine_conn.ex
Raw

lib/dagger/engine_conn.ex

defmodule Dagger.EngineConn do
@moduledoc false
defstruct [:port, :token, :session_pid]
@doc false
# TODO: plan c: construct conn by downloading cli.
def get() do
case from_session_env() do
{:ok, conn} -> {:ok, conn}
_otherwise -> from_local_cli()
end
end
@doc false
def from_session_env() do
with {:ok, port} <- System.fetch_env("DAGGER_SESSION_PORT"),
{:ok, token} <- System.fetch_env("DAGGER_SESSION_TOKEN") do
{:ok,
%__MODULE__{
port: port,
token: token
}}
end
end
@doc false
def from_local_cli() do
with {:ok, bin} <- System.fetch_env("_EXPERIMENTAL_DAGGER_CLI_BIN"),
bin when is_binary(bin) <- System.find_executable(bin) do
session_pid = spawn_link(Dagger.Session, :start, [bin, self(), &Dagger.StdoutLogger.log/1])
receive do
{^session_pid, %{"port" => port, "session_token" => token}} ->
{:ok, %__MODULE__{port: port, token: token, session_pid: session_pid}}
after
300_000 -> {:error, :session_timeout}
end
else
nil -> {:error, :no_executable}
otherwise -> otherwise
end
end
# Constructing host connection.
@doc false
def host(%__MODULE__{port: port}), do: "127.0.0.1:#{port}"
# Get the token.
@doc false
def token(%__MODULE__{token: token}), do: token
# Disconnecting from Dagger session.
@doc false
def disconnect(%__MODULE__{session_pid: nil}) do
:ok
end
def disconnect(%__MODULE__{session_pid: pid}) do
Dagger.Session.stop(pid)
end
end