File size: 1,985 Bytes
c7d34c1
 
e445b51
 
c7d34c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e445b51
 
c7d34c1
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
type Translate = (key: string, values?: Record<string, string | number>) => string;

export const superApiReferralUrl = 'https://gpt2image.superapi.buzz/';

export type ApiErrorSummary = {
    message: string;
    status?: number;
};

export type ApiErrorNotice = {
    message: string;
    links: Array<{
        label: string;
        url: string;
    }>;
};

export function buildUserFacingApiErrorMessage(options: ApiErrorSummary & { t: Translate }): string {
    const advice = buildApiErrorAdvice(options.status, options.t);
    if (!advice) return options.message;

    return options.t('error.apiFailedWithAdvice', {
        message: options.message,
        advice
    });
}

export function buildBatchPartialFailureMessage(options: {
    failed: number;
    total: number;
    errors: ApiErrorSummary[];
    t: Translate;
}): string {
    const reasons = options.errors
        .map((error, index) =>
            `${index + 1}. ${buildUserFacingApiErrorMessage({
                message: error.message,
                status: error.status,
                t: options.t
            })}`
        )
        .join(' ');

    return options.t('error.batchPartialFailureDetailed', {
        failed: options.failed,
        total: options.total,
        reasons
    });
}

export function buildApiErrorNotice(message: string): ApiErrorNotice {
    return { message, links: [] };
}

function buildApiErrorAdvice(status: number | undefined, t: Translate): string | null {
    if (status === 401 || status === 403) return t('error.adviceAuth');
    if (status === 429) return t('error.adviceRateLimit');
    if (status === 524) return t('error.adviceCloudflare', { url: superApiReferralUrl });
    if (isUpstreamStatus(status)) return t('error.adviceUpstream');
    return null;
}

function isUpstreamStatus(status: number | undefined): boolean {
    return status === 500 || status === 502 || status === 503 || status === 504 || status === 520 || status === 522 || status === 523;
}