happy-server/sources/app/api/api.ts
2025-09-19 18:50:21 -07:00

79 lines
2.7 KiB
TypeScript

import fastify from "fastify";
import { log, logger } from "@/utils/log";
import { serializerCompiler, validatorCompiler, ZodTypeProvider } from "fastify-type-provider-zod";
import { onShutdown } from "@/utils/shutdown";
import { EventRouter } from "@/app/events/eventRouter";
import { Fastify } from "./types";
import { authRoutes } from "./routes/authRoutes";
import { pushRoutes } from "./routes/pushRoutes";
import { sessionRoutes } from "./routes/sessionRoutes";
import { connectRoutes } from "./routes/connectRoutes";
import { accountRoutes } from "./routes/accountRoutes";
import { startSocket } from "./socket";
import { machinesRoutes } from "./routes/machinesRoutes";
import { devRoutes } from "./routes/devRoutes";
import { versionRoutes } from "./routes/versionRoutes";
import { voiceRoutes } from "./routes/voiceRoutes";
import { artifactsRoutes } from "./routes/artifactsRoutes";
import { accessKeysRoutes } from "./routes/accessKeysRoutes";
import { enableMonitoring } from "./utils/enableMonitoring";
import { enableErrorHandlers } from "./utils/enableErrorHandlers";
import { enableAuthentication } from "./utils/enableAuthentication";
import { userRoutes } from "./routes/userRoutes";
export async function startApi(eventRouter: EventRouter) {
// Configure
log('Starting API...');
// Start API
const app = fastify({
loggerInstance: logger,
bodyLimit: 1024 * 1024 * 100, // 100MB
});
app.register(import('@fastify/cors'), {
origin: '*',
allowedHeaders: '*',
methods: ['GET', 'POST', 'DELETE']
});
app.get('/', function (request, reply) {
reply.send('Welcome to Happy Server!');
});
// Create typed provider
app.setValidatorCompiler(validatorCompiler);
app.setSerializerCompiler(serializerCompiler);
const typed = app.withTypeProvider<ZodTypeProvider>() as unknown as Fastify;
// Enable features
enableMonitoring(typed);
enableErrorHandlers(typed);
enableAuthentication(typed);
// Routes
authRoutes(typed);
pushRoutes(typed);
sessionRoutes(typed, eventRouter);
accountRoutes(typed, eventRouter);
connectRoutes(typed, eventRouter);
machinesRoutes(typed, eventRouter);
artifactsRoutes(typed, eventRouter);
accessKeysRoutes(typed, eventRouter);
devRoutes(typed);
versionRoutes(typed);
voiceRoutes(typed);
userRoutes(typed);
// Start HTTP
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3005;
await app.listen({ port, host: '0.0.0.0' });
onShutdown('api', async () => {
await app.close();
});
// Start Socket
startSocket(typed, eventRouter);
// End
log('API ready on port http://localhost:' + port);
}