Adaptive timeout calculation with EWMA-based tracking and fallback strategies.
npm install adaptive-timeout
const AdaptiveTimeout = require('adaptive-timeout')
const timeouts = new AdaptiveTimeout()
// Record a sample when you get a response
timeouts.put('10.0.0.1:8080', 150)
// Get timeout for next request (attempt 1, 2, 3...)
timeouts.get('10.0.0.1:8080', 1) // adaptive based on recorded samples
timeouts.get('unknown-peer', 1) // uses fallback strategy
const timeouts = new AdaptiveTimeout([options])Create a new instance.
Options:
maxSize - max cache entries (default: 65536)maxAge - entry TTL in ms (default: 600000 / 10 minutes)fallback - timeout sequence for unknown keys (default: [500, 750, 1000, 1500, 2000])min - minimum timeout for known keys (default: 300)max - maximum timeout for known keys (default: 5000)jitter - random jitter range in ms (default: 256)timeouts.put(key, value)Record a sample. Updates the exponentially weighted moving average.
Returns { avg, variance }.
timeouts.get(key, [attempt])Get a timeout value.
For known keys: calculates adaptive timeout with linear backoff based on attempt number.
For unknown keys: returns value from fallback sequence based on attempt number.
timeouts.getValue(key)Get raw stats for a key. Returns { avg, variance } or null.
timeouts.has(key)Check if a key exists.
timeouts.delete(key)Remove a key.
timeouts.clear()Remove all entries.
timeouts.sizeNumber of entries.
Uses TCP-style EWMA (exponentially weighted moving average) to track values:
avg blends 87.5% old + 12.5% new samplevariance blends 75% old + 25% new deviationTimeout for known keys: (avg + 2 * variance) * attempt + jitter
Unknown keys use an aggressive fallback sequence to probe quickly.
Apache 2.0