Current section
Files
Jump to
Current section
Files
lib/session_store.ex
defmodule Dialup.SessionStore do
@moduledoc """
ETS ベースのセッション永続化ストア。プロセス終了時にセッション状態を保存し、
再起動後に復元可能にする。オプトイン方式。
"""
use GenServer
@table :dialup_session_store
def start_link(_opts) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
@impl GenServer
def init(_) do
:ets.new(@table, [:named_table, :public, :set, read_concurrency: true])
{:ok, %{}}
end
def save(session_id, session, assigns, path) do
:ets.insert(@table, {session_id, %{session: session, assigns: assigns, path: path}})
:ok
end
def restore(session_id) do
case :ets.lookup(@table, session_id) do
[{^session_id, data}] ->
:ets.delete(@table, session_id)
{:ok, data}
[] ->
:error
end
end
def delete(session_id) do
:ets.delete(@table, session_id)
:ok
end
def rename(old_id, new_id) when is_binary(old_id) and is_binary(new_id) do
case :ets.lookup(@table, old_id) do
[{^old_id, data}] ->
:ets.delete(@table, old_id)
:ets.insert(@table, {new_id, data})
:ok
[] ->
:ok
end
end
end