[463] | 1 | define([ |
---|
[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 | }); |
---|