fix(audit): require integer phase0 summary row limits
Require non-negative integer maxSessions/maxChannels/maxSkipReasons in summary core and both phase0 summary/capture CLIs to prevent silent flooring of fractional values. Architecture/protocol diagrams reviewed; no flow or API shape changes required.
This commit is contained in:
@@ -23,9 +23,9 @@ function usage(): string {
|
||||
' --channel <name[,name...]> Restrict to channels',
|
||||
' --sender <id[,id...]> Restrict to senders',
|
||||
' --source <gateway|channel[,..]> Restrict to sources',
|
||||
' --max-sessions <number> Limit session rows in output (default: 20)',
|
||||
' --max-channels <number> Limit channel rows in output (default: 20)',
|
||||
' --max-skip-reasons <number> Limit skip reason rows in output (default: 10)',
|
||||
' --max-sessions <integer> Limit session rows in output (default: 20)',
|
||||
' --max-channels <integer> Limit channel rows in output (default: 20)',
|
||||
' --max-skip-reasons <integer> Limit skip reason rows in output (default: 10)',
|
||||
' --format <markdown|json> Output format (default: markdown)',
|
||||
' --out <path> Write output to file instead of stdout',
|
||||
].join('\n');
|
||||
@@ -70,6 +70,20 @@ function parseOptionalNumber(raw: string | undefined, flag: string): number | un
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function parseOptionalInteger(raw: string | undefined, flag: string): number | undefined {
|
||||
const parsed = parseOptionalNumber(raw, flag);
|
||||
if (parsed === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
if (!Number.isInteger(parsed)) {
|
||||
throw new Error(`Invalid ${flag} value "${raw}". Expected an integer.`);
|
||||
}
|
||||
if (parsed < 0) {
|
||||
throw new Error(`${flag} must be greater than or equal to 0.`);
|
||||
}
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function parseSources(raw: string | undefined): Array<'gateway' | 'channel'> | undefined {
|
||||
const values = parseCsv(raw);
|
||||
if (!values) {
|
||||
@@ -126,9 +140,9 @@ async function main(): Promise<void> {
|
||||
channels: parseCsv(values.channel),
|
||||
senders: parseCsv(values.sender),
|
||||
sources: parseSources(values.source),
|
||||
maxSessions: parseOptionalNumber(values['max-sessions'], '--max-sessions') ?? 20,
|
||||
maxChannels: parseOptionalNumber(values['max-channels'], '--max-channels') ?? 20,
|
||||
maxSkipReasons: parseOptionalNumber(values['max-skip-reasons'], '--max-skip-reasons') ?? 10,
|
||||
maxSessions: parseOptionalInteger(values['max-sessions'], '--max-sessions') ?? 20,
|
||||
maxChannels: parseOptionalInteger(values['max-channels'], '--max-channels') ?? 20,
|
||||
maxSkipReasons: parseOptionalInteger(values['max-skip-reasons'], '--max-skip-reasons') ?? 10,
|
||||
};
|
||||
|
||||
const startTime = parseTime(values.since, '--since');
|
||||
|
||||
Reference in New Issue
Block a user