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 | } |