Packages
macula
0.45.2
7.0.0
6.0.0
5.2.2
5.2.1
5.2.0
5.1.0
5.0.0
4.8.0
4.7.1
4.7.0
4.6.0
4.5.0
4.4.10
4.4.9
4.4.8
4.4.7
4.4.6
4.4.5
4.4.4
4.4.3
4.4.2
4.4.1
4.4.0
4.3.1
4.3.0
4.2.9
4.2.8
4.2.7
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.1
4.1.0
4.0.0
3.16.0
3.15.3
3.15.2
3.15.1
3.14.0
3.13.0
3.12.1
3.12.0
3.11.1
3.11.0
3.10.3
3.10.2
3.10.1
3.9.0
3.8.0
3.7.0
3.5.0
3.4.0
3.3.0
3.2.0
3.1.0
3.0.0
2.1.1
2.1.0
2.0.0
1.5.2
1.5.1
1.4.30
1.4.29
1.4.28
1.4.27
1.4.26
1.4.25
1.4.24
1.4.23
1.4.22
1.4.21
1.4.20
1.4.19
1.4.18
1.4.17
1.4.16
1.4.15
1.4.14
1.4.13
1.4.11
1.4.10
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.1
1.3.0
1.2.0
1.1.0
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.48.6
0.48.5
0.48.4
0.48.3
0.48.2
0.48.1
0.48.0
0.47.1
0.47.0
0.46.3
0.46.1
0.46.0
0.45.3
0.45.2
0.45.1
0.45.0
0.44.2
0.44.1
0.44.0
0.43.3
0.43.2
0.43.1
0.43.0
0.42.9
0.42.8
0.42.7
0.42.6
0.42.5
0.42.4
0.42.3
0.42.2
0.42.1
0.42.0
0.41.1
0.41.0
0.40.1
0.40.0
0.39.9
0.39.8
0.39.7
0.39.6
0.39.5
0.39.4
0.39.3
0.39.2
0.39.1
0.39.0
0.38.8
0.38.7
0.38.6
0.38.5
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.7
0.37.6
0.37.5
0.37.4
0.37.3
0.37.2
0.37.1
0.37.0
0.36.6
0.36.5
0.36.4
0.36.3
0.36.2
0.36.1
0.36.0
0.35.4
0.35.3
0.35.2
0.35.1
0.35.0
0.34.1
0.34.0
0.33.1
0.33.0
0.32.5
0.32.4
0.32.3
0.32.2
0.32.1
0.32.0
0.31.9
0.31.8
0.31.7
0.31.6
0.31.5
0.31.4
0.31.3
0.31.2
0.31.1
0.31.0
0.30.10
0.30.9
0.30.8
0.30.7
0.30.6
0.30.5
0.30.4
0.30.3
0.30.2
0.30.1
0.30.0
0.29.0
0.28.3
0.28.2
0.28.1
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.6
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.6
0.24.5
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.12
0.22.11
0.22.10
0.22.9
0.22.8
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.7
0.21.6
0.21.5
0.21.4
0.21.2
0.21.1
0.21.0
0.20.25
0.20.24
0.20.23
0.20.22
0.20.21
0.20.20
0.20.19
0.20.18
0.20.17
0.20.16
0.20.15
0.20.14
0.20.13
0.20.12
0.20.11
0.20.10
0.20.9
0.20.8
0.20.7
0.20.6
0.20.5
0.20.3
0.20.2
0.20.1
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.12.6
0.12.5
0.12.3
0.11.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.30
0.7.29
0.7.28
0.7.27
0.7.26
0.7.25
0.7.24
0.7.23
0.7.22
0.7.21
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.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.4
0.3.3
0.3.2
0.3.1
Macula HTTP/3 Mesh SDK — connect, subscribe, publish, call, advertise
Current section
Files
Jump to
Current section
Files
src/macula_gateway_system/macula_gateway_workers_sup.erl
%%%-------------------------------------------------------------------
%%% @doc
%%% Gateway Workers Supervisor - supervises gateway worker processes.
%%%
%%% Supervision Strategy:
%%% - rest_for_one: If child N crashes, restart N and all children after N
%%% - Rationale: Only clients is foundational; pubsub/rpc/mesh depend
%%% on it but are independent of each other. This strategy provides fault
%%% isolation while maintaining consistency when clients restarts.
%%%
%%% Children (in dependency order):
%%% - macula_gateway_clients: Client tracking (foundational)
%%% - macula_gateway_pubsub: Pub/Sub message routing (depends on clients)
%%% - macula_gateway_rpc: RPC handler registration and routing (depends on clients)
%%% - macula_gateway_mesh: Mesh connection pooling and management (independent)
%%%
%%% Fault Isolation Examples:
%%% - mesh crash → only mesh restarts (0 clients disconnected)
%%% - rpc crash → rpc + mesh restart (0 clients disconnected)
%%% - pubsub crash → pubsub + rpc + mesh restart (0 clients disconnected)
%%% - clients crash → all restart (unavoidable - foundational)
%%%
%%% Extracted from macula_gateway.erl (Phase 6, 9)
%%% Renamed from macula_gateway_sup (Phase 2 QUIC refactoring)
%%% @end
%%%-------------------------------------------------------------------
-module(macula_gateway_workers_sup).
-behaviour(supervisor).
-include_lib("kernel/include/logger.hrl").
%% API
-export([
start_link/1,
get_clients/1,
get_pubsub/1,
get_rpc/1,
get_mesh/1
]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%%===================================================================
%%% API
%%%===================================================================
%% @doc Start the gateway supervisor with configuration.
-spec start_link(map()) -> {ok, pid()} | {error, term()}.
start_link(Config) ->
supervisor:start_link(?MODULE, Config).
%% @doc Get the clients worker child PID.
-spec get_clients(pid()) -> {ok, pid()} | {error, not_found}.
get_clients(SupPid) ->
get_child_pid(SupPid, macula_gateway_clients).
%% @doc Get the pubsub handler child PID.
-spec get_pubsub(pid()) -> {ok, pid()} | {error, not_found}.
get_pubsub(SupPid) ->
get_child_pid(SupPid, macula_gateway_pubsub).
%% @doc Get the RPC handler child PID.
-spec get_rpc(pid()) -> {ok, pid()} | {error, not_found}.
get_rpc(SupPid) ->
get_child_pid(SupPid, macula_gateway_rpc).
%% @doc Get the mesh connection manager child PID.
-spec get_mesh(pid()) -> {ok, pid()} | {error, not_found}.
get_mesh(SupPid) ->
get_child_pid(SupPid, macula_gateway_mesh).
%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================
init(Config) ->
?LOG_INFO("Initializing gateway workers supervisor"),
?LOG_DEBUG("Config: ~p", [Config]),
%% Supervision strategy: rest_for_one
%% - If child N crashes, restart N and all children after N
%% - Provides fault isolation while maintaining dependency consistency
%% - Max 10 restarts in 60 seconds
SupFlags = #{
strategy => rest_for_one,
intensity => 10,
period => 60
},
?LOG_DEBUG("Building child specifications..."),
%% Child specifications
Children = [
%% Clients - tracks connected clients and streams
#{
id => macula_gateway_clients,
start => {macula_gateway_clients, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_gateway_clients]
},
%% Subscriber Cache - caches DHT topic→subscribers lookups (5-10x latency improvement)
#{
id => macula_subscriber_cache,
start => {macula_subscriber_cache, start_link, [#{ttl_ms => 5000}]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_subscriber_cache]
},
%% Direct Routing Table - caches NodeId→Endpoint for direct P2P routing (3-5x improvement)
#{
id => macula_direct_routing,
start => {macula_direct_routing, start_link, [#{ttl_ms => 300000}]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_direct_routing]
},
%% Pub/Sub Handler - routes published messages to subscribers
#{
id => macula_gateway_pubsub,
start => {macula_gateway_pubsub, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_gateway_pubsub]
},
%% RPC Handler - manages RPC handler registration and routing
#{
id => macula_gateway_rpc,
start => {macula_gateway_rpc, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_gateway_rpc]
},
%% Mesh Connection Manager - pools QUIC connections to remote peers
#{
id => macula_gateway_mesh,
start => {macula_gateway_mesh, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_gateway_mesh]
},
%% Peer Connection Pool - pools outbound QUIC connections (1.5-2x latency improvement)
#{
id => macula_peer_connection_pool,
start => {macula_peer_connection_pool, start_link, [#{max_connections => 100, idle_timeout_ms => 60000}]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_peer_connection_pool]
},
%% mDNS Discovery - discovers LAN peers and populates direct routing table
#{
id => macula_gateway_mdns_discovery,
start => {macula_gateway_mdns_discovery, start_link, [Config]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => [macula_gateway_mdns_discovery]
}
],
?LOG_DEBUG("Child specs built, returning from init"),
{ok, {SupFlags, Children}}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
%% @doc Get a child process PID by child ID.
-spec get_child_pid(pid(), atom()) -> {ok, pid()} | {error, not_found}.
get_child_pid(SupPid, ChildId) ->
case supervisor:which_children(SupPid) of
Children when is_list(Children) ->
extract_child_pid(lists:keyfind(ChildId, 1, Children));
_ ->
{error, not_found}
end.
%% @doc Extract child PID from keyfind result.
extract_child_pid({_, ChildPid, _Type, _Modules}) when is_pid(ChildPid) ->
{ok, ChildPid};
extract_child_pid(_) ->
{error, not_found}.