Skip to content

Instantly share code, notes, and snippets.

@myobie
Created June 15, 2018 14:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save myobie/848696ddd51e80fd59a0457fd176697e to your computer and use it in GitHub Desktop.
Save myobie/848696ddd51e80fd59a0457fd176697e to your computer and use it in GitHub Desktop.
defmodule App.Thing do
use GenServer
def init(%{code: code}) do
Process.flag(:trap_exit, true)
handler = self()
{:ok, task} = Task.start_link(fn ->
port = Port.open(
{:spawn_executable, System.find_executable("npm")},
[:binary, :use_stdio, :stderr_to_stdout, :exit_status,
{:args, ['-s', 'run', 'server']},
{:packet, 4},
{:cd, Path.absname('./node/')}]
)
send(handler, {:port, port})
receive_loop(handler)
end)
port = receive do
{:port, new_port} -> new_port
after
500 -> raise "Port never spawned anything"
end
{:ok, %{port: port, task: task}}
end
def receive_loop(handler) do
receive do
{_, {:data, data}} ->
term = :erlang.binary_to_term(data, [:safe])
send(handler, {:data, term})
receive_loop(handler)
after
10_000 ->
receive_loop(handler)
end
end
def handle_info({:data, data}, state) do
handle_port_data(data, state)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment