Blame view

sources/core/js/eventsource.js 3.7 KB
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
23
24
   * Wrapper for server side events
   * (http://en.wikipedia.org/wiki/Server-sent_events)
03e52840d   Kload   Init
25
26
   * includes a fallback for older browsers and IE
   *
6d9380f96   Cédric Dupont   Update sources OC...
27
28
   * use server side events with caution, too many open requests can hang the
   * server
03e52840d   Kload   Init
29
   */
6d9380f96   Cédric Dupont   Update sources OC...
30
  /* global EventSource */
03e52840d   Kload   Init
31
  /**
6d9380f96   Cédric Dupont   Update sources OC...
32
33
34
   * Create a new event source
   * @param {string} src
   * @param {object} [data] to be send as GET
03e52840d   Kload   Init
35
36
37
   */
  OC.EventSource=function(src,data){
  	var dataStr='';
6d9380f96   Cédric Dupont   Update sources OC...
38
39
  	var name;
  	var joinChar;
03e52840d   Kload   Init
40
  	this.typelessListeners=[];
6d9380f96   Cédric Dupont   Update sources OC...
41
  	this.closed = false;
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
49
50
51
  	if(!this.useFallBack && typeof EventSource !== 'undefined'){
  		joinChar = '&';
  		if(src.indexOf('?') === -1) {
03e52840d   Kload   Init
52
53
  			joinChar = '?';
  		}
6d9380f96   Cédric Dupont   Update sources OC...
54
  		this.source= new EventSource(src+joinChar+dataStr);
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
61
  		var iframeId='oc_eventsource_iframe_'+OC.EventSource.iframeCount;
03e52840d   Kload   Init
62
63
64
65
  		OC.EventSource.fallBackSources[OC.EventSource.iframeCount]=this;
  		this.iframe=$('<iframe/>');
  		this.iframe.attr('id',iframeId);
  		this.iframe.hide();
6d9380f96   Cédric Dupont   Update sources OC...
66
67
  		joinChar = '&';
  		if(src.indexOf('?') === -1) {
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
73
  		OC.EventSource.iframeCount++;
03e52840d   Kload   Init
74
75
76
  	}
  	//add close listener
  	this.listen('__internal__',function(data){
6d9380f96   Cédric Dupont   Update sources OC...
77
  		if(data === 'close'){
03e52840d   Kload   Init
78
79
80
  			this.close();
  		}
  	}.bind(this));
6d9380f96   Cédric Dupont   Update sources OC...
81
  };
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
86
  };
03e52840d   Kload   Init
87
88
89
90
91
92
  OC.EventSource.prototype={
  	typelessListeners:[],
  	iframe:null,
  	listeners:{},//only for fallback
  	useFallBack:false,
  	fallBackCallBack:function(type,data){
6d9380f96   Cédric Dupont   Update sources OC...
93
94
95
96
97
  		var i;
  		// ignore messages that might appear after closing
  		if (this.closed) {
  			return;
  		}
03e52840d   Kload   Init
98
  		if(type){
6d9380f96   Cédric Dupont   Update sources OC...
99
100
  			if (typeof this.listeners.done !== 'undefined') {
  				for(i=0;i<this.listeners[type].length;i++){
03e52840d   Kload   Init
101
102
103
104
  					this.listeners[type][i](data);
  				}
  			}
  		}else{
6d9380f96   Cédric Dupont   Update sources OC...
105
  			for(i=0;i<this.typelessListeners.length;i++){
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
122
  						if (typeof e.data !== 'undefined') {
03e52840d   Kload   Init
123
124
125
126
127
128
129
  							callback(JSON.parse(e.data));
  						} else {
  							callback('');
  						}
  					},false);
  				}
  			}else{
6d9380f96   Cédric Dupont   Update sources OC...
130
  				this.typelessListeners.push(callback);
03e52840d   Kload   Init
131
132
133
134
  			}
  		}
  	},
  	close:function(){
6d9380f96   Cédric Dupont   Update sources OC...
135
136
  		this.closed = true;
  		if (typeof this.source !== 'undefined') {
03e52840d   Kload   Init
137
138
139
  			this.source.close();
  		}
  	}
6d9380f96   Cédric Dupont   Update sources OC...
140
  };