<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="generator" content="ExDoc v0.19.1"> <title>DynamicSupervisor – Elixir v1.7.2</title> <link rel="stylesheet" href="dist/app-240d7fc7e5.css" /> <link rel="canonical" href="https://hexdocs.pm/elixir/v1.7/DynamicSupervisor.html" /> <script src="dist/sidebar_items-cdf4e58b19.js"></script> </head> <body data-type="modules"> <script>try { if(localStorage.getItem('night-mode')) document.body.className += ' night-mode'; } catch (e) { }</script> <div class="main"> <button class="sidebar-button sidebar-toggle"> <span class="icon-menu" aria-hidden="true"></span> <span class="sr-only">Toggle Sidebar</span> </button> <button class="sidebar-button night-mode-toggle"> <span class="icon-theme" aria-hidden="true"></span> <span class="sr-only">Toggle Theme</span> </button> <section class="sidebar"> <a href="http://elixir-lang.org/docs.html" class="sidebar-projectLink"> <div class="sidebar-projectDetails"> <h1 class="sidebar-projectName"> Elixir </h1> <h2 class="sidebar-projectVersion"> v1.7.2 </h2> </div> <img src="assets/logo.png" alt="Elixir" class="sidebar-projectImage"> </a> <form class="sidebar-search" action="search.html"> <button type="submit" class="search-button"> <span class="icon-search" aria-hidden="true"></span> </button> <input name="q" type="text" id="search-list" class="search-input" placeholder="Search" aria-label="Search" autocomplete="off" /> </form> <ul class="sidebar-listNav"> <li><a id="extras-list" href="#full-list">Pages</a></li> <li><a id="modules-list" href="#full-list">Modules</a></li> <li><a id="exceptions-list" href="#full-list">Exceptions</a></li> </ul> <div class="gradient"></div> <ul id="full-list" class="sidebar-fullList"></ul> </section> <section class="content"> <div class="content-outer"> <div id="content" class="content-inner"> <h1> <small class="visible-xs">Elixir v1.7.2</small> DynamicSupervisor <small>behaviour</small> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L1" title="View Source" class="view-source" rel="help"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> </h1> <section id="moduledoc"> <p>A supervisor that starts children dynamically.</p> <p>The <a href="Supervisor.html"><code class="inline">Supervisor</code></a> module was designed to handle mostly static children that are started in the given order when the supervisor starts. A <a href="DynamicSupervisor.html#content"><code class="inline">DynamicSupervisor</code></a> starts with no children. Instead, children are started on demand via <a href="#start_child/2"><code class="inline">start_child/2</code></a>. When a dynamic supervisor terminates, all children are shutdown at the same time, with no guarantee of ordering.</p> <h2 id="module-examples" class="section-heading"> <a href="#module-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Examples </h2> <p>A dynamic supervisor is started with no children, often under a supervisor with the supervision strategy (the only strategy currently supported is <code class="inline">:one_for_one</code>) and a name:</p> <pre><code class="nohighlight makeup elixir"><span class="n">children</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="8807383193-1">[</span><span class="w"> </span><span class="p" data-group-id="8807383193-2">{</span><span class="nc">DynamicSupervisor</span><span class="p">,</span><span class="w"> </span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:one_for_one</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="nc">MyApp.DynamicSupervisor</span><span class="p" data-group-id="8807383193-2">}</span><span class="w"> </span><span class="p" data-group-id="8807383193-1">]</span><span class="w"> </span><span class="nc">Supervisor</span><span class="o">.</span><span class="n">start_link</span><span class="p" data-group-id="8807383193-3">(</span><span class="n">children</span><span class="p">,</span><span class="w"> </span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:one_for_one</span><span class="p" data-group-id="8807383193-3">)</span></code></pre> <p>The options given in the child specification are documented in <a href="#start_link/1"><code class="inline">start_link/1</code></a>.</p> <p>Once the dynamic supervisor is running, we can start children with <a href="#start_child/2"><code class="inline">start_child/2</code></a>, which receives a child specification:</p> <pre><code class="nohighlight makeup elixir"><span class="p" data-group-id="3293445163-1">{</span><span class="ss">:ok</span><span class="p">,</span><span class="w"> </span><span class="n">agent1</span><span class="p" data-group-id="3293445163-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">start_child</span><span class="p" data-group-id="3293445163-2">(</span><span class="nc">MyApp.DynamicSupervisor</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3293445163-3">{</span><span class="nc">Agent</span><span class="p">,</span><span class="w"> </span><span class="k" data-group-id="3293445163-4">fn</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="p" data-group-id="3293445163-5">%{</span><span class="p" data-group-id="3293445163-5">}</span><span class="w"> </span><span class="k" data-group-id="3293445163-4">end</span><span class="p" data-group-id="3293445163-3">}</span><span class="p" data-group-id="3293445163-2">)</span><span class="w"> </span><span class="nc">Agent</span><span class="o">.</span><span class="n">update</span><span class="p" data-group-id="3293445163-6">(</span><span class="n">agent1</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="nc">Map</span><span class="o">.</span><span class="n">put</span><span class="p" data-group-id="3293445163-7">(</span><span class="ni">&1</span><span class="p">,</span><span class="w"> </span><span class="ss">:key</span><span class="p">,</span><span class="w"> </span><span class="s">"value"</span><span class="p" data-group-id="3293445163-7">)</span><span class="p" data-group-id="3293445163-6">)</span><span class="w"> </span><span class="nc">Agent</span><span class="o">.</span><span class="n">get</span><span class="p" data-group-id="3293445163-8">(</span><span class="n">agent1</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="ni">&1</span><span class="p" data-group-id="3293445163-8">)</span><span class="w"> </span><span class="c1">#=> %{key: "value"}</span><span class="w"> </span><span class="p" data-group-id="3293445163-9">{</span><span class="ss">:ok</span><span class="p">,</span><span class="w"> </span><span class="n">agent2</span><span class="p" data-group-id="3293445163-9">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">start_child</span><span class="p" data-group-id="3293445163-10">(</span><span class="nc">MyApp.DynamicSupervisor</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3293445163-11">{</span><span class="nc">Agent</span><span class="p">,</span><span class="w"> </span><span class="k" data-group-id="3293445163-12">fn</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="p" data-group-id="3293445163-13">%{</span><span class="p" data-group-id="3293445163-13">}</span><span class="w"> </span><span class="k" data-group-id="3293445163-12">end</span><span class="p" data-group-id="3293445163-11">}</span><span class="p" data-group-id="3293445163-10">)</span><span class="w"> </span><span class="nc">Agent</span><span class="o">.</span><span class="n">get</span><span class="p" data-group-id="3293445163-14">(</span><span class="n">agent2</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="ni">&1</span><span class="p" data-group-id="3293445163-14">)</span><span class="w"> </span><span class="c1">#=> %{}</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">count_children</span><span class="p" data-group-id="3293445163-15">(</span><span class="nc">MyApp.DynamicSupervisor</span><span class="p" data-group-id="3293445163-15">)</span><span class="w"> </span><span class="c1">#=> %{active: 2, specs: 2, supervisors: 0, workers: 2}</span></code></pre> <h2 id="module-module-based-supervisors" class="section-heading"> <a href="#module-module-based-supervisors" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Module-based supervisors </h2> <p>Similar to <a href="Supervisor.html"><code class="inline">Supervisor</code></a>, dynamic supervisors also support module-based supervisors.</p> <pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MyApp.DynamicSupervisor</span><span class="w"> </span><span class="k" data-group-id="9926862281-1">do</span><span class="w"> </span><span class="c1"># Automatically defines child_spec/1</span><span class="w"> </span><span class="kn">use</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">start_link</span><span class="p" data-group-id="9926862281-2">(</span><span class="n">arg</span><span class="p" data-group-id="9926862281-2">)</span><span class="w"> </span><span class="k" data-group-id="9926862281-3">do</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">start_link</span><span class="p" data-group-id="9926862281-4">(</span><span class="bp">__MODULE__</span><span class="p">,</span><span class="w"> </span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="bp">__MODULE__</span><span class="p" data-group-id="9926862281-4">)</span><span class="w"> </span><span class="k" data-group-id="9926862281-3">end</span><span class="w"> </span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">init</span><span class="p" data-group-id="9926862281-5">(</span><span class="c">_arg</span><span class="p" data-group-id="9926862281-5">)</span><span class="w"> </span><span class="k" data-group-id="9926862281-6">do</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">init</span><span class="p" data-group-id="9926862281-7">(</span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:one_for_one</span><span class="p" data-group-id="9926862281-7">)</span><span class="w"> </span><span class="k" data-group-id="9926862281-6">end</span><span class="w"> </span><span class="k" data-group-id="9926862281-1">end</span></code></pre> <p>See the <a href="Supervisor.html"><code class="inline">Supervisor</code></a> docs for a discussion of when you may want to use module-based supervisors.</p> <h2 id="module-name-registration" class="section-heading"> <a href="#module-name-registration" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Name registration </h2> <p>A supervisor is bound to the same name registration rules as a <a href="GenServer.html"><code class="inline">GenServer</code></a>. Read more about these rules in the documentation for <a href="GenServer.html"><code class="inline">GenServer</code></a>.</p> <h2 id="module-migrating-from-supervisor-s-simple_one_for_one" class="section-heading"> <a href="#module-migrating-from-supervisor-s-simple_one_for_one" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Migrating from Supervisor’s :simple_one_for_one </h2> <p>In case you were using the deprecated <code class="inline">:simple_one_for_one</code> strategy from the <a href="Supervisor.html"><code class="inline">Supervisor</code></a> module, you can migrate to the <a href="DynamicSupervisor.html#content"><code class="inline">DynamicSupervisor</code></a> in few steps.</p> <p>Imagine the given “old” code:</p> <pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MySupervisor</span><span class="w"> </span><span class="k" data-group-id="7409333693-1">do</span><span class="w"> </span><span class="kn">use</span><span class="w"> </span><span class="nc">Supervisor</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">start_link</span><span class="p" data-group-id="7409333693-2">(</span><span class="n">arg</span><span class="p" data-group-id="7409333693-2">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-3">do</span><span class="w"> </span><span class="nc">Supervisor</span><span class="o">.</span><span class="n">start_link</span><span class="p" data-group-id="7409333693-4">(</span><span class="bp">__MODULE__</span><span class="p">,</span><span class="w"> </span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="bp">__MODULE__</span><span class="p" data-group-id="7409333693-4">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-3">end</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">start_child</span><span class="p" data-group-id="7409333693-5">(</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="n">bar</span><span class="p">,</span><span class="w"> </span><span class="n">baz</span><span class="p" data-group-id="7409333693-5">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-6">do</span><span class="w"> </span><span class="c1"># This will start child by calling MyWorker.start_link(initial_arg, foo, bar, baz)</span><span class="w"> </span><span class="nc">Supervisor</span><span class="o">.</span><span class="n">start_child</span><span class="p" data-group-id="7409333693-7">(</span><span class="bp">__MODULE__</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7409333693-8">[</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="n">bar</span><span class="p">,</span><span class="w"> </span><span class="n">baz</span><span class="p" data-group-id="7409333693-8">]</span><span class="p" data-group-id="7409333693-7">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-6">end</span><span class="w"> </span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">init</span><span class="p" data-group-id="7409333693-9">(</span><span class="n">initial_arg</span><span class="p" data-group-id="7409333693-9">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-10">do</span><span class="w"> </span><span class="n">children</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7409333693-11">[</span><span class="w"> </span><span class="c1"># Or the deprecated: worker(MyWorker, [initial_arg])</span><span class="w"> </span><span class="p">%</span><span class="err">{</span><span class="ss">id</span><span class="p">:</span><span class="w"> </span><span class="nc">MyWorker</span><span class="p">,</span><span class="w"> </span><span class="ss">start</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="7409333693-12">{</span><span class="nc">MyWorker</span><span class="p">,</span><span class="w"> </span><span class="ss">:start_link</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7409333693-13">[</span><span class="n">initial_arg</span><span class="p" data-group-id="7409333693-13">]</span><span class="p" data-group-id="7409333693-12">}</span><span class="p">)</span><span class="w"> </span><span class="p" data-group-id="7409333693-11">]</span><span class="w"> </span><span class="nc">Supervisor</span><span class="o">.</span><span class="n">init</span><span class="p" data-group-id="7409333693-14">(</span><span class="n">children</span><span class="p">,</span><span class="w"> </span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:simple_one_for_one</span><span class="p" data-group-id="7409333693-14">)</span><span class="w"> </span><span class="k" data-group-id="7409333693-10">end</span><span class="w"> </span><span class="k" data-group-id="7409333693-1">end</span></code></pre> <p>It can be upgraded to the DynamicSupervisor like this:</p> <pre><code class="nohighlight makeup elixir"><span class="kd">defmodule</span><span class="w"> </span><span class="nc">MySupervisor</span><span class="w"> </span><span class="k" data-group-id="4636975147-1">do</span><span class="w"> </span><span class="kn">use</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">start_link</span><span class="p" data-group-id="4636975147-2">(</span><span class="n">arg</span><span class="p" data-group-id="4636975147-2">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-3">do</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">start_link</span><span class="p" data-group-id="4636975147-4">(</span><span class="bp">__MODULE__</span><span class="p">,</span><span class="w"> </span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">:</span><span class="w"> </span><span class="bp">__MODULE__</span><span class="p" data-group-id="4636975147-4">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-3">end</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">start_child</span><span class="p" data-group-id="4636975147-5">(</span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="n">bar</span><span class="p">,</span><span class="w"> </span><span class="n">baz</span><span class="p" data-group-id="4636975147-5">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-6">do</span><span class="w"> </span><span class="c1"># If MyWorker is not using the new child specs, we need to pass a map:</span><span class="w"> </span><span class="c1"># spec = %{id: MyWorker, start: {MyWorker, :start_link, [foo, bar, baz]}}</span><span class="w"> </span><span class="n">spec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="4636975147-7">{</span><span class="nc">MyWorker</span><span class="p">,</span><span class="w"> </span><span class="ss">foo</span><span class="p">:</span><span class="w"> </span><span class="n">foo</span><span class="p">,</span><span class="w"> </span><span class="ss">bar</span><span class="p">:</span><span class="w"> </span><span class="n">bar</span><span class="p">,</span><span class="w"> </span><span class="ss">baz</span><span class="p">:</span><span class="w"> </span><span class="n">baz</span><span class="p" data-group-id="4636975147-7">}</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">start_child</span><span class="p" data-group-id="4636975147-8">(</span><span class="bp">__MODULE__</span><span class="p">,</span><span class="w"> </span><span class="n">spec</span><span class="p" data-group-id="4636975147-8">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-6">end</span><span class="w"> </span><span class="na">@impl</span><span class="w"> </span><span class="no">true</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="nf">init</span><span class="p" data-group-id="4636975147-9">(</span><span class="n">initial_arg</span><span class="p" data-group-id="4636975147-9">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-10">do</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">init</span><span class="p" data-group-id="4636975147-11">(</span><span class="w"> </span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:one_for_one</span><span class="p">,</span><span class="w"> </span><span class="ss">extra_arguments</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="4636975147-12">[</span><span class="n">initial_arg</span><span class="p" data-group-id="4636975147-12">]</span><span class="w"> </span><span class="p" data-group-id="4636975147-11">)</span><span class="w"> </span><span class="k" data-group-id="4636975147-10">end</span><span class="w"> </span><span class="k" data-group-id="4636975147-1">end</span></code></pre> <p>The difference is that the <a href="DynamicSupervisor.html#content"><code class="inline">DynamicSupervisor</code></a> expects the child specification at the moment <a href="#start_child/2"><code class="inline">start_child/2</code></a> is called, and no longer on the init callback. If there are any initial arguments given on initialization, such as <code class="inline">[initial_arg]</code>, it can be given in the <code class="inline">:extra_arguments</code> flag on <a href="DynamicSupervisor.html#init/1"><code class="inline">DynamicSupervisor.init/1</code></a>.</p> </section> <section id="summary" class="details-list"> <h1 class="section-heading"> <a class="hover-link" href="#summary"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this section</span> </a> Summary </h1> <div class="summary-types summary"> <h2> <a href="#types">Types</a> </h2> <div class="summary-row"> <div class="summary-signature"> <a href="#t:init_option/0">init_option()</a> </div> <div class="summary-synopsis"><p>Options given to <a href="#start_link/2"><code class="inline">start_link/2</code></a> and <a href="#init/1"><code class="inline">init/1</code></a></p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#t:on_start_child/0">on_start_child()</a> </div> <div class="summary-synopsis"><p>Return values of <code class="inline">start_child</code> functions</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#t:option/0">option()</a> </div> <div class="summary-synopsis"><p>Option values used by the <code class="inline">start*</code> functions</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#t:options/0">options()</a> </div> <div class="summary-synopsis"><p>Options used by the <code class="inline">start*</code> functions</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#t:strategy/0">strategy()</a> </div> <div class="summary-synopsis"><p>Supported strategies</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#t:sup_flags/0">sup_flags()</a> </div> <div class="summary-synopsis"><p>The supervisor flags returned on init</p> </div> </div> </div> <div class="summary-functions summary"> <h2> <a href="#functions">Functions</a> </h2> <div class="summary-row"> <div class="summary-signature"> <a href="#child_spec/1">child_spec(opts)</a> </div> <div class="summary-synopsis"><p>Returns a specification to start a dynamic supervisor under a supervisor</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#count_children/1">count_children(supervisor)</a> </div> <div class="summary-synopsis"><p>Returns a map containing count values for the supervisor</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#init/1">init(options)</a> </div> <div class="summary-synopsis"><p>Receives a set of options that initializes a dynamic supervisor</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#start_child/2">start_child(supervisor, child_spec)</a> </div> <div class="summary-synopsis"><p>Dynamically adds a child specification to <code class="inline">supervisor</code> and starts that child</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#start_link/1">start_link(options)</a> </div> <div class="summary-synopsis"><p>Starts a supervisor with the given options</p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#start_link/3">start_link(mod, args, opts \\ [])</a> </div> <div class="summary-synopsis"><p>Starts a module-based supervisor process with the given <code class="inline">module</code> and <code class="inline">arg</code></p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#stop/3">stop(supervisor, reason \\ :normal, timeout \\ :infinity)</a> </div> <div class="summary-synopsis"><p>Synchronously stops the given supervisor with the given <code class="inline">reason</code></p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#terminate_child/2">terminate_child(supervisor, pid)</a> </div> <div class="summary-synopsis"><p>Terminates the given child identified by <code class="inline">pid</code></p> </div> </div> <div class="summary-row"> <div class="summary-signature"> <a href="#which_children/1">which_children(supervisor)</a> </div> <div class="summary-synopsis"><p>Returns a list with information about all children</p> </div> </div> </div> <div class="summary-callbacks summary"> <h2> <a href="#callbacks">Callbacks</a> </h2> <div class="summary-row"> <div class="summary-signature"> <a href="#c:init/1">init(args)</a> </div> <div class="summary-synopsis"><p>Callback invoked to start the supervisor and during hot code upgrades</p> </div> </div> </div> </section> <section id="types" class="details-list"> <h1 class="section-heading"> <a class="hover-link" href="#types"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this section</span> </a> Types </h1> <div class="types-list"> <div class="detail" id="t:init_option/0"> <div class="detail-header"> <a href="#t:init_option/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">init_option()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L156" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>init_option() :: {:strategy, <a href="#t:strategy/0">strategy</a>()} | {:max_restarts, <a href="typespecs.html#basic-types">non_neg_integer</a>()} | {:max_seconds, <a href="typespecs.html#basic-types">pos_integer</a>()} | {:max_children, <a href="typespecs.html#basic-types">non_neg_integer</a>() | :infinity} | {:extra_arguments, [<a href="typespecs.html#built-in-types">term</a>()]}</pre> </div> </div> <section class="docstring"> <p>Options given to <a href="#start_link/2"><code class="inline">start_link/2</code></a> and <a href="#init/1"><code class="inline">init/1</code></a></p> </section> </div> <div class="detail" id="t:on_start_child/0"> <div class="detail-header"> <a href="#t:on_start_child/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">on_start_child()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L167" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>on_start_child() :: {:ok, <a href="typespecs.html#basic-types">pid</a>()} | {:ok, <a href="typespecs.html#basic-types">pid</a>(), info :: <a href="typespecs.html#built-in-types">term</a>()} | :ignore | {:error, {:already_started, <a href="typespecs.html#basic-types">pid</a>()} | :max_children | <a href="typespecs.html#built-in-types">term</a>()}</pre> </div> </div> <section class="docstring"> <p>Return values of <code class="inline">start_child</code> functions</p> </section> </div> <div class="detail" id="t:option/0"> <div class="detail-header"> <a href="#t:option/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">option()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L150" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>option() :: {:name, <a href="Supervisor.html#t:name/0">Supervisor.name</a>()} | <a href="#t:init_option/0">init_option</a>()</pre> </div> </div> <section class="docstring"> <p>Option values used by the <code class="inline">start*</code> functions</p> </section> </div> <div class="detail" id="t:options/0"> <div class="detail-header"> <a href="#t:options/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">options()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L153" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>options() :: [<a href="#t:option/0">option</a>(), ...]</pre> </div> </div> <section class="docstring"> <p>Options used by the <code class="inline">start*</code> functions</p> </section> </div> <div class="detail" id="t:strategy/0"> <div class="detail-header"> <a href="#t:strategy/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">strategy()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L164" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>strategy() :: :one_for_one</pre> </div> </div> <section class="docstring"> <p>Supported strategies</p> </section> </div> <div class="detail" id="t:sup_flags/0"> <div class="detail-header"> <a href="#t:sup_flags/0" class="detail-link" title="Link to this type"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this type</span> </a> <span class="signature">sup_flags()</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L141" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>sup_flags() :: %{ strategy: <a href="#t:strategy/0">strategy</a>(), intensity: <a href="typespecs.html#basic-types">non_neg_integer</a>(), period: <a href="typespecs.html#basic-types">pos_integer</a>(), max_children: <a href="typespecs.html#basic-types">non_neg_integer</a>() | :infinity, extra_arguments: [<a href="typespecs.html#built-in-types">term</a>()] }</pre> </div> </div> <section class="docstring"> <p>The supervisor flags returned on init</p> </section> </div> </div> </section> <section id="functions" class="details-list"> <h1 class="section-heading"> <a class="hover-link" href="#functions"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this section</span> </a> Functions </h1> <div class="detail" id="child_spec/1"> <div class="detail-header"> <a href="#child_spec/1" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">child_spec(opts)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L192" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.1)</span> </div> <section class="docstring"> <p>Returns a specification to start a dynamic supervisor under a supervisor.</p> <p>See <a href="Supervisor.html"><code class="inline">Supervisor</code></a>.</p> </section> </div> <div class="detail" id="count_children/1"> <div class="detail-header"> <a href="#count_children/1" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">count_children(supervisor)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L444" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>count_children(<a href="Supervisor.html#t:supervisor/0">Supervisor.supervisor</a>()) :: %{ specs: <a href="typespecs.html#basic-types">non_neg_integer</a>(), active: <a href="typespecs.html#basic-types">non_neg_integer</a>(), supervisors: <a href="typespecs.html#basic-types">non_neg_integer</a>(), workers: <a href="typespecs.html#basic-types">non_neg_integer</a>() }</pre> </div> </div> <section class="docstring"> <p>Returns a map containing count values for the supervisor.</p> <p>The map contains the following keys:</p> <ul> <li><p><code class="inline">:specs</code> - the number of children processes</p> </li> <li><p><code class="inline">:active</code> - the count of all actively running child processes managed by this supervisor</p> </li> <li><p><code class="inline">:supervisors</code> - the count of all supervisors whether or not the child process is still alive</p> </li> <li><p><code class="inline">:workers</code> - the count of all workers, whether or not the child process is still alive</p> </li> </ul> </section> </div> <div class="detail" id="init/1"> <div class="detail-header"> <a href="#init/1" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">init(options)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L530" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>init([<a href="#t:init_option/0">init_option</a>()]) :: {:ok, <a href="#t:sup_flags/0">sup_flags</a>()}</pre> </div> </div> <section class="docstring"> <p>Receives a set of options that initializes a dynamic supervisor.</p> <p>This is typically invoked at the end of the <a href="#c:init/1"><code class="inline">init/1</code></a> callback of module-based supervisors. See the sections “Module-based supervisors” in the module documentation for more information.</p> <p>The options received by this function are also supported by <a href="#start_link/2"><code class="inline">start_link/2</code></a>.</p> <p>This function returns a tuple containing the supervisor options.</p> <h2 id="init/1-examples" class="section-heading"> <a href="#init/1-examples" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Examples </h2> <pre><code class="nohighlight makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">init</span><span class="p" data-group-id="8807558092-1">(</span><span class="c">_arg</span><span class="p" data-group-id="8807558092-1">)</span><span class="w"> </span><span class="k" data-group-id="8807558092-2">do</span><span class="w"> </span><span class="nc">DynamicSupervisor</span><span class="o">.</span><span class="n">init</span><span class="p" data-group-id="8807558092-3">(</span><span class="ss">max_children</span><span class="p">:</span><span class="w"> </span><span class="mi">1000</span><span class="p">,</span><span class="w"> </span><span class="ss">strategy</span><span class="p">:</span><span class="w"> </span><span class="ss">:one_for_one</span><span class="p" data-group-id="8807558092-3">)</span><span class="w"> </span><span class="k" data-group-id="8807558092-2">end</span></code></pre> <h2 id="init/1-options" class="section-heading"> <a href="#init/1-options" class="hover-link"><span class="icon-link" aria-hidden="true"></span></a> Options </h2> <ul> <li><p><code class="inline">:strategy</code> - the restart strategy option. The only supported value is <code class="inline">:one_for_one</code> which means that no other child is terminate if a child process terminates. You can learn more about strategies in the <a href="Supervisor.html"><code class="inline">Supervisor</code></a> module docs.</p> </li> <li><p><code class="inline">:max_restarts</code> - the maximum number of restarts allowed in a time frame. Defaults to <code class="inline">3</code>.</p> </li> <li><p><code class="inline">:max_seconds</code> - the time frame in which <code class="inline">:max_restarts</code> applies. Defaults to <code class="inline">5</code>.</p> </li> <li><p><code class="inline">:max_children</code> - the maximum amount of children to be running under this supervisor at the same time. When <code class="inline">:max_children</code> is exceeded, <a href="#start_child/2"><code class="inline">start_child/2</code></a> returns <code class="inline">{:error, :max_children}</code>. Defaults to <code class="inline">:infinity</code>.</p> </li> <li><p><code class="inline">:extra_arguments</code> - arguments that are prepended to the arguments specified in the child spec given to <a href="#start_child/2"><code class="inline">start_child/2</code></a>. Defaults to an empty list.</p> </li> </ul> </section> </div> <div class="detail" id="start_child/2"> <div class="detail-header"> <a href="#start_child/2" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">start_child(supervisor, child_spec)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L314" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>start_child( <a href="Supervisor.html#t:supervisor/0">Supervisor.supervisor</a>(), <a href="http://www.erlang.org/doc/man/supervisor.html#type-child_spec">:supervisor.child_spec</a>() | {<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#built-in-types">term</a>()} | <a href="typespecs.html#built-in-types">module</a>() ) :: <a href="#t:on_start_child/0">on_start_child</a>()</pre> </div> </div> <section class="docstring"> <p>Dynamically adds a child specification to <code class="inline">supervisor</code> and starts that child.</p> <p><code class="inline">child_spec</code> should be a valid child specification as detailed in the “child_spec/1” section of the documentation for <a href="Supervisor.html"><code class="inline">Supervisor</code></a>. The child process will be started as defined in the child specification.</p> <p>If the child process start function returns <code class="inline">{:ok, child}</code> or <code class="inline">{:ok, child, info}</code>, then child specification and PID are added to the supervisor and this function returns the same value.</p> <p>If the child process start function returns <code class="inline">:ignore</code>, then no child is added to the supervision tree and this function returns <code class="inline">:ignore</code> too.</p> <p>If the child process start function returns an error tuple or an erroneous value, or if it fails, the child specification is discarded and this function returns <code class="inline">{:error, error}</code> where <code class="inline">error</code> is a term containing information about the error and child specification.</p> <p>If the supervisor already has N children in a way that N exceeds the amount of <code class="inline">:max_children</code> set on the supervisor initialization (see <a href="#init/1"><code class="inline">init/1</code></a>), then this function returns <code class="inline">{:error, :max_children}</code>.</p> </section> </div> <div class="detail" id="start_link/1"> <div class="detail-header"> <a href="#start_link/1" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">start_link(options)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L254" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>start_link(<a href="#t:options/0">options</a>()) :: <a href="Supervisor.html#t:on_start/0">Supervisor.on_start</a>()</pre> </div> </div> <section class="docstring"> <p>Starts a supervisor with the given options.</p> <p>The <code class="inline">:strategy</code> is a required option and the currently supported value is <code class="inline">:one_for_one</code>. The remaining options can be found in the <a href="#init/1"><code class="inline">init/1</code></a> docs.</p> <p>The <code class="inline">:name</code> option can also be used to register a supervisor name. The supported values are described under the “Name registration” section in the <a href="GenServer.html"><code class="inline">GenServer</code></a> module docs.</p> <p>If the supervisor is successfully spawned, this function returns <code class="inline">{:ok, pid}</code>, where <code class="inline">pid</code> is the PID of the supervisor. If the supervisor is given a name and a process with the specified name already exists, the function returns <code class="inline">{:error, {:already_started, pid}}</code>, where <code class="inline">pid</code> is the PID of that process.</p> <p>Note that a supervisor started with this function is linked to the parent process and exits not only on crashes but also if the parent process exits with <code class="inline">:normal</code> reason.</p> </section> </div> <div class="detail" id="start_link/3"> <span id="start_link/2"></span> <div class="detail-header"> <a href="#start_link/3" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">start_link(mod, args, opts \\ [])</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L280" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>start_link(<a href="typespecs.html#built-in-types">module</a>(), <a href="typespecs.html#built-in-types">term</a>(), <a href="GenServer.html#t:options/0">GenServer.options</a>()) :: <a href="Supervisor.html#t:on_start/0">Supervisor.on_start</a>()</pre> </div> </div> <section class="docstring"> <p>Starts a module-based supervisor process with the given <code class="inline">module</code> and <code class="inline">arg</code>.</p> <p>To start the supervisor, the <a href="#c:init/1"><code class="inline">init/1</code></a> callback will be invoked in the given <code class="inline">module</code>, with <code class="inline">arg</code> as its argument. The <a href="#c:init/1"><code class="inline">init/1</code></a> callback must return a supervisor specification which can be created with the help of the <a href="#init/1"><code class="inline">init/1</code></a> function.</p> <p>If the <a href="#c:init/1"><code class="inline">init/1</code></a> callback returns <code class="inline">:ignore</code>, this function returns <code class="inline">:ignore</code> as well and the supervisor terminates with reason <code class="inline">:normal</code>. If it fails or returns an incorrect value, this function returns <code class="inline">{:error, term}</code> where <code class="inline">term</code> is a term with information about the error, and the supervisor terminates with reason <code class="inline">term</code>.</p> <p>The <code class="inline">:name</code> option can also be given in order to register a supervisor name, the supported values are described in the “Name registration” section in the <a href="GenServer.html"><code class="inline">GenServer</code></a> module docs.</p> </section> </div> <div class="detail" id="stop/3"> <span id="stop/1"></span> <span id="stop/2"></span> <div class="detail-header"> <a href="#stop/3" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">stop(supervisor, reason \\ :normal, timeout \\ :infinity)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L460" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.7.0)</span> <div class="specs"> <pre>stop(<a href="Supervisor.html#t:supervisor/0">Supervisor.supervisor</a>(), reason :: <a href="typespecs.html#built-in-types">term</a>(), <a href="typespecs.html#built-in-types">timeout</a>()) :: :ok</pre> </div> </div> <section class="docstring"> <p>Synchronously stops the given supervisor with the given <code class="inline">reason</code>.</p> <p>It returns <code class="inline">:ok</code> if the supervisor terminates with the given reason. If it terminates with another reason, the call exits.</p> <p>This function keeps OTP semantics regarding error reporting. If the reason is any other than <code class="inline">:normal</code>, <code class="inline">:shutdown</code> or <code class="inline">{:shutdown, _}</code>, an error report is logged.</p> </section> </div> <div class="detail" id="terminate_child/2"> <div class="detail-header"> <a href="#terminate_child/2" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">terminate_child(supervisor, pid)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L388" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>terminate_child(<a href="Supervisor.html#t:supervisor/0">Supervisor.supervisor</a>(), <a href="typespecs.html#basic-types">pid</a>()) :: :ok | {:error, :not_found}</pre> </div> </div> <section class="docstring"> <p>Terminates the given child identified by <code class="inline">pid</code>.</p> <p>If successful, this function returns <code class="inline">:ok</code>. If there is no process with the given PID, this function returns <code class="inline">{:error, :not_found}</code>.</p> </section> </div> <div class="detail" id="which_children/1"> <div class="detail-header"> <a href="#which_children/1" class="detail-link" title="Link to this function"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this function</span> </a> <span class="signature">which_children(supervisor)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L416" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <span class="note">(since 1.6.0)</span> <div class="specs"> <pre>which_children(<a href="Supervisor.html#t:supervisor/0">Supervisor.supervisor</a>()) :: [ {:undefined, <a href="typespecs.html#basic-types">pid</a>() | :restarting, :worker | :supervisor, <a href="http://www.erlang.org/doc/man/supervisor.html#type-modules">:supervisor.modules</a>()} ]</pre> </div> </div> <section class="docstring"> <p>Returns a list with information about all children.</p> <p>Note that calling this function when supervising a large number of children under low memory conditions can cause an out of memory exception.</p> <p>This function returns a list of tuples containing:</p> <ul> <li><p><code class="inline">id</code> - it is always <code class="inline">:undefined</code> for dynamic supervisors</p> </li> <li><p><code class="inline">child</code> - the pid of the corresponding child process or the atom <code class="inline">:restarting</code> if the process is about to be restarted</p> </li> <li><p><code class="inline">type</code> - <code class="inline">:worker</code> or <code class="inline">:supervisor</code> as defined in the child specification</p> </li> <li><p><code class="inline">modules</code> - as defined in the child specification</p> </li> </ul> </section> </div> </section> <section id="callbacks" class="details-list"> <h1 class="section-heading"> <a class="hover-link" href="#callbacks"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this section</span> </a> Callbacks </h1> <div class="detail" id="c:init/1"> <div class="detail-header"> <a href="#c:init/1" class="detail-link" title="Link to this callback"> <span class="icon-link" aria-hidden="true"></span> <span class="sr-only">Link to this callback</span> </a> <span class="signature">init(args)</span> <a href="https://github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/dynamic_supervisor.ex#L138" class="view-source" rel="help" title="View Source"> <span class="icon-code" aria-hidden="true"></span> <span class="sr-only">View Source</span> </a> <div class="specs"> <pre>init(args :: <a href="typespecs.html#built-in-types">term</a>()) :: {:ok, <a href="#t:sup_flags/0">sup_flags</a>()} | :ignore</pre> </div> </div> <section class="docstring"> <p>Callback invoked to start the supervisor and during hot code upgrades.</p> <p>Developers typically invoke <a href="DynamicSupervisor.html#init/1"><code class="inline">DynamicSupervisor.init/1</code></a> at the end of their init callback to return the proper supervision flags.</p> </section> </div> </section> <footer class="footer"> <p> <span class="line"> Built using <a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener">ExDoc</a> (v0.19.1), </span> <span class="line"> designed by <a href="https://twitter.com/dignifiedquire" target="_blank" rel="noopener" title="@dignifiedquire">Friedel Ziegelmayer</a>. </span> </p> </footer> </div> </div> </section> </div> <script src="dist/app-a0c90688fa.js"></script> </body> </html>