defmodule Plug.Session.Redis do @moduledoc """ Stores the session in an in-memory data structure store: Redis. """ 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