{"record":{"id":"b99b2cea39d583e1","repo":"mastra-ai/mastra","slug":"page-value-too-large-b99b2c","errorCode":null,"errorMessage":"page value too large","messagePattern":"page value too large","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/memory/base.ts","lineNumber":470,"sourceCode":"  protected validatePagination(page: number, perPage: number): void {\n    if (!Number.isFinite(page) || !Number.isSafeInteger(page) || page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // perPage: 0 is allowed (returns empty results), negative values are rejected\n    if (!Number.isFinite(perPage) || !Number.isSafeInteger(perPage) || perPage < 0) {\n      throw new Error('perPage must be >= 0');\n    }\n\n    // Skip overflow check when perPage is 0 (no offset needed)\n    if (perPage === 0) {\n      return;\n    }\n\n    // Prevent overflow when calculating offset\n    const offset = page * perPage;\n    if (!Number.isSafeInteger(offset) || offset > Number.MAX_SAFE_INTEGER) {\n      throw new Error('page value too large');\n    }\n  }\n\n  /**\n   * Validates pagination input before normalization.\n   * Use this when accepting raw perPageInput (number | false) from callers.\n   *\n   * When perPage is false (fetch all), page must be 0 since pagination is disabled.\n   * When perPage is a number, delegates to validatePagination for full validation.\n   *\n   * @param page - Page number (0-indexed)\n   * @param perPageInput - Items per page as number, or false to fetch all results\n   * @throws Error if perPageInput is false and page !== 0\n   * @throws Error if perPageInput is invalid (not false or a non-negative safe integer)\n   * @throws Error if page is invalid or offset would overflow\n   */\n  protected validatePaginationInput(page: number, perPageInput: number | false): void {\n    // Validate perPageInput type first","sourceCodeStart":452,"sourceCodeEnd":488,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/memory/base.ts#L452-L488","documentation":"When computing offset = page * perPage, the result must remain a safe integer (within Number.MAX_SAFE_INTEGER). Extremely large page or perPage values would overflow and produce incorrect offsets, so the library throws 'page value too large' instead.","triggerScenarios":"Calling listThreads/listMessages with huge values such as { page: 1e15, perPage: 100 } or { page: Number.MAX_SAFE_INTEGER, perPage: 2 }, where page * perPage exceeds Number.MAX_SAFE_INTEGER.","commonSituations":"Unbounded user-supplied page query params passed straight through; retry loops incrementing page forever; client bugs sending Infinity or astronomical page numbers.","solutions":["Cap the page value against a sane maximum before calling (e.g. if (page > 1e6) reject).","Compute total record counts first and clamp page to the last valid page.","Validate Number.isSafeInteger(page * perPage) client-side before the call.","Treat the error as a bad request (400) in API layers rather than retrying."],"exampleFix":"// before\nconst page = Number(req.query.page); // user sent 1e15\nawait storage.listThreads({ page, perPage: 100 });\n// after\nconst page = Math.min(Number(req.query.page) || 0, 1_000_000);\nawait storage.listThreads({ page, perPage: 100 });","handlingStrategy":"validation","validationCode":"function assertSafeOffset(page, perPage) {\n  if (!Number.isSafeInteger(page * perPage)) {\n    throw new Error('page value too large');\n  }\n}","typeGuard":"function hasSafeOffset(page: number, perPage: number): boolean {\n  return Number.isSafeInteger(page * perPage);\n}","tryCatchPattern":"try {\n  await storage.listThreads({ page, perPage });\n} catch (e) {\n  if (e instanceof Error && e.message === 'page value too large') {\n    return { resources: [], total: 0 }; // treat as out-of-range page\n  }\n  throw e;\n}","preventionTips":["Cap page at the last valid page computed from total count","Reject absurd page numbers at the API boundary (400)","Never let retry/loop logic increment page unboundedly"],"tags":["validation","pagination","overflow"],"backgroundTag":"invalid-pagination-parameters","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}