Initial commit
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
__*
 | 
			
		||||
							
								
								
									
										122
									
								
								api.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								api.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
var cl = global.botanLoader;
 | 
			
		||||
var Dragonfly = global.Dragonfly;
 | 
			
		||||
 | 
			
		||||
var util = require( "util" );
 | 
			
		||||
var events = require( "events" );
 | 
			
		||||
var zlib = require( "zlib" );
 | 
			
		||||
var http = require( "http" );
 | 
			
		||||
 | 
			
		||||
var conf = cl.load( "config.botanjs" );
 | 
			
		||||
 | 
			
		||||
var Session = cl.load( "botansx.modular.session" );
 | 
			
		||||
var hash = cl.load( "botansx.utils.hash" );
 | 
			
		||||
 | 
			
		||||
var BotanJS = function()
 | 
			
		||||
{
 | 
			
		||||
	events.EventEmitter.call( this );
 | 
			
		||||
	this.kv = {};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
util.inherits( BotanJS, events.EventEmitter );
 | 
			
		||||
 | 
			
		||||
BotanJS.prototype.push = function()
 | 
			
		||||
{
 | 
			
		||||
	for( var i in arguments )
 | 
			
		||||
	{
 | 
			
		||||
		this.kv[ arguments[i] ] = true;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
BotanJS.prototype.remove = function( mod )
 | 
			
		||||
{
 | 
			
		||||
	delete this.kv[ mod ];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
BotanJS.prototype.compile = function( type )
 | 
			
		||||
{
 | 
			
		||||
	var _self = this;
 | 
			
		||||
 | 
			
		||||
	var j = conf.debug ? [ "Components.Console" ] : [];
 | 
			
		||||
	for( var i in this.kv )
 | 
			
		||||
	{
 | 
			
		||||
		if( this.kv[ i ] ) j.push( i );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var rainet = conf.rinet || conf.serviceUri;
 | 
			
		||||
 | 
			
		||||
	if( conf.type && "or".indexOf( conf.type ) != -1 )
 | 
			
		||||
	{
 | 
			
		||||
		this[ type ] = rainet + conf.type + type + "/" + j.join( "/" );
 | 
			
		||||
		this.emit( "complete" );
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var gErr = function( mesg ) {
 | 
			
		||||
		Dragonfly.Error( mesg );
 | 
			
		||||
		_self.emit( "complete" );
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	var q = j.join( "," );
 | 
			
		||||
	var lookupKey = hash.md5( q );
 | 
			
		||||
 | 
			
		||||
	var fastCache = new Session( lookupKey, "BOTAN_JCACHE", true );
 | 
			
		||||
 | 
			
		||||
	var deflateComplete = function( err, data )
 | 
			
		||||
	{
 | 
			
		||||
		if( err )
 | 
			
		||||
		{
 | 
			
		||||
			gErr( err.message );
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var suri = conf.serviceUri + type + "/" + data.toString( "base64" )
 | 
			
		||||
		var req = http.get(
 | 
			
		||||
			suri
 | 
			
		||||
			, function( res )
 | 
			
		||||
			{
 | 
			
		||||
				res.setEncoding( "utf8" );
 | 
			
		||||
				var ch = "";
 | 
			
		||||
 | 
			
		||||
				res.on( "data", ( x ) => ch += x );
 | 
			
		||||
 | 
			
		||||
				res.on( "end", function() {
 | 
			
		||||
					_self[ type ] = rainet + ch;
 | 
			
		||||
 | 
			
		||||
					Dragonfly.Debug( "Storing " + ch + " to fastcache[ " + fastCache.id + " ]" );
 | 
			
		||||
 | 
			
		||||
					fastCache.spawn( 10 );
 | 
			
		||||
					fastCache.set( type, ch );
 | 
			
		||||
 | 
			
		||||
					if( res.statusCode != 200 )
 | 
			
		||||
					{
 | 
			
		||||
						_self.emit( "error", "Service calling failed: " + suri, ch );
 | 
			
		||||
						return;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					_self.emit( "complete" );
 | 
			
		||||
				} );
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
		).on( "error", gErr );
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	fastCache.addListener( "ready", function( fCache ) {
 | 
			
		||||
		var k = fCache.get( type );
 | 
			
		||||
 | 
			
		||||
		if( k )
 | 
			
		||||
		{
 | 
			
		||||
			Dragonfly.Debug( "FastCache: " + k );
 | 
			
		||||
			fCache.expire( 30 );
 | 
			
		||||
 | 
			
		||||
			_self[ type ] = rainet + k;
 | 
			
		||||
			_self.emit( "complete" );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			zlib.deflate( q, deflateComplete );
 | 
			
		||||
		}
 | 
			
		||||
	} );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = BotanJS;
 | 
			
		||||
							
								
								
									
										52
									
								
								config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
var Conf = function()
 | 
			
		||||
{
 | 
			
		||||
	this.kv = {};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ResolvePath = function( path, _obj )
 | 
			
		||||
{
 | 
			
		||||
	var p = path.split(".");
 | 
			
		||||
	var l = p.length - 1;
 | 
			
		||||
 | 
			
		||||
	if( !l ) return { obj: _obj, key: path };
 | 
			
		||||
 | 
			
		||||
	if( !_obj[ p[0] ] ) _obj[ p[0] ] = {};
 | 
			
		||||
 | 
			
		||||
	var obj = _obj[ p[0] ];
 | 
			
		||||
	for( var i = 1; i < l; i ++ )
 | 
			
		||||
	{
 | 
			
		||||
		if( !obj[ p[i] ] ) obj[ p[i] ] = {};
 | 
			
		||||
		obj = obj[ p[i] ];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return { obj: obj, key: p[l] };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Example:
 | 
			
		||||
 *		Conf.set( "a.b.c.d", 7 );
 | 
			
		||||
 *		gives { a: { b: { c: { d: 7 } } } }
 | 
			
		||||
 **/
 | 
			
		||||
Conf.prototype.set = function( path, val )
 | 
			
		||||
{
 | 
			
		||||
	var o = ResolvePath( path, this.kv );
 | 
			
		||||
	o.obj[ o.key ] = val;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Conf.prototype.push = function( path, val )
 | 
			
		||||
{
 | 
			
		||||
	var o = ResolvePath( path, this.kv );
 | 
			
		||||
	o.obj[ o.key ]
 | 
			
		||||
		? o.obj[ o.key ].push( val )
 | 
			
		||||
		: o.obj[ o.key ] = [ val ]
 | 
			
		||||
		;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Conf.prototype.toString = function()
 | 
			
		||||
{
 | 
			
		||||
	return "var _AstConf_ = " + JSON.stringify( this.kv )
 | 
			
		||||
		+ ( global.debug ? ", debugEnv = true" : "" )
 | 
			
		||||
		+ ";";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = Conf;
 | 
			
		||||
		Reference in New Issue
	
	Block a user