| import { fileURLToPath } from "node:url"; |
| import { loadConfig, validateConfig } from "./config.js"; |
| import { createApp } from "./app.js"; |
| import { InMemoryMediaStore } from "./services/mediaStore.js"; |
| import { createAudioConversionService } from "./services/audioConversionService.js"; |
| import { createRequestNormalizationService } from "./services/requestNormalizationService.js"; |
| import { createResponseNormalizationService } from "./services/responseNormalizationService.js"; |
| import { createOpenAiService } from "./services/openAiService.js"; |
| import { createChatController } from "./controllers/chatController.js"; |
| import { createMediaController } from "./controllers/mediaController.js"; |
|
|
| const config = loadConfig(); |
| validateConfig(config); |
| const publicDir = fileURLToPath(new URL("../public", import.meta.url)); |
|
|
| const mediaStore = new InMemoryMediaStore({ ttlSeconds: config.mediaTtlSeconds }); |
| const audioConversionService = createAudioConversionService({ |
| maxAudioDownloadMb: config.maxAudioDownloadMb |
| }); |
| const requestNormalizationService = createRequestNormalizationService({ |
| audioConversionService |
| }); |
| const responseNormalizationService = createResponseNormalizationService({ |
| mediaStore |
| }); |
| const openAiService = createOpenAiService({ |
| apiKey: config.openAiApiKey, |
| baseUrl: config.openAiBaseUrl, |
| timeoutMs: config.requestTimeoutMs |
| }); |
|
|
| const chatController = createChatController({ |
| openAiService, |
| requestNormalizationService, |
| responseNormalizationService |
| }); |
| const mediaController = createMediaController({ mediaStore }); |
|
|
| const app = createApp({ |
| jsonLimit: config.jsonLimit, |
| publicDir, |
| chatController, |
| mediaController |
| }); |
|
|
| app.listen(config.port, () => { |
| console.log(`oapix listening on http://localhost:${config.port}`); |
| }); |
|
|