|
@ -1,89 +0,0 @@ |
|
|
/** |
|
|
|
|
|
* An event bus can be used to emit events, and to subscribe to events |
|
|
|
|
|
* @constructor EventBus |
|
|
|
|
|
*/ |
|
|
|
|
|
function EventBus() { |
|
|
|
|
|
this.subscriptions = []; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Subscribe to an event |
|
|
|
|
|
* @param {String | RegExp} event The event can be a regular expression, or |
|
|
|
|
|
* a string with wildcards, like 'server.*'. |
|
|
|
|
|
* @param {function} callback. Callback are called with three parameters: |
|
|
|
|
|
* {String} event, {*} [data], {*} [source] |
|
|
|
|
|
* @param {*} [target] |
|
|
|
|
|
* @returns {String} id A subscription id |
|
|
|
|
|
*/ |
|
|
|
|
|
EventBus.prototype.on = function (event, callback, target) { |
|
|
|
|
|
var regexp = (event instanceof RegExp) ? |
|
|
|
|
|
event : |
|
|
|
|
|
new RegExp(event.replace('*', '\\w+')); |
|
|
|
|
|
|
|
|
|
|
|
var subscription = { |
|
|
|
|
|
id: util.randomUUID(), |
|
|
|
|
|
event: event, |
|
|
|
|
|
regexp: regexp, |
|
|
|
|
|
callback: (typeof callback === 'function') ? callback : null, |
|
|
|
|
|
target: target |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
this.subscriptions.push(subscription); |
|
|
|
|
|
|
|
|
|
|
|
return subscription.id; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Unsubscribe from an event |
|
|
|
|
|
* @param {String | Object} filter Filter for subscriptions to be removed |
|
|
|
|
|
* Filter can be a string containing a |
|
|
|
|
|
* subscription id, or an object containing |
|
|
|
|
|
* one or more of the fields id, event, |
|
|
|
|
|
* callback, and target. |
|
|
|
|
|
*/ |
|
|
|
|
|
EventBus.prototype.off = function (filter) { |
|
|
|
|
|
var i = 0; |
|
|
|
|
|
while (i < this.subscriptions.length) { |
|
|
|
|
|
var subscription = this.subscriptions[i]; |
|
|
|
|
|
|
|
|
|
|
|
var match = true; |
|
|
|
|
|
if (filter instanceof Object) { |
|
|
|
|
|
// filter is an object. All fields must match
|
|
|
|
|
|
for (var prop in filter) { |
|
|
|
|
|
if (filter.hasOwnProperty(prop)) { |
|
|
|
|
|
if (filter[prop] !== subscription[prop]) { |
|
|
|
|
|
match = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// filter is a string, filter on id
|
|
|
|
|
|
match = (subscription.id == filter); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (match) { |
|
|
|
|
|
this.subscriptions.splice(i, 1); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
i++; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Emit an event |
|
|
|
|
|
* @param {String} event |
|
|
|
|
|
* @param {*} [data] |
|
|
|
|
|
* @param {*} [source] |
|
|
|
|
|
*/ |
|
|
|
|
|
EventBus.prototype.emit = function (event, data, source) { |
|
|
|
|
|
for (var i =0; i < this.subscriptions.length; i++) { |
|
|
|
|
|
var subscription = this.subscriptions[i]; |
|
|
|
|
|
if (subscription.regexp.test(event)) { |
|
|
|
|
|
if (subscription.callback) { |
|
|
|
|
|
subscription.callback(event, data, source); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|