diff --git a/lib/livebook/hubs/team_client.ex b/lib/livebook/hubs/team_client.ex index dc06bf5ed..275d83d2d 100644 --- a/lib/livebook/hubs/team_client.ex +++ b/lib/livebook/hubs/team_client.ex @@ -274,6 +274,11 @@ defmodule Livebook.Hubs.TeamClient do {:noreply, handle_event(topic, data, state)} end + def handle_info({:apps_manager_status, _}, state) + when not state.connected? or state.deployment_group_id == nil do + {:noreply, state} + end + def handle_info({:apps_manager_status, entries}, %{hub: %{id: id}} = state) do app_deployment_statuses = for %{app_spec: %Apps.TeamsAppSpec{hub_id: ^id} = app_spec, running?: running?} <- entries do diff --git a/lib/livebook/teams/connection.ex b/lib/livebook/teams/connection.ex index 3747e1524..6aa70a4bc 100644 --- a/lib/livebook/teams/connection.ex +++ b/lib/livebook/teams/connection.ex @@ -9,7 +9,7 @@ defmodule Livebook.Teams.Connection do @no_state :no_state @loop_ping_delay 5_000 - @websocket_messages [:ssl, :tcp, :ssl_closed, :tcp_closed, :ssl_error, :tcp_error] + @expected_messages [:ssl, :tcp, :ssl_closed, :tcp_closed, :ssl_error, :tcp_error] defstruct [:listener, :headers, :http_conn, :websocket, :ref] @@ -39,13 +39,13 @@ defmodule Livebook.Teams.Connection do @impl true def handle_event(event_type, event_data, state, data) - def handle_event(:internal, :connect, @no_state, %__MODULE__{} = data) do + def handle_event(:internal, :connect, @no_state, data) do case WebSocket.connect(data.headers) do {:ok, conn, websocket, ref} -> send(data.listener, :connected) send(self(), {:loop_ping, ref}) - {:keep_state, %__MODULE__{data | http_conn: conn, ref: ref, websocket: websocket}} + {:keep_state, %{data | http_conn: conn, ref: ref, websocket: websocket}} {:transport_error, reason} -> send(data.listener, {:connection_error, reason}) @@ -63,14 +63,14 @@ defmodule Livebook.Teams.Connection do {:keep_state_and_data, {:next_event, :internal, :connect}} end - def handle_event(:info, {:loop_ping, ref}, @no_state, %__MODULE__{ref: ref} = data) do + def handle_event(:info, {:loop_ping, ref}, @no_state, %{ref: ref} = data) do case WebSocket.send(data.http_conn, data.websocket, data.ref, :ping) do {:ok, conn, websocket} -> Process.send_after(self(), {:loop_ping, data.ref}, @loop_ping_delay) - {:keep_state, %__MODULE__{data | http_conn: conn, websocket: websocket}} + {:keep_state, %{data | http_conn: conn, websocket: websocket}} {:error, conn, websocket, _reason} -> - {:keep_state, %__MODULE__{data | http_conn: conn, websocket: websocket}} + {:keep_state, %{data | http_conn: conn, websocket: websocket}} end end @@ -78,11 +78,15 @@ defmodule Livebook.Teams.Connection do :keep_state_and_data end - def handle_event(:info, message, @no_state, %__MODULE__{} = data) - when elem(message, 0) in @websocket_messages do + def handle_event(:info, message, @no_state, data) when elem(message, 0) in @expected_messages do handle_websocket_message(message, data) end + def handle_event(:info, message, @no_state, %{http_conn: nil}) + when elem(message, 0) in @expected_messages do + :keep_state_and_data + end + def handle_event(:info, _message, @no_state, _data) do :keep_state_and_data end @@ -94,7 +98,7 @@ defmodule Livebook.Teams.Connection do {:keep_state, %{data | http_conn: conn, websocket: websocket}} {:error, conn, websocket, reason} -> - data = %__MODULE__{data | http_conn: conn, websocket: websocket} + data = %{data | http_conn: conn, websocket: websocket} send(data.listener, {:connection_error, reason}) :gen_statem.reply(from, {:error, reason}) @@ -104,10 +108,10 @@ defmodule Livebook.Teams.Connection do # Private - defp handle_websocket_message(message, %__MODULE__{} = data) do + defp handle_websocket_message(message, data) do case WebSocket.receive(data.http_conn, data.ref, data.websocket, message) do {:ok, conn, websocket, binaries} -> - data = %__MODULE__{data | http_conn: conn, websocket: websocket} + data = %{data | http_conn: conn, websocket: websocket} for binary <- binaries do %{type: {topic, message}} = LivebookProto.Event.decode(binary) @@ -118,7 +122,7 @@ defmodule Livebook.Teams.Connection do {:error, conn, websocket, reason} -> send(data.listener, {:connection_error, reason}) - data = %__MODULE__{data | http_conn: conn, websocket: websocket} + data = %{data | http_conn: conn, websocket: websocket} {:keep_state, data, {:next_event, :internal, :connect}} end diff --git a/lib/livebook_web/components/core_components.ex b/lib/livebook_web/components/core_components.ex index 26fa876d8..8b6e2f0c2 100644 --- a/lib/livebook_web/components/core_components.ex +++ b/lib/livebook_web/components/core_components.ex @@ -108,7 +108,13 @@ defmodule LivebookWeb.CoreComponents do slot :inner_block + def message_box(assigns) + def message_box(assigns) do + if assigns.message && assigns.inner_block != [] do + raise ArgumentError, "expected either message or inner_block, got both." + end + ~H"""