henriquesati
How to init a node long running process through Port?
I’m trying to stablish a long term node process using Port, but the gen server crashs saying
erlang.erl:4716: :erlang.open_port({:spawn, "ts-node c:/Users/pedri/Desktop/ashandphoenix/assets/js/pixparser.ts"}, [:binary, :exit_status])
(testespay 0.1.0) lib/testespay/genservers/nodepix_processor.ex:17: Testespay.Genservers.NodepixProcessor.init/1
I’m able to open the process using {:spawn, "cmd /c ts-node.cmd #{@node_script_path}"}, on my init callback, but the process doesnt receive any messages, so i dont know if some logic is wrong on my gen server, or opening the process with this command blocks the connection in some way
full code:
defmodule Testespay.Genservers.NodepixProcessor do
require Logger
use GenServer
@node_script_path Path.join([File.cwd!(), "assets", "js", "pixparser.ts"])
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
def parse_pix(payload) do
GenServer.call(__MODULE__, {:parse_pix, payload})
end
def init(_opts) do
# Remova a chamada System.cmd desnecessária
Logger.debug(@node_script_path)
port = Port.open(
{:spawn, "cmd /c ts-node.cmd #{@node_script_path}"},
[:binary, :exit_status]
)
{:ok, %{port: port, buffer: "", current_ref: nil}}
end
def handle_call({:parse_pix, payload}, from, state) do
# Envia o payload para o processo Node
Port.command(state.port, "#{Jason.encode!(payload)}\n")
{:noreply, %{state | current_ref: from}}
end
def handle_info({port, {:data, data}}, %{port: port, buffer: buffer} = state) do
new_buffer = buffer <> data
case String.split(new_buffer, "\n", parts: 2) do
[message, rest] ->
handle_node_message(message, state)
{:noreply, %{state | buffer: rest}}
_ ->
{:noreply, %{state | buffer: new_buffer}}
end
end
defp handle_node_message("READY", _state), do: :ok # Ignora a mensagem de inicialização
defp handle_node_message(message, %{current_ref: current_ref} = state) do
case Jason.decode(message) do
{:ok, %{"status" => "success"} = response} ->
GenServer.reply(current_ref, {:ok, response})
{:ok, %{"status" => "error"} = error} ->
GenServer.reply(current_ref, {:error, error})
_ ->
GenServer.reply(current_ref, {:error, :invalid_response})
end
end
end
Popular in Questions
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Hi all,
Trying to get some more clarity over utc_datetime and naive_datetime for Ecto:
https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
Student & New to elixir. Nice language.
I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Other popular topics
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
What is the idiomatic way of matching for not nil in Elixir?
E.g.,
First way:
defp halt_if_not_signed_in(conn, signed_in_account) when...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
As a follow up to my earlier question:
I have the code compiling and running but not getting a successful login from the rest server. ...
New
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New







