// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-nocheck
import {callStateManager} from "../../callStateManager.ts";
import {EventData} from "../../types.ts";
export enum MessagingType {
ON_AMEYO_CALL_INCOMING = 'onAmeyoCallIncoming',
ON_AMEYO_CALL_ACCEPTED = 'onAmeyoCallAccepted',
ON_AMEYO_CALL_DISCONNECTED = 'onAmeyoCallDisconnected',
ON_AMEYO_AGENT_ON_BREAK = 'onAmeyoAgentOnBreak',
ON_AMEYO_FORCED_LOGOUT = 'onAmeyoForcedLogout',
ON_AMEYO_CALL_TRANSFER = 'onAmeyoCallTransfer',
ON_AMEYO_AVAILABILITY_CHANGE = 'onAmeyoAvailabilityChange',
ON_SIP_RINGING = "onSipRinging",
ON_CRM_NOTIFY_PUSH = 'onCrmNotifyPush'
}
let pushConnectionIndex = 0;
const pushHistory = [];
let sizeOfHistory = 5;
let isConnectionEstablished = false;
let shouldStopConnection = false;
let isAttempting = false;
let connStart;
let connEnd;
let conAttemptFailed = 0;
let reConnectionCount = 0;
let baseUrl;
let sessionId;
let pushConnectionHealthTimer = null;
let lastPushReceivedTime = '';
const monitorPushTime = 60 * 1000;
//call the above function to create the XMLHttpRequest object
let http = createRequestObject();
function createRequestObject() {
let tmpXmlHttpObject;
// depending on what the browser supports, use the right way to create the
// XMLHttpRequest object
if (window.XMLHttpRequest) {
// Mozilla, Safari would use this method ...
tmpXmlHttpObject = new XMLHttpRequest();
} else if (window.ActiveXObject) {
// IE would use this method ...
tmpXmlHttpObject = new ActiveXObject('Microsoft.XMLHTTP');
}
return tmpXmlHttpObject;
}
//This is called after login to start attempting push connection through post request
export function establishPushConnection(url, session) {
baseUrl = url;
sessionId = session;
makePostRequest(baseUrl, sessionId);
}
//This should be after logout to stop re-establishing push connection
function stopPushConnection() {
shouldStopConnection = true;
if (http) {
http.abort();
}
}
function reset() {
pushConnectionIndex = 0;
sizeOfHistory = 5;
isConnectionEstablished = false;
shouldStopConnection = false;
isAttempting = false;
conAttemptFailed = 0;
reConnectionCount = 0;
}
function processResponse() {
// check if the response has been received from the server
if (http.readyState == 3 || http.readyState == 4) {
reConnectionCount = 0;
if (http.status == 200) {
changeConnectionEstablishState(true);
}
// read and assign the response from the server
const pushResponse = http.responseText.substring(pushConnectionIndex, http.responseText.length);
pushConnectionIndex = http.responseText.length;
// process push received one at a time
processPush(pushResponse);
// in this case simply assign the response to the contents of the
// on the page.
// document.getElementById('description').innerHTML = http.responseText;
const currentTime = new Date();
lastPushReceivedTime = currentTime.getTime();
}
// Note :This sample does not consider content boundary in the multipart
// response
}
function extractAndProcessEvents(rawResponse: any) {
const parts = rawResponse
.replaceAll(`Content-type: application/json ; charset: utf-8\r\n\r\n`, '')
.split("--DON'T_PANIC!_more_will_follow\r\n")
.map((part: string) => {
try {
return JSON.parse(part.trim());
} catch {
return null;
}
})
.filter(Boolean);
parts.forEach((event : EventData) => {
try {
callStateManager.handleEvent(event);
} catch (error) {
console.error('Error processing event:', event, error);
}
});
}
function processPush(pushResponse) {
extractAndProcessEvents(pushResponse);
}
function makePostRequest(url, session) {
if (shouldStopConnection == true) {
console.log('should stop connection');
return;
}
reConnectionCount++;
if (reConnectionCount > 10) {
console.log('reconnection count reached not reconnecting');
return;
}
if (isConnectionEstablished) {
console.log('connection is already established , so not establishing a connection');
return;
}
if (conAttemptFailed > 5) {
console.log('continous attempt failed limit reached');
console.error('Unable to connect to the server. Please login after some time.');
return;
}
if (isAttempting) {
return;
} else {
isAttempting = true;
}
connStart = new Date();
http = createRequestObject();
const listenerName = `webcore_${Date.now()}`; //window.listenerName ;
window.listenerName = listenerName;
let lastProcessedSeq = -1; //window.lastProcessedPush;
let finalUrl = url;
const tempSession = session;
if (typeof lastProcessedSeq == 'undefined' || lastProcessedSeq == null) {
lastProcessedSeq = -1;
}
if (typeof pushConnectionHealthTimer != 'undefined' && pushConnectionHealthTimer != null) {
clearInterval(pushConnectionHealthTimer);
pushConnectionHealthTimer = null;
}
finalUrl = finalUrl + '&listener-name=' + listenerName + '&lastProcessedPush=' + lastProcessedSeq;
console.log(
'going to create push connection with seq:- ' +
lastProcessedSeq +
' listener name:- ' +
listenerName
);
console.log('final url ', finalUrl);
// make a connection to the server ... specifying that you intend to make a
// GET request
// to the server. Specifiy the page name and the URL parameters to send
http.open('POST', finalUrl, true);
http.setRequestHeader('sessionId', tempSession);
pushConnectionIndex = 0;
// assign a handler for the response Origin null is not allowed by
// Access-Control-Allow-Origin.
http.onreadystatechange = processResponse;
http.addEventListener('loadend', function checkPushEventHealth(e) {
connEnd = new Date();
const seconds = (connEnd.getTime() - connStart.getTime()) / 1000;
if (seconds < 5) {
conAttemptFailed++;
} else {
conAttemptFailed = 0;
}
isAttempting = false;
changeConnectionEstablishState(false);
makePostRequest(baseUrl, sessionId);
});
http.addEventListener('loadstart', function createCheckPushHealthTimer() {
if (typeof pushConnectionHealthTimer == 'undefined' || pushConnectionHealthTimer == null) {
pushConnectionHealthTimer = window.setInterval(
function () {
checkAjaxPushConnectionHealth();
},
3 * 1000 // 3 seconds
);
}
});
// actually send the request to the server
http.send();
}
function checkAjaxPushConnectionHealth() {
if (typeof http == 'undefined' || http == null) {
return;
}
const time = new Date();
const timeDiff = time.getTime() - lastPushReceivedTime;
if (timeDiff >= monitorPushTime) {
resetConn();
}
}
function resetConn() {
console.log('going to reset connection');
if (http) {
http.abort();
}
}
function makeConnectionEstablishHistory(isEstablished) {
const connectionRecord = new Object();
connectionRecord.state = isEstablished;
connectionRecord.dateAdded = new Date();
console.log(
'push connection state changed to ' +
connectionRecord.state +
' at ' +
connectionRecord.dateAdded
);
addRecordInHistory(connectionRecord);
}
function addRecordInHistory(record) {
if (pushHistory != null && record != null) {
if (pushHistory.length > sizeOfHistory) {
pushHistory.pop(0);
}
pushHistory.push(record);
}
}
function getPushConnectionHistory() {
let pushConnectionString = '';
if (pushHistory != null) {
for (index = 0; index < pushHistory.length; index++) {
const connectionRecord = pushHistory[index];
pushConnectionString =
pushConnectionString +
'push connection state changed to ' +
connectionRecord.state +
' at ' +
connectionRecord.dateAdded +
' \n ';
}
}
return pushConnectionString;
}
/**
* change state of the connection establish. ignore if same state event came.
*
* @param isEstablished
*/
function changeConnectionEstablishState(isEstablished) {
try {
if (isConnectionEstablished == isEstablished) {
} else {
isConnectionEstablished = isEstablished;
makeConnectionEstablishHistory(isEstablished);
}
} catch (err) {
console.log('unable to log connection establish history');
}
}