callman-core 1.36.0 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/assertions/dbAssertions.d.ts +7 -0
  2. package/dist/assertions/dbAssertions.d.ts.map +1 -0
  3. package/dist/assertions/dbAssertions.js +191 -0
  4. package/dist/assertions/dbAssertions.js.map +1 -0
  5. package/dist/assertions/index.d.ts +4 -0
  6. package/dist/assertions/index.d.ts.map +1 -0
  7. package/dist/assertions/index.js +3 -0
  8. package/dist/assertions/index.js.map +1 -0
  9. package/dist/assertions/redisAssertions.d.ts +9 -0
  10. package/dist/assertions/redisAssertions.d.ts.map +1 -0
  11. package/dist/assertions/redisAssertions.js +159 -0
  12. package/dist/assertions/redisAssertions.js.map +1 -0
  13. package/dist/assertions/shared.d.ts +5 -0
  14. package/dist/assertions/shared.d.ts.map +1 -0
  15. package/dist/assertions/shared.js +25 -0
  16. package/dist/assertions/shared.js.map +1 -0
  17. package/dist/assertions/types.d.ts +46 -0
  18. package/dist/assertions/types.d.ts.map +1 -0
  19. package/dist/assertions/types.js +5 -0
  20. package/dist/assertions/types.js.map +1 -0
  21. package/dist/host/connections.d.ts +11 -0
  22. package/dist/host/connections.d.ts.map +1 -1
  23. package/dist/host/connections.js +22 -0
  24. package/dist/host/connections.js.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/loadtest/compare.d.ts +32 -0
  30. package/dist/loadtest/compare.d.ts.map +1 -0
  31. package/dist/loadtest/compare.js +55 -0
  32. package/dist/loadtest/compare.js.map +1 -0
  33. package/dist/loadtest/flow-eval.d.ts +21 -0
  34. package/dist/loadtest/flow-eval.d.ts.map +1 -0
  35. package/dist/loadtest/flow-eval.js +199 -0
  36. package/dist/loadtest/flow-eval.js.map +1 -0
  37. package/dist/loadtest/from-collection.d.ts +51 -0
  38. package/dist/loadtest/from-collection.d.ts.map +1 -0
  39. package/dist/loadtest/from-collection.js +131 -0
  40. package/dist/loadtest/from-collection.js.map +1 -0
  41. package/dist/loadtest/histogram.d.ts +41 -0
  42. package/dist/loadtest/histogram.d.ts.map +1 -0
  43. package/dist/loadtest/histogram.js +166 -0
  44. package/dist/loadtest/histogram.js.map +1 -0
  45. package/dist/loadtest/index.d.ts +18 -0
  46. package/dist/loadtest/index.d.ts.map +1 -0
  47. package/dist/loadtest/index.js +14 -0
  48. package/dist/loadtest/index.js.map +1 -0
  49. package/dist/loadtest/node/index.d.ts +4 -0
  50. package/dist/loadtest/node/index.d.ts.map +1 -0
  51. package/dist/loadtest/node/index.js +4 -0
  52. package/dist/loadtest/node/index.js.map +1 -0
  53. package/dist/loadtest/node/metrics.d.ts +84 -0
  54. package/dist/loadtest/node/metrics.d.ts.map +1 -0
  55. package/dist/loadtest/node/metrics.js +396 -0
  56. package/dist/loadtest/node/metrics.js.map +1 -0
  57. package/dist/loadtest/node/orchestrator.d.ts +24 -0
  58. package/dist/loadtest/node/orchestrator.d.ts.map +1 -0
  59. package/dist/loadtest/node/orchestrator.js +363 -0
  60. package/dist/loadtest/node/orchestrator.js.map +1 -0
  61. package/dist/loadtest/node/protocol.d.ts +102 -0
  62. package/dist/loadtest/node/protocol.d.ts.map +1 -0
  63. package/dist/loadtest/node/protocol.js +17 -0
  64. package/dist/loadtest/node/protocol.js.map +1 -0
  65. package/dist/loadtest/node/setup.d.ts +6 -0
  66. package/dist/loadtest/node/setup.d.ts.map +1 -0
  67. package/dist/loadtest/node/setup.js +100 -0
  68. package/dist/loadtest/node/setup.js.map +1 -0
  69. package/dist/loadtest/node/step-compiler.d.ts +29 -0
  70. package/dist/loadtest/node/step-compiler.d.ts.map +1 -0
  71. package/dist/loadtest/node/step-compiler.js +229 -0
  72. package/dist/loadtest/node/step-compiler.js.map +1 -0
  73. package/dist/loadtest/node/transport.d.ts +66 -0
  74. package/dist/loadtest/node/transport.d.ts.map +1 -0
  75. package/dist/loadtest/node/transport.js +414 -0
  76. package/dist/loadtest/node/transport.js.map +1 -0
  77. package/dist/loadtest/node/worker-core.d.ts +77 -0
  78. package/dist/loadtest/node/worker-core.d.ts.map +1 -0
  79. package/dist/loadtest/node/worker-core.js +744 -0
  80. package/dist/loadtest/node/worker-core.js.map +1 -0
  81. package/dist/loadtest/node/worker.d.ts +2 -0
  82. package/dist/loadtest/node/worker.d.ts.map +1 -0
  83. package/dist/loadtest/node/worker.js +28 -0
  84. package/dist/loadtest/node/worker.js.map +1 -0
  85. package/dist/loadtest/plan-file.d.ts +91 -0
  86. package/dist/loadtest/plan-file.d.ts.map +1 -0
  87. package/dist/loadtest/plan-file.js +134 -0
  88. package/dist/loadtest/plan-file.js.map +1 -0
  89. package/dist/loadtest/plan.d.ts +47 -0
  90. package/dist/loadtest/plan.d.ts.map +1 -0
  91. package/dist/loadtest/plan.js +259 -0
  92. package/dist/loadtest/plan.js.map +1 -0
  93. package/dist/loadtest/report.d.ts +8 -0
  94. package/dist/loadtest/report.d.ts.map +1 -0
  95. package/dist/loadtest/report.js +211 -0
  96. package/dist/loadtest/report.js.map +1 -0
  97. package/dist/loadtest/thresholds.d.ts +55 -0
  98. package/dist/loadtest/thresholds.d.ts.map +1 -0
  99. package/dist/loadtest/thresholds.js +203 -0
  100. package/dist/loadtest/thresholds.js.map +1 -0
  101. package/dist/loadtest/types.d.ts +500 -0
  102. package/dist/loadtest/types.d.ts.map +1 -0
  103. package/dist/loadtest/types.js +8 -0
  104. package/dist/loadtest/types.js.map +1 -0
  105. package/dist/loadtest/validate.d.ts +30 -0
  106. package/dist/loadtest/validate.d.ts.map +1 -0
  107. package/dist/loadtest/validate.js +162 -0
  108. package/dist/loadtest/validate.js.map +1 -0
  109. package/dist/runner/requestAssertions.d.ts +19 -0
  110. package/dist/runner/requestAssertions.d.ts.map +1 -0
  111. package/dist/runner/requestAssertions.js +45 -0
  112. package/dist/runner/requestAssertions.js.map +1 -0
  113. package/dist/runner/requestRunner.d.ts.map +1 -1
  114. package/dist/runner/requestRunner.js +25 -0
  115. package/dist/runner/requestRunner.js.map +1 -1
  116. package/dist/runner/runCollection.d.ts.map +1 -1
  117. package/dist/runner/runCollection.js +4 -1
  118. package/dist/runner/runCollection.js.map +1 -1
  119. package/dist/runner/runRequestWithDataset.d.ts.map +1 -1
  120. package/dist/runner/runRequestWithDataset.js +15 -2
  121. package/dist/runner/runRequestWithDataset.js.map +1 -1
  122. package/dist/templating/compile.d.ts +8 -0
  123. package/dist/templating/compile.d.ts.map +1 -0
  124. package/dist/templating/compile.js +110 -0
  125. package/dist/templating/compile.js.map +1 -0
  126. package/dist/templating/index.d.ts +2 -0
  127. package/dist/templating/index.d.ts.map +1 -1
  128. package/dist/templating/index.js +1 -0
  129. package/dist/templating/index.js.map +1 -1
  130. package/dist/templating/template-engine.d.ts +6 -0
  131. package/dist/templating/template-engine.d.ts.map +1 -1
  132. package/dist/templating/template-engine.js +6 -6
  133. package/dist/templating/template-engine.js.map +1 -1
  134. package/dist/types/index.d.ts +10 -0
  135. package/dist/types/index.d.ts.map +1 -1
  136. package/dist-cjs/assertions/dbAssertions.js +195 -0
  137. package/dist-cjs/assertions/dbAssertions.js.map +1 -0
  138. package/dist-cjs/assertions/index.js +8 -0
  139. package/dist-cjs/assertions/index.js.map +1 -0
  140. package/dist-cjs/assertions/redisAssertions.js +163 -0
  141. package/dist-cjs/assertions/redisAssertions.js.map +1 -0
  142. package/dist-cjs/assertions/shared.js +30 -0
  143. package/dist-cjs/assertions/shared.js.map +1 -0
  144. package/dist-cjs/assertions/types.js +6 -0
  145. package/dist-cjs/assertions/types.js.map +1 -0
  146. package/dist-cjs/host/connections.js +24 -1
  147. package/dist-cjs/host/connections.js.map +1 -1
  148. package/dist-cjs/index.js +2 -0
  149. package/dist-cjs/index.js.map +1 -1
  150. package/dist-cjs/loadtest/compare.js +59 -0
  151. package/dist-cjs/loadtest/compare.js.map +1 -0
  152. package/dist-cjs/loadtest/flow-eval.js +205 -0
  153. package/dist-cjs/loadtest/flow-eval.js.map +1 -0
  154. package/dist-cjs/loadtest/from-collection.js +139 -0
  155. package/dist-cjs/loadtest/from-collection.js.map +1 -0
  156. package/dist-cjs/loadtest/histogram.js +171 -0
  157. package/dist-cjs/loadtest/histogram.js.map +1 -0
  158. package/dist-cjs/loadtest/index.js +78 -0
  159. package/dist-cjs/loadtest/index.js.map +1 -0
  160. package/dist-cjs/loadtest/node/index.js +12 -0
  161. package/dist-cjs/loadtest/node/index.js.map +1 -0
  162. package/dist-cjs/loadtest/node/metrics.js +402 -0
  163. package/dist-cjs/loadtest/node/metrics.js.map +1 -0
  164. package/dist-cjs/loadtest/node/orchestrator.js +372 -0
  165. package/dist-cjs/loadtest/node/orchestrator.js.map +1 -0
  166. package/dist-cjs/loadtest/node/protocol.js +20 -0
  167. package/dist-cjs/loadtest/node/protocol.js.map +1 -0
  168. package/dist-cjs/loadtest/node/setup.js +105 -0
  169. package/dist-cjs/loadtest/node/setup.js.map +1 -0
  170. package/dist-cjs/loadtest/node/step-compiler.js +234 -0
  171. package/dist-cjs/loadtest/node/step-compiler.js.map +1 -0
  172. package/dist-cjs/loadtest/node/transport.js +422 -0
  173. package/dist-cjs/loadtest/node/transport.js.map +1 -0
  174. package/dist-cjs/loadtest/node/worker-core.js +749 -0
  175. package/dist-cjs/loadtest/node/worker-core.js.map +1 -0
  176. package/dist-cjs/loadtest/node/worker.js +30 -0
  177. package/dist-cjs/loadtest/node/worker.js.map +1 -0
  178. package/dist-cjs/loadtest/plan-file.js +143 -0
  179. package/dist-cjs/loadtest/plan-file.js.map +1 -0
  180. package/dist-cjs/loadtest/plan.js +271 -0
  181. package/dist-cjs/loadtest/plan.js.map +1 -0
  182. package/dist-cjs/loadtest/report.js +220 -0
  183. package/dist-cjs/loadtest/report.js.map +1 -0
  184. package/dist-cjs/loadtest/thresholds.js +213 -0
  185. package/dist-cjs/loadtest/thresholds.js.map +1 -0
  186. package/dist-cjs/loadtest/types.js +9 -0
  187. package/dist-cjs/loadtest/types.js.map +1 -0
  188. package/dist-cjs/loadtest/validate.js +169 -0
  189. package/dist-cjs/loadtest/validate.js.map +1 -0
  190. package/dist-cjs/runner/requestAssertions.js +49 -0
  191. package/dist-cjs/runner/requestAssertions.js.map +1 -0
  192. package/dist-cjs/runner/requestRunner.js +25 -0
  193. package/dist-cjs/runner/requestRunner.js.map +1 -1
  194. package/dist-cjs/runner/runCollection.js +4 -1
  195. package/dist-cjs/runner/runCollection.js.map +1 -1
  196. package/dist-cjs/runner/runRequestWithDataset.js +15 -2
  197. package/dist-cjs/runner/runRequestWithDataset.js.map +1 -1
  198. package/dist-cjs/templating/compile.js +114 -0
  199. package/dist-cjs/templating/compile.js.map +1 -0
  200. package/dist-cjs/templating/index.js +3 -1
  201. package/dist-cjs/templating/index.js.map +1 -1
  202. package/dist-cjs/templating/template-engine.js +14 -12
  203. package/dist-cjs/templating/template-engine.js.map +1 -1
  204. package/package.json +10 -1
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ // Report builders: JSON (schema v2), a self-contained HTML page, JUnit XML for
3
+ // CI, and the plain-text summary the CLI prints. All pure string work, so the
4
+ // desktop (renderer or main) and the CLI produce identical files.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderHtmlReport = exports.renderJUnit = exports.renderTextSummary = exports.formatBytes = exports.formatDuration = exports.buildLoadTestReport = void 0;
7
+ const buildLoadTestReport = (config, result) => {
8
+ const { dataset, ...rest } = config;
9
+ return {
10
+ schemaVersion: 2,
11
+ exportedAt: new Date().toISOString(),
12
+ config: {
13
+ ...rest,
14
+ ...(dataset
15
+ ? { dataset: dataset.kind === "rows" ? { kind: "omitted", rows: dataset.rows.length } : dataset }
16
+ : {}),
17
+ // Never persist secrets that were only meant for the run.
18
+ environment: undefined,
19
+ },
20
+ result,
21
+ };
22
+ };
23
+ exports.buildLoadTestReport = buildLoadTestReport;
24
+ const formatDuration = (ms) => {
25
+ if (ms >= 60_000)
26
+ return `${Math.floor(ms / 60_000)}m ${String(Math.round((ms % 60_000) / 1000)).padStart(2, "0")}s`;
27
+ if (ms >= 1000)
28
+ return `${(ms / 1000).toFixed(ms >= 10_000 ? 0 : 1)}s`;
29
+ return `${Math.round(ms)}ms`;
30
+ };
31
+ exports.formatDuration = formatDuration;
32
+ const formatBytes = (bytes) => {
33
+ if (bytes >= 1024 ** 3)
34
+ return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
35
+ if (bytes >= 1024 ** 2)
36
+ return `${(bytes / 1024 ** 2).toFixed(1)} MB`;
37
+ if (bytes >= 1024)
38
+ return `${(bytes / 1024).toFixed(1)} KB`;
39
+ return `${Math.round(bytes)} B`;
40
+ };
41
+ exports.formatBytes = formatBytes;
42
+ const fmt = (value, digits = 1) => Number.isFinite(value) ? (Math.round(value * 10 ** digits) / 10 ** digits).toLocaleString("en-US") : "—";
43
+ const percentText = (value) => `${(value * 100).toFixed(value < 0.1 ? 2 : 1)}%`;
44
+ const passedAll = (result) => result.thresholds.every((verdict) => verdict.passed);
45
+ // ── Plain text (CLI) ─────────────────────────────────────────────────────────
46
+ const statsLine = (label, stats) => `${label.padEnd(22)} avg=${fmt(stats.avg)}ms min=${fmt(stats.min)}ms med=${fmt(stats.p50)}ms p90=${fmt(stats.p90)}ms p95=${fmt(stats.p95)}ms p99=${fmt(stats.p99)}ms max=${fmt(stats.max)}ms`;
47
+ const renderTextSummary = (result, name) => {
48
+ const lines = [];
49
+ const s = result.summary;
50
+ lines.push(`${name ? `${name} — ` : ""}load test ${passedAll(result) ? "PASSED" : "FAILED"}${result.abortedByThreshold ? " (aborted by threshold)" : result.stoppedByUser ? " (stopped)" : ""}`);
51
+ lines.push("");
52
+ lines.push(` duration ${(0, exports.formatDuration)(s.durationMs)}`);
53
+ lines.push(` requests ${s.totalRequests.toLocaleString("en-US")} (${fmt(s.avgRps)} req/s avg, ${fmt(s.peakRps)} peak)`);
54
+ lines.push(` failed ${s.failedCount.toLocaleString("en-US")} (${percentText(1 - s.successRate)})`);
55
+ lines.push(` iterations ${s.totalIterations.toLocaleString("en-US")}${s.droppedIterations > 0 ? ` — ${s.droppedIterations.toLocaleString("en-US")} DROPPED (generator or VU limit reached)` : ""}`);
56
+ lines.push(` peak VUs ${s.peakVus}`);
57
+ lines.push(` data ${(0, exports.formatBytes)(s.bytesSent)} sent, ${(0, exports.formatBytes)(s.bytesReceived)} received`);
58
+ if (s.checksPassed + s.checksFailed > 0) {
59
+ lines.push(` checks ${percentText(s.checksPassed / (s.checksPassed + s.checksFailed))} (${s.checksPassed} passed, ${s.checksFailed} failed)`);
60
+ }
61
+ lines.push("");
62
+ lines.push(statsLine("http_req_duration", result.duration));
63
+ if (result.correctedDuration)
64
+ lines.push(statsLine(" (from intended start)", result.correctedDuration));
65
+ lines.push(statsLine("iteration_duration", result.iterationDuration));
66
+ const p = result.phases;
67
+ lines.push(`phases (mean) blocked=${fmt(p.blocked)}ms connecting=${fmt(p.connecting)}ms tls=${fmt(p.tls)}ms sending=${fmt(p.sending)}ms waiting=${fmt(p.waiting)}ms receiving=${fmt(p.receiving)}ms`);
68
+ if (result.steps.length > 1) {
69
+ lines.push("");
70
+ lines.push("steps");
71
+ for (const step of result.steps) {
72
+ lines.push(` ${step.name.padEnd(28)} ${String(step.requests).padStart(8)} req ${fmt(step.rps)}/s p95=${fmt(step.duration.p95)}ms failed=${percentText(step.failedRate)}`);
73
+ }
74
+ }
75
+ if (result.errors.length > 0) {
76
+ lines.push("");
77
+ lines.push("errors");
78
+ for (const error of result.errors.slice(0, 6)) {
79
+ lines.push(` ${String(error.count).padStart(8)} ${error.errorClass} (${error.blame}) ${error.example}`);
80
+ }
81
+ }
82
+ if (result.thresholds.length > 0) {
83
+ lines.push("");
84
+ lines.push("thresholds");
85
+ for (const verdict of result.thresholds) {
86
+ const actual = verdict.actual === null ? "no data" : fmt(verdict.actual, 3);
87
+ lines.push(` ${verdict.passed ? "✓" : "✗"} ${verdict.threshold.expression} (actual: ${actual})${verdict.aborted ? " ABORTED THE RUN" : ""}${verdict.note ? ` — ${verdict.note}` : ""}`);
88
+ }
89
+ }
90
+ if (result.generator.saturated) {
91
+ lines.push("");
92
+ lines.push(`⚠ The load generator was saturated (event-loop lag up to ${fmt(result.generator.maxLoopLagMs)}ms). Latencies may be overstated — lower the load or run from a stronger machine.`);
93
+ }
94
+ return lines.join("\n");
95
+ };
96
+ exports.renderTextSummary = renderTextSummary;
97
+ // ── JUnit ────────────────────────────────────────────────────────────────────
98
+ const xml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
99
+ const renderJUnit = (result, name = "Load test") => {
100
+ const cases = result.thresholds;
101
+ const failures = cases.filter((verdict) => !verdict.passed).length;
102
+ const time = (result.summary.durationMs / 1000).toFixed(3);
103
+ const body = cases
104
+ .map((verdict) => {
105
+ const label = xml(verdict.threshold.expression);
106
+ if (verdict.passed)
107
+ return ` <testcase classname="${xml(name)}" name="${label}" time="0"/>`;
108
+ const actual = verdict.actual === null ? "no data" : String(verdict.actual);
109
+ return ` <testcase classname="${xml(name)}" name="${label}" time="0">\n <failure message="${xml(`${verdict.metric}:${verdict.aggregate} was ${actual}, expected ${verdict.operator} ${verdict.limit}`)}"/>\n </testcase>`;
110
+ })
111
+ .join("\n");
112
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<testsuites>\n <testsuite name="${xml(name)}" tests="${cases.length}" failures="${failures}" time="${time}">\n${body}\n </testsuite>\n</testsuites>\n`;
113
+ };
114
+ exports.renderJUnit = renderJUnit;
115
+ // ── HTML ─────────────────────────────────────────────────────────────────────
116
+ const esc = (value) => String(value).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
117
+ const chart = (title, points, series, unit) => {
118
+ const width = 560;
119
+ const height = 150;
120
+ const pad = { l: 44, r: 8, t: 8, b: 20 };
121
+ if (points.length < 2)
122
+ return `<div class="card"><h3>${esc(title)}</h3><p class="muted">Not enough data.</p></div>`;
123
+ const maxX = points[points.length - 1].atMs || 1;
124
+ const maxY = Math.max(1e-9, ...series.flatMap((s) => points.map(s.pick))) * 1.1;
125
+ const x = (at) => pad.l + (at / maxX) * (width - pad.l - pad.r);
126
+ const y = (value) => pad.t + (1 - value / maxY) * (height - pad.t - pad.b);
127
+ const paths = series
128
+ .map((s) => `<polyline fill="none" stroke="${s.color}" stroke-width="1.6" points="${points.map((p) => `${x(p.atMs).toFixed(1)},${y(s.pick(p)).toFixed(1)}`).join(" ")}"/>`)
129
+ .join("");
130
+ const legend = series.map((s) => `<span><i style="background:${s.color}"></i>${esc(s.label)}</span>`).join("");
131
+ return `<div class="card"><h3>${esc(title)} <small>${esc(unit)}</small></h3><svg viewBox="0 0 ${width} ${height}" role="img" aria-label="${esc(title)}">
132
+ <line x1="${pad.l}" y1="${height - pad.b}" x2="${width - pad.r}" y2="${height - pad.b}" stroke="currentColor" opacity=".25"/>
133
+ <line x1="${pad.l}" y1="${pad.t}" x2="${pad.l}" y2="${height - pad.b}" stroke="currentColor" opacity=".25"/>
134
+ <text x="4" y="${pad.t + 8}" font-size="10" fill="currentColor" opacity=".6">${fmt(maxY / 1.1, 1)}</text>
135
+ <text x="${width - pad.r}" y="${height - 6}" font-size="10" text-anchor="end" fill="currentColor" opacity=".6">${esc((0, exports.formatDuration)(maxX))}</text>
136
+ ${paths}</svg><div class="legend">${legend}</div></div>`;
137
+ };
138
+ const renderHtmlReport = (config, result, title = "Load test report") => {
139
+ const s = result.summary;
140
+ const ok = passedAll(result);
141
+ const stat = (label, value, tone = "") => `<div class="stat ${tone}"><span>${esc(label)}</span><b>${esc(value)}</b></div>`;
142
+ const stats = [
143
+ stat("Verdict", ok ? "Passed" : "Failed", ok ? "good" : "bad"),
144
+ stat("Duration", (0, exports.formatDuration)(s.durationMs)),
145
+ stat("Requests", s.totalRequests.toLocaleString("en-US")),
146
+ stat("Throughput", `${fmt(s.avgRps)} /s (peak ${fmt(s.peakRps)})`),
147
+ stat("p95", `${fmt(result.duration.p95)} ms`),
148
+ stat("p99", `${fmt(result.duration.p99)} ms`),
149
+ stat("Failed", percentText(1 - s.successRate), s.failedCount > 0 ? "bad" : "good"),
150
+ stat("Peak VUs", String(s.peakVus)),
151
+ ...(s.droppedIterations > 0 ? [stat("Dropped iterations", s.droppedIterations.toLocaleString("en-US"), "bad")] : []),
152
+ ...(s.checksPassed + s.checksFailed > 0 ? [stat("Checks", percentText(s.checksPassed / (s.checksPassed + s.checksFailed)))] : []),
153
+ ].join("");
154
+ const latencyRow = (label, l) => `<tr><td>${esc(label)}</td><td>${fmt(l.avg)}</td><td>${fmt(l.min)}</td><td>${fmt(l.p50)}</td><td>${fmt(l.p90)}</td><td>${fmt(l.p95)}</td><td>${fmt(l.p99)}</td><td>${fmt(l.p999)}</td><td>${fmt(l.max)}</td></tr>`;
155
+ const thresholds = result.thresholds.length
156
+ ? `<h2>Thresholds</h2><table><thead><tr><th></th><th>Expression</th><th>Actual</th></tr></thead><tbody>${result.thresholds
157
+ .map((v) => `<tr class="${v.passed ? "" : "bad-row"}"><td>${v.passed ? "✓" : "✗"}</td><td><code>${esc(v.threshold.expression)}</code>${v.aborted ? " <b>aborted the run</b>" : ""}</td><td>${v.actual === null ? "no data" : fmt(v.actual, 3)}${v.note ? ` <span class="muted">${esc(v.note)}</span>` : ""}</td></tr>`)
158
+ .join("")}</tbody></table>`
159
+ : "";
160
+ const steps = result.steps.length
161
+ ? `<h2>Steps</h2><table><thead><tr><th>Step</th><th>Requests</th><th>/s</th><th>Failed</th><th>avg</th><th>p95</th><th>p99</th><th>max</th></tr></thead><tbody>${result.steps
162
+ .map((st) => `<tr><td>${esc(st.name)}<div class="muted">${esc(st.method)} ${esc(st.url)}</div></td><td>${st.requests.toLocaleString("en-US")}</td><td>${fmt(st.rps)}</td><td>${percentText(st.failedRate)}</td><td>${fmt(st.duration.avg)}</td><td>${fmt(st.duration.p95)}</td><td>${fmt(st.duration.p99)}</td><td>${fmt(st.duration.max)}</td></tr>`)
163
+ .join("")}</tbody></table>`
164
+ : "";
165
+ const checks = result.steps.flatMap((st) => st.checks.map((c) => ({ step: st.name, ...c })));
166
+ const checksTable = checks.length
167
+ ? `<h2>Checks</h2><table><thead><tr><th>Step</th><th>Check</th><th>Passed</th><th>Failed</th></tr></thead><tbody>${checks
168
+ .map((c) => `<tr class="${c.failed > 0 ? "bad-row" : ""}"><td>${esc(c.step)}</td><td>${esc(c.name)}</td><td>${c.passed.toLocaleString("en-US")}</td><td>${c.failed.toLocaleString("en-US")}</td></tr>`)
169
+ .join("")}</tbody></table>`
170
+ : "";
171
+ const errors = result.errors.length
172
+ ? `<h2>Errors</h2><table><thead><tr><th>Count</th><th>Kind</th><th>Blame</th><th>Example</th></tr></thead><tbody>${result.errors
173
+ .map((e) => `<tr><td>${e.count.toLocaleString("en-US")}</td><td>${esc(e.errorClass)}</td><td>${esc(e.blame)}</td><td>${esc(e.example)}</td></tr>`)
174
+ .join("")}</tbody></table>`
175
+ : "";
176
+ const status = Object.entries(result.statusCodeCounts)
177
+ .map(([code, count]) => `<span class="pill">${esc(code === "0" ? "network" : code)} · ${count.toLocaleString("en-US")}</span>`)
178
+ .join(" ");
179
+ return `<!doctype html>
180
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
181
+ <title>${esc(title)}</title>
182
+ <style>
183
+ :root{--bg:#fff;--fg:#14171f;--muted:#6b7280;--line:#e5e7eb;--card:#f8fafc;--good:#047857;--bad:#b91c1c;color-scheme:light dark}
184
+ @media (prefers-color-scheme:dark){:root{--bg:#0f1218;--fg:#e6e8ee;--muted:#9aa3b2;--line:#252b37;--card:#161b24;--good:#34d399;--bad:#f87171}}
185
+ body{margin:0;background:var(--bg);color:var(--fg);font:14px/1.5 system-ui,-apple-system,Segoe UI,sans-serif}
186
+ main{max-width:1080px;margin:0 auto;padding:28px 16px 60px}
187
+ h1{font-size:22px;margin:0 0 4px}h2{font-size:16px;margin:28px 0 10px}h3{font-size:13px;margin:0 0 6px}h3 small{color:var(--muted);font-weight:400}
188
+ .muted{color:var(--muted);font-size:12px}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:18px 0}
189
+ .stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px 12px}.stat span{display:block;color:var(--muted);font-size:12px}.stat b{font-size:17px}
190
+ .stat.good b{color:var(--good)}.stat.bad b{color:var(--bad)}
191
+ .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:12px}.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px}
192
+ svg{width:100%;height:auto}.legend{display:flex;gap:12px;font-size:12px;color:var(--muted)}.legend i{display:inline-block;width:10px;height:3px;margin-right:5px;vertical-align:middle}
193
+ table{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top}th{color:var(--muted);font-weight:500}
194
+ .bad-row td{color:var(--bad)}code{font-family:ui-monospace,Menlo,monospace;font-size:12px}.pill{display:inline-block;border:1px solid var(--line);border-radius:99px;padding:1px 9px;font-size:12px;margin:2px}
195
+ .warn{background:#fef3c7;color:#92400e;border-radius:8px;padding:8px 12px;margin:12px 0}
196
+ </style></head><body><main>
197
+ <h1>${esc(title)}</h1>
198
+ <div class="muted">${esc(config?.name ?? "")} ${esc(s.startedAt)} → ${esc(s.finishedAt)}${result.abortedByThreshold ? " · aborted by a threshold" : result.stoppedByUser ? " · stopped by user" : ""}</div>
199
+ ${result.generator.saturated ? `<div class="warn">The load generator was saturated (event-loop lag up to ${fmt(result.generator.maxLoopLagMs)} ms). Latencies may be overstated.</div>` : ""}
200
+ <div class="stats">${stats}</div>
201
+ <div class="grid">
202
+ ${chart("Throughput", result.timeseries, [{ label: "req/s", color: "#2563eb", pick: (p) => p.rps }], "requests / s")}
203
+ ${chart("Latency", result.timeseries, [{ label: "p50", color: "#10b981", pick: (p) => p.p50 }, { label: "p95", color: "#f59e0b", pick: (p) => p.p95 }, { label: "p99", color: "#ef4444", pick: (p) => p.p99 }], "ms")}
204
+ ${chart("Virtual users", result.timeseries, [{ label: "active", color: "#7c3aed", pick: (p) => p.activeVus }], "VUs")}
205
+ ${chart("Errors", result.timeseries, [{ label: "failed", color: "#ef4444", pick: (p) => p.errors }, { label: "dropped", color: "#6b7280", pick: (p) => p.dropped }], "per interval")}
206
+ </div>
207
+ <h2>Latency (ms)</h2>
208
+ <table><thead><tr><th></th><th>avg</th><th>min</th><th>p50</th><th>p90</th><th>p95</th><th>p99</th><th>p99.9</th><th>max</th></tr></thead><tbody>
209
+ ${latencyRow("Request duration", result.duration)}
210
+ ${result.correctedDuration ? latencyRow("From intended start", result.correctedDuration) : ""}
211
+ ${latencyRow("Iteration", result.iterationDuration)}
212
+ </tbody></table>
213
+ <p class="muted">Mean phases: blocked ${fmt(result.phases.blocked)} · connecting ${fmt(result.phases.connecting)} · TLS ${fmt(result.phases.tls)} · sending ${fmt(result.phases.sending)} · waiting ${fmt(result.phases.waiting)} · receiving ${fmt(result.phases.receiving)} (ms)</p>
214
+ ${thresholds}${steps}${checksTable}${errors}
215
+ <h2>Status codes</h2><p>${status || '<span class="muted">none</span>'}</p>
216
+ <p class="muted">Data: ${(0, exports.formatBytes)(s.bytesSent)} sent, ${(0, exports.formatBytes)(s.bytesReceived)} received · Generator: ${result.generator.workers} worker(s), peak ${result.generator.peakRssMb} MB</p>
217
+ </main></body></html>`;
218
+ };
219
+ exports.renderHtmlReport = renderHtmlReport;
220
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/loadtest/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ // Threshold expressions: parse once, evaluate against a metric source.
3
+ //
4
+ // http_req_duration:p(95)<500 95th percentile under 500 ms
5
+ // http_req_duration{step:login}:avg<=200 per-step average
6
+ // http_req_failed:rate<0.01 under 1% failed (also `<1%`)
7
+ // checks:rate>0.99
8
+ // http_reqs:rate>100 throughput floor, per second
9
+ //
10
+ // CLI shorthands (`p95<500`, `avg<200ms`, `max<2s`, `fail<1%`, `rps>100`,
11
+ // `checks>99%`) normalise to the long form first.
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.legacyThresholdExpression = exports.evaluateThresholds = exports.evaluateThreshold = exports.readAggregate = exports.parseThreshold = exports.normalizeThresholdExpression = exports.ThresholdParseError = exports.METRIC_KINDS = void 0;
14
+ exports.METRIC_KINDS = {
15
+ http_req_duration: "trend",
16
+ http_req_waiting: "trend",
17
+ http_req_receiving: "trend",
18
+ http_req_sending: "trend",
19
+ http_req_blocked: "trend",
20
+ http_req_connecting: "trend",
21
+ http_req_tls_handshaking: "trend",
22
+ http_req_duration_corrected: "trend",
23
+ iteration_duration: "trend",
24
+ http_req_failed: "rate",
25
+ checks: "rate",
26
+ http_reqs: "counter",
27
+ iterations: "counter",
28
+ dropped_iterations: "counter",
29
+ data_sent: "counter",
30
+ data_received: "counter",
31
+ vus: "gauge",
32
+ };
33
+ class ThresholdParseError extends Error {
34
+ constructor(message) {
35
+ super(message);
36
+ this.name = "ThresholdParseError";
37
+ }
38
+ }
39
+ exports.ThresholdParseError = ThresholdParseError;
40
+ const SHORTHANDS = [
41
+ { pattern: /^p\(?(\d+(?:\.\d+)?)\)?\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_duration:p(${m[1]})${m[2]}${m[3]}` },
42
+ { pattern: /^(avg|min|max|med)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_duration:${m[1].toLowerCase()}${m[2]}${m[3]}` },
43
+ { pattern: /^(?:fail|failed|errors?|error_rate)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_failed:rate${m[1]}${m[2]}` },
44
+ { pattern: /^checks?\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `checks:rate${m[1]}${m[2]}` },
45
+ { pattern: /^(?:rps|throughput)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_reqs:rate${m[1]}${m[2]}` },
46
+ { pattern: /^dropped\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `dropped_iterations:count${m[1]}${m[2]}` },
47
+ ];
48
+ const normalizeThresholdExpression = (input) => {
49
+ const trimmed = input.trim();
50
+ if (trimmed.includes(":"))
51
+ return trimmed;
52
+ for (const { pattern, build } of SHORTHANDS) {
53
+ const match = trimmed.match(pattern);
54
+ if (match)
55
+ return build(match);
56
+ }
57
+ return trimmed;
58
+ };
59
+ exports.normalizeThresholdExpression = normalizeThresholdExpression;
60
+ const FULL_PATTERN = /^([a-z_][a-z0-9_]*)(?:\{\s*([a-z_][a-z0-9_]*)\s*:\s*([^}]+?)\s*\})?\s*:\s*(avg|min|max|med|count|rate|value|p\(\s*\d+(?:\.\d+)?\s*\))\s*(<=|>=|==|!=|<|>)\s*(-?\d+(?:\.\d+)?)\s*(ms|s|%)?$/i;
61
+ const parseThreshold = (expression) => {
62
+ const normalized = (0, exports.normalizeThresholdExpression)(expression);
63
+ const match = normalized.match(FULL_PATTERN);
64
+ if (!match) {
65
+ throw new ThresholdParseError(`Invalid threshold "${expression}". Use e.g. http_req_duration:p(95)<500, http_req_failed:rate<0.01 or p95<500.`);
66
+ }
67
+ const metric = match[1].toLowerCase();
68
+ const metricKind = exports.METRIC_KINDS[metric];
69
+ if (!metricKind) {
70
+ throw new ThresholdParseError(`Unknown metric "${metric}". Known: ${Object.keys(exports.METRIC_KINDS).join(", ")}.`);
71
+ }
72
+ const rawAggregate = match[4].toLowerCase();
73
+ const percentileMatch = rawAggregate.match(/^p\(\s*(\d+(?:\.\d+)?)\s*\)$/);
74
+ const aggregate = percentileMatch
75
+ ? { kind: "p", percentile: Number(percentileMatch[1]) }
76
+ : { kind: rawAggregate };
77
+ const allowed = {
78
+ trend: ["avg", "min", "max", "med", "p", "count"],
79
+ rate: ["rate"],
80
+ counter: ["count", "rate"],
81
+ gauge: ["value"],
82
+ };
83
+ if (!allowed[metricKind].includes(aggregate.kind)) {
84
+ throw new ThresholdParseError(`"${aggregate.kind}" does not apply to ${metric} (${metricKind}). Use: ${allowed[metricKind].join(", ")}.`);
85
+ }
86
+ if (aggregate.kind === "p" && (aggregate.percentile <= 0 || aggregate.percentile > 100)) {
87
+ throw new ThresholdParseError("Percentile must be between 0 and 100.");
88
+ }
89
+ let limit = Number(match[6]);
90
+ const unit = match[7]?.toLowerCase();
91
+ if (unit === "%")
92
+ limit /= 100;
93
+ else if (unit === "s")
94
+ limit *= 1000;
95
+ // Duration limits are written in ms; a rate limit written `1` for "1%" is ambiguous
96
+ // so only an explicit `%` rescales.
97
+ return {
98
+ metric,
99
+ metricKind,
100
+ tag: match[2] ? { key: match[2].toLowerCase(), value: match[3] } : null,
101
+ aggregate,
102
+ operator: match[5],
103
+ limit,
104
+ };
105
+ };
106
+ exports.parseThreshold = parseThreshold;
107
+ const readAggregate = (parsed, source) => {
108
+ const reading = source.read(parsed.metric, parsed.tag);
109
+ if (!reading)
110
+ return null;
111
+ const agg = parsed.aggregate;
112
+ if (reading.kind === "trend") {
113
+ if (reading.histogram.count === 0)
114
+ return null;
115
+ switch (agg.kind) {
116
+ case "avg":
117
+ return reading.histogram.avgMs;
118
+ case "min":
119
+ return reading.histogram.minMs;
120
+ case "max":
121
+ return reading.histogram.maxMs;
122
+ case "med":
123
+ return reading.histogram.percentile(50);
124
+ case "p":
125
+ return reading.histogram.percentile(agg.percentile);
126
+ case "count":
127
+ return reading.histogram.count;
128
+ default:
129
+ return null;
130
+ }
131
+ }
132
+ if (reading.kind === "rate") {
133
+ return reading.total === 0 ? null : reading.passes / reading.total;
134
+ }
135
+ if (reading.kind === "counter") {
136
+ if (agg.kind === "count")
137
+ return reading.value;
138
+ const seconds = source.elapsedMs() / 1000;
139
+ return seconds <= 0 ? null : reading.value / seconds;
140
+ }
141
+ return reading.value;
142
+ };
143
+ exports.readAggregate = readAggregate;
144
+ const compare = (actual, operator, limit) => {
145
+ switch (operator) {
146
+ case "<":
147
+ return actual < limit;
148
+ case "<=":
149
+ return actual <= limit;
150
+ case ">":
151
+ return actual > limit;
152
+ case ">=":
153
+ return actual >= limit;
154
+ case "==":
155
+ return actual === limit;
156
+ case "!=":
157
+ return actual !== limit;
158
+ }
159
+ };
160
+ const evaluateThreshold = (threshold, source) => {
161
+ let parsed;
162
+ try {
163
+ parsed = (0, exports.parseThreshold)(threshold.expression);
164
+ }
165
+ catch (error) {
166
+ return {
167
+ threshold,
168
+ metric: "",
169
+ aggregate: "",
170
+ operator: "",
171
+ limit: 0,
172
+ actual: null,
173
+ passed: false,
174
+ note: error instanceof Error ? error.message : String(error),
175
+ };
176
+ }
177
+ const actual = (0, exports.readAggregate)(parsed, source);
178
+ const base = {
179
+ threshold,
180
+ metric: parsed.tag ? `${parsed.metric}{${parsed.tag.key}:${parsed.tag.value}}` : parsed.metric,
181
+ aggregate: parsed.aggregate.kind === "p" ? `p(${parsed.aggregate.percentile})` : parsed.aggregate.kind,
182
+ operator: parsed.operator,
183
+ limit: parsed.limit,
184
+ actual,
185
+ };
186
+ if (actual === null) {
187
+ // No data is not a failure for a threshold on something that never happened
188
+ // (e.g. a failure rate with zero requests), but it is worth saying.
189
+ return { ...base, passed: true, note: "No data recorded for this metric." };
190
+ }
191
+ return { ...base, passed: compare(actual, parsed.operator, parsed.limit) };
192
+ };
193
+ exports.evaluateThreshold = evaluateThreshold;
194
+ const evaluateThresholds = (thresholds, source) => thresholds.map((threshold) => (0, exports.evaluateThreshold)(threshold, source));
195
+ exports.evaluateThresholds = evaluateThresholds;
196
+ const legacyThresholdExpression = (metric, operator, value, unit) => {
197
+ const suffix = unit === "%" ? "%" : unit;
198
+ switch (metric) {
199
+ case "http_req_duration_p95":
200
+ return `http_req_duration:p(95)${operator}${value}${suffix}`;
201
+ case "http_req_duration_p99":
202
+ return `http_req_duration:p(99)${operator}${value}${suffix}`;
203
+ case "http_req_duration_avg":
204
+ return `http_req_duration:avg${operator}${value}${suffix}`;
205
+ case "iter_duration_avg":
206
+ return `iteration_duration:avg${operator}${value}${suffix}`;
207
+ case "http_req_failed_rate":
208
+ case "error_rate":
209
+ return `http_req_failed:rate${operator}${value}${suffix}`;
210
+ }
211
+ };
212
+ exports.legacyThresholdExpression = legacyThresholdExpression;
213
+ //# sourceMappingURL=thresholds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thresholds.js","sourceRoot":"","sources":["../../src/loadtest/thresholds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ // Load / stress testing — shared types.
3
+ //
4
+ // This file is the single source of truth for the load-test config, the live
5
+ // events and the final result. It is renderer-safe (types only); the Node-only
6
+ // engine lives in `./node` and is reached through the `callman-core/loadtest`
7
+ // subpath so the desktop renderer bundle never pulls `node:*` modules.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/loadtest/types.ts"],"names":[],"mappings":";AAAA,wCAAwC;AACxC,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,uEAAuE"}