When using pRetry with retry count >= 1, the stack trace of the original calling function is not preserved, which complicates debugging, especially if the code wasn't written with this behavior in mind.
Example:
// pRetryStack.mjs
import pRetry from 'p-retry';
async function foo1() {
return await foo2();
}
async function foo2() {
return await pRetry(
async () => { throw new Error('foo2 failed'); },
{ retries: 1 },
);
}
// This doesn't lose the stack trace
// async function foo2() {
// throw new Error('foo2 failed');
// }
async function main() {
try {
await foo1();
} catch (err) {
console.error(err);
}
}
main();
Running node pRetryStack.mjs
Would print:
Error: foo2 failed
at pRetry.retries (file:///****/pRetryStack.mjs:9:29)
at RetryOperation._fn (/****/node_modules/p-retry/index.js:50:18)
at Timeout._onTimeout (/****/node_modules/p-retry/node_modules/retry/lib/retry_operation.js:85:10)
at listOnTimeout (node:internal/timers:569:17)
at process.processTimers (node:internal/timers:512:7) {
attemptNumber: 4,
retriesLeft: 0
}
While the commented out code would print:
Error: foo2 failed
at foo2 (file:///****/pRetryStack.mjs:12:11)
at foo1 (file:///****/pRetryStack.mjs:4:18)
at main (file:///****/pRetryStack.mjs:17:15)
at file:///****/pRetryStack.mjs:23:1
at ModuleJob.run (node:internal/modules/esm/module_job:195:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:337:24)
at async loadESM (node:internal/process/esm_loader:34:7)
at async handleMainPromise (node:internal/modules/run_main:106:12)
Suggestion:
One possible solution could be to capture the original stack trace and add it as a property to the error, making it easier to trace the origin of the issue while retaining the retry context.
Pay now to fund the work behind this issue.
Get updates on progress being made.
Maintainer is rewarded once the issue is completed.
You're funding impactful open source efforts
You want to contribute to this effort
You want to get funding like this too