noflo
Version:
Flow-Based Programming environment for JavaScript
137 lines (109 loc) • 3.92 kB
JavaScript
(function() {
var EventEmitter, InPort, InPorts, OutPort, OutPorts, Ports,
__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; };
EventEmitter = require('events').EventEmitter;
InPort = require('./InPort');
OutPort = require('./OutPort');
Ports = (function(_super) {
__extends(Ports, _super);
Ports.prototype.model = InPort;
function Ports(ports) {
var name, options;
this.ports = {};
if (!ports) {
return;
}
for (name in ports) {
options = ports[name];
this.add(name, options);
}
}
Ports.prototype.add = function(name, options, process) {
if (name === 'add' || name === 'remove') {
throw new Error('Add and remove are restricted port names');
}
if (!name.match(/^[a-z0-9_\.\/]+$/)) {
throw new Error("Port names can only contain lowercase alphanumeric characters and underscores. '" + name + "' not allowed");
}
if (this.ports[name]) {
this.remove(name);
}
if (typeof options === 'object' && options.canAttach) {
this.ports[name] = options;
} else {
this.ports[name] = new this.model(options, process);
}
this[name] = this.ports[name];
this.emit('add', name);
return this;
};
Ports.prototype.remove = function(name) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not defined");
}
delete this.ports[name];
delete this[name];
this.emit('remove', name);
return this;
};
return Ports;
})(EventEmitter);
exports.InPorts = InPorts = (function(_super) {
__extends(InPorts, _super);
function InPorts() {
return InPorts.__super__.constructor.apply(this, arguments);
}
InPorts.prototype.on = function(name, event, callback) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].on(event, callback);
};
InPorts.prototype.once = function(name, event, callback) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].once(event, callback);
};
return InPorts;
})(Ports);
exports.OutPorts = OutPorts = (function(_super) {
__extends(OutPorts, _super);
function OutPorts() {
return OutPorts.__super__.constructor.apply(this, arguments);
}
OutPorts.prototype.model = OutPort;
OutPorts.prototype.connect = function(name, socketId) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].connect(socketId);
};
OutPorts.prototype.beginGroup = function(name, group, socketId) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].beginGroup(group, socketId);
};
OutPorts.prototype.send = function(name, data, socketId) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].send(data, socketId);
};
OutPorts.prototype.endGroup = function(name, socketId) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].endGroup(socketId);
};
OutPorts.prototype.disconnect = function(name, socketId) {
if (!this.ports[name]) {
throw new Error("Port " + name + " not available");
}
return this.ports[name].disconnect(socketId);
};
return OutPorts;
})(Ports);
}).call(this);