import Fastify from 'fastify' import { registerErrorHandler, registerTrace } from '@drama/server-kit' import { registerAccessRoutes } from './routes/access.js' import { registerAuthRoutes } from './routes/auth.js' import { registerOwnerRoutes } from './routes/owner.js' import { registerV1Routes } from './routes/v1.js' /** * 创建并注册一个尚未 listen 的 Fastify app。只消费装配好的 services,不接触连接与 env。 * @param {{ services: Record, logger: { child: Function } }} deps * @returns {import('fastify').FastifyInstance} */ export function buildApp({ services, logger }) { const app = Fastify({ logger: false }) registerTrace(app, { logger }) registerErrorHandler(app) app.get('/healthz', async (request) => ({ ok: true, service: '@voko/server', trace_id: request.ctx && request.ctx.traceId, })) // 公开说明文件(api.voko.world/skill.md 等),不需要鉴权。 for (const [name, file] of Object.entries(services.skill.files)) { app.get(`/${name}`, async (_request, reply) => reply.type('text/markdown; charset=utf-8').send(file.body)) } app.get('/skill.json', async () => ({ name: 'voko', version: services.skill.version, files: Object.fromEntries(Object.entries(services.skill.files).map(([name, file]) => [name, { sha256: file.sha256 }])), })) registerAuthRoutes(app, services) registerAccessRoutes(app, services) registerOwnerRoutes(app, services) registerV1Routes(app, services) return app }