KI-AGENT: Lokalen Asterisk-Teststack ergänzen

This commit is contained in:
2026-05-20 22:18:58 +02:00
parent 4b85ea3d2d
commit 10f03e151d
22 changed files with 654 additions and 0 deletions

View File

@@ -32,6 +32,7 @@ import wikiRoutes from "./routes/wiki";
import portalContractRoutes from "./routes/portal/contracts";
import mcpRoutes from "./routes/mcp";
import communicationRoutes from "./routes/communication";
import telephonyRoutes from "./routes/telephony";
//Public Links
import publiclinksNonAuthenticatedRoutes from "./routes/publiclinks/publiclinks-non-authenticated";
@@ -154,6 +155,7 @@ async function main() {
await subApp.register(portalContractRoutes);
await subApp.register(mcpRoutes);
await subApp.register(communicationRoutes);
await subApp.register(telephonyRoutes);
},{prefix: "/api"})

View File

@@ -0,0 +1,93 @@
import { FastifyInstance } from "fastify"
const envFlag = (value: string | undefined, fallback: boolean) => {
if (value === undefined || value === "") return fallback
return ["1", "true", "yes", "on"].includes(value.toLowerCase())
}
const telephonyEnabled = () =>
envFlag(process.env.TELEPHONY_ENABLED, process.env.NODE_ENV !== "production")
const asteriskHttpStatusUrl = () =>
process.env.TELEPHONY_ASTERISK_HTTP_URL || "http://asterisk-dev:8088/ws"
const publicAsteriskWsUrl = () =>
process.env.TELEPHONY_ASTERISK_WS_URL || `ws://localhost:${process.env.TELEPHONY_DEV_WS_PORT || "8088"}/ws`
const sipDomain = () =>
process.env.TELEPHONY_SIP_DOMAIN || "localhost"
const testAccounts = () => [
{
extension: process.env.TELEPHONY_TEST_EXTENSION || "1001",
password: process.env.TELEPHONY_TEST_PASSWORD || "fedeo-test-1001",
displayName: "FEDEO Test 1001",
},
{
extension: process.env.TELEPHONY_TEST_EXTENSION_2 || "1002",
password: process.env.TELEPHONY_TEST_PASSWORD_2 || "fedeo-test-1002",
displayName: "FEDEO Test 1002",
},
]
const fetchWithTimeout = async (url: string, timeoutMs = 2500) => {
const controller = new AbortController()
const timeout = setTimeout(() => controller.abort(), timeoutMs)
try {
return await fetch(url, { signal: controller.signal })
} finally {
clearTimeout(timeout)
}
}
export default async function telephonyRoutes(server: FastifyInstance) {
server.get("/telephony/config", async () => ({
enabled: telephonyEnabled(),
provider: "asterisk",
mode: "local-test",
sipDomain: sipDomain(),
sipWebSocketUrl: publicAsteriskWsUrl(),
echoExtension: process.env.TELEPHONY_ECHO_EXTENSION || "600",
testAccounts: testAccounts(),
}))
server.get("/telephony/status", async () => {
const enabled = telephonyEnabled()
const url = asteriskHttpStatusUrl()
if (!enabled) {
return {
enabled,
provider: "asterisk",
reachable: false,
statusUrl: url,
message: "Telefonie ist nicht aktiviert.",
}
}
try {
const response = await fetchWithTimeout(url)
return {
enabled,
provider: "asterisk",
reachable: true,
statusCode: response.status,
statusUrl: url,
message: response.ok
? "Asterisk ist erreichbar."
: `Asterisk-HTTP ist erreichbar (HTTP ${response.status}).`,
}
} catch (error: any) {
return {
enabled,
provider: "asterisk",
reachable: false,
statusUrl: url,
message: error?.name === "AbortError"
? "Asterisk-Statusabfrage ist abgelaufen."
: (error?.message || "Asterisk ist nicht erreichbar."),
}
}
})
}