Fix: Mega-Debrid "Kein Server fuer diesen Hoster" (Tageslimit) -> schnell scheitern + rotieren
User-Report: Account 1 am Tageslimit liefert "Kein Server fuer diesen Hoster verfuegbar". Bisher lief das durch die volle Web-Retry-Maschine (generate->null -> re-Login -> 3x REQUEST_RETRIES) und fraß ~40s des GETEILTEN 60s-Unrestrict-Budgets -> der funktionierende naechste Account (FabelDavid) lief in den Timeout (aborted:debrid -> als fatal klassifiziert, "abgebrochen (fataler Fehler)" im Rotations-Verlauf), obwohl er gehen wuerde. Fix (3 Teile, gemeinsame MEGA_DEBRID_NO_SERVER_RE): 1. mega-web-fallback generate(): die "Kein Server"-Meldung wird surfacet (throw) statt null zurueckzugeben -> kein re-Login + erneutes Pollen. 2. unrestrictViaWeb: bricht bei der Meldung ab (kein 3x-REQUEST_RETRIES) -> sofortige Retries sind zwecklos (Limit bleibt) und verbrennen das geteilte Rotations-Budget. 3. classifyAccountFailure: erkennt die Meldung -> quota-Cooldown (2 min) -> naechster Account, mit echter Meldung im Log statt generischem "Antwort leer". So scheitert der limitierte Account schnell (1 Versuch) und der naechste Account bekommt das volle Budget zum Aufloesen. Tests: mega-web-fallback (throw + ajaxCalls=1) + debrid-Rotation (acc1 Limit -> acc2, calls=2). 645 Tests gruen, tsc 9, Build sauber. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1e5cd3012b
commit
9d8351c017
@@ -60,6 +60,35 @@ describe("mega-web-fallback", () => {
|
||||
expect(fetchCallCount).toBe(4);
|
||||
});
|
||||
|
||||
it("fails fast on 'Kein Server für diesen Hoster' (account hoster quota) instead of re-login + re-poll", async () => {
|
||||
let ajaxCalls = 0;
|
||||
globalThis.fetch = vi.fn(async (url: string | URL | Request) => {
|
||||
const urlStr = String(url);
|
||||
if (urlStr.includes("form=login")) {
|
||||
const headers = new Headers();
|
||||
headers.append("set-cookie", "session=goodcookie; path=/");
|
||||
return new Response("", { headers, status: 200 });
|
||||
}
|
||||
if (urlStr.includes("page=debrideur")) {
|
||||
return new Response('<form id="debridForm"></form>', { status: 200 });
|
||||
}
|
||||
if (urlStr.includes("form=debrid")) {
|
||||
return new Response(`<div class="acp-box"><h3>Link: https://mega.debrid/l1</h3><a href="javascript:processDebrid(1,'code1',0)">d</a></div>`, { status: 200 });
|
||||
}
|
||||
if (urlStr.includes("ajax=debrid")) {
|
||||
ajaxCalls += 1;
|
||||
return new Response(JSON.stringify({ link: "", text: "Erreur : Kein Server für diesen Hoster verfügbar. Bitte versuchen Sie es später noch einmal." }), { status: 200 });
|
||||
}
|
||||
return new Response("Not found", { status: 404 });
|
||||
}) as unknown as typeof fetch;
|
||||
|
||||
const fallback = new MegaWebFallback(() => ({ login: "user", password: "pwd" }));
|
||||
// Muss schnell mit der ECHTEN Meldung scheitern — NICHT null zurückgeben (was
|
||||
// re-Login + erneutes Pollen auslösen würde und das Rotations-Budget frisst).
|
||||
await expect(fallback.unrestrict("https://mega.debrid/l1")).rejects.toThrow(/kein server für diesen hoster/i);
|
||||
expect(ajaxCalls).toBe(1);
|
||||
});
|
||||
|
||||
it("throws if login fails to set cookie", async () => {
|
||||
globalThis.fetch = vi.fn(async (url: string | URL | Request) => {
|
||||
const urlStr = String(url);
|
||||
|
||||
Reference in New Issue
Block a user