jam-cloud/app/assets/javascripts/sessionLatency.js

116 lines
3.5 KiB
JavaScript

(function(context) {
context.JK = context.JK || {};
context.JK.SessionLatency = function(jamClient) {
var logger = context.JK.logger;
var sessionPingsOut = {};
var clientsToSessions = {};
var sessionLatency = {};
var subscribers = [];
function getSortScore(sessionId) {
return sessionLatency[sessionId].sortScore;
}
function ensureSessionLatencyEntry(sessionId) {
if (!(sessionId in sessionLatency)) {
sessionLatency[sessionId] = {
clientLatencies: {},
averageLatency: 0
};
}
}
function setInitialSortScore(session) {
var i,
p,
score = 0,
participant = null;
if ("invitations" in session) {
score += 2;
}
for (i=0, p=session.participants.length; i<p; i++) {
participant = session.participants[i];
if ("user_id" in participant) {
score += 1;
break;
}
}
ensureSessionLatencyEntry(session.id);
sessionLatency[session.id].sortScore = score;
}
function sessionPings(session) {
setInitialSortScore(session);
$.each(session.participants, function(index, participant) {
var client = { id: participant.client_id };
clientsToSessions[client.id] = session.id;
if (!(session.id in sessionPingsOut)) {
sessionPingsOut[session.id] = 0;
}
sessionPingsOut[session.id]++;
jamClient.TestLatency(client, clientPingResponse);
});
}
function clientPingResponse(response) {
var sessionId = clientsToSessions[response.id];
sessionPingsOut[sessionId]--;
updateSessionLatency(sessionId, response);
$.each(subscribers, function() {
this(sessionId);
});
}
function updateSessionLatency(sessionId, latencyResponse) {
ensureSessionLatencyEntry(sessionId);
var sl = sessionLatency[sessionId];
sl.clientLatencies[latencyResponse.id] = latencyResponse.latency;
sl.averageLatency = latencyAverage(sl.clientLatencies);
sl.sortScore = updateSortScore(sessionId, sl.averageLatency);
}
function updateSortScore(sessionId, averageLatency) {
var newScore = sessionLatency[sessionId].sortScore;
if (!(newScore)) {
newScore = 0;
}
if (!averageLatency) {
return newScore;
}
var base = Math.floor(newScore);
newScore = base + (1/averageLatency);
return newScore;
}
function latencyAverage(clientLatencies) {
var total = 0;
var count = 0;
$.each(clientLatencies, function(index, latency) {
total += latency;
count++;
});
return total/count;
}
function sessionInfo(sessionId) {
return sessionLatency[sessionId];
}
function subscribe(cb) {
subscribers.push(cb);
}
this.sessionPings = sessionPings;
this.sessionInfo = sessionInfo;
this.getSortScore = getSortScore;
this.subscribe = subscribe;
return this;
};
})(window);