{"_id":"@bernierllc/backoff-retry","_rev":"16-43ae1f517906d6da61d814d105fe8e6c","name":"@bernierllc/backoff-retry","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.1":{"name":"@bernierllc/backoff-retry","version":"0.1.1","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/backoff-retry@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"05aae041dfbd0098ba0e056648391134cd171911","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.1.1.tgz","fileCount":24,"integrity":"sha512-5q881W/vrHYwolxaP+8mtDuRHf6Yscs3QbH3iqpArbdkl5DejN/LhOEXxk2CE/y4AOC7ASai75aQUSCxJxQGZQ==","signatures":[{"sig":"MEYCIQCFc0Kr2VXSTg0tBTCIBxmXL7tQLO7O1PoQP0qq3FzZwQIhAPBy5mo2pyJqG6AXEkgUznlAIF1xGOGFUsARShwceeII","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62516},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"856423b79f137af2dd2ce0c71c77e0d7826b7624","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"24.4.1","dependencies":{"redis":"^4.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"peerDependencies":{"redis":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.1.1_1753472721852_0.2779038613649236","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/backoff-retry","version":"0.3.0","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/backoff-retry@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"10f4907cd8faf7de1cb5163016f6f3510cb2b2cf","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.3.0.tgz","fileCount":144,"integrity":"sha512-EclUjk0hkmlLWOcqavzxPQG65dilRZhB5cKAzgbYQRMtFu07hpomyhmmmPeDWw8vir/Ehbbl8HrgS5co9+q15Q==","signatures":[{"sig":"MEYCIQCJHRZA9/mC6Ve/y/xYLrQoP9ILbEA+mFBmV5kVwg+36wIhAM4IWOYrDkcU6ro16YIDcsVcDCfb6oZpDJlTi1Rzksxn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":406263},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3594b065a2505ecd79ec5d2f3ea2214533495eed","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"24.4.1","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"^0.1.1","@bernierllc/retry-policy":"^0.1.0","@bernierllc/retry-metrics":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.3.0_1754172355170_0.7689435446048904","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/backoff-retry","version":"0.3.1","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"12519191397d54d9d7c545135dae1477ff273dba","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.3.1.tgz","fileCount":144,"integrity":"sha512-FKfrB4c7gsHVL76cX1TUuIlx7eCjdM4RASPSEiCyX+dLkfu6UpdJ5h+7ajdanVVCHHwd5SdztcMBXpQ9VFeb8g==","signatures":[{"sig":"MEUCIBvUl2XRTCdqGtGpz4ntmV3nytXvoWTP0KWA4eYDMvCXAiEAt6jOJCAquaE1kef5kiV2IO5hT763f87/QGZPT9rMiAg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":406263},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"4584ef4a55a13b2a557e9d27a17d4dff47c955ae","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"24.4.1","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"^0.1.1","@bernierllc/retry-policy":"^0.1.0","@bernierllc/retry-metrics":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.3.1_1754178638181_0.06789373872444826","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@bernierllc/backoff-retry","version":"0.3.3","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.3.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"dfc425cd0c77c26d27a1a3d529f6119f5fb6b142","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.3.3.tgz","fileCount":147,"integrity":"sha512-26+xczWbq4Dg9O6iy75N/M+Vq7qtrKMl2rrIoI4nQyIUeSxQ5RW5Hr+uhmeRLdwuGcy7sPYvvwMbvN5jOyyqTg==","signatures":[{"sig":"MEUCIHn2UCrMi3iKgK5j73NC2hmiuyyMlel2+YXz/lDtVJ6FAiEA/Ts1GOMLrz0G0m29eQVx4gkY0I70pSBi+YhQbbiiR+Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":418915},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"59482d6f22e2d0bd5c50103a11f89cca7af853f1","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"24.4.1","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"^0.1.1","@bernierllc/retry-policy":"^0.1.1","@bernierllc/retry-metrics":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.3.3_1756844693504_0.9889159146790922","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/backoff-retry","version":"0.5.0","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"6c5ba5613df25167a6ed3db8a123d5e699db07d3","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.5.0.tgz","fileCount":147,"integrity":"sha512-SXIJ7LirWDz+np2jR+KmPwGHkiy4g2K8ZaWUgpq9uMJB7A8NC1/D3aAxxMYzLeFL4hXQa8fMREBZj+VQUD79sA==","signatures":[{"sig":"MEUCIDzcmRH5gKfSxNdsZyLwIibGbMt98+nQWbhFU1y/5UKgAiEA78+murBCz3Rf0M9ea2eS2VNWO7bYXcLoHfXVaS13RHI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423246},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.19.6","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.0","@bernierllc/retry-policy":"0.3.0","@bernierllc/retry-metrics":"0.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.5.0_1767642404914_0.5616161287204506","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@bernierllc/backoff-retry","version":"0.5.1","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.5.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"16e39442c44e35644720788bb3494e63c54a86f7","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.5.1.tgz","fileCount":147,"integrity":"sha512-AP6z7ZcMzzC3lzEr5xNxHj0GWCNG8dLXYCS++Qu/vgr7Hc279jDBvYiHjLZxJ1Jz1SgVfb7hHINnJWZ6YeXgNQ==","signatures":[{"sig":"MEUCIQDpksalLY2ArJJC+WTyVYWBx+8UbyY3WiPUnd74WZrfIAIgakbPb78eM271mF0fu5HezrSvHcQxVq5Qfjt1YmYXQPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423396},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.5.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/tmp/284889cc20c5c0ea7556d831d6a0e87c/bernierllc-backoff-retry-0.5.1.tgz","_integrity":"sha512-AP6z7ZcMzzC3lzEr5xNxHj0GWCNG8dLXYCS++Qu/vgr7Hc279jDBvYiHjLZxJ1Jz1SgVfb7hHINnJWZ6YeXgNQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.0","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.1","@bernierllc/retry-policy":"0.3.1","@bernierllc/retry-metrics":"0.2.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.5.1_1773078163016_0.021355042889371623","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@bernierllc/backoff-retry","version":"0.5.2","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.5.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"4991378afbc50dea5980631023ba2df15e8d22b8","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.5.2.tgz","fileCount":147,"integrity":"sha512-218jrC7+euiEZYZZb81f0q82AgMODiBIKK4Q9ByOX6iP2B/nwVdh4yeF28G8FWBYe2Qmn1aTpan6uKloPv4XrQ==","signatures":[{"sig":"MEUCIGTzNjRb3IqYtW9s3OF2JeEmkxjFn4P5HTs5TKkPTKm/AiEAyJMIC06EeC0LhnOAGYyXgVp34D5Qs4sE8L5bcQa1iv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423604},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.5.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.5.2.tgz","_integrity":"sha512-218jrC7+euiEZYZZb81f0q82AgMODiBIKK4Q9ByOX6iP2B/nwVdh4yeF28G8FWBYe2Qmn1aTpan6uKloPv4XrQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.0","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.2","@bernierllc/retry-policy":"0.3.2","@bernierllc/retry-metrics":"0.2.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.5.2_1773163018646_0.12345459023305771","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@bernierllc/backoff-retry","version":"0.5.3","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.5.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"1a0b3269df1f1c31c11b5aa3b9dde9eb43b97856","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.5.3.tgz","fileCount":147,"integrity":"sha512-qaNeaJBB0BniTFa3pkjwK8nwHp3UJ5UbEDFrNn5Ic9C6hj5IbsxLMXP4Jr5kOJnjlGzbmk7/FH6D9vjf11d0vA==","signatures":[{"sig":"MEUCIDFTzwp9Slhc8WuTNtx+7ow3rT3OPRiUQmLkJP4EJ4W+AiEAx+RtIubie+tu0W/T0l9CyvrRF8powMaky8BBnpyo0Wo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":423812},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.5.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.5.3.tgz","_integrity":"sha512-qaNeaJBB0BniTFa3pkjwK8nwHp3UJ5UbEDFrNn5Ic9C6hj5IbsxLMXP4Jr5kOJnjlGzbmk7/FH6D9vjf11d0vA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.2","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.2","@bernierllc/retry-policy":"0.4.0","@bernierllc/retry-metrics":"0.2.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.5.3_1779133338865_0.4262163779698729","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@bernierllc/backoff-retry","version":"0.5.4","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.5.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e5897ea078cc4d06e442424122b6274930f7efa7","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.5.4.tgz","fileCount":147,"integrity":"sha512-3IQwYJ/OQ5rcyE7mjUhfzPS6KoTy/NhzfKxVkUsLNH+gyOQUlonWUVNuEYPsEpFCCOdhTeamBbDMgOmVys06dA==","signatures":[{"sig":"MEUCIQDEKZTJsDNjPUCQ/QGc67P+k0ibOIofuiOESQ2Q9c3n+wIgImwLzr/EiYVKpJq/ySmfH399oCbP94wwD9ZRhUBYi1M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":424020},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.5.4.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.5.4.tgz","_integrity":"sha512-3IQwYJ/OQ5rcyE7mjUhfzPS6KoTy/NhzfKxVkUsLNH+gyOQUlonWUVNuEYPsEpFCCOdhTeamBbDMgOmVys06dA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.2","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.2","@bernierllc/retry-policy":"0.5.1","@bernierllc/retry-metrics":"0.2.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.5.4_1779157094140_0.6724377789251943","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bernierllc/backoff-retry","version":"0.7.0","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.7.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"c76b20c1d93f54a5655d6f034d5d398956a4f3a3","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.7.0.tgz","fileCount":147,"integrity":"sha512-+ycglPXEcsE4r6MH0j6NxXNPcXJZLP6APx4horZ7/7YVTsFX0TR1K0ORcjEAqJF9MoGG9ueOxMtopuy5CeIGPw==","signatures":[{"sig":"MEUCIQCQzwn5f8cZGQV8zF0lyhEYM8GhBi+x5AEETXS4AYv2ZwIgF7b213ZrlvMwb/OcyVu++T9hDjp29NJG/ifX0RUKO+E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419068},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.7.0.tgz","_integrity":"sha512-+ycglPXEcsE4r6MH0j6NxXNPcXJZLP6APx4horZ7/7YVTsFX0TR1K0ORcjEAqJF9MoGG9ueOxMtopuy5CeIGPw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.2","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.2.2","@bernierllc/retry-policy":"0.5.1","@bernierllc/retry-metrics":"0.2.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.7.0_1779233807185_0.8779685517021409","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@bernierllc/backoff-retry","version":"0.8.0","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.8.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"d76b5ad13a7650c9ecfea5746450c30fef98d8ba","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.8.0.tgz","fileCount":147,"integrity":"sha512-wGkbrbUXWqz7T822uAzCFn1PEBcQAOga/YhaB32rCPQRVNHOX1Rustkvnfs61ZVMuDtDzmZDgItZF8is8esv/A==","signatures":[{"sig":"MEQCIChPERgl8LzaJx3iS9feaZ9rMTi2T5jicOreSVPK3XvNAiB8O4ThgeZ6mLXWeSp1apGuT3oKVzu6I7F17mlphDkDXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419068},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.8.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.8.0.tgz","_integrity":"sha512-wGkbrbUXWqz7T822uAzCFn1PEBcQAOga/YhaB32rCPQRVNHOX1Rustkvnfs61ZVMuDtDzmZDgItZF8is8esv/A==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.2","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.3.0","@bernierllc/retry-policy":"0.6.0","@bernierllc/retry-metrics":"0.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.8.0_1779240914479_0.9660873035541273","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@bernierllc/backoff-retry","version":"0.8.1","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/backoff-retry@0.8.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"3c126dfe01d0b87993f9461f9727cec2d8eedd85","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.8.1.tgz","fileCount":147,"integrity":"sha512-I06SLWv40mC6fN1fHGAim3ORzwhv8EEogci1UKp9dK0jIj/7FriOEYe6SEyVIVJvd671FacZzjLLEfUAaImXiA==","signatures":[{"sig":"MEYCIQCHc/SYtk3iT+nau0cpD+d9jAdWL0kH6ee8TTpfRolkdQIhAOmZH615+ZQ9gKlu0rWNgUAwl/oIYJjDlFny5gAtXFql","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419068},"main":"dist/index.js","_from":"file:bernierllc-backoff-retry-0.8.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.8.1.tgz","_integrity":"sha512-I06SLWv40mC6fN1fHGAim3ORzwhv8EEogci1UKp9dK0jIj/7FriOEYe6SEyVIVJvd671FacZzjLLEfUAaImXiA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","directories":{},"_nodeVersion":"20.20.2","dependencies":{"events":"^3.3.0","@bernierllc/retry-state":"0.4.0","@bernierllc/retry-policy":"0.6.0","@bernierllc/retry-metrics":"0.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11"},"peerDependencies":{"redis":"^4.6.0"},"optionalDependencies":{"pg":"^8.16.3","redis":"^4.6.0","ioredis":"^5.6.1","@types/pg":"^8.15.4","crypto-js":"^4.2.0","@types/ioredis":"^4.28.10","@types/crypto-js":"^4.2.2"},"_npmOperationalInternal":{"tmp":"tmp/backoff-retry_0.8.1_1779243137035_0.5263877338661012","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@bernierllc/backoff-retry","version":"0.9.0","description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","main":"dist/index.js","types":"dist/index.d.ts","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"author":{"name":"Bernier LLC"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"dependencies":{"events":"^3.3.0","@bernierllc/retry-metrics":"0.5.0","@bernierllc/retry-state":"0.5.0","@bernierllc/retry-policy":"0.7.0"},"optionalDependencies":{"@types/crypto-js":"^4.2.2","@types/ioredis":"^4.28.10","@types/pg":"^8.15.4","crypto-js":"^4.2.0","ioredis":"^5.6.1","pg":"^8.16.3","redis":"^4.6.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/redis":"^4.0.11","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"peerDependencies":{"redis":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest","test:run":"jest --watchAll=false","test:watch":"jest --watch","lint":"eslint src/**/*.ts","clean":"rm -rf dist"},"_id":"@bernierllc/backoff-retry@0.9.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","_integrity":"sha512-+kkXANHPR8kP1WQwxdErvoUIDPnvh6ruIbh39kocn9MBhU+KsUHGQ8NvJ6AIAajB/fSpKbWkjrZkzF9pUxj+KQ==","_resolved":"/home/runner/work/tools/tools/packages/core/backoff-retry/bernierllc-backoff-retry-0.9.0.tgz","_from":"file:bernierllc-backoff-retry-0.9.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-+kkXANHPR8kP1WQwxdErvoUIDPnvh6ruIbh39kocn9MBhU+KsUHGQ8NvJ6AIAajB/fSpKbWkjrZkzF9pUxj+KQ==","shasum":"ffe873f52c84013cc0eb84c0c34af24761abd608","tarball":"https://registry.npmjs.org/@bernierllc/backoff-retry/-/backoff-retry-0.9.0.tgz","fileCount":147,"unpackedSize":419068,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHYyZGIoB9tNFqQ83gWuA2H1TxacTjmW0DEkyDfZTVq5AiBskf+d9RJ8i+/PapKD1LmPpO+14WZ0pUPFU3KEK2jgWQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0dc58c3f-91cc-47ef-80ce-cd103b51b0a2"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/backoff-retry_0.9.0_1779249646863_0.10968551038254848"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-25T19:45:21.478Z","modified":"2026-05-20T04:00:47.152Z","0.1.1":"2025-07-25T19:45:22.032Z","0.3.0":"2025-08-02T22:05:55.370Z","0.3.1":"2025-08-02T23:50:38.363Z","0.3.3":"2025-09-02T20:24:53.745Z","0.5.0":"2026-01-05T19:46:45.143Z","0.5.1":"2026-03-09T17:42:43.200Z","0.5.2":"2026-03-10T17:16:58.793Z","0.5.3":"2026-05-18T19:42:19.057Z","0.5.4":"2026-05-19T02:18:14.283Z","0.7.0":"2026-05-19T23:36:47.333Z","0.8.0":"2026-05-20T01:35:14.646Z","0.8.1":"2026-05-20T02:12:17.201Z","0.9.0":"2026-05-20T04:00:47.030Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["retry","backoff","exponential-backoff","jitter","api","webhook","resilience","error-handling"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"description":"Portable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/backoff-retry\n\nPortable async retry utility with exponential backoff, jitter, and error filtering for API and webhook management.\n\n## Features\n\n- **Exponential Backoff**: Configurable backoff strategies with jitter\n- **Persistent State**: Track retry attempts across application restarts\n- **Multiple Storage Backends**: Memory, Redis with automatic fallback\n- **Memory Protection**: Built-in memory usage monitoring and protection\n- **Flexible Error Handling**: Custom retry conditions and error filtering\n- **Metrics & Monitoring**: Built-in retry metrics and performance tracking\n- **TypeScript Support**: Full TypeScript definitions included\n\n## Installation\n\n```bash\nnpm install @bernierllc/backoff-retry\n```\n\n## Quick Start\n\n### Basic Usage\n\n```typescript\nimport { createRetryManager } from '@bernierllc/backoff-retry';\n\nconst retryManager = createRetryManager();\n\n// Simple retry with backoff\nconst result = await retryManager.retryWithBackoff(\n  async () => {\n    const response = await fetch('https://api.example.com/data');\n    if (!response.ok) throw new Error('API request failed');\n    return response.json();\n  },\n  {\n    maxRetries: 5,\n    initialDelayMs: 1000,\n    maxDelayMs: 30000,\n    backoffFactor: 2,\n    jitter: true\n  }\n);\n```\n\n### Persistent Retry State\n\n```typescript\n// Retry with persistent state (survives app restarts)\nconst result = await retryManager.executeWithRetry(\n  'api:user:123', // Unique ID for this operation\n  async () => {\n    return await updateUserProfile(userId, data);\n  },\n  {\n    maxRetries: 3,\n    initialDelayMs: 2000\n  }\n);\n\nif (result.success) {\n  console.log('Operation completed:', result.data);\n} else {\n  console.log('Operation failed after', result.attempts, 'attempts');\n}\n```\n\n## Configuration\n\n### Environment Variables\n\n```bash\n# Storage type: 'memory' or 'redis'\nRETRY_STORAGE_TYPE=redis\n\n# Redis connection URL (if using Redis storage)\nREDIS_URL=redis://localhost:6379\n\n# Enhancement configuration\nNEVERADMIN_API_KEY=your_admin_api_key\nNEVERHUB_API_KEY=your_hub_api_key\nNOTIFICATION_EMAIL=admin@example.com,ops@example.com\nSLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK\nPAGERDUTY_KEY=your_pagerduty_key\n```\n\n### Custom Configuration\n\n```typescript\nimport { createRetryManager } from '@bernierllc/backoff-retry';\nimport { MemoryStorageAdapter } from '@bernierllc/backoff-retry';\n\nconst retryManager = createRetryManager({\n  storage: new MemoryStorageAdapter(1000), // Max 1000 retry states\n  memoryProtection: {\n    maxMemoryUsage: 50 * 1024 * 1024, // 50MB\n    maxRetryStates: 500,\n    cleanupInterval: 60000, // 1 minute\n    evictionPolicy: 'lru'\n  },\n  defaultOptions: {\n    maxRetries: 3,\n    initialDelayMs: 1000,\n    maxDelayMs: 10000,\n    backoffFactor: 2,\n    jitter: true\n  },\n  enhancements: {\n    storage: {\n      enabled: true,\n      type: 'memory',\n      autoUpgrade: true,\n      thresholdNotifications: true,\n      memoryThreshold: 80\n    },\n    notifications: {\n      enabled: true,\n      email: ['admin@example.com'],\n      thresholds: {\n        memoryUsage: 80,\n        retryFailures: 10,\n        performanceDegradation: 20\n      }\n    }\n  }\n});\n```\n\n## API Reference\n\n### RetryManager\n\n#### `retryWithBackoff<T>(fn, options): Promise<T>`\n\nExecute a function with retry logic.\n\n```typescript\nconst result = await retryManager.retryWithBackoff(\n  async () => fetch('/api/data'),\n  {\n    maxRetries: 5,\n    initialDelayMs: 1000,\n    maxDelayMs: 30000,\n    backoffFactor: 2,\n    jitter: true,\n    shouldRetry: (error) => error.status !== 404,\n    onRetry: (attempt, delay, error) => {\n      console.log(`Retry ${attempt} in ${delay}ms`);\n    },\n    onFailure: (error) => {\n      console.error('Final failure:', error);\n    }\n  }\n);\n```\n\n#### `executeWithRetry<T>(id, fn, options): Promise<RetryResult<T>>`\n\nExecute a function with persistent retry state.\n\n```typescript\nconst result = await retryManager.executeWithRetry(\n  'unique-operation-id',\n  async () => processData(),\n  { maxRetries: 3 }\n);\n\nif (result.success) {\n  console.log('Success:', result.data);\n  console.log('Attempts:', result.attempts);\n  console.log('Total time:', result.totalTime);\n} else {\n  console.log('Failed:', result.error);\n}\n```\n\n#### `getRetryState(id): Promise<RetryState | null>`\n\nGet the current state of a retry operation.\n\n#### `listRetryStates(prefix?): Promise<RetryState[]>`\n\nList all retry states, optionally filtered by prefix.\n\n#### `cancelRetry(id): Promise<void>`\n\nCancel a retry operation.\n\n#### `clearAll(): Promise<void>`\n\nClear all retry states.\n\n#### `getMetrics(): RetryMetrics`\n\nGet retry performance metrics.\n\n#### `getMemoryStats(): MemoryStats`\n\nGet memory protection statistics.\n\n## Storage Adapters\n\n### Memory Storage\n\nDefault in-memory storage with LRU eviction:\n\n```typescript\nimport { MemoryStorageAdapter } from '@bernierllc/backoff-retry';\n\nconst storage = new MemoryStorageAdapter(1000); // Max 1000 items\n```\n\n### Redis Storage\n\nRedis storage with automatic fallback to memory:\n\n```typescript\nimport { RedisStorageAdapter } from '@bernierllc/backoff-retry';\nimport { createClient } from 'redis';\n\nconst redisClient = createClient({ url: 'redis://localhost:6379' });\nconst storage = new RedisStorageAdapter(redisClient, 'retry:');\n```\n\n## Enhancement System\n\nThe package includes an opt-in enhancement system that provides advanced features with automatic upgrades and admin notifications:\n\n### Available Enhancements\n\n- **Storage Enhancements**: Auto-upgrade from memory to Redis/PostgreSQL/MongoDB\n- **Memory Protection**: Advanced analytics, leak detection, predictive forecasting\n- **NeverAdmin Integration**: Dashboard widgets, real-time metrics, configuration management\n- **NeverHub Integration**: Event streaming, webhook management, cross-service sync\n- **Machine Learning**: Predictive retry optimization, error classification\n- **Performance**: Multi-level caching, concurrency management, load balancing\n- **Security**: Encryption, rate limiting, audit logging, access control\n- **Notifications**: Email, Slack, PagerDuty, webhook notifications\n\n### Basic Enhancement Setup\n\n```typescript\nconst retryManager = createRetryManager({\n  enhancements: {\n    storage: {\n      enabled: true,\n      type: 'memory',\n      autoUpgrade: true, // Automatically upgrade when Redis/DB available\n      thresholdNotifications: true,\n      memoryThreshold: 80 // Notify when 80% memory usage reached\n    },\n    notifications: {\n      enabled: true,\n      email: ['admin@example.com'],\n      thresholds: {\n        memoryUsage: 80,\n        retryFailures: 10,\n        performanceDegradation: 20\n      }\n    }\n  }\n});\n```\n\n### Environment-Based Auto-Configuration\n\nThe enhancement system automatically detects and enables features based on environment variables:\n\n```bash\n# Auto-enable Redis storage\nREDIS_URL=redis://localhost:6379\n\n# Auto-enable NeverAdmin integration\nNEVERADMIN_API_KEY=your_key\nNEVERADMIN_DASHBOARD_URL=https://admin.example.com\n\n# Auto-enable NeverHub integration\nNEVERHUB_API_KEY=your_key\nNEVERHUB_URL=https://hub.example.com\n\n# Auto-enable notifications\nNOTIFICATION_EMAIL=admin@example.com,ops@example.com\nSLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK\nPAGERDUTY_KEY=your_pagerduty_key\n```\n\n### Dynamic Enhancement Management\n\n```typescript\n// Check if enhancement is available\nif (retryManager.isEnhancementAvailable('neverAdmin')) {\n  console.log('NeverAdmin integration is enabled');\n}\n\n// Enable enhancement dynamically\nretryManager.enableEnhancement('ml', {\n  predictiveRetry: true,\n  errorClassification: true\n});\n\n// Get enhancement recommendations\nconst recommendations = retryManager.getEnhancementRecommendations();\nconsole.log('Recommendations:', recommendations);\n\n// Get enhancement metrics\nconst enhancementMetrics = retryManager.getEnhancementManager().getMetrics();\nconsole.log('Performance score:', enhancementMetrics.performanceScore);\n```\n\n## Memory Protection\n\nThe package includes built-in memory protection to prevent runaway memory usage:\n\n```typescript\nconst retryManager = createRetryManager({\n  memoryProtection: {\n    maxMemoryUsage: 100 * 1024 * 1024, // 100MB\n    maxRetryStates: 1000,\n    cleanupInterval: 30000, // 30 seconds\n    evictionPolicy: 'lru' // 'lru', 'fifo', or 'random'\n  }\n});\n```\n\n## Error Handling\n\n### Custom Retry Conditions\n\n```typescript\nconst shouldRetry = (error: any) => {\n  // Retry on network errors, but not on validation errors\n  if (error.code === 'ECONNRESET') return true;\n  if (error.status === 400) return false;\n  if (error.status >= 500) return true;\n  return false;\n};\n\nawait retryManager.retryWithBackoff(fn, {\n  maxRetries: 5,\n  shouldRetry\n});\n```\n\n### Retry Callbacks\n\n```typescript\nawait retryManager.retryWithBackoff(fn, {\n  maxRetries: 3,\n  onRetry: (attempt, delay, error) => {\n    console.log(`Retry ${attempt} after ${delay}ms delay`);\n    // Log to monitoring service\n    analytics.track('retry_attempt', { attempt, delay, error: error.message });\n  },\n  onFailure: (error) => {\n    console.error('Operation failed permanently:', error);\n    // Alert operations team\n    alerting.sendAlert('retry_failure', { error: error.message });\n  }\n});\n```\n\n## Examples\n\n### API Request Retry\n\n```typescript\nconst apiClient = {\n  async request(endpoint: string, options: RequestInit = {}) {\n    return retryManager.retryWithBackoff(\n      async () => {\n        const response = await fetch(endpoint, {\n          ...options,\n          headers: {\n            'Content-Type': 'application/json',\n            ...options.headers\n          }\n        });\n        \n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n        }\n        \n        return response.json();\n      },\n      {\n        maxRetries: 3,\n        initialDelayMs: 1000,\n        shouldRetry: (error) => {\n          // Retry on server errors and network issues\n          return error.message.includes('500') || \n                 error.message.includes('502') ||\n                 error.message.includes('503') ||\n                 error.message.includes('504');\n        }\n      }\n    );\n  }\n};\n```\n\n### Webhook Delivery\n\n```typescript\nconst webhookManager = {\n  async deliverWebhook(webhookId: string, payload: any) {\n    return retryManager.executeWithRetry(\n      `webhook:${webhookId}`,\n      async () => {\n        const response = await fetch(webhookUrl, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(payload)\n        });\n        \n        if (!response.ok) {\n          throw new Error(`Webhook delivery failed: ${response.status}`);\n        }\n        \n        return response.json();\n      },\n      {\n        maxRetries: 5,\n        initialDelayMs: 5000, // Start with 5 second delay\n        maxDelayMs: 300000,   // Max 5 minute delay\n        backoffFactor: 2,\n        jitter: true\n      }\n    );\n  }\n};\n```\n\n## Monitoring and Metrics\n\n```typescript\n// Get retry metrics\nconst metrics = retryManager.getMetrics();\nconsole.log('Total retries:', metrics.totalRetries);\nconsole.log('Success rate:', metrics.successfulRetries / metrics.totalRetries);\nconsole.log('Average retry time:', metrics.averageRetryTime);\n\n// Get memory protection stats\nconst memoryStats = retryManager.getMemoryStats();\nconsole.log('Memory usage:', memoryStats.usagePercentage.toFixed(2) + '%');\nconsole.log('Memory trend:', memoryStats.trend > 0 ? 'increasing' : 'decreasing');\n```\n\n## License\n\nISC - See LICENSE file for details.\n\n## Contributing\n\nThis package is part of the Bernier LLC tools monorepo. Please refer to the main repository for contribution guidelines. ","readmeFilename":"README.md"}