The user's access token.
Optional
abortSignal: AbortSignalOptional AbortSignal to cancel the request.
The user's manga list organized by status.
export async function getUserMangaList(
token: string,
abortSignal?: AbortSignal,
): Promise<UserMediaList> {
if (!token) {
throw new Error("Access token required to fetch user manga list");
}
try {
// Get the user's ID first
const viewerId = await getAuthenticatedUserID(token, abortSignal);
console.log("Successfully retrieved user ID:", viewerId);
if (!viewerId) {
throw new Error("Failed to get your AniList user ID");
}
// Fetch all manga lists using multiple chunks if needed
return await fetchCompleteUserMediaList(viewerId, token, abortSignal);
} catch (error: unknown) {
console.error("Error fetching user manga list:", error);
// Type guard to check if error is an object with specific properties
if (error && typeof error === "object") {
const errorObj = error as {
status?: number;
isRateLimited?: boolean;
retryAfter?: number;
message?: string;
};
// Check if this is a rate limit error
if (errorObj.status === 429 || errorObj.isRateLimited) {
console.warn("📛 DETECTED RATE LIMIT in getUserMangaList", {
status: errorObj.status,
isRateLimited: errorObj.isRateLimited,
retryAfter: errorObj.retryAfter,
message: errorObj.message,
});
// Preserve the rate limit information when rethrowing
throw {
message: errorObj.message || "Rate limit exceeded",
status: errorObj.status || 429,
isRateLimited: true,
retryAfter: errorObj.retryAfter || 60,
};
}
// Also check for rate limit mentions in error messages
if (
errorObj.message &&
(errorObj.message.toLowerCase().includes("rate limit") ||
errorObj.message.toLowerCase().includes("too many requests"))
) {
// Try to extract retry time if present
let retrySeconds = 60;
const retryMatch = errorObj.message.match(/retry after (\d+)/i);
if (retryMatch && retryMatch[1]) {
retrySeconds = parseInt(retryMatch[1], 10);
}
console.warn(
"📛 DETECTED RATE LIMIT MENTION in getUserMangaList error message",
{
message: errorObj.message,
extractedSeconds: retrySeconds,
},
);
throw {
message: errorObj.message,
status: 429,
isRateLimited: true,
retryAfter: retrySeconds,
};
}
}
throw error;
}
}
Gets the current user's manga list from AniList.