add renderInlineError to serialize errors in a consistent way

This commit is contained in:
Hazelnoot 2025-03-03 01:03:21 -05:00
parent 3808502f86
commit 61d0aeba2e
4 changed files with 42 additions and 36 deletions

View file

@ -55,6 +55,7 @@ import type { ApLoggerService } from '../ApLoggerService.js';
import type { ApImageService } from './ApImageService.js';
import type { IActor, ICollection, IObject, IOrderedCollection } from '../type.js';
import { renderInlineError } from '@/misc/render-inline-error.js';
const nameLength = 128;
const summaryLength = 2048;
@ -820,11 +821,7 @@ export class ApPersonService implements OnModuleInit, OnApplicationShutdown {
// Resolve to (Ordered)Collection Object
const collection = user.featured ? await _resolver.resolveCollection(user.featured, true, user.uri).catch(err => {
if (isRetryableError(err)) {
if (err instanceof IdentifiableError) {
this.logger.warn(`Failed to update featured notes: ${err.id}: ${err.message}`);
} else {
this.logger.warn(`Failed to update featured notes: ${err.name}: ${err.message}`);
}
this.logger.warn(`Failed to update featured notes: ${renderInlineError(err)}`);
} else {
this.logger.error('Failed to update featured notes:', err);
}

View file

@ -0,0 +1,35 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { StatusError } from '@/misc/status-error.js';
export function renderInlineError(err: unknown): string {
if (err instanceof IdentifiableError) {
if (err.message) {
return `${err.name} ${err.id}: ${err.message}`;
} else {
return `${err.name} ${err.id}`;
}
}
if (err instanceof StatusError) {
if (err.message) {
return `${err.name} ${err.statusCode}: ${err.message}`;
} else {
return `${err.name} ${err.statusCode}`;
}
}
if (err instanceof Error) {
if (err.message) {
return `${err.name}: ${err.message}`;
} else {
return err.name;
}
}
return String(err);
}

View file

@ -14,6 +14,7 @@ import { bindThis } from '@/decorators.js';
import { CheckModeratorsActivityProcessorService } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
import { StatusError } from '@/misc/status-error.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { renderInlineError } from '@/misc/render-inline-error.js';
import { UserWebhookDeliverProcessorService } from './processors/UserWebhookDeliverProcessorService.js';
import { SystemWebhookDeliverProcessorService } from './processors/SystemWebhookDeliverProcessorService.js';
import { EndedPollNotificationProcessorService } from './processors/EndedPollNotificationProcessorService.js';
@ -140,20 +141,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
// 何故かeがundefinedで来ることがある
if (!e) return '?';
if (e instanceof Bull.UnrecoverableError || e instanceof AbortError || e.name === 'AbortError') {
return `${e.name}: ${e.message}`;
}
if (e instanceof StatusError) {
if (e.statusMessage) {
return `${e.name} ${e.statusCode}: ${e.statusMessage}`;
} else {
return `${e.name} ${e.statusCode}`;
}
}
if (e instanceof IdentifiableError) {
return `${e.name} ${e.id}: ${e.message}`;
if (e instanceof Bull.UnrecoverableError || e instanceof AbortError || e.name === 'AbortError' || e instanceof StatusError || e instanceof IdentifiableError) {
return renderInlineError(e);
}
return {

View file

@ -32,6 +32,7 @@ import type { Config } from '@/config.js';
import { ApLogService, calculateDurationSince } from '@/core/ApLogService.js';
import { UpdateInstanceQueue } from '@/core/UpdateInstanceQueue.js';
import { isRetryableError } from '@/misc/is-retryable-error.js';
import { renderInlineError } from '@/misc/render-inline-error.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type { InboxJobData } from '../types.js';
@ -300,24 +301,8 @@ export class InboxProcessorService implements OnApplicationShutdown {
}
}
if (e instanceof StatusError && !e.isRetryable) {
return `skip: permanent error ${e.statusCode}`;
}
if (e instanceof IdentifiableError && !e.isRetryable) {
if (e.message) {
return `skip: permanent error ${e.id}: ${e.message}`;
} else {
return `skip: permanent error ${e.id}`;
}
}
if (!isRetryableError(e)) {
if (e instanceof Error) {
return `skip: permanent error ${e.name}: ${e.message}`;
} else {
return `skip: permanent error ${e}`;
}
return `skip: permanent error ${renderInlineError(e)}`;
}
throw e;