-
-
Save Raynos/ba403a6d2c9b2c0d551c to your computer and use it in GitHub Desktop.
engine.io client & server example with relay
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var url = require("url") | |
var EngineServer = require("engine.io").Server | |
var WebSocketStream = require("websocket-stream") | |
module.exports = createEngineServer | |
function createEngineServer(socketListener) { | |
var engineServer = new EngineServer() | |
engineServer.on("connection", function engineHandler(socket) { | |
var stream = WebSocketStream(socket) | |
stream.uri = url.parse(socket.request.url, true).query.uri | |
socketListener(stream, socket.request) | |
}) | |
return engineServer | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(){function $require(p,parent,orig){var path=$require.resolve(p),mod=$require.modules[path];if(null==path){orig=orig||p;parent=parent||"root";throw new Error('failed to $require "'+orig+'" from "'+parent+'"');}if(!mod.exports){mod.exports={};mod.client=mod.component=true;mod.call(this,mod,mod.exports,$require.relative(path))}return mod.exports}$require.modules={};$require.aliases={};$require.resolve=function(path){var orig=path,reg=path+".js",regJSON=path+".json",index=path+"/index.js",indexJSON= | |
path+"/index.json";return $require.modules[reg]&®||$require.modules[regJSON]&®JSON||$require.modules[index]&&index||$require.modules[indexJSON]&&indexJSON||$require.modules[orig]&&orig||$require.aliases[index]};$require.normalize=function(curr,path){var segs=[];if("."!=path.charAt(0))return path;curr=curr.split("/");path=path.split("/");for(var i=0;i<path.length;++i)if(".."==path[i])curr.pop();else if("."!=path[i]&&""!=path[i])segs.push(path[i]);return curr.concat(segs).join("/")};$require.register= | |
function(path,fn){$require.modules[path]=fn};$require.alias=function(from,to){var fn=$require.modules[from];if(!fn)throw new Error('failed to alias "'+from+'", it does not exist');$require.aliases[to]=from};$require.relative=function(parent){var p=$require.normalize(parent,"..");function lastIndexOf(arr,obj){var i=arr.length;while(i--)if(arr[i]===obj)return i;return-1}function fn(path){var orig=path;path=fn.resolve(path);return $require(path,parent,orig)}fn.resolve=function(path){if("."!=path.charAt(0)){var segs= | |
parent.split("/");var i=lastIndexOf(segs,"deps")+1;if(!i)i=0;path=segs.slice(0,i+1).join("/")+"/deps/"+path;return path}return $require.normalize(p,path)};fn.exists=function(path){return!!$require.modules[fn.resolve(path)]};return fn};$require.register("component-emitter/index.js",function(module,exports,$require){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype)obj[key]=Emitter.prototype[key];return obj}Emitter.prototype.on= | |
function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}fn._off=on;this.on(event,on);return this};Emitter.prototype.off=function(event,fn){this._callbacks=this._callbacks||{};var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event]; | |
return this}var i=callbacks.indexOf(fn._off||fn);if(~i)callbacks.splice(i,1);return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i)callbacks[i].apply(this,args)}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners= | |
function(event){return!!this.listeners(event).length}});$require.register("LearnBoost-engine.io-protocol/lib/index.js",function(module,exports,$require){var keys=$require("./keys");var packets=exports.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6};var packetslist=keys(packets);var err={type:"error",data:"parser error"};exports.encodePacket=function(packet){var encoded=packets[packet.type];if(undefined!==packet.data)encoded+=String(packet.data);return""+encoded};exports.decodePacket= | |
function(data){var type=data.charAt(0);if(Number(type)!=type||!packetslist[type])return err;if(data.length>1)return{type:packetslist[type],data:data.substring(1)};else return{type:packetslist[type]}};exports.encodePayload=function(packets){if(!packets.length)return"0:";var encoded="",message;for(var i=0,l=packets.length;i<l;i++){message=exports.encodePacket(packets[i]);encoded+=message.length+":"+message}return encoded};exports.decodePayload=function(data){if(data=="")return[err];var packets=[],length= | |
"",n,msg,packet;for(var i=0,l=data.length;i<l;i++){var chr=data.charAt(i);if(":"!=chr)length+=chr;else{if(""==length||length!=(n=Number(length)))return[err];msg=data.substr(i+1,n);if(length!=msg.length)return[err];if(msg.length){packet=exports.decodePacket(msg);if(err.type==packet.type&&err.data==packet.data)return[err];packets.push(packet)}i+=n;length=""}}if(length!="")return[err];return packets}});$require.register("LearnBoost-engine.io-protocol/lib/keys.js",function(module,exports,$require){module.exports= | |
Object.keys||function keys(obj){var arr=[];var has=Object.prototype.hasOwnProperty;for(var i in obj)if(has.call(obj,i))arr.push(i);return arr}});$require.register("visionmedia-debug/index.js",function(module,exports,$require){if("undefined"==typeof window)module.exports=$require("./lib/debug");else module.exports=$require("./debug")});$require.register("visionmedia-debug/debug.js",function(module,exports,$require){module.exports=debug;function debug(name){if(!debug.enabled(name))return function(){}; | |
return function(fmt){var curr=new Date;var ms=curr-(debug[name]||curr);debug[name]=curr;fmt=name+" "+fmt+" +"+debug.humanize(ms);window.console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}}debug.names=[];debug.skips=[];debug.enable=function(name){localStorage.debug=name;var split=(name||"").split(/[\s,]+/),len=split.length;for(var i=0;i<len;i++){name=split[i].replace("*",".*?");if(name[0]==="-")debug.skips.push(new RegExp("^"+name.substr(1)+"$"));else debug.names.push(new RegExp("^"+ | |
name+"$"))}};debug.disable=function(){debug.enable("")};debug.humanize=function(ms){var sec=1E3,min=60*1E3,hour=60*min;if(ms>=hour)return(ms/hour).toFixed(1)+"h";if(ms>=min)return(ms/min).toFixed(1)+"m";if(ms>=sec)return(ms/sec|0)+"s";return ms+"ms"};debug.enabled=function(name){for(var i=0,len=debug.skips.length;i<len;i++)if(debug.skips[i].test(name))return false;for(var i=0,len=debug.names.length;i<len;i++)if(debug.names[i].test(name))return true;return false};if(window.localStorage)debug.enable(localStorage.debug)}); | |
$require.register("engine.io/lib/index.js",function(module,exports,$require){module.exports=$require("./socket");module.exports.parser=$require("engine.io-parser")});$require.register("engine.io/lib/socket.js",function(module,exports,$require){var util=$require("./util"),transports=$require("./transports"),Emitter=$require("./emitter"),debug=$require("debug")("engine-client:socket");module.exports=Socket;var global=util.global();function Socket(uri,opts){if(!(this instanceof Socket))return new Socket(uri, | |
opts);opts=opts||{};if("object"==typeof uri){opts=uri;uri=null}if(uri){uri=util.parseUri(uri);opts.host=uri.host;opts.secure=uri.protocol=="https"||uri.protocol=="wss";opts.port=uri.port}this.secure=null!=opts.secure?opts.secure:global.location&&"https:"==location.protocol;if(opts.host){var pieces=opts.host.split(":");opts.hostname=pieces.shift();if(pieces.length)opts.port=pieces.pop()}this.hostname=opts.hostname||(global.location?location.hostname:"localhost");this.port=opts.port||(global.location&& | |
location.port?location.port:this.secure?443:80);this.query=opts.query||{};this.upgrade=false!==opts.upgrade;this.path=(opts.path||"/engine.io").replace(/\/$/,"")+"/";this.forceJSONP=!!opts.forceJSONP;this.timestampParam=opts.timestampParam||"t";this.timestampRequests=!!opts.timestampRequests;this.flashPath=opts.flashPath||"";this.transports=opts.transports||["polling","websocket","flashsocket"];this.readyState="";this.writeBuffer=[];this.policyPort=opts.policyPort||843;this.open();Socket.sockets.push(this); | |
Socket.sockets.evs.emit("add",this)}Emitter(Socket.prototype);Socket.protocol=1;Socket.sockets=[];Socket.sockets.evs=new Emitter;Socket.Socket=Socket;Socket.Transport=$require("./transport");Socket.Emitter=$require("./emitter");Socket.transports=$require("./transports");Socket.util=$require("./util");Socket.parser=$require("engine.io-parser");Socket.prototype.createTransport=function(name){debug('creating transport "%s"',name);var query=clone(this.query);query.transport=name;if(this.id)query.sid= | |
this.id;var transport=new transports[name]({hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:query,forceJSONP:this.forceJSONP,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,flashPath:this.flashPath,policyPort:this.policyPort});return transport};function clone(obj){var o={};for(var i in obj)if(obj.hasOwnProperty(i))o[i]=obj[i];return o}Socket.prototype.open=function(){this.readyState="opening";var transport=this.createTransport(this.transports[0]); | |
transport.open();this.setTransport(transport)};Socket.prototype.setTransport=function(transport){var self=this;if(this.transport){debug("clearing existing transport");this.transport.removeAllListeners()}this.transport=transport;transport.on("drain",function(){self.flush()}).on("packet",function(packet){self.onPacket(packet)}).on("error",function(e){self.onError(e)}).on("close",function(){self.onClose("transport close")})};Socket.prototype.probe=function(name){debug('probing transport "%s"',name); | |
var transport=this.createTransport(name,{probe:1}),failed=false,self=this;transport.once("open",function(){if(failed)return;debug('probe transport "%s" opened',name);transport.send([{type:"ping",data:"probe"}]);transport.once("packet",function(msg){if(failed)return;if("pong"==msg.type&&"probe"==msg.data){debug('probe transport "%s" pong',name);self.upgrading=true;self.emit("upgrading",transport);debug('pausing current transport "%s"',self.transport.name);self.transport.pause(function(){if(failed)return; | |
if("closed"==self.readyState||"closing"==self.readyState)return;debug("changing transport and sending upgrade packet");transport.removeListener("error",onerror);self.emit("upgrade",transport);self.setTransport(transport);transport.send([{type:"upgrade"}]);transport=null;self.upgrading=false;self.flush()})}else{debug('probe transport "%s" failed',name);var err=new Error("probe error");err.transport=transport.name;self.emit("error",err)}})});transport.once("error",onerror);function onerror(err){if(failed)return; | |
failed=true;var error=new Error("probe error: "+err);error.transport=transport.name;transport.close();transport=null;debug('probe transport "%s" failed because of error: %s',name,err);self.emit("error",error)}transport.open();this.once("close",function(){if(transport){debug("socket closed prematurely - aborting probe");failed=true;transport.close();transport=null}});this.once("upgrading",function(to){if(transport&&to.name!=transport.name){debug('"%s" works - aborting "%s"',to.name,transport.name); | |
transport.close();transport=null}})};Socket.prototype.onOpen=function(){debug("socket open");this.readyState="open";this.emit("open");this.onopen&&this.onopen.call(this);this.flush();if("open"==this.readyState&&this.upgrade&&this.transport.pause){debug("starting upgrade probes");for(var i=0,l=this.upgrades.length;i<l;i++)this.probe(this.upgrades[i])}};Socket.prototype.onPacket=function(packet){if("opening"==this.readyState||"open"==this.readyState){debug('socket receive: type "%s", data "%s"',packet.type, | |
packet.data);this.emit("packet",packet);this.emit("heartbeat");switch(packet.type){case "open":this.onHandshake(util.parseJSON(packet.data));break;case "pong":this.ping();break;case "error":var err=new Error("server error");err.code=packet.data;this.emit("error",err);break;case "message":this.emit("data",packet.data);this.emit("message",packet.data);var event={data:packet.data};event.toString=function(){return packet.data};this.onmessage&&this.onmessage.call(this,event);break}}else debug('packet received with socket readyState "%s"', | |
this.readyState)};Socket.prototype.onHandshake=function(data){this.emit("handshake",data);this.id=data.sid;this.transport.query.sid=data.sid;this.upgrades=this.filterUpgrades(data.upgrades);this.pingInterval=data.pingInterval;this.pingTimeout=data.pingTimeout;this.onOpen();this.ping();this.removeListener("heartbeat",this.onHeartbeat);this.on("heartbeat",this.onHeartbeat)};Socket.prototype.onHeartbeat=function(timeout){clearTimeout(this.pingTimeoutTimer);var self=this;self.pingTimeoutTimer=setTimeout(function(){if("closed"== | |
self.readyState)return;self.onClose("ping timeout")},timeout||self.pingInterval+self.pingTimeout)};Socket.prototype.ping=function(){var self=this;clearTimeout(self.pingIntervalTimer);self.pingIntervalTimer=setTimeout(function(){debug("writing ping packet - expecting pong within %sms",self.pingTimeout);self.sendPacket("ping");self.onHeartbeat(self.pingTimeout)},self.pingInterval)};Socket.prototype.flush=function(){if("closed"!=this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){debug("flushing %d packets in socket", | |
this.writeBuffer.length);this.transport.send(this.writeBuffer);this.writeBuffer=[]}};Socket.prototype.write=Socket.prototype.send=function(msg){this.sendPacket("message",msg);return this};Socket.prototype.sendPacket=function(type,data){var packet={type:type,data:data};this.emit("packetCreate",packet);this.writeBuffer.push(packet);this.flush()};Socket.prototype.close=function(){if("opening"==this.readyState||"open"==this.readyState){this.onClose("forced close");debug("socket closing - telling transport to close"); | |
this.transport.close();this.transport.removeAllListeners()}return this};Socket.prototype.onError=function(err){debug("socket error %j",err);this.emit("error",err);this.onClose("transport error",err)};Socket.prototype.onClose=function(reason,desc){if("opening"==this.readyState||"open"==this.readyState){debug('socket close with reason: "%s"',reason);clearTimeout(this.pingIntervalTimer);clearTimeout(this.pingTimeoutTimer);this.readyState="closed";this.emit("close",reason,desc);this.onclose&&this.onclose.call(this); | |
this.id=null}};Socket.prototype.filterUpgrades=function(upgrades){var filteredUpgrades=[];for(var i=0,j=upgrades.length;i<j;i++)if(~this.transports.indexOf(upgrades[i]))filteredUpgrades.push(upgrades[i]);return filteredUpgrades}});$require.register("engine.io/lib/transport.js",function(module,exports,$require){var util=$require("./util"),parser=$require("engine.io-parser"),Emitter=$require("./emitter");module.exports=Transport;function Transport(opts){this.path=opts.path;this.hostname=opts.hostname; | |
this.port=opts.port;this.secure=opts.secure;this.query=opts.query;this.timestampParam=opts.timestampParam;this.timestampRequests=opts.timestampRequests;this.readyState=""}Emitter(Transport.prototype);Transport.prototype.onError=function(msg,desc){var err=new Error(msg);err.type="TransportError";err.description=desc;this.emit("error",err);return this};Transport.prototype.open=function(){if("closed"==this.readyState||""==this.readyState){this.readyState="opening";this.doOpen()}return this};Transport.prototype.close= | |
function(){if("opening"==this.readyState||"open"==this.readyState){this.doClose();this.onClose()}return this};Transport.prototype.send=function(packets){if("open"==this.readyState)this.write(packets);else throw new Error("Transport not open");};Transport.prototype.onOpen=function(){this.readyState="open";this.writable=true;this.emit("open")};Transport.prototype.onData=function(data){this.onPacket(parser.decodePacket(data))};Transport.prototype.onPacket=function(packet){this.emit("packet",packet)}; | |
Transport.prototype.onClose=function(){this.readyState="closed";this.emit("close")}});$require.register("engine.io/lib/emitter.js",function(module,exports,$require){var Emitter;try{Emitter=$require("emitter")}catch(e){Emitter=$require("emitter-component")}module.exports=Emitter;Emitter.prototype.addEventListener=Emitter.prototype.on;Emitter.prototype.removeEventListener=Emitter.prototype.off;Emitter.prototype.removeListener=Emitter.prototype.off;Emitter.prototype.removeAllListeners=function(){this._callbacks= | |
{}}});$require.register("engine.io/lib/util.js",function(module,exports,$require){var pageLoaded=false;exports.global=function(){return"undefined"!=typeof window?window:global};exports.inherits=function inherits(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c};exports.keys=Object.keys||function(obj){var ret=[];var has=Object.prototype.hasOwnProperty;for(var i in obj)if(has.call(obj,i))ret.push(i);return ret};exports.on=function(element,event,fn,capture){if(element.attachEvent)element.attachEvent("on"+ | |
event,fn);else if(element.addEventListener)element.addEventListener(event,fn,capture)};exports.load=function(fn){var global=exports.global();if(global.document&&document.readyState==="complete"||pageLoaded)return fn();exports.on(global,"load",fn,false)};if("undefined"!=typeof window)exports.load(function(){pageLoaded=true});exports.defer=function(fn){if(!exports.ua.webkit||"undefined"!=typeof importScripts)return fn();exports.load(function(){setTimeout(fn,100)})};var rvalidchars=/^[\],:{}\s]*$/,rvalidescape= | |
/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,rtrimLeft=/^\s+/,rtrimRight=/\s+$/;exports.parseJSON=function(data){var global=exports.global();if("string"!=typeof data||!data)return null;data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse)return JSON.parse(data);if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,"")))return(new Function("return "+ | |
data))()};exports.ua={};exports.ua.hasCORS="undefined"!=typeof XMLHttpRequest&&function(){try{var a=new XMLHttpRequest}catch(e){return false}return a.withCredentials!=undefined}();exports.ua.webkit="undefined"!=typeof navigator&&/webkit/i.test(navigator.userAgent);exports.ua.gecko="undefined"!=typeof navigator&&/gecko/i.test(navigator.userAgent);exports.ua.android="undefined"!=typeof navigator&&/android/i.test(navigator.userAgent);exports.ua.ios="undefined"!=typeof navigator&&/^(iPad|iPhone|iPod)$/.test(navigator.platform); | |
exports.ua.ios6=exports.ua.ios&&/OS 6_/.test(navigator.userAgent);exports.request=function request(xdomain){if("undefined"==typeof window){var _XMLHttpRequest=$require("xmlhttprequest").XMLHttpRequest;return new _XMLHttpRequest}if(xdomain&&"undefined"!=typeof XDomainRequest&&!exports.ua.hasCORS)return new XDomainRequest;try{if("undefined"!=typeof XMLHttpRequest&&(!xdomain||exports.ua.hasCORS))return new XMLHttpRequest}catch(e){}if(!xdomain)try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}; | |
var re=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;var parts=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];exports.parseUri=function(str){var m=re.exec(str||""),uri={},i=14;while(i--)uri[parts[i]]=m[i]||"";return uri};exports.qs=function(obj){var str="";for(var i in obj)if(obj.hasOwnProperty(i)){if(str.length)str+= | |
"&";str+=i+"="+encodeURIComponent(obj[i])}return str}});$require.register("engine.io/lib/transports/index.js",function(module,exports,$require){var XHR=$require("./polling-xhr"),JSONP=$require("./polling-jsonp"),websocket=$require("./websocket"),flashsocket=$require("./flashsocket"),util=$require("../util");exports.polling=polling;exports.websocket=websocket;exports.flashsocket=flashsocket;var global=util.global();function polling(opts){var xhr,xd=false,isXProtocol=false;if(global.location){var isSSL= | |
"https:"==location.protocol;var port=location.port;if(Number(port)!=port)port=isSSL?443:80;xd=opts.host!=location.hostname||port!=opts.port;isXProtocol=opts.secure!=isSSL}xhr=util.request(xd);if(isXProtocol&&global.XDomainRequest&&xhr instanceof global.XDomainRequest)return new JSONP(opts);if(xhr&&!opts.forceJSONP)return new XHR(opts);else return new JSONP(opts)}});$require.register("engine.io/lib/transports/polling.js",function(module,exports,$require){var Transport=$require("../transport"),util= | |
$require("../util"),parser=$require("engine.io-parser"),debug=$require("debug")("engine.io-client:polling");module.exports=Polling;var global=util.global();function Polling(opts){Transport.call(this,opts)}util.inherits(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling|| | |
!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else pause()};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData= | |
function(data){debug("polling got data %s",data);var packets=parser.decodePayload(data);for(var i=0,l=packets.length;i<l;i++){if("opening"==this.readyState)this.onOpen();if("close"==packets[i].type){this.onClose();return}this.onPacket(packets[i])}this.polling=false;this.emit("pollComplete");if("open"==this.readyState)this.poll();else debug('ignoring poll - transport state "%s"',this.readyState)};Polling.prototype.doClose=function(){debug("sending close packet");this.send([{type:"close"}])};Polling.prototype.write= | |
function(packets){var self=this;this.writable=false;this.doWrite(parser.encodePayload(packets),function(){self.writable=true;self.emit("drain")})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(global.ActiveXObject||util.ua.android||util.ua.ios6||this.timestampRequests)query[this.timestampParam]=+new Date;query=util.qs(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80))port=":"+this.port;if(query.length)query= | |
"?"+query;return schema+"://"+this.hostname+port+this.path+query}});$require.register("engine.io/lib/transports/polling-xhr.js",function(module,exports,$require){var Polling=$require("./polling"),util=$require("../util"),Emitter=$require("../emitter"),debug=$require("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;var global=util.global();var xobject=global[["Active"].concat("Object").join("X")];function empty(){}function XHR(opts){Polling.call(this,opts); | |
if(global.location)this.xd=opts.host!=global.location.hostname||global.location.port!=opts.port}util.inherits(XHR,Polling);XHR.prototype.doOpen=function(){var self=this;util.defer(function(){Polling.prototype.doOpen.call(self)})};XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var req=this.request({method:"POST",data:data});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error", | |
err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var xhr=this.xhr= | |
util.request(this.xd);var self=this;xhr.open(this.method,this.uri,this.async);if("POST"==this.method)try{if(xhr.setRequestHeader)xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8");else xhr.contentType="text/plain"}catch(e){}if(this.xd&&global.XDomainRequest&&xhr instanceof XDomainRequest){xhr.onerror=function(e){self.onError(e)};xhr.onload=function(){self.onData(xhr.responseText)};xhr.onprogress=empty}else{if("withCredentials"in xhr)xhr.withCredentials=true;xhr.onreadystatechange=function(){var data; | |
try{if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status)data=xhr.responseText;else self.onError(xhr.status)}catch(e){self.onError(e)}if(undefined!==data)self.onData(data)}}debug("sending xhr with url %s | data %s",this.uri,this.data);xhr.send(this.data);if(xobject){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()}; | |
Request.prototype.onError=function(err){this.emit("error",err);this.cleanup()};Request.prototype.cleanup=function(){this.xhr.onreadystatechange=empty;this.xhr.onload=this.xhr.onerror=empty;try{this.xhr.abort()}catch(e){}if(xobject)delete Request.requests[this.index];this.xhr=null};Request.prototype.abort=function(){this.cleanup()};if(xobject){Request.requestsCount=0;Request.requests={};global.attachEvent("onunload",function(){for(var i in Request.requests)if(Request.requests.hasOwnProperty(i))Request.requests[i].abort()})}}); | |
$require.register("engine.io/lib/transports/polling-jsonp.js",function(module,exports,$require){var Polling=$require("./polling"),util=$require("../util");module.exports=JSONPPolling;var global=util.global();var rNewline=/\n/g;var callbacks;var index=0;function empty(){}function JSONPPolling(opts){Polling.call(this,opts);if(!callbacks){if(!global.___eio)global.___eio=[];callbacks=global.___eio}this.index=callbacks.length;var self=this;callbacks.push(function(msg){self.onData(msg)});this.query.j=this.index} | |
util.inherits(JSONPPolling,Polling);JSONPPolling.prototype.doOpen=function(){var self=this;util.defer(function(){Polling.prototype.doOpen.call(self)})};JSONPPolling.prototype.doClose=function(){if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}if(this.form){this.form.parentNode.removeChild(this.form);this.form=null}Polling.prototype.doClose.call(this)};JSONPPolling.prototype.doPoll=function(){var script=document.createElement("script");if(this.script){this.script.parentNode.removeChild(this.script); | |
this.script=null}script.async=true;script.src=this.uri();var insertAt=document.getElementsByTagName("script")[0];insertAt.parentNode.insertBefore(script,insertAt);this.script=script;if(util.ua.gecko)setTimeout(function(){var iframe=document.createElement("iframe");document.body.appendChild(iframe);document.body.removeChild(iframe)},100)};JSONPPolling.prototype.doWrite=function(data,fn){var self=this;if(!this.form){var form=document.createElement("form");var area=document.createElement("textarea"); | |
var id=this.iframeId="eio_iframe_"+this.index;var iframe;form.className="socketio";form.style.position="absolute";form.style.top="-1000px";form.style.left="-1000px";form.target=id;form.method="POST";form.setAttribute("accept-charset","utf-8");area.name="d";form.appendChild(area);document.body.appendChild(form);this.form=form;this.area=area}this.form.action=this.uri();function complete(){initIframe();fn()}function initIframe(){if(self.iframe)try{self.form.removeChild(self.iframe)}catch(e){self.onError("jsonp polling iframe removal error", | |
e)}try{var html='<iframe src="javascript:0" name="'+self.iframeId+'">';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent)this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete")complete()};else this.iframe.onload= | |
complete}});$require.register("engine.io/lib/transports/websocket.js",function(module,exports,$require){var Transport=$require("../transport"),parser=$require("engine.io-parser"),util=$require("../util"),debug=$require("debug")("engine.io-client:websocket");module.exports=WS;var global=util.global();function WS(opts){Transport.call(this,opts)}util.inherits(WS,Transport);WS.prototype.name="websocket";WS.prototype.doOpen=function(){if(!this.check())return;var self=this;this.socket=new (ws())(this.uri()); | |
this.socket.onopen=function(){self.onOpen()};this.socket.onclose=function(){self.onClose()};this.socket.onmessage=function(ev){self.onData(ev.data)};this.socket.onerror=function(e){self.onError("websocket error",e)}};WS.prototype.write=function(packets){for(var i=0,l=packets.length;i<l;i++)this.socket.send(parser.encodePacket(packets[i]))};WS.prototype.doClose=function(){if(typeof this.socket!=="undefined")this.socket.close()};WS.prototype.uri=function(){var query=this.query||{};var schema=this.secure? | |
"wss":"ws";var port="";if(this.port&&("wss"==schema&&this.port!=443||"ws"==schema&&this.port!=80))port=":"+this.port;if(this.timestampRequests)query[this.timestampParam]=+new Date;query=util.qs(query);if(query.length)query="?"+query;return schema+"://"+this.hostname+port+this.path+query};WS.prototype.check=function(){var websocket=ws();return!!websocket&&!("__initialize"in websocket&&this.name===WS.prototype.name)};function ws(){if("undefined"==typeof window)return $require("ws");return global.WebSocket|| | |
global.MozWebSocket}});$require.register("engine.io/lib/transports/flashsocket.js",function(module,exports,$require){var WS=$require("./websocket"),util=$require("../util"),debug=$require("debug")("engine.io-client:flashsocket");module.exports=FlashWS;var global=util.global();var xobject=global[["Active"].concat("Object").join("X")];function FlashWS(options){WS.call(this,options);this.flashPath=options.flashPath;this.policyPort=options.policyPort}util.inherits(FlashWS,WS);FlashWS.prototype.name="flashsocket"; | |
FlashWS.prototype.doOpen=function(){if(!this.check())return;function log(type){return function(){var str=Array.prototype.join.call(arguments," ");debug("[websocketjs %s] %s",type,str)}}WEB_SOCKET_LOGGER={log:log("debug"),error:log("error")};WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR=true;WEB_SOCKET_DISABLE_AUTO_INITIALIZATION=true;if("undefined"==typeof WEB_SOCKET_SWF_LOCATION)WEB_SOCKET_SWF_LOCATION=this.flashPath+"WebSocketMainInsecure.swf";var deps=[this.flashPath+"web_socket.js"];if("undefined"== | |
typeof swfobject)deps.unshift(this.flashPath+"swfobject.js");var self=this;load(deps,function(){self.ready(function(){WebSocket.__addTask(function(){WS.prototype.doOpen.call(self)})})})};FlashWS.prototype.doClose=function(){if(!this.socket)return;var self=this;WebSocket.__addTask(function(){WS.prototype.doClose.call(self)})};FlashWS.prototype.write=function(){var self=this,args=arguments;WebSocket.__addTask(function(){WS.prototype.write.apply(self,args)})};FlashWS.prototype.ready=function(fn){if(typeof WebSocket== | |
"undefined"||!("__initialize"in WebSocket)||!swfobject)return;if(swfobject.getFlashPlayerVersion().major<10)return;function init(){if(!FlashWS.loaded){if(843!=self.policyPort)WebSocket.loadFlashPolicyFile("xmlsocket://"+self.host+":"+self.policyPort);WebSocket.__initialize();FlashWS.loaded=true}fn.call(self)}var self=this;if(document.body)return init();util.load(init)};FlashWS.prototype.check=function(){if("undefined"==typeof window)return false;if(typeof WebSocket!="undefined"&&!("__initialize"in | |
WebSocket))return false;if(xobject){var control=null;try{control=new xobject("ShockwaveFlash.ShockwaveFlash")}catch(e){}if(control)return true}else for(var i=0,l=navigator.plugins.length;i<l;i++)for(var j=0,m=navigator.plugins[i].length;j<m;j++)if(navigator.plugins[i][j].description=="Shockwave Flash")return true;return false};var scripts={};function create(path,fn){if(scripts[path])return fn();var el=document.createElement("script");var loaded=false;debug('loading "%s"',path);el.onload=el.onreadystatechange= | |
function(){if(loaded||scripts[path])return;var rs=el.readyState;if(!rs||"loaded"==rs||"complete"==rs){debug('loaded "%s"',path);el.onload=el.onreadystatechange=null;loaded=true;scripts[path]=true;fn()}};el.async=1;el.src=path;var head=document.getElementsByTagName("head")[0];head.insertBefore(el,head.firstChild)}function load(arr,fn){function process(i){if(!arr[i])return fn();create(arr[i],function(){process(++i)})}process(0)}});$require.alias("component-emitter/index.js","engine.io/deps/emitter/index.js"); | |
$require.alias("LearnBoost-engine.io-protocol/lib/index.js","engine.io/deps/engine.io-parser/lib/index.js");$require.alias("LearnBoost-engine.io-protocol/lib/keys.js","engine.io/deps/engine.io-parser/lib/keys.js");$require.alias("LearnBoost-engine.io-protocol/lib/index.js","engine.io/deps/engine.io-parser/index.js");$require.alias("visionmedia-debug/index.js","engine.io/deps/debug/index.js");$require.alias("visionmedia-debug/debug.js","engine.io/deps/debug/debug.js");$require.alias("engine.io/lib/index.js", | |
"engine.io/index.js");if("undefined"==typeof module)window.eio=$require("engine.io");else module.exports=$require("engine.io")})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var WebSocketStream = require("websocket-stream") | |
var split = require("split") | |
var through = require("through") | |
var location = require("global/window").location | |
var EngineIOClient = require("./engine.io-client") | |
module.exports = RelayClient | |
function RelayClient(uri) { | |
var socket = EngineIOClient("ws://" + location.host, { | |
transports: ["polling", "websocket"], | |
path: "/relay/engine.io", | |
query: { uri: uri } | |
}) | |
// socket.on("open", function () { | |
// console.log("OPEN SOCKET") | |
// }) | |
// socket.on("close", function () { | |
// console.log("CLOSED SOCKET") | |
// }) | |
// socket.on("end", function () { | |
// console.log("ENDED SOCKET") | |
// }) | |
return WebSocketStream(socket) | |
.pipe(split()) | |
.pipe(through(function (chunk) { | |
if (chunk === "") { | |
return | |
} | |
this.push(JSON.parse(String(chunk))) | |
})) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment