Packages
dagger
0.20.5
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.8
0.20.7
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.11
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.19
0.18.18
0.18.17
0.18.16
0.18.15
0.18.14
0.18.13
0.18.12
0.18.11
0.18.10
0.18.9
0.18.8
0.18.7
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.3
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.2
0.0.0
retired
Dagger SDK for Elixir
Current section
Files
Jump to
Current section
Files
lib/dagger/core/session.ex
defmodule Dagger.Session do
@moduledoc false
@sdk_version Mix.Project.config() |> Keyword.fetch!(:version)
def start(bin, engine_conn_pid, opts) do
workdir = opts[:workdir] || File.cwd!()
logger = logger_from(opts[:log_output])
args = [
"--workdir",
Path.expand(workdir),
"--label",
"dagger.io/sdk.name:elixir",
"--label",
"dagger.io/sdk.version:#{@sdk_version}"
]
port =
Port.open({:spawn_executable, bin}, [
:binary,
:stderr_to_stdout,
args: ["session" | args]
])
with :ok <- wait_for_session(port, engine_conn_pid, logger) do
log_polling(port, logger)
end
end
def stop(pid) do
send(pid, :quit)
end
defp wait_for_session(port, engine_conn_pid, logger) do
receive do
{^port, {:data, log_line}} ->
logger.(log_line)
result =
String.split(log_line, "\n", trim: true)
|> Enum.map(&Jason.decode/1)
|> Enum.find(fn
{:ok, _} -> true
{:error, _} -> false
end)
case result do
nil ->
wait_for_session(port, engine_conn_pid, logger)
{:ok, session} ->
send(engine_conn_pid, {self(), session})
:ok
end
:quit ->
true = Port.close(port)
{:error, :quit}
end
end
defp log_polling(port, logger) do
receive do
{^port, {:data, log_line}} ->
logger.(log_line)
log_polling(port, logger)
:quit ->
true = Port.close(port)
:ok
end
end
defp logger_from(log_output) do
fn msg -> IO.binwrite(log_output, msg) end
end
end