--- googlecode.com/svn/trunk/public_html/meteor.js 2007/10/10 22:18:30 29 +++ googlecode.com/svn/trunk/public_html/meteor.js 2008/02/02 16:49:20 39 @@ -1,351 +1,287 @@ -// Set domain at highest level -var domainparts = document.domain.split("."); -document.domain = domainparts[domainparts.length-2]+"."+domainparts[domainparts.length-1]; - -Function.prototype.bind = function(obj) { - var method = this, - temp = function() { - return method.apply(obj, arguments); - }; - return temp; -} -Function.prototype.andThen=function(g) { - var f=this; - var a=this.arguments - return function(args) { - f(a);g(args); - } -}; - -function Meteor(instID) { - - this.transferDoc = false; - this.pingtimer = false; - this.updatepollfreqtimer = false; - this.lastrequest = 0; - this.recvtimes = []; - this.MHostId = false; - this.callback_process = function() {}; - this.callback_reset = function() {}; - this.callback_eof = function() {}; - this.callback_changemode = function() {}; - this.callback_statuschanged = function() {}; - this.persist = 1; - this.frameloadtimer = false; - this.debugmode = false; - this.subsurl = false; - this.channels = {}; - this.channelcount = 0; - this.streamreq = false; - this.byteoffset = 0; - - // Documented public properties - this.subdomain = "data"; - this.dynamicpageaddress = "push"; - this.smartpoll = 1; - this.pollfreq = 2000; - this.minpollfreq = 2000; - this.mode = "stream"; - this.polltimeout = 30000; - this.pingtimeout = 10000; - this.maxmessages = 0; - this.status = 0; - - /* Statuses: 0 = Uninitialised, - 1 = Loading stream, - 2 = Loading controller frame, - 3 = Controller frame timeout, retrying. - 4 = Controller frame loaded and ready - 5 = Receiving data - */ - - this.instID = (typeof(instID) != "undefined") ? instID : 0; - this.MHostId = Math.floor(Math.random()*100000000)+""+this.instID; -} - -Meteor.instances = new Array(); - -Meteor.create = function(instID) { - if (!instID) instID = Meteor.instances.length; - Meteor.instances[instID] = new Meteor(instID); - return Meteor.instances[instID]; -} - -Meteor.register = function(ifr) { - instid = new String(ifr.window.frameElement.id); - instid = instid.replace(/.*_([0-9]*)$/, "$1"); - ifr.p = this.instances[instid].process.bind(this.instances[instid]); - ifr.r = this.instances[instid].reset.bind(this.instances[instid]); - ifr.eof = this.instances[instid].eof.bind(this.instances[instid]); - ifr.get = this.instances[instid].get.bind(this.instances[instid]); - ifr.increasepolldelay = this.instances[instid].increasepolldelay.bind(this.instances[instid]); - clearTimeout(this.instances[instid].frameloadtimer); - this.instances[instid].setstatus(4); - if (this.debugmode) console.log("Frame registered"); -} - -Meteor.reset = function(ifr) { - instid = new String(ifr.window.frameElement.id); - instid = instid.replace(/.*_([0-9]*)$/, "$1"); - this.instances[instid].reset(); -} - -window.onunload = function() { - for (var i in Meteor.instances) { - if (Meteor.instances[i].transferDoc) delete Meteor.instances[i].transferDoc; - } -} - - -Meteor.prototype.joinChannel = function(channelname, backtrack) { - if (typeof(this.channels[channelname]) != "undefined") throw "Cannot join channel "+channelname+": already subscribed"; - this.channels[channelname] = {backtrack:backtrack, lastmsgreceived:0}; - if (this.debugmode) console.log("Joined channel "+channelname+", channel list follows"); - if (this.debugmode) console.log(this.channels); - if (this.status != 0) this.start(); - this.channelcount++; -} - -Meteor.prototype.leaveChannel = function(channelname) { - if (typeof(this.channels[channelname]) == "undefined") throw "Cannot leave channel "+channelname+": not subscribed"; - delete this.channels[channelname]; - if (this.status != 0) this.start(); - this.channelcount--; -} - -Meteor.prototype.start = function() { - this.persist = (this.persist)?1:0; - this.smartpoll = (this.smartpoll)?1:0; - this.mode = (this.mode=="stream")?"stream":"poll"; - if (!this.subdomain || !this.channelcount) throw "Channel or Meteor subdomain host not specified"; - this.stop(); - var now = new Date(); - var t = now.getTime(); - this.setstatus(1); - this.updateSubsUrl(); - if (this.mode=="stream") { - if (document.all) { - this.createIframe(this.subsurl); - } else { - this.createIframe("http://"+this.subdomain+"."+location.hostname+"/stream.html"); - } - var f = this.pollmode.bind(this); - clearTimeout(this.pingtimer); - this.pingtimer = setTimeout(f, this.pingtimeout); - - } else { - this.createIframe("http://"+this.subdomain+"."+location.hostname+"/poll.html?nc="+t); - this.recvtimes[0] = t; - if (this.updatepollfreqtimer) clearTimeout(this.updatepollfreqtimer); - this.updatepollfreqtimer = setInterval(this.updatepollfreq.bind(this), 2500); - } - this.lastrequest = t; -} - -Meteor.prototype.updateSubsUrl = function() { - - // If streaming or long polling, connection should persist - this.persist = (this.mode == "stream" || (this.mode=='poll' && this.maxmessages > 0)) ? 1 : 0; - var surl = "http://" + this.subdomain + "." + location.hostname + "/" + this.dynamicpageaddress + "?id=" + this.MHostId; - if (this.persist && this.mode != "stream") surl += "&maxmessages=" + this.maxmessages; - surl += "&persist="+this.persist; - for (var c in this.channels) { - surl += "&channel="+c; - if (this.channels[c].lastmsgreceived > 0) { - surl += "&restartfrom="+(this.channels[c].lastmsgreceived+1); - } 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; -} - -Meteor.prototype.createIframe = function(url) { - delete this.transferDoc; - if (document.all) try { this.transferDoc = new ActiveXObject("htmlfile") } catch(ex) { this.transferDoc = null } - if (document.all && this.transferDoc) { - this.transferDoc = new ActiveXObject("htmlfile"); - this.transferDoc.open(); - this.transferDoc.write(""); - this.transferDoc.write("