-
Notifications
You must be signed in to change notification settings - Fork 1
/
strophe.serverdate.js
58 lines (52 loc) · 1.57 KB
/
strophe.serverdate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//= require <strophe>
/* serverdate plugin
**
** This plugin syncs a local clock to the servers using the response header
** on the BOSH connection
**
*/
var ServerDate = function(){
if( arguments.length === 0 ){
return new Date( new Date().valueOf() + ServerDate.skew );
}
else if ( arguments.length === 1 ){
// Covers case where a string is passed in
return new Date( arguments[0] );
}
else {
return new Date( Date.UTC.apply( null, arguments ) + ((new Date()).getTimezoneOffset() * 60000) );
}
};
ServerDate.parse = Date.parse;
ServerDate.UTC = Date.UTC;
ServerDate.now = function(){ return (new ServerDate()).valueOf(); };
ServerDate.skew = 0;
Strophe.addConnectionPlugin('serverdate', {
init: function(connection){
Strophe.Request.prototype._newXHR = function () {
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
if (xhr.overrideMimeType) {
xhr.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var handler = this.func.prependArg(this);
xhr.onreadystatechange = function(){
if(this.readyState == 2){
var header = this.getResponseHeader('Date');
var server_date = new Date(header);
if ( header && server_date != 'Invalid Date' ){
system_date = new Date();
skew_ms = server_date - system_date;
ServerDate.skew = skew_ms;
}
}
handler();
};
return xhr;
};
}
});