I’ve created a GenServer as you and @kokolegorille suggested and it worked! Thank you very much.
Just to register what I’ve done, so others can see it.
I created a file called validator.ex
inside my lib/myapp/
folder with:
defmodule MyApp.Validator do
use GenServer
@name __MODULE__
def start_link(_), do: GenServer.start_link(__MODULE__, [], name: @name)
def init(_) do
IO.puts("Creating ETS #{@name}")
:ets.new(:authorization_bucket, [:set, :named_table])
{:ok, "ETS Created"}
end
def insert(token, model_id) do
GenServer.call(@name, {:insert, {token, %{"active" => true, "model_id" => model_id}}})
end
def remove(token) do
GenServer.call(@name, {:delete, token})
end
def handle_call({:insert, data}, _ref, state) do
:ets.insert_new(:authorization_bucket, data)
{:reply, :ok, state}
end
def handle_call({:delete, token}, _ref, state) do
:ets.delete(:authorization_bucket, token)
{:reply, :ok, state}
end
def create_ets_bucket() do
:ets.new(:authorization_bucket, [:set, :protected, :named_table])
end
end
Then, I start the GenServer at lib/myapp/application.ex
def start(_type, _args) do
# List all child processes to be supervised
children = [
# Start the Ecto repository
MyApp.Repo,
# Start the endpoint when the application starts
MyAppWeb.Endpoint,
# Starts a worker by calling: MyApp.Worker.start_link(arg)
# {MyApp.Worker, arg},
MyApp.Validator
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
To test it, start the server with iex -S mix phx.server
. When MyApp.Validator.init/1 is called, it prints “Creating ETS MyApp.Validator”.