Packages
mob
0.7.7
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.2
0.6.1
0.6.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.11
0.5.10
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
BEAM-on-device mobile framework for Elixir
Current section
Files
Jump to
Current section
Files
lib/mob/plugins/supervisor.ex
defmodule Mob.Plugins.Supervisor do
@moduledoc """
Supervises the tier-4 plugins' lifecycle.
On init it runs each plugin's `lifecycle.on_start` MFA in order (an error
return bubbles up and fails boot loud, per the spec), then supervises the
plugins' declared `lifecycle.supervised` child specs alongside the
`Mob.Plugins.Lifecycle` event dispatcher. Started from `Mob.App.start/0`
(just before the host's own `on_start/0`, so a host `on_start` that blocks on
a run loop can't starve plugin startup — the framework services a plugin's
`on_start` needs are already up), and only when a plugin declares a
`:lifecycle` (see `Mob.Plugins.start_lifecycle/0`).
"""
use Supervisor
@spec start_link(term()) :: Supervisor.on_start()
def start_link(_arg), do: Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
@impl Supervisor
def init(:ok) do
lifecycles = Mob.Plugins.lifecycle()
run_on_start!(lifecycles)
children = supervised_children(lifecycles) ++ [Mob.Plugins.Lifecycle]
Supervisor.init(children, strategy: :one_for_one)
end
defp run_on_start!(lifecycles) do
for %{on_start: {m, f, a}} = lc <- lifecycles do
case apply(m, f, a) do
{:error, reason} ->
raise "plugin #{inspect(lc[:plugin])} on_start failed: #{inspect(reason)}"
_ok ->
:ok
end
end
end
# Flattens every plugin's `lifecycle.supervised` child specs into one list.
defp supervised_children(lifecycles) do
for lc <- lifecycles, child <- Map.get(lc, :supervised, []), do: child
end
end