defmodule LivebookWeb.SessionLive.RuntimeComponent do use LivebookWeb, :live_component alias Livebook.{Session, Runtime} @impl true def mount(socket) do {:ok, assign(socket, type: "elixir_standalone")} end @impl true def render(assigns) do ~L"""

Runtime

The code is evaluated in a separate Elixir runtime (node), which you can configure yourself here.

<%= if @runtime do %>
Type Node name
<%= runtime_type_label(@runtime) %> <%= @runtime.node %>
<% else %>

No connected node

<% end %>
<%= if @type == "elixir_standalone" do %> <%= live_render @socket, LivebookWeb.SessionLive.ElixirStandaloneLive, id: :elixir_standalone_runtime, session: %{"session_id" => @session_id} %> <% end %> <%= if @type == "mix_standalone" do %> <%= live_render @socket, LivebookWeb.SessionLive.MixStandaloneLive, id: :mix_standalone_runtime, session: %{"session_id" => @session_id} %> <% end %> <%= if @type == "attached" do %> <%= live_render @socket, LivebookWeb.SessionLive.AttachedLive, id: :attached_runtime, session: %{"session_id" => @session_id} %> <% end %>
""" end defp runtime_type_label(%Runtime.ElixirStandalone{}), do: "Elixir standalone" defp runtime_type_label(%Runtime.MixStandalone{}), do: "Mix standalone" defp runtime_type_label(%Runtime.Attached{}), do: "Attached" @impl true def handle_event("set_runtime_type", %{"type" => type}, socket) do {:noreply, assign(socket, type: type)} end def handle_event("disconnect", _params, socket) do Session.disconnect_runtime(socket.assigns.session_id) {:noreply, socket} end end