Macula HTTP/3 Mesh - Project Structure and Libraries
View SourceActual Erlang/Elixir projects and libraries to build
Created: 2025-01-08 Status: Planning Document
Overview
This document outlines the actual Erlang/Elixir libraries, applications, and projects that need to be created to implement the Macula HTTP/3 Mesh platform.
Repository Organization Strategy
Option A: Monorepo (Recommended for Initial Development)
macula/
├── src/
│ ├── macula_bootstrap_system/ # DHT bootstrap and discovery
│ ├── macula_bridge_system/ # Hierarchical DHT bridge (v0.13.0)
│ │ ├── macula_bridge_system.erl # Supervisor
│ │ ├── macula_bridge_node.erl # Parent mesh connection
│ │ ├── macula_bridge_mesh.erl # Peer bridge mesh
│ │ └── macula_bridge_cache.erl # Query result caching
│ ├── macula_dist_system/ # Distributed Erlang over QUIC
│ ├── macula_gateway_system/ # QUIC message routing
│ ├── macula_membership_system/ # SWIM membership protocol
│ ├── macula_nat_system/ # NAT traversal (v0.12.0)
│ ├── macula_peer_system/ # Peer connection management
│ ├── macula_platform_system/ # Ra/Raft consensus (v0.9.0)
│ ├── macula_pubsub_system/ # Pub/sub implementation
│ ├── macula_routing_system/ # Kademlia DHT routing
│ ├── macula_rpc_system/ # RPC and async request/reply
│ ├── macula_security_system/ # TLS, realm auth (v0.11.0)
│ └── macula_*.erl # Core modules
├── test/
│ ├── macula_bridge_system/ # Bridge system tests (40 tests)
│ ├── macula_nat_system/ # NAT traversal tests
│ └── ... # Other subsystem tests
├── rebar.config # Rebar3 config
├── CLAUDE.md # Project guidelines
└── README.mdBenefits:
- Easy cross-library development
- Shared dependencies
- Single release
- Atomic commits across components
- Simplified CI/CD
Option B: Multi-repo (For Maturity/Modularity)
Separate repositories for each library (similar to Erlang/OTP structure).
Benefits:
- Independent versioning
- Smaller, focused repos
- Can use different libraries independently
- Clear boundaries
Recommendation: Start with Option A (monorepo), split later if needed.
Core Libraries (Required for MVP)
1. macula_core
Purpose: Core types, protocols, and shared utilities.
Modules:
%% Core types
macula_types.erl - Common type definitions
macula_node.erl - Node identity and metadata
macula_realm.erl - Realm management
macula_topic.erl - Topic parsing and validation
%% Utilities
macula_time.erl - Time utilities
macula_id.erl - ID generation (SHA-256 node IDs)
macula_uri.erl - Macula URI parsing (macula://realm/node)Dependencies: None (pure Erlang)
Rebar3 Config:
{application, macula_core, [
{description, "Macula core types and protocols"},
{vsn, "0.1.0"},
{modules, []},
{registered, []},
{applications, [kernel, stdlib]}
]}.2. macula_quic
Purpose: QUIC transport layer (wrapper around quicer).
Modules:
macula_quic_listener.erl - QUIC listener (accept connections)
macula_quic_client.erl - QUIC client (initiate connections)
macula_quic_connection.erl - GenServer per QUIC connection
macula_quic_stream.erl - Stream management
macula_quic_config.erl - QUIC configuration (TLS, ALPN, etc.)Dependencies:
quicer(NIF for MsQuic)
Key Features:
- Connection pooling
- Stream multiplexing
- 0-RTT support
- Connection migration
- Backpressure handling
Rebar3 Config:
{application, macula_quic, [
{description, "Macula QUIC transport layer"},
{vsn, "0.1.0"},
{modules, []},
{registered, []},
{applications, [kernel, stdlib, macula_core, quicer]},
{mod, {macula_quic_app, []}}
]}.
{deps, [
{quicer, {git, "https://github.com/emqx/quic.git", {branch, "main"}}}
]}.3. macula_protocol
Purpose: Wire protocol (message framing, encoding/decoding).
Modules:
macula_protocol.erl - Main protocol API
macula_frame.erl - Frame encoding/decoding
macula_message.erl - Message types and validation
macula_codec.erl - Binary serialization (Erlang term format or MessagePack)Message Types:
-define(MSG_HANDSHAKE, 16#01).
-define(MSG_HANDSHAKE_ACK, 16#02).
-define(MSG_HEARTBEAT, 16#03).
-define(MSG_PING, 16#04).
-define(MSG_PONG, 16#05).
-define(MSG_PUBLISH, 16#10).
-define(MSG_SUBSCRIBE, 16#11).
-define(MSG_UNSUBSCRIBE, 16#12).
-define(MSG_EVENT, 16#13).
-define(MSG_RPC_CALL, 16#20).
-define(MSG_RPC_RESULT, 16#21).
-define(MSG_RPC_ERROR, 16#22).
-define(MSG_ERROR, 16#F0).
-define(MSG_CLOSE, 16#FF).Dependencies:
macula_core
Optional Dependencies:
msgpack(if using MessagePack instead of Erlang term format)
Rebar3 Config:
{application, macula_protocol, [
{description, "Macula wire protocol"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core]}
]}.4. macula_membership
Purpose: SWIM-based membership and failure detection.
Modules:
macula_membership.erl - Main membership API
macula_swim.erl - SWIM protocol GenServer
macula_swim_detector.erl - Failure detector
macula_swim_gossip.erl - Gossip dissemination
macula_member.erl - Member record and stateFeatures:
- Membership list management
- Direct ping / indirect ping
- Suspicion mechanism
- Incarnation numbers
- Realm-scoped membership
Dependencies:
macula_coremacula_protocolmacula_quic
Rebar3 Config:
{application, macula_membership, [
{description, "Macula SWIM membership"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_protocol, macula_quic]},
{mod, {macula_membership_app, []}}
]}.5. macula_routing
Purpose: Kademlia DHT for routing.
Modules:
macula_routing.erl - Routing API
macula_kademlia.erl - Kademlia DHT GenServer
macula_k_bucket.erl - K-bucket management
macula_node_lookup.erl - Node lookup (iterative)
macula_topic_registry.erl - Topic → Nodes mapping (for pub/sub)
macula_rpc_registry.erl - RPC name → Node mappingFeatures:
- 256 k-buckets (for 256-bit node IDs)
- XOR distance metric
- Iterative lookups
- Bucket refresh
- Realm partitioning
Dependencies:
macula_coremacula_membership
Rebar3 Config:
{application, macula_routing, [
{description, "Macula Kademlia DHT routing"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_membership]},
{mod, {macula_routing_app, []}}
]}.6. macula_topology
Purpose: Mesh topology management (k-regular graph).
Modules:
macula_topology.erl - Topology management
macula_k_regular.erl - k-regular graph algorithm
macula_connection_pool.erl - Connection pool supervisor
macula_connection.erl - GenServer per peer connectionFeatures:
- k-regular graph topology
- Connection lifecycle (connect, disconnect, reconnect)
- Exponential backoff for reconnections
- Topology visualization
Dependencies:
macula_coremacula_quicmacula_membershipmacula_routing
Rebar3 Config:
{application, macula_topology, [
{description, "Macula mesh topology management"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_quic,
macula_membership, macula_routing]},
{mod, {macula_topology_app, []}}
]}.7. macula_pubsub
Purpose: Publish/subscribe messaging.
Modules:
macula_pubsub.erl - Pub/sub API
macula_topic_tree.erl - Topic subscription tree (pattern matching)
macula_subscription.erl - Subscription management
macula_publisher.erl - Publishing logic
macula_event_router.erl - Event routing to subscribersFeatures:
- Topic pattern matching (exact, prefix, wildcard)
- Local and remote subscriptions
- Subscription announcements (via DHT)
- Event delivery guarantees (at-most-once, at-least-once)
Dependencies:
macula_coremacula_protocolmacula_routingmacula_topology
Rebar3 Config:
{application, macula_pubsub, [
{description, "Macula pub/sub messaging"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_protocol,
macula_routing, macula_topology]},
{mod, {macula_pubsub_app, []}}
]}.8. macula_rpc
Purpose: Remote procedure call (RPC) implementation.
Modules:
macula_rpc.erl - RPC API (call, register, unregister)
macula_rpc_server.erl - RPC request handler
macula_rpc_client.erl - RPC call client
macula_rpc_registry.erl - Local RPC endpoint registryFeatures:
- Synchronous RPC (with timeout)
- Asynchronous RPC (cast)
- RPC endpoint registration (name → handler function)
- Endpoint discovery via DHT
- Load balancing (if multiple nodes register same RPC)
Dependencies:
macula_coremacula_protocolmacula_routingmacula_topology
Rebar3 Config:
{application, macula_rpc, [
{description, "Macula RPC"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_protocol,
macula_routing, macula_topology]},
{mod, {macula_rpc_app, []}}
]}.9. macula_discovery
Purpose: Node discovery (DNS-SD, mDNS, static, cloud).
Modules:
macula_discovery.erl - Discovery coordinator
macula_discovery_static.erl - Static bootstrap nodes
macula_discovery_mdns.erl - mDNS (Multicast DNS)
macula_discovery_dns.erl - DNS SRV records
macula_discovery_consul.erl - Consul service discovery
macula_discovery_k8s.erl - Kubernetes endpointsFeatures:
- Multiple discovery methods (configurable)
- Continuous discovery (periodic re-discovery)
- Bootstrap node list
- Realm-aware discovery
Dependencies:
macula_coremdns(for mDNS support)
Rebar3 Config:
{application, macula_discovery, [
{description, "Macula node discovery"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core]},
{mod, {macula_discovery_app, []}}
]}.
{deps, [
{mdns, {git, "https://github.com/benoitc/erlang-mdns.git", {branch, "master"}}}
]}.10. macula_security
Purpose: Security (TLS certificates, ACLs, audit logging).
Modules:
macula_security.erl - Security API
macula_cert.erl - Certificate generation and validation
macula_acl.erl - Access control lists
macula_audit.erl - Audit logging
macula_crypto.erl - Message signing/verificationFeatures:
- Certificate generation (self-signed, CA-signed)
- Certificate validation (realm extraction from SAN)
- ACL enforcement (topic/RPC access control)
- Audit log (security events)
- Optional message signing
Dependencies:
macula_corepublic_key(Erlang stdlib)ssl(Erlang stdlib)
Rebar3 Config:
{application, macula_security, [
{description, "Macula security"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, public_key, ssl, macula_core]},
{mod, {macula_security_app, []}}
]}.11. macula_gateway
Purpose: Cross-realm gateway functionality.
Modules:
macula_gateway.erl - Gateway API
macula_gateway_server.erl - Gateway GenServer
macula_policy.erl - Policy engine (topic filtering, rate limiting)
macula_translation.erl - Topic translation
macula_rate_limiter.erl - Rate limiting per realm pairFeatures:
- Multi-realm support
- Policy-based message filtering
- Topic translation
- Rate limiting
- Audit logging of cross-realm traffic
Dependencies:
macula_coremacula_protocolmacula_pubsubmacula_rpcmacula_security
Rebar3 Config:
{application, macula_gateway, [
{description, "Macula cross-realm gateway"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib, macula_core, macula_protocol,
macula_pubsub, macula_rpc, macula_security]},
{mod, {macula_gateway_app, []}}
]}.12. macula (Main Application)
Purpose: Umbrella application that ties everything together.
Modules:
macula.erl - Main API
macula_app.erl - Application callback
macula_sup.erl - Top-level supervisor
macula_config.erl - Configuration managementSupervision Tree:
macula_sup (one_for_one)
├── macula_discovery_sup
├── macula_quic_sup
├── macula_membership_sup
├── macula_routing_sup
├── macula_topology_sup
├── macula_pubsub_sup
├── macula_rpc_sup
├── macula_security_sup
└── macula_gateway_sup (optional, if gateway mode)Dependencies: All macula_* libraries
Rebar3 Config:
{application, macula, [
{description, "Macula HTTP/3 Mesh Platform"},
{vsn, "0.1.0"},
{applications, [
kernel, stdlib,
macula_core,
macula_quic,
macula_protocol,
macula_membership,
macula_routing,
macula_topology,
macula_pubsub,
macula_rpc,
macula_discovery,
macula_security,
macula_gateway
]},
{mod, {macula_app, []}},
{env, [
{realm, <<"org.example.mesh">>},
{listen_port, 4433},
{discovery, [{methods, [static, mdns]}]},
{topology, [{type, k_regular}, {k, 2}]}
]}
]}.Supporting Tools and Utilities
13. macula_cli
Purpose: Command-line tool for Macula operations.
Features:
- Start/stop nodes
- Join mesh
- View topology
- Send test messages
- Query membership
- Inspect routing table
Implementation: Escript
Rebar3 Config:
{escript_name, macula}.
{escript_emu_args, "%%! -escript main macula_cli\n"}.Usage:
macula start --realm org.example.mesh --port 4433
macula join 192.168.1.100:4433
macula topology
macula publish topic.name '{"data": "hello"}'
macula stats
14. macula_observer
Purpose: Real-time mesh visualization and monitoring.
Features:
- Visual mesh topology (graphviz-style)
- Live message flow
- Membership state
- Connection status
- Metrics dashboard
Implementation: Phoenix LiveView application (if using Elixir)
Alternative: Standalone Erlang application with web UI (Cowboy + WebSocket)
15. macula_loadtest
Purpose: Load testing and benchmarking tool.
Features:
- Spawn N virtual nodes
- Pub/sub throughput testing
- RPC latency testing
- Failure injection
- Report generation
Implementation: Standalone Erlang application using Tsung or custom framework
Optional/Future Libraries
16. macula_wamp_compat
Purpose: WAMP compatibility layer (bridge WAMP clients to Macula).
Modules:
- WAMP protocol adapter
- WebSocket server
- Message translation (WAMP ↔ Macula)
Use Case: Migrate from Bondy/WAMP to Macula gradually
17. macula_http_bridge
Purpose: HTTP/REST gateway for Macula (publish via HTTP POST).
Modules:
- Cowboy HTTP handler
- REST API (publish, call, subscribe via SSE)
Use Case: Non-BEAM clients accessing Macula
18. macula_kafka_connector
Purpose: Kafka bridge (publish Macula events to Kafka, consume Kafka events).
Dependencies: brod (Kafka client)
19. macula_postgres_connector
Purpose: PostgreSQL integration (CDC, event sourcing).
Dependencies: epgsql or postgrex
20. macula_metrics
Purpose: Metrics and observability (Prometheus, OpenTelemetry).
Modules:
- Prometheus exporter
- OpenTelemetry integration
- StatsD reporter
Dependencies:
prometheusorprometheus_exopentelemetryandopentelemetry_exporter
Development Roadmap
Phase 1: Foundation (Weeks 1-4)
Goal: Get basic QUIC transport and protocol working.
Libraries to build:
macula_core- Types and utilitiesmacula_quic- QUIC wrappermacula_protocol- Wire protocol
Deliverable: Two nodes can connect and exchange handshake messages.
Phase 2: Mesh Topology (Weeks 5-8)
Goal: Self-organizing mesh network.
Libraries to build:
macula_membership- SWIMmacula_routing- Kademlia DHTmacula_topology- k-regular graphmacula_discovery- Node discovery
Deliverable: N nodes form a mesh and detect failures.
Phase 3: Messaging (Weeks 9-12)
Goal: Pub/sub and RPC working across mesh.
Libraries to build:
macula_pubsub- Pub/submacula_rpc- RPC
Deliverable: Applications can publish/subscribe and make RPC calls.
Phase 4: Security and Gateways (Weeks 13-16)
Goal: Production-ready security and multi-tenancy.
Libraries to build:
macula_security- Certificates, ACLs, auditmacula_gateway- Cross-realm gateway
Deliverable: Secure mesh with realm isolation.
Phase 5: Tooling and Monitoring (Weeks 17-20)
Goal: Developer experience and operations tooling.
Tools to build:
macula_cli- Command-line toolmacula_observer- Visualizationmacula_loadtest- Benchmarkingmacula_metrics- Observability
Deliverable: Production-ready platform with tooling.
Testing Strategy
Unit Tests
Each library has its own test suite:
apps/macula_core/test/
apps/macula_quic/test/
apps/macula_protocol/test/
...Framework: EUnit (Erlang) or ExUnit (Elixir)
Run:
rebar3 eunit
# or
mix test
Integration Tests
Multi-node integration tests:
test/integration/
├── mesh_formation_test.erl
├── pubsub_test.erl
├── rpc_test.erl
├── failure_recovery_test.erl
└── gateway_test.erlFramework: Common Test (Erlang)
Run:
rebar3 ct
Property-Based Tests
Use PropEr (Erlang) or StreamData (Elixir):
apps/macula_routing/test/prop_kademlia.erl
apps/macula_membership/test/prop_swim.erlRun:
rebar3 proper
Load Tests
Separate load testing suite:
loadtest/
├── pubsub_throughput.erl
├── rpc_latency.erl
├── mesh_scale.erl (1000+ nodes)
└── failure_injection.erlFramework: Tsung or custom
Continuous Integration
GitHub Actions Workflow
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '26.2'
rebar3-version: '3.22'
- run: rebar3 compile
- run: rebar3 eunit
- run: rebar3 ct
- run: rebar3 dialyzer
integration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
- run: rebar3 as test release
- run: ./test/integration/run_all.shRelease Strategy
Rebar3 Release
%% rebar.config
{relx, [
{release, {macula, "0.1.0"}, [
macula,
sasl
]},
{mode, prod},
{include_erts, true},
{extended_start_script, true},
{overlay, [
{copy, "config/sys.config.example", "etc/sys.config"},
{copy, "config/vm.args.example", "etc/vm.args"}
]}
]}.Build:
rebar3 release
Result: _build/default/rel/macula/
Docker Image
FROM erlang:26-alpine AS builder
WORKDIR /build
COPY . .
RUN rebar3 as prod release
FROM alpine:latest
RUN apk add --no-cache openssl ncurses-libs libstdc++
COPY --from=builder /build/_build/prod/rel/macula /opt/macula
EXPOSE 4433/udp
CMD ["/opt/macula/bin/macula", "foreground"]Build:
docker build -t macula:latest .
Repository Initialization
Create Umbrella Application
# Erlang (Rebar3)
rebar3 new umbrella macula
cd macula
# Create apps
rebar3 new lib apps/macula_core
rebar3 new lib apps/macula_quic
rebar3 new lib apps/macula_protocol
# ... etc
# Compile
rebar3 compile
# Test
rebar3 eunit
# Release
rebar3 release
OR Elixir (Mix)
# Elixir (Mix)
mix new macula --umbrella
cd macula
# Create apps
cd apps
mix new macula_core
mix new macula_quic
mix new macula_protocol
# ... etc
cd ..
# Compile
mix compile
# Test
mix test
# Release
mix release
Summary
Core Libraries (12):
- ✅
macula_core- Core types and utilities - ✅
macula_quic- QUIC transport - ✅
macula_protocol- Wire protocol - ✅
macula_membership- SWIM membership - ✅
macula_routing- Kademlia DHT - ✅
macula_topology- Mesh topology - ✅
macula_pubsub- Pub/sub - ✅
macula_rpc- RPC - ✅
macula_discovery- Node discovery - ✅
macula_security- Security - ✅
macula_gateway- Cross-realm gateway - ✅
macula- Main application
Tools (3):
- ✅
macula_cli- CLI tool - ✅
macula_observer- Visualization - ✅
macula_loadtest- Load testing
Optional (5):
- ⚠️
macula_wamp_compat- WAMP bridge - ⚠️
macula_http_bridge- HTTP gateway - ⚠️
macula_kafka_connector- Kafka integration - ⚠️
macula_postgres_connector- PostgreSQL integration - ⚠️
macula_metrics- Metrics/observability
Total: 20 libraries/applications
Next Step: Initialize the repository structure and start with Phase 1 (Foundation).
Last Updated: 2025-01-08 Maintainers: [To be assigned]