1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00
node-red/red/nodes/Node.js

148 lines
4.3 KiB
JavaScript
Raw Normal View History

2014-05-03 23:26:35 +02:00
/**
* Copyright 2014 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
2014-05-03 23:26:35 +02:00
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var clone = require("clone");
2014-05-14 22:17:54 +02:00
var when = require("when");
2014-05-03 23:26:35 +02:00
var flows = require("./flows");
2014-05-08 15:15:54 +02:00
var comms = require("../comms");
2014-05-03 23:26:35 +02:00
function Node(n) {
this.id = n.id;
flows.add(this);
this.type = n.type;
if (n.name) {
this.name = n.name;
}
this.wires = n.wires||[];
}
2014-05-15 21:55:01 +02:00
util.inherits(Node,EventEmitter);
Node.prototype._on = Node.prototype.on;
2014-05-14 22:17:54 +02:00
Node.prototype.on = function(event,callback) {
var node = this;
2014-05-14 22:17:54 +02:00
if (event == "close") {
if (callback.length == 1) {
this.close = function() {
return when.promise(function(resolve) {
callback.call(node,function() {
2014-05-14 22:17:54 +02:00
resolve();
});
});
}
} else {
this.close = callback;
}
2014-05-15 21:55:01 +02:00
} else {
this._on(event,callback);
2014-05-14 22:17:54 +02:00
}
2014-05-03 23:26:35 +02:00
}
2014-05-14 22:17:54 +02:00
Node.prototype.close = function() {
}
2014-05-03 23:26:35 +02:00
Node.prototype.send = function(msg) {
// instanceof doesn't work for some reason here
if (msg == null) {
2014-07-09 09:01:52 +02:00
return;
2014-05-03 23:26:35 +02:00
} else if (!util.isArray(msg)) {
msg = [msg];
}
2014-07-02 00:46:25 +02:00
for (var i=0;i<this.wires.length;i++) {
2014-05-03 23:26:35 +02:00
var wires = this.wires[i];
if (i < msg.length) {
if (msg[i] != null) {
var msgs = msg[i];
if (!util.isArray(msg[i])) {
msgs = [msg[i]];
}
//if (wires.length == 1) {
// // Single recipient, don't need to clone the message
// var node = flows.get(wires[0]);
// if (node) {
// for (var k in msgs) {
// var mm = msgs[k];
// node.receive(mm);
// }
// }
//} else {
// Multiple recipients, must send message copies
2014-07-02 00:46:25 +02:00
for (var j=0;j<wires.length;j++) {
2014-05-03 23:26:35 +02:00
var node = flows.get(wires[j]);
if (node) {
2014-07-02 00:46:25 +02:00
for (var k=0;k<msgs.length;k++) {
2014-05-03 23:26:35 +02:00
var mm = msgs[k];
// Temporary fix for #97
// TODO: remove this http-node-specific fix somehow
var req = mm.req;
var res = mm.res;
delete mm.req;
delete mm.res;
var m = clone(mm);
if (req) {
m.req = req;
mm.req = req;
}
if (res) {
m.res = res;
mm.res = res;
}
node.receive(m);
}
}
}
//}
}
}
}
}
Node.prototype.receive = function(msg) {
this.emit("input",msg);
}
2014-07-09 08:42:34 +02:00
function log_helper(self, level, msg) {
var o = {level:level, id:self.id, type:self.type, msg:msg};
if (self.name) {
o.name = self.name;
2014-07-02 00:46:25 +02:00
}
2014-07-09 08:42:34 +02:00
self.emit("log",o);
2014-05-03 23:26:35 +02:00
}
2014-07-09 08:42:34 +02:00
Node.prototype.log = function(msg) {
log_helper(this, 'log', msg);
}
2014-05-03 23:26:35 +02:00
Node.prototype.warn = function(msg) {
2014-07-09 08:42:34 +02:00
log_helper(this, 'warn', msg);
2014-05-03 23:26:35 +02:00
}
2014-07-09 08:42:34 +02:00
2014-05-03 23:26:35 +02:00
Node.prototype.error = function(msg) {
2014-07-09 08:42:34 +02:00
log_helper(this, 'error', msg);
2014-05-03 23:26:35 +02:00
}
2014-07-09 08:42:34 +02:00
2014-05-08 15:15:54 +02:00
/**
* status: { fill:"red|green", shape:"dot|ring", text:"blah" }
*/
Node.prototype.status = function(status) {
comms.publish("status/"+this.id,status,true);
2014-05-08 15:15:54 +02:00
}
2014-05-03 23:26:35 +02:00
module.exports = Node;