JSFiddle - React, Tailwind, and code Playground
by ifandelse
HTML
<script src="https://raw.github.com/documentcloud/underscore/master/underscore.js"></script>
JavaScript
var DEFAULT_EXCHANGE = "/",
DEFAULT_PRIORITY = 50,
DEFAULT_DISPOSEAFTER = 0,
NO_OP = function() { };
var DistinctPredicate = function() {
var previous;
return function(data) {
var eq = false;
if(_.isString(data)) {
eq = data === previous;
previous = data;
}
else {
eq = _.isEqual(data, previous);
previous = _.clone(data);
}
return !eq;
};
};
var ChannelDefinition = function(exchange, topic) {
this.exchange = exchange;
this.topic = topic;
};
ChannelDefinition.prototype = {
subscribe: function(callback) {
var subscription = new SubscriptionDefinition(this.exchange, this.topic, callback);
postal.configuration.bus.subscribe(subscription);
return subscription;
},
publish: function(data) {
postal.configuration.bus.publish({
exchange: this.exchange,
topic: this.topic,
data: data,
timeStamp: new Date()
})
}
};
var SubscriptionDefinition = function(exchange, topic, callback) {
this.exchange = exchange;
this.topic = topic;
this.callback = callback;
this.priority = DEFAULT_PRIORITY;
this.constraints = [];
this.maxCalls = DEFAULT_DISPOSEAFTER;
this.onHandled = NO_OP;
this.context = null
};
SubscriptionDefinition.prototype = {
unsubscribe: function() {
postal.configuration.bus.unsubscribe(this);
},
defer: function() {
var fn = this.callback;
this.callback = function(data) {
setTimeout(fn,0,data);
};
return this;
},
disposeAfter: function(maxCalls) {
if(_.isNaN(maxCalls)) {
throw "The value provided to disposeAfter (maxCalls) must be a number";
}
this.maxCalls = maxCalls;
return this;
},
ignoreDuplicates: function() {
this.withConstraint(new DistinctPredicate());
return...