diff --git a/frontend/pages/communication/phone.vue b/frontend/pages/communication/phone.vue
index c620bda..0ed50a8 100644
--- a/frontend/pages/communication/phone.vue
+++ b/frontend/pages/communication/phone.vue
@@ -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(() => {
{{ callState === "active" ? "Aktiver Anruf" : callState === "connecting" ? "Verbindet" : callState === "incoming" ? "Eingehend" : "Bereit" }}
+
+ Registrierung: {{ registererState }}
+