30 |
this.callback_eof = function() {}; |
this.callback_eof = function() {}; |
31 |
this.callback_changemode = function() {}; |
this.callback_changemode = function() {}; |
32 |
this.callback_statuschanged = function() {}; |
this.callback_statuschanged = function() {}; |
33 |
this.persist = true; |
this.persist = 1; |
34 |
this.frameloadtimer = false; |
this.frameloadtimer = false; |
35 |
this.debugmode = false; |
this.debugmode = false; |
36 |
this.subsurl = false; |
this.subsurl = false; |
42 |
// Documented public properties |
// Documented public properties |
43 |
this.subdomain = "data"; |
this.subdomain = "data"; |
44 |
this.dynamicpageaddress = "push"; |
this.dynamicpageaddress = "push"; |
45 |
this.smartpoll = true; |
this.smartpoll = 1; |
46 |
this.pollfreq = 2000; |
this.pollfreq = 2000; |
47 |
this.minpollfreq = 2000; |
this.minpollfreq = 2000; |
48 |
this.mode = "poll"; |
this.mode = "stream"; |
49 |
this.polltimeout=30000; |
this.polltimeout = 30000; |
50 |
this.pingtimeout = 10000; |
this.pingtimeout = 10000; |
51 |
this.maxmessages = 0; |
this.maxmessages = 0; |
52 |
this.status = 0; |
this.status = 0; |
90 |
this.instances[instid].reset(); |
this.instances[instid].reset(); |
91 |
} |
} |
92 |
|
|
93 |
|
window.onunload = function() { |
94 |
|
for (var i in Meteor.instances) { |
95 |
|
if (Meteor.instances[i].transferDoc) delete Meteor.instances[i].transferDoc; |
96 |
|
} |
97 |
|
} |
98 |
|
|
99 |
|
|
100 |
Meteor.prototype.joinChannel = function(channelname, backtrack) { |
Meteor.prototype.joinChannel = function(channelname, backtrack) { |
101 |
if (typeof(this.channels[channelname]) != "undefined") throw "Cannot join channel "+channelname+": already subscribed"; |
if (typeof(this.channels[channelname]) != "undefined") throw "Cannot join channel "+channelname+": already subscribed"; |
102 |
this.channels[channelname] = {backtrack:backtrack, lastmsgreceived:0}; |
this.channels[channelname] = {backtrack:backtrack, lastmsgreceived:0}; |
114 |
} |
} |
115 |
|
|
116 |
Meteor.prototype.start = function() { |
Meteor.prototype.start = function() { |
117 |
this.persist = (this.maxmessages)?1:0; |
this.persist = (this.persist)?1:0; |
118 |
this.smartpoll = (this.smartpoll)?1:0; |
this.smartpoll = (this.smartpoll)?1:0; |
119 |
this.mode = (this.mode=="stream")?"stream":"poll"; |
this.mode = (this.mode=="stream")?"stream":"poll"; |
120 |
if (!this.subdomain || !this.channelcount) throw "Channel or Meteor subdomain host not specified"; |
if (!this.subdomain || !this.channelcount) throw "Channel or Meteor subdomain host not specified"; |
122 |
var now = new Date(); |
var now = new Date(); |
123 |
var t = now.getTime(); |
var t = now.getTime(); |
124 |
this.setstatus(1); |
this.setstatus(1); |
125 |
var surl = "http://" + this.subdomain + "." + location.hostname + "/" + this.dynamicpageaddress + "?id=" + this.MHostId; |
this.updateSubsUrl(); |
|
if (this.maxmessages && !this.persist) surl += "&maxmessages=" + this.maxmessages; |
|
|
for (var c in this.channels) { |
|
|
surl += "&channel="+c; |
|
|
if (this.channels[c].lastmsgreceived > 0) { |
|
|
surl += "&restartfrom="+this.channels[c].lastmsgreceived; |
|
|
} else if (this.channels[c].backtrack > 0) { |
|
|
surl += "&backtrack="+this.channels[c].backtrack; |
|
|
} else if (this.channels[c].backtrack < 0 || isNaN(this.channels[c].backtrack)) { |
|
|
surl += "&restartfrom="; |
|
|
} |
|
|
} |
|
|
this.subsurl = surl; |
|
126 |
if (this.mode=="stream") { |
if (this.mode=="stream") { |
127 |
if (document.all) { |
if (document.all) { |
128 |
this.createIframe(this.subsurl); |
this.createIframe(this.subsurl); |
134 |
this.pingtimer = setTimeout(f, this.pingtimeout); |
this.pingtimer = setTimeout(f, this.pingtimeout); |
135 |
|
|
136 |
} else { |
} else { |
137 |
this.createIframe("http://"+this.subdomain+"."+location.hostname+"/poll.html"); |
this.createIframe("http://"+this.subdomain+"."+location.hostname+"/poll.html?nc="+t); |
138 |
this.recvtimes[0] = t; |
this.recvtimes[0] = t; |
139 |
if (this.updatepollfreqtimer) clearTimeout(this.updatepollfreqtimer); |
if (this.updatepollfreqtimer) clearTimeout(this.updatepollfreqtimer); |
140 |
this.updatepollfreqtimer = setInterval(this.updatepollfreq.bind(this), 2500); |
this.updatepollfreqtimer = setInterval(this.updatepollfreq.bind(this), 2500); |
142 |
this.lastrequest = t; |
this.lastrequest = t; |
143 |
} |
} |
144 |
|
|
145 |
|
Meteor.prototype.updateSubsUrl = function() { |
146 |
|
|
147 |
|
// If streaming or long polling, connection should persist |
148 |
|
this.persist = (this.mode == "stream" || (this.mode=='poll' && this.maxmessages > 0)) ? 1 : 0; |
149 |
|
var surl = "http://" + this.subdomain + "." + location.hostname + "/" + this.dynamicpageaddress + "?id=" + this.MHostId; |
150 |
|
if (this.persist && this.mode != "stream") surl += "&maxmessages=" + this.maxmessages; |
151 |
|
surl += "&persist="+this.persist; |
152 |
|
for (var c in this.channels) { |
153 |
|
surl += "&channel="+c; |
154 |
|
if (this.channels[c].lastmsgreceived > 0) { |
155 |
|
surl += "&restartfrom="+(this.channels[c].lastmsgreceived+1); |
156 |
|
} else if (this.channels[c].backtrack > 0) { |
157 |
|
surl += "&backtrack="+this.channels[c].backtrack; |
158 |
|
} else if (this.channels[c].backtrack < 0 || isNaN(this.channels[c].backtrack)) { |
159 |
|
surl += "&restartfrom="; |
160 |
|
} |
161 |
|
} |
162 |
|
this.subsurl = surl; |
163 |
|
} |
164 |
|
|
165 |
Meteor.prototype.createIframe = function(url) { |
Meteor.prototype.createIframe = function(url) { |
166 |
if (document.all) { |
delete this.transferDoc; |
167 |
|
if (document.all) try { this.transferDoc = new ActiveXObject("htmlfile") } catch(ex) { this.transferDoc = null } |
168 |
|
if (document.all && this.transferDoc) { |
169 |
this.transferDoc = new ActiveXObject("htmlfile"); |
this.transferDoc = new ActiveXObject("htmlfile"); |
170 |
this.transferDoc.open(); |
this.transferDoc.open(); |
171 |
this.transferDoc.write("<html>"); |
this.transferDoc.write("<html>"); |
211 |
document.getElementById("meteorframe_"+this.instID).src="about:blank"; |
document.getElementById("meteorframe_"+this.instID).src="about:blank"; |
212 |
document.body.removeChild(document.getElementById("meteorframe_"+this.instID)); |
document.body.removeChild(document.getElementById("meteorframe_"+this.instID)); |
213 |
} |
} |
214 |
if (!isNaN(this.pingtimer)) clearTimeout(this.pingtimer); |
clearTimeout(this.pingtimer); |
215 |
if (!isNaN(this.updatepollfreqtimer)) clearTimeout(this.updatepollfreqtimer); |
clearTimeout(this.updatepollfreqtimer); |
216 |
if (!isNaN(this.frameloadtimer)) clearTimeout(this.frameloadtimer); |
clearTimeout(this.frameloadtimer); |
217 |
this.setstatus(0); |
this.setstatus(0); |
218 |
} |
} |
219 |
|
|
240 |
while (this.recvtimes.length > 5) this.recvtimes.shift(); |
while (this.recvtimes.length > 5) this.recvtimes.shift(); |
241 |
} |
} |
242 |
} |
} |
243 |
|
this.updateSubsUrl(); |
244 |
this.setstatus(5); |
this.setstatus(5); |
245 |
} |
} |
246 |
|
|