Skip to content

Commit

Permalink
Merge eaa2622 into 2f16fe7
Browse files Browse the repository at this point in the history
  • Loading branch information
jcgertig committed May 7, 2018
2 parents 2f16fe7 + eaa2622 commit 0c265c4
Show file tree
Hide file tree
Showing 6 changed files with 306 additions and 238 deletions.
32 changes: 32 additions & 0 deletions lib/modules/supervisor/supervision/deregister-citizen.js
@@ -0,0 +1,32 @@
module.exports = function( supervisor, citizens, config ){

supervisor.deregister = deregister_citizen;

function perform_deregister_citizen( accept, reject, name ) {
supervisor.hook.run( 'citizen-deregistration', citizens[ name ] );

delete citizens[ name ];

// deregistration complete
supervisor.noticeboard.notify( 'citizen-deregistered', { name: name });
supervisor.noticeboard.notify( name + '-deregistered' );

return accept();
}

function deregister_citizen( name ){
return new Promise( function ( accept, reject ) {
// if unregistered, reject
if( ! supervisor.is_registered( name ) )
return reject( new Error( 'no citizen named "' + name + '" has been registed' ) );

// if citizen is not running then complete
if( citizens[ name ].ref )
return supervisor.stop( name )
.then( () => perform_deregister_citizen( accept, reject, name ) )
.catch( reject );

return perform_deregister_citizen( accept, reject, name );
}) ;
}
}
Expand Up @@ -6,15 +6,15 @@ module.exports = function( supervisor ){

delete citizen.ref;

if( code === 0 ){
if( code === 0 ){
supervisor.noticeboard.notify( 'citizen-shutdown', { name: citizen.name });
supervisor.noticeboard.notify( citizen.name + '-shutdown' );
}

else{
supervisor.noticeboard.notify( 'citizen-crashed', { name: citizen.name });
supervisor.noticeboard.notify( citizen.name + '-crashed' );
}
}
});
});
}
}
55 changes: 28 additions & 27 deletions lib/modules/supervisor/supervision/register-citizen.js
@@ -1,42 +1,43 @@
var merge = require('merge-objects');

module.exports = function( supervisor, citizens, config ){

supervisor.register = register_citizen;

function register_citizen( name, file, params ){
return new Promise( function ( accept, reject ) {
// filter bad input
if( !name ) return reject( new Error( 'requires a name to refer to supervised process' ) );
if( !file ) return reject( new Error( 'requires path to file to run to supervised process' ) );
if( typeof name !== 'string' ) return reject( new Error( 'name must be a string' ) );
if( typeof file !== 'string' ) return reject( new Error( 'path to file must be a string' ) );
if( !params ) params = {};

// filter bad input
if( !name ) throw new Error( 'requires a name to refer to supervised process' );
if( !file ) throw new Error( 'requires path to file to run to supervised process' );
if( typeof name !== 'string' ) throw new Error( 'name must be a string' );
if( typeof file !== 'string' ) throw new Error( 'path to file must be a string' );
if( !params ) params = {};

// ensure citizen name isn't already taken
if( supervisor.is_registered( name ) ){
// ensure citizen name isn't already taken
if( supervisor.is_registered( name ) ){

if( citizens[ name ].file === file ) return citizens[ name ];
else throw new Error( 'a citizen named "' + name + '" already exists' );
}
if( citizens[ name ].file === file ) return accept( citizens[ name ] );
else return reject( new Error( 'a citizen named "' + name + '" already exists' ) );
}

// store citizen in map
citizens[ name ] = {
// store citizen in map
citizens[ name ] = {

name: name,
file: file,
state: {},
name: name,
file: file,
state: {},

config: merge({ retries: config.retries, duration: config.duration }, params )
};
config: merge( { retries: config.retries, duration: config.duration }, params )
};

// customize citizen instance
citizens[ name ] = supervisor.hook.run( 'citizen-registration', citizens[ name ] );
// customize citizen instance
citizens[ name ] = supervisor.hook.run( 'citizen-registration', citizens[ name ] );

// registration complete
supervisor.noticeboard.notify( 'citizen-registered', { name: name });
supervisor.noticeboard.notify( name + '-registered' );
// registration complete
supervisor.noticeboard.notify( 'citizen-registered', { name: name });
supervisor.noticeboard.notify( name + '-registered' );

return citizens[ name ];
return accept( citizens[ name ] );
} );
}
}
}
29 changes: 18 additions & 11 deletions lib/modules/supervisor/supervision/start-citizen.js
Expand Up @@ -4,20 +4,15 @@ module.exports = function( supervisor, citizens, config ){

supervisor.start = start_citizen;

function start_citizen( name, file, params ){

// if unregistered, register citizen now
if( ! supervisor.is_registered( name ) )
supervisor.register( name, file, params );

function perform_start_citizen ( accept, reject, name, file, params ) {
// specified filepath doesn't match registered citizen's filepath? something is wrong
if( file && file !== citizens[ name ].file )
throw new Error( 'citizen named "' + name + '" already exists' );
return reject( new Error( 'citizen named "' + name + '" already exists' ) );

var citizen = citizens[ name ];

// bail if citizen is already running
if( citizen.ref ) return;
if( citizen.ref ) return reject( new Error( 'citizen named "' + name + '" already exists and is running' ) );

// spawn citizen process
citizen.ref = child_process.spawn( 'node', [ citizens[ name ].file ], {
Expand All @@ -32,6 +27,18 @@ module.exports = function( supervisor, citizens, config ){
supervisor.noticeboard.notify( name + '-started' );
supervisor.noticeboard.notify( 'citizen-started', { name: name });

return citizen;
}
}
return accept(citizen);
}

function start_citizen( name, file, params ){
return new Promise( function ( accept, reject ) {
// if unregistered, register citizen now
if( ! supervisor.is_registered( name ) )
return supervisor.register( name, file, params )
.then( () => perform_start_citizen( accept, reject, name, file, params ) )
.catch( reject );

return perform_start_citizen( accept, reject, name, file, params );
} );
}
}
27 changes: 27 additions & 0 deletions lib/modules/supervisor/supervision/stop-citizen.js
@@ -0,0 +1,27 @@
module.exports = function( supervisor, citizens, config ){

supervisor.stop = stop_citizen;

function stop_citizen( name ){
return new Promise( function ( accept, reject ) {
// if unregistered, reject
if( ! supervisor.is_registered( name ) )
return reject( new Error( 'no citizen named "' + name + '" has been registed' ) );

var citizen = citizens[ name ];

// if citizen is not running then complete
if( ! citizen.ref ) return accept();

citizen = supervisor.hook.run( 'citizen-stoping', citizen );

citizen.ref.kill('SIGHUP');

delete citizen.ref;

citizens[ name ] = citizen;

return accept();
} );
}
}

0 comments on commit 0c265c4

Please sign in to comment.