define([ "./session", "dojo/Deferred", "dojo/on", "dojo/request" ], function(session, Deferred, on, request) { var user = session.get(); var queue = []; on(session, 'change', function(newUser) { user = newUser; if ( user ) { retry(); } }); function retry() { if (queue.length > 0) { var item = queue.shift(); console.log("Retry",item.url); real_request(item); } } function real_request(item) { var req = request(item.url,item.options); // forward successfull response req.then(function(body){ item.dfd.resolve(body); }); // handle unauthenticated and queued requests req.response.then(function(response){ retry(); }, function(error) { if ( error.response.status === 401 ) { queue.unshift(item); session.restore(); } else { item.dfd.reject(error); // this should be error body // not, the request? retry(); } }); } var _request = function(url, options) { var item = { url: url, options: options, dfd: new Deferred() }; // only do the request directly if we are authenticated and // there are no earlier requests queued. if ( user && queue.length === 0 ) { console.log("Request",url); real_request(item); } else { console.log("Push",url); queue.push(item); } return item.dfd.promise; }; return _request; });