]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Comet/jquery.comet.js
2124e882cb728a49826784347f4dc3567bba355a
[quix0rs-gnu-social.git] / plugins / Comet / jquery.comet.js
1 (function($)\r
2 {\r
3         var msgHandshake =\r
4         {\r
5                 version: '1.0',\r
6                 minimumVersion: '0.9',\r
7                 channel: '/meta/handshake'\r
8         };\r
9 \r
10         var oTransport = function()\r
11         {\r
12                 this._bXD = \r
13                         (($.comet._sUrl.substring(0,4) == 'http') && ($.comet._sUrl.substr(7,location.href.length).replace(/\/.*/, '') != location.host))\r
14                         ?\r
15                         true\r
16                         :false;\r
17 \r
18                 this.connectionType = (this._bXD) ? 'callback-polling' : 'long-polling';\r
19 \r
20                 this.startup = function(oReturn)\r
21                 {\r
22                         if(this._comet._bConnected) return;\r
23                         this.tunnelInit();\r
24                 };\r
25 \r
26                 this.tunnelInit = function()\r
27                 {\r
28                         var msgConnect = \r
29                         {\r
30                                 channel: '/meta/connect',\r
31                                 clientId: $.comet.clientId, \r
32                                 id: String($.comet._nNextId++),\r
33                                 connectionType: $.comet._oTransport.connectionType\r
34                         };\r
35 \r
36                         this.openTunnel(msgConnect);\r
37                 };\r
38 \r
39                 this.openTunnel = function(oMsg)\r
40                 {\r
41                         $.comet._bPolling = true;\r
42 \r
43                         this._send($.comet._sUrl, oMsg, function(sReturn)\r
44                         {\r
45                                 var oReturn = (typeof sReturn != "object") ? (eval('(' + sReturn + ')')) : sReturn;\r
46                                 $.comet._bPolling = false;\r
47                                 $.comet.deliver(oReturn);\r
48                                 $.comet._oTransport.closeTunnel();\r
49                         });\r
50                 };\r
51 \r
52                 this.closeTunnel = function()\r
53                 {\r
54                         if(!$.comet._bInitialized) return;\r
55 \r
56                         if($.comet._advice)\r
57                         {\r
58                                 if($.comet._advice.reconnect == 'none') return;\r
59 \r
60                                 if($.comet._advice.interval > 0)\r
61                                 {\r
62                                         setTimeout($.comet._oTransport._connect, $.comet._advice.interval);\r
63                                 }\r
64                                 else\r
65                                 {\r
66                                         $.comet._oTransport._connect();\r
67                                 }\r
68                         }\r
69                         else\r
70                         {\r
71                                 $.comet._oTransport._connect();\r
72                         }\r
73                 };\r
74 \r
75                 this._connect = function()\r
76                 {\r
77                         if(!$.comet._bInitialized) return;\r
78 \r
79                         if($.comet._bPolling) return;\r
80 \r
81                         if($.comet._advice && $.comet._advice.reconnect == 'handshake')\r
82                         {\r
83                                 $.comet._bConnected = false;\r
84                                 $.comet.init($.comet._sUrl);\r
85                         }\r
86                         else if($.comet._bConnected)\r
87                         {\r
88                                 var msgConnect = \r
89                                 {\r
90                                         //jsonp: 'test',\r
91                                         clientId: $.comet.clientId,\r
92                                         id: String($.comet._nNextId++),\r
93                                         channel: '/meta/connect',\r
94                                         connectionType: $.comet._oTransport.connectionType\r
95                                 };\r
96                                 $.comet._oTransport.openTunnel(msgConnect);\r
97                         }\r
98                 };\r
99 \r
100                 this._send = function(sUrl, oMsg, fCallback) {\r
101                         //default callback will check advice, deliver messages, and reconnect\r
102                         var fCallback = (fCallback) ? fCallback : function(sReturn)\r
103                         {\r
104                                 var oReturn = (typeof sReturn != "object") ? (eval('(' + sReturn + ')')) : sReturn;\r
105 \r
106                                 $.comet.deliver(oReturn);\r
107 \r
108                                 if($.comet._advice)\r
109                                 {\r
110                                         if($.comet._advice.reconnect == 'none')\r
111                                                 return;\r
112 \r
113                                         if($.comet._advice.interval > 0)\r
114                                         {\r
115                                                 setTimeout($.comet._oTransport._connect, $.comet._advice.interval);\r
116                                         }\r
117                                         else\r
118                                         {\r
119                                                 $.comet._oTransport._connect();\r
120                                         }\r
121                                 }\r
122                                 else\r
123                                 {\r
124                                         $.comet._oTransport._connect();\r
125                                 }\r
126                         };\r
127 \r
128                         //regular AJAX for same domain calls\r
129                         if((!this._bXD) && (this.connectionType == 'long-polling'))\r
130                         {\r
131                                 this._pollRequest = $.ajax({\r
132                                         url: sUrl,\r
133                                         type: 'post',\r
134                                         beforeSend: function(oXhr) { oXhr.setRequestHeader('Connection', 'Keep-Alive'); },\r
135                                         data: { message: JSON.stringify(oMsg) },\r
136                                         success: fCallback\r
137                                 });\r
138                         }\r
139                         else // JSONP callback for cross domain\r
140                         {\r
141                                 this._pollRequest = $.ajax({\r
142                                         url: sUrl,\r
143                                         dataType: 'jsonp',\r
144                                         jsonp: 'jsonp',\r
145                                         beforeSend: function(oXhr) { oXhr.setRequestHeader('Connection', 'Keep-Alive'); },\r
146                                         data: \r
147                                         { \r
148                                                 message: JSON.stringify($.extend(oMsg,{connectionType: 'callback-polling' })) \r
149                                         },\r
150                                         success: fCallback\r
151                                 });\r
152                         }\r
153                 }\r
154         };\r
155 \r
156         $.comet = new function()\r
157         {\r
158                 this.CONNECTED = 'CONNECTED';\r
159                 this.CONNECTING = 'CONNECTING';\r
160                 this.DISCONNECTED = 'DISCONNECTED';\r
161                 this.DISCONNECTING = 'DISCONNECTING';\r
162 \r
163                 this._aMessageQueue = [];\r
164                 this._aSubscriptions = [];\r
165                 this._aSubscriptionCallbacks = [];\r
166                 this._bInitialized = false;\r
167                 this._bConnected = false;\r
168                 this._nBatch = 0;\r
169                 this._nNextId = 0;\r
170                 // just define the transport, do not assign it yet.\r
171                 this._oTransport = ''; //oTransport;\r
172                 this._sUrl = '';\r
173 \r
174                 this.supportedConectionTypes = [ 'long-polling', 'callback-polling' ];\r
175 \r
176                 this.clientId = '';\r
177 \r
178                 this._bTrigger = true; // this sends $.event.trigger(channel, data)\r
179 \r
180                 this.init = function(sUrl)\r
181                 {\r
182                         this._sUrl = (sUrl) ? sUrl : '/cometd';\r
183 \r
184                         this._oTransport = new oTransport();\r
185 \r
186                         this._aMessageQueue = [];\r
187                         this._aSubscriptions = [];\r
188                         this._bInitialized = true;\r
189                         this.startBatch();\r
190 \r
191                         var oMsg = $.extend(msgHandshake, {id: String(this._nNextId++)});\r
192 \r
193                         this._oTransport._send(this._sUrl, oMsg, $.comet._finishInit);\r
194                 };\r
195 \r
196                 this._finishInit = function(sReturn)\r
197                 {\r
198                         var oReturn = (typeof sReturn != "object") ? (eval('(' + sReturn + ')')[0]) : sReturn[0];\r
199 \r
200                         if(oReturn.advice)\r
201                                 $.comet._advice = oReturn.advice;\r
202 \r
203                         var bSuccess = (oReturn.successful) ? oReturn.successful : false;\r
204                         // do version check\r
205 \r
206                         if(bSuccess)\r
207                         {\r
208                                 // pick transport ?\r
209                                 // ......\r
210 \r
211                                 $.comet._oTransport._comet = $.comet;\r
212                                 $.comet._oTransport.version = $.comet.version;\r
213 \r
214                                 $.comet.clientId = oReturn.clientId;\r
215                                 $.comet._oTransport.startup(oReturn);\r
216                                 $.comet.endBatch();\r
217                         }\r
218                 };\r
219 \r
220                 this._sendMessage = function(oMsg)\r
221                 {\r
222                         if($.comet._nBatch <= 0)\r
223                         {\r
224                                 if(oMsg.length > 0)\r
225                                         for(var i in oMsg)\r
226                                         {\r
227                                                 oMsg[i].clientId = String($.comet.clientId);\r
228                                                 oMsg[i].id = String($.comet._nNextId++);\r
229                                         }\r
230                                 else\r
231                                 {\r
232                                         oMsg.clientId = String($.comet.clientId);\r
233                                         oMsg.id = String($.comet._nNextId++);\r
234                                 }\r
235 \r
236                                 $.comet._oTransport._send($.comet._sUrl, oMsg);\r
237                         }\r
238                         else\r
239                         {\r
240                                 $.comet._aMessageQueue.push(oMsg);\r
241                         }\r
242                 };\r
243 \r
244 \r
245                 this.startBatch = function() { this._nBatch++ };\r
246                 this.endBatch = function() {\r
247                         if(--this._nBatch <= 0)\r
248                         {\r
249                                 this._nBatch = 0;\r
250                                 if(this._aMessageQueue.length > 0)\r
251                                 {\r
252                                         this._sendMessage(this._aMessageQueue);\r
253                                         this._aMessageQueue = [];\r
254                                 }\r
255                         }\r
256                 };\r
257 \r
258                 this.subscribe = function(sSubscription, fCallback)\r
259                 {\r
260                         // if this topic has not been subscribed to yet, send the message now\r
261                         if(!this._aSubscriptions[sSubscription])\r
262                         {\r
263                                 this._aSubscriptions.push(sSubscription)\r
264 \r
265                                 if (fCallback) {\r
266                                         this._aSubscriptionCallbacks[sSubscription] = fCallback;\r
267                                 }\r
268 \r
269                                 this._sendMessage({ channel: '/meta/subscribe', subscription: sSubscription });\r
270                         }\r
271 \r
272                         //$.event.add(window, sSubscription, fCallback);\r
273                 };\r
274 \r
275                 this.unsubscribe = function(sSubscription) {\r
276                         $.comet._sendMessage({ channel: '/meta/unsubscribe', subscription: sSubscription });\r
277                 };\r
278 \r
279                 this.publish = function(sChannel, oData)\r
280                 {\r
281                         $.comet._sendMessage({channel: sChannel, data: oData});\r
282                 };\r
283 \r
284                 this.deliver = function(sReturn)\r
285                 {\r
286                         var oReturn = sReturn;//eval(sReturn);\r
287 \r
288                         $(oReturn).each(function()\r
289                         {\r
290                                         $.comet._deliver(this);\r
291                         });\r
292                 };\r
293 \r
294                 this.disconnect = function()\r
295                 {\r
296                         $($.comet._aSubscriptions).each(function(i)\r
297                         {\r
298                                 $.comet.unsubscribe($.comet._aSubscriptions[i]);\r
299                         });\r
300 \r
301                         $.comet._sendMessage({channel:'/meta/disconnect'});\r
302 \r
303                         $.comet._bInitialized = false;\r
304                 }\r
305 \r
306                 this._deliver = function(oMsg,oData)\r
307                 {\r
308                         if(oMsg.advice)\r
309                         {\r
310                                 $.comet._advice = oMsg.advice;\r
311                         }\r
312 \r
313                         switch(oMsg.channel)\r
314                         {\r
315                                 case '/meta/connect':\r
316                                         if(oMsg.successful && !$.comet._bConnected)\r
317                                         {\r
318                                                 $.comet._bConnected = $.comet._bInitialized;\r
319                                                 $.comet.endBatch();\r
320                                         /*\r
321                                            $.comet._sendMessage(msgConnect);\r
322                                         */\r
323                                         }\r
324                                         else\r
325                                         {}\r
326                                                 //$.comet._bConnected = false;\r
327                                 break;\r
328 \r
329                                 // add in subscription handling stuff\r
330                                 case '/meta/subscribe':\r
331                                         if(!oMsg.successful)\r
332                                         {\r
333                                                 $.comet._oTransport._cancelConnect();\r
334                                                 return;\r
335                                         }\r
336                                 break;\r
337 \r
338                                 case '/meta/unsubscribe':\r
339                                         if(!oMsg.successful)\r
340                                         {\r
341                                                 $.comet._oTransport._cancelConnect();\r
342                                                 return;\r
343                                         }\r
344                                 break;\r
345 \r
346                         }\r
347 \r
348                 if(oMsg.data)\r
349                 {\r
350                         if($.comet._bTrigger)\r
351                         {\r
352                                 $.event.trigger(oMsg.channel, [oMsg]);\r
353                         }\r
354 \r
355                         var cb = $.comet._aSubscriptionCallbacks[oMsg.channel];\r
356                         if (cb) {\r
357                                 cb(oMsg);\r
358                         }\r
359                 }\r
360         };\r
361 };\r
362 \r
363 })(jQuery);\r