This commit is contained in:
syuilo 2022-02-04 11:10:53 +09:00
parent 73de9be6d5
commit bd7662e5e4
7 changed files with 29 additions and 20 deletions

View File

@ -5,9 +5,7 @@ import { URL } from 'url';
const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/; const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/;
const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/; const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/;
export function fromHtml(html: string, hashtagNames?: string[]): string | null { export function fromHtml(html: string, hashtagNames?: string[]): string {
if (html == null) return null;
const dom = parse5.parseFragment(html); const dom = parse5.parseFragment(html);
let text = ''; let text = '';

View File

@ -24,14 +24,14 @@ const SHUTDOWN_TIMEOUT = 15000;
* down the process. * down the process.
* @type {BeforeShutdownListener[]} * @type {BeforeShutdownListener[]}
*/ */
const shutdownListeners = []; const shutdownListeners: ((signalOrEvent: string) => void)[] = [];
/** /**
* Listen for signals and execute given `fn` function once. * Listen for signals and execute given `fn` function once.
* @param {string[]} signals System signals to listen to. * @param {string[]} signals System signals to listen to.
* @param {function(string)} fn Function to execute on shutdown. * @param {function(string)} fn Function to execute on shutdown.
*/ */
const processOnce = (signals, fn) => { const processOnce = (signals: string[], fn: (signalOrEvent: string) => void) => {
for (const sig of signals) { for (const sig of signals) {
process.once(sig, fn); process.once(sig, fn);
} }
@ -41,7 +41,7 @@ const processOnce = (signals, fn) => {
* Sets a forced shutdown mechanism that will exit the process after `timeout` milliseconds. * Sets a forced shutdown mechanism that will exit the process after `timeout` milliseconds.
* @param {number} timeout Time to wait before forcing shutdown (milliseconds) * @param {number} timeout Time to wait before forcing shutdown (milliseconds)
*/ */
const forceExitAfter = timeout => () => { const forceExitAfter = (timeout: number) => () => {
setTimeout(() => { setTimeout(() => {
// Force shutdown after timeout // Force shutdown after timeout
console.warn(`Could not close resources gracefully after ${timeout}ms: forcing shutdown`); console.warn(`Could not close resources gracefully after ${timeout}ms: forcing shutdown`);
@ -55,7 +55,7 @@ const forceExitAfter = timeout => () => {
* be logged out as a warning, but won't prevent other callbacks from executing. * be logged out as a warning, but won't prevent other callbacks from executing.
* @param {string} signalOrEvent The exit signal or event name received on the process. * @param {string} signalOrEvent The exit signal or event name received on the process.
*/ */
async function shutdownHandler(signalOrEvent) { async function shutdownHandler(signalOrEvent: string) {
if (process.env.NODE_ENV === 'test') return process.exit(0); if (process.env.NODE_ENV === 'test') return process.exit(0);
console.warn(`Shutting down: received [${signalOrEvent}] signal`); console.warn(`Shutting down: received [${signalOrEvent}] signal`);
@ -64,9 +64,11 @@ async function shutdownHandler(signalOrEvent) {
try { try {
await listener(signalOrEvent); await listener(signalOrEvent);
} catch (err) { } catch (err) {
if (err instanceof Error) {
console.warn(`A shutdown handler failed before completing with: ${err.message || err}`); console.warn(`A shutdown handler failed before completing with: ${err.message || err}`);
} }
} }
}
return process.exit(0); return process.exit(0);
} }
@ -78,7 +80,7 @@ async function shutdownHandler(signalOrEvent) {
* @param {BeforeShutdownListener} listener The shutdown listener to register. * @param {BeforeShutdownListener} listener The shutdown listener to register.
* @returns {BeforeShutdownListener} Echoes back the supplied `listener`. * @returns {BeforeShutdownListener} Echoes back the supplied `listener`.
*/ */
export function beforeShutdown(listener) { export function beforeShutdown(listener: () => void) {
shutdownListeners.push(listener); shutdownListeners.push(listener);
return listener; return listener;
} }

View File

@ -41,7 +41,9 @@ export async function importCustomEmojis(job: Bull.Job<DbUserImportJobData>, don
fs.writeFileSync(destPath, '', 'binary'); fs.writeFileSync(destPath, '', 'binary');
await downloadUrl(file.url, destPath); await downloadUrl(file.url, destPath);
} catch (e) { // TODO: 何度か再試行 } catch (e) { // TODO: 何度か再試行
if (e instanceof Error || typeof e === 'string') {
logger.error(e); logger.error(e);
}
throw e; throw e;
} }

View File

@ -54,12 +54,14 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor)); authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor));
} catch (e) { } catch (e) {
// 対象が4xxならスキップ // 対象が4xxならスキップ
if (e instanceof StatusError && e.isClientError) { if (e instanceof StatusError) {
if (e.isClientError) {
return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`; return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`;
} }
throw `Error in actor ${activity.actor} - ${e.statusCode || e}`; throw `Error in actor ${activity.actor} - ${e.statusCode || e}`;
} }
} }
}
// それでもわからなければ終了 // それでもわからなければ終了
if (authUser == null) { if (authUser == null) {

View File

@ -42,11 +42,14 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity:
renote = await resolveNote(targetUri); renote = await resolveNote(targetUri);
} catch (e) { } catch (e) {
// 対象が4xxならスキップ // 対象が4xxならスキップ
if (e instanceof StatusError && e.isClientError) { if (e instanceof StatusError) {
if (e.isClientError) {
logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`); logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`);
return; return;
} }
logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`); logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`);
}
throw e; throw e;
} }

View File

@ -10,7 +10,7 @@ export default async (actor: IRemoteUser, activity: IFlag): Promise<string> => {
// 対象ユーザーは一番最初のユーザー として あとはコメントとして格納する // 対象ユーザーは一番最初のユーザー として あとはコメントとして格納する
const uris = getApIds(activity.object); const uris = getApIds(activity.object);
const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()); const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()!);
const users = await Users.find({ const users = await Users.find({
id: In(userIds), id: In(userIds),
}); });

View File

@ -25,8 +25,10 @@ export async function performActivity(actor: IRemoteUser, activity: IObject) {
const act = await resolver.resolve(item); const act = await resolver.resolve(item);
try { try {
await performOneActivity(actor, act); await performOneActivity(actor, act);
} catch (e) { } catch (err) {
apLogger.error(e); if (err instanceof Error || typeof err === 'string') {
apLogger.error(err);
}
} }
} }
} else { } else {