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 }} +