Current section

Files

Jump to
hackney src hackney_conn_sup.erl
Raw

src/hackney_conn_sup.erl

%%% -*- erlang -*-
%%%
%%% This file is part of hackney released under the Apache 2 license.
%%% See the NOTICE for more information.
%%%
%%% Copyright (c) 2024 Benoit Chesneau
%%%
%%% @doc Supervisor for hackney_conn connection processes.
%%%
%%% This is a simple_one_for_one supervisor that dynamically starts
%%% hackney_conn gen_statem processes for each connection.
-module(hackney_conn_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
-export([start_conn/1]).
-export([stop_conn/1]).
-export([stop_all/0]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
%% @doc Start the supervisor.
-spec start_link() -> {ok, pid()} | {error, term()}.
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%% @doc Start a new connection process.
%% Opts is a map with at least host, port, and transport.
-spec start_conn(map()) -> {ok, pid()} | {error, term()}.
start_conn(Opts) ->
supervisor:start_child(?SERVER, [Opts]).
%% @doc Stop a connection process gracefully.
-spec stop_conn(pid()) -> ok.
stop_conn(Pid) ->
hackney_conn:stop(Pid).
%% @doc Stop all connection processes gracefully.
%% Useful for test cleanup.
-spec stop_all() -> ok.
stop_all() ->
try
Children = supervisor:which_children(?SERVER),
lists:foreach(fun({_, Pid, _, _}) when is_pid(Pid) ->
try
hackney_conn:stop(Pid)
catch
_:_ -> ok
end;
(_) -> ok
end, Children),
ok
catch
exit:{noproc, _} -> ok;
_:_ -> ok
end.
%%====================================================================
%% Supervisor callbacks
%%====================================================================
init([]) ->
SupFlags = #{
strategy => simple_one_for_one,
intensity => 10,
period => 10
},
ChildSpec = #{
id => hackney_conn,
start => {hackney_conn, start_link, []},
restart => temporary,
shutdown => 5000,
type => worker,
modules => [hackney_conn]
},
{ok, {SupFlags, [ChildSpec]}}.