You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

287 lines
7.5 KiB

// Generated by CoffeeScript 1.4.0
(function() {
var Event, EventEmitter, EventEmitterEnhanced, EventSystem, balUtilFlow, balUtilTypes, debug,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
__slice = [].slice;
EventEmitter = require('events').EventEmitter;
balUtilFlow = require(__dirname + '/flow');
balUtilTypes = require(__dirname + '/types');
debug = false;
EventEmitterEnhanced = (function(_super) {
__extends(EventEmitterEnhanced, _super);
function EventEmitterEnhanced() {
return EventEmitterEnhanced.__super__.constructor.apply(this, arguments);
}
EventEmitterEnhanced.prototype.emitAsync = function(eventName, data, next) {
var listener, listeners, tasks, _i, _len;
listeners = this.listeners(eventName);
tasks = new balUtilFlow.Group(next);
for (_i = 0, _len = listeners.length; _i < _len; _i++) {
listener = listeners[_i];
tasks.push({
listener: listener
}, function(complete) {
return balUtilFlow.fireWithOptionalCallback(this.listener, [data, complete]);
});
}
tasks.async();
return this;
};
EventEmitterEnhanced.prototype.emitSync = function(eventName, data, next) {
var listener, listeners, tasks, _i, _len;
listeners = this.listeners(eventName);
tasks = new balUtilFlow.Group(next);
for (_i = 0, _len = listeners.length; _i < _len; _i++) {
listener = listeners[_i];
tasks.push({
listener: listener
}, function(complete) {
return balUtilFlow.fireWithOptionalCallback(this.listener, [data, complete]);
});
}
tasks.sync();
return this;
};
return EventEmitterEnhanced;
})(EventEmitter);
Event = (function() {
Event.prototype.name = null;
Event.prototype.locked = false;
Event.prototype.finished = false;
function Event(_arg) {
this.name = _arg.name;
}
return Event;
})();
EventSystem = (function(_super) {
__extends(EventSystem, _super);
function EventSystem() {
return EventSystem.__super__.constructor.apply(this, arguments);
}
EventSystem.prototype._eventSystemEvents = null;
EventSystem.prototype.event = function(eventName) {
var _base;
this._eventSystemEvents || (this._eventSystemEvents = {});
return (_base = this._eventSystemEvents)[eventName] || (_base[eventName] = new Event(eventName));
};
EventSystem.prototype.lock = function(eventName, next) {
var event,
_this = this;
event = this.event(eventName);
if (event.locked === false) {
event.locked = true;
try {
this.emit(eventName + ':locked');
} catch (err) {
next(err);
return this;
} finally {
next();
}
} else {
this.onceUnlocked(eventName, function(err) {
if (err) {
return next(err);
}
return _this.lock(eventName, next);
});
}
return this;
};
EventSystem.prototype.unlock = function(eventName, next) {
var event;
event = this.event(eventName);
event.locked = false;
try {
this.emit(eventName + ':unlocked');
} catch (err) {
next(err);
return this;
} finally {
next();
}
return this;
};
EventSystem.prototype.start = function(eventName, next) {
var _this = this;
this.lock(eventName, function(err) {
var event;
if (err) {
return next(err);
}
event = _this.event(eventName);
event.finished = false;
try {
return _this.emit(eventName + ':started');
} catch (err) {
next(err);
return _this;
} finally {
next();
}
});
return this;
};
EventSystem.prototype.finish = function() {
var args;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return this.finished.apply(this, args);
};
EventSystem.prototype.finished = function(eventName, next) {
var event,
_this = this;
event = this.event(eventName);
event.finished = true;
this.unlock(eventName, function(err) {
if (err) {
return next(err);
}
try {
return _this.emit(eventName + ':finished');
} catch (err) {
next(err);
return _this;
} finally {
next();
}
});
return this;
};
EventSystem.prototype.onceUnlocked = function(eventName, next) {
var event;
if (debug) {
console.log("onceUnlocked " + eventName);
}
event = this.event(eventName);
if (event.locked) {
this.once(eventName + ':unlocked', next);
} else {
next();
}
return this;
};
EventSystem.prototype.onceFinished = function(eventName, next) {
var event;
event = this.event(eventName);
if (event.finished) {
next();
} else {
this.once(eventName + ':finished', next);
}
return this;
};
EventSystem.prototype.whenFinished = function(eventName, next) {
var event;
event = this.event(eventName);
if (event.finished) {
next();
}
this.on(eventName + ':finished', next);
return this;
};
EventSystem.prototype.when = function() {
var args;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return this.on.apply(this, args);
};
EventSystem.prototype.block = function(eventNames, next) {
var done, err, eventName, total, _i, _len;
if (!balUtilTypes.isArray(eventNames)) {
if (balUtilTypes.isString(eventNames)) {
eventNames = eventNames.split(/[,\s]+/g);
} else {
err = new Error('Unknown eventNames type');
return next(err);
}
}
total = eventNames.length;
done = 0;
for (_i = 0, _len = eventNames.length; _i < _len; _i++) {
eventName = eventNames[_i];
this.lock(eventName, function(err) {
if (err) {
done = total;
return next(err);
}
done++;
if (done === total) {
return next();
}
});
}
return this;
};
EventSystem.prototype.unblock = function(eventNames, next) {
var done, err, eventName, total, _i, _len;
if (!balUtilTypes.isArray(eventNames)) {
if (balUtilTypes.isString(eventNames)) {
eventNames = eventNames.split(/[,\s]+/g);
} else {
err = new Error('Unknown eventNames type');
return next(err);
}
}
total = eventNames.length;
done = 0;
for (_i = 0, _len = eventNames.length; _i < _len; _i++) {
eventName = eventNames[_i];
this.unlock(eventName, function(err) {
if (err) {
done = total;
return next(err);
}
done++;
if (done === total) {
return next();
}
});
}
return this;
};
return EventSystem;
})(EventEmitterEnhanced);
module.exports = {
EventEmitterEnhanced: EventEmitterEnhanced,
Event: Event,
EventSystem: EventSystem
};
}).call(this);