- Weighted random routing (math/rand/v2 per-goroutine ChaCha8) - PUT /api/route/mode for runtime mode switch (best / weighted_random) - EWMA score smoothing (configurable smoothing_factor, default 0.3) - Periodic stale node eviction (5 min threshold, 60s interval) - Non-blocking WS broadcast (per-client buffered channel + writePump) - Background rate limiter cleanup goroutine - In-memory trunk gateway cache (zero disk I/O in hot path) - Configurable load_avg multiplier (default 50.0, backward compat) - UI mode indicator + admin Switch button in dashboard - 42 tests: weighted random, mode switching, EWMA, eviction, API integration
1.4 KiB
1.4 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.0] — 2026-06-25
Added
- NATS subscriber for
pulse.metrics.>with JSON unmarshal - Scoring engine with lethal checks (disabled, stale, status, capacity, CPU, failure rate)
- Weighted score formula (call 40%, load 30%, idle 20%, fail 10%)
- Best-node cache with O(1) route resolution
- REST API:
/api/route(no auth),/api/nodes,/api/trunks,/api/users - JWT authentication (access + refresh tokens) with admin/viewer roles
- Monitoring endpoints: Prometheus + Zabbix (API-key auth)
- WebSocket hub for real-time metrics streaming
- SvelteKit frontend with dashboard, node/trunk/user management
- FreeSWITCH ESL client for Sofia gateway management
- ASCII metrics logger with daily rotation
- Config manager with atomic JSON save (tmp → rename)
- Rate limiting with per-IP token buckets
- CORS middleware
- Graceful shutdown (SIGINT/SIGTERM, 10s timeout)
- systemd unit with security isolation
- NATS metrics emulator for testing (7 scenarios)
- route.lua — FreeSWITCH dialplan script
- Build system: single binary with embedded frontend (Makefile)
Security
- Auto-generated JWT secret and monitoring API key on first run
- bcrypt password hashing
- NoNewPrivileges, ProtectSystem, PrivateTmp in systemd unit