{"record":{"id":"cdcca9ad8ea1f1ac","repo":"mastra-ai/mastra","slug":"page-value-too-large-cdcca9","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/workspaces/inmemory.ts","lineNumber":209,"sourceCode":"    // Also delete all versions for this workspace\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all workspaces and apply filters\n    let configs = Array.from(this.db.workspaces.values());\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(config => {\n        if (!config.metadata) return false;\n        return Object.entries(metadata).every(([key, value]) => deepEqual(config.metadata![key], value));\n      });\n    }\n","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/workspaces/inmemory.ts#L191-L227","documentation":"list() also guards against absurd page values whose byte/page offset (page * perPage) would exceed Number.MAX_SAFE_INTEGER / 2. Such offsets can't be meaningfully represented when slicing arrays, so the domain throws rather than returning corrupted or silently empty results.","triggerScenarios":"Passing extremely large page numbers (e.g. page: Number.MAX_SAFE_INTEGER) even with default perPage; passing perPage: false (which normalizes to MAX_SAFE_INTEGER) together with any page > ~0 — page 1 * MAX_SAFE_INTEGER already exceeds the cap; multiplying page in a loop that escapes bounds.","commonSituations":"Using 'unbounded fetch' perPage: false while still sending page > 0 from a UI; fuzz/property tests with huge integers; integer overflow in page arithmetic before the call.","solutions":["Use page: 0 whenever you pass perPage: false for a fetch-all query","Cap page values to a sane maximum in your pagination layer","Compute offset once and assert Number.isSafeInteger(offset) before calling list","If you truly need deep pagination, iterate pages incrementally instead of jumping to a huge page"],"exampleFix":"// before\nconst res = await storage.workspaces.list({ page: deepPage, perPage: false }); // offset overflows\n// after\nconst res = deepPage > 0\n  ? await storage.workspaces.list({ page: deepPage })\n  : await storage.workspaces.list({ page: 0, perPage: false });","handlingStrategy":"validation","validationCode":"const MAX_OFFSET = Number.MAX_SAFE_INTEGER / 2;\nif (page * perPage > MAX_OFFSET) throw new RangeError('page value too large');","typeGuard":"function isSafePage(page: number, perPage: number): boolean {\n  return Number.isInteger(page) && page >= 0 && page * perPage <= Number.MAX_SAFE_INTEGER / 2;\n}","tryCatchPattern":"try {\n  return await storage.workspaces.list({ page, perPage });\n} catch (err) {\n  if (err instanceof Error && err.message === 'page value too large') {\n    // fall back to first page and log the bad request\n    return await storage.workspaces.list({ page: 0, perPage });\n  }\n  throw err;\n}","preventionTips":["Only use perPage: false with page: 0","Cap page in your pagination layer to a sane maximum","Assert Number.isSafeInteger(page * perPage) before calling","Avoid unvalidated integer params from external input"],"tags":["pagination","validation","storage","workspace"],"backgroundTag":"invalid-pagination-params","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}