import { Inviter, SessionState, UserAgent } from 'sip.js' import { UserAgentFactory } from '../index' export function popNotice () { if (Notification.permission === 'granted') { const notification = new Notification('Hi,', { body: '来电了', icon: '' }) notification.onclick = function () { notification.close() } } } // if (Notification.permission == "granted") { // popNotice() // } else if (Notification.permission != "denied") { // Notification.requestPermission(function (permission) { // popNotice() // }) // } // } else { // alert('浏览器不支持Notification') // } export function getMedia (id: string): HTMLAudioElement { const el = document.getElementById(id) if (!(el instanceof HTMLAudioElement)) { throw new Error(`Element "${id}" not found or not an audio element.`) } return el } /** * 来电振铃 * @param id Element id */ export function playMedia (id: string): void { const localAudioDom = getMedia(id) localAudioDom.currentTime = 0 localAudioDom.play() } /** * 关闭振铃 * @param id Element id */ export function pauseMedia (id: string): void { const localAudioDom = getMedia(id) localAudioDom.currentTime = 0 localAudioDom.pause() } /** * 挂断通话 * @param id Element id */ export function cleanupMedia (id: string): void { const mediaElement = getMedia(id) mediaElement.srcObject = null mediaElement.pause() } /** * 接听通话 * @param session * @param id */ export function setupMedia (id: string): void { const mediaElement = getMedia(id) mediaElement.srcObject = UserAgentFactory.getUserAgentManager().getStream() mediaElement.play() } /** * 发送 */ export const onSendCall = (userAgent: InstanceType, target: any) => { const inviter = new Inviter(userAgent, target) inviter.stateChange.addListener((state) => { switch (state) { case SessionState.Initial: break case SessionState.Establishing: break case SessionState.Established: // setupMedia(inviter); break case SessionState.Terminating: // fall through case SessionState.Terminated: cleanupMedia('remoteAudio') break default: throw new Error('Unknown session state.') } }) inviter.invite() } /** * 挂断 */ export function endCall () { const session = UserAgentFactory.getUserAgentManager().getCurrentInviter()! switch (session.state) { case SessionState.Initial: session.cancel() case SessionState.Establishing: // if (session instanceof Inviter) { // An unestablished outgoing session // } else { // // An unestablished incoming session // session.reject(); // } break case SessionState.Established: // An established session session.bye() break case SessionState.Terminating: case SessionState.Terminated: // Cannot terminate a session that is already terminated break } } /** * 接收 * @param state */ export const receivedCall = (state: SessionState) => { switch (state) { case SessionState.Initial: break case SessionState.Establishing: break case SessionState.Established: setupMedia('remoteAudio') break case SessionState.Terminating: // fall through case SessionState.Terminated: cleanupMedia('remoteAudio') break default: throw new Error('Unknown session state.') } } export const getTimes = (addtime: Date) => { return addtime.getHours().toString().padStart(2, '0') + ':' + addtime.getMinutes().toString().padStart(2, '0') + ':' + addtime.getSeconds().toString().padStart(2, '0') } export const getZeorTime = () => { return new Date(new Date(new Date().toLocaleDateString()).getTime()) } export const accumulateSec = (date: Date) => { return new Date(date.setSeconds(date.getSeconds() + 1)) } export function accumulationTimer (refresh: Function) { const date = getZeorTime() refresh(getTimes(date)) const calc = () => { const addtime = accumulateSec(date) const times = getTimes(addtime) refresh(times) } let timer = setInterval(calc, 1000); return () => { clearInterval(timer) timer = null } }