Persistent store for screen assigns.
Backed by the app's configured Ecto Repo (via config :mob, :repo, MyApp.Repo).
All functions are no-ops when no Repo is configured, so screens compiled with
vsn: enabled don't crash in environments without a database.
Setup
Generated projects include the required table migration and config automatically.
For existing projects, add to config/config.exs:
config :mob, :repo, MyApp.RepoAnd run the migration (see priv/repo/migrations/*_create_mob_screen_states.exs
generated by mix mob.new).
Storage
State is keyed by screen module name by default. Screens with per-user or
parameterised state should implement screen_key/1:
def screen_key(assigns), do: "#{__MODULE__}:#{assigns.user_id}"Serialisation
Values are encoded with :erlang.term_to_binary/1 after stripping
non-serialisable terms (PIDs, references, ports, functions). The :safe
flag is used on decode to prevent atom-table pollution from untrusted data.
Summary
Functions
Delete the persisted state for module. Used when resetting or logging out.
Persist the current assigns of socket for module.
Load previously persisted assigns for module.
Functions
@spec delete(module(), Mob.Socket.t()) :: :ok
Delete the persisted state for module. Used when resetting or logging out.
@spec dump(module(), Mob.Socket.t()) :: :ok
Persist the current assigns of socket for module.
Calls module.dump_state/1, strips non-serialisable values, and writes to
the configured Repo. Returns :ok regardless — persistence failures are
silent so a missing or misconfigured Repo never crashes a screen.
@spec load(module(), Mob.Socket.t()) :: {:ok, non_neg_integer(), map()} | :not_found
Load previously persisted assigns for module.
Returns {:ok, stored_vsn, raw_map} when a record exists, :not_found
otherwise (including when no Repo is configured or the data cannot be decoded).