{"record":{"id":"5581bbf479d578b3","repo":"agalwood/Motrix","slug":"label-must-be-finite-and-non-negative","errorCode":null,"errorMessage":"${label} must be finite and non-negative","messagePattern":"(.+?) must be finite and non-negative","errorType":"validation","errorClass":"RangeError","httpStatus":null,"severity":"error","filePath":"src/core/inspector-activity/validators.ts","lineNumber":79,"sourceCode":"  value: number,\n  label: string\n): number {\n  if (!Number.isSafeInteger(value) || value < 0) {\n    throw new RangeError(`${label} must be a non-negative safe integer`)\n  }\n  return value\n}\n\nexport function assertNonNegativeBigInt(value: bigint, label: string): bigint {\n  if (typeof value !== 'bigint' || value < 0n) {\n    throw new RangeError(`${label} must be a non-negative bigint`)\n  }\n  return value\n}\n\nexport function normalizeSpeed(value: number, label: string): number {\n  if (!Number.isFinite(value) || value < 0) {\n    throw new RangeError(`${label} must be finite and non-negative`)\n  }\n  const normalized = Math.round(value)\n  if (!Number.isSafeInteger(normalized)) {\n    throw new RangeError(`${label} exceeds the JavaScript safe integer range`)\n  }\n  return normalized\n}\n\nexport function saturatingAddSignedInt64(\n  current: bigint,\n  delta: bigint\n): { value: bigint; saturated: boolean } {\n  assertNonNegativeBigInt(current, 'current')\n  assertNonNegativeBigInt(delta, 'delta')\n  if (current > MAX_SIGNED_SQLITE_INTEGER) {\n    throw new RangeError('current exceeds the signed int64 range')\n  }\n  if (delta > MAX_SIGNED_SQLITE_INTEGER - current) {","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/agalwood/Motrix/blob/1a708ee57746c434e2c67a44bbf0906a976afea4/src/core/inspector-activity/validators.ts#L61-L97","documentation":"RangeError from normalizeSpeed when value is not finite (NaN or +/-Infinity) or is negative. Speeds must be a finite non-negative number before rounding to a safe integer; otherwise the normalized result would be meaningless.","triggerScenarios":"normalizeSpeed(value, label) with !Number.isFinite(value) || value < 0. E.g. NaN (from 0/0 or failed parse), Infinity, -1, or a negative float.","commonSituations":"A speed computed from bytes/time where time was 0 (division -> Infinity/NaN); a parsing failure yielding NaN; a sign error producing a negative rate; an upstream unit returning Infinity for 'unknown'.","solutions":["Guard divisions: compute speed only when elapsed > 0.","Coerce non-finite/negative to 0 before normalizing.","Treat Infinity/NaN upstream as 'no data' and skip the call."],"exampleFix":"// before\nconst speed = bytes / elapsed // elapsed may be 0 -> Infinity\nreturn normalizeSpeed(speed, 'downloadSpeed')\n\n// after\nconst speed = elapsed > 0 ? bytes / elapsed : 0\nreturn normalizeSpeed(speed < 0 || !Number.isFinite(speed) ? 0 : speed, 'downloadSpeed')","handlingStrategy":"validation","validationCode":"// Eliminate NaN/Infinity/negative before normalizing a speed.\nfunction safeSpeed(bytes: number, elapsedMs: number): number {\n  if (elapsedMs <= 0 || !Number.isFinite(bytes)) return 0\n  const s = bytes / (elapsedMs / 1000)\n  return Number.isFinite(s) && s >= 0 ? s : 0\n}\nreturn normalizeSpeed(safeSpeed(bytes, elapsed), 'downloadSpeed')","typeGuard":"function isFiniteNonNegative(v: unknown): v is number {\n  return typeof v === 'number' && Number.isFinite(v) && v >= 0\n}","tryCatchPattern":"try {\n  return normalizeSpeed(value, 'downloadSpeed')\n} catch (err) {\n  if (err instanceof RangeError && /finite and non-negative/.test(err.message)) {\n    return 0 // unknown speed is reported as 0\n  }\n  throw err\n}","preventionTips":["Guard all speed divisions with elapsed > 0.","Treat NaN/Infinity upstream as 'no data' -> 0.","Clamp negatives to 0 at the producer.","Validate before passing computed rates to normalizeSpeed."],"tags":["validation","range-error","speed","number","finite"],"backgroundTag":null,"analyzedSha":"1a708ee57746c434e2c67a44bbf0906a976afea4","analyzedAt":"2026-08-12T16:18:09.346Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}