{"record":{"id":"a6c9207a035e6445","repo":"agalwood/Motrix","slug":"label-must-be-a-positive-safe-integer","errorCode":null,"errorMessage":"${label} must be a positive safe integer","messagePattern":"(.+?) must be a positive safe integer","errorType":"validation","errorClass":"RangeError","httpStatus":null,"severity":"error","filePath":"src/core/inspector-activity/validators.ts","lineNumber":55,"sourceCode":"    throw new RangeError(\n      `taskId must contain between 1 and ${MAX_TASK_ID_LENGTH} characters`\n    )\n  }\n  const normalized = taskId.trim()\n  if (normalized.length === 0 || normalized.length > MAX_TASK_ID_LENGTH) {\n    throw new RangeError(\n      `taskId must contain between 1 and ${MAX_TASK_ID_LENGTH} characters`\n    )\n  }\n  return normalized\n}\n\nexport function assertPositiveSafeInteger(\n  value: number,\n  label: string\n): number {\n  if (!Number.isSafeInteger(value) || value <= 0) {\n    throw new RangeError(`${label} must be a positive safe integer`)\n  }\n  return value\n}\n\nexport function assertNonNegativeSafeInteger(\n  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  }","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/agalwood/Motrix/blob/1a708ee57746c434e2c67a44bbf0906a976afea4/src/core/inspector-activity/validators.ts#L37-L73","documentation":"RangeError from assertPositiveSafeInteger when the value is not a safe integer (NaN, Infinity, float, or outside Number.MIN/MAX_SAFE_INTEGER) or is <= 0. The label is interpolated so callers know which field failed. Used for strictly-positive counters (limits, offsets that must be >=1).","triggerScenarios":"assertPositiveSafeInteger(value, label) with !Number.isSafeInteger(value) || value <= 0. E.g. 0, -1, 1.5, NaN, Infinity, or a Number larger than 2^53-1.","commonSituations":"A default of 0 for a field that must be >=1; a float parsed from a string; NaN from a failed parseInt; an unbounded counter exceeding the safe-integer range; a negative value from a sign error.","solutions":["Coerce with Math.trunc/parseInt and clamp to a minimum of 1.","Default the field to a positive safe integer (e.g. 1 or a known default).","Validate range at the producer and reject <=0 or non-integer before calling."],"exampleFix":"// before\nassertPositiveSafeInteger(payload.limit, 'limit') // payload.limit = 0 -> RangeError\n\n// after\nconst limit = Number.isFinite(payload.limit) && payload.limit > 0 ? Math.trunc(payload.limit) : DEFAULT_LIMIT\nassertPositiveSafeInteger(limit, 'limit')","handlingStrategy":"validation","validationCode":"// Coerce + clamp to a positive safe integer before validating.\nconst v = Math.trunc(Number(raw))\nconst safe = Number.isSafeInteger(v) && v > 0 ? v : 1\nassertPositiveSafeInteger(safe, 'limit')","typeGuard":"function isPositiveSafeInt(v: unknown): v is number {\n  return typeof v === 'number' && Number.isSafeInteger(v) && v > 0\n}","tryCatchPattern":"try {\n  assertPositiveSafeInteger(value, 'limit')\n} catch (err) {\n  if (err instanceof RangeError && /positive safe integer/.test(err.message)) {\n    // fall back to a sane default limit\n  } else throw err\n}","preventionTips":["Default strictly-positive fields to >= 1.","Parse with parseInt and validate before passing.","Clamp at the producer to the safe-integer range."],"tags":["validation","range-error","number","safe-integer"],"backgroundTag":null,"analyzedSha":"1a708ee57746c434e2c67a44bbf0906a976afea4","analyzedAt":"2026-08-12T16:18:09.346Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}