Packages

Extendable Redis store for Plug.Session.

Current section

Files

Jump to
plug_session_redis_store lib plug session redis.ex
Raw

lib/plug/session/redis.ex

defmodule Plug.Session.Redis do
@moduledoc """
Stores the session in an in-memory data structure store: Redis.
"""
@behaviour Plug.Session.Store
def init(_) do
opts = Application.get_env(:plug_session_redis_store, :redis, [])
{:ok, conn} = Redix.start_link(opts)
conn
end
def get(_conn, sid, store) do
duration = Application.get_env(:plug_session_redis_store, :duration, 86_400)
encoder =
Application.get_env(
:plug_session_redis_store,
:encoder,
PlugSessionRedisStore.Encoder.Binary
)
case Redix.command(store, ["GET", sid]) do
{:ok, nil} ->
{nil, %{}}
{:ok, data} ->
case Redix.command(store, ["EXPIRE", sid, duration]) do
{:ok, 1} -> {sid, encoder.decode(data)}
{:error, _error} -> {nil, %{}}
end
{:error, _error} ->
{nil, %{}}
end
end
def put(conn, nil, data, store) do
genetator =
Application.get_env(
:plug_session_redis_store,
:sid_generator,
PlugSessionRedisStore.Generator.StrongRandBytes
)
sid = genetator.generate()
put(conn, sid, data, store)
end
def put(_conn, sid, data, store) do
duration = Application.get_env(:plug_session_redis_store, :duration, 86_400)
encoder =
Application.get_env(
:plug_session_redis_store,
:encoder,
PlugSessionRedisStore.Encoder.Binary
)
case Redix.command(store, ["SETEX", sid, duration, encoder.encode(data)]) do
{:ok, "OK"} -> sid
{:error, _error} -> {nil, %{}}
end
end
def delete(_conn, sid, store) do
case Redix.command(store, ["DEL", sid]) do
{:ok, _} -> :ok
_ -> {nil, %{}}
end
end
end