Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / cometd / _base.js @ 12

History | View | Annotate | Download (9.08 KB)

1
/*
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._base"]){
9
dojo._hasResource["dojox.cometd._base"]=true;
10
dojo.provide("dojox.cometd._base");
11
dojo.require("dojo.AdapterRegistry");
12
dojox.cometd={Connection:function(_1){
13
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:[]});
14
this.state=function(){
15
return this._status;
16
};
17
this.init=function(_2,_3,_4){
18
_3=_3||{};
19
_3.version=this.version;
20
_3.minimumVersion=this.minimumVersion;
21
_3.channel="/meta/handshake";
22
_3.id=""+this.messageId++;
23
this.url=_2||dojo.config["cometdRoot"];
24
if(!this.url){
25
throw "no cometd root";
26
return null;
27
}
28
var _5="^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
29
var _6=(""+window.location).match(new RegExp(_5));
30
if(_6[4]){
31
var _7=_6[4].split(":");
32
var _8=_7[0];
33
var _9=_7[1]||"80";
34
_6=this.url.match(new RegExp(_5));
35
if(_6[4]){
36
_7=_6[4].split(":");
37
var _a=_7[0];
38
var _b=_7[1]||"80";
39
this._isXD=((_a!=_8)||(_b!=_9));
40
}
41
}
42
if(!this._isXD){
43
_3.supportedConnectionTypes=dojo.map(dojox.cometd.connectionTypes.pairs,"return item[0]");
44
}
45
_3=this._extendOut(_3);
46
var _c={url:this.url,handleAs:this.handleAs,content:{"message":dojo.toJson([_3])},load:dojo.hitch(this,function(_d){
47
this._backon();
48
this._finishInit(_d);
49
}),error:dojo.hitch(this,function(e){
50
this._backoff();
51
this._finishInit(e);
52
}),timeout:this.expectedNetworkDelay};
53
if(_4){
54
dojo.mixin(_c,_4);
55
}
56
this._props=_3;
57
for(var _e in this._subscriptions){
58
for(var _f in this._subscriptions[_e]){
59
if(this._subscriptions[_e][_f].topic){
60
dojo.unsubscribe(this._subscriptions[_e][_f].topic);
61
}
62
}
63
}
64
this._messageQ=[];
65
this._subscriptions=[];
66
this._initialized=true;
67
this._status="handshaking";
68
this.batch=0;
69
this.startBatch();
70
var r;
71
if(this._isXD){
72
_c.callbackParamName="jsonp";
73
r=dojo.io.script.get(_c);
74
}else{
75
r=dojo.xhrPost(_c);
76
}
77
return r;
78
};
79
this.publish=function(_10,_11,_12){
80
var _13={data:_11,channel:_10};
81
if(_12){
82
dojo.mixin(_13,_12);
83
}
84
this._sendMessage(_13);
85
};
86
this.subscribe=function(_14,_15,_16,_17){
87
_17=_17||{};
88
if(_15){
89
var _18=_1+_14;
90
var _19=this._subscriptions[_18];
91
if(!_19||_19.length==0){
92
_19=[];
93
_17.channel="/meta/subscribe";
94
_17.subscription=_14;
95
this._sendMessage(_17);
96
var _1a=this._deferredSubscribes;
97
if(_1a[_14]){
98
_1a[_14].cancel();
99
delete _1a[_14];
100
}
101
_1a[_14]=new dojo.Deferred();
102
}
103
for(var i in _19){
104
if(_19[i].objOrFunc===_15&&(!_19[i].funcName&&!_16||_19[i].funcName==_16)){
105
return null;
106
}
107
}
108
var _1b=dojo.subscribe(_18,_15,_16);
109
_19.push({topic:_1b,objOrFunc:_15,funcName:_16});
110
this._subscriptions[_18]=_19;
111
}
112
var ret=this._deferredSubscribes[_14]||{};
113
ret.args=dojo._toArray(arguments);
114
return ret;
115
};
116
this.unsubscribe=function(_1c,_1d,_1e,_1f){
117
if((arguments.length==1)&&(!dojo.isString(_1c))&&(_1c.args)){
118
return this.unsubscribe.apply(this,_1c.args);
119
}
120
var _20=_1+_1c;
121
var _21=this._subscriptions[_20];
122
if(!_21||_21.length==0){
123
return null;
124
}
125
var s=0;
126
for(var i in _21){
127
var sb=_21[i];
128
if((!_1d)||(sb.objOrFunc===_1d&&(!sb.funcName&&!_1e||sb.funcName==_1e))){
129
dojo.unsubscribe(_21[i].topic);
130
delete _21[i];
131
}else{
132
s++;
133
}
134
}
135
if(s==0){
136
_1f=_1f||{};
137
_1f.channel="/meta/unsubscribe";
138
_1f.subscription=_1c;
139
delete this._subscriptions[_20];
140
this._sendMessage(_1f);
141
this._deferredUnsubscribes[_1c]=new dojo.Deferred();
142
if(this._deferredSubscribes[_1c]){
143
this._deferredSubscribes[_1c].cancel();
144
delete this._deferredSubscribes[_1c];
145
}
146
}
147
return this._deferredUnsubscribes[_1c];
148
};
149
this.disconnect=function(){
150
for(var _22 in this._subscriptions){
151
for(var sub in this._subscriptions[_22]){
152
if(this._subscriptions[_22][sub].topic){
153
dojo.unsubscribe(this._subscriptions[_22][sub].topic);
154
}
155
}
156
}
157
this._subscriptions=[];
158
this._messageQ=[];
159
if(this._initialized&&this.currentTransport){
160
this._initialized=false;
161
this.currentTransport.disconnect();
162
}
163
if(!this._polling){
164
this._publishMeta("connect",false);
165
}
166
this._initialized=false;
167
this._handshook=false;
168
this._status="disconnected";
169
this._publishMeta("disconnect",true);
170
};
171
this.subscribed=function(_23,_24){
172
};
173
this.unsubscribed=function(_25,_26){
174
};
175
this.tunnelInit=function(_27,_28){
176
};
177
this.tunnelCollapse=function(){
178
};
179
this._backoff=function(){
180
if(!this._advice){
181
this._advice={reconnect:"retry",interval:0};
182
}else{
183
if(!this._advice.interval){
184
this._advice.interval=0;
185
}
186
}
187
if(this._backoffInterval<this._backoffMax){
188
this._backoffInterval+=this._backoffIncrement;
189
}
190
};
191
this._backon=function(){
192
this._backoffInterval=0;
193
};
194
this._interval=function(){
195
var i=this._backoffInterval+(this._advice?(this._advice.interval?this._advice.interval:0):0);
196
if(i>0){
197
}
198
return i;
199
};
200
this._publishMeta=function(_29,_2a,_2b){
201
try{
202
var _2c={cometd:this,action:_29,successful:_2a,state:this.state()};
203
if(_2b){
204
dojo.mixin(_2c,_2b);
205
}
206
dojo.publish(this.prefix+"/meta",[_2c]);
207
}
208
catch(e){
209
}
210
};
211
this._finishInit=function(_2d){
212
if(this._status!="handshaking"){
213
return;
214
}
215
var _2e=this._handshook;
216
var _2f=false;
217
var _30={};
218
if(_2d instanceof Error){
219
dojo.mixin(_30,{reestablish:false,failure:true,error:_2d,advice:this._advice});
220
}else{
221
_2d=_2d[0];
222
_2d=this._extendIn(_2d);
223
this.handshakeReturn=_2d;
224
if(_2d["advice"]){
225
this._advice=_2d.advice;
226
}
227
_2f=_2d.successful?_2d.successful:false;
228
if(_2d.version<this.minimumVersion){
229
if(console.log){
230
}
231
_2f=false;
232
this._advice.reconnect="none";
233
}
234
dojo.mixin(_30,{reestablish:_2f&&_2e,response:_2d});
235
}
236
this._publishMeta("handshake",_2f,_30);
237
if(this._status!="handshaking"){
238
return;
239
}
240
if(_2f){
241
this._status="connecting";
242
this._handshook=true;
243
this.currentTransport=dojox.cometd.connectionTypes.match(_2d.supportedConnectionTypes,_2d.version,this._isXD);
244
var _31=this.currentTransport;
245
_31._cometd=this;
246
_31.version=_2d.version;
247
this.clientId=_2d.clientId;
248
this.tunnelInit=_31.tunnelInit&&dojo.hitch(_31,"tunnelInit");
249
this.tunnelCollapse=_31.tunnelCollapse&&dojo.hitch(_31,"tunnelCollapse");
250
_31.startup(_2d);
251
}else{
252
if(!this._advice||this._advice["reconnect"]!="none"){
253
setTimeout(dojo.hitch(this,"init",this.url,this._props),this._interval());
254
}
255
}
256
};
257
this._extendIn=function(_32){
258
dojo.forEach(dojox.cometd._extendInList,function(f){
259
_32=f(_32)||_32;
260
});
261
return _32;
262
};
263
this._extendOut=function(_33){
264
dojo.forEach(dojox.cometd._extendOutList,function(f){
265
_33=f(_33)||_33;
266
});
267
return _33;
268
};
269
this.deliver=function(_34){
270
dojo.forEach(_34,this._deliver,this);
271
return _34;
272
};
273
this._deliver=function(_35){
274
_35=this._extendIn(_35);
275
if(!_35["channel"]){
276
if(_35["success"]!==true){
277
return;
278
}
279
}
280
this.lastMessage=_35;
281
if(_35.advice){
282
this._advice=_35.advice;
283
}
284
var _36=null;
285
if((_35["channel"])&&(_35.channel.length>5)&&(_35.channel.substr(0,5)=="/meta")){
286
switch(_35.channel){
287
case "/meta/connect":
288
var _37={response:_35};
289
if(_35.successful){
290
if(this._status!="connected"){
291
this._status="connected";
292
this.endBatch();
293
}
294
}
295
if(this._initialized){
296
this._publishMeta("connect",_35.successful,_37);
297
}
298
break;
299
case "/meta/subscribe":
300
_36=this._deferredSubscribes[_35.subscription];
301
try{
302
if(!_35.successful){
303
if(_36){
304
_36.errback(new Error(_35.error));
305
}
306
this.currentTransport.cancelConnect();
307
return;
308
}
309
if(_36){
310
_36.callback(true);
311
}
312
this.subscribed(_35.subscription,_35);
313
}
314
catch(e){
315
log.warn(e);
316
}
317
break;
318
case "/meta/unsubscribe":
319
_36=this._deferredUnsubscribes[_35.subscription];
320
try{
321
if(!_35.successful){
322
if(_36){
323
_36.errback(new Error(_35.error));
324
}
325
this.currentTransport.cancelConnect();
326
return;
327
}
328
if(_36){
329
_36.callback(true);
330
}
331
this.unsubscribed(_35.subscription,_35);
332
}
333
catch(e){
334
log.warn(e);
335
}
336
break;
337
default:
338
if(_35.successful&&!_35.successful){
339
this.currentTransport.cancelConnect();
340
return;
341
}
342
}
343
}
344
this.currentTransport.deliver(_35);
345
if(_35.data){
346
try{
347
var _38=[_35];
348
var _39=_1+_35.channel;
349
var _3a=_35.channel.split("/");
350
var _3b=_1;
351
for(var i=1;i<_3a.length-1;i++){
352
dojo.publish(_3b+"/**",_38);
353
_3b+="/"+_3a[i];
354
}
355
dojo.publish(_3b+"/**",_38);
356
dojo.publish(_3b+"/*",_38);
357
dojo.publish(_39,_38);
358
}
359
catch(e){
360
}
361
}
362
};
363
this._sendMessage=function(_3c){
364
if(this.currentTransport&&!this.batch){
365
return this.currentTransport.sendMessages([_3c]);
366
}else{
367
this._messageQ.push(_3c);
368
return null;
369
}
370
};
371
this.startBatch=function(){
372
this.batch++;
373
};
374
this.endBatch=function(){
375
if(--this.batch<=0&&this.currentTransport&&this._status=="connected"){
376
this.batch=0;
377
var _3d=this._messageQ;
378
this._messageQ=[];
379
if(_3d.length>0){
380
this.currentTransport.sendMessages(_3d);
381
}
382
}
383
};
384
this._onUnload=function(){
385
dojo.addOnUnload(dojox.cometd,"disconnect");
386
};
387
this._connectTimeout=function(){
388
var _3e=0;
389
if(this._advice&&this._advice.timeout&&this.expectedNetworkDelay>0){
390
_3e=this._advice.timeout+this.expectedNetworkDelay;
391
}
392
if(this.connectTimeout>0&&this.connectTimeout<_3e){
393
return this.connectTimeout;
394
}
395
return _3e;
396
};
397
},connectionTypes:new dojo.AdapterRegistry(true)};
398
dojox.cometd.Connection.call(dojox.cometd,"/cometd");
399
dojo.addOnUnload(dojox.cometd,"_onUnload");
400
}