mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Allow nodes types to initialise asynchronously at start
The code scans the flows that are to be started and checks all of the necessary node types are registered; if not, it doesn't start the flows. An event is emitted when each node type is registered - allowing the server to track when all of the 'missing' node types register and then start the flows. This is a step towards adding node-types without restarting.
This commit is contained in:
		
							
								
								
									
										62
									
								
								red/nodes.js
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								red/nodes.js
									
									
									
									
									
								
							| @@ -98,6 +98,7 @@ var node_type_registry = (function() { | ||||
|                         if (! node_configs[configFilename]) { | ||||
|                             node_configs[configFilename] = fs.readFileSync(configFilename,'utf8'); | ||||
|                         } | ||||
|                         events.emit("type-registered",type); | ||||
|                     } else { | ||||
|                         util.log("["+type+"] missing template file: "+configFilename); | ||||
|                     } | ||||
| @@ -106,9 +107,6 @@ var node_type_registry = (function() { | ||||
|             get: function(type) { | ||||
|                 return node_types[type]; | ||||
|             }, | ||||
|             registerNodeConfig: function(type,config) { | ||||
|                 node_configs[type] = config; | ||||
|             }, | ||||
|             getNodeConfigs: function() { | ||||
|                 var result = ""; | ||||
|                 for (var nt in node_configs) { | ||||
| @@ -256,33 +254,75 @@ module.exports.load = function() { | ||||
|  | ||||
|     loadNodes("nodes"); | ||||
|  | ||||
|     events.emit("nodes-loaded"); | ||||
|     //events.emit("nodes-loaded"); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| var activeConfig = null; | ||||
| var missingTypes = []; | ||||
|  | ||||
| events.on('type-registered',function(type) { | ||||
|         if (missingTypes.length > 0) { | ||||
|             var i = missingTypes.indexOf(type); | ||||
|             if (i != -1) { | ||||
|                 missingTypes.splice(i,1); | ||||
|                 util.log("[red] Missing type registered: "+type); | ||||
|             } | ||||
|             if (missingTypes.length == 0) { | ||||
|                 parseConfig(); | ||||
|             } | ||||
|         } | ||||
| }); | ||||
|  | ||||
|  | ||||
| module.exports.getNode = function(nid) { | ||||
|     return registry.get(nid); | ||||
| } | ||||
| module.exports.parseConfig = function(conf) { | ||||
|  | ||||
| module.exports.setConfig = function(conf) { | ||||
|     if (activeConfig&&activeConfig.length > 0) { | ||||
|         util.log("[red] Stopping flows"); | ||||
|     } | ||||
|     registry.clear(); | ||||
|     activeConfig = conf; | ||||
|     parseConfig(); | ||||
| } | ||||
|  | ||||
| var parseConfig = function() { | ||||
|  | ||||
|     missingTypes = []; | ||||
|     for (var i in activeConfig) { | ||||
|         var type = activeConfig[i].type; | ||||
|         var nt = node_type_registry.get(type); | ||||
|         if (!nt && missingTypes.indexOf(type) == -1) { | ||||
|             missingTypes.push(type); | ||||
|         } | ||||
|     }; | ||||
|     if (missingTypes.length > 0) { | ||||
|         util.log("[red] Waiting for missing types to be registered:"); | ||||
|         for (var i in missingTypes) { | ||||
|             util.log("[red]  - "+missingTypes[i]); | ||||
|         } | ||||
|          | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     util.log("[red] Starting flows"); | ||||
|     events.emit("nodes-starting"); | ||||
|     for (var i in conf) { | ||||
|     for (var i in activeConfig) { | ||||
|         var nn = null; | ||||
|         var nt = node_type_registry.get(conf[i].type); | ||||
|         var nt = node_type_registry.get(activeConfig[i].type); | ||||
|         if (nt) { | ||||
| 			try { | ||||
| 				nn = new nt(conf[i]); | ||||
| 				nn = new nt(activeConfig[i]); | ||||
| 			} | ||||
| 			catch (err) { | ||||
| 				util.log("[red] "+conf[i].type+" : "+err); | ||||
| 				util.log("[red] "+activeConfig[i].type+" : "+err); | ||||
| 			} | ||||
|         } | ||||
|         // console.log(nn); | ||||
|         if (nn == null) { | ||||
|             util.log("[red] unknown type: "+conf[i].type); | ||||
|             util.log("[red] unknown type: "+activeConfig[i].type); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -60,7 +60,7 @@ function createServer(_server,settings) { | ||||
|                             if(err) { | ||||
|                                 util.log(err); | ||||
|                             } else { | ||||
|                                 redNodes.parseConfig(JSON.parse(fullBody)); | ||||
|                                 redNodes.setConfig(JSON.parse(fullBody)); | ||||
|                             } | ||||
|                     }); | ||||
|             }); | ||||
| @@ -79,13 +79,12 @@ function createServer(_server,settings) { | ||||
|     util.log('or any other errors are resolved'); | ||||
|     util.log("------------------------------------------"); | ||||
|  | ||||
|     util.log("[red] Loading workspace flow : "+rulesfile); | ||||
|  | ||||
|      | ||||
|     fs.exists(rulesfile, function (exists) { | ||||
|             if (exists) { | ||||
|                 util.log("[red] Loading workspace flow : "+rulesfile); | ||||
|                 fs.readFile(rulesfile,'utf8',function(err,data) { | ||||
|                         redNodes.parseConfig(JSON.parse(data)); | ||||
|                         redNodes.setConfig(JSON.parse(data)); | ||||
|                 }); | ||||
|             } | ||||
|     }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user