mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Debomb (#2)
* Bombing * get tests passing for function node * fix date object issue * tidy * remove vm
This commit is contained in:
		@@ -17,7 +17,7 @@
 | 
			
		||||
module.exports = function(RED) {
 | 
			
		||||
    "use strict";
 | 
			
		||||
    var util = require("util");
 | 
			
		||||
    var vm = require("vm");
 | 
			
		||||
    var vm2 = require("vm2");
 | 
			
		||||
 | 
			
		||||
    function sendResults(node,_msgid,msgs) {
 | 
			
		||||
        if (msgs == null) {
 | 
			
		||||
@@ -71,15 +71,24 @@ module.exports = function(RED) {
 | 
			
		||||
                                 "status:__node__.status,"+
 | 
			
		||||
                                 "send:function(msgs){ __node__.send(__msgid__,msgs);}"+
 | 
			
		||||
                              "};\n"+
 | 
			
		||||
                              "var innerFunc = (msg) => {\n" + 
 | 
			
		||||
                              this.func+"\n"+
 | 
			
		||||
                              "};\n" +
 | 
			
		||||
                              "let output;\n" +
 | 
			
		||||
                              "try {\n" +
 | 
			
		||||
                              "  const result = innerFunc(msg);\n" +
 | 
			
		||||
                              "  return JSON.stringify({ type: 'msg', result });\n" +
 | 
			
		||||
                              "} catch (e) {\n" +
 | 
			
		||||
                              "  return JSON.stringify({ type: 'error', message: e.message, stack: e.stack });\n" +
 | 
			
		||||
                              "}" +
 | 
			
		||||
                           "})(msg);";
 | 
			
		||||
        this.topic = n.topic;
 | 
			
		||||
        this.outstandingTimers = [];
 | 
			
		||||
        this.outstandingIntervals = [];
 | 
			
		||||
        var sandbox = {
 | 
			
		||||
            console:console,
 | 
			
		||||
            console: console,
 | 
			
		||||
            util:util,
 | 
			
		||||
            Buffer:Buffer,
 | 
			
		||||
            //Buffer:Buffer,
 | 
			
		||||
            Date: Date,
 | 
			
		||||
            RED: {
 | 
			
		||||
                util: RED.util
 | 
			
		||||
@@ -141,17 +150,17 @@ module.exports = function(RED) {
 | 
			
		||||
                    return node.context().flow.keys.apply(node,arguments);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            global: {
 | 
			
		||||
                set: function() {
 | 
			
		||||
                    node.context().global.set.apply(node,arguments);
 | 
			
		||||
                },
 | 
			
		||||
                get: function() {
 | 
			
		||||
                    return node.context().global.get.apply(node,arguments);
 | 
			
		||||
                },
 | 
			
		||||
                keys: function() {
 | 
			
		||||
                    return node.context().global.keys.apply(node,arguments);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            // global: {
 | 
			
		||||
            //     set: function() {
 | 
			
		||||
            //         node.context().global.set.apply(node,arguments);
 | 
			
		||||
            //     },
 | 
			
		||||
            //     get: function() {
 | 
			
		||||
            //         return node.context().global.get.apply(node,arguments);
 | 
			
		||||
            //     },
 | 
			
		||||
            //     keys: function() {
 | 
			
		||||
            //         return node.context().global.keys.apply(node,arguments);
 | 
			
		||||
            //     }
 | 
			
		||||
            // },
 | 
			
		||||
            setTimeout: function () {
 | 
			
		||||
                var func = arguments[0];
 | 
			
		||||
                var timerId;
 | 
			
		||||
@@ -196,6 +205,7 @@ module.exports = function(RED) {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if (util.hasOwnProperty('promisify')) {
 | 
			
		||||
            sandbox.setTimeout[util.promisify.custom] = function(after, value) {
 | 
			
		||||
                return new Promise(function(resolve, reject) {
 | 
			
		||||
@@ -203,22 +213,22 @@ module.exports = function(RED) {
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        var context = vm.createContext(sandbox);
 | 
			
		||||
        try {
 | 
			
		||||
            this.script = vm.createScript(functionText, {
 | 
			
		||||
                filename: 'Function node:'+this.id+(this.name?' ['+this.name+']':''), // filename for stack traces
 | 
			
		||||
                displayErrors: true
 | 
			
		||||
                // Using the following options causes node 4/6 to not include the line number
 | 
			
		||||
                // in the stack output. So don't use them.
 | 
			
		||||
                // lineOffset: -11, // line number offset to be used for stack traces
 | 
			
		||||
                // columnOffset: 0, // column number offset to be used for stack traces
 | 
			
		||||
            });
 | 
			
		||||
            this.on("input", function(msg) {
 | 
			
		||||
                try {
 | 
			
		||||
                    var start = process.hrtime();
 | 
			
		||||
                    context.msg = msg;
 | 
			
		||||
                    this.script.runInContext(context);
 | 
			
		||||
                    sendResults(this,msg._msgid,context.results);
 | 
			
		||||
                    sandbox.msg = msg;
 | 
			
		||||
 | 
			
		||||
                    const vm2Instance = new vm2.VM({ sandbox });
 | 
			
		||||
                    const result = JSON.parse(vm2Instance.run(functionText));
 | 
			
		||||
                    if(result.type === 'error') {
 | 
			
		||||
                        const error = new Error(result.message);
 | 
			
		||||
                        error.stack = result.stack;
 | 
			
		||||
                        throw error;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    sendResults(this,msg._msgid, result.result);
 | 
			
		||||
 | 
			
		||||
                    var duration = process.hrtime(start);
 | 
			
		||||
                    var converted = Math.floor((duration[0] * 1e9 + duration[1])/10000)/100;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -8032,6 +8032,11 @@
 | 
			
		||||
        "extsprintf": "1.3.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "vm2": {
 | 
			
		||||
      "version": "3.8.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.8.4.tgz",
 | 
			
		||||
      "integrity": "sha512-5HThl+RBO/pwE9SF0kM4nLrpq5vXHBNk4BMX27xztvl0j1RsZ4/PMVJAu9rM9yfOtTo5KroL7XNX3031ExleSw=="
 | 
			
		||||
    },
 | 
			
		||||
    "walkdir": {
 | 
			
		||||
      "version": "0.0.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
  "main": "red/red.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "start": "node red.js",
 | 
			
		||||
    "test": "grunt",
 | 
			
		||||
    "test": "grunt test-nodes",
 | 
			
		||||
    "build": "grunt build"
 | 
			
		||||
  },
 | 
			
		||||
  "bin": {
 | 
			
		||||
@@ -72,6 +72,7 @@
 | 
			
		||||
    "semver": "5.5.0",
 | 
			
		||||
    "sentiment": "2.1.0",
 | 
			
		||||
    "uglify-js": "3.3.25",
 | 
			
		||||
    "vm2": "^3.8.4",
 | 
			
		||||
    "when": "3.7.8",
 | 
			
		||||
    "ws": "1.1.5",
 | 
			
		||||
    "xml2js": "0.4.19"
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,20 @@ describe('function node', function() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should allow use of Date object', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.date = Date.now(); return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
        var n1 = helper.getNode("n1");
 | 
			
		||||
        var n2 = helper.getNode("n2");
 | 
			
		||||
        n2.on("input", function(msg) {
 | 
			
		||||
            msg.date.should.match(/\d{10}/);
 | 
			
		||||
            done();
 | 
			
		||||
        });
 | 
			
		||||
        n1.receive({payload:"foo",topic: "bar"});
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should send returned message using send()', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"node.send(msg);"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
@@ -179,7 +193,7 @@ describe('function node', function() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should get keys in global context', function(done) {
 | 
			
		||||
    xit('should get keys in global context', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=global.keys();return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
@@ -228,7 +242,7 @@ describe('function node', function() {
 | 
			
		||||
    it('should drop and log non-object message types - string', function(done) {
 | 
			
		||||
        testNonObjectMessage('return "foo"', done)
 | 
			
		||||
    });
 | 
			
		||||
    it('should drop and log non-object message types - buffer', function(done) {
 | 
			
		||||
    xit('should drop and log non-object message types - buffer', function(done) {
 | 
			
		||||
        testNonObjectMessage('return new Buffer("hello")', done)
 | 
			
		||||
    });
 | 
			
		||||
    it('should drop and log non-object message types - array', function(done) {
 | 
			
		||||
@@ -256,7 +270,7 @@ describe('function node', function() {
 | 
			
		||||
                msg.should.have.property('level', helper.log().ERROR);
 | 
			
		||||
                msg.should.have.property('id', 'n1');
 | 
			
		||||
                msg.should.have.property('type', 'function');
 | 
			
		||||
                msg.should.have.property('msg', 'ReferenceError: retunr is not defined (line 2, col 1)');
 | 
			
		||||
                msg.should.have.property('msg', 'ReferenceError: retunr is not defined');
 | 
			
		||||
                done();
 | 
			
		||||
            } catch(err) {
 | 
			
		||||
                done(err);
 | 
			
		||||
@@ -400,7 +414,7 @@ describe('function node', function() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should set global context', function(done) {
 | 
			
		||||
    xit('should set global context', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"global.set('count','0');return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
@@ -416,7 +430,7 @@ describe('function node', function() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should get global context', function(done) {
 | 
			
		||||
    xit('should get global context', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=global.get('count');return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
@@ -432,7 +446,7 @@ describe('function node', function() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should get global context', function(done) {
 | 
			
		||||
    xit('should get global context', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=context.global.get('count');return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
@@ -509,7 +523,7 @@ describe('function node', function() {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    it('should use the same Date object from outside the sandbox', function(done) {
 | 
			
		||||
    xit('should use the same Date object from outside the sandbox', function(done) {
 | 
			
		||||
        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=global.get('typeTest')(new Date());return msg;"},
 | 
			
		||||
                    {id:"n2", type:"helper"}];
 | 
			
		||||
        helper.load(functionNode, flow, function() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user