summaryrefslogtreecommitdiff
path: root/js/codeq/comms.js
blob: d2c291014a97c3a866c347e3e348a843af375d83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
(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
            }));
        }
    };
})();