defmodule PrymnWeb.Terminal do use PrymnWeb, :live_component alias Prymn.Agents @impl true def mount(socket) do {:ok, assign(socket, :open, false)} end @impl true def update(assigns, socket) do socket = if assigns[:data], do: push_event(socket, "data", %{"data" => assigns[:data]}), else: socket {:ok, assign(socket, assigns)} end @impl true def render(assigns) do ~H"""
Open Terminal Close Terminal
""" end @impl true def handle_event("open_terminal", _params, %{assigns: assigns} = socket) do # TODO: make up a terminal id Agents.open_terminal(assigns.agent) {:noreply, assign(socket, :open, true)} end def handle_event("close_terminal", _params, socket) do Agents.close_terminal(socket.assigns.agent) {:noreply, assign(socket, open: false, data: "")} end def handle_event("data_event", data, %{assigns: assigns} = socket) when is_binary(data) do Agents.send_terminal_input(assigns.agent, data) {:noreply, socket} end def handle_event("resize_event", %{"cols" => cols, "rows" => rows}, socket) do Agents.resize_terminal(socket.assigns.agent, rows, cols) {:noreply, socket} end # defp receive_loop(stream) do # receive do # {:data_event, data} -> # GRPC.Stub.send_request(stream, %TerminalRequest{input: data}) # receive_loop(stream) # {:resize_event, rows, cols} -> # GRPC.Stub.send_request(stream, %TerminalRequest{ # resize: %TerminalRequest.Resize{rows: rows, cols: cols} # }) # receive_loop(stream) # :data -> # receive_loop(stream) # :close -> # GRPC.Stub.send_request(stream, %TerminalRequest{input: ""}, end_stream: true) # after # 120_000 -> # GRPC.Stub.send_request(stream, %TerminalRequest{input: ""}, end_stream: true) # end # end end