• Gets the current user's manga list from AniList.

    Parameters

    • token: string

      The user's access token.

    • OptionalabortSignal: AbortSignal

      Optional AbortSignal to cancel the request.

    Returns Promise<UserMediaList>

    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;
    }
    }