diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts index f3e440b4cb..b3f417c027 100644 --- a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts +++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts @@ -7,6 +7,7 @@ import { URL } from 'node:url'; import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import type { DeliverQueue } from '@/core/QueueModule.js'; +import { ApiLoggerService } from '@/server/api/ApiLoggerService.js'; export const meta = { tags: ['admin'], @@ -48,24 +49,33 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( @Inject('queue:deliver') public deliverQueue: DeliverQueue, + + private apiLoggerService: ApiLoggerService, ) { super(meta, paramDef, async (ps, me) => { const jobs = await this.deliverQueue.getJobs(['delayed']); - const res = [] as [string, number][]; + const res = new Map(); for (const job of jobs) { - const host = new URL(job.data.to).host; - if (res.find(x => x[0] === host)) { - res.find(x => x[0] === host)![1]++; + let host: string; + try { + host = new URL(job.data.to).host; + } catch (e) { + this.apiLoggerService.logger.warn(`failed to parse url in ${job.id}: ${e}`); + this.apiLoggerService.logger.warn(`id: ${job.id}, data: ${JSON.stringify(job.data)}`); + continue; + } + + const found = res.get(host); + if (found) { + res.set(host, found + 1); } else { - res.push([host, 1]); + res.set(host, 1); } } - res.sort((a, b) => b[1] - a[1]); - - return res; + return Array.from(res.entries()).sort((a, b) => b[1] - a[1]); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts index e7589cba81..b19b3ff5ef 100644 --- a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts +++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts @@ -7,6 +7,7 @@ import { URL } from 'node:url'; import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import type { InboxQueue } from '@/core/QueueModule.js'; +import { ApiLoggerService } from '@/server/api/ApiLoggerService.js'; export const meta = { tags: ['admin'], @@ -48,24 +49,33 @@ export const paramDef = { export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( @Inject('queue:inbox') public inboxQueue: InboxQueue, + + private apiLoggerService: ApiLoggerService, ) { super(meta, paramDef, async (ps, me) => { const jobs = await this.inboxQueue.getJobs(['delayed']); - const res = [] as [string, number][]; + const res = new Map(); for (const job of jobs) { - const host = new URL(job.data.signature.keyId).host; - if (res.find(x => x[0] === host)) { - res.find(x => x[0] === host)![1]++; + let host: string; + try { + host = new URL(job.data.signature.keyId).host; + } catch (e) { + this.apiLoggerService.logger.warn(`failed to parse url in ${job.id}: ${e}`); + this.apiLoggerService.logger.warn(`id: ${job.id}, data: ${JSON.stringify(job.data)}`); + continue; + } + + const found = res.get(host); + if (found) { + res.set(host, found + 1); } else { - res.push([host, 1]); + res.set(host, 1); } } - res.sort((a, b) => b[1] - a[1]); - - return res; + return Array.from(res.entries()).sort((a, b) => b[1] - a[1]); }); } }