source: Dev/trunk/src/client/qed-client/xhr.js @ 532

Last change on this file since 532 was 522, checked in by hendrikvanantwerpen, 11 years ago
  • Add option to deploy source to Heroku (for debugging).
  • Rewrite xhr so requests are not serialized anymore.
  • Give more sane errors on request errors to Couch (like network errors and such).
File size: 2.4 KB
Line 
1define([
2    "./session",
3    "dojo/Deferred",
4    "dojo/_base/array",
5    "dojo/_base/lang",
6    "dojo/_base/xhr",
7    "dojo/on"
8], function(session, Deferred, array, lang, xhr, on) {
9
10
11    var queue = [];
12    var user;
13    var generation = 0;
14
15    on(session, 'change', setUser);
16    setUser(session.get());
17
18    function setUser(newUser) {
19        user = newUser;
20        generation += 1;
21        if ( user ) {
22            // we make a local copy, just in case the requests cause
23            // events to happen
24            var q = queue;
25            queue = [];
26            array.forEach(q,real_request);
27        } else {
28            session.restore();
29        }
30    }
31
32    function real_request(item) {
33        var req_generation = generation;
34        var req = xhr(item.method,lang.mixin(item.options||{},{
35            failOk: true
36        }));
37        item.promise.ioArgs = req.ioArgs;
38
39        console.log("Do request",item.options.url);
40        req.then(function(result) {
41            item.dfd.resolve(result);
42        }, function(error){
43            if ( error.response.status === 401 ) {
44                if ( user ) {
45                    if ( req_generation === generation ) {
46                        console.log("Retry after reauthentication",item.options.url);
47                        // we need to reauth
48                        queue.push(item);
49                        setUser(null);
50                    } else {
51                        console.log("Retry immediately",item.options.url);
52                        // we already did, redo request right away
53                        real_request(item);
54                    }
55                } else {
56                    console.log("Retry when authenticated",item.options.url);
57                    queue.push(item);
58                }
59            } else {
60                item.dfd.reject(error);
61            }
62        });
63    }
64   
65    var _xhr = function(method, options) {
66        var item = {
67            method: method,
68            options: options,
69            dfd: new Deferred()
70        };
71        item.promise = lang.delegate(item.dfd.promise);
72        // only do the request directly if we are authenticated
73        if ( user ) {
74            console.log("Immediate",options.url);
75            real_request(item);
76        } else {
77            console.log("Delay until authenticated",options.url);
78            queue.push(item);
79        }
80        return item.promise;
81    };
82
83    return _xhr;
84});
Note: See TracBrowser for help on using the repository browser.