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

Last change on this file since 522 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
RevLine 
[463]1define([
[468]2    "./session",
[463]3    "dojo/Deferred",
[522]4    "dojo/_base/array",
[487]5    "dojo/_base/lang",
[522]6    "dojo/_base/xhr",
7    "dojo/on"
8], function(session, Deferred, array, lang, xhr, on) {
[463]9
[522]10
[463]11    var queue = [];
[522]12    var user;
13    var generation = 0;
14
15    on(session, 'change', setUser);
16    setUser(session.get());
17
18    function setUser(newUser) {
[468]19        user = newUser;
[522]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();
[468]29        }
30    }
[522]31
[468]32    function real_request(item) {
[522]33        var req_generation = generation;
[487]34        var req = xhr(item.method,lang.mixin(item.options||{},{
35            failOk: true
36        }));
37        item.promise.ioArgs = req.ioArgs;
[468]38
[522]39        console.log("Do request",item.options.url);
40        req.then(function(result) {
[487]41            item.dfd.resolve(result);
42        }, function(error){
[468]43            if ( error.response.status === 401 ) {
[522]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                }
[468]59            } else {
[487]60                item.dfd.reject(error);
[468]61            }
62        });
63    }
64   
[522]65    var _xhr = function(method, options) {
[468]66        var item = {
[487]67            method: method,
[468]68            options: options,
69            dfd: new Deferred()
70        };
[487]71        item.promise = lang.delegate(item.dfd.promise);
[522]72        // only do the request directly if we are authenticated
73        if ( user ) {
74            console.log("Immediate",options.url);
[468]75            real_request(item);
[463]76        } else {
[522]77            console.log("Delay until authenticated",options.url);
[468]78            queue.push(item);
[463]79        }
[487]80        return item.promise;
[463]81    };
[468]82
[522]83    return _xhr;
[463]84});
Note: See TracBrowser for help on using the repository browser.