-module(livery_client_cookie_store_ets).
-moduledoc """
The default cookie jar store: a public ETS table.
`livery_client:cookie_jar/0,1` uses it implicitly, so you rarely name it
directly. The constructor creates one unnamed `public` table per jar and
hands it back as the opaque store handle; every request process that runs
the client reads and writes the same table. The table is owned by the
process that built the jar, so build the jar under a process that outlives
its requests.
""".
-behaviour(livery_client_cookie_store).
-export([init/1, get/1, put/3, delete/2]).
-spec init(map()) -> ets:tid().
init(_Opts) ->
ets:new(livery_client_cookies, [
public,
set,
{read_concurrency, true},
{write_concurrency, true}
]).
-spec get(ets:tid()) -> [livery_client_cookie_store:cookie()].
get(Tab) ->
[Cookie || {_Key, Cookie} <- ets:tab2list(Tab)].
-spec put(ets:tid(), livery_client_cookie_store:key(), livery_client_cookie_store:cookie()) -> ok.
put(Tab, Key, Cookie) ->
true = ets:insert(Tab, {Key, Cookie}),
ok.
-spec delete(ets:tid(), livery_client_cookie_store:key()) -> ok.
delete(Tab, Key) ->
true = ets:delete(Tab, Key),
ok.