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
// 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)
}
}
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
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:
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();
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