timing.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // src/middleware/timing/timing.ts
  2. import "../../context.js";
  3. var getTime = () => {
  4. try {
  5. return performance.now();
  6. } catch {
  7. }
  8. return Date.now();
  9. };
  10. var timing = (config) => {
  11. const options = {
  12. total: true,
  13. enabled: true,
  14. totalDescription: "Total Response Time",
  15. autoEnd: true,
  16. crossOrigin: false,
  17. ...config
  18. };
  19. return async function timing2(c, next) {
  20. const headers = [];
  21. const timers = /* @__PURE__ */ new Map();
  22. if (c.get("metric")) {
  23. return await next();
  24. }
  25. c.set("metric", { headers, timers });
  26. if (options.total) {
  27. startTime(c, "total", options.totalDescription);
  28. }
  29. await next();
  30. if (options.total) {
  31. endTime(c, "total");
  32. }
  33. if (options.autoEnd) {
  34. timers.forEach((_, key) => endTime(c, key));
  35. }
  36. const enabled = typeof options.enabled === "function" ? options.enabled(c) : options.enabled;
  37. if (enabled) {
  38. c.res.headers.append("Server-Timing", headers.join(","));
  39. const crossOrigin = typeof options.crossOrigin === "function" ? options.crossOrigin(c) : options.crossOrigin;
  40. if (crossOrigin) {
  41. c.res.headers.append(
  42. "Timing-Allow-Origin",
  43. typeof crossOrigin === "string" ? crossOrigin : "*"
  44. );
  45. }
  46. }
  47. };
  48. };
  49. var setMetric = (c, name, valueDescription, description, precision) => {
  50. const metrics = c.get("metric");
  51. if (!metrics) {
  52. console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
  53. return;
  54. }
  55. if (typeof valueDescription === "number") {
  56. const dur = valueDescription.toFixed(precision || 1);
  57. const metric = description ? `${name};dur=${dur};desc="${description}"` : `${name};dur=${dur}`;
  58. metrics.headers.push(metric);
  59. } else {
  60. const metric = valueDescription ? `${name};desc="${valueDescription}"` : `${name}`;
  61. metrics.headers.push(metric);
  62. }
  63. };
  64. var startTime = (c, name, description) => {
  65. const metrics = c.get("metric");
  66. if (!metrics) {
  67. console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
  68. return;
  69. }
  70. metrics.timers.set(name, { description, start: getTime() });
  71. };
  72. var endTime = (c, name, precision) => {
  73. const metrics = c.get("metric");
  74. if (!metrics) {
  75. console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
  76. return;
  77. }
  78. const timer = metrics.timers.get(name);
  79. if (!timer) {
  80. console.warn(`Timer "${name}" does not exist!`);
  81. return;
  82. }
  83. const { description, start } = timer;
  84. const duration = getTime() - start;
  85. setMetric(c, name, duration, description, precision);
  86. metrics.timers.delete(name);
  87. };
  88. async function wrapTime(c, name, callable, description, precision) {
  89. startTime(c, name, description);
  90. try {
  91. return await callable;
  92. } finally {
  93. endTime(c, name, precision);
  94. }
  95. }
  96. export {
  97. endTime,
  98. setMetric,
  99. startTime,
  100. timing,
  101. wrapTime
  102. };