_base.js 8.7 KB

12345678
  1. /*
  2. Copyright (c) 2004-2009, 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. if(!dojo._hasResource["dojox.cometd._base"]){dojo._hasResource["dojox.cometd._base"]=true;dojo.provide("dojox.cometd._base");dojo.require("dojo.AdapterRegistry");dojox.cometd={Connection:function(_1){dojo.mixin(this,{prefix:_1,_status:"unconnected",_handshook:false,_initialized:false,_polling:false,expectedNetworkDelay:10000,connectTimeout:0,version:"1.0",minimumVersion:"0.9",clientId:null,messageId:0,batch:0,_isXD:false,handshakeReturn:null,currentTransport:null,url:null,lastMessage:null,_messageQ:[],handleAs:"json",_advice:{},_backoffInterval:0,_backoffIncrement:1000,_backoffMax:60000,_deferredSubscribes:{},_deferredUnsubscribes:{},_subscriptions:[],_extendInList:[],_extendOutList:[]});this.state=function(){return this._status;};this.init=function(_2,_3,_4){_3=_3||{};_3.version=this.version;_3.minimumVersion=this.minimumVersion;_3.channel="/meta/handshake";_3.id=""+this.messageId++;this.url=_2||dojo.config["cometdRoot"];if(!this.url){throw "no cometd root";return null;}var _5="^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";var _6=(""+window.location).match(new RegExp(_5));if(_6[4]){var _7=_6[4].split(":");var _8=_7[0];var _9=_7[1]||"80";_6=this.url.match(new RegExp(_5));if(_6[4]){_7=_6[4].split(":");var _a=_7[0];var _b=_7[1]||"80";this._isXD=((_a!=_8)||(_b!=_9));}}if(!this._isXD){_3.supportedConnectionTypes=dojo.map(dojox.cometd.connectionTypes.pairs,"return item[0]");}_3=this._extendOut(_3);var _c={url:this.url,handleAs:this.handleAs,content:{"message":dojo.toJson([_3])},load:dojo.hitch(this,function(_d){this._backon();this._finishInit(_d);}),error:dojo.hitch(this,function(e){this._backoff();this._finishInit(e);}),timeout:this.expectedNetworkDelay};if(_4){dojo.mixin(_c,_4);}this._props=_3;for(var _e in this._subscriptions){for(var _f in this._subscriptions[_e]){if(this._subscriptions[_e][_f].topic){dojo.unsubscribe(this._subscriptions[_e][_f].topic);}}}this._messageQ=[];this._subscriptions=[];this._initialized=true;this._status="handshaking";this.batch=0;this.startBatch();var r;if(this._isXD){_c.callbackParamName="jsonp";r=dojo.io.script.get(_c);}else{r=dojo.xhrPost(_c);}return r;};this.publish=function(_10,_11,_12){var _13={data:_11,channel:_10};if(_12){dojo.mixin(_13,_12);}this._sendMessage(_13);};this.subscribe=function(_14,_15,_16,_17){_17=_17||{};if(_15){var _18=_1+_14;var _19=this._subscriptions[_18];if(!_19||_19.length==0){_19=[];_17.channel="/meta/subscribe";_17.subscription=_14;this._sendMessage(_17);var _1a=this._deferredSubscribes;if(_1a[_14]){_1a[_14].cancel();delete _1a[_14];}_1a[_14]=new dojo.Deferred();}for(var i in _19){if(_19[i].objOrFunc===_15&&(!_19[i].funcName&&!_16||_19[i].funcName==_16)){return null;}}var _1b=dojo.subscribe(_18,_15,_16);_19.push({topic:_1b,objOrFunc:_15,funcName:_16});this._subscriptions[_18]=_19;}var ret=this._deferredSubscribes[_14]||{};ret.args=dojo._toArray(arguments);return ret;};this.unsubscribe=function(_1c,_1d,_1e,_1f){if((arguments.length==1)&&(!dojo.isString(_1c))&&(_1c.args)){return this.unsubscribe.apply(this,_1c.args);}var _20=_1+_1c;var _21=this._subscriptions[_20];if(!_21||_21.length==0){return null;}var s=0;for(var i in _21){var sb=_21[i];if((!_1d)||(sb.objOrFunc===_1d&&(!sb.funcName&&!_1e||sb.funcName==_1e))){dojo.unsubscribe(_21[i].topic);delete _21[i];}else{s++;}}if(s==0){_1f=_1f||{};_1f.channel="/meta/unsubscribe";_1f.subscription=_1c;delete this._subscriptions[_20];this._sendMessage(_1f);this._deferredUnsubscribes[_1c]=new dojo.Deferred();if(this._deferredSubscribes[_1c]){this._deferredSubscribes[_1c].cancel();delete this._deferredSubscribes[_1c];}}return this._deferredUnsubscribes[_1c];};this.disconnect=function(){for(var _22 in this._subscriptions){for(var sub in this._subscriptions[_22]){if(this._subscriptions[_22][sub].topic){dojo.unsubscribe(this._subscriptions[_22][sub].topic);}}}this._subscriptions=[];this._messageQ=[];if(this._initialized&&this.currentTransport){this._initialized=false;this.currentTransport.disconnect();}if(!this._polling){this._publishMeta("connect",false);}this._initialized=false;this._handshook=false;this._status="disconnected";this._publishMeta("disconnect",true);};this.subscribed=function(_23,_24){};this.unsubscribed=function(_25,_26){};this.tunnelInit=function(_27,_28){};this.tunnelCollapse=function(){};this._backoff=function(){if(!this._advice){this._advice={reconnect:"retry",interval:0};}else{if(!this._advice.interval){this._advice.interval=0;}}if(this._backoffInterval<this._backoffMax){this._backoffInterval+=this._backoffIncrement;}};this._backon=function(){this._backoffInterval=0;};this._interval=function(){var i=this._backoffInterval+(this._advice?(this._advice.interval?this._advice.interval:0):0);if(i>0){}return i;};this._publishMeta=function(_29,_2a,_2b){try{var _2c={cometd:this,action:_29,successful:_2a,state:this.state()};if(_2b){dojo.mixin(_2c,_2b);}dojo.publish(this.prefix+"/meta",[_2c]);}catch(e){}};this._finishInit=function(_2d){if(this._status!="handshaking"){return;}var _2e=this._handshook;var _2f=false;var _30={};if(_2d instanceof Error){dojo.mixin(_30,{reestablish:false,failure:true,error:_2d,advice:this._advice});}else{_2d=_2d[0];_2d=this._extendIn(_2d);this.handshakeReturn=_2d;if(_2d["advice"]){this._advice=_2d.advice;}_2f=_2d.successful?_2d.successful:false;if(_2d.version<this.minimumVersion){if(console.log){}_2f=false;this._advice.reconnect="none";}dojo.mixin(_30,{reestablish:_2f&&_2e,response:_2d});}this._publishMeta("handshake",_2f,_30);if(this._status!="handshaking"){return;}if(_2f){this._status="connecting";this._handshook=true;this.currentTransport=dojox.cometd.connectionTypes.match(_2d.supportedConnectionTypes,_2d.version,this._isXD);var _31=this.currentTransport;_31._cometd=this;_31.version=_2d.version;this.clientId=_2d.clientId;this.tunnelInit=_31.tunnelInit&&dojo.hitch(_31,"tunnelInit");this.tunnelCollapse=_31.tunnelCollapse&&dojo.hitch(_31,"tunnelCollapse");_31.startup(_2d);}else{if(!this._advice||this._advice["reconnect"]!="none"){setTimeout(dojo.hitch(this,"init",this.url,this._props),this._interval());}}};this._extendIn=function(_32){dojo.forEach(dojox.cometd._extendInList,function(f){_32=f(_32)||_32;});return _32;};this._extendOut=function(_33){dojo.forEach(dojox.cometd._extendOutList,function(f){_33=f(_33)||_33;});return _33;};this.deliver=function(_34){dojo.forEach(_34,this._deliver,this);return _34;};this._deliver=function(_35){_35=this._extendIn(_35);if(!_35["channel"]){if(_35["success"]!==true){return;}}this.lastMessage=_35;if(_35.advice){this._advice=_35.advice;}var _36=null;if((_35["channel"])&&(_35.channel.length>5)&&(_35.channel.substr(0,5)=="/meta")){switch(_35.channel){case "/meta/connect":var _37={response:_35};if(_35.successful){if(this._status!="connected"){this._status="connected";this.endBatch();}}if(this._initialized){this._publishMeta("connect",_35.successful,_37);}break;case "/meta/subscribe":_36=this._deferredSubscribes[_35.subscription];try{if(!_35.successful){if(_36){_36.errback(new Error(_35.error));}this.currentTransport.cancelConnect();return;}if(_36){_36.callback(true);}this.subscribed(_35.subscription,_35);}catch(e){log.warn(e);}break;case "/meta/unsubscribe":_36=this._deferredUnsubscribes[_35.subscription];try{if(!_35.successful){if(_36){_36.errback(new Error(_35.error));}this.currentTransport.cancelConnect();return;}if(_36){_36.callback(true);}this.unsubscribed(_35.subscription,_35);}catch(e){log.warn(e);}break;default:if(_35.successful&&!_35.successful){this.currentTransport.cancelConnect();return;}}}this.currentTransport.deliver(_35);if(_35.data){try{var _38=[_35];var _39=_1+_35.channel;var _3a=_35.channel.split("/");var _3b=_1;for(var i=1;i<_3a.length-1;i++){dojo.publish(_3b+"/**",_38);_3b+="/"+_3a[i];}dojo.publish(_3b+"/**",_38);dojo.publish(_3b+"/*",_38);dojo.publish(_39,_38);}catch(e){}}};this._sendMessage=function(_3c){if(this.currentTransport&&!this.batch){return this.currentTransport.sendMessages([_3c]);}else{this._messageQ.push(_3c);return null;}};this.startBatch=function(){this.batch++;};this.endBatch=function(){if(--this.batch<=0&&this.currentTransport&&this._status=="connected"){this.batch=0;var _3d=this._messageQ;this._messageQ=[];if(_3d.length>0){this.currentTransport.sendMessages(_3d);}}};this._onUnload=function(){dojo.addOnUnload(dojox.cometd,"disconnect");};this._connectTimeout=function(){var _3e=0;if(this._advice&&this._advice.timeout&&this.expectedNetworkDelay>0){_3e=this._advice.timeout+this.expectedNetworkDelay;}if(this.connectTimeout>0&&this.connectTimeout<_3e){return this.connectTimeout;}return _3e;};},connectionTypes:new dojo.AdapterRegistry(true)};dojox.cometd.Connection.call(dojox.cometd,"/cometd");dojo.addOnUnload(dojox.cometd,"_onUnload");}