// Copyright (c) 2004 Friendster Inc., Licensed under the Academic Free // License version 2.0 or later dojo.require("dojo.event.*"); dojo.require("dojo.io.BrowserIO"); dojo.provide("dojo.io.RepubsubIO"); dojo.io.repubsubTranport = new function(){ var rps = dojo.io.repubsub; this.canHandle = function(/*dojo.io.Request*/kwArgs){ //summary: Tells dojo.io.bind() if this is a good transport to //use for the particular type of request. This is a legacy transport //and should not be used unless you are dealing with repubsub. //Consider a comet transport instead. if((kwArgs["mimetype"] == "text/javascript")&&(kwArgs["method"] == "repubsub")){ return true; } return false; } this.bind = function(/*dojo.io.Request*/kwArgs){ //summary: This is a legacy transport and should not be used unless you are dealing with repubsub. //Consider a comet transport instead. if(!rps.isInitialized){ // open up our tunnel, queue up requests anyway rps.init(); } // FIXME: we need to turn this into a topic subscription // var tgtURL = kwArgs.url+"?"+dojo.io.argsFromMap(kwArgs.content); // sampleTransport.sendRequest(tgtURL, hdlrFunc); // a normal "bind()" call in a request-response transport layer is // something that (usually) encodes most of it's payload with the // request. Multi-event systems like repubsub are a bit more complex, // and repubsub in particular distinguishes the publish and subscribe // portions of thep rocess with different method calls to handle each. // Therefore, a "bind" in the sense of repubsub must first determine if // we have an open subscription to a channel provided by the server, // and then "publish" the request payload if there is any. We therefore // must take care not to incorrectly or too agressively register or // file event handlers which are provided with the kwArgs method. // NOTE: we ONLY pay attention to those event handlers that are // registered with the bind request that subscribes to the channel. If // event handlers are provided with subsequent requests, we might in // the future support some additive or replacement syntax, but for now // they get dropped on the floor. // NOTE: in this case, url MUST be the "topic" to which we // subscribe/publish for this channel if(!rps.topics[kwArgs.url]){ kwArgs.rpsLoad = function(evt){ kwArgs.load("load", evt); } rps.subscribe(kwArgs.url, kwArgs, "rpsLoad"); } if(kwArgs["content"]){ // what we wanted to send var cEvt = dojo.io.repubsubEvent.initFromProperties(kwArgs.content); rps.publish(kwArgs.url, cEvt); } } dojo.io.transports.addTransport("repubsubTranport"); } dojo.io.repubsub = new function(){ this.initDoc = "init.html"; this.isInitialized = false; this.subscriptionBacklog = []; this.debug = true; this.rcvNodeName = null; this.sndNodeName = null; this.rcvNode = null; this.sndNode = null; this.canRcv = false; this.canSnd = false; this.canLog = false; this.sndTimer = null; this.windowRef = window; this.backlog = []; this.tunnelInitCount = 0; this.tunnelFrameKey = "tunnel_frame"; this.serverBaseURL = location.protocol+"//"+location.host+location.pathname; this.logBacklog = []; this.getRandStr = function(){ return Math.random().toString().substring(2, 10); } this.userid = "guest"; this.tunnelID = this.getRandStr(); this.attachPathList = []; this.topics = []; // list of topics we have listeners to // actually, now that I think about it a little bit more, it would sure be // useful to parse out the