refactor(server): error-message util

This commit is contained in:
RainbowBird
2026-03-28 02:25:44 +08:00
committed by RainbowBird
parent bf85158aa9
commit fa1fed0c15
6 changed files with 19 additions and 1544 deletions
+2 -2
View File
@@ -4,10 +4,10 @@ import process from 'node:process'
import { pathToFileURL } from 'node:url'
import { errorMessageFrom } from '@moeru/std'
import { cac } from 'cac'
import { runApiServer } from '../app'
import { errorMessageFromUnknown } from '../utils/error-message'
import { runBillingConsumer } from './run-billing-consumer'
const serverRoles = ['api', 'billing-consumer'] as const
@@ -77,7 +77,7 @@ function isExecutedAsMainModule(): boolean {
if (isExecutedAsMainModule()) {
void main().catch((error: unknown) => {
process.stderr.write(`${errorMessageFrom(error) ?? 'Unknown error'}\n`)
process.stderr.write(`${errorMessageFromUnknown(error)}\n`)
process.exit(1)
})
}
+5 -3
View File
@@ -3,9 +3,10 @@ import type { MiddlewareHandler } from 'hono'
import type { HttpMetrics } from '../libs/otel'
import type { HonoEnv } from '../types/hono'
import { errorMessageFrom } from '@moeru/std'
import { context, SpanStatusCode, trace } from '@opentelemetry/api'
import { errorMessageFromUnknown } from '../utils/error-message'
const tracer = trace.getTracer('airi-server-hono')
/**
@@ -45,8 +46,9 @@ export function otelMiddleware(http: HttpMetrics): MiddlewareHandler<HonoEnv> {
})
}
catch (err) {
span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessageFrom(err) ?? 'Unknown error' })
span.recordException(err instanceof Error ? err : new Error(errorMessageFrom(err) ?? 'Unknown error'))
const errorMessage = errorMessageFromUnknown(err)
span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage })
span.recordException(err instanceof Error ? err : new Error(errorMessage))
throw err
}
finally {
+2 -3
View File
@@ -41,8 +41,7 @@ export function createCharacterRoutes(characterService: CharacterService) {
throw createBadRequestError('Invalid Request', 'INVALID_REQUEST', result.issues)
}
// NOTICE: Cast needed because valibot schema defines ownerId/creatorId as optional
// (user input), but we inject them from the auth context before passing to the service.
// @ts-expect-error - TODO: Fix this
const character = await characterService.create({
...result.output,
character: {
@@ -50,7 +49,7 @@ export function createCharacterRoutes(characterService: CharacterService) {
ownerId: user.id,
creatorId: user.id,
},
} as Parameters<typeof characterService.create>[0])
})
return c.json(character, 201)
})
+2 -2
View File
@@ -9,7 +9,6 @@ import type { HonoEnv } from '../types/hono'
import Stripe from 'stripe'
import { useLogger } from '@guiiai/logg'
import { errorMessageFrom } from '@moeru/std'
import { Hono } from 'hono'
import { integer, maxValue, minValue, number, object, pipe, safeParse } from 'valibot'
@@ -17,6 +16,7 @@ import { authGuard } from '../middlewares/auth'
import { configGuard } from '../middlewares/config-guard'
import { rateLimiter } from '../middlewares/rate-limit'
import { createBadRequestError, createServiceUnavailableError } from '../utils/error'
import { errorMessageFromUnknown } from '../utils/error-message'
import { resolveTrustedRequestOrigin } from '../utils/origin'
const logger = useLogger('stripe')
@@ -166,7 +166,7 @@ export function createStripeRoutes(
event = stripe.webhooks.constructEvent(body, sig, env.STRIPE_WEBHOOK_SECRET)
}
catch (err: unknown) {
throw createBadRequestError(`Webhook Error: ${errorMessageFrom(err) ?? 'Unknown error'}`, 'WEBHOOK_ERROR')
throw createBadRequestError(`Webhook Error: ${errorMessageFromUnknown(err)}`, 'WEBHOOK_ERROR')
}
logger.withFields({ type: event.type, id: event.id }).log('Webhook event received')
+8
View File
@@ -0,0 +1,8 @@
import { errorMessageFrom } from '@moeru/std'
/**
* Returns a stable human-readable message for unknown errors.
*/
export function errorMessageFromUnknown(error: unknown): string {
return errorMessageFrom(error) ?? 'Unknown error'
}
File diff suppressed because it is too large Load Diff