diff --git a/packages/backend/src/misc/fetch.ts b/packages/backend/src/misc/fetch.ts index 93197dc44..69f03ad05 100644 --- a/packages/backend/src/misc/fetch.ts +++ b/packages/backend/src/misc/fetch.ts @@ -194,6 +194,7 @@ export class StatusError extends Error { public statusCode: number; public statusMessage?: string; public isClientError: boolean; + public isRetryable: boolean; constructor(message: string, statusCode: number, statusMessage?: string) { super(message); @@ -204,5 +205,6 @@ export class StatusError extends Error { typeof this.statusCode === "number" && this.statusCode >= 400 && this.statusCode < 500; + this.isRetryable = this.isClientError && this.statusCode != 429; } } diff --git a/packages/backend/src/queue/queues/deliver.ts b/packages/backend/src/queue/queues/deliver.ts index 7216a8afb..9ef061819 100644 --- a/packages/backend/src/queue/queues/deliver.ts +++ b/packages/backend/src/queue/queues/deliver.ts @@ -75,7 +75,7 @@ async function process(job: Job) { if (res instanceof StatusError) { // 4xx - if (res.isClientError) { + if (!res.isRetryable) { // HTTPステータスコード4xxはクライアントエラーであり、それはつまり // 何回再送しても成功することはないということなのでエラーにはしないでおく return `${res.statusCode} ${res.statusMessage}`; diff --git a/packages/backend/src/queue/queues/inbox.ts b/packages/backend/src/queue/queues/inbox.ts index c462f98e4..de33d3d48 100644 --- a/packages/backend/src/queue/queues/inbox.ts +++ b/packages/backend/src/queue/queues/inbox.ts @@ -80,7 +80,7 @@ async function process(job: Job): Promise { } catch (e) { // Skip if target is 4xx if (e instanceof StatusError) { - if (e.isClientError) { + if (!e.isRetryable) { return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; } throw new Error( diff --git a/packages/backend/src/queue/queues/webhook-deliver.ts b/packages/backend/src/queue/queues/webhook-deliver.ts index 71601d289..9fd11866d 100644 --- a/packages/backend/src/queue/queues/webhook-deliver.ts +++ b/packages/backend/src/queue/queues/webhook-deliver.ts @@ -58,7 +58,7 @@ async function process(job: Job) { if (res instanceof StatusError) { // 4xx - if (res.isClientError) { + if (!res.isRetryable) { return `${res.statusCode} ${res.statusMessage}`; } diff --git a/packages/backend/src/remote/activitypub/kernel/announce/note.ts b/packages/backend/src/remote/activitypub/kernel/announce/note.ts index 6cdaa6166..0f23aa27b 100644 --- a/packages/backend/src/remote/activitypub/kernel/announce/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/announce/note.ts @@ -48,7 +48,7 @@ export default async function ( } catch (e) { // Skip if target is 4xx if (e instanceof StatusError) { - if (e.isClientError) { + if (!e.isRetryable) { logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); return; } diff --git a/packages/backend/src/remote/activitypub/kernel/create/note.ts b/packages/backend/src/remote/activitypub/kernel/create/note.ts index 09c492730..2e743ace8 100644 --- a/packages/backend/src/remote/activitypub/kernel/create/note.ts +++ b/packages/backend/src/remote/activitypub/kernel/create/note.ts @@ -40,7 +40,7 @@ export default async function ( await createNote(note, resolver, silent); return "ok"; } catch (e) { - if (e instanceof StatusError && e.isClientError) { + if (e instanceof StatusError && !e.isRetryable) { return `skip ${e.statusCode}`; } else { throw e; diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index d7e11e297..9d5ff9b3b 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -280,7 +280,7 @@ export async function createNote( } catch (e) { return { status: - e instanceof StatusError && e.isClientError + e instanceof StatusError && !e.isRetryable ? "permerror" : "temperror", }; diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts index 2482f0ce6..02774402b 100644 --- a/packages/backend/src/server/file/send-drive-file.ts +++ b/packages/backend/src/server/file/send-drive-file.ts @@ -106,7 +106,7 @@ export default async function (ctx: Koa.Context) { } catch (e) { serverLogger.error(`${e}`); - if (e instanceof StatusError && e.isClientError) { + if (e instanceof StatusError && !e.isRetryable) { ctx.status = e.statusCode; ctx.set("Cache-Control", "max-age=86400"); } else {