Commit Graph

647 Commits

Author SHA1 Message Date
Claude 6f057b8895 fix(metrics,retry): address gold standard code review
Prometheus Metrics:
- Add METRICS_LABELS fallback for defaultLabels env config
- Separate includeSystem from collectDefaultMetrics with own env var
- Parse URL in /metrics endpoint to support querystrings and trailing slashes
- Sort keys in labelsToKey for stable/deterministic lookups
- Update documentation with all environment variables

Retry Utils:
- Remove abort listener on sleep completion to prevent memory leak
- Apply maxDelay cap AFTER jitter to guarantee max delay limit
- Validate/normalize attempt parameter in calculateDelay
- Count retries only when attempt > 1 (actual retry, not first try)
- Use metrics.retryExhausted instead of generic errors for exhausted retries

Tests:
- Add consistency tests to verify retryConfigs.rsocket matches constants
2026-01-20 19:37:19 +00:00
Claude 1944645556 fix(metrics): fix configureRegistry call signature
Update configureRegistry call to match new signature that accepts
only defaultLabels parameter instead of config object.
2026-01-20 14:44:53 +00:00
Claude baf9123d0c fix(retry): address PR #15 code review feedback
- Re-export RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR from Defaults
  for backwards compatibility with existing imports
- Add 'as const' to RETRY_JITTER_FACTOR for type consistency
- Improve documentation explaining why values are hardcoded in retryConfigs
  (ESM initialization order issues with indirect circular imports)
2026-01-20 14:34:47 +00:00
Claude 890a80da48 fix(retry): use literal values in retryConfigs to fix ESM initialization
Hardcode values in retryConfigs.rsocket instead of referencing
RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR to avoid
"Cannot access before initialization" error in ESM module loading.
2026-01-20 14:25:56 +00:00
Claude cf979d6b6d fix(retry): resolve RETRY_BACKOFF_DELAYS initialization order error
- Remove duplicate RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR from Defaults/index.ts
- Export constants from retry-utils.ts as single source of truth
- Add 'as const' for better type inference
- Fixes "Cannot access 'RETRY_BACKOFF_DELAYS' before initialization" error
2026-01-20 14:17:18 +00:00
Claude 37fdce4bf3 fix(metrics): address PR #14 code review feedback
- Add registryConfigured flag to ensure single execution of configureRegistry
- Fix race condition by moving setMetricPrefix/configureRegistry before Promise
- Remove unused prefix parameter from configureRegistry function
- Consolidate prefix to single source of truth (configuredPrefix global)
- Allow clearing default labels by passing empty object
- Add resetMetricsConfiguration() and getConfiguredPrefix() for testing
2026-01-20 13:45:26 +00:00
Claude af4563ee6a Merge remote-tracking branch 'origin/master' into claude/prom-client-nglwZ 2026-01-20 13:27:02 +00:00
Claude 82dce29dbd fix(metrics): address PR #13 code review feedback
- Apply configured prefix to all metric names via getFullMetricName()
- Configure customRegistry with defaultLabels at initialization
- Prevent memory leak: collectDefaultMetrics only called once via flag
- collectDefaultMetrics now uses customRegistry instead of global
- Initialize prefix/defaultLabels before creating baileysMetrics

All metrics now properly include prefix (e.g., baileys_connection_attempts)
and inherit defaultLabels configured via environment variables.
2026-01-20 13:25:21 +00:00
Renato Alcara 168de69e73 fix(metrics): address PR #11 code review feedback
fix(metrics): address PR #11 code review feedback
2026-01-20 10:20:18 -03:00
Claude 4924912f85 fix(metrics): address PR #11 code review feedback
Major improvements to prometheus-metrics.ts:
- Use custom registry instead of global promClient.register (isolation)
- Remove duplicate localValues - prom-client is now single source of truth
- Fix reset(labels) to respect labels param using remove() instead of reset()
- Migrate Summary class to use prom-client internally
- getMetricsOutput() now uses customRegistry for proper isolation

Fix misleading comments in retry-utils.ts:
- Change "exponential backoff" to "custom progressive backoff"
- Fix comment claiming constants are "from Defaults" (now local)

Breaking changes to getValues()/get() - now async as they query prom-client
2026-01-20 13:16:43 +00:00
Claude b719349c57 fix(retry): address PR #12 code review feedback
- Add 'stepped' backoff strategy that uses RETRY_BACKOFF_DELAYS directly
- Update rsocket config to use 'stepped' instead of 'exponential'
- Clarify maxWebSocketListeners calculation (8 core + 10 dynamic + 2 buffer)
- Document maxSocketClientListeners calculation (20 core + 20 dynamic + 10 buffer)
- Change 'exponential backoff' to 'custom progressive backoff' in docs
- Add comprehensive tests for getRetryDelayWithJitter and getAllRetryDelaysWithJitter
- Fix existing test type errors (onRetry mock, always/never predicates)
2026-01-20 13:05:13 +00:00
Renato Alcara b21847addb Merge branch 'WhiskeySockets:master' into master 2026-01-20 09:58:02 -03:00
Claude 2d84da8bd7 fix(retry): resolve circular dependency with Defaults module
Define RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR locally in
retry-utils.ts to avoid circular dependency that caused
"Cannot access 'RETRY_BACKOFF_DELAYS' before initialization" error.
2026-01-20 12:37:18 +00:00
Claude 43ece09fe9 feat(metrics): integrate prom-client for native Prometheus support
- Add prom-client ^15.1.3 as production dependency
- Migrate Counter class to use prom-client internally
- Migrate Gauge class to use prom-client internally
- Migrate Histogram class to use prom-client internally
- Update getMetricsOutput() to use prom-client's native metrics()
- Update contentType() to use prom-client's contentType
- Enable collectDefaultMetrics() for Node.js system metrics
- Maintain backward compatibility with existing API

Benefits:
- Native OpenMetrics format export
- Proper histogram bucket handling
- Default Node.js metrics (memory, CPU, event loop, GC)
- Better integration with Grafana/Prometheus ecosystem
2026-01-20 12:37:17 +00:00
Claude e605a02528 fix(defaults): address PR #10 code review feedback
- Integrate RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR into retry-utils.ts
  - Add retryConfigs.rsocket using the default delays
  - Add getRetryDelayWithJitter() helper function
  - Add getAllRetryDelaysWithJitter() for planning
- Document DEFAULT_CACHE_MAX_KEYS with usage example
- Adjust INITIAL_PREKEY_COUNT from 30 to 200 (moderate value)
- Adjust MIN_UPLOAD_INTERVAL from 60s to 10s (balance rate limiting/responsiveness)
- Revert syncFullHistory to true (avoid breaking change)
2026-01-20 12:36:52 +00:00
Enzo Nascimento a1d69f72c9 fix(utils.normalizeMessageContent): add associatedChildMessage as one of the options to normalize (#1874)
Co-authored-by: Rajeh Taher <rajeh@reforward.dev>
2026-01-20 12:46:03 +02:00
David ??? d36d9c194c Add groupStatusMessage checks in message handling (#2258) 2026-01-20 12:41:33 +02:00
João Lucas de Oliveira Lopes 8ff01b8bb3 fix: store LID-PN mapping from contactAction sync (#2266)
* fix: store LID-PN mapping from contactAction sync

* chore: improve testing of sync actions
2026-01-20 12:39:41 +02:00
João Lucas de Oliveira Lopes a89736f89d fix: extract LID-PN mappings from history sync phoneNumberToLidMappings (#2268) 2026-01-20 12:39:29 +02:00
João Lucas de Oliveira Lopes 5887551d68 fix: resolve race condition in decodeFrame handling and improve encryption integrity (#2182)
* fix: resolve race condition in decodeFrame handling and improve encryption integrity

* chore: pr feedback
2026-01-20 12:37:04 +02:00
github-actions[bot] 4bdcedf96b chore: update WhatsApp Web version (#2269)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-01-20 12:35:35 +02:00
Claude 4a2731fbbd fix(defaults): address PR #10 code review feedback
- Integrate RETRY_BACKOFF_DELAYS and RETRY_JITTER_FACTOR into retry-utils.ts
  - Add retryConfigs.rsocket using the default delays
  - Add getRetryDelayWithJitter() helper function
  - Add getAllRetryDelaysWithJitter() for planning
- Document DEFAULT_CACHE_MAX_KEYS with usage example
- Adjust INITIAL_PREKEY_COUNT from 30 to 200 (moderate value)
- Adjust MIN_UPLOAD_INTERVAL from 60s to 10s (balance rate limiting/responsiveness)
- Revert syncFullHistory to true (avoid breaking change)
2026-01-20 05:33:03 +00:00
Claude ab96bb69db feat(structured-logger): enhance with enterprise-grade features
- Add environment variable configuration (BAILEYS_LOG_*)
- Implement log buffering for batch writes with configurable flush interval
- Add rate limiting using token bucket algorithm to prevent log flooding
- Implement async logging queue for non-blocking operations
- Add circuit breaker pattern for external hook failures
- Add destroy() method for proper resource cleanup
- Add comprehensive statistics tracking (metrics)
- Add Prometheus metrics integration support
- Improve type safety with ResolvedLoggerConfig type
2026-01-20 04:57:41 +00:00
Claude 33b44ff19d fix(metrics): clear startPromise on stop() to allow restart
FIX: startPromise was never cleared after stop(), causing start()
to return the old resolved promise instead of creating a new server.

This broke any flow that stops and restarts metrics (config reloads, tests).

Now stop() clears startPromise, allowing proper server restart.
2026-01-20 04:26:27 +00:00
Claude 21b632592a fix(metrics): address PR #6 code review feedback
Fixes based on Copilot AI and Codex code review comments:

1. Race Condition Fix (lines 1065-1069):
   - BEFORE: setTimeout(100ms) was incomplete - callers could resolve
     before server was actually ready
   - FIX: Cache the Promise from first start() call using startPromise
   - All concurrent calls now return the same Promise
   - Properly handles both success and error cases

2. CPU Percentage Calculation (lines 993-996):
   - BEFORE: Division by cpuCount gave artificially low values
     (e.g., 25% instead of 100% on 4-core for single-threaded process)
   - FIX: Removed cpuCount division
   - Now follows Unix/Prometheus standard: 100% = 1 core fully used
   - Values can exceed 100% on multi-core (200% = 2 cores at 100%)
   - Updated metric description to clarify this behavior
2026-01-20 04:22:00 +00:00
Claude 834cb75ba4 fix(metrics): address PR #4 code review feedback
Fixes based on Copilot AI and Codex code review comments:

1. CPU Usage Metric (line ~930-933):
   - FIX: process.cpuUsage() now calculates delta between measurements
   - Returns actual percentage (0-100) instead of cumulative seconds
   - Normalized across CPU cores

2. Duplicate SystemMetricsCollector (line ~1353-1355):
   - FIX: Removed duplicate instantiation from PrometheusMetricsManager
   - Now uses MetricsServer's collector via getSystemCollector()

3. Collection Interval (line ~1006-1008):
   - FIX: Added collectIntervalMs to MetricsConfig
   - Configurable via BAILEYS_PROMETHEUS_COLLECT_INTERVAL_MS

4. Error Handling (line ~1021-1022):
   - FIX: Enhanced error messages with structured JSON response
   - Includes error message, timestamp, and logs to console

5. Server Binding Security (line ~1034-1038):
   - FIX: Default host changed from 0.0.0.0 to 127.0.0.1
   - Configurable via BAILEYS_PROMETHEUS_HOST
   - Warning shown if exposed on all interfaces

6. Race Condition (line ~998-1001):
   - FIX: Added isStarting flag to prevent concurrent initialization
   - Multiple concurrent start() calls now handled safely
2026-01-20 04:12:58 +00:00
Claude 11e7c71fd1 feat(event-buffer): enhance with enterprise-grade features
- Add environment variable configuration (BAILEYS_BUFFER_*)
- Implement destroy() method for proper resource cleanup
- Add force flush capability with flush(force) parameter
- Implement buffer overflow detection and prevention
- Add adaptive timeout algorithm based on event rate
- Replace historyCache.clear() with LRU cache cleanup
- Integrate Prometheus metrics for buffer monitoring
- Add isDestroyed state protection
- Fix createBufferedFunction to prevent orphaned timers
- Add comprehensive statistics tracking (getStatistics())
- Add configuration accessor (getConfig())

Enterprise features:
- Configurable buffer size limits (maxBufferSize)
- Configurable timeout ranges (min/max)
- LRU cleanup ratio configuration
- Buffer overflow warning threshold
- Adaptive timeout based on event rate
2026-01-20 03:45:52 +00:00
Claude 8a705e5a1e fix(metrics): update env vars to match BAILEYS_PROMETHEUS_* convention
- Support BAILEYS_PROMETHEUS_ENABLED, BAILEYS_PROMETHEUS_PORT, etc.
- Add support for BAILEYS_PROMETHEUS_LABELS JSON configuration
- Maintain backward compatibility with METRICS_* prefix
- Update default port to 9092 (matching user's .env)
- Enable by opt-in (enabled=false by default)
- Improved startup log with labels info
2026-01-20 03:19:32 +00:00
Claude 0c173212fd feat(metrics): enhance Prometheus metrics with enterprise-grade features
- Add HTTP server for /metrics endpoint with configurable port
- Add environment variable configuration (METRICS_ENABLED, METRICS_PORT, etc.)
- Add SystemMetricsCollector for process/system metrics (CPU, memory, load avg)
- Add Event Buffer metrics (size, capacity, utilization, flushes, overflows)
- Add Adaptive Flush metrics (interval, adjustments, throughput, backpressure)
- Add Circuit Breaker metrics (state, trips, recoveries, rejections)
- Add Query metrics (latency, count, timeouts)
- Add Presence and Group metrics
- Add History Sync metrics
- Add helper functions (trackDuration, trackDurationAsync, trackOperation)
- Add Express middleware support
- Add global metrics manager with initialize/shutdown lifecycle
- Total metrics increased from 18 to 50+
2026-01-20 03:14:44 +00:00
Claude 5714e8e940 merge: resolve conflicts with master 2026-01-20 02:38:37 +00:00
Claude 61f5f76ef0 feat(socket): integrate circuit breaker with Socket operations
- Add circuit breaker configuration options to SocketConfig type
- Initialize circuit breakers for query, connection, and pre-key operations
- Wrap query() with circuit breaker protection for all WhatsApp queries
- Wrap sendRawMessage() with connection circuit breaker
- Integrate pre-key circuit breaker with uploadPreKeys()
- Add circuit breaker utilities to socket return object (stats, reset)
- Clean up circuit breakers on connection close
- Fix TypeScript errors in utility files (prometheus-metrics, logger-adapter, etc.)

Circuit breakers provide:
- Sliding window failure tracking
- Automatic state transitions (closed -> open -> half-open)
- Configurable thresholds and timeouts
- Prometheus metrics integration
- Event callbacks for monitoring
2026-01-20 02:31:23 +00:00
Claude dd59a7fe65 fix(utils): resolve TypeScript compilation errors
- baileys-event-stream.ts: Add null check for buffer item in priority insertion
- baileys-logger.ts: Handle 'silent' log level and fix JID sanitization
- cache-utils.ts: Fix type incompatibility in global cache with any type
- logger-adapter.ts: Add nullish coalescing for level mapping and fix console type cast
- prometheus-metrics.ts: Rename private 'metrics' property to 'metricsMap' to avoid conflict with method
- trace-context.ts: Store baggage header in variable before accessing to fix undefined check
2026-01-20 02:05:14 +00:00
Claude 64c7712da7 refactor(utils): translate all comments to English and enhance circuit breaker
- Translate all Portuguese comments to English in utility modules
- Enhance circuit-breaker.ts with sliding window failure tracking
- Add factory functions for WhatsApp-specific circuit breakers
  (createPreKeyCircuitBreaker, createConnectionCircuitBreaker, createMessageCircuitBreaker)
- Improve volume threshold support for circuit breaker decisions
- Standardize documentation across all utility files

Files updated:
- structured-logger.ts: English comments
- baileys-logger.ts: English comments
- trace-context.ts: English comments
- prometheus-metrics.ts: English comments
- cache-utils.ts: English comments
- circuit-breaker.ts: Enhanced with sliding window + English comments
- retry-utils.ts: English comments
- baileys-event-stream.ts: English comments
- index.ts: English comments
2026-01-20 01:48:23 +00:00
Claude 882a1f57cf feat(utils): add observability and resilience utilities
Implement comprehensive utility modules for InfiniteAPI:

Logging:
- structured-logger: JSON logging with levels, sanitization, metrics
- logger-adapter: Pino/Console/Structured adapter pattern
- baileys-logger: WhatsApp-specific logger with categories

Observability:
- trace-context: Distributed tracing with spans, correlation IDs
- prometheus-metrics: Counter, Gauge, Histogram, Summary metrics

Resilience:
- cache-utils: LRU cache with TTL, multi-level support
- circuit-breaker: 3-state circuit breaker with fallbacks
- retry-utils: Exponential backoff with jitter, predicates

Event Streaming:
- baileys-event-stream: Priority queues, backpressure, DLQ

Includes unit tests for all new modules.
2026-01-20 01:26:06 +00:00
Rajeh Taher b62cb40a70 chore: lint 2026-01-18 17:16:28 +02:00
YonkoSam a2677c89dd Fix critical memory leak in event buffer (#2160) 2026-01-18 01:44:28 +02:00
Rajeh Taher 56ee829757 process-message: remove timeout before event emit 2026-01-18 01:35:50 +02:00
vini 0b3b2a88cd fix(messages): enhance nullish value checks in message content generation (#2180) 2026-01-18 01:11:33 +02:00
YonkoSam 1408499d7c moved retryCount before validating the session (#2167) 2026-01-18 01:11:10 +02:00
Matheus Filype 349e7bd771 feat: send tctoken to profile update and presence subscribe (#2257)
* fix: improve message resend logic by adding checks for message IDs

* Revert "fix: improve message resend logic by adding checks for message IDs"

This reverts commit c03f9d8e6fc6cbfbb9d1f8f67c169700e704213d.

* feat(tc-token): implement buildTcTokenFromJid utility and integrate into chats socket

* fix(tc-token): ensure consistent return value when tcTokenBuffer is absent

* fix(chats): update import path for buildTcTokenFromJid utility
2026-01-18 01:07:53 +02:00
João Lucas de Oliveira Lopes c9c3481817 implement message reporting tokens (#1906)
* feat: implement message reporting tokens and privacy token handling

* feat: add support for privacy tokens in profile picture requests and history sync

* chore: pr feedback purpshell

* fix: improve privacy token handling and error messaging in socket configuration

* feat: enhance privacy token handling with improved sender mapping

* chore: removing tc token in favor of #2080

* chore: revert some unecessary changes

* feat(reporting): enhance reporting token extraction and compilation logic

* feat(reporting): add unit tests for reporting token utilities

* fix(reporting): streamline reporting token attachment logic in message sending

* fix: adjust reporting token inclusion logic to prevent retries

* chore: add return type to shouldIncludeReportingToken and improve getToken function type safety
2026-01-08 21:50:49 +02:00
Skid 4e681d3219 feat: Verify leaf signature (#2208)
* Update WA_CERT_DETAILS with issuer and public key

* certificate validation

* fix:lint

* padding

* lint: fix tab

---------

Co-authored-by: skidy89 <tutorialesyg310@gmail.com>
2026-01-08 21:49:37 +02:00
Matheus Filype 250477497d Add Feature LabelMember (Based on #2164) (#2198)
* fix: improve message resend logic by adding checks for message IDs

* Revert "fix: improve message resend logic by adding checks for message IDs"

This reverts commit c03f9d8e6fc6cbfbb9d1f8f67c169700e704213d.

* feat: add group member label update functionality and event emission

* feat: refactor updateMemberLabel function for improved readability

* feat: use optional chaining for label association message in processMessage

* feat: add updateMemberLabel to makeMessagesSocket for enhanced functionality

* fix: correct log message for group member tag update event

Co-authored-by: FgsiDev
2025-12-19 22:00:48 +02:00
vini 925ed6a7b3 feat(appstate): emit setting events (#2057) 2025-12-15 01:21:44 +02:00
Rajeh Taher 4609a3764e event-buffer: prevent loss of type due to buffering (#2179) 2025-12-14 14:16:28 +02:00
Rajeh Taher a7a53ad815 auth-utils: release transaction mutex after references are 0 (#2153) 2025-12-12 04:36:47 +02:00
YonkoSam 1e6f65cf5e fix Memory leak in makeMutex - Promise never gets garbage collected (#2151)
* Memory leak in makeMutex - Promise never gets garbage collected

Hey, I've been debugging a memory leak in my application and traced it back to the makeMutex implementation.

The current implementation chains promises indefinitely without ever breaking the chain:

Every call to mutex() creates a new Promise that awaits the previous task, then becomes the new task. The problem is the old promises never get released because each one holds a reference to the previous through the closure.

What I found
Took a heap snapshot after running for a while and found hundreds of Promises from make-mutex.js holding ~15MB and growing. The retainer graph shows a long chain of Promises all pointing back to each other.

Since processingMutex handles every incoming message/notification, this chain grows constantly and never shrinks.

This keeps the same mutex behavior but lets the GC clean up old promises every 50 tasks instead of holding them forever.

* Refactor makeMutex to use AsyncMutex directly

* lint

* revert
2025-12-12 04:35:24 +02:00
João Lucas de Oliveira Lopes 43d1787532 fix: improve media upload handling and reduce memory pressure (#2128)
* fix: improve media upload handling and reduce memory pressure

* fix: enhance media upload functionality and add comprehensive tests
2025-12-06 03:06:24 +02:00
Rajeh Taher 50d410d117 chore: lint 2025-11-19 16:25:56 +02:00
Clayton Lopes ae5260fc96 Fix memory leak caused by missing TTL in cache (#2044) 2025-11-19 15:23:34 +02:00