Packages
phoenix_kit
1.7.204
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit/cache/registry.ex
defmodule PhoenixKit.Cache.Registry do
@moduledoc """
Lightweight Registry wrapper for PhoenixKit.Cache instances.
This module provides simple process registration and discovery for cache
processes.
## Features
- Simple Registry wrapper using Elixir's Registry
- Process registration and discovery
- Basic cache listing and health checking
## Usage
# Register a cache process (typically done automatically)
{:ok, pid} = PhoenixKit.Cache.start_link(name: :my_cache)
# List all registered caches
PhoenixKit.Cache.Registry.list_caches()
# Check if a cache is registered
PhoenixKit.Cache.Registry.cache_exists?(:my_cache)
# Get cache process PID
PhoenixKit.Cache.Registry.get_cache_pid(:my_cache)
"""
@doc """
Starts the Registry for cache process registration.
## Examples
{:ok, _pid} = PhoenixKit.Cache.Registry.start_link()
"""
@spec start_link() :: {:ok, pid()} | {:error, term()}
def start_link do
Registry.start_link(keys: :unique, name: __MODULE__)
end
@doc """
Creates a via tuple for process registration.
## Examples
iex> PhoenixKit.Cache.Registry.via_tuple(:my_cache)
{:via, Registry, {PhoenixKit.Cache.Registry, :my_cache}}
"""
@spec via_tuple(atom()) :: {:via, Registry, {atom(), atom()}}
def via_tuple(key) when is_atom(key) do
{:via, Registry, {__MODULE__, key}}
end
@doc """
Child specification for supervision trees.
## Examples
children = [
PhoenixKit.Cache.Registry
]
"""
@spec child_spec(any()) :: Supervisor.child_spec()
def child_spec(_) do
Supervisor.child_spec(
Registry,
id: __MODULE__,
start: {__MODULE__, :start_link, []}
)
end
@doc """
Returns the count of registered cache processes.
## Examples
iex> PhoenixKit.Cache.Registry.count()
2
"""
@spec count() :: non_neg_integer()
def count do
Registry.count(__MODULE__)
end
@doc """
Looks up a cache process by name.
## Examples
iex> PhoenixKit.Cache.Registry.lookup(:my_cache)
[{#PID<0.123.0>, nil}]
"""
@spec lookup(atom()) :: [{pid(), any()}]
def lookup(key) when is_atom(key) do
Registry.lookup(__MODULE__, key)
end
@doc """
Lists all registered cache instances with their basic status.
## Examples
PhoenixKit.Cache.Registry.list_caches()
# => %{
# settings: %{pid: #PID<0.123.0>, status: :running},
# user_roles: %{pid: #PID<0.124.0>, status: :running}
# }
"""
@spec list_caches() :: map()
def list_caches do
__MODULE__
|> Registry.select([{{:"$1", :"$2", :"$3"}, [], [{{:"$1", :"$2"}}]}])
|> Enum.reduce(%{}, fn {name, pid}, acc ->
status = if Process.alive?(pid), do: :running, else: :dead
Map.put(acc, name, %{pid: pid, status: status})
end)
end
@doc """
Checks if a cache is registered and running.
## Examples
iex> PhoenixKit.Cache.Registry.cache_exists?(:my_cache)
true
"""
@spec cache_exists?(atom()) :: boolean()
def cache_exists?(name) when is_atom(name) do
case lookup(name) do
[{pid, _}] -> Process.alive?(pid)
[] -> false
end
end
@doc """
Gets the PID of a registered cache process.
## Examples
iex> PhoenixKit.Cache.Registry.get_cache_pid(:my_cache)
#PID<0.123.0>
"""
@spec get_cache_pid(atom()) :: pid() | nil
def get_cache_pid(name) when is_atom(name) do
case lookup(name) do
[{pid, _}] -> pid
[] -> nil
end
end
@doc """
Gets basic statistics for registered caches.
Note: This provides basic registry-level stats. For detailed cache
statistics, use PhoenixKit.Cache.stats/1 directly.
## Examples
PhoenixKit.Cache.Registry.stats()
# => %{
# total_caches: 2,
# running_caches: 2,
# dead_caches: 0,
# cache_names: [:settings, :user_roles]
# }
PhoenixKit.Cache.Registry.stats(:my_cache)
# => %{registered: true, running: true, pid: #PID<0.123.0>}
"""
@spec stats(atom() | nil) :: map()
def stats(cache_name \\ nil)
def stats(nil) do
caches = list_caches()
running = Enum.count(caches, fn {_name, info} -> info.status == :running end)
dead = Enum.count(caches, fn {_name, info} -> info.status == :dead end)
cache_names = Map.keys(caches)
%{
total_caches: map_size(caches),
running_caches: running,
dead_caches: dead,
cache_names: cache_names
}
end
def stats(name) when is_atom(name) do
case lookup(name) do
[{pid, _}] ->
%{
registered: true,
running: Process.alive?(pid),
pid: pid
}
[] ->
%{
registered: false,
running: false,
pid: nil
}
end
end
@doc """
Performs a basic health check on registered caches.
## Examples
PhoenixKit.Cache.Registry.health_check()
# => %{
# overall_status: :healthy,
# total_caches: 2,
# running_caches: 2,
# dead_caches: 0,
# registry_status: :running
# }
"""
@spec health_check() :: map()
def health_check do
caches = list_caches()
running = Enum.count(caches, fn {_name, info} -> info.status == :running end)
dead = Enum.count(caches, fn {_name, info} -> info.status == :dead end)
total = map_size(caches)
overall_status =
cond do
total == 0 -> :no_caches
dead == 0 -> :healthy
running > 0 -> :degraded
true -> :unhealthy
end
%{
overall_status: overall_status,
total_caches: total,
running_caches: running,
dead_caches: dead,
registry_status: :running,
caches: caches
}
end
end