(function () { var activityQueue = []; var send = function (service, json) { return Q.Promise(function (resolve, reject, notify) { $.ajax({ 'type': 'POST', 'url': codeq.urlPrefix + service, 'accepts': 'application/json', 'contentType': 'application/json; charset=UTF-8', // type of our request 'data': json, 'processData': false, // don't process outgoing data 'dataType': 'json', // expected type of the response 'timeout': 60000, // one minute 'error': function sendErrorHandler(jqXHR, textStatus, errorThrown) { reject(new Error(errorThrown || textStatus)); }, 'success': function sendSuccessHandler(data, textStatus, jqXHR) { resolve(data); } }); }); }; var sendCount = 0, sendActivityInternal = function () { var request; // send max. 100 activities, do not be excessive if (activityQueue.length > 100) { sendCount = 100; request = '[' + activityQueue.slice(0, 100).join(',') + ']'; } else { sendCount = activityQueue.length; request = '[' + activityQueue.join(',') + ']'; } send('activity', request).then( function sendActivitySuccess() { activityQueue.splice(0, sendCount); if (activityQueue.length > 0) sendActivityInternal(); }, function sendActivityFailure() { Q.delay(500).then(sendActivityInternal).done(); } ).done(); }; codeq.comms = { sendActivity: function commsSendActivity (json) { var triggerSending = activityQueue.length == 0; json['sid'] = codeq.sid; activityQueue.push(codeq.jsonize(json)); if (triggerSending) { setTimeout(sendActivityInternal, 0); // async trigger: see if you can collect some more payload } }, sendQuery: function commsSendQuery (json) { json['sid'] = codeq.sid; return send('query', codeq.jsonize(json)); }, getProblem: function commsGetProblem (language, problem_group, problem) { return send('get_problem', codeq.jsonize({ 'sid': codeq.sid, 'language': language, 'problem_group': problem_group, 'problem': problem })); } }; })();