KI-AGENT: Lokalen Asterisk-Teststack ergänzen
This commit is contained in:
@@ -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"})
|
||||
|
||||
|
||||
93
backend/src/routes/telephony.ts
Normal file
93
backend/src/routes/telephony.ts
Normal 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."),
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user