You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

318 lines
8.9 KiB

"use strict";
//
// Na Documentação incluir os sites da simplesip.com.br no Content-Security-Policy
//
const UASimplesIP = (function () {
function carregandoScriptSimpleSIP(url, callback) {
var script = document.createElement("script");
script.src = url;
script.async = true; // Asynchronous loading
script.onload = function () {
if (typeof callback === "function") {
callback();
}
// Clean up after script execution
script.onload = script.onerror = null;
document.head.removeChild(script);
};
script.onerror = function () {
// Handle errors
console.error("Error loading script:", url);
if (typeof callback === "function") {
callback(new Error("Error loading script"));
}
// Clean up after script execution
script.onload = script.onerror = null;
document.head.removeChild(script);
};
document.head.appendChild(script);
}
carregandoScriptSimpleSIP("simplesiplib.js", (error) => {
if (!error) {
console.log("::: Script loaded successfully!");
} else {
console.error(":::: Failed to load script:", error);
}
});
class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, listener) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(listener);
}
emit(eventName, ...args) {
if (this.events[eventName]) {
this.events[eventName].forEach((listener) => listener(...args));
}
}
off(eventName, listener) {
if (this.events[eventName]) {
this.events[eventName] = this.events[eventName].filter(
(fn) => fn !== listener
);
}
}
}
const eventoSip = new EventEmitter();
//const PROTOCOLO = "ws|wss"
function passa(nome) {
console.log(SimpleSIP.settings);
}
function Autenticacao(PROTOCOLO, SERVIDOR, PORTA, NOME, RAMAL, SENHA) {
this.PROTOCOLO = PROTOCOLO;
this.SERVIDOR = SERVIDOR;
this.PORTA = PORTA;
this.NOME = NOME;
this.RAMAL = RAMAL;
this.SENHA = SENHA;
}
const _Autenticacao = new Autenticacao();
var localAudio = new window.Audio();
localAudio.autoplay = true;
const incomingCallAudio = new window.Audio(
"https://cdn.pixabay.com/download/audio/2021/08/04/audio_bb630cc098.mp3?filename=short-success-sound-glockenspiel-treasure-video-game-6346.mp3"
);
incomingCallAudio.loop = true;
var remoteAudio = new window.Audio();
remoteAudio.autoplay = true;
var phone;
var session;
var isIncomingCall = false; // Flag para controlar o estado de chamada recebida
function iniciandoAutenticacaonoPBX() {
const configuration = {
uri: "sip:" + _Autenticacao.RAMAL + "@" + _Autenticacao.SERVIDOR,
password: _Autenticacao.SENHA,
sockets: new SimpleSIP.WebSocketInterface(
_Autenticacao.PROTOCOLO +
"://" +
_Autenticacao.SERVIDOR +
":" +
_Autenticacao.PORTA +
"/ws"
),
display_name:
_Autenticacao.NOME !== null ? _Autenticacao.NOME : _Autenticacao.RAMAL,
user_agent: "UASimpleSIP 1.2.0",
pcConfig: {
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
},
{
urls: "stun:stun1.l.google.com:19302",
},
{
urls: "stun:stun2.l.google.com:19302",
},
],
},
};
if (configuration.uri && configuration.password) {
phone = new SimpleSIP.UA(configuration);
phone.on("registrationFailed", function (ev) {
console.log("Registering on SIP server failed with error: " + ev.cause);
configuration.uri = null;
configuration.password = null;
});
phone.on("newRTCSession", function (ev) {
const newSession = ev.session;
session = newSession;
eventoSip.on("endCall", () => {
if (session && session.isEstablished()) {
eventoSip.emit("confirmedEnded");
console.log();
session.terminate();
}
});
// setInterval(() => {
// eventoSip.emit("evento", session.connection.iceConnectionState);
// }, 2000);
eventoSip.on("evento", (payload) => {
console.log(payload);
});
eventoSip.on("mute", function () {
session.mute();
});
eventoSip.on("unmute", function () {
session.unmute();
});
session.on("candidate", (event) => {
console.log(event);
});
phone.on("connectionstatechange", (event) => {
console.log("EVENTO ESTADO DA CONEXAO: ", event);
});
session.on("failed", () => {});
session.on("ended", () => {
eventoSip.emit("confirmedEnded");
});
session.on("confirmed", function (confirmed) {
// Verifica se session.connection está definido
if (
session.connection &&
session.connection.getRemoteStreams().length > 0
) {
const remoteStreams = session.connection.getRemoteStreams()[0];
remoteAudio.srcObject = remoteStreams;
}
// Verifica se session.connection está definido e se existem streams locais
if (
session.connection &&
session.connection.getLocalStreams().length > 0
) {
const localStreams = session.connection.getLocalStreams()[0];
localAudio.srcObject = localStreams;
}
eventoSip.emit("incall");
});
session.on("icecandidate", function (event) {
if (
event.candidate.type === "srflx" &&
event.candidate.relatedAddress !== null &&
event.candidate.relatedPort !== null
) {
event.ready();
}
});
session.on("addstream", function (e) {
// Verifica se session.connection está definido
if (session.connection) {
remoteAudio.src = window.URL.createObjectURL(e.stream);
remoteAudio.play();
}
});
//RECEBENDO UMA CHAMADA
if (session.direction === "incoming") {
incomingCallAudio.play();
isIncomingCall = true;
eventoSip.emit("incomingcall", session.remote_identity.uri.user);
eventoSip.on("rejected", () => {
if (session && session.isInProgress()) {
incomingCallAudio.pause();
eventoSip.emit("home");
session.terminate();
session = null;
} else {
eventoSip.emit("home");
}
});
eventoSip.on("accepted", () => {
if (session && session.isInProgress()) {
session.answer();
incomingCallAudio.pause();
}
});
}
//REALIZANDO UMA CHAMADA
if (session.direction === "outgoing") {
eventoSip.emit("outgoingcall", session.remote_identity.uri.user);
}
});
phone.on("registered", function (e) {
eventoSip.emit("statusChange", "registered");
});
phone.on("unregistered", function (e) {
eventoSip.emit("statusChange", "unregistered");
});
phone.on("registrationFailed", function (e) {
eventoSip.emit("statusChange", "registrationFailed");
});
phone.on("connected", function (e) {
eventoSip.emit("statusChange", "connected");
});
phone.on("disconnected", function (e) {
eventoSip.emit("statusChange", "disconnected");
});
phone.start();
}
}
function ativaDebug(value) {
value === true
? SimpleSIP.debug.enable("SimpleSIP:*")
: SimpleSIP.debug.disable("SimpleSIP:*");
}
return {
config: _Autenticacao,
start: function () {
if (
_Autenticacao.PROTOCOLO === undefined ||
_Autenticacao.SERVIDOR === undefined ||
_Autenticacao.RAMAL === undefined ||
_Autenticacao.SENHA === undefined
) {
console.error(
":::: Configuração do Usuário Inválida para Autenticação no PBX !"
);
} else {
ativaDebug(true);
iniciandoAutenticacaonoPBX();
}
},
realizaUmaChamada: (numero) => {
phone ? phone.call(numero) : eventoSip.emit("error");
},
ativaDebug: (value) => {
ativaDebug(value);
},
unregister: () => {
phone
? phone.unregister()
: console.warn("Sem ramal cadastrado para apagar");
},
estouRegistradonoPBX: () => {
console.log("estouRegistradonoPBX ::: " + phone.isRegistered());
},
simplesipEvento: eventoSip,
help: function () {
console.log("========================================================");
console.log("=== Unified Communications - Simples Ip - Versão 1.2 ===");
console.log("========================================================");
console.log("UASimplesIP.start() - Para iniciar o SDK");
},
};
})();