js-marketplace-2014/dist/minimart.min.js

3 lines
66 KiB
JavaScript
Raw Normal View History

2014-08-30 20:46:52 +00:00
!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Minimart=e()}}(function(){var define,module,exports;return 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(_dereq_,module,exports){var Minimart=_dereq_("./minimart.js");var util=_dereq_("./util.js");var World=Minimart.World;var Route=Minimart.Route;Actor._chunks=null;function Actor(bootfn){return{boot:function(){delete this.boot;var oldChunks=Actor._chunks;try{Actor._chunks=[];bootfn.call(this);var initialGestalt=finalizeActor(this,Actor._chunks);Actor._chunks=oldChunks;return[initialGestalt]}catch(e){Actor._chunks=oldChunks;throw e}}}}function checkChunks(type){if(!Actor._chunks){throw new Error("Call to Actor."+type+" outside of Actor constructor")}}function extractChunk(type,kind,defaultOptions,args){var rawProjectionFn=args[0];var options=null;var handler=null;if(typeof rawProjectionFn!=="function"){throw new Error("Actor."+type+" expects a function producing a pattern as first argument")}for(var i=1;i<args.length;i++){if(typeof args[i]==="function"){if(handler!==null){throw new Error("Too many handler functions in Actor."+type)}handler=args[i]}else if(typeof args[i]==="object"){if(options!==null){throw new Error("Too many options arguments in Actor."+type)}options=args[i]}else{throw new Error("Unrecognised argument in Actor."+type)}}options=options||{};for(var k in options){if(!(k in defaultOptions)){throw new Error("Unrecognised option '"+k+"' in Actor."+type)}}for(var k in defaultOptions){if(!(k in options)){options[k]=defaultOptions[k]}}return{type:type,kind:kind,rawProjectionFn:rawProjectionFn,options:options,handler:handler}}function recordChunk(chunk){Actor._chunks.push(chunk)}function chunkExtractor(type,kind,defaultOptions){return function(){checkChunks(type);recordChunk(extractChunk(type,kind,defaultOptions,Array.prototype.slice.call(arguments)))}}var participantDefaults={metaLevel:0,when:function(){return true}};var observerDefaults={metaLevel:0,level:0,when:function(){return true},presence:null,name:null,singleton:null,set:null,added:null,removed:null};Actor.advertise=chunkExtractor("advertise","participant",participantDefaults);Actor.subscribe=chunkExtractor("subscribe","participant",participantDefaults);Actor.observeAdvertisers=chunkExtractor("observeAdvertisers","observer",observerDefaults);Actor.observeSubscribers=chunkExtractor("observeSubscribers","observer",observerDefaults);Actor.observeGestalt=function(gestaltFn,eventHandlerFn){checkChunks("observeGestalt");recordChunk({type:"observeGestalt",kind:"raw",gestaltFn:gestaltFn,options:{when:function(){return true}},eventHandlerFn:eventHandlerFn})};function finalizeActor(behavior,chunks){var oldHandleEvent=behavior.handleEvent;var projections={};var compiledProjections={};var previousObjs={};behavior._computeRoutes=function(){var newRoutes=Route.emptyGestalt;for(var i=0;i<chunks.length;i++){var chunk=chunks[i];if(chunk.options.when.call(this)){switch(chunk.kind){case"raw":newRoutes=newRoutes.union(chunk.gestaltFn.call(this));break;case"participant":var proj=chunk.rawProjectionFn.call(this);projections[i]=proj;var g=Route.simpleGestalt(chunk.type==="advertise",Route.projectionToPattern(proj),chunk.options.metaLevel,0);newRoutes=newRoutes.union(g);break;case"observer":var proj=chunk.rawProjectionFn.call(this);projections[i]=proj;compiledProjections[i]=Route.compileProjection(proj);var g=Route.simpleGestalt(chunk.type==="observeSubscribers",Route.projectionToPattern(proj),chunk.options.metaLevel,chunk.options.level+1);newRoutes=newRoutes.union(g);if(chunk.op
}function union(o1,o2){return merge(o1,o2);function merge(o1,o2){if(is_emptyMatcher(o1))return o2;if(is_emptyMatcher(o2))return o1;return walk(o1,o2)}function walk(r1,r2){if(r1 instanceof $WildcardSequence){if(r2 instanceof $WildcardSequence){return rwildseq(walk(r1.matcher,r2.matcher))}r1=expandWildseq(r1.matcher)}else if(r2 instanceof $WildcardSequence){r2=expandWildseq(r2.matcher)}if(r1 instanceof $Success&&r2 instanceof $Success){return rsuccess(unionSuccesses(r1.value,r2.value))}var w=merge(r1.get(__),r2.get(__));if(is_emptyMatcher(w)){var smaller=r1.length<r2.length?r1:r2;var larger=r1.length<r2.length?r2:r1;var target=larger.copy();for(var key in smaller.entries){var k=merge(smaller.get(key),larger.get(key));rupdateInplace(target,key,k)}return target.emptyGuard()}else{function examineKey(rA,key,rB){if(key!==__&&!target.has(key)){var k=merge(rA.get(key),rB.get(key));if(is_keyOpen(key)){rupdateInplace(target,key,merge(rwildseq(w),k))}else if(is_keyClose(key)){if(w instanceof $WildcardSequence){rupdateInplace(target,key,merge(w.matcher,k))}else{rupdateInplace(target,key,k)}}else{rupdateInplace(target,key,merge(w,k))}}}var target=rwild(w).copy();for(var key in r1.entries){examineKey(r1,key,r2)}for(var key in r2.entries){examineKey(r2,key,r1)}return target}}}function unionN(){var acc=emptyMatcher;for(var i=0;i<arguments.length;i++){acc=union(acc,arguments[i])}return acc}function intersect(o1,o2){if(is_emptyMatcher(o1))return emptyMatcher;if(is_emptyMatcher(o2))return emptyMatcher;return walk(o1,o2);function walkFlipped(r2,r1){return walk(r1,r2)}function walk(r1,r2){if(is_emptyMatcher(r1))return emptyMatcher;if(is_emptyMatcher(r2))return emptyMatcher;if(r1 instanceof $WildcardSequence){if(r2 instanceof $WildcardSequence){return rwildseq(walk(r1.matcher,r2.matcher))}r1=expandWildseq(r1.matcher)}else if(r2 instanceof $WildcardSequence){r2=expandWildseq(r2.matcher)}if(r1 instanceof $Success&&r2 instanceof $Success){return rsuccess(intersectSuccesses(r1.value,r2.value))}var w1=r1.get(__);var w2=r2.get(__);var w=walk(w1,w2);var target=new $Dict;function examineKey(key){if(key!==__&&!target.has(key)){var k1=r1.get(key);var k2=r2.get(key);if(is_emptyMatcher(k1)){if(is_emptyMatcher(k2)){rupdateInplace(target,key,emptyMatcher)}else{rupdateInplace(target,key,walkWild(walk,w1,key,k2))}}else{if(is_emptyMatcher(k2)){rupdateInplace(target,key,walkWild(walkFlipped,w2,key,k1))}else{rupdateInplace(target,key,walk(k1,k2))}}}}if(is_emptyMatcher(w1)){if(is_emptyMatcher(w2)){for(var key in(r1.length<r2.length?r1:r2).entries)examineKey(key)}else{for(var key in r1.entries)examineKey(key)}}else{if(is_emptyMatcher(w2)){for(var key in r2.entries)examineKey(key)}else{rupdateInplace(target,__,w);for(var key in r1.entries)examineKey(key);for(var key in r2.entries)examineKey(key)}}return target.emptyGuard()}function walkWild(walker,w,key,k){if(is_emptyMatcher(w))return emptyMatcher;if(is_keyOpen(key))return walker(rwildseq(w),k);if(is_keyClose(key)){if(w instanceof $WildcardSequence)return walker(w.matcher,k);return emptyMatcher}return walker(w,k)}}function erasePath(o1,o2){return walk(o1,o2);function walk(r1,r2){if(is_emptyMatcher(r1)){return emptyMatcher}else{if(is_emptyMatcher(r2)){return r1}}if(r1 instanceof $WildcardSequence){if(r2 instanceof $WildcardSequence){return rwildseq(walk(r1.matcher,r2.matcher))}r1=expandWildseq(r1.matcher)}else if(r2 instanceof $WildcardSequence){r2=expandWildseq(r2.matcher)}if(r1 instanceof $Success&&r2 instanceof $Success){return rsuccess(erasePathSuccesses(r1.value,r2.value))}var w1=r1.get(__);var w2=r2.get(__);var w=walk(w1,w2);var target;function examineKey(key){if(key!==__){var k1=r1.get(key);var k2=r2.get(key);var updatedK;if(is_emptyMatcher(k2)){updatedK=walkWild(key,k1,w2)}else{updatedK=walk(k1,k2)}if(is_keyOpen(key)){rupdateInplace(target,key,updatedK instanceof $WildcardSequence&&matcherEquals(updatedK.matcher,w)?emptyMatcher:updatedK)}else if(is_keyClose(key)){rupdateInplace(target,key,updatedK)}else{rupdateInplace(target,key,matcherEquals(updatedK,w)?emptyMatcher:updatedK)}}}if(is_emptyMatcher(w2)){targ
}};WebSocketConnection.prototype.handleEvent=function(e){switch(e.type){case"routes":var nLevels=e.gestalt.levelCount(0);var relayGestalt=Route.fullGestalt(1,nLevels).label(World.activePid());var g=e.gestalt.erasePath(relayGestalt);this.localGestalt=Route.emptyGestalt;for(var level=0;level<nLevels;level++){this.collectMatchers(false,level,g);this.collectMatchers(true,level,g)}this.sendLocalRoutes();break;case"message":var m=e.message;if(m.length&&m.length===3&&m[0]===this.label){var encoded=JSON.stringify(Codec.encodeEvent(Minimart.sendMessage(m[2],m[1],e.isFeedback)));if(this.deduplicator.accept(encoded)){this.safeSend(encoded)}}break}};WebSocketConnection.prototype.forceclose=function(keepReconnectDelay){if(!keepReconnectDelay){this.reconnectDelay=DEFAULT_RECONNECT_DELAY}this.clearHeartbeatTimers();if(this.sock){console.log("WebSocketConnection.forceclose called");this.sock.close();this.sock=null}};WebSocketConnection.prototype.reconnect=function(){var self=this;this.forceclose(true);this.connectionCount++;this.sock=new WebSocket(this.wsurl);this.sock.onopen=World.wrap(function(e){return self.onopen(e)});this.sock.onmessage=World.wrap(function(e){self.receiveCount++;return self.onmessage(e)});this.sock.onclose=World.wrap(function(e){return self.onclose(e)})};WebSocketConnection.prototype.onopen=function(e){console.log("connected to "+this.sock.url);this.reconnectDelay=DEFAULT_RECONNECT_DELAY;this.prevLocalRoutesMessage=null;this.sendLocalRoutes()};WebSocketConnection.prototype.onmessage=function(wse){this.recordActivity();var j=JSON.parse(wse.data);if(j==="ping"){this.safeSend(JSON.stringify("pong"));return}else if(j==="pong"){return}var e=Codec.decodeAction(j);switch(e.type){case"routes":if(this.prevPeerRoutesMessage!==wse.data){this.prevPeerRoutesMessage=wse.data;this.peerGestalt=e.gestalt;World.updateRoutes([this.aggregateGestalt()])}break;case"message":if(this.deduplicator.accept(wse.data)){World.send([this.label,e.metaLevel,e.message],0,e.isFeedback)}break}};WebSocketConnection.prototype.onclose=function(e){var self=this;console.log("onclose",e);World.updateRoutes([this.aggregateGestalt()]);if(this.shouldReconnect){console.log("reconnecting to "+this.wsurl+" in "+this.reconnectDelay+"ms");setTimeout(World.wrap(function(){self.reconnect()}),this.reconnectDelay);this.reconnectDelay=this.reconnectDelay*1.618+Math.random()*1e3;this.reconnectDelay=this.reconnectDelay>MAX_RECONNECT_DELAY?MAX_RECONNECT_DELAY+Math.random()*1e3:this.reconnectDelay}};module.exports.WebSocketConnection=WebSocketConnection},{"./codec.js":2,"./minimart.js":7}],15:[function(_dereq_,module,exports){var Ground=_dereq_("./ground.js").Ground;var Util=_dereq_("./util.js");var Codec=_dereq_("./codec.js");var Minimart=_dereq_("./minimart.js");var World=Minimart.World;var sub=Minimart.sub;var pub=Minimart.pub;var __=Minimart.__;var BuiltinWorker=typeof window!=="undefined"&&window.Worker;function Worker(scriptUrl){this.scriptUrl=scriptUrl;this.w=new BuiltinWorker(scriptUrl)}Worker.prototype.boot=function(){this.w.onmessage=World.wrap(function(e){console.log("Received from worker",JSON.stringify(e.data));World.current().enqueueAction(World.activePid(),Codec.decodeAction(e.data))})};Worker.prototype.handleEvent=function(e){console.log("Sending to worker",JSON.stringify(Codec.encodeEvent(e)));this.w.postMessage(Codec.encodeEvent(e))};function WorkerGround(bootFn){var self=this;Ground.call(this,bootFn);onmessage=function(e){console.log("Received from main page",JSON.stringify(e.data));self.world.handleEvent(Codec.decodeEvent(e.data));self.startStepping()}}WorkerGround.prototype=Util.extend({},Ground.prototype);WorkerGround.prototype.enqueueAction=function(pid,action){console.log("Sending to main page",JSON.stringify(Codec.encodeAction(action)));postMessage(Codec.encodeAction(action));console.log("Sent to main page")};module.exports.Worker=Worker;module.exports.WorkerGround=WorkerGround},{"./codec.js":2,"./ground.js":4,"./minimart.js":7,"./util.js":12}]},{},[6])(6)});