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