Blame view
sources/core/js/eventsource.js
3.7 KB
|
03e52840d
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * ownCloud * * @author Robin Appelman * @copyright 2012 Robin Appelman icewind1991@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ /** |
|
6d9380f96
|
23 24 |
* Wrapper for server side events * (http://en.wikipedia.org/wiki/Server-sent_events) |
|
03e52840d
|
25 26 |
* includes a fallback for older browsers and IE * |
|
6d9380f96
|
27 28 |
* use server side events with caution, too many open requests can hang the * server |
|
03e52840d
|
29 |
*/ |
|
6d9380f96
|
30 |
/* global EventSource */ |
|
03e52840d
|
31 |
/** |
|
6d9380f96
|
32 33 34 |
* Create a new event source
* @param {string} src
* @param {object} [data] to be send as GET
|
|
03e52840d
|
35 36 37 |
*/
OC.EventSource=function(src,data){
var dataStr='';
|
|
6d9380f96
|
38 39 |
var name; var joinChar; |
|
03e52840d
|
40 |
this.typelessListeners=[]; |
|
6d9380f96
|
41 |
this.closed = false; |
|
03e52840d
|
42 43 44 45 46 47 48 |
this.listeners={};
if(data){
for(name in data){
dataStr+=name+'='+encodeURIComponent(data[name])+'&';
}
}
dataStr+='requesttoken='+oc_requesttoken;
|
|
6d9380f96
|
49 50 51 |
if(!this.useFallBack && typeof EventSource !== 'undefined'){
joinChar = '&';
if(src.indexOf('?') === -1) {
|
|
03e52840d
|
52 53 |
joinChar = '?'; } |
|
6d9380f96
|
54 |
this.source= new EventSource(src+joinChar+dataStr); |
|
03e52840d
|
55 56 57 58 59 60 |
this.source.onmessage=function(e){
for(var i=0;i<this.typelessListeners.length;i++){
this.typelessListeners[i](JSON.parse(e.data));
}
}.bind(this);
}else{
|
|
6d9380f96
|
61 |
var iframeId='oc_eventsource_iframe_'+OC.EventSource.iframeCount; |
|
03e52840d
|
62 63 64 65 |
OC.EventSource.fallBackSources[OC.EventSource.iframeCount]=this;
this.iframe=$('<iframe/>');
this.iframe.attr('id',iframeId);
this.iframe.hide();
|
|
6d9380f96
|
66 67 |
joinChar = '&';
if(src.indexOf('?') === -1) {
|
|
03e52840d
|
68 69 70 71 72 |
joinChar = '?';
}
this.iframe.attr('src',src+joinChar+'fallback=true&fallback_id='+OC.EventSource.iframeCount+'&'+dataStr);
$('body').append(this.iframe);
this.useFallBack=true;
|
|
6d9380f96
|
73 |
OC.EventSource.iframeCount++; |
|
03e52840d
|
74 75 76 |
}
//add close listener
this.listen('__internal__',function(data){
|
|
6d9380f96
|
77 |
if(data === 'close'){
|
|
03e52840d
|
78 79 80 |
this.close(); } }.bind(this)); |
|
6d9380f96
|
81 |
}; |
|
03e52840d
|
82 83 84 85 |
OC.EventSource.fallBackSources=[];
OC.EventSource.iframeCount=0;//number of fallback iframes
OC.EventSource.fallBackCallBack=function(id,type,data){
OC.EventSource.fallBackSources[id].fallBackCallBack(type,data);
|
|
6d9380f96
|
86 |
}; |
|
03e52840d
|
87 88 89 90 91 92 |
OC.EventSource.prototype={
typelessListeners:[],
iframe:null,
listeners:{},//only for fallback
useFallBack:false,
fallBackCallBack:function(type,data){
|
|
6d9380f96
|
93 94 95 96 97 |
var i;
// ignore messages that might appear after closing
if (this.closed) {
return;
}
|
|
03e52840d
|
98 |
if(type){
|
|
6d9380f96
|
99 100 |
if (typeof this.listeners.done !== 'undefined') {
for(i=0;i<this.listeners[type].length;i++){
|
|
03e52840d
|
101 102 103 104 |
this.listeners[type][i](data);
}
}
}else{
|
|
6d9380f96
|
105 |
for(i=0;i<this.typelessListeners.length;i++){
|
|
03e52840d
|
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
this.typelessListeners[i](data);
}
}
},
lastLength:0,//for fallback
listen:function(type,callback){
if(callback && callback.call){
if(type){
if(this.useFallBack){
if(!this.listeners[type]){
this.listeners[type]=[];
}
this.listeners[type].push(callback);
}else{
this.source.addEventListener(type,function(e){
|
|
6d9380f96
|
122 |
if (typeof e.data !== 'undefined') {
|
|
03e52840d
|
123 124 125 126 127 128 129 |
callback(JSON.parse(e.data));
} else {
callback('');
}
},false);
}
}else{
|
|
6d9380f96
|
130 |
this.typelessListeners.push(callback); |
|
03e52840d
|
131 132 133 134 |
}
}
},
close:function(){
|
|
6d9380f96
|
135 136 |
this.closed = true;
if (typeof this.source !== 'undefined') {
|
|
03e52840d
|
137 138 139 |
this.source.close(); } } |
|
6d9380f96
|
140 |
}; |