trace-runner.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // @ts-check
  2. const path = require('path');
  3. const { performance } = require('perf_hooks');
  4. /**
  5. * @template T
  6. * @param {string} prefix
  7. * @param {() => T} fn
  8. * @returns {T}
  9. */
  10. const traceSync = (prefix, fn) => {
  11. const start = performance.now();
  12. const result = fn();
  13. const end = performance.now();
  14. console.log(`${prefix}: ${(end - start).toFixed(3)}ms`);
  15. return result;
  16. };
  17. module.exports.traceSync = traceSync;
  18. /**
  19. * @template T
  20. * @param {string} prefix
  21. * @param {() => Promise<T>} fn
  22. * @returns {Promise<T>}
  23. */
  24. const traceAsync = async (prefix, fn) => {
  25. const start = performance.now();
  26. const result = await fn();
  27. const end = performance.now();
  28. console.log(`${prefix}: ${(end - start).toFixed(3)}ms`);
  29. return result;
  30. };
  31. module.exports.traceAsync = traceAsync;
  32. /**
  33. * @template T
  34. * @param {string} __filename
  35. * @param {() => Promise<T>} fn
  36. * @param {string | null} [customname]
  37. */
  38. module.exports.task = (__filename, fn, customname = null) => {
  39. const taskName = customname ?? path.basename(__filename, path.extname(__filename));
  40. return async () => {
  41. console.log(`🏃 [${taskName}] Start executing`);
  42. const start = performance.now();
  43. await fn();
  44. const end = performance.now();
  45. console.log(`✅ [${taskName}] Executed successfully: ${(end - start).toFixed(3)}ms`);
  46. return { start, end, taskName };
  47. };
  48. };