| 651 | } |
| 652 | |
| 653 | async function measuredStep(label, fn, options = {}) { |
| 654 | const parentTiming = activeTiming; |
| 655 | const timing = { |
| 656 | label, |
| 657 | phase: options.phase ?? phaseTest, |
| 658 | startedAt: Date.now(), |
| 659 | elapsedMs: 0, |
| 660 | sleepMs: 0, |
| 661 | ok: false, |
| 662 | }; |
| 663 | activeTiming = timing; |
| 664 | try { |
| 665 | const result = await fn(); |
| 666 | timing.ok = true; |
| 667 | return result; |
| 668 | } finally { |
| 669 | timing.elapsedMs = Date.now() - timing.startedAt; |
| 670 | stepTimings.push(timing); |
| 671 | activeTiming = parentTiming; |
| 672 | } |
| 673 | } |
| 674 | |
| 675 | function sleep(ms) { |
| 676 | if (activeTiming) activeTiming.sleepMs += ms; |