| @ -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); | |||
| } | |||
| } | |||
| } | |||
| }; | |||