Packages
phoenix_kit
1.7.194
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/supervisor.ex
defmodule PhoenixKit.Supervisor do
@moduledoc """
Supervisor for all PhoenixKit workers.
"""
use Supervisor
alias PhoenixKit.Modules.Languages
alias PhoenixKit.Users.Permissions
def start_link(init_arg) do
Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
end
@impl true
def init(_init_arg) do
update_mode = Application.get_env(:phoenix_kit, :update_mode, false)
children = build_children(update_mode)
Supervisor.init(children, strategy: :one_for_one)
end
# Minimal set of children needed when running mix phoenix_kit.update.
# Skips Dashboard.Registry, OAuthConfigLoader, module workers, and presence
# so the update task only needs 1-2 DB connections for migrations.
# Settings cache starts with NO warmer — all Settings functions return nil/%{}
# in update_mode anyway, so warming would just spam warnings every 10 s.
defp build_children(true = _update_mode) do
[
PhoenixKit.PubSub.Manager,
{PhoenixKit.Cache.Registry, []},
PhoenixKit.ModuleRegistry,
Supervisor.child_spec(
{PhoenixKit.Cache, name: :settings},
id: :settings_cache
),
PhoenixKit.Users.RateLimiter.Backend
]
end
# Full set of children for normal application operation.
defp build_children(false = _update_mode) do
[
PhoenixKit.PubSub.Manager,
PhoenixKit.Admin.SimplePresence,
# Keyfob QR device-handoff login store (ETS) — holds pending sign-in
# requests and one-time login tokens for PhoenixKit.Users.QrLogin.
Keyfob.Store.ETS,
{PhoenixKit.Cache.Registry, []},
# Module registry — must start before Dashboard.Registry so module tabs are available
PhoenixKit.ModuleRegistry,
# Settings cache starts BEFORE Dashboard.Registry so enabled?/0 calls hit the cache
# instead of making individual DB queries per module at startup.
Supervisor.child_spec(
{PhoenixKit.Cache,
name: :settings, sync_init: true, warmer: &PhoenixKit.Settings.warm_cache_data/0},
id: :settings_cache
),
# Dashboard tab registry for user dashboard navigation.
# Starts after settings_cache so module enabled? checks hit cache rather than DB.
PhoenixKit.Dashboard.Registry,
# Grant the Admin role any permission keys it has never been auto-granted
# before (newly installed feature modules, new sub-permissions). Per-key
# settings flags make an Owner's revocation stick across restarts. Runs
# after ModuleRegistry (key discovery) and the settings cache (flag
# reads); idempotent and a silent no-op when the table doesn't exist yet.
# Modules registered at runtime (ModuleRegistry.register/1) are picked
# up on the next boot.
Supervisor.child_spec(
{Task,
fn ->
try do
Permissions.auto_grant_new_keys_to_admin()
rescue
error ->
require Logger
Logger.error(
"[PhoenixKit] Failed to auto-grant permission keys to Admin at startup: #{inspect(error)}"
)
end
end},
id: :auto_grant_admin_permissions
),
# Normalize legacy admin_languages setting into unified languages_config
# Runs once after settings cache is warmed; idempotent no-op if already migrated
Supervisor.child_spec(
{Task,
fn ->
try do
Languages.normalize_language_settings()
rescue
error ->
require Logger
Logger.error(
"[PhoenixKit] Failed to normalize language settings at startup: #{inspect(error)}"
)
end
end},
id: :normalize_languages
),
# Rate limiter backend MUST be started before any authentication requests
PhoenixKit.Users.RateLimiter.Backend,
# Task supervisor for fire-and-forget background work (e.g. stale fixer)
{Task.Supervisor, name: PhoenixKit.TaskSupervisor},
# OAuth config loader - now guaranteed to have critical settings in cache
PhoenixKit.Workers.OAuthConfigLoader
] ++
PhoenixKit.ModuleRegistry.static_children()
end
end