@@ -94,6 +94,45 @@ export class noderedcontribopenflowstorage {
9494 }
9595 return text ;
9696 }
97+
98+
99+
100+
101+ scanDirForNodesModules ( dir ) {
102+ let files = fs . readdirSync ( dir , { encoding : 'utf8' , withFileTypes : true } ) ;
103+ let results = [ ] ;
104+ files . sort ( ) ;
105+ files . forEach ( ( fn ) => {
106+ var stats = fs . statSync ( path . join ( dir , fn . name ) ) ;
107+ if ( stats . isFile ( ) ) {
108+ } else if ( stats . isDirectory ( ) ) {
109+ if ( fn . name == "node_modules" ) {
110+ results = results . concat ( this . scanDirForNodesModules ( path . join ( dir , fn . name ) ) ) ;
111+ } else {
112+ const pkgfn = path . join ( dir , fn . name , "package.json" ) ;
113+ if ( fs . existsSync ( pkgfn ) ) {
114+ var pkg = require ( pkgfn ) ;
115+ // var moduleDir = path.join(dir, fn);
116+ // results.push({ dir: moduleDir, package: pkg });
117+ results . push ( pkg ) ;
118+ }
119+ }
120+ }
121+ } ) ;
122+ return results ;
123+ }
124+ getGlobalModulesDir ( ) {
125+ return new Promise < string > ( ( resolve , reject ) => {
126+ var npm = require ( "global-npm" )
127+ var myConfigObject = { }
128+ npm . load ( myConfigObject , function ( err ) {
129+ if ( err ) return reject ( err )
130+ // const test = npm.get('prefix');
131+ // console.log(test);
132+ resolve ( npm . globalPrefix ) ;
133+ } )
134+ } ) ;
135+ }
97136 DiffObjects ( o1 , o2 ) {
98137 // choose a map() impl.
99138 // you may use $.map from jQuery if you wish
@@ -521,44 +560,35 @@ export class noderedcontribopenflowstorage {
521560 if ( this . _settings == null ) {
522561 this . _settings = settings ;
523562 try {
524-
525- //if (this.firstrun) {
526563 const child_process = require ( "child_process" ) ;
564+ const globaldir = await this . getGlobalModulesDir ( ) ;
565+ let currentmodules = this . scanDirForNodesModules ( path . resolve ( '.' ) ) ;
566+ currentmodules = currentmodules . concat ( this . scanDirForNodesModules ( globaldir ) ) ;
567+ // currentmodules.forEach(pck => {
568+ // console.log(pck.name + "@" + pck.version);
569+ // });
527570 const keys = Object . keys ( settings . nodes ) ;
528- let modules = "" ;
571+ // let modules = "";
529572 for ( let i = 0 ; i < keys . length ; i ++ ) {
530573 const key = keys [ i ] ;
574+ if ( key == "node-red" || key == "node-red-node-rbe" || key == "node-red-node-tail" ) continue ;
531575 const val = settings . nodes [ key ] ;
532- if ( [ "node-red" ] . indexOf ( key ) === - 1 ) {
533- // if (["node-red", "node-red-node-email", "node-red-node-feedparser", "node-red-node-rbe",
534- // "node-red-node-sentiment", "node-red-node-tail", "node-red-node-twitter"].indexOf(key) === -1) {
535- let pname : string = val . name + "@" + val . version ;
536- if ( val . pending_version ) {
537- pname = val . name + "@" + val . pending_version ;
576+ const version = ( val . pending_version ? val . pending_version : val . version )
577+ const pcks = currentmodules . filter ( x => x . name == key && x . version == version ) ;
578+ if ( pcks . length != 1 ) {
579+ try {
580+ this . _logger . info ( "Installing " + key + "@" + version ) ;
581+ child_process . execSync ( "npm install " + key + "@" + version , { stdio : [ 0 , 1 , 2 ] , cwd : this . settings . userDir } ) ;
582+ } catch ( error ) {
583+ this . _logger . error ( "npm install error" ) ;
584+ if ( error . status ) this . _logger . error ( "npm install status: " + error . status ) ;
585+ if ( error . message ) this . _logger . error ( "npm install message: " + error . message ) ;
586+ if ( error . stderr ) this . _logger . error ( "npm install stderr: " + error . stderr ) ;
587+ if ( error . stdout ) this . _logger . error ( "npm install stdout: " + error . stdout ) ;
538588 }
539- // this._logger.info("Installing " + pname);
540- // child_process.execSync("npm install " + pname, { stdio: [0, 1, 2], cwd: this.settings.userDir });
541- modules += ( " " + pname ) ;
542- }
543- }
544- this . _logger . info ( "Installing " + modules ) ;
545- let errorcounter = 0 ;
546- while ( errorcounter < 5 ) {
547- try {
548- child_process . execSync ( "npm install " + modules , { stdio : [ 0 , 1 , 2 ] , cwd : this . settings . userDir } ) ;
549- errorcounter = 10 ;
550- } catch ( error ) {
551- errorcounter ++ ;
552- this . _logger . error ( "npm install error" ) ;
553- if ( error . status ) this . _logger . error ( "npm install status: " + error . status ) ;
554- if ( error . message ) this . _logger . error ( "npm install message: " + error . message ) ;
555- if ( error . stderr ) this . _logger . error ( "npm install stderr: " + error . stderr ) ;
556- if ( error . stdout ) this . _logger . error ( "npm install stdout: " + error . stdout ) ;
589+
557590 }
558591 }
559- this . last_reload = new Date ( ) ;
560- this . _logger . silly ( "noderedcontribopenflowstorage::_getSettings: return result" ) ;
561- this . _logger . info ( "Installation of NPM packages complete" ) ;
562592 } catch ( error ) {
563593 this . _logger . error ( error ) ;
564594 settings = { } ;
@@ -582,7 +612,9 @@ export class noderedcontribopenflowstorage {
582612 this . firstrun = false ;
583613 if ( WebSocketClient . instance . supports_watch ) {
584614 try {
615+ this . last_reload = new Date ( ) ;
585616 await this . CheckUpdates ( ) ;
617+ this . last_reload = new Date ( ) ;
586618 } catch ( error ) {
587619 this . _logger . error ( error ) ;
588620 }
@@ -659,9 +691,7 @@ export class noderedcontribopenflowstorage {
659691 update = true ;
660692 }
661693 } else if ( entity . _type == "setting" ) {
662- console . log ( "SETTINGs!!! 1" ) ;
663694 this . _logger . info ( "noderedcontribopenflowstorage::onupdate setting init " + new Date ( ) . toLocaleTimeString ( ) ) ;
664- console . log ( "SETTINGs!!! 2" ) ;
665695 let oldsettings : any = null ;
666696 let exitprocess : boolean = false ;
667697 if ( this . _settings != null ) {
0 commit comments