From 82446e3ef151e671dd4af4b7d71f552b8a2158c0 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 21 Feb 2025 20:06:39 -0600 Subject: [PATCH 1/4] Add method and pathname to ditto.http error --- packages/ditto/controllers/error.ts | 5 ++++- packages/ditto/middleware/logiMiddleware.ts | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/ditto/controllers/error.ts b/packages/ditto/controllers/error.ts index 50962fcc..a00a530b 100644 --- a/packages/ditto/controllers/error.ts +++ b/packages/ditto/controllers/error.ts @@ -5,6 +5,9 @@ import { logi } from '@soapbox/logi'; import { errorJson } from '@/utils/log.ts'; export const errorHandler: ErrorHandler = (err, c) => { + const { method } = c.req; + const { pathname } = new URL(c.req.url); + c.header('Cache-Control', 'no-store'); if (err instanceof HTTPException) { @@ -19,7 +22,7 @@ export const errorHandler: ErrorHandler = (err, c) => { return c.json({ error: 'The server was unable to respond in a timely manner' }, 500); } - logi({ level: 'error', ns: 'ditto.http', msg: 'Unhandled error', error: errorJson(err) }); + logi({ level: 'error', ns: 'ditto.http', msg: 'Unhandled error', method, pathname, error: errorJson(err) }); return c.json({ error: 'Something went wrong' }, 500); }; diff --git a/packages/ditto/middleware/logiMiddleware.ts b/packages/ditto/middleware/logiMiddleware.ts index 26233f27..be17e3bb 100644 --- a/packages/ditto/middleware/logiMiddleware.ts +++ b/packages/ditto/middleware/logiMiddleware.ts @@ -12,8 +12,8 @@ export const logiMiddleware: MiddlewareHandler = async (c, next) => { await next(); const end = new Date(); - const delta = (end.getTime() - start.getTime()) / 1000; + const duration = (end.getTime() - start.getTime()) / 1000; const level = c.res.status >= 500 ? 'error' : 'info'; - logi({ level, ns: 'ditto.http.response', method, pathname, status: c.res.status, delta }); + logi({ level, ns: 'ditto.http.response', method, pathname, status: c.res.status, duration }); }; From 5fec5deb063850d15f97c9638725495041c7b6cd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 21 Feb 2025 20:22:58 -0600 Subject: [PATCH 2/4] publishEvent: publish to pool in background, catch errors and log --- packages/ditto/utils/api.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/ditto/utils/api.ts b/packages/ditto/utils/api.ts index f2aa4ab2..9873fb2c 100644 --- a/packages/ditto/utils/api.ts +++ b/packages/ditto/utils/api.ts @@ -12,6 +12,7 @@ import { RelayError } from '@/RelayError.ts'; import { Storages } from '@/storages.ts'; import { nostrNow } from '@/utils.ts'; import { parseFormData } from '@/utils/formdata.ts'; +import { errorJson } from '@/utils/log.ts'; import { purifyEvent } from '@/utils/purify.ts'; /** EventTemplate with defaults. */ @@ -158,9 +159,16 @@ async function updateNames(k: number, d: string, n: Record, c: async function publishEvent(event: NostrEvent, c: AppContext): Promise { logi({ level: 'info', ns: 'ditto.event', source: 'api', id: event.id, kind: event.kind }); try { - await pipeline.handleEvent(event, { source: 'api', signal: c.req.raw.signal }); - const client = await Storages.client(); - await client.event(purifyEvent(event)); + const promise = pipeline.handleEvent(event, { source: 'api', signal: c.req.raw.signal }); + + promise.then(async () => { + const client = await Storages.client(); + await client.event(purifyEvent(event)); + }).catch((e: unknown) => { + logi({ level: 'error', ns: 'ditto.pool', id: event.id, kind: event.kind, error: errorJson(e) }); + }); + + await promise; } catch (e) { if (e instanceof RelayError) { throw new HTTPException(422, { From 8437da1200024b9d8af6aea51d12207a85676098 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 21 Feb 2025 20:33:44 -0600 Subject: [PATCH 3/4] Fix error handling in nameRequestController --- packages/ditto/controllers/api/ditto.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/ditto/controllers/api/ditto.ts b/packages/ditto/controllers/api/ditto.ts index 752124dc..33db6fc7 100644 --- a/packages/ditto/controllers/api/ditto.ts +++ b/packages/ditto/controllers/api/ditto.ts @@ -84,7 +84,13 @@ export const nameRequestController: AppController = async (c) => { const pubkey = await signer.getPublicKey(); const { conf } = c.var; - const { name, reason } = nameRequestSchema.parse(await c.req.json()); + const result = nameRequestSchema.safeParse(await c.req.json()); + + if (!result.success) { + return c.json({ error: 'Invalid username', schema: result.error }, 400); + } + + const { name, reason } = result.data; const [existing] = await store.query([{ kinds: [3036], authors: [pubkey], '#r': [name], limit: 1 }]); if (existing) { From 4cfb6543c774d6156d1ea8d0b978c05b4d6ea47c Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 21 Feb 2025 20:50:09 -0600 Subject: [PATCH 4/4] Don't lowercase nip05 name before fetching (for now) --- packages/ditto/pipeline.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ditto/pipeline.ts b/packages/ditto/pipeline.ts index 602d0e2b..42b68d1b 100644 --- a/packages/ditto/pipeline.ts +++ b/packages/ditto/pipeline.ts @@ -190,7 +190,7 @@ async function updateAuthorData(event: NostrEvent, signal: AbortSignal): Promise if (nip05) { const tld = tldts.parse(nip05); if (tld.isIcann && !tld.isIp && !tld.isPrivate) { - const pointer = await nip05Cache.fetch(nip05.toLowerCase(), { signal }); + const pointer = await nip05Cache.fetch(nip05, { signal }); if (pointer.pubkey === event.pubkey) { updates.nip05 = nip05; updates.nip05_domain = tld.domain;