defmodule Actors.Node.Client do @moduledoc """ `Node.Client` Uses the HTTP interface to communicate with the application that owns the ActorHosts. """ alias Actors.Config.PersistentTermConfig, as: Config import Spawn.Utils.Common, only: [to_existing_atom_or_new: 1] @actor_invoke_uri "/api/v1/actors/actions" @headers [ {"Connection", "keep-alive"}, {"content-type", "application/octet-stream"} ] @req_timeout 60_000 def invoke_host_actor(body, opts \\ []) do with {:ok, client} <- client(body, opts) do # seems useless but Finch doesn't have the request timeout spec specified opts = Keyword.merge([], request_timeout: @req_timeout, receive_timeout: @req_timeout) Finch.request(client, SpawnHTTPClient, opts) end end defp client(body, opts) do with {:ok, base_url} <- base_url(get_deployment_mode(), opts) do {:ok, Finch.build(:post, "#{base_url}#{@actor_invoke_uri}", @headers, body)} else error -> error end end defp base_url(:sidecar, _opts) do {:ok, "http://#{Config.get(:user_function_host)}:#{Config.get(:user_function_port)}"} end defp base_url(:daemon, opts) do with {:ok, host} <- Keyword.fetch(opts, :remote_ip) do {:ok, "http://#{host}:8090"} else _ -> {:error, "Missing required :remote_ip option for daemon mode"} end end defp get_deployment_mode() do Config.get(:deployment_mode) |> to_existing_atom_or_new() end end