KI-AGENT: Eingehende SIP-Anrufe sichtbarer machen

This commit is contained in:
2026-05-21 11:44:20 +02:00
parent 88006be691
commit e9bfa3dc1c

View File

@@ -22,6 +22,7 @@ const sipStatus = ref("Nicht verbunden")
const sipError = ref(null) const sipError = ref(null)
const incomingCall = ref(null) const incomingCall = ref(null)
const callState = ref("idle") const callState = ref("idle")
const registererState = ref("Initial")
const selectedAccount = computed(() => const selectedAccount = computed(() =>
(config.value?.testAccounts || []).find((account) => account.extension === selectedExtension.value) (config.value?.testAccounts || []).find((account) => account.extension === selectedExtension.value)
@@ -227,6 +228,7 @@ const stopSip = async () => {
} }
sipRegistered.value = false sipRegistered.value = false
registererState.value = "Initial"
sipStatus.value = "Nicht verbunden" sipStatus.value = "Nicht verbunden"
callState.value = "idle" callState.value = "idle"
} catch (error) { } catch (error) {
@@ -251,12 +253,33 @@ const registerSip = async () => {
if (!uri) throw new Error("SIP-URI konnte nicht erstellt werden.") if (!uri) throw new Error("SIP-URI konnte nicht erstellt werden.")
const handleIncomingInvite = (invitation) => {
incomingCall.value = invitation
setupSession(invitation, "incoming")
toast.add({
title: "Eingehender Anruf",
description: `Anruf für ${account.extension}`,
color: "primary"
})
}
const ua = new sip.UserAgent({ const ua = new sip.UserAgent({
uri, uri,
displayName: account.displayName, displayName: account.displayName,
contactName: account.extension, contactName: account.extension,
authorizationUsername: account.extension, authorizationUsername: account.extension,
authorizationPassword: account.password, authorizationPassword: account.password,
delegate: {
onInvite: handleIncomingInvite,
onConnect: () => {
sipStatus.value = sipRegistered.value ? `Registriert als ${account.extension}` : "SIP-WebSocket verbunden"
},
onDisconnect: () => {
sipRegistered.value = false
sipStatus.value = "SIP-WebSocket getrennt"
},
},
transportOptions: { transportOptions: {
server: config.value.sipWebSocketUrl, server: config.value.sipWebSocketUrl,
}, },
@@ -271,23 +294,42 @@ const registerSip = async () => {
}, },
}) })
ua.delegate = { const reg = new sip.Registerer(ua, {
onInvite(invitation) { expires: 120,
incomingCall.value = invitation })
setupSession(invitation, "incoming")
},
}
const reg = new sip.Registerer(ua) reg.stateChange.addListener((state) => {
registererState.value = state
if (state === sip.RegistererState.Registered) {
sipRegistered.value = true
sipStatus.value = `Registriert als ${account.extension}`
}
if (state === sip.RegistererState.Unregistered || state === sip.RegistererState.Terminated) {
sipRegistered.value = false
sipStatus.value = "Nicht verbunden"
}
})
userAgent.value = ua userAgent.value = ua
registerer.value = reg registerer.value = reg
await ua.start() await ua.start()
await reg.register() await reg.register({
requestDelegate: {
sipRegistered.value = true onAccept: () => {
sipStatus.value = `Registriert als ${account.extension}` sipRegistered.value = true
sipStatus.value = `Registriert als ${account.extension}`
registererState.value = sip.RegistererState.Registered
},
onReject: (response) => {
sipRegistered.value = false
sipStatus.value = "Registrierung abgelehnt"
sipError.value = `Asterisk hat REGISTER mit HTTP/SIP ${response.message.statusCode} abgelehnt.`
},
},
})
} catch (error) { } catch (error) {
sipRegistered.value = false sipRegistered.value = false
sipStatus.value = "Nicht verbunden" sipStatus.value = "Nicht verbunden"
@@ -529,6 +571,9 @@ onBeforeUnmount(() => {
<UBadge color="neutral" variant="soft"> <UBadge color="neutral" variant="soft">
{{ callState === "active" ? "Aktiver Anruf" : callState === "connecting" ? "Verbindet" : callState === "incoming" ? "Eingehend" : "Bereit" }} {{ callState === "active" ? "Aktiver Anruf" : callState === "connecting" ? "Verbindet" : callState === "incoming" ? "Eingehend" : "Bereit" }}
</UBadge> </UBadge>
<UBadge :color="sipRegistered ? 'success' : 'warning'" variant="soft">
Registrierung: {{ registererState }}
</UBadge>
</div> </div>
<UAlert <UAlert