Skip to content

Instantly share code, notes, and snippets.

@cathylill
Created July 22, 2014 06:43
Show Gist options
  • Save cathylill/7c43f98e90b29a03f7ee to your computer and use it in GitHub Desktop.
Save cathylill/7c43f98e90b29a03f7ee to your computer and use it in GitHub Desktop.
requirebin sketch
var quickconnect = require('rtc-quickconnect');
var console = require('demo-console');
quickconnect('http://rtc.io/switchboard/', { room: 'qc-simple-demo' })
.on('call:started', function(id, pc, data) {
console.log('we have a new connection to: ' + id);
});
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({R7XjId:[function(require,module,exports){"use strict";var reSpace=/\s/;var theme;var items;var themes={simple:'div.democonsole {\n position: absolute;\n bottom: 20px;\n left: 0px;\n z-index: 100;\n\n height: 30%;\n width: 100%;\n\n font-family: monospace;\n overflow-y: auto;\n}\n\ndiv.democonsole ul {\n margin: 0;\n padding: 6px;\n list-style-type: none;\n}\n\ndiv.democonsole ul li {\n padding-left: 14px;\n margin-bottom: 5px;\n display: flex;\n}\n\ndiv.democonsole ul li:before {\n color: #888;\n content: \'>\';\n font-weight: bold;\n position: absolute;\n margin-left: -14px;\n}\n\ndiv.democonsole ul li > * {\n margin-right: 8px;\n}\n\ndiv.democonsole ul li.error:before {\n content: \'!\';\n}\n\nspan[data-type=""] {\n font-weight: bold;\n}\n\nspan[data-type="number"], span[data-type="boolean"] {\n color: navy;\n}\n\nspan[data-type="string"] {\n color: green;\n white-space: pre;\n}\n\nspan[data-type="key"] {\n vertical-align: top;\n}\n\nspan[data-type="error"] {\n color: red;\n}\n\ndiv[data-type="object"] {\n display: inline-block;\n}\n\ndiv[data-type="object-key"] {\n margin-left: 20px;\n}\n\ndiv.comma-float {\n float: left;\n color: #222;\n}\n'};var log=exports.log=function(){var item=document.createElement("li");items=items||initConsole();theme=theme||initTheme();item.innerHTML=[].slice.call(arguments).map(renderData).join(" ");if(this&&this.class){item.classList.add(this.class)}items.appendChild(item);setTimeout(function(){items.parentNode.scrollTop=items.offsetHeight},100);window.console.log.apply(window.console,arguments)};exports.error=function(){log.apply({"class":"error"},arguments)};exports.useTheme=function(name){theme=initTheme(name)};function initConsole(){var container;var list=document.querySelector(".democonsole ul");if(list){return list}container=document.createElement("div");list=document.createElement("ul");container.className="democonsole";container.appendChild(list);document.body.appendChild(container);return list}function initTheme(theme){var stylesheet=document.getElementById("democonsole-theme");if(stylesheet){document.head.removeChild(stylesheet)}stylesheet=document.createElement("style");stylesheet.id="democonsole-theme";stylesheet.innerText=theme||themes.simple;document.head.appendChild(stylesheet);return stylesheet}function renderData(data,index){var initialItem=index===0;function extractData(key){var hasSpace=reSpace.test(key);var quoteChar=hasSpace?"'":"";return'<div data-type="object-key">'+span(quoteChar+key+quoteChar+": ","key")+renderData(data[key])+"</div>"}if(typeof data=="undefined"){return span("undefined","undefined")}if(data===true||data===false){return span(data,"boolean")}else if(Array.isArray(data)){return span("[")+data.map(function(entry){return renderData(entry)}).join(", ")+span("]")}else if(typeof data=="string"||data instanceof String){return span(initialItem?data:"'"+data+"'","string")}else if(data===null){return span("null","null")}else if(data instanceof Error){return span(data.toString(),"error")}else if(data instanceof Window){return span("window","window")}else if(data instanceof DocumentType){return"doctype: "+data.name}else if(data instanceof HTMLCollection){return span("[]","html-collection")}else if(data instanceof HTMLDocument){return[].slice.call(document.childNodes).map(renderData)}else if(data instanceof HTMLElement){return data.tagName}else if(typeof data=="object"){return'<div data-type="object">'+span("{")+Object.keys(data).map(extractData).join('<div class="comma-float">,</div>')+span("}")+"</div>"}else{return span(data,typeof data)}}function span(content,dataType){return'<span data-type="'+(dataType||"")+'">'+content+"</span>"}},{}],"demo-console":[function(require,module,exports){module.exports=require("R7XjId")},{}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.once=noop;process.off=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],"rtc-quickconnect":[function(require,module,exports){module.exports=require("v4igVt")},{}],v4igVt:[function(require,module,exports){(function(process){"use strict";var rtc=require("rtc-tools");var cleanup=require("rtc-tools/cleanup");var debug=rtc.logger("rtc-quickconnect");var signaller=require("rtc-signaller");var defaults=require("cog/defaults");var extend=require("cog/extend");var getable=require("cog/getable");var reTrailingSlash=/\/$/;module.exports=function(signalhost,opts){var hash=typeof location!="undefined"&&location.hash.slice(1);var signaller=require("rtc-signaller")(signalhost,opts);var ns=(opts||{}).ns||"";var room=(opts||{}).room;var debugging=(opts||{}).debug;var profile={};var announced=false;var localStreams=[];var calls=signaller.calls=getable({});var channels={};function callCreate(id,pc,data){calls.set(id,{active:false,pc:pc,channels:getable({}),data:data,streams:[]})}function callEnd(id){var call=calls.get(id);if(!call){return}debug("ending call to: "+id);call.channels.keys().forEach(function(label){var channel=call.channels.get(label);var args=[id,channel,label];signaller.emit.apply(signaller,["channel:closed"].concat(args));signaller.emit.apply(signaller,["channel:closed:"+label].concat(args));channel.onopen=null});call.streams.forEach(function(stream){signaller.emit("stream:removed",id,stream)});calls.delete(id);signaller.emit("call:ended",id,call.pc);cleanup(call.pc)}function callStart(id,pc,data){var call=calls.get(id);var streams=[].concat(pc.getRemoteStreams());call.active=true;call.streams=[].concat(pc.getRemoteStreams());pc.onaddstream=createStreamAddHandler(id);pc.onremovestream=createStreamRemoveHandler(id);debug(signaller.id+" - "+id+" call start: "+streams.length+" streams");signaller.emit("call:started",id,pc,data);process.nextTick(function(){streams.forEach(receiveRemoteStream(id))})}function createStreamAddHandler(id){return function(evt){debug("peer "+id+" added stream");updateRemoteStreams(id);receiveRemoteStream(id)(evt.stream)}}function createStreamRemoveHandler(id){return function(evt){debug("peer "+id+" removed stream");updateRemoteStreams(id);signaller.emit("stream:removed",id,evt.stream)}}function getActiveCall(peerId){var call=calls.get(peerId);if(!call){throw new Error("No active call for peer: "+peerId)}return call}function gotPeerChannel(channel,pc,data){var channelMonitor;function channelReady(){var call=calls.get(data.id);var args=[data.id,channel,data,pc];debug('reporting channel "'+channel.label+'" ready, have call: '+!!call);clearInterval(channelMonitor);channel.onopen=null;if(call){call.channels.set(channel.label,channel)}debug("triggering channel:opened events for channel: "+channel.label);signaller.emit.apply(signaller,["channel:opened"].concat(args));signaller.emit.apply(signaller,["channel:opened:"+channel.label].concat(args))}debug("channel "+channel.label+" discovered for peer: "+data.id);if(channel.readyState==="open"){return channelReady()}debug("channel not ready, current state = "+channel.readyState);channel.onopen=channelReady;channelMonitor=setInterval(function(){debug("checking channel state, current state = "+channel.readyState);if(channel.readyState==="open"){channelReady()}},500)}function handleLocalAnnounce(data){if(data&&typeof data.room!="undefined"){room=data.room}}function handlePeerAnnounce(data){var pc;var monitor;if(data.room!==room){return}pc=rtc.createConnection(opts,(opts||{}).constraints);signaller.emit("peer:connect",data.id,pc,data);callCreate(data.id,pc,data);localStreams.forEach(function(stream,idx){pc.addStream(stream)});if(signaller.isMaster(data.id)){debug("is master, creating data channels: ",Object.keys(channels));Object.keys(channels).forEach(function(label){gotPeerChannel(pc.createDataChannel(label,channels[label]),pc,data)})}else{pc.ondatachannel=function(evt){var channel=evt&&evt.channel;if(!channel){return}if(channels[channel.label]!==undefined){gotPeerChannel(channel,pc,data)}}}debug("coupling "+signaller.id+" to "+data.id);monitor=rtc.couple(pc,data.id,signaller,opts);signaller.emit("peer:couple",data.id,pc,data,monitor);monitor.once("connected",callStart.bind(null,data.id,pc,data));monitor.once("closed",callEnd.bind(null,data.id));if(signaller.isMaster(data.id)){monitor.createOffer()}}function handlePeerUpdate(data){var id=data&&data.id;var activeCall=id&&calls.get(id);if(id&&!activeCall){debug("received peer update from peer "+id+", no active calls");return handlePeerAnnounce(data)}}function receiveRemoteStream(id){var call=calls.get(id);return function(stream){signaller.emit("stream:added",id,stream,call&&call.data)}}function updateRemoteStreams(id){var call=calls.get(id);if(call&&call.pc){call.streams=[].concat(call.pc.getRemoteStreams())}}if(!room){if(!hash){hash=location.hash=""+Math.pow(2,53)*Math.random()}room=ns+"#"+hash}if(debugging){rtc.logger.enable.apply(rtc.logger,Array.isArray(debug)?debugging:["*"])}signaller.on("peer:announce",handlePeerAnnounce);signaller.on("peer:update",handlePeerUpdate);signaller.on("peer:leave",callEnd);setTimeout(function(){var data=extend({},profile,{room:room});signaller.announce(data);announced=true},0);signaller.broadcast=signaller.addStream=function(stream){localStreams.push(stream);calls.values().forEach(function(data){data.pc.addStream(stream)});return signaller};signaller.endCalls=function(){calls.keys().forEach(callEnd)};signaller.close=function(){signaller.endCalls();signaller.leave()};signaller.createDataChannel=function(label,opts){calls.keys().forEach(function(peerId){var call=calls.get(peerId);var dc;if(call&&call.pc&&signaller.isMaster(peerId)){dc=call.pc.createDataChannel(label,opts);gotPeerChannel(dc,call.pc,call.data)}});channels[label]=opts||null;return signaller};signaller.reactive=function(){opts=opts||{};opts.reactive=true;return signaller};signaller.removeStream=function(stream){var localIndex=localStreams.indexOf(stream);calls.values().forEach(function(call){call.pc.removeStream(stream)});if(localIndex>=0){localStreams.splice(localIndex,1)}return signaller};signaller.requestChannel=function(targetId,label,callback){var call=getActiveCall(targetId);var channel=call&&call.channels.get(label);if(channel){callback(null,channel);return signaller}signaller.once("channel:opened:"+label,function(id,dc){callback(null,dc)});return signaller};signaller.requestStream=function(targetId,idx,callback){var call=getActiveCall(targetId);var stream;function waitForStream(peerId){if(peerId!==targetId){return}stream=call.pc.getRemoteStreams()[idx];if(stream){signaller.removeListener("stream:added",waitForStream);callback(null,stream)}}stream=call.pc.getRemoteStreams()[idx];if(stream){callback(null,stream);return signaller}signaller.on("stream:added",waitForStream);return signaller};signaller.profile=function(data){extend(profile,data);if(announced){signaller.announce(profile)}return signaller};signaller.waitForCall=function(targetId,callback){var call=calls.get(targetId);if(call&&call.active){callback(null,call.pc);return signaller}signaller.on("call:started",function handleNewCall(id){if(id===targetId){signaller.removeListener("call:started",handleNewCall);callback(null,calls.get(id).pc)}})};signaller.on("local:announce",handleLocalAnnounce);return signaller}}).call(this,require("/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":1,"cog/defaults":4,"cog/extend":5,"cog/getable":6,"rtc-signaller":13,"rtc-tools":27,"rtc-tools/cleanup":23}],4:[function(require,module,exports){"use strict";module.exports=function(target){target=target||{};[].slice.call(arguments,1).forEach(function(source){if(!source){return}for(var prop in source){if(target[prop]===void 0){target[prop]=source[prop]}}});return target}},{}],5:[function(require,module,exports){"use strict";module.exports=function(target){[].slice.call(arguments,1).forEach(function(source){if(!source){return}for(var prop in source){target[prop]=source[prop]}});return target}},{}],6:[function(require,module,exports){module.exports=function(target){function get(key){return target[key]}function set(key,value){target[key]=value}function remove(key){return delete target[key]}function keys(){return Object.keys(target)}function values(){return Object.keys(target).map(function(key){return target[key]})}if(typeof target!="object"){return target}return{get:get,set:set,remove:remove,"delete":remove,keys:keys,values:values}}},{}],7:[function(require,module,exports){"use strict";module.exports=function(input){var isString=typeof input=="string"||input instanceof String;var reNumeric=/^\-?\d+\.?\d*$/;var shouldParse;var firstChar;var lastChar;if(!isString||input.length<2){if(isString&&reNumeric.test(input)){return parseFloat(input)}return input}if(input==="true"||input==="false"){return input==="true"}if(input==="null"){return null}firstChar=input.charAt(0);lastChar=input.charAt(input.length-1);shouldParse=firstChar=="{"&&lastChar=="}"||firstChar=="["&&lastChar=="]"||firstChar=='"'&&lastChar=='"';if(shouldParse){try{return JSON.parse(input)}catch(e){}}return reNumeric.test(input)?parseFloat(input):input}},{}],8:[function(require,module,exports){"use strict";var active=[];var unleashListeners=[];var targets=[console];var logger=module.exports=function(name){var enabled=checkActive();function checkActive(){return enabled=active.indexOf("*")>=0||active.indexOf(name)>=0}unleashListeners[unleashListeners.length]=checkActive;return function(){var args=[].slice.call(arguments);if(typeof args[0]=="string"||args[0]instanceof String){args[0]=name+": "+args[0]}if(!enabled){return}targets.forEach(function(target){target.log.apply(target,args)})}};logger.reset=function(){targets=[];active=[];return logger.enable()};logger.to=function(target){targets=targets.concat(target||[]);return logger};logger.enable=function(){active=active.concat([].slice.call(arguments));unleashListeners.forEach(function(listener){listener()});return logger}},{}],9:[function(require,module,exports){"use strict";module.exports=function(fn,delay,opts){var lastExec=(opts||{}).leading!==false?0:Date.now();var trailing=(opts||{}).trailing;var timer;var queuedArgs;var queuedScope;trailing=trailing||trailing===undefined;function invokeDefered(){fn.apply(queuedScope,queuedArgs||[]);lastExec=Date.now()}return function(){var tick=Date.now();var elapsed=tick-lastExec;clearTimeout(timer);if(elapsed<delay){queuedArgs=[].slice.call(arguments,0);queuedScope=this;return trailing&&(timer=setTimeout(invokeDefered,delay-elapsed))}lastExec=tick;fn.apply(this,arguments)}}},{}],10:[function(require,module,exports){"use strict";var browser=require("detect-browser");var detect=module.exports=function(target,prefixes){var prefixIdx;var prefix;var testName;var hostObject=this||(typeof window!="undefined"?window:undefined);if(!hostObject){return}prefixes=(prefixes||["ms","o","moz","webkit"]).concat("");for(prefixIdx=prefixes.length;prefixIdx--;){prefix=prefixes[prefixIdx];testName=prefix+(prefix?target.charAt(0).toUpperCase()+target.slice(1):target);if(typeof hostObject[testName]!="undefined"){detect.browser=detect.browser||prefix.toLowerCase();return hostObject[target]=hostObject[testName]}}};detect.moz=typeof navigator!="undefined"&&!!navigator.mozGetUserMedia;detect.browser=browser.name;detect.browserVersion=detect.version=browser.version},{"detect-browser":11}],11:[function(require,module,exports){var browsers=[["chrome",/Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+)\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-6].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/iPad\;\sCPU\sOS\s([0-9\._]+)/],["ios",/iPhone\;\sCPU\siPhone\sOS\s([0-9\._]+)/]];var match=browsers.map(match).filter(isMatch)[0];var parts=match&&match[3].split(/[._]/).slice(0,3);while(parts&&parts.length<3){parts.push("0")}exports.name=match&&match[0];exports.version=parts&&parts.join(".");function match(pair){return pair.concat(pair[1].exec(navigator.userAgent))}function isMatch(pair){return!!pair[2]}},{}],12:[function(require,module,exports){var detect=require("./detect");var requiredFunctions=["init"];function isSupported(plugin){return plugin&&typeof plugin.supported=="function"&&plugin.supported(detect)}function isValid(plugin){var supportedFunctions=requiredFunctions.filter(function(fn){return typeof plugin[fn]=="function"});return supportedFunctions.length===requiredFunctions.length}module.exports=function(plugins){return[].concat(plugins||[]).filter(isSupported).filter(isValid)[0]}},{"./detect":10}],13:[function(require,module,exports){var extend=require("cog/extend");module.exports=function(messenger,opts){return require("./index.js")(messenger,extend({connect:require("./primus-loader")},opts))}},{"./index.js":18,"./primus-loader":20,"cog/extend":5}],14:[function(require,module,exports){module.exports={dataEvent:"data",openEvent:"open",closeEvent:"close",writeMethod:"write",closeMethod:"close",leaveTimeout:3e3}},{}],15:[function(require,module,exports){"use strict";var debug=require("cog/logger")("rtc-signaller");var extend=require("cog/extend");var roles=["a","b"];module.exports=function(signaller){function copyData(target,source){if(target&&source){for(var key in source){target[key]=source[key]}}return target}function dataAllowed(data){var evt={data:data,allow:true};signaller.emit("peer:filter",evt);return evt.allow}return function(args,messageType,srcData,srcState,isDM){var data=args[0];var peer;debug("announce handler invoked, received data: ",data);if(data&&data.id&&data.id!==signaller.id){if(!dataAllowed(data)){return}peer=signaller.peers.get(data.id);signaller.emit("peer:connected",data.id,data);if(peer&&!peer.inactive){debug("signaller: "+signaller.id+" received update, data: ",data);copyData(peer.data,data);return signaller.emit("peer:update",data,srcData)}peer={id:data.id,roleIdx:[data.id,signaller.id].sort().indexOf(data.id),data:{}};copyData(peer.data,data);clearTimeout(peer.leaveTimer);peer.inactive=false;signaller.peers.set(data.id,peer);if(signaller.autoreply&&!isDM){signaller.to(data.id).send("/announce",signaller.attributes)}return signaller.emit("peer:announce",data,peer)}}}},{"cog/extend":5,"cog/logger":8}],16:[function(require,module,exports){"use strict";module.exports=function(signaller,opts){return{announce:require("./announce")(signaller,opts),leave:require("./leave")(signaller,opts)}}},{"./announce":15,"./leave":17}],17:[function(require,module,exports){"use strict";module.exports=function(signaller,opts){return function(args){var data=args[0];var peer=signaller.peers.get(data&&data.id);if(peer){peer.leaveTimer=setTimeout(function(){peer.inactive=true;signaller.emit("peer:leave",data.id,peer)},opts.leaveTimeout)}signaller.emit("peer:disconnected",data.id,peer)}}},{}],18:[function(require,module,exports){"use strict";var debug=require("cog/logger")("rtc-signaller");var detect=require("rtc-core/detect");var EventEmitter=require("eventemitter3");var defaults=require("cog/defaults");var extend=require("cog/extend");var throttle=require("cog/throttle");var getable=require("cog/getable");var uuid=require("./uuid");var WRITE_METHODS=["write","send"];var CLOSE_METHODS=["close","end"];var metadata={version:"2.4.0"};module.exports=function(messenger,opts){var autoreply=(opts||{}).autoreply;var connect=(opts||{}).connect;var localMeta={};var signaller=new EventEmitter;var id=signaller.id=(opts||{}).id||uuid();var attributes=signaller.attributes={browser:detect.browser,browserVersion:detect.browserVersion,id:id,agent:"signaller@"+metadata.version};var peers=signaller.peers=getable({});var connected=false;var write;var close;var processor;var announceTimer=0;function announceOnReconnect(){signaller.announce()}function bindBrowserEvents(){messenger.addEventListener("message",function(evt){processor(evt.data)});messenger.addEventListener("open",function(evt){connected=true;signaller.emit("open");signaller.emit("connected")});messenger.addEventListener("close",function(evt){connected=false;signaller.emit("disconnected")})}function bindEvents(){if(typeof messenger.on!="function"){return}messenger.on(opts.dataEvent,processor);messenger.on(opts.openEvent,function(){connected=true;signaller.emit("open");signaller.emit("connected")});messenger.on(opts.closeEvent,function(){connected=false;signaller.emit("disconnected")})}function connectToHost(url){if(typeof connect!="function"){return signaller.emit("error",new Error("no connect function"))}connect(url,function(err,socket){if(err){return signaller.emit("error",err)}signaller._messenger=messenger=socket.connect(url);init()})}function createDataLine(args){return args.map(prepareArg).join("|")}function createMetadata(){return extend({},localMeta,{id:signaller.id})}function extractProp(name){return messenger[name]}function isClosing(){var isAbstraction=messenger&&typeof messenger.socket!="undefined";return isAbstraction?false:messenger&&typeof messenger.readyState!="undefined"&&messenger.readyState>=2}function isF(target){return typeof target=="function"}function init(){write=[opts.writeMethod].concat(WRITE_METHODS).map(extractProp).filter(isF)[0];close=[opts.closeMethod].concat(CLOSE_METHODS).map(extractProp).filter(isF)[0];signaller.process=processor=require("./processor")(signaller,opts);if(typeof write!="function"){throw new Error('provided messenger does not implement a "'+writeMethod+'" write method')}if(typeof messenger.addEventListener=="function"){bindBrowserEvents()}else{bindEvents()}connected=messenger.connected||false;if(!connected){signaller.once("connected",function(){signaller.on("connected",announceOnReconnect)})}setTimeout(signaller.emit.bind(signaller,"init"),0)}function prepareArg(arg){if(typeof arg=="object"&&!(arg instanceof String)){return JSON.stringify(arg)}else if(typeof arg=="function"){return null}return arg}var send=signaller.send=function(){var args=[].slice.call(arguments);var dataline;args.splice(1,0,createMetadata());dataline=createDataLine(args);if(isClosing()){return}if(!connected){return signaller.once("connected",function(){write.call(messenger,dataline)})}return write.call(messenger,dataline)};signaller.announce=function(data,sender){function sendAnnounce(){(sender||send)("/announce",attributes);signaller.emit("local:announce",attributes)}clearTimeout(announceTimer);extend(attributes,data,{id:signaller.id});if(connected){signaller.removeListener("connected",announceOnReconnect);signaller.on("connected",announceOnReconnect)}return announceTimer=setTimeout(function(){if(!connected){return signaller.once("connected",sendAnnounce)}sendAnnounce()},(opts||{}).announceDelay||10)};signaller.isMaster=function(targetId){var peer=peers.get(targetId);return peer&&peer.roleIdx!==0};signaller.leave=signaller.close=function(){send("/leave",{id:id});signaller.removeListener("connected",announceOnReconnect);if(typeof close=="function"){close.call(messenger)}};signaller.metadata=function(data){if(arguments.length===0){return extend({},localMeta)}localMeta=extend({},data)};signaller.to=function(targetId){var sender=function(){var peer=signaller.peers.get(targetId);var args;if(!peer){throw new Error("Unknown peer: "+targetId)}if(peer.inactive){return}args=["/to",targetId].concat([].slice.call(arguments));args.splice(3,0,createMetadata());setTimeout(function(){var msg=createDataLine(args);debug("TX ("+targetId+"): "+msg);write.call(messenger,msg)},0)};return{announce:function(data){return signaller.announce(data,sender)},send:sender}};signaller.setMaxListeners(0);opts=defaults({},opts,require("./defaults"));signaller.autoreply=autoreply===undefined||autoreply;if(typeof messenger=="string"||messenger instanceof String){connectToHost(messenger)}else{init()}signaller._messenger=messenger;signaller.process=processor;return signaller}},{"./defaults":14,"./processor":21,"./uuid":22,"cog/defaults":4,"cog/extend":5,"cog/getable":6,"cog/logger":8,"cog/throttle":9,eventemitter3:19,"rtc-core/detect":10}],19:[function(require,module,exports){"use strict";function EventEmitter(){this._events={}}EventEmitter.prototype.listeners=function listeners(event){return Array.apply(this,this._events[event]||[])};EventEmitter.prototype.emit=function emit(event,a1,a2,a3,a4,a5){if(!this._events||!this._events[event])return false;var listeners=this._events[event],length=listeners.length,len=arguments.length,fn=listeners[0],args,i;if(1===length){if(fn.__EE3_once)this.removeListener(event,fn);switch(len){case 1:fn.call(fn.__EE3_context||this);break;case 2:fn.call(fn.__EE3_context||this,a1);break;case 3:fn.call(fn.__EE3_context||this,a1,a2);break;case 4:fn.call(fn.__EE3_context||this,a1,a2,a3);break;case 5:fn.call(fn.__EE3_context||this,a1,a2,a3,a4);break;case 6:fn.call(fn.__EE3_context||this,a1,a2,a3,a4,a5);break;default:for(i=1,args=new Array(len-1);i<len;i++){args[i-1]=arguments[i]}fn.apply(fn.__EE3_context||this,args)}}else{for(i=1,args=new Array(len-1);i<len;i++){args[i-1]=arguments[i]}for(i=0;i<length;fn=listeners[++i]){if(fn.__EE3_once)this.removeListener(event,fn);fn.apply(fn.__EE3_context||this,args)}}return true};EventEmitter.prototype.on=function on(event,fn,context){if(!this._events)this._events={};if(!this._events[event])this._events[event]=[];fn.__EE3_context=context;this._events[event].push(fn);return this};EventEmitter.prototype.once=function once(event,fn,context){fn.__EE3_once=true;return this.on(event,fn,context)};EventEmitter.prototype.removeListener=function removeListener(event,fn){if(!this._events||!this._events[event])return this;var listeners=this._events[event],events=[];for(var i=0,length=listeners.length;i<length;i++){if(fn&&listeners[i]!==fn){events.push(listeners[i])}}if(events.length)this._events[event]=events;else this._events[event]=null;return this};EventEmitter.prototype.removeAllListeners=function removeAllListeners(event){if(!this._events)return this;if(event)this._events[event]=null;else this._events={};return this};EventEmitter.prototype.off=EventEmitter.prototype.removeListener;EventEmitter.prototype.addListener=EventEmitter.prototype.on;EventEmitter.prototype.setMaxListeners=function setMaxListeners(){return this};EventEmitter.EventEmitter=EventEmitter;EventEmitter.EventEmitter2=EventEmitter;EventEmitter.EventEmitter3=EventEmitter;try{module.exports=EventEmitter}catch(e){}},{}],20:[function(require,module,exports){"use strict";var reTrailingSlash=/\/$/;module.exports=function(signalhost,callback){var anchor=document.createElement("a");var script;var baseUrl;var scriptSrc;if(typeof signalhost=="function"){callback=signalhost;signalhost=location.origin}anchor.href=signalhost;baseUrl=signalhost.replace(reTrailingSlash,"");scriptSrc=baseUrl+"/rtc.io/primus.js";script=document.querySelector('script[src="'+scriptSrc+'"]');if(script&&typeof Primus!="undefined"){return callback(null,Primus)}else if(script){script.addEventListener("load",function(){callback(null,Primus)});return}script=document.createElement("script");script.src=scriptSrc;script.onerror=callback;script.addEventListener("load",function(){if(anchor.pathname!=="/"){Primus.prototype.pathname=anchor.pathname.replace(reTrailingSlash,"")+Primus.prototype.pathname}callback(null,Primus)});document.body.appendChild(script)}},{}],21:[function(require,module,exports){"use strict";var debug=require("cog/logger")("rtc-signaller");var jsonparse=require("cog/jsonparse");module.exports=function(signaller,opts){var handlers=require("./handlers")(signaller,opts);function sendEvent(parts,srcState,data){var evtName=parts[0].slice(1);var args=parts.slice(2).map(jsonparse);signaller.emit.apply(signaller,[evtName].concat(args).concat([srcState,data]))}return function(originalData){var data=originalData;var isMatch=true;var parts;var handler;var srcData;var srcState;var isDirectMessage=false;var id=signaller.id+"";debug("signaller "+id+" received data: "+originalData);if(data.slice(0,3)==="/to"){isMatch=data.slice(4,id.length+4)===id;if(isMatch){parts=data.slice(5+id.length).split("|").map(jsonparse);isDirectMessage=true;parts=parts.map(jsonparse)}}if(!isMatch){return}parts=parts||data.split("|").map(jsonparse);if(typeof parts[0]=="string"){srcData=parts[1];if(srcData&&srcData.id===signaller.id){return console.warn("got data from ourself, discarding")}srcState=signaller.peers.get(srcData&&srcData.id)||srcData;if(parts[0].charAt(0)==="/"){handler=handlers[parts[0].slice(1)];if(typeof handler=="function"){handler(parts.slice(2),parts[0].slice(1),srcData,srcState,isDirectMessage)}else{sendEvent(parts,srcState,originalData)}}else{signaller.emit("data",parts.slice(0,1).concat(parts.slice(2)),srcData,srcState,isDirectMessage)}}}}},{"./handlers":16,"cog/jsonparse":7,"cog/logger":8}],22:[function(require,module,exports){module.exports=function(a,b){for(b=a="";a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):"-");return b}},{}],23:[function(require,module,exports){"use strict";var debug=require("cog/logger")("rtc/cleanup");var CANNOT_CLOSE_STATES=["closed"];var EVENTS_DECOUPLE_BC=["addstream","datachannel","icecandidate","negotiationneeded","removestream","signalingstatechange"];var EVENTS_DECOUPLE_AC=["iceconnectionstatechange"];module.exports=function(pc){var currentState=pc.iceConnectionState;var canClose=CANNOT_CLOSE_STATES.indexOf(currentState)<0;function decouple(events){events.forEach(function(evtName){if(pc["on"+evtName]){pc["on"+evtName]=null}})}decouple(EVENTS_DECOUPLE_BC);if(canClose){debug("attempting connection close, current state: "+pc.iceConnectionState);pc.close()}setTimeout(function(){decouple(EVENTS_DECOUPLE_AC)},100)}},{"cog/logger":8}],24:[function(require,module,exports){"use strict";var async=require("async");var cleanup=require("./cleanup");var monitor=require("./monitor");var detect=require("./detect");var findPlugin=require("rtc-core/plugin");var CLOSED_STATES=["closed","failed"];var OFFER_ANSWER_CONSTRAINTS=["offerToReceiveVideo","offerToReceiveAudio","voiceActivityDetection","iceRestart"];function couple(pc,targetId,signaller,opts){var debugLabel=(opts||{}).debugLabel||"rtc";var debug=require("cog/logger")(debugLabel+"/couple");var mon=monitor(pc,targetId,signaller,opts);
var queuedCandidates=[];var sdpFilter=(opts||{}).sdpfilter;var reactive=(opts||{}).reactive;var offerTimeout;var endOfCandidates=true;var plugin=findPlugin((opts||{}).plugins);var disconnectTimeout=(opts||{}).disconnectTimeout||1e4;var disconnectTimer;if(typeof signaller.isMaster!="function"){throw new Error("rtc-signaller instance >= 0.14.0 required")}var isMaster=signaller.isMaster(targetId);var createOffer=prepNegotiate("createOffer",isMaster,[checkStable]);var createAnswer=prepNegotiate("createAnswer",true,[]);var q=async.queue(function(task,cb){if(typeof task.op!="function"){return cb()}task.op(task,cb)},1);var RTCSessionDescription=(opts||{}).RTCSessionDescription||detect("RTCSessionDescription");var RTCIceCandidate=(opts||{}).RTCIceCandidate||detect("RTCIceCandidate");function abort(stage,sdp,cb){return function(err){console.error("rtc/couple error ("+stage+"): ",err);if(typeof cb=="function"){cb(err)}}}function applyCandidatesWhenStable(){if(pc.signalingState=="stable"&&pc.remoteDescription){debug("signaling state = stable, applying queued candidates");mon.removeListener("change",applyCandidatesWhenStable);queuedCandidates.splice(0).forEach(function(data){debug("applying queued candidate",data);try{pc.addIceCandidate(createIceCandidate(data))}catch(e){debug("invalidate candidate specified: ",data)}})}}function checkNotConnecting(negotiate){if(pc.iceConnectionState!="checking"){return true}debug("connection state is checking, will wait to create a new offer");mon.once("connected",function(){q.push({op:negotiate})});return false}function checkStable(negotiate){if(pc.signalingState==="stable"){return true}debug("cannot create offer, signaling state != stable, will retry");mon.on("change",function waitForStable(){if(pc.signalingState==="stable"){q.push({op:negotiate})}mon.removeListener("change",waitForStable)});return false}function createIceCandidate(data){if(plugin&&typeof plugin.createIceCandidate=="function"){return plugin.createIceCandidate(data)}return new RTCIceCandidate(data)}function createSessionDescription(data){if(plugin&&typeof plugin.createSessionDescription=="function"){return plugin.createSessionDescription(data)}return new RTCSessionDescription(data)}function decouple(){debug("decoupling "+signaller.id+" from "+targetId);mon.removeAllListeners();mon.stop();cleanup(pc);signaller.removeListener("sdp",handleSdp);signaller.removeListener("candidate",handleRemoteCandidate);signaller.removeListener("negotiate",handleNegotiateRequest)}function generateConstraints(methodName){var constraints={};function reformatConstraints(){var tweaked={};Object.keys(constraints).forEach(function(param){var sentencedCased=param.charAt(0).toUpperCase()+param.substr(1);tweaked[sentencedCased]=constraints[param]});constraints={mandatory:tweaked}}OFFER_ANSWER_CONSTRAINTS.forEach(function(param){var sentencedCased=param.charAt(0).toUpperCase()+param.substr(1);if(!opts){return}else if(opts[param]!==undefined){constraints[param]=opts[param]}else if(opts[sentencedCased]!==undefined){constraints[param]=opts[sentencedCased]}});reformatConstraints();return constraints}function prepNegotiate(methodName,allowed,preflightChecks){var constraints=generateConstraints(methodName);preflightChecks=[].concat(preflightChecks||[]);return function negotiate(task,cb){var checksOK=true;if(!allowed){signaller.to(targetId).send("/negotiate");return cb()}if(isClosed()){return cb(new Error("connection closed, cannot negotiate"))}preflightChecks.forEach(function(check){checksOK=checksOK&&check(negotiate)});if(!checksOK){debug("preflight checks did not pass, aborting "+methodName);return cb()}debug("calling "+methodName);pc[methodName](function(desc){if(typeof sdpFilter=="function"){desc.sdp=sdpFilter(desc.sdp,pc,methodName)}q.push({op:queueLocalDesc(desc)});cb()},abort(methodName,"",cb),constraints)}}function handleConnectionClose(){debug("captured pc close, iceConnectionState = "+pc.iceConnectionState);decouple()}function handleDisconnect(){debug("captured pc disconnect, monitoring connection status");disconnectTimer=setTimeout(function(){debug("manually closing connection after disconnect timeout");pc.close()},disconnectTimeout);mon.on("change",handleDisconnectAbort)}function handleDisconnectAbort(){debug("connection state changed to: "+pc.iceConnectionState);resetDisconnectTimer();if(CLOSED_STATES.indexOf(pc.iceConnectionState)>=0){return mon.emit("closed")}mon.once("disconnect",handleDisconnect)}function handleLocalCandidate(evt){if(evt.candidate){resetDisconnectTimer();signaller.to(targetId).send("/candidate",evt.candidate);endOfCandidates=false}else if(!endOfCandidates){endOfCandidates=true;debug("ice gathering state complete");signaller.to(targetId).send("/endofcandidates",{})}}function handleNegotiateRequest(src){if(src.id===targetId){debug("got negotiate request from "+targetId+", creating offer");q.push({op:createOffer})}}function handleRemoteCandidate(data,src){if(!src||src.id!==targetId){return}if(pc.signalingState!="stable"||!pc.remoteDescription){debug("queuing candidate");queuedCandidates.push(data);mon.removeListener("change",applyCandidatesWhenStable);mon.on("change",applyCandidatesWhenStable);return}try{pc.addIceCandidate(createIceCandidate(data))}catch(e){debug("invalidate candidate specified: ",data)}}function handleSdp(data,src){var abortType=data.type==="offer"?"createAnswer":"createOffer";if(!src||src.id!==targetId){return debug("received sdp but dropping due to unmatched src")}q.push({op:function(task,cb){if(isClosed()){return cb(new Error("pc closed: cannot set remote description"))}debug("setting remote description");pc.setRemoteDescription(createSessionDescription(data),function(){if(data.type==="offer"){queue(createAnswer)()}cb()},abort(abortType,data.sdp,cb))}})}function isClosed(){return CLOSED_STATES.indexOf(pc.iceConnectionState)>=0}function queue(negotiateTask){return function(){q.push([{op:negotiateTask}])}}function queueLocalDesc(desc){return function setLocalDesc(task,cb){if(isClosed()){return cb(new Error("connection closed, aborting"))}debug("setting local description");pc.setLocalDescription(desc,function(){signaller.to(targetId).send("/sdp",desc);cb()},function(err){debug("error setting local description",err);debug(desc.sdp);cb(err)})}}function resetDisconnectTimer(){mon.removeListener("change",handleDisconnectAbort);debug("reset disconnect timer, state: "+pc.iceConnectionState);clearTimeout(disconnectTimer)}if(reactive){pc.onnegotiationneeded=function(){debug("renegotiation required, will create offer in 50ms");clearTimeout(offerTimeout);offerTimeout=setTimeout(queue(createOffer),50)}}pc.onicecandidate=handleLocalCandidate;signaller.on("sdp",handleSdp);signaller.on("candidate",handleRemoteCandidate);if(isMaster){signaller.on("negotiate",handleNegotiateRequest)}mon.once("closed",handleConnectionClose);mon.once("disconnected",handleDisconnect);mon.createOffer=queue(createOffer);return mon}module.exports=couple},{"./cleanup":23,"./detect":25,"./monitor":28,async:29,"cog/logger":8,"rtc-core/plugin":12}],25:[function(require,module,exports){"use strict";module.exports=require("rtc-core/detect")},{"rtc-core/detect":10}],26:[function(require,module,exports){"use strict";var debug=require("cog/logger")("generators");var detect=require("./detect");var defaults=require("cog/defaults");var mappings={create:{dtls:function(c){if(!detect.moz){c.optional=(c.optional||[]).concat({DtlsSrtpKeyAgreement:true})}}}};exports.config=function(config){return defaults(config,{iceServers:[]})};exports.connectionConstraints=function(flags,constraints){var generated={};var m=mappings.create;var out;Object.keys(flags||{}).forEach(function(key){if(m[key]){m[key](generated)}});out=defaults({},constraints,generated);debug("generated connection constraints: ",out);return out}},{"./detect":25,"cog/defaults":4,"cog/logger":8}],27:[function(require,module,exports){"use strict";var gen=require("./generators");var detect=exports.detect=require("./detect");var findPlugin=require("rtc-core/plugin");exports.logger=require("cog/logger");var RTCPeerConnection=exports.RTCPeerConnection=detect("RTCPeerConnection");exports.couple=require("./couple");exports.createConnection=function(opts,constraints){var plugin=findPlugin((opts||{}).plugins);var normalize=(plugin?plugin.normalizeIce:null)||require("normalice");var config=gen.config(opts);var constraints=gen.connectionConstraints(opts,constraints);config.iceServers=(config.iceServers||[]).map(normalize);if(plugin&&typeof plugin.createConnection=="function"){return plugin.createConnection(config,constraints)}else{return new((opts||{}).RTCPeerConnection||RTCPeerConnection)(config,constraints)}}},{"./couple":24,"./detect":25,"./generators":26,"cog/logger":8,normalice:31,"rtc-core/plugin":12}],28:[function(require,module,exports){"use strict";var EventEmitter=require("eventemitter3");var stateMappings={completed:"connected"};var peerStateEvents=["signalingstatechange","iceconnectionstatechange"];module.exports=function(pc,targetId,signaller,opts){var debugLabel=(opts||{}).debugLabel||"rtc";var debug=require("cog/logger")(debugLabel+"/monitor");var monitor=new EventEmitter;var state;function checkState(){var newState=getMappedState(pc.iceConnectionState);debug("state changed: "+pc.iceConnectionState+", mapped: "+newState);monitor.emit("change",pc);if(state!==newState){monitor.emit(newState);state=newState}}function handlePeerLeave(peerId){debug("captured peer leave for peer: "+peerId);if(peerId!==targetId){return}monitor.emit("closed")}pc.onclose=monitor.emit.bind(monitor,"closed");peerStateEvents.forEach(function(evtName){pc["on"+evtName]=checkState});monitor.stop=function(){pc.onclose=null;peerStateEvents.forEach(function(evtName){pc["on"+evtName]=null});if(signaller&&typeof signaller.removeListener=="function"){signaller.removeListener("peer:leave",handlePeerLeave)}};monitor.checkState=checkState;if(!pc){return monitor}state=getMappedState(pc.iceConnectionState);if(signaller&&typeof signaller.on=="function"){signaller.on("peer:leave",handlePeerLeave)}return monitor};function getMappedState(state){return stateMappings[state]||state}},{"cog/logger":8,eventemitter3:30}],29:[function(require,module,exports){(function(process){(function(){var async={};var root,previous_async;root=this;if(root!=null){previous_async=root.async}async.noConflict=function(){root.async=previous_async;return async};function only_once(fn){var called=false;return function(){if(called)throw new Error("Callback was already called.");called=true;fn.apply(root,arguments)}}var _toString=Object.prototype.toString;var _isArray=Array.isArray||function(obj){return _toString.call(obj)==="[object Array]"};var _each=function(arr,iterator){if(arr.forEach){return arr.forEach(iterator)}for(var i=0;i<arr.length;i+=1){iterator(arr[i],i,arr)}};var _map=function(arr,iterator){if(arr.map){return arr.map(iterator)}var results=[];_each(arr,function(x,i,a){results.push(iterator(x,i,a))});return results};var _reduce=function(arr,iterator,memo){if(arr.reduce){return arr.reduce(iterator,memo)}_each(arr,function(x,i,a){memo=iterator(memo,x,i,a)});return memo};var _keys=function(obj){if(Object.keys){return Object.keys(obj)}var keys=[];for(var k in obj){if(obj.hasOwnProperty(k)){keys.push(k)}}return keys};if(typeof process==="undefined"||!process.nextTick){if(typeof setImmediate==="function"){async.nextTick=function(fn){setImmediate(fn)};async.setImmediate=async.nextTick}else{async.nextTick=function(fn){setTimeout(fn,0)};async.setImmediate=async.nextTick}}else{async.nextTick=process.nextTick;if(typeof setImmediate!=="undefined"){async.setImmediate=function(fn){setImmediate(fn)}}else{async.setImmediate=async.nextTick}}async.each=function(arr,iterator,callback){callback=callback||function(){};if(!arr.length){return callback()}var completed=0;_each(arr,function(x){iterator(x,only_once(done))});function done(err){if(err){callback(err);callback=function(){}}else{completed+=1;if(completed>=arr.length){callback()}}}};async.forEach=async.each;async.eachSeries=function(arr,iterator,callback){callback=callback||function(){};if(!arr.length){return callback()}var completed=0;var iterate=function(){iterator(arr[completed],function(err){if(err){callback(err);callback=function(){}}else{completed+=1;if(completed>=arr.length){callback()}else{iterate()}}})};iterate()};async.forEachSeries=async.eachSeries;async.eachLimit=function(arr,limit,iterator,callback){var fn=_eachLimit(limit);fn.apply(null,[arr,iterator,callback])};async.forEachLimit=async.eachLimit;var _eachLimit=function(limit){return function(arr,iterator,callback){callback=callback||function(){};if(!arr.length||limit<=0){return callback()}var completed=0;var started=0;var running=0;(function replenish(){if(completed>=arr.length){return callback()}while(running<limit&&started<arr.length){started+=1;running+=1;iterator(arr[started-1],function(err){if(err){callback(err);callback=function(){}}else{completed+=1;running-=1;if(completed>=arr.length){callback()}else{replenish()}}})}})()}};var doParallel=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.each].concat(args))}};var doParallelLimit=function(limit,fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[_eachLimit(limit)].concat(args))}};var doSeries=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.eachSeries].concat(args))}};var _asyncMap=function(eachfn,arr,iterator,callback){arr=_map(arr,function(x,i){return{index:i,value:x}});if(!callback){eachfn(arr,function(x,callback){iterator(x.value,function(err){callback(err)})})}else{var results=[];eachfn(arr,function(x,callback){iterator(x.value,function(err,v){results[x.index]=v;callback(err)})},function(err){callback(err,results)})}};async.map=doParallel(_asyncMap);async.mapSeries=doSeries(_asyncMap);async.mapLimit=function(arr,limit,iterator,callback){return _mapLimit(limit)(arr,iterator,callback)};var _mapLimit=function(limit){return doParallelLimit(limit,_asyncMap)};async.reduce=function(arr,memo,iterator,callback){async.eachSeries(arr,function(x,callback){iterator(memo,x,function(err,v){memo=v;callback(err)})},function(err){callback(err,memo)})};async.inject=async.reduce;async.foldl=async.reduce;async.reduceRight=function(arr,memo,iterator,callback){var reversed=_map(arr,function(x){return x}).reverse();async.reduce(reversed,memo,iterator,callback)};async.foldr=async.reduceRight;var _filter=function(eachfn,arr,iterator,callback){var results=[];arr=_map(arr,function(x,i){return{index:i,value:x}});eachfn(arr,function(x,callback){iterator(x.value,function(v){if(v){results.push(x)}callback()})},function(err){callback(_map(results.sort(function(a,b){return a.index-b.index}),function(x){return x.value}))})};async.filter=doParallel(_filter);async.filterSeries=doSeries(_filter);async.select=async.filter;async.selectSeries=async.filterSeries;var _reject=function(eachfn,arr,iterator,callback){var results=[];arr=_map(arr,function(x,i){return{index:i,value:x}});eachfn(arr,function(x,callback){iterator(x.value,function(v){if(!v){results.push(x)}callback()})},function(err){callback(_map(results.sort(function(a,b){return a.index-b.index}),function(x){return x.value}))})};async.reject=doParallel(_reject);async.rejectSeries=doSeries(_reject);var _detect=function(eachfn,arr,iterator,main_callback){eachfn(arr,function(x,callback){iterator(x,function(result){if(result){main_callback(x);main_callback=function(){}}else{callback()}})},function(err){main_callback()})};async.detect=doParallel(_detect);async.detectSeries=doSeries(_detect);async.some=function(arr,iterator,main_callback){async.each(arr,function(x,callback){iterator(x,function(v){if(v){main_callback(true);main_callback=function(){}}callback()})},function(err){main_callback(false)})};async.any=async.some;async.every=function(arr,iterator,main_callback){async.each(arr,function(x,callback){iterator(x,function(v){if(!v){main_callback(false);main_callback=function(){}}callback()})},function(err){main_callback(true)})};async.all=async.every;async.sortBy=function(arr,iterator,callback){async.map(arr,function(x,callback){iterator(x,function(err,criteria){if(err){callback(err)}else{callback(null,{value:x,criteria:criteria})}})},function(err,results){if(err){return callback(err)}else{var fn=function(left,right){var a=left.criteria,b=right.criteria;return a<b?-1:a>b?1:0};callback(null,_map(results.sort(fn),function(x){return x.value}))}})};async.auto=function(tasks,callback){callback=callback||function(){};var keys=_keys(tasks);var remainingTasks=keys.length;if(!remainingTasks){return callback()}var results={};var listeners=[];var addListener=function(fn){listeners.unshift(fn)};var removeListener=function(fn){for(var i=0;i<listeners.length;i+=1){if(listeners[i]===fn){listeners.splice(i,1);return}}};var taskComplete=function(){remainingTasks--;_each(listeners.slice(0),function(fn){fn()})};addListener(function(){if(!remainingTasks){var theCallback=callback;callback=function(){};theCallback(null,results)}});_each(keys,function(k){var task=_isArray(tasks[k])?tasks[k]:[tasks[k]];var taskCallback=function(err){var args=Array.prototype.slice.call(arguments,1);if(args.length<=1){args=args[0]}if(err){var safeResults={};_each(_keys(results),function(rkey){safeResults[rkey]=results[rkey]});safeResults[k]=args;callback(err,safeResults);callback=function(){}}else{results[k]=args;async.setImmediate(taskComplete)}};var requires=task.slice(0,Math.abs(task.length-1))||[];var ready=function(){return _reduce(requires,function(a,x){return a&&results.hasOwnProperty(x)},true)&&!results.hasOwnProperty(k)};if(ready()){task[task.length-1](taskCallback,results)}else{var listener=function(){if(ready()){removeListener(listener);task[task.length-1](taskCallback,results)}};addListener(listener)}})};async.retry=function(times,task,callback){var DEFAULT_TIMES=5;var attempts=[];if(typeof times==="function"){callback=task;task=times;times=DEFAULT_TIMES}times=parseInt(times,10)||DEFAULT_TIMES;var wrappedTask=function(wrappedCallback,wrappedResults){var retryAttempt=function(task,finalAttempt){return function(seriesCallback){task(function(err,result){seriesCallback(!err||finalAttempt,{err:err,result:result})},wrappedResults)}};while(times){attempts.push(retryAttempt(task,!(times-=1)))}async.series(attempts,function(done,data){data=data[data.length-1];(wrappedCallback||callback)(data.err,data.result)})};return callback?wrappedTask():wrappedTask};async.waterfall=function(tasks,callback){callback=callback||function(){};if(!_isArray(tasks)){var err=new Error("First argument to waterfall must be an array of functions");return callback(err)}if(!tasks.length){return callback()}var wrapIterator=function(iterator){return function(err){if(err){callback.apply(null,arguments);callback=function(){}}else{var args=Array.prototype.slice.call(arguments,1);var next=iterator.next();if(next){args.push(wrapIterator(next))}else{args.push(callback)}async.setImmediate(function(){iterator.apply(null,args)})}}};wrapIterator(async.iterator(tasks))()};var _parallel=function(eachfn,tasks,callback){callback=callback||function(){};if(_isArray(tasks)){eachfn.map(tasks,function(fn,callback){if(fn){fn(function(err){var args=Array.prototype.slice.call(arguments,1);if(args.length<=1){args=args[0]}callback.call(null,err,args)})}},callback)}else{var results={};eachfn.each(_keys(tasks),function(k,callback){tasks[k](function(err){var args=Array.prototype.slice.call(arguments,1);if(args.length<=1){args=args[0]}results[k]=args;callback(err)})},function(err){callback(err,results)})}};async.parallel=function(tasks,callback){_parallel({map:async.map,each:async.each},tasks,callback)};async.parallelLimit=function(tasks,limit,callback){_parallel({map:_mapLimit(limit),each:_eachLimit(limit)},tasks,callback)};async.series=function(tasks,callback){callback=callback||function(){};if(_isArray(tasks)){async.mapSeries(tasks,function(fn,callback){if(fn){fn(function(err){var args=Array.prototype.slice.call(arguments,1);if(args.length<=1){args=args[0]}callback.call(null,err,args)})}},callback)}else{var results={};async.eachSeries(_keys(tasks),function(k,callback){tasks[k](function(err){var args=Array.prototype.slice.call(arguments,1);if(args.length<=1){args=args[0]}results[k]=args;callback(err)})},function(err){callback(err,results)})}};async.iterator=function(tasks){var makeCallback=function(index){var fn=function(){if(tasks.length){tasks[index].apply(null,arguments)}return fn.next()};fn.next=function(){return index<tasks.length-1?makeCallback(index+1):null};return fn};return makeCallback(0)};async.apply=function(fn){var args=Array.prototype.slice.call(arguments,1);return function(){return fn.apply(null,args.concat(Array.prototype.slice.call(arguments)))}};var _concat=function(eachfn,arr,fn,callback){var r=[];eachfn(arr,function(x,cb){fn(x,function(err,y){r=r.concat(y||[]);cb(err)})},function(err){callback(err,r)})};async.concat=doParallel(_concat);async.concatSeries=doSeries(_concat);async.whilst=function(test,iterator,callback){if(test()){iterator(function(err){if(err){return callback(err)}async.whilst(test,iterator,callback)})}else{callback()}};async.doWhilst=function(iterator,test,callback){iterator(function(err){if(err){return callback(err)}var args=Array.prototype.slice.call(arguments,1);if(test.apply(null,args)){async.doWhilst(iterator,test,callback)}else{callback()}})};async.until=function(test,iterator,callback){if(!test()){iterator(function(err){if(err){return callback(err)}async.until(test,iterator,callback)})}else{callback()}};async.doUntil=function(iterator,test,callback){iterator(function(err){if(err){return callback(err)}var args=Array.prototype.slice.call(arguments,1);if(!test.apply(null,args)){async.doUntil(iterator,test,callback)}else{callback()}})};async.queue=function(worker,concurrency){if(concurrency===undefined){concurrency=1}function _insert(q,data,pos,callback){if(!q.started){q.started=true}if(!_isArray(data)){data=[data]}if(data.length==0){return async.setImmediate(function(){if(q.drain){q.drain()}})}_each(data,function(task){var item={data:task,callback:typeof callback==="function"?callback:null};if(pos){q.tasks.unshift(item)}else{q.tasks.push(item)}if(q.saturated&&q.tasks.length===q.concurrency){q.saturated()}async.setImmediate(q.process)})}var workers=0;var q={tasks:[],concurrency:concurrency,saturated:null,empty:null,drain:null,started:false,paused:false,push:function(data,callback){_insert(q,data,false,callback)},kill:function(){q.drain=null;q.tasks=[]},unshift:function(data,callback){_insert(q,data,true,callback)},process:function(){if(!q.paused&&workers<q.concurrency&&q.tasks.length){var task=q.tasks.shift();if(q.empty&&q.tasks.length===0){q.empty()}workers+=1;var next=function(){workers-=1;if(task.callback){task.callback.apply(task,arguments)}if(q.drain&&q.tasks.length+workers===0){q.drain()}q.process()};var cb=only_once(next);worker(task.data,cb)}},length:function(){return q.tasks.length},running:function(){return workers},idle:function(){return q.tasks.length+workers===0},pause:function(){if(q.paused===true){return}q.paused=true;q.process()},resume:function(){if(q.paused===false){return}q.paused=false;q.process()}};return q};async.priorityQueue=function(worker,concurrency){function _compareTasks(a,b){return a.priority-b.priority}function _binarySearch(sequence,item,compare){var beg=-1,end=sequence.length-1;while(beg<end){var mid=beg+(end-beg+1>>>1);if(compare(item,sequence[mid])>=0){beg=mid}else{end=mid-1}}return beg}function _insert(q,data,priority,callback){if(!q.started){q.started=true}if(!_isArray(data)){data=[data]}if(data.length==0){return async.setImmediate(function(){if(q.drain){q.drain()}})}_each(data,function(task){var item={data:task,priority:priority,callback:typeof callback==="function"?callback:null};q.tasks.splice(_binarySearch(q.tasks,item,_compareTasks)+1,0,item);if(q.saturated&&q.tasks.length===q.concurrency){q.saturated()}async.setImmediate(q.process)})}var q=async.queue(worker,concurrency);q.push=function(data,priority,callback){_insert(q,data,priority,callback)};delete q.unshift;return q};async.cargo=function(worker,payload){var working=false,tasks=[];var cargo={tasks:tasks,payload:payload,saturated:null,empty:null,drain:null,drained:true,push:function(data,callback){if(!_isArray(data)){data=[data]}_each(data,function(task){tasks.push({data:task,callback:typeof callback==="function"?callback:null});cargo.drained=false;if(cargo.saturated&&tasks.length===payload){cargo.saturated()}});async.setImmediate(cargo.process)},process:function process(){if(working)return;if(tasks.length===0){if(cargo.drain&&!cargo.drained)cargo.drain();cargo.drained=true;return}var ts=typeof payload==="number"?tasks.splice(0,payload):tasks.splice(0,tasks.length);var ds=_map(ts,function(task){return task.data});if(cargo.empty)cargo.empty();working=true;worker(ds,function(){working=false;var args=arguments;_each(ts,function(data){if(data.callback){data.callback.apply(null,args)}});process()})},length:function(){return tasks.length},running:function(){return working}};return cargo};var _console_fn=function(name){return function(fn){var args=Array.prototype.slice.call(arguments,1);fn.apply(null,args.concat([function(err){var args=Array.prototype.slice.call(arguments,1);if(typeof console!=="undefined"){if(err){if(console.error){console.error(err)}}else if(console[name]){_each(args,function(x){console[name](x)})}}}]))}};async.log=_console_fn("log");async.dir=_console_fn("dir");async.memoize=function(fn,hasher){var memo={};var queues={};hasher=hasher||function(x){return x};var memoized=function(){var args=Array.prototype.slice.call(arguments);var callback=args.pop();var key=hasher.apply(null,args);if(key in memo){async.nextTick(function(){callback.apply(null,memo[key])})}else if(key in queues){queues[key].push(callback)}else{queues[key]=[callback];fn.apply(null,args.concat([function(){memo[key]=arguments;var q=queues[key];delete queues[key];for(var i=0,l=q.length;i<l;i++){q[i].apply(null,arguments)}}]))}};memoized.memo=memo;memoized.unmemoized=fn;return memoized};async.unmemoize=function(fn){return function(){return(fn.unmemoized||fn).apply(null,arguments)}};async.times=function(count,iterator,callback){var counter=[];for(var i=0;i<count;i++){counter.push(i)}return async.map(counter,iterator,callback)};async.timesSeries=function(count,iterator,callback){var counter=[];for(var i=0;i<count;i++){counter.push(i)}return async.mapSeries(counter,iterator,callback)};async.seq=function(){var fns=arguments;return function(){var that=this;var args=Array.prototype.slice.call(arguments);var callback=args.pop();async.reduce(fns,args,function(newargs,fn,cb){fn.apply(that,newargs.concat([function(){var err=arguments[0];var nextargs=Array.prototype.slice.call(arguments,1);cb(err,nextargs)}]))},function(err,results){callback.apply(that,[err].concat(results))})}};async.compose=function(){return async.seq.apply(null,Array.prototype.reverse.call(arguments))};var _applyEach=function(eachfn,fns){var go=function(){var that=this;var args=Array.prototype.slice.call(arguments);var callback=args.pop();return eachfn(fns,function(fn,cb){fn.apply(that,args.concat([cb]))},callback)};if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);return go.apply(this,args)}else{return go}};async.applyEach=doParallel(_applyEach);async.applyEachSeries=doSeries(_applyEach);async.forever=function(fn,callback){function next(err){if(err){if(callback){return callback(err)}throw err}fn(next)}next()};if(typeof module!=="undefined"&&module.exports){module.exports=async}else if(typeof define!=="undefined"&&define.amd){define([],function(){return async})}else{root.async=async}})()}).call(this,require("/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":1}],30:[function(require,module,exports){module.exports=require(19)},{}],31:[function(require,module,exports){var protocols=["stun:","turn:"];module.exports=function(input){var url=(input||{}).url||input;var protocol;var parts;var output={};if(typeof url!="string"&&!(url instanceof String)){return input}url=url.trim();protocol=protocols[protocols.indexOf(url.slice(0,5))];if(!protocol){return input}url=url.slice(5);parts=url.split("@");output.username=input.username;output.credential=input.credential;if(parts.length>1){url=parts[1];parts=parts[0].split(":");output.username=parts[0];output.credential=(input||{}).credential||parts[1]||""}output.url=protocol+url;output.urls=[output.url];return output}},{}]},{},[]);var quickconnect=require("rtc-quickconnect");var console=require("demo-console");quickconnect("http://rtc.io/switchboard/",{room:"qc-simple-demo"}).on("call:started",function(id,pc,data){console.log("we have a new connection to: "+id)});
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"demo-console": "1.5.0",
"rtc-quickconnect": "2.5.0"
}
}
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; }
body, html { height: 100%; width: 100%; }</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment