No Description

Luis Figueiredo 8f9149be8b Readme 7 years ago
bundles 4d6757df37 Updating hci 7 years ago
doc 233cec34fc Added shell-test screenshot 7 years ago
lib 4d6757df37 Updating hci 7 years ago
test cab8acfdbc Added new nonbundle example 7 years ago
.gitignore 4219b2a253 test git 8 years ago
.tern-project f0a151f54d Creating new independent event manager, with context and channels 8 years ago
README.md 8f9149be8b Readme 7 years ago
index.js 4d6757df37 Updating hci 7 years ago
package.json 1f7b7d965d Updated missing packages in package.json 7 years ago

README.md

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

// 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

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();

Result of this bundle:
shell-test example

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

Web based bundle listing
bundles