116 lines
3.5 KiB
JavaScript
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); |