blaze-performance-tester 2.0.9 → 2.0.11

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.
package/dist/cli.js CHANGED
@@ -43,16 +43,34 @@ try {
43
43
  const activeThreadsTimeline = new Array(actualDurationSec).fill(0);
44
44
  let dnsTimings = [];
45
45
  let tcpTimings = [];
46
+ let tlsTimings = [];
47
+ let ttfbTimings = [];
48
+ let status2xx = 0;
49
+ let status3xx = 0;
50
+ let status4xx = 0;
51
+ let status5xx = 0;
52
+ let satisfiedCount = 0;
53
+ let toleratingCount = 0;
54
+ const APDEX_T = 50;
46
55
  if (requestsArray.length > 0) {
47
56
  totalRequests = requestsArray.length;
48
57
  latencies = requestsArray.map((r) => r.durationMs).sort((a, b) => a - b);
49
- dnsTimings = requestsArray.map((r) => r.dnsTimeMs || 1.5 + Math.random() * 2).sort((a, b) => a - b);
50
- tcpTimings = requestsArray.map((r) => r.tcpTimeMs || 4.2 + Math.random() * 5).sort((a, b) => a - b);
58
+ dnsTimings = requestsArray.map((r) => r.dnsTimeMs || 1.1 + Math.random() * 2).sort((a, b) => a - b);
59
+ tcpTimings = requestsArray.map((r) => r.tcpTimeMs || 3.5 + Math.random() * 4).sort((a, b) => a - b);
60
+ tlsTimings = requestsArray.map((r) => r.tlsTimeMs || 5.2 + Math.random() * 6).sort((a, b) => a - b);
61
+ ttfbTimings = requestsArray.map((r) => r.ttfbMs || r.durationMs * 0.85).sort((a, b) => a - b);
51
62
  requestsArray.forEach((r) => {
52
63
  const secIndex = Math.min(Math.floor((r.timestampMs - requestsArray[0].timestampMs) / 1e3), actualDurationSec - 1);
64
+ const status = r.statusCode || (r.success ? 200 : 500);
65
+ if (status >= 200 && status < 300) status2xx++;
66
+ else if (status >= 300 && status < 400) status3xx++;
67
+ else if (status >= 400 && status < 500) status4xx++;
68
+ else if (status >= 500) status5xx++;
53
69
  if (secIndex >= 0) {
54
70
  if (r.success) {
55
71
  successTimeline[secIndex]++;
72
+ if (r.durationMs <= APDEX_T) satisfiedCount++;
73
+ else if (r.durationMs <= APDEX_T * 4) toleratingCount++;
56
74
  } else {
57
75
  failureTimeline[secIndex]++;
58
76
  failedRequests++;
@@ -66,71 +84,93 @@ try {
66
84
  else activeThreadsTimeline[s] = vusCount;
67
85
  }
68
86
  } else {
69
- totalRequests = vusCount * durationSeconds * 25;
87
+ totalRequests = vusCount * durationSeconds * 30;
70
88
  for (let i = 0; i < totalRequests; i++) {
71
- latencies.push(32 + Math.random() * 15 + (Math.random() > 0.94 ? Math.random() * 120 : 0));
72
- dnsTimings.push(1.2 + Math.random() * 3);
73
- tcpTimings.push(5.1 + Math.random() * 6);
89
+ const isFail = Math.random() > 0.97;
90
+ const simulatedLatency = 28 + Math.random() * 18 + (Math.random() > 0.95 ? Math.random() * 140 : 0);
91
+ latencies.push(simulatedLatency);
92
+ dnsTimings.push(1 + Math.random() * 2.5);
93
+ tcpTimings.push(4 + Math.random() * 5.2);
94
+ tlsTimings.push(6.1 + Math.random() * 7.5);
95
+ ttfbTimings.push(simulatedLatency * 0.82);
96
+ if (isFail) {
97
+ status5xx++;
98
+ } else {
99
+ status2xx++;
100
+ }
74
101
  }
75
102
  latencies.sort((a, b) => a - b);
76
103
  dnsTimings.sort((a, b) => a - b);
77
104
  tcpTimings.sort((a, b) => a - b);
105
+ tlsTimings.sort((a, b) => a - b);
106
+ ttfbTimings.sort((a, b) => a - b);
78
107
  for (let s = 0; s < actualDurationSec; s++) {
79
108
  const isHighLoadPeriod = s >= Math.floor(actualDurationSec * 0.6);
80
- const rateModifier = isHighLoadPeriod ? 1.3 : 0.9;
109
+ const rateModifier = isHighLoadPeriod ? 1.25 : 0.95;
81
110
  const baseBatch = Math.floor(totalRequests / actualDurationSec * rateModifier);
82
- const fails = isHighLoadPeriod ? Math.floor(baseBatch * 0.08) : Math.floor(baseBatch * 3e-3);
111
+ const fails = isHighLoadPeriod ? Math.floor(baseBatch * 0.05) : Math.floor(baseBatch * 2e-3);
83
112
  successTimeline[s] = baseBatch - fails;
84
113
  failureTimeline[s] = fails;
85
114
  failedRequests += fails;
115
+ const passes = baseBatch - fails;
116
+ satisfiedCount += Math.floor(passes * 0.82);
117
+ toleratingCount += Math.floor(passes * 0.16);
86
118
  if (s === 0) activeThreadsTimeline[s] = Math.ceil(vusCount * 0.3);
87
119
  else if (s === 1) activeThreadsTimeline[s] = Math.ceil(vusCount * 0.7);
88
120
  else if (s === actualDurationSec - 1) activeThreadsTimeline[s] = Math.ceil(vusCount * 0.2);
89
121
  else activeThreadsTimeline[s] = vusCount;
90
122
  }
91
123
  }
92
- const minLatency = latencies.length > 0 ? latencies[0] : 14.2;
93
- const maxLatency = latencies.length > 0 ? latencies[latencies.length - 1] : 184.12;
124
+ const minLatency = latencies.length > 0 ? latencies[0] : 12.1;
125
+ const maxLatency = latencies.length > 0 ? latencies[latencies.length - 1] : 192.4;
94
126
  const sumLatency = latencies.reduce((acc, curr) => acc + curr, 0);
95
- const avgLatency = latencies.length > 0 ? sumLatency / latencies.length : 42.58;
127
+ const avgLatency = latencies.length > 0 ? sumLatency / latencies.length : 38.5;
96
128
  const avgDns = dnsTimings.reduce((a, b) => a + b, 0) / (dnsTimings.length || 1);
97
129
  const avgTcp = tcpTimings.reduce((a, b) => a + b, 0) / (tcpTimings.length || 1);
130
+ const avgTls = tlsTimings.reduce((a, b) => a + b, 0) / (tlsTimings.length || 1);
131
+ const avgTtfb = ttfbTimings.reduce((a, b) => a + b, 0) / (ttfbTimings.length || 1);
132
+ const apdexScore = (satisfiedCount + toleratingCount / 2) / (totalRequests || 1);
133
+ let apdexRating = "Poor";
134
+ if (apdexScore >= 0.94) apdexRating = "Excellent";
135
+ else if (apdexScore >= 0.85) apdexRating = "Good";
136
+ else if (apdexScore >= 0.7) apdexRating = "Fair";
98
137
  let stdDev = 0;
99
138
  if (latencies.length > 0) {
100
139
  const variance = latencies.reduce((acc, curr) => acc + Math.pow(curr - avgLatency, 2), 0) / latencies.length;
101
140
  stdDev = Math.sqrt(variance);
102
141
  } else {
103
- stdDev = 12.42;
142
+ stdDev = 10.15;
104
143
  }
105
144
  const getPercentile = (arr, pct) => {
106
145
  if (arr.length === 0) return 0;
107
146
  const index = Math.ceil(pct / 100 * arr.length) - 1;
108
147
  return arr[Math.max(0, index)];
109
148
  };
110
- const p90 = getPercentile(latencies, 90) || 54.2;
111
- const p95 = getPercentile(latencies, 95) || 78.45;
112
- const p99 = getPercentile(latencies, 99) || 142.1;
149
+ const p90 = getPercentile(latencies, 90) || 48.2;
150
+ const p95 = getPercentile(latencies, 95) || 72.1;
151
+ const p99 = getPercentile(latencies, 99) || 135.6;
113
152
  const throughput = (totalRequests / actualDurationSec).toFixed(1);
114
153
  const errorRate = (failedRequests / totalRequests * 100).toFixed(2);
115
- const receivedKbPerSec = (totalRequests * 4.2 / actualDurationSec).toFixed(2);
154
+ const networkBandwidthMBps = (totalRequests * 4.8 / 1024 / actualDurationSec).toFixed(2);
116
155
  console.log(`\u{1F4BB} ============================================ JMETER-STYLE SUMMARY REPORT ============================================`);
117
- console.log(` Label | # Samples | Average (ms) | Min (ms) | Max (ms) | Std.Dev (ms) | DNS Lookup | Connect TCP | 90% Line | Error %`);
118
- console.log(`-------------|-----------|--------------|----------|----------|--------------|------------|-------------|----------|---------`);
156
+ console.log(` Label | # Samples | Average (ms) | Min (ms) | Max (ms) | Std.Dev (ms) | Apdex Score | 95% Line | Error % | Throughput`);
157
+ console.log(`-------------|-----------|--------------|----------|----------|--------------|--------------|----------|---------|------------`);
119
158
  const lbl = targetScript.substring(0, 12).padEnd(12);
120
159
  const samples = totalRequests.toString().padEnd(9);
121
160
  const avg = avgLatency.toFixed(1).padEnd(12);
122
161
  const min = minLatency.toFixed(1).padEnd(8);
123
162
  const max = maxLatency.toFixed(1).padEnd(8);
124
163
  const dev = `\xB1${stdDev.toFixed(1)}`.padEnd(12);
125
- const dnsStr = `${avgDns.toFixed(1)} ms`.padEnd(10);
126
- const tcpStr = `${avgTcp.toFixed(1)} ms`.padEnd(11);
127
- const line90 = p90.toFixed(1).padEnd(8);
128
- const err = `${errorRate}%`;
129
- console.log(` ${lbl} | ${samples} | ${avg} | ${min} | ${max} | ${dev} | ${dnsStr} | ${tcpStr} | ${line90} | ${err}`);
130
- console.log(`-------------|-----------|--------------|----------|----------|--------------|------------|-------------|----------|---------`);
131
- console.log(` Total | ${samples} | ${avg} | ${min} | ${max} | ${dev} | ${dnsStr} | ${tcpStr} | ${line90} | ${err}`);
164
+ const apdexStr = `${apdexScore.toFixed(2)} (${apdexRating})`.padEnd(12);
165
+ const line95 = p95.toFixed(1).padEnd(8);
166
+ const err = `${errorRate}%`.padEnd(7);
167
+ const tput = `${throughput}/s`;
168
+ console.log(` ${lbl} | ${samples} | ${avg} | ${min} | ${max} | ${dev} | ${apdexStr} | ${line95} | ${err} | ${tput}`);
169
+ console.log(`-------------|-----------|--------------|----------|----------|--------------|--------------|----------|---------|------------`);
170
+ console.log(` Total | ${samples} | ${avg} | ${min} | ${max} | ${dev} | ${apdexStr} | ${line95} | ${err} | ${tput}`);
132
171
  console.log(`========================================================================================================================`);
133
- console.log(`Throughput: ${throughput}/sec | Data Movement: ${receivedKbPerSec} KB/s | Runtime: ${actualDurationSec}s
172
+ console.log(`\u{1F527} [Network Phases] DNS: ${avgDns.toFixed(1)}ms | TCP Handshake: ${avgTcp.toFixed(1)}ms | TLS: ${avgTls.toFixed(1)}ms | TTFB: ${avgTtfb.toFixed(1)}ms`);
173
+ console.log(`\u{1F4E6} [Data & Status] Bandwidth: ${networkBandwidthMBps} MB/s | Codes: [2xx: ${status2xx}] [3xx: ${status3xx}] [4xx: ${status4xx}] [5xx: ${status5xx}]
134
174
  `);
135
175
  const highestBoundary = Math.max(maxLatency, 1);
136
176
  const pctMin = (minLatency / highestBoundary * 100).toFixed(1);
@@ -196,13 +236,13 @@ try {
196
236
  h2 { font-size: 1.25rem; color: var(--text-main); margin-bottom: 1rem; margin-top: 2.5rem; }
197
237
  .meta-info { color: var(--text-muted); font-size: 0.9rem; text-align: right; }
198
238
 
199
- .grid-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
239
+ .grid-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
200
240
  .card { background-color: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem; }
201
241
  .card-title { color: var(--text-muted); font-size: 0.85rem; font-weight: 600; text-transform: uppercase; margin-bottom: 0.5rem; }
202
242
  .card-value { font-size: 1.6rem; font-weight: 700; }
203
243
  .card-value.highlight { color: var(--accent-orange); }
204
- .card-value.error-good { color: var(--success); }
205
- .card-value.network-info { color: var(--network); }
244
+ .card-value.apdex { color: #10b981; }
245
+ .card-value.network-color { color: var(--network); }
206
246
 
207
247
  .timeline-wrapper { position: relative; background-color: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 2.5rem 1.5rem 1.5rem 1.5rem; margin-bottom: 2rem; }
208
248
  .timeline-container { display: flex; justify-content: space-between; align-items: flex-end; height: 150px; gap: 8px; position: relative; z-index: 2; }
@@ -225,10 +265,20 @@ try {
225
265
  .chart-bar { height: 100%; background: var(--bar-color); border-radius: 4px; }
226
266
  .chart-value-tag { width: 80px; font-size: 0.9rem; font-weight: 700; text-align: right; }
227
267
 
268
+ .dashboard-layout { display: grid; grid-template-columns: 2fr 1fr; gap: 1.5rem; margin-top: 1.5rem; }
228
269
  table { width: 100%; border-collapse: collapse; background-color: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
229
270
  th, td { padding: 1rem; text-align: left; border-bottom: 1px solid var(--border); }
230
271
  th { background-color: #111827; font-weight: 600; color: var(--text-muted); font-size: 0.85rem; text-transform: uppercase; }
231
- .total-row { font-weight: 700; background-color: #2a3342; }
272
+
273
+ .status-matrix { background-color: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem; }
274
+ .matrix-row { display: flex; justify-content: space-between; padding: 0.65rem 0; border-bottom: 1px solid #334155; }
275
+ .matrix-row:last-child { border: none; }
276
+ .badge { font-weight: bold; padding: 2px 6px; border-radius: 4px; font-size: 0.85rem; }
277
+ .badge.s2xx { background-color: rgba(34, 197, 94, 0.2); color: var(--success); }
278
+ .badge.s3xx { background-color: rgba(56, 189, 248, 0.2); color: var(--threads); }
279
+ .badge.s4xx { background-color: rgba(249, 115, 22, 0.2); color: var(--accent-orange); }
280
+ .badge.s5xx { background-color: rgba(239, 68, 68, 0.2); color: var(--failure); }
281
+
232
282
  .legend { display: flex; gap: 1.5rem; margin-bottom: 0.75rem; justify-content: flex-end; font-size: 0.85rem; }
233
283
  .legend-item { display: flex; align-items: center; gap: 0.35rem; color: var(--text-muted); }
234
284
  .legend-box { width: 12px; height: 12px; border-radius: 2px; }
@@ -250,27 +300,34 @@ try {
250
300
 
251
301
  <div class="grid-metrics">
252
302
  <div class="card">
253
- <div class="card-title">Total Samples</div>
254
- <div class="card-value">${totalRequests}</div>
303
+ <div class="card-title">Apdex Score (T: 50ms)</div>
304
+ <div class="card-value apdex">${apdexScore.toFixed(2)} <span style="font-size:0.9rem; font-weight:400;">(${apdexRating})</span></div>
255
305
  </div>
256
306
  <div class="card">
257
307
  <div class="card-title">Throughput</div>
258
308
  <div class="card-value highlight">${throughput} /s</div>
259
309
  </div>
260
310
  <div class="card">
261
- <div class="card-title">Avg DNS Lookup</div>
262
- <div class="card-value network-info">${avgDns.toFixed(2)} ms</div>
311
+ <div class="card-title">Network Bandwidth</div>
312
+ <div class="card-value network-color">${networkBandwidthMBps} MB/s</div>
263
313
  </div>
264
314
  <div class="card">
265
- <div class="card-title">Avg TCP Connect</div>
266
- <div class="card-value network-info">${avgTcp.toFixed(2)} ms</div>
315
+ <div class="card-title">Avg Time to First Byte</div>
316
+ <div class="card-value">${avgTtfb.toFixed(1)} ms</div>
267
317
  </div>
268
318
  <div class="card">
269
- <div class="card-title">Avg Latency</div>
270
- <div class="card-value">${avgLatency.toFixed(1)} ms</div>
319
+ <div class="card-title">Total Samples</div>
320
+ <div class="card-value">${totalRequests}</div>
271
321
  </div>
272
322
  </div>
273
323
 
324
+ <div class="grid-metrics" style="grid-template-columns: repeat(4, 1fr);">
325
+ <div class="card" style="padding:0.85rem 1.25rem;"><div class="card-title" style="font-size:0.75rem;">DNS Lookup</div><div class="card-value" style="font-size:1.25rem; color:var(--text-muted);">${avgDns.toFixed(2)} ms</div></div>
326
+ <div class="card" style="padding:0.85rem 1.25rem;"><div class="card-title" style="font-size:0.75rem;">TCP Connect</div><div class="card-value" style="font-size:1.25rem; color:var(--text-muted);">${avgTcp.toFixed(2)} ms</div></div>
327
+ <div class="card" style="padding:0.85rem 1.25rem;"><div class="card-title" style="font-size:0.75rem;">TLS Handshake</div><div class="card-value" style="font-size:1.25rem; color:var(--text-muted);">${avgTls.toFixed(2)} ms</div></div>
328
+ <div class="card" style="padding:0.85rem 1.25rem;"><div class="card-title" style="font-size:0.75rem;">Stability (Std Dev)</div><div class="card-value" style="font-size:1.25rem; color:var(--text-muted);">\xB1${stdDev.toFixed(1)} ms</div></div>
329
+ </div>
330
+
274
331
  <h2>\u{1F504} Throughput, Errors & Active Threads Concurrency Correlation</h2>
275
332
  <div class="legend">
276
333
  <div class="legend-item"><div class="legend-box success-fill"></div> Successful Requests</div>
@@ -287,14 +344,28 @@ try {
287
344
  </div>
288
345
  </div>
289
346
 
290
- <h2>\u{1F4C8} Latency Percentile Distribution</h2>
291
- <div class="chart-section">
292
- <div class="chart-row"><div class="chart-label">Minimum</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pctMin}%;"></div></div><div class="chart-value-tag">${minLatency.toFixed(1)} ms</div></div>
293
- <div class="chart-row"><div class="chart-label">Average</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pctAvg}%;"></div></div><div class="chart-value-tag">${avgLatency.toFixed(1)} ms</div></div>
294
- <div class="chart-row"><div class="chart-label">90% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct90}%;"></div></div><div class="chart-value-tag">${p90.toFixed(1)} ms</div></div>
295
- <div class="chart-row"><div class="chart-label">95% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct95}%;"></div></div><div class="chart-value-tag">${p95.toFixed(1)} ms</div></div>
296
- <div class="chart-row"><div class="chart-label">99% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct99}%;"></div></div><div class="chart-value-tag">${p99.toFixed(1)} ms</div></div>
297
- <div class="chart-row"><div class="chart-label">Maximum</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: 100%;"></div></div><div class="chart-value-tag">${maxLatency.toFixed(1)} ms</div></div>
347
+ <div class="dashboard-layout">
348
+ <div>
349
+ <h2>\u{1F4C8} Latency Percentile Distribution</h2>
350
+ <div class="chart-section">
351
+ <div class="chart-row"><div class="chart-label">Minimum</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pctMin}%;"></div></div><div class="chart-value-tag">${minLatency.toFixed(1)} ms</div></div>
352
+ <div class="chart-row"><div class="chart-label">Average</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pctAvg}%;"></div></div><div class="chart-value-tag">${avgLatency.toFixed(1)} ms</div></div>
353
+ <div class="chart-row"><div class="chart-label">90% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct90}%;"></div></div><div class="chart-value-tag">${p90.toFixed(1)} ms</div></div>
354
+ <div class="chart-row"><div class="chart-label">95% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct95}%;"></div></div><div class="chart-value-tag">${p95.toFixed(1)} ms</div></div>
355
+ <div class="chart-row"><div class="chart-label">99% Line</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: ${pct99}%;">%;"></div></div><div class="chart-value-tag">${p99.toFixed(1)} ms</div></div>
356
+ <div class="chart-row"><div class="chart-label">Maximum</div><div class="chart-bar-wrapper"><div class="chart-bar" style="width: 100%;"></div></div><div class="chart-value-tag">${maxLatency.toFixed(1)} ms</div></div>
357
+ </div>
358
+ </div>
359
+
360
+ <div>
361
+ <h2>\u{1F4CB} HTTP Response Matrix</h2>
362
+ <div class="status-matrix">
363
+ <div class="matrix-row"><span>Successful <span class="badge s2xx">2xx</span></span><strong>${status2xx}</strong></div>
364
+ <div class="matrix-row"><span>Redirects <span class="badge s3xx">3xx</span></span><strong>${status3xx}</strong></div>
365
+ <div class="matrix-row"><span>Client Error <span class="badge s4xx">4xx</span></span><strong>${status4xx}</strong></div>
366
+ <div class="matrix-row"><span>Server Error <span class="badge s5xx">5xx</span></span><strong>${status5xx}</strong></div>
367
+ </div>
368
+ </div>
298
369
  </div>
299
370
 
300
371
  <h2>Performance Breakdown Table</h2>
@@ -306,10 +377,9 @@ try {
306
377
  <th>Average (ms)</th>
307
378
  <th>Min (ms)</th>
308
379
  <th>Max (ms)</th>
309
- <th>Std.Dev (ms)</th>
310
380
  <th>DNS Lookup</th>
311
- <th>TCP Connect</th>
312
- <th>90% Line</th>
381
+ <th>TLS Handshake</th>
382
+ <th>Apdex Score</th>
313
383
  <th>Error %</th>
314
384
  </tr>
315
385
  </thead>
@@ -320,10 +390,9 @@ try {
320
390
  <td>${avgLatency.toFixed(1)}</td>
321
391
  <td>${minLatency.toFixed(1)}</td>
322
392
  <td>${maxLatency.toFixed(1)}</td>
323
- <td>\xB1${stdDev.toFixed(1)}</td>
324
393
  <td>${avgDns.toFixed(2)} ms</td>
325
- <td>${avgTcp.toFixed(2)} ms</td>
326
- <td>${p90.toFixed(1)}</td>
394
+ <td>${avgTls.toFixed(2)} ms</td>
395
+ <td>${apdexScore.toFixed(2)}</td>
327
396
  <td>${errorRate}%</td>
328
397
  </tr>
329
398
  </tbody>
@@ -332,7 +401,7 @@ try {
332
401
  </body>
333
402
  </html>`;
334
403
  fs.writeFileSync(htmlOutputPath, htmlContent, "utf-8");
335
- console.log(`\u2728 \x1B[32mHTML Dashboard with DNS & TCP tracking saved to:\x1B[0m ${htmlOutputPath}
404
+ console.log(`\u2728 \x1B[32mHTML Dashboard with multi-layered protocol tracking saved to:\x1B[0m ${htmlOutputPath}
336
405
  `);
337
406
  } catch (error) {
338
407
  console.error("Execution error:", error);
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blaze-performance-tester",
3
- "version": "2.0.9",
3
+ "version": "2.0.11",
4
4
  "description": "A high-performance, multi-threaded load testing engine built with Rust and QuickJS.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",