yikart/AiToEarn · warning · AppException
ChannelPaginationLimitExceeded
ChannelPaginationLimitExceeded
Error message
ChannelPaginationLimitExceeded
What it means
ChannelPaginationLimitExceeded is thrown by normalizeChannelPagination when a cursor-mode pagination request's limit exceeds the platform's declared maxLimit. It guards against sending page sizes the upstream platform API would reject.
Source
Thrown at project/aitoearn-backend/apps/aitoearn-server/src/core/channels/platforms/platform-pagination.helper.ts:27
pagination: ChannelPaginationInput,
): ChannelPaginationInput {
const normalized = getDefaultPagination(metadata, pagination)
const normalizedMode = getPaginationInputMode(normalized)
if (metadata.mode !== normalizedMode) {
throw new AppException(ResponseCode.ChannelPaginationModeNotSupported, {
platform,
expectedMode: metadata.mode,
actualMode: normalizedMode,
})
}
switch (normalizedMode) {
case ChannelPaginationMode.Cursor: {
const cursorMetadata = metadata as Extract<ChannelPaginationMetadata, { mode: ChannelPaginationMode.Cursor }>
const limit = normalized.limit ?? cursorMetadata.defaultLimit
if (limit > cursorMetadata.maxLimit) {
throw new AppException(ResponseCode.ChannelPaginationLimitExceeded, {
platform,
limit,
maxLimit: cursorMetadata.maxLimit,
})
}
const direction = normalized.direction ?? ChannelPaginationDirection.Next
if (direction === ChannelPaginationDirection.Previous && !cursorMetadata.supportsPrevious) {
throw new AppException(ResponseCode.ChannelPaginationDirectionNotSupported, {
platform,
direction,
})
}
return { ...normalized, limit, direction }
}
case ChannelPaginationMode.Page: {
const pageMetadata = metadata as Extract<ChannelPaginationMetadata, { mode: ChannelPaginationMode.Page }>
const pageSize = normalized.pageSize ?? pageMetadata.defaultPageSize
if (pageSize > pageMetadata.maxPageSize) {View on GitHub (pinned to d3aa8bea5b)
Solutions
- Clamp the limit to cursorMetadata.maxLimit before calling
- Omit limit to use the platform's defaultLimit
- Update client page-size presets to respect each platform's declared max
Example fix
// before
normalizeChannelPagination(platform, cursorMeta, { cursor, limit: 100 }) // maxLimit 50 -> throws
// after
const limit = Math.min(requestedLimit, cursorMeta.maxLimit)
normalizeChannelPagination(platform, cursorMeta, { cursor, limit }) Defensive patterns
Strategy: validation
Validate before calling
function clampLimit(limit: number | undefined, meta: { defaultLimit: number; maxLimit: number }): number {
return Math.min(limit ?? meta.defaultLimit, meta.maxLimit)
}
const safePagination = { ...input, limit: clampLimit(input.limit, cursorMeta) } Type guard
function isWithinLimit(limit: number | undefined, meta: { defaultLimit: number; maxLimit: number }): boolean {
return (limit ?? meta.defaultLimit) <= meta.maxLimit
} Try / catch
try {
const page = await listChannelWorks(channelId, pagination)
} catch (e) {
if (e instanceof AppException && e.code === ResponseCode.ChannelPaginationLimitExceeded) {
const max = (e.context as { maxLimit: number }).maxLimit
page = await listChannelWorks(channelId, { ...pagination, limit: max })
} else throw e
} Prevention
- Clamp page sizes to the platform's declared maxLimit
- Use defaultLimit when no explicit page size is needed
- Track per-platform max limits in client config and update on API version changes
When it happens
Trigger: Calling normalizeChannelPagination with Cursor-mode metadata where (normalized.limit ?? cursorMetadata.defaultLimit) > cursorMetadata.maxLimit — e.g. requesting limit=100 against a platform whose maxLimit is 50.
Common situations: Clients with hardcoded large page sizes; UI 'load all' buttons clamping limits incorrectly; a platform lowering its max limit after an API version change while callers kept old values.
Related errors
- ChannelPaginationModeNotSupported
- ChannelPaginationPageSizeExceeded
- InvalidWorkLink
- ChannelPaginationDirectionNotSupported
- InvalidWorkLink
AI-assisted analysis of yikart/AiToEarn@d3aa8bea5b (2026-08-31).
Data as JSON: /api/errors/1f04204e8247fa7b.
Report an issue: GitHub.