diff --git a/nodes/core/89-delay.html b/nodes/core/89-delay.html new file mode 100644 index 000000000..39f28a6a9 --- /dev/null +++ b/nodes/core/89-delay.html @@ -0,0 +1,122 @@ + + + + + + + + + + diff --git a/nodes/core/89-delay.js b/nodes/core/89-delay.js new file mode 100644 index 000000000..ed6ebe947 --- /dev/null +++ b/nodes/core/89-delay.js @@ -0,0 +1,109 @@ +/** + * Copyright 2013 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. + **/ + +// Simple node to introduce a pause into a flow + +// Require main module +var RED = require("../../red/red"); + +// main node definition +function DelayNode(n) { + RED.nodes.createNode(this,n); + + this.pauseType = n.pauseType; + this.timeoutUnits = n.timeoutUnits; + this.rateUnits = n.rateUnits; + + if (n.timeoutUnits == "milliseconds") { + this.timeout = n.timout; + } else if (n.timeoutUnits == "seconds") { + this.timeout = n.timeout * 1000; + } else if (n.timeoutUnits == "minutes") { + this.timeout = n.timeout * (60 * 1000); + } else if (n.timeoutUnits == "hours") { + this.timeout = n.timeout * (60 * 60 * 1000); + } else if (n.timeoutUnits == "days") { + this.timeout = n.timeout * (24 * 60 * 60 * 1000); + } + + if (n.rateUnits == "second") { + this.rate = 1000/n.rate; + } else if (n.rateUnits == "minute") { + this.rate = (60 * 1000)/n.rate; + } else if (n.rateUnits == "hour") { + this.rate = (60 * 60 * 1000)/n.rate; + } else if (n.rateUnits == "day") { + this.rate = (24 * 60 * 60 * 1000)/n.rate; + } + + this.name = n.name; + this.idList = []; + this.buffer = []; + this.intervalID = -1; + var node= this; + + if (this.pauseType == "delay") { + this.on("input", function(msg) { + var node= this; + var id; + id = setTimeout(function(){ + node.idList.splice(node.idList.indexOf(id),1); + node.send(msg); + }, node.timeout); + this.idList.push(id); + }); + + this.on("close", function() { + for (var i=0; i 1000) { + node.warn(this.name + " buffer exceeded 1000 messages"); + } + } else { + node.send(msg); + node.intervalID = setInterval(function() { + if (node.buffer.length == 0) { + clearInterval(node.intervalID); + node.intervalID = -1; + } + + if (node.buffer.length > 0) { + node.send(node.buffer.shift()); + } + },node.rate); + } + }); + + this.on("close", function() { + clearInterval(this.intervalID); + this.buffer = []; + }); + } +} + + + +// register node +RED.nodes.registerType("delay",DelayNode); +