diff --git a/packages/ditto/controllers/api/ditto.ts b/packages/ditto/controllers/api/ditto.ts index f67fed32..05044ce7 100644 --- a/packages/ditto/controllers/api/ditto.ts +++ b/packages/ditto/controllers/api/ditto.ts @@ -80,7 +80,13 @@ export const nameRequestController: AppController = async (c) => { const { conf, relay, user } = c.var; const pubkey = await user!.signer.getPublicKey(); - 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 relay.query([{ kinds: [3036], authors: [pubkey], '#r': [name], limit: 1 }]); if (existing) { 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 }); }; diff --git a/packages/ditto/pipeline.ts b/packages/ditto/pipeline.ts index 815229a0..2ae55b96 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; diff --git a/packages/ditto/utils/api.ts b/packages/ditto/utils/api.ts index 591c1852..7605e138 100644 --- a/packages/ditto/utils/api.ts +++ b/packages/ditto/utils/api.ts @@ -11,6 +11,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. */ @@ -157,9 +158,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, {