File size: 1,764 Bytes
2671e04
e43a4a9
 
 
 
 
 
 
 
 
 
 
 
2671e04
e43a4a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2671e04
e43a4a9
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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}`);
});