noflo
Version:
Flow-Based Programming environment for JavaScript
154 lines (125 loc) • 4.3 kB
JavaScript
(function() {
var EventEmitter, InPort, InPorts, OutPort, OutPorts, Ports,
extend = 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; },
hasProp = {}.hasOwnProperty;
EventEmitter = require('events').EventEmitter;
InPort = require('./InPort');
OutPort = require('./OutPort');
Ports = (function(superClass) {
extend(Ports, superClass);
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(superClass) {
extend(InPorts, superClass);
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(superClass) {
extend(OutPorts, superClass);
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);
exports.normalizePortName = function(name) {
var matched, port;
port = {
name: name
};
if (name.indexOf('[') === -1) {
return port;
}
matched = name.match(/(.*)\[([0-9]+)\]/);
if (!(matched != null ? matched.length : void 0)) {
return name;
}
port.name = matched[1];
port.index = matched[2];
return port;
};
}).call(this);