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