root / trunk / web / dojo / dojox / cometd / RestChannels.js @ 10
History | View | Annotate | Download (7.41 KB)
1 | 9 | andrej.cim | /*
|
---|---|---|---|
2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
4 | see: http://dojotoolkit.org/license for details
|
||
5 | */
|
||
6 | |||
7 | |||
8 | if(!dojo._hasResource["dojox.cometd.RestChannels"]){ |
||
9 | dojo._hasResource["dojox.cometd.RestChannels"]=true; |
||
10 | dojo.provide("dojox.cometd.RestChannels");
|
||
11 | dojo.require("dojox.rpc.Client");
|
||
12 | dojo.requireIf(dojox.data&&!!dojox.data.JsonRestStore,"dojox.data.restListener");
|
||
13 | (function(){
|
||
14 | dojo.declare("dojox.cometd.RestChannels",null,{constructor:function(_1){ |
||
15 | dojo.mixin(this,_1);
|
||
16 | if(dojox.rpc.Rest&&this.autoSubscribeRoot){ |
||
17 | var _2=dojox.rpc.Rest._get;
|
||
18 | var _3=this; |
||
19 | dojox.rpc.Rest._get=function(_4,id){ |
||
20 | var _5=dojo.xhrGet;
|
||
21 | dojo.xhrGet=function(r){ |
||
22 | var _6=_3.autoSubscribeRoot;
|
||
23 | return (_6&&r.url.substring(0,_6.length)==_6)?_3.get(r.url,r):_5(r); |
||
24 | }; |
||
25 | var _7=_2.apply(this,arguments); |
||
26 | dojo.xhrGet=_5; |
||
27 | return _7;
|
||
28 | }; |
||
29 | } |
||
30 | },absoluteUrl:function(_8,_9){ |
||
31 | return new dojo._Url(_8,_9)+""; |
||
32 | },acceptType:"application/rest+json,application/http;q=0.9,*/*;q=0.7",subscriptions:{},subCallbacks:{},autoReconnectTime:3000,reloadDataOnReconnect:true,sendAsJson:false,url:"/channels",autoSubscribeRoot:"/",open:function(){ |
||
33 | this.started=true; |
||
34 | if(!this.connected){ |
||
35 | this.connectionId=dojox.rpc.Client.clientId;
|
||
36 | var _a=this.createdClientId?"Client-Id":"Create-Client-Id"; |
||
37 | this.createdClientId=true; |
||
38 | var _b={Accept:this.acceptType}; |
||
39 | _b[_a]=this.connectionId;
|
||
40 | var _c=dojo.xhrPost({headers:_b,url:this.url,noStatus:true}); |
||
41 | var _d=this; |
||
42 | this.lastIndex=0; |
||
43 | var _e,_f=function(_10){ |
||
44 | if(typeof dojo=="undefined"){ |
||
45 | return null; |
||
46 | } |
||
47 | if(xhr&&xhr.status>400){ |
||
48 | return _e(true); |
||
49 | } |
||
50 | if(typeof _10=="string"){ |
||
51 | _10=_10.substring(_d.lastIndex); |
||
52 | } |
||
53 | var _11=xhr&&(xhr.contentType||xhr.getResponseHeader("Content-Type"))||(typeof _10!="string"&&"already json"); |
||
54 | var _12=_d.onprogress(xhr,_10,_11);
|
||
55 | if(_12){
|
||
56 | if(_e()){
|
||
57 | return new Error(_12); |
||
58 | } |
||
59 | } |
||
60 | if(!xhr||xhr.readyState==4){ |
||
61 | xhr=null;
|
||
62 | if(_d.connected){
|
||
63 | _d.connected=false;
|
||
64 | _d.open(); |
||
65 | } |
||
66 | } |
||
67 | return _10;
|
||
68 | }; |
||
69 | _e=function(_13){ |
||
70 | if(xhr&&xhr.status==409){ |
||
71 | _d.disconnected(); |
||
72 | return null; |
||
73 | } |
||
74 | _d.createdClientId=false;
|
||
75 | _d.disconnected(); |
||
76 | return _13;
|
||
77 | }; |
||
78 | _c.addCallbacks(_f,_e); |
||
79 | var xhr=_c.ioArgs.xhr;
|
||
80 | if(xhr){
|
||
81 | xhr.onreadystatechange=function(){ |
||
82 | var _14;
|
||
83 | try{
|
||
84 | if(xhr.readyState==3){ |
||
85 | _d.readyState=3;
|
||
86 | _14=xhr.responseText; |
||
87 | } |
||
88 | } |
||
89 | catch(e){
|
||
90 | } |
||
91 | if(typeof _14=="string"){ |
||
92 | _f(_14); |
||
93 | } |
||
94 | }; |
||
95 | } |
||
96 | if(window.attachEvent){
|
||
97 | window.attachEvent("onunload",function(){ |
||
98 | _d.connected=false;
|
||
99 | if(xhr){
|
||
100 | xhr.abort(); |
||
101 | } |
||
102 | }); |
||
103 | } |
||
104 | this.connected=true; |
||
105 | } |
||
106 | },_send:function(_15,_16,_17){ |
||
107 | if(this.sendAsJson){ |
||
108 | _16.postData=dojo.toJson({target:_16.url,method:_15,content:_17,params:_16.content,subscribe:_16.headers["Subscribe"]}); |
||
109 | _16.url=this.url;
|
||
110 | _15="POST";
|
||
111 | }else{
|
||
112 | _16.postData=dojo.toJson(_17); |
||
113 | } |
||
114 | return dojo.xhr(_15,_16,_16.postData);
|
||
115 | },subscribe:function(_18,_19){ |
||
116 | _19=_19||{}; |
||
117 | _19.url=this.absoluteUrl(this.url,_18); |
||
118 | if(_19.headers){
|
||
119 | delete _19.headers.Range;
|
||
120 | } |
||
121 | var _1a=this.subscriptions[_18]; |
||
122 | var _1b=_19.method||"HEAD"; |
||
123 | var _1c=_19.since;
|
||
124 | var _1d=_19.callback;
|
||
125 | var _1e=_19.headers||(_19.headers={});
|
||
126 | this.subscriptions[_18]=_1c||_1a||0; |
||
127 | var _1f=this.subCallbacks[_18]; |
||
128 | if(_1d){
|
||
129 | this.subCallbacks[_18]=_1f?function(m){ |
||
130 | _1f(m); |
||
131 | _1d(m); |
||
132 | }:_1d; |
||
133 | } |
||
134 | if(!this.connected){ |
||
135 | this.open();
|
||
136 | } |
||
137 | if(_1a===undefined||_1a!=_1c){ |
||
138 | _1e["Cache-Control"]="max-age=0"; |
||
139 | _1c=typeof _1c=="number"?new Date(_1c).toUTCString():_1c; |
||
140 | if(_1c){
|
||
141 | _1e["Subscribe-Since"]=_1c;
|
||
142 | } |
||
143 | _1e["Subscribe"]=_19.unsubscribe?"none":"*"; |
||
144 | var dfd=this._send(_1b,_19); |
||
145 | var _20=this; |
||
146 | dfd.addBoth(function(_21){
|
||
147 | var xhr=dfd.ioArgs.xhr;
|
||
148 | if(!(_21 instanceof Error)){ |
||
149 | if(_19.confirmation){
|
||
150 | _19.confirmation(); |
||
151 | } |
||
152 | } |
||
153 | if(xhr&&xhr.getResponseHeader("Subscribed")=="OK"){ |
||
154 | var _22=xhr.getResponseHeader("Last-Modified"); |
||
155 | if(xhr.responseText){
|
||
156 | _20.subscriptions[_18]=_22||new Date().toUTCString();
|
||
157 | }else{
|
||
158 | return null; |
||
159 | } |
||
160 | }else{
|
||
161 | if(xhr&&!(_21 instanceof Error)){ |
||
162 | delete _20.subscriptions[_18];
|
||
163 | } |
||
164 | } |
||
165 | if(!(_21 instanceof Error)){ |
||
166 | var _23={responseText:xhr&&xhr.responseText,channel:_18,getResponseHeader:function(_24){ |
||
167 | return xhr.getResponseHeader(_24);
|
||
168 | },getAllResponseHeaders:function(){ |
||
169 | return xhr.getAllResponseHeaders();
|
||
170 | },result:_21};
|
||
171 | if(_20.subCallbacks[_18]){
|
||
172 | _20.subCallbacks[_18](_23); |
||
173 | } |
||
174 | }else{
|
||
175 | if(_20.subCallbacks[_18]){
|
||
176 | _20.subCallbacks[_18](xhr); |
||
177 | } |
||
178 | } |
||
179 | return _21;
|
||
180 | }); |
||
181 | return dfd;
|
||
182 | } |
||
183 | return null; |
||
184 | },publish:function(_25,_26){ |
||
185 | return this._send("POST",{url:_25,contentType:"application/json"},_26); |
||
186 | },_processMessage:function(_27){ |
||
187 | _27.event=_27.event||_27.getResponseHeader("Event");
|
||
188 | if(_27.event=="connection-conflict"){ |
||
189 | return "conflict"; |
||
190 | } |
||
191 | try{
|
||
192 | _27.result=_27.result||dojo.fromJson(_27.responseText); |
||
193 | } |
||
194 | catch(e){
|
||
195 | } |
||
196 | var _28=this; |
||
197 | var loc=_27.channel=new dojo._Url(this.url,_27.source||_27.getResponseHeader("Content-Location"))+""; |
||
198 | if(loc in this.subscriptions&&_27.getResponseHeader){ |
||
199 | this.subscriptions[loc]=_27.getResponseHeader("Last-Modified"); |
||
200 | } |
||
201 | if(this.subCallbacks[loc]){ |
||
202 | setTimeout(function(){
|
||
203 | _28.subCallbacks[loc](_27); |
||
204 | },0);
|
||
205 | } |
||
206 | this.receive(_27);
|
||
207 | return null; |
||
208 | },onprogress:function(xhr,_29,_2a){ |
||
209 | if(!_2a||_2a.match(/application\/rest\+json/)){ |
||
210 | var _2b=_29.length;
|
||
211 | _29=_29.replace(/^\s*[,\[]?/,"[").replace(/[,\]]?\s*$/,"]"); |
||
212 | try{
|
||
213 | var _2c=dojo.fromJson(_29);
|
||
214 | this.lastIndex+=_2b;
|
||
215 | } |
||
216 | catch(e){
|
||
217 | } |
||
218 | }else{
|
||
219 | if(dojox.io&&dojox.io.httpParse&&_2a.match(/application\/http/)){ |
||
220 | var _2d=""; |
||
221 | if(xhr&&xhr.getAllResponseHeaders){
|
||
222 | _2d=xhr.getAllResponseHeaders(); |
||
223 | } |
||
224 | _2c=dojox.io.httpParse(_29,_2d,xhr.readyState!=4);
|
||
225 | }else{
|
||
226 | if(typeof _29=="object"){ |
||
227 | _2c=_29; |
||
228 | } |
||
229 | } |
||
230 | } |
||
231 | if(_2c){
|
||
232 | for(var i=0;i<_2c.length;i++){ |
||
233 | if(this._processMessage(_2c[i])){ |
||
234 | return "conflict"; |
||
235 | } |
||
236 | } |
||
237 | return null; |
||
238 | } |
||
239 | if(!xhr){
|
||
240 | return "error"; |
||
241 | } |
||
242 | if(xhr.readyState!=4){ |
||
243 | return null; |
||
244 | } |
||
245 | if(xhr.__proto__){
|
||
246 | xhr={channel:"channel",__proto__:xhr}; |
||
247 | } |
||
248 | return this._processMessage(xhr); |
||
249 | },get:function(_2e,_2f){ |
||
250 | (_2f=_2f||{}).method="GET";
|
||
251 | return this.subscribe(_2e,_2f); |
||
252 | },receive:function(_30){ |
||
253 | if(dojox.data&&dojox.data.restListener){
|
||
254 | dojox.data.restListener(_30); |
||
255 | } |
||
256 | },disconnected:function(){ |
||
257 | var _31=this; |
||
258 | if(this.connected){ |
||
259 | this.connected=false; |
||
260 | if(this.started){ |
||
261 | setTimeout(function(){
|
||
262 | var _32=_31.subscriptions;
|
||
263 | _31.subscriptions={}; |
||
264 | for(var i in _32){ |
||
265 | if(_31.reloadDataOnReconnect&&dojox.rpc.JsonRest){
|
||
266 | delete dojox.rpc.Rest._index[i];
|
||
267 | dojox.rpc.JsonRest.fetch(i); |
||
268 | }else{
|
||
269 | _31.subscribe(i,{since:_32[i]});
|
||
270 | } |
||
271 | } |
||
272 | _31.open(); |
||
273 | },this.autoReconnectTime);
|
||
274 | } |
||
275 | } |
||
276 | },unsubscribe:function(_33,_34){ |
||
277 | _34=_34||{}; |
||
278 | _34.unsubscribe=true;
|
||
279 | this.subscribe(_33,_34);
|
||
280 | },disconnect:function(){ |
||
281 | this.started=false; |
||
282 | this.xhr.abort();
|
||
283 | }}); |
||
284 | var _35=dojox.cometd.RestChannels.defaultInstance=new dojox.cometd.RestChannels(); |
||
285 | if(dojox.cometd.connectionTypes){
|
||
286 | _35.startup=function(_36){ |
||
287 | _35.open(); |
||
288 | this._cometd._deliver({channel:"/meta/connect",successful:true}); |
||
289 | }; |
||
290 | _35.check=function(_37,_38,_39){ |
||
291 | for(var i=0;i<_37.length;i++){ |
||
292 | if(_37[i]=="rest-channels"){ |
||
293 | return !_39;
|
||
294 | } |
||
295 | } |
||
296 | return false; |
||
297 | }; |
||
298 | _35.deliver=function(_3a){ |
||
299 | }; |
||
300 | dojo.connect(this,"receive",null,function(_3b){ |
||
301 | _3b.data=_3b.result; |
||
302 | this._cometd._deliver(_3b);
|
||
303 | }); |
||
304 | _35.sendMessages=function(_3c){ |
||
305 | for(var i=0;i<_3c.length;i++){ |
||
306 | var _3d=_3c[i];
|
||
307 | var _3e=_3d.channel;
|
||
308 | var _3f=this._cometd; |
||
309 | var _40={confirmation:function(){ |
||
310 | _3f._deliver({channel:_3e,successful:true}); |
||
311 | }}; |
||
312 | if(_3e=="/meta/subscribe"){ |
||
313 | this.subscribe(_3d.subscription,_40);
|
||
314 | }else{
|
||
315 | if(_3e=="/meta/unsubscribe"){ |
||
316 | this.unsubscribe(_3d.subscription,_40);
|
||
317 | }else{
|
||
318 | if(_3e=="/meta/connect"){ |
||
319 | _40.confirmation(); |
||
320 | }else{
|
||
321 | if(_3e=="/meta/disconnect"){ |
||
322 | _35.disconnect(); |
||
323 | _40.confirmation(); |
||
324 | }else{
|
||
325 | if(_3e.substring(0,6)!="/meta/"){ |
||
326 | this.publish(_3e,_3d.data);
|
||
327 | } |
||
328 | } |
||
329 | } |
||
330 | } |
||
331 | } |
||
332 | } |
||
333 | }; |
||
334 | dojox.cometd.connectionTypes.register("rest-channels",_35.check,_35,false,true); |
||
335 | } |
||
336 | })(); |
||
337 | } |