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 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
|
||||||
|
|||||||
Reference in New Issue
Block a user