blob: e678d6db3d83d51c2183aff31cda91480aa138a6 [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.cometd.RestChannels"]){
dojo._hasResource["dojox.cometd.RestChannels"]=true;
dojo.provide("dojox.cometd.RestChannels");
dojo.require("dojox.rpc.Client");
dojo.requireIf(dojox.data&&!!dojox.data.JsonRestStore,"dojox.data.restListener");
(function(){
dojo.declare("dojox.cometd.RestChannels",null,{constructor:function(_1){
dojo.mixin(this,_1);
if(dojox.rpc.Rest&&this.autoSubscribeRoot){
var _2=dojox.rpc.Rest._get;
var _3=this;
dojox.rpc.Rest._get=function(_4,id){
var _6=dojo.xhrGet;
dojo.xhrGet=function(r){
var _8=_3.autoSubscribeRoot;
return (_8&&r.url.substring(0,_8.length)==_8)?_3.get(r.url,r):_6(r);
};
var _9=_2.apply(this,arguments);
dojo.xhrGet=_6;
return _9;
};
}
if(dojox.data&&dojox.data.restListener){
this.receive=dojox.data.restListener;
}
},absoluteUrl:function(_a,_b){
return new dojo._Url(_a,_b)+"";
},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(){
this.started=true;
if(!this.connected){
this.connectionId=dojox.rpc.Client.clientId;
var _c=this.createdClientId?"Client-Id":"Create-Client-Id";
this.createdClientId=true;
var _d={Accept:this.acceptType};
_d[_c]=this.connectionId;
var _e=dojo.xhrPost({headers:_d,url:this.url,noStatus:true});
var _f=this;
this.lastIndex=0;
var _10,_11=function(_12){
if(typeof dojo=="undefined"){
return null;
}
if(xhr&&xhr.status>400){
return _10(true);
}
if(typeof _12=="string"){
_12=_12.substring(_f.lastIndex);
}
var _14=xhr&&(xhr.contentType||xhr.getResponseHeader("Content-Type"))||(typeof _12!="string"&&"already json");
var _15=_f.onprogress(xhr,_12,_14);
if(_15){
if(_10()){
return new Error(_15);
}
}
if(!xhr||xhr.readyState==4){
xhr=null;
if(_f.connected){
_f.connected=false;
_f.open();
}
}
return _12;
};
_10=function(_16){
if(xhr&&xhr.status==409){
_f.disconnected();
return null;
}
_f.createdClientId=false;
_f.disconnected();
return _16;
};
_e.addCallbacks(_11,_10);
var xhr=_e.ioArgs.xhr;
if(xhr){
xhr.onreadystatechange=function(){
var _17;
try{
if(xhr.readyState==3){
_f.readyState=3;
_17=xhr.responseText;
}
}
catch(e){
}
if(typeof _17=="string"){
_11(_17);
}
};
}
if(window.attachEvent){
attachEvent("onunload",function(){
_f.connected=false;
if(xhr){
xhr.abort();
}
});
}
this.connected=true;
}
},_send:function(_18,_19,_1a){
if(this.sendAsJson){
_19.postBody=dojo.toJson({target:_19.url,method:_18,content:_1a,params:_19.content,subscribe:_19.headers["Subscribe"]});
_19.url=this.url;
_18="POST";
}else{
_19.postData=dojo.toJson(_1a);
}
return dojo.xhr(_18,_19,_19.postBody);
},subscribe:function(_1b,_1c){
_1c=_1c||{};
_1c.url=this.absoluteUrl(this.url,_1b);
if(_1c.headers){
delete _1c.headers.Range;
}
var _1d=this.subscriptions[_1b];
var _1e=_1c.method||"HEAD";
var _1f=_1c.since;
var _20=_1c.callback;
var _21=_1c.headers||(_1c.headers={});
this.subscriptions[_1b]=_1f||_1d||0;
var _22=this.subCallbacks[_1b];
if(_20){
this.subCallbacks[_1b]=_22?function(m){
_22(m);
_20(m);
}:_20;
}
if(!this.connected){
this.open();
}
if(_1d===undefined||_1d!=_1f){
_21["Cache-Control"]="max-age=0";
_1f=typeof _1f=="number"?new Date(_1f).toUTCString():_1f;
if(_1f){
_21["Subscribe-Since"]=_1f;
}
_21["Subscribe"]=_1c.unsubscribe?"none":"*";
var dfd=this._send(_1e,_1c);
var _25=this;
dfd.addBoth(function(_26){
var xhr=dfd.ioArgs.xhr;
if(!(_26 instanceof Error)){
if(_1c.confirmation){
_1c.confirmation();
}
}
if(xhr&&xhr.getResponseHeader("Subscribed")=="OK"){
var _28=xhr.getResponseHeader("Last-Modified");
if(xhr.responseText){
_25.subscriptions[_1b]=_28||new Date().toUTCString();
}else{
return null;
}
}else{
if(xhr&&!(_26 instanceof Error)){
delete _25.subscriptions[_1b];
}
}
if(!(_26 instanceof Error)){
var _29={responseText:xhr&&xhr.responseText,channel:_1b,getResponseHeader:function(_2a){
return xhr.getResponseHeader(_2a);
},getAllResponseHeaders:function(){
return xhr.getAllResponseHeaders();
},result:_26};
if(_25.subCallbacks[_1b]){
_25.subCallbacks[_1b](_29);
}
}else{
if(_25.subCallbacks[_1b]){
_25.subCallbacks[_1b](xhr);
}
}
return _26;
});
return dfd;
}
return null;
},publish:function(_2b,_2c){
return this._send("POST",{url:_2b,contentType:"application/json"},_2c);
},_processMessage:function(_2d){
_2d.event=_2d.event||_2d.getResponseHeader("Event");
if(_2d.event=="connection-conflict"){
return "conflict";
}
try{
_2d.result=_2d.result||dojo.fromJson(_2d.responseText);
}
catch(e){
}
var _2e=this;
var loc=_2d.channel=new dojo._Url(this.url,_2d.source||_2d.getResponseHeader("Content-Location"))+"";
if(loc in this.subscriptions&&_2d.getResponseHeader){
this.subscriptions[loc]=_2d.getResponseHeader("Last-Modified");
}
if(this.subCallbacks[loc]){
setTimeout(function(){
_2e.subCallbacks[loc](_2d);
},0);
}
this.receive(_2d);
return null;
},onprogress:function(xhr,_31,_32){
if(!_32||_32.match(/application\/rest\+json/)){
var _33=_31.length;
_31=_31.replace(/^\s*[,\[]?/,"[").replace(/[,\]]?\s*$/,"]");
try{
var _34=dojo.fromJson(_31);
this.lastIndex+=_33;
}
catch(e){
}
}else{
if(dojox.io&&dojox.io.httpParse&&_32.match(/application\/http/)){
var _35="";
if(xhr&&xhr.getAllResponseHeaders){
_35=xhr.getAllResponseHeaders();
}
_34=dojox.io.httpParse(_31,_35,xhr.readyState!=4);
}else{
if(typeof _31=="object"){
_34=_31;
}
}
}
if(_34){
for(var i=0;i<_34.length;i++){
if(this._processMessage(_34[i])){
return "conflict";
}
}
return null;
}
if(!xhr){
return "error";
}
if(xhr.readyState!=4){
return null;
}
if(xhr.__proto__){
xhr={channel:"channel",__proto__:xhr};
}
return this._processMessage(xhr);
},get:function(_37,_38){
(_38=_38||{}).method="GET";
return this.subscribe(_37,_38);
},receive:function(_39){
},disconnected:function(){
var _3a=this;
if(this.connected){
this.connected=false;
if(this.started){
setTimeout(function(){
var _3b=_3a.subscriptions;
_3a.subscriptions={};
for(var i in _3b){
if(_3a.reloadDataOnReconnect&&dojox.rpc.JsonRest){
delete dojox.rpc.Rest._index[i];
dojox.rpc.JsonRest.fetch(i);
}else{
_3a.subscribe(i,{since:_3b[i]});
}
}
_3a.open();
},this.autoReconnectTime);
}
}
},unsubscribe:function(_3d,_3e){
_3e=_3e||{};
_3e.unsubscribe=true;
this.subscribe(_3d,_3e);
},disconnect:function(){
this.started=false;
this.xhr.abort();
}});
var _3f=dojox.cometd.RestChannels.defaultInstance=new dojox.cometd.RestChannels();
if(dojox.cometd.connectionTypes){
_3f.startup=function(_40){
_3f.open();
this._cometd._deliver({channel:"/meta/connect",successful:true});
};
_3f.check=function(_41,_42,_43){
for(var i=0;i<_41.length;i++){
if(_41[i]=="rest-channels"){
return !_43;
}
}
return false;
};
_3f.deliver=function(_45){
};
dojo.connect(this,"receive",null,function(_46){
_46.data=_46.result;
this._cometd._deliver(_46);
});
_3f.sendMessages=function(_47){
for(var i=0;i<_47.length;i++){
var _49=_47[i];
var _4a=_49.channel;
var _4b=this._cometd;
var _4c={confirmation:function(){
_4b._deliver({channel:_4a,successful:true});
}};
if(_4a=="/meta/subscribe"){
this.subscribe(_49.subscription,_4c);
}else{
if(_4a=="/meta/unsubscribe"){
this.unsubscribe(_49.subscription,_4c);
}else{
if(_4a=="/meta/connect"){
_4c.confirmation();
}else{
if(_4a=="/meta/disconnect"){
_3f.disconnect();
_4c.confirmation();
}else{
if(_4a.substring(0,6)!="/meta/"){
this.publish(_4a,_49.data);
}
}
}
}
}
}
};
dojox.cometd.connectionTypes.register("rest-channels",_3f.check,_3f,false,true);
}
})();
}