{"_id":"adaptive-timeout","_rev":"4-3c5d9b90b5a0757ae7d043a9e60f9248","name":"adaptive-timeout","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"adaptive-timeout","version":"1.0.0","author":{"name":"Holepunch Inc"},"license":"Apache-2.0","_id":"adaptive-timeout@1.0.0","maintainers":[{"name":"d_cassidy","email":"dominic@cassidy.casa"}],"homepage":"https://github.com/holepunchto/adaptive-timeout","bugs":{"url":"https://github.com/holepunchto/adaptive-timeout/issues"},"dist":{"shasum":"4b4e643fee9486c6a73696e3528a3e43ddf77cc3","tarball":"https://registry.npmjs.org/adaptive-timeout/-/adaptive-timeout-1.0.0.tgz","fileCount":5,"integrity":"sha512-Z501MSqxyRiMc1+8vXthAhb4YohCIvnlWAZxN87G1gnZ05ET00L95VouFKurTq3KSSNdiPdNhc09NFJiJ9qrng==","signatures":[{"sig":"MEUCIHO0ep4ROQ0YHjgOTE6hRe6ageWkCim1RoClrFgyq3IEAiEAuNFVu8TYJRTvjf+WbfS4okNeb5KPC5cf1eBEWbFK3FY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18168},"main":"index.js","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./index.js"},"./package":"./package.json"},"gitHead":"97d1d904f40d457a2f03c84a047d52da657d8a0d","scripts":{"lint":"lunte","test":"prettier . --check && lunte && brittle-bare test/index.js","format":"prettier . --write"},"_npmUser":{"name":"d_cassidy","email":"dominic@cassidy.casa"},"repository":{"url":"git+https://github.com/holepunchto/adaptive-timeout.git","type":"git"},"_npmVersion":"11.6.1","description":"adaptive-timeout","directories":{},"_nodeVersion":"24.11.0","dependencies":{"xache":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lunte":"^1.2.0","brittle":"^3.19.0","prettier":"^3.6.2","prettier-config-holepunch":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adaptive-timeout_1.0.0_1768254342132_0.06633106014147838","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"adaptive-timeout","version":"1.0.1","author":{"name":"Holepunch Inc"},"license":"Apache-2.0","_id":"adaptive-timeout@1.0.1","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"},{"name":"d_cassidy","email":"dominic@cassidy.casa"}],"homepage":"https://github.com/holepunchto/adaptive-timeout","bugs":{"url":"https://github.com/holepunchto/adaptive-timeout/issues"},"dist":{"shasum":"cd1fc3dc881da1da2fdf814114a61605575c4e04","tarball":"https://registry.npmjs.org/adaptive-timeout/-/adaptive-timeout-1.0.1.tgz","fileCount":5,"integrity":"sha512-+seGiBtHqbnyZ0Quq/ZGxxwP66153WBABawa07/QeyuPFzbduPBjiGQAyCiriiLDzt3dkbMBskSlfqtRwblK8Q==","signatures":[{"sig":"MEUCIAdYhiIFOqIsbdvRFsBzl6SNmq4F8kfYYoxlklNh2vwqAiEAg3NyF3aH7Q0j5MSFJ5O5uHWsLxwmAgF2aWujf7OBTSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18095},"main":"index.js","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","default":"./index.js"},"./package":"./package.json"},"gitHead":"8457541bb0f70adb31b46847a901ae2af78e7a18","scripts":{"lint":"lunte","test":"prettier . --check && lunte && brittle-bare test/index.js","format":"prettier . --write"},"_npmUser":{"name":"d_cassidy","email":"dominic@cassidy.casa"},"repository":{"url":"git+https://github.com/holepunchto/adaptive-timeout.git","type":"git"},"_npmVersion":"11.6.1","description":"adaptive-timeout","directories":{},"_nodeVersion":"24.11.0","dependencies":{"xache":"^1.2.1"},"_hasShrinkwrap":false,"devDependencies":{"lunte":"^1.2.0","brittle":"^3.19.0","prettier":"^3.6.2","prettier-config-holepunch":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/adaptive-timeout_1.0.1_1768339276965_0.8554344565889971","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-12T21:45:42.132Z","modified":"2026-05-12T21:01:26.343Z","1.0.0":"2026-01-12T21:45:42.284Z","1.0.1":"2026-01-13T21:21:17.102Z"},"bugs":{"url":"https://github.com/holepunchto/adaptive-timeout/issues"},"author":{"name":"Holepunch Inc"},"license":"Apache-2.0","homepage":"https://github.com/holepunchto/adaptive-timeout","repository":{"url":"git+https://github.com/holepunchto/adaptive-timeout.git","type":"git"},"description":"adaptive-timeout","maintainers":[{"email":"mathiasbuus@gmail.com","name":"mafintosh"}],"readme":"# adaptive-timeout\n\nAdaptive timeout calculation with EWMA-based tracking and fallback strategies.\n\n## Install\n\n```\nnpm install adaptive-timeout\n```\n\n## Usage\n\n```js\nconst AdaptiveTimeout = require('adaptive-timeout')\n\nconst timeouts = new AdaptiveTimeout()\n\n// Record a sample when you get a response\ntimeouts.put('10.0.0.1:8080', 150)\n\n// Get timeout for next request (attempt 1, 2, 3...)\ntimeouts.get('10.0.0.1:8080', 1) // adaptive based on recorded samples\ntimeouts.get('unknown-peer', 1) // uses fallback strategy\n```\n\n## API\n\n#### `const timeouts = new AdaptiveTimeout([options])`\n\nCreate a new instance.\n\nOptions:\n\n- `maxSize` - max cache entries (default: `65536`)\n- `maxAge` - entry TTL in ms (default: `600000` / 10 minutes)\n- `fallback` - timeout sequence for unknown keys (default: `[500, 750, 1000, 1500, 2000]`)\n- `min` - minimum timeout for known keys (default: `300`)\n- `max` - maximum timeout for known keys (default: `5000`)\n- `jitter` - random jitter range in ms (default: `256`)\n\n#### `timeouts.put(key, value)`\n\nRecord a sample. Updates the exponentially weighted moving average.\n\nReturns `{ avg, variance }`.\n\n#### `timeouts.get(key, [attempt])`\n\nGet a timeout value.\n\nFor known keys: calculates adaptive timeout with linear backoff based on attempt number.\n\nFor unknown keys: returns value from fallback sequence based on attempt number.\n\n#### `timeouts.getValue(key)`\n\nGet raw stats for a key. Returns `{ avg, variance }` or `null`.\n\n#### `timeouts.has(key)`\n\nCheck if a key exists.\n\n#### `timeouts.delete(key)`\n\nRemove a key.\n\n#### `timeouts.clear()`\n\nRemove all entries.\n\n#### `timeouts.size`\n\nNumber of entries.\n\n## How it works\n\nUses TCP-style EWMA (exponentially weighted moving average) to track values:\n\n- `avg` blends 87.5% old + 12.5% new sample\n- `variance` blends 75% old + 25% new deviation\n\nTimeout for known keys: `(avg + 2 * variance) * attempt + jitter`\n\nUnknown keys use an aggressive fallback sequence to probe quickly.\n\n## License\n\nApache 2.0\n","readmeFilename":"README.md"}