@@ -3,15 +3,27 @@ import fs from "node:fs";
|
3 | 3 | import { createInterface } from "node:readline"; |
4 | 4 | |
5 | 5 | const [statsFile, maxMemoryRaw, maxCpuRaw, label = "docker"] = process.argv.slice(2); |
6 | | -const maxMemoryMiB = Number(maxMemoryRaw); |
7 | | -const maxCpuPercent = Number(maxCpuRaw); |
| 6 | +const NON_NEGATIVE_DECIMAL_PATTERN = /^(?:0|[1-9]\d*)(?:\.\d+)?$/u; |
8 | 7 | |
9 | | -function assertFiniteLimit(value, raw, name) { |
10 | | -if (!Number.isFinite(value) || value < 0) { |
11 | | -throw new Error(`${name} must be a finite non-negative number. Got: ${JSON.stringify(raw)}`); |
| 8 | +function parseFiniteLimit(raw, name) { |
| 9 | +const text = String(raw ?? "").trim(); |
| 10 | +if (!NON_NEGATIVE_DECIMAL_PATTERN.test(text)) { |
| 11 | +throw new Error( |
| 12 | +`${name} must be a finite non-negative number in decimal notation. Got: ${JSON.stringify(raw)}`, |
| 13 | +); |
12 | 14 | } |
| 15 | +const parsed = Number(text); |
| 16 | +if (!Number.isFinite(parsed)) { |
| 17 | +throw new Error( |
| 18 | +`${name} must be a finite non-negative number in decimal notation. Got: ${JSON.stringify(raw)}`, |
| 19 | +); |
| 20 | +} |
| 21 | +return parsed; |
13 | 22 | } |
14 | 23 | |
| 24 | +const maxMemoryMiB = parseFiniteLimit(maxMemoryRaw, "max memory MiB"); |
| 25 | +const maxCpuPercent = parseFiniteLimit(maxCpuRaw, "max CPU percent"); |
| 26 | + |
15 | 27 | function parseMemoryMiB(raw) { |
16 | 28 | const value = |
17 | 29 | String(raw || "") |
@@ -87,9 +99,6 @@ let maxObservedMemoryMiB = 0;
|
87 | 99 | let maxObservedCpuPercent = 0; |
88 | 100 | let parsedSamples = 0; |
89 | 101 | |
90 | | -assertFiniteLimit(maxMemoryMiB, maxMemoryRaw, "max memory MiB"); |
91 | | -assertFiniteLimit(maxCpuPercent, maxCpuRaw, "max CPU percent"); |
92 | | - |
93 | 102 | await scanStatsFileLines(statsFile, (line) => { |
94 | 103 | let parsed; |
95 | 104 | try { |
|