Resilience: retry logic, graceful shutdown, SO_REUSEADDR, LoadDaemon ThrottleInterval

- whatsappApi.js: exponential backoff (3 retries) voor 5xx en connectiefouten op sendTextMessage en sendImageMessage
- index.js: SO_REUSEADDR port binding, EADDRINUSE retry, graceful shutdown (SIGTERM/SIGINT)
- README.md: documentatie resilience maatregelen bijgewerkt
- LoadDaemon plist: ThrottleInterval=10 tegen restart-loops
This commit is contained in:
Eddy de Vink 2026-06-17 12:40:36 +02:00
commit 2be27f70f1
4 changed files with 120 additions and 30 deletions

View file

@ -152,8 +152,11 @@ Bij elke interactie met de groep controleert de bot of het pinned bericht nog be
## Foutafhandeling
- **Ongeldig dienstnummer**: de bot stuurt een melding terug naar de afzender
- **Fout bij verzenden PNG**: de admin krijgt een WhatsApp melding
- **Webhook fout**: wordt gelogd in PM2 logs
- **Fout bij verzenden tekst/PNG**: maximaal 3 pogingen met exponential backoff (1s, 2s, 4s) voor 5xx HTTP-fouten en connectieproblemen (ECONNRESET, ECONNREFUSED, ETIMEDOUT). Bij definitieve fout krijgt de admin een WhatsApp-melding.
- **EADDRINUSE (poort 3002 in gebruik)**: de server wacht 5 seconden en herhaalt de bind-poging, met `SO_REUSEADDR` om TIME_WAIT te omzeilen
- **Graceful shutdown**: de server handelt SIGTERM en SIGINT af door actieve connecties netjes te sluiten (10s timeout)
- **Restart-loop preventie**: de LaunchDaemon heeft `ThrottleInterval=10` — maximaal 1 herstart per 10 seconden
- **Webhook fout**: wordt gelogd in de logs
## Spam protectie