KI-AGENT: Eingehende SIP-Anrufe sichtbarer machen
This commit is contained in:
@@ -22,6 +22,7 @@ const sipStatus = ref("Nicht verbunden")
|
||||
const sipError = ref(null)
|
||||
const incomingCall = ref(null)
|
||||
const callState = ref("idle")
|
||||
const registererState = ref("Initial")
|
||||
|
||||
const selectedAccount = computed(() =>
|
||||
(config.value?.testAccounts || []).find((account) => account.extension === selectedExtension.value)
|
||||
@@ -227,6 +228,7 @@ const stopSip = async () => {
|
||||
}
|
||||
|
||||
sipRegistered.value = false
|
||||
registererState.value = "Initial"
|
||||
sipStatus.value = "Nicht verbunden"
|
||||
callState.value = "idle"
|
||||
} catch (error) {
|
||||
@@ -251,12 +253,33 @@ const registerSip = async () => {
|
||||
|
||||
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({
|
||||
uri,
|
||||
displayName: account.displayName,
|
||||
contactName: account.extension,
|
||||
authorizationUsername: account.extension,
|
||||
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: {
|
||||
server: config.value.sipWebSocketUrl,
|
||||
},
|
||||
@@ -271,23 +294,42 @@ const registerSip = async () => {
|
||||
},
|
||||
})
|
||||
|
||||
ua.delegate = {
|
||||
onInvite(invitation) {
|
||||
incomingCall.value = invitation
|
||||
setupSession(invitation, "incoming")
|
||||
},
|
||||
}
|
||||
const reg = new sip.Registerer(ua, {
|
||||
expires: 120,
|
||||
})
|
||||
|
||||
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
|
||||
registerer.value = reg
|
||||
|
||||
await ua.start()
|
||||
await reg.register()
|
||||
|
||||
sipRegistered.value = true
|
||||
sipStatus.value = `Registriert als ${account.extension}`
|
||||
await reg.register({
|
||||
requestDelegate: {
|
||||
onAccept: () => {
|
||||
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) {
|
||||
sipRegistered.value = false
|
||||
sipStatus.value = "Nicht verbunden"
|
||||
@@ -529,6 +571,9 @@ onBeforeUnmount(() => {
|
||||
<UBadge color="neutral" variant="soft">
|
||||
{{ callState === "active" ? "Aktiver Anruf" : callState === "connecting" ? "Verbindet" : callState === "incoming" ? "Eingehend" : "Bereit" }}
|
||||
</UBadge>
|
||||
<UBadge :color="sipRegistered ? 'success' : 'warning'" variant="soft">
|
||||
Registrierung: {{ registererState }}
|
||||
</UBadge>
|
||||
</div>
|
||||
|
||||
<UAlert
|
||||
|
||||
Reference in New Issue
Block a user