hci ===== Introduction: --------------- Researching a way to bring java alike OSGi to nodejs for hot swappable modules. This is not an intention to replace nodejs modules but a way to swap certain areas of the application such as bringing new versions without a restart Bundles will communicate with each others using events as shown in examples Node modules can be added and updated they will be exported/used as: Since as osgi there is no order on module loading, with context.with we do the callback just when we have the module, else it will be ignored the goal is to keep module always running with no dependencies in case module depends on other module to perform its main operation, it can always return an error instead of not working at all ```javascript // using node modules as bundles: var activator = { start(context) { context.setInterval(() => { // using context.setInterval it will automatically clearInterval on bundle stop context.with(['prettyjson'],(prettyjson) => { prettyjson.render({test: 'test'}) }) },3000) } } ``` Usage: ------- Bundle: A bundle should export bundleStart, or bundleActivator object with start and stop methods This specific bundle it will receive messages from core-shell bundle, execute a shell command and print output Placing the bundle in {app path}/bundles/shell-test/index.js ```javascript var log = require('hlogger').createLogger('shell-test'); var child = require('child_process'); function bundleStart(context) { log.info('Command provider installed'); // Create a bash and transport commands context.events .channel('core-shell') .after('cmd',(req,res,e) => { // Subscribe for core-shell cmd messages, after means it will let execute any preexisting shell and if not found it will execute this if(e.count != 0) return; e.wait(); var shcmd = req.cmd + " " + req.args.join(" "); var proc = child.exec(shcmd); proc.stdout.pipe(res); proc.stderr.pipe(process.stderr); proc.on('close',function() { e.done(); }); }); } module.exports.bundleStart = bundleStart; ``` Main app: ```javascript var BundleManager = require('node-hci'); // or path to node-hci since is not published in npm yet // This will load bundles from the {app path}/bundles var manager = new BundleManager({runPath: __dirname + "/bundles"}); manager.loadDefaultBundles(); ``` Result of this bundle: ![shell-test example](doc/assets/shell-test.png) Running examples: ----------------- ``` git clone http://dev.hexasoftware.com/stdio/node-hci cd node-hci npm install node test/hci-usecase ``` And monitor bundle should be accessible by http://127.0.0.1:3500/monitor Cli bundle list ![bundles](doc/assets/bundle-list.png) Web based bundle listing ![bundles](doc/assets/web-bundle-list.png)