874 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			874 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								head	1.4;
							 | 
						||
| 
								 | 
							
								access;
							 | 
						||
| 
								 | 
							
								symbols;
							 | 
						||
| 
								 | 
							
								locks
							 | 
						||
| 
								 | 
							
									sbosse:1.4; strict;
							 | 
						||
| 
								 | 
							
								comment	@# @;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.4
							 | 
						||
| 
								 | 
							
								date	2020.02.03.09.45.01;	author sbosse;	state Exp;
							 | 
						||
| 
								 | 
							
								branches;
							 | 
						||
| 
								 | 
							
								next	1.3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.3
							 | 
						||
| 
								 | 
							
								date	2017.06.10.17.03.04;	author sbosse;	state Exp;
							 | 
						||
| 
								 | 
							
								branches;
							 | 
						||
| 
								 | 
							
								next	1.2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.2
							 | 
						||
| 
								 | 
							
								date	2017.06.08.15.41.11;	author sbosse;	state Exp;
							 | 
						||
| 
								 | 
							
								branches;
							 | 
						||
| 
								 | 
							
								next	1.1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.1
							 | 
						||
| 
								 | 
							
								date	2017.05.23.07.00.54;	author sbosse;	state Exp;
							 | 
						||
| 
								 | 
							
								branches;
							 | 
						||
| 
								 | 
							
								next	;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								desc
							 | 
						||
| 
								 | 
							
								@@
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.4
							 | 
						||
| 
								 | 
							
								log
							 | 
						||
| 
								 | 
							
								@.
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								text
							 | 
						||
| 
								 | 
							
								@/**
							 | 
						||
| 
								 | 
							
								 **      ==============================
							 | 
						||
| 
								 | 
							
								 **       O           O      O   OOOO
							 | 
						||
| 
								 | 
							
								 **       O           O     O O  O   O
							 | 
						||
| 
								 | 
							
								 **       O           O     O O  O   O
							 | 
						||
| 
								 | 
							
								 **       OOOO   OOOO O     OOO  OOOO
							 | 
						||
| 
								 | 
							
								 **       O   O       O    O   O O   O
							 | 
						||
| 
								 | 
							
								 **       O   O       O    O   O O   O
							 | 
						||
| 
								 | 
							
								 **       OOOO        OOOO O   O OOOO
							 | 
						||
| 
								 | 
							
								 **      ==============================
							 | 
						||
| 
								 | 
							
								 **      Dr. Stefan Bosse http://www.bsslab.de
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **      COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
							 | 
						||
| 
								 | 
							
								 **                 BY THE AUTHOR(S).
							 | 
						||
| 
								 | 
							
								 **                 THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
							 | 
						||
| 
								 | 
							
								 **                 MODIFIED, OR OTHERWISE USED IN A CONTEXT
							 | 
						||
| 
								 | 
							
								 **                 OUTSIDE OF THE SOFTWARE SYSTEM.
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **    $AUTHORS:     Stefan Bosse
							 | 
						||
| 
								 | 
							
								 **    $INITIAL:     (C) 2006-2019 bLAB
							 | 
						||
| 
								 | 
							
								 **    $CREATED:     4-1-16 by sbosse.
							 | 
						||
| 
								 | 
							
								 **    $VERSION:     1.8.1
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **    $INFO:
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **  JAM Agent Compiler
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **    $ENDOFINFO
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var onexit=false;
							 | 
						||
| 
								 | 
							
								var start=false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								global.config={simulation:false};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Require('os/polyfill')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Io = Require('com/io');
							 | 
						||
| 
								 | 
							
								var Comp = Require('com/compat');
							 | 
						||
| 
								 | 
							
								var Db = Require('db/db');
							 | 
						||
| 
								 | 
							
								var Aios = Require('jam/aios');
							 | 
						||
| 
								 | 
							
								var Esprima = Require('parser/estprima');
							 | 
						||
| 
								 | 
							
								var Escodegen = Require('printer/estcodegen');
							 | 
						||
| 
								 | 
							
								var Buf = Require('dos/buf');
							 | 
						||
| 
								 | 
							
								var Net = Require('dos/network');
							 | 
						||
| 
								 | 
							
								var Dns = Require('dos/dns');
							 | 
						||
| 
								 | 
							
								var Cs = Require('dos/capset');
							 | 
						||
| 
								 | 
							
								var Run = Require('dos/run');
							 | 
						||
| 
								 | 
							
								var Rpc = Require('dos/rpc');
							 | 
						||
| 
								 | 
							
								var Std = Require('dos/std');
							 | 
						||
| 
								 | 
							
								var Router = Require('dos/router');
							 | 
						||
| 
								 | 
							
								var Sch = Require('dos/scheduler');
							 | 
						||
| 
								 | 
							
								var Conn = Require('dos/connection');
							 | 
						||
| 
								 | 
							
								var Json = Require('jam/jsonfn');
							 | 
						||
| 
								 | 
							
								var Dios = Require('dos/dios');
							 | 
						||
| 
								 | 
							
								var Status = Net.Status;
							 | 
						||
| 
								 | 
							
								var Command = Net.Command;
							 | 
						||
| 
								 | 
							
								var util = Require('util');
							 | 
						||
| 
								 | 
							
								var path = Require('path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Run.current(Aios);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var env = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function className(filename) { return path.basename(filename, path.extname(filename)) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var options = {
							 | 
						||
| 
								 | 
							
								  amp:false,
							 | 
						||
| 
								 | 
							
								  aip:'localhost',
							 | 
						||
| 
								 | 
							
								  aport:10002,
							 | 
						||
| 
								 | 
							
								  bip:'localhost',
							 | 
						||
| 
								 | 
							
								  bport:3001,
							 | 
						||
| 
								 | 
							
								  broker:false,
							 | 
						||
| 
								 | 
							
								  debug:false,
							 | 
						||
| 
								 | 
							
								  default:true,
							 | 
						||
| 
								 | 
							
								  dip : 'localhost',
							 | 
						||
| 
								 | 
							
								  dports : [],
							 | 
						||
| 
								 | 
							
								  env:{},
							 | 
						||
| 
								 | 
							
								  geo:undefined,
							 | 
						||
| 
								 | 
							
								  hostport:undefined,
							 | 
						||
| 
								 | 
							
								  http:false,
							 | 
						||
| 
								 | 
							
								  keepalive:true,
							 | 
						||
| 
								 | 
							
								  myip:'localhost',
							 | 
						||
| 
								 | 
							
								  monitor:0,
							 | 
						||
| 
								 | 
							
								  output:undefined,
							 | 
						||
| 
								 | 
							
								  print:false,
							 | 
						||
| 
								 | 
							
								  repeat:0,
							 | 
						||
| 
								 | 
							
								  tcpnet:0,
							 | 
						||
| 
								 | 
							
								  verbose:0
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var out = function (msg) { Io.out('[JAC] '+msg)};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var jamc = function(options) {
							 | 
						||
| 
								 | 
							
								  var self=this;
							 | 
						||
| 
								 | 
							
								  this.options=checkOption(options,{});
							 | 
						||
| 
								 | 
							
								  this.env=checkOption(options.env,{});
							 | 
						||
| 
								 | 
							
								  this.classes={};
							 | 
						||
| 
								 | 
							
								  this.out=out;
							 | 
						||
| 
								 | 
							
								  this.err=function (msg,err) {
							 | 
						||
| 
								 | 
							
								    out('Error: '+msg);
							 | 
						||
| 
								 | 
							
								    throw (err||'Error');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.warn=function (msg) {
							 | 
						||
| 
								 | 
							
								    out('Warning: '+msg);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.pending=false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.bport=checkOption(options.bport,3001);
							 | 
						||
| 
								 | 
							
								  this.bip=options.bip;
							 | 
						||
| 
								 | 
							
								  this.amp=options.amp;
							 | 
						||
| 
								 | 
							
								  this.aport=options.aport;
							 | 
						||
| 
								 | 
							
								  this.hostname=Io.hostname();
							 | 
						||
| 
								 | 
							
								  this.nodename=options.nodename;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  this.options.privhostport=Net.uniqport();
							 | 
						||
| 
								 | 
							
								  this.options.pubhostport = Net.prv2pub(this.options.privhostport);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.scheduler=Sch.TaskScheduler();
							 | 
						||
| 
								 | 
							
								  this.todo=[];
							 | 
						||
| 
								 | 
							
								  this.verbose=checkOption(options.verbose,0);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Import analyzer class...
							 | 
						||
| 
								 | 
							
								var JamAnal = Require('jam/analyzer');
							 | 
						||
| 
								 | 
							
								JamAnal.current(Aios);
							 | 
						||
| 
								 | 
							
								jamc.prototype.analyzeSyntax=JamAnal.jamc.prototype.analyze;
							 | 
						||
| 
								 | 
							
								jamc.prototype.syntax=JamAnal.jamc.prototype.syntax;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Add an agent class template {<ac name>:<ac constructor fun>} to the JAM world
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.addClass = function (name,ac) {
							 | 
						||
| 
								 | 
							
								  if (this.verbose) this.out('Added agent class '+name);
							 | 
						||
| 
								 | 
							
								  this.classes[name]=ac;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								jamc.prototype.compile = function (filename, options) {
							 | 
						||
| 
								 | 
							
								  var res = this.open(filename,options);
							 | 
						||
| 
								 | 
							
								  if (res) for(var p in res) {
							 | 
						||
| 
								 | 
							
								    this.compileClass(p,res[p],{verbose:this.verbose});
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/** Compile (analyze) an agent class constructor function and add it to the world class library.
							 | 
						||
| 
								 | 
							
								 ** Can be used after an open statement.
							 | 
						||
| 
								 | 
							
								 ** Usage: compileClass(name,constructor,options?)
							 | 
						||
| 
								 | 
							
								 **        compileClass(constructor,options?)
							 | 
						||
| 
								 | 
							
								 **
							 | 
						||
| 
								 | 
							
								 **  typeof @@name=string|undefined
							 | 
						||
| 
								 | 
							
								 **  typeof @@constructor=function|string
							 | 
						||
| 
								 | 
							
								 **  typeof @@options={verbose:number|boolean)|number|undefined
							 | 
						||
| 
								 | 
							
								*/ 
							 | 
						||
| 
								 | 
							
								jamc.prototype.compileClass = function (name,constructor,options) {
							 | 
						||
| 
								 | 
							
								  var ac,p,verbose,content,syntax,report,text,env={ac:undefined},self=this,ac;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof name == 'function') constructor=name,name=undefined,options=constructor;
							 | 
						||
| 
								 | 
							
								  if (typeof options == 'object') verbose=options.verbose; 
							 | 
						||
| 
								 | 
							
								  else if (options!=undefined) verbose=options; else verbose=this.verbose;
							 | 
						||
| 
								 | 
							
								  // if (typeof constructor != 'function') throw 'compileClass: second constructor argument not a function';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof constructor == 'function') text = constructor.toString();
							 | 
						||
| 
								 | 
							
								  else text = constructor;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  if (!name) {
							 | 
						||
| 
								 | 
							
								    // try to find name in function definition
							 | 
						||
| 
								 | 
							
								    name=text.match(/[\s]*function[\s]*([A-Za-z0-9_]+)[\s]*\(/);
							 | 
						||
| 
								 | 
							
								    if (!name) throw ('compileClass: No class name provided and no name found in constructor '+
							 | 
						||
| 
								 | 
							
								                      text.substring(0,80));
							 | 
						||
| 
								 | 
							
								    name=name[1];
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  content = 'var ac = '+text;
							 | 
						||
| 
								 | 
							
								  try { syntax = Esprima.parse(content, { tolerant: true, loc:true }) }
							 | 
						||
| 
								 | 
							
								  catch (e) { throw 'compileClass('+name+'): Parsing failed with '+e }
							 | 
						||
| 
								 | 
							
								  report = this.analyzeSyntax(syntax,
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      classname:name,
							 | 
						||
| 
								 | 
							
								      level:2,
							 | 
						||
| 
								 | 
							
								      verbose:verbose||0,
							 | 
						||
| 
								 | 
							
								      err:  function (msg){self.err(msg)},
							 | 
						||
| 
								 | 
							
								      out:  function (msg){self.out(msg)},
							 | 
						||
| 
								 | 
							
								      warn: function (msg){self.warn(msg)}
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  if (report.errors.length) { throw 'compileClass('+name+'): failed with '+report.errors.join('; ')};
							 | 
						||
| 
								 | 
							
								  for (p in report.activities) env[p]=p;
							 | 
						||
| 
								 | 
							
								  with (env) { eval(content) };
							 | 
						||
| 
								 | 
							
								  ac=env.ac; env.ac=undefined;
							 | 
						||
| 
								 | 
							
								  this.addClass(name,ac,env);
							 | 
						||
| 
								 | 
							
								  return name;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Create and return JSON+ agent from class ac with arguments.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.generate = function (ac,args) {
							 | 
						||
| 
								 | 
							
								  var node=this.node;
							 | 
						||
| 
								 | 
							
								  var code=none;
							 | 
						||
| 
								 | 
							
								  if (this.options.verbose>0) this.out('Compiling agent from class '+ac+' ['+args+'] ..');
							 | 
						||
| 
								 | 
							
								  if (this.classes[ac])
							 | 
						||
| 
								 | 
							
								    code = Aios.Code.createAndReturn(this.classes[ac],ac,args);
							 | 
						||
| 
								 | 
							
								  else this.out('generate: Cannot find agent class '+ac+'.');
							 | 
						||
| 
								 | 
							
								  return code;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Get an agent class template {<ac name>:<ac constructor fun>} from the JAM world
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.getclass = function (name) {
							 | 
						||
| 
								 | 
							
								  var ac={};
							 | 
						||
| 
								 | 
							
								  ac[name]=this.classes[name];
							 | 
						||
| 
								 | 
							
								  if (ac[name]) return ac; else return undefined;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Initialize broker or amp connections ...
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.init=function () {
							 | 
						||
| 
								 | 
							
								  var self=this;
							 | 
						||
| 
								 | 
							
								  this.scheduler.Init();
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  if (this.options.broker||this.options.dports.length>0) {
							 | 
						||
| 
								 | 
							
								    this.network = Conn.setup(this.options,1);
							 | 
						||
| 
								 | 
							
								    this.router = this.network.router;
							 | 
						||
| 
								 | 
							
								    this.rpc = this.network.rpc;
							 | 
						||
| 
								 | 
							
								    this.std = Std.StdInt(this.rpc);
							 | 
						||
| 
								 | 
							
								    this.dns = Dns.DnsInt(this.rpc);
							 | 
						||
| 
								 | 
							
								    this.cs =  Cs.CsInt(this.rpc);
							 | 
						||
| 
								 | 
							
								    this.run = Run.RunInt(this.rpc);
							 | 
						||
| 
								 | 
							
								    this.dios = Dios.Dios(this.rpc,this.env);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (this.amp) {
							 | 
						||
| 
								 | 
							
								    this.startamp();    
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Read and parse one agent class from file. Can contain nested open statements.
							 | 
						||
| 
								 | 
							
								 *  File/source text format: function [ac] (p1,p2,..) { this.x; .. ; this.act = {..}; ..}
							 | 
						||
| 
								 | 
							
								 *  open(file:string,options?:{verbose?:number|boolean,classname?:string}) -> function | object
							 | 
						||
| 
								 | 
							
								 *  
							 | 
						||
| 
								 | 
							
								 *  Output can be processed by method compileClass
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.open = function (filename,options) {
							 | 
						||
| 
								 | 
							
								  var self=this,
							 | 
						||
| 
								 | 
							
								      res,
							 | 
						||
| 
								 | 
							
								      text,
							 | 
						||
| 
								 | 
							
								      name,
							 | 
						||
| 
								 | 
							
								      ast=null;
							 | 
						||
| 
								 | 
							
								  options=checkOptions(options,{});
							 | 
						||
| 
								 | 
							
								  name=checkOption(options.classname,className(filename));
							 | 
						||
| 
								 | 
							
								  if (this.verbose>0) this.out('Opening file '+filename);
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  function parseModel (text) {
							 | 
						||
| 
								 | 
							
								    var modu={},more,module={exports:{}},name=text.match(/[\s]*function[\s]*([a-z0-9]+)[\s]*\(/);
							 | 
						||
| 
								 | 
							
								    if (name) name=name[1];
							 | 
						||
| 
								 | 
							
								    function open(filename) {
							 | 
						||
| 
								 | 
							
								      var text;
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        if (self.verbose>0) self.out('Opening file '+filename);
							 | 
						||
| 
								 | 
							
								        text=Io.read_file(filename);
							 | 
						||
| 
								 | 
							
								        if (self.verbose) self.out('%% '+text.length+' bytes');
							 | 
						||
| 
								 | 
							
								        return parseModel(text);
							 | 
						||
| 
								 | 
							
								      } catch (e) {
							 | 
						||
| 
								 | 
							
								        self.err('Opening of '+file+' failed: '+e); 
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      with (module) {eval('res = '+text)};
							 | 
						||
| 
								 | 
							
								      if (name) { modu[name]=res; return modu} 
							 | 
						||
| 
								 | 
							
								      else if (module.exports) return module.exports; 
							 | 
						||
| 
								 | 
							
								      else return res;
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        ast = Esprima.parse(text, { tolerant: true, loc:true });
							 | 
						||
| 
								 | 
							
								        if (ast.errors && ast.errors.length>0) more = ', '+ast.errors[0];
							 | 
						||
| 
								 | 
							
								      } catch (e) {
							 | 
						||
| 
								 | 
							
								        if (e.lineNumber) more = ', in line '+e.lineNumber; 
							 | 
						||
| 
								 | 
							
								      } 
							 | 
						||
| 
								 | 
							
								      self.out(e.name+(e.message?': '+e.message:'')+(more?more:''));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    text=Io.read_file(filename);
							 | 
						||
| 
								 | 
							
								    if (this.verbose) this.out('%% '+text.length+' bytes');
							 | 
						||
| 
								 | 
							
								    return parseModel(text);
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    this.err('Opening of '+file+' failed: '+e); 
							 | 
						||
| 
								 | 
							
								  }  
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** ESTPRIMA/ESTCODEGEN Test
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.print = function (file,depth) {
							 | 
						||
| 
								 | 
							
								  var code,
							 | 
						||
| 
								 | 
							
								      text,
							 | 
						||
| 
								 | 
							
								      ast;
							 | 
						||
| 
								 | 
							
								  if (Io.exists(file)) {
							 | 
						||
| 
								 | 
							
								    if (this.options.verbose>=0) this.out('Parsing Javascript from file '+file+' ..');
							 | 
						||
| 
								 | 
							
								    text=Io.read_file(file);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    if (this.options.verbose>=0) this.out('Parsing Javascript from string "'+file+'" ..');
							 | 
						||
| 
								 | 
							
								    text=file; // Is it text string?
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    ast=Esprima.parse(text, { tolerant: true, loc:true });
							 | 
						||
| 
								 | 
							
								    console.log(util.inspect(ast.body,{depth:depth}));
							 | 
						||
| 
								 | 
							
								    code=Escodegen.generate(ast);
							 | 
						||
| 
								 | 
							
								    console.log(code);
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    console.log(e);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Send request to a JAM node
							 | 
						||
| 
								 | 
							
								** function (data:string,dst:string,cmd:Net.Command*)
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								jamc.prototype.send = function (data,dst,cmd) {
							 | 
						||
| 
								 | 
							
								  var self=this,
							 | 
						||
| 
								 | 
							
								      cap,stat;
							 | 
						||
| 
								 | 
							
								  if (Comp.string.isNumeric(dst)) dst='localhost:'+dst;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (this.options.amp)
							 | 
						||
| 
								 | 
							
								    myJamc.todo.push([
							 | 
						||
| 
								 | 
							
								      function () {
							 | 
						||
| 
								 | 
							
								        var addr = self.amp.url2addr(dst),
							 | 
						||
| 
								 | 
							
								            buf=Buf.Buffer(),
							 | 
						||
| 
								 | 
							
								            context=Sch.Suspend();
							 | 
						||
| 
								 | 
							
								          Buf.buf_put_string(buf,data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self.amp.request(cmd,buf,function (res) {
							 | 
						||
| 
								 | 
							
								          Sch.Wakeup(context);
							 | 
						||
| 
								 | 
							
								        },addr.address,addr.port);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    ])
							 | 
						||
| 
								 | 
							
								  else if (this.options.broker) {
							 | 
						||
| 
								 | 
							
								    myJamc.todo.push([
							 | 
						||
| 
								 | 
							
								      function () {
							 | 
						||
| 
								 | 
							
								        self.dios.resolve(dst,function (_cap,_stat) {
							 | 
						||
| 
								 | 
							
								          cap=_cap;
							 | 
						||
| 
								 | 
							
								          stat=_stat;
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      function () {
							 | 
						||
| 
								 | 
							
								        if (stat==Status.STD_OK) 
							 | 
						||
| 
								 | 
							
								          switch (cmd) {
							 | 
						||
| 
								 | 
							
								              case Command.PS_WRITE: 
							 | 
						||
| 
								 | 
							
								                self.run.ps_write(cap,data,function (_stat) {
							 | 
						||
| 
								 | 
							
								                  self.out('Finished request '+Net.Print.command(cmd)+' to '+dst+' with '+Net.Print.status(_stat));
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								              case Command.PS_EXEC: 
							 | 
						||
| 
								 | 
							
								                self.run.ps_exec(cap,data,function (_stat) {
							 | 
						||
| 
								 | 
							
								                  self.out('Finished request '+Net.Print.command(cmd)+' to '+dst+' with '+Net.Print.status(_stat));
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								              case Command.PS_STUN: 
							 | 
						||
| 
								 | 
							
								                self.run.ps_stun(cap,data,function (_stat) {
							 | 
						||
| 
								 | 
							
								                  self.out('Finished request '+Net.Print.command(cmd)+' to '+dst+' with '+Net.Print.status(_stat));
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        else self.out('Send: Invalid destination '+dst+': '+Net.Print.status(stat));
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    ])
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  } else self.out('Send: No route to destination '+dst);
							 | 
						||
| 
								 | 
							
								  self.pending=true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								jamc.prototype.setenv=function (name,value) {
							 | 
						||
| 
								 | 
							
								  var self=this;
							 | 
						||
| 
								 | 
							
								  switch (name) {
							 | 
						||
| 
								 | 
							
								    case 'DNS':
							 | 
						||
| 
								 | 
							
								      self.env.dns_def=value; 
							 | 
						||
| 
								 | 
							
								      self.env.rootdir=self.env.workdir=self.cs.cs_singleton(value);
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								    case 'AFS':
							 | 
						||
| 
								 | 
							
								      self.env.afs_def=value; 
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Start the router and scheduler
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.start=function () {
							 | 
						||
| 
								 | 
							
								  this.running=true;
							 | 
						||
| 
								 | 
							
								  this.todo.push([
							 | 
						||
| 
								 | 
							
								    function () {Io.out('[JAMC] Finished. Exit.'); Io.exit()}
							 | 
						||
| 
								 | 
							
								  ]);
							 | 
						||
| 
								 | 
							
								  this.todo=Comp.array.flatten(this.todo);
							 | 
						||
| 
								 | 
							
								  B(this.todo);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Start up the network ..
							 | 
						||
| 
								 | 
							
								  if (this.network) B([this.network.init,this.network.start]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // this.out('Starting ..');
							 | 
						||
| 
								 | 
							
								  Sch.ScheduleNext();
							 | 
						||
| 
								 | 
							
								  Sch.ScheduleNext();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Start an AMP service port TODO
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.startamp = function () {
							 | 
						||
| 
								 | 
							
								  var self=this;
							 | 
						||
| 
								 | 
							
								  var ip = 'localhost';
							 | 
						||
| 
								 | 
							
								  this.out('Starting AMP server on port '+this.aport);
							 | 
						||
| 
								 | 
							
								  this.amp = Aios.Chan.Amp({rcv:ip+':'+this.aport,snd_ip:ip,verbose:this.options.verbose});
							 | 
						||
| 
								 | 
							
								  this.amp.receiver(function (handler) {
							 | 
						||
| 
								 | 
							
								      if (handler) {
							 | 
						||
| 
								 | 
							
								        if (self.options.verbose>1) { self.out('AMP: got request:'); console.log(handler) };
							 | 
						||
| 
								 | 
							
								      }      
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Jamc = function(options) {
							 | 
						||
| 
								 | 
							
								  var obj = new jamc(options);
							 | 
						||
| 
								 | 
							
								  return obj;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function usage(exit) {
							 | 
						||
| 
								 | 
							
								  var msg='AgentJS Compiler and Agent Management Program'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'usage: jamc [options]'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'compile -c <template>.js\n  : Load and compile an agent class template file'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'send to -s <nodeid>\n  : Send last compiled agent class template or snapshot to a JAM node'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'use -a <agentclass>\n  : Use agent class template'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'create -r [<arg>,<arg>,..]|{}\n  : Create an agent snapshot from a class template'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'print\n  : Print the snapshot.'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'stun -u  <agentid> <nodeid>\n  : Stun (terminate) an agent with specified identification.'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'repeat -n <n>\n  : repeat operation <n> times'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'output -o <file>\n  : output file'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '-v \n  : Increase verbosity level'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '-debug \n  : Setting debug mode'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'amp -A <port>\n  : Start AMP service on specified port (Default port='+options.aport+')'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'link -L <port>\n  : AMP link with specified destination'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-H -T -T2] Use HTTP or TCPIP port insted UDP (default)'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '    T: TCPIP, 1-ch H:HTTP T2: TCPIP, 2-ch'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-broker <ip[:ipport]>]  Broker URL (Default: '+options.bip+': HTTP '+options.bport+')'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '-h -help --help\n  : Print this help'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '-P <file>|"<string> [-depth #n]"\n  : Print ECMA Parser tree'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'nodeid: [<AMP host|ip>:]<AMP port>'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'nodeid: <DNS path>'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'nodeid: <Host capability>'+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'agentid: CCCCCCCC with C: a-z0-9'+NL+NL;
							 | 
						||
| 
								 | 
							
								  msg += 'Example 1: jamc -c ac.js create {x=1} to 192.68.0.1:10001'+NL;
							 | 
						||
| 
								 | 
							
								  out(msg);  
							 | 
						||
| 
								 | 
							
								  if (!exit) onexit=true; else process.exit(-1);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (Io.getargs().length==2) usage();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Comp.args.parse(Io.getargs(),[
							 | 
						||
| 
								 | 
							
								  [['-h','-help','--help'],0,function () {usage()}],
							 | 
						||
| 
								 | 
							
								  ['-v',0,function () {options.verbose++; out('Setting verbosity to level '+options.verbose); config.verbose=true;}],
							 | 
						||
| 
								 | 
							
								  ['-monitor',0,function () {options.monitor++; out('Setting monitor to level '+options.monitor); }],
							 | 
						||
| 
								 | 
							
								  ['-debug',0,function () {options.debug=true; out('Setting debug mode.'); config.debug=true;}],
							 | 
						||
| 
								 | 
							
								  ['-dip',1,function(val){options.dip=val}],
							 | 
						||
| 
								 | 
							
								  ['-D',1,function(val){try{options.dports.push(Perv.int_of_string(val))} catch (e) {usage(true)}}],
							 | 
						||
| 
								 | 
							
								  ['-L',2,function(val1,val2){try{options.links.push([Perv.int_of_string(val1),getip(val2),getipport(val2)])} catch (e) {usage(true)}}],
							 | 
						||
| 
								 | 
							
								  ['-nokeepalive',0,function(val){options.keepalive=false;}],
							 | 
						||
| 
								 | 
							
								  ['-T',0,function(val){options.tcpnet=1;options.http=false;}],
							 | 
						||
| 
								 | 
							
								  ['-T2',0,function(val){options.tcpnet=2;options.http=false;}],
							 | 
						||
| 
								 | 
							
								  ['-H',0,function(val){options.http=true;options.tcpnet=0;}],
							 | 
						||
| 
								 | 
							
								  ['-S',2,function (classname,nodeid) {
							 | 
						||
| 
								 | 
							
								    if (!isNaN(Number(nodeid))) options.amp=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-C',2,function (file,nodeid) {
							 | 
						||
| 
								 | 
							
								    if (!isNaN(Number(nodeid))) options.amp=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-s',2,function (agentid,nodeid) {
							 | 
						||
| 
								 | 
							
								    if (!isNaN(Number(nodeid))) options.amp=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-x',3,function (ac,args,nodeid) {
							 | 
						||
| 
								 | 
							
								    if (!isNaN(Number(nodeid))) options.amp=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-A',1,function (port) {
							 | 
						||
| 
								 | 
							
								    try {options.aport=Comp.pervasives.int_of_string(port)} catch (e) {usage(true)};
							 | 
						||
| 
								 | 
							
								    options.amp=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-broker',1,function(val){
							 | 
						||
| 
								 | 
							
								    var tokens = Comp.string.split(':',val);
							 | 
						||
| 
								 | 
							
								    if (tokens.length==1)
							 | 
						||
| 
								 | 
							
								      options.bip=val;
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								      options.bip=tokens[0];      
							 | 
						||
| 
								 | 
							
								      options.bport=Comp.pervasives.int_of_string(tokens[1])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    options.broker=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-n',1,function (num) {
							 | 
						||
| 
								 | 
							
								    options.repeat=num;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-o',1,function (file) {
							 | 
						||
| 
								 | 
							
								    options.output=file;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-P',1,function(val){options.print=true}],
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (options.http || options.tcpnet) options.broker=true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var myJamc = Jamc(options);
							 | 
						||
| 
								 | 
							
								// console.log(Io.getargs())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								process.on('SIGINT', function () {
							 | 
						||
| 
								 | 
							
								  myJamc.out('Got SIGINT ..');
							 | 
						||
| 
								 | 
							
								  process.exit(2);
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Comp.args.parse(Io.getargs(),[
							 | 
						||
| 
								 | 
							
								  ['-c',1,function (file) {
							 | 
						||
| 
								 | 
							
								    var ac,data;
							 | 
						||
| 
								 | 
							
								    if (global.DEBUG||options.debug)
							 | 
						||
| 
								 | 
							
								      ac=myJamc.compile(file)    
							 | 
						||
| 
								 | 
							
								    else try {
							 | 
						||
| 
								 | 
							
								      ac=myJamc.compile(file)
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Compilation failed: '+e+'.');
							 | 
						||
| 
								 | 
							
								      Io.exit();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (options.output) {
							 | 
						||
| 
								 | 
							
								      data=Json.stringify(ac);
							 | 
						||
| 
								 | 
							
								      myJamc.out('Writing agent class template (JSON+) to file '+options.output+'..');
							 | 
						||
| 
								 | 
							
								      Io.write_file(options.output,data);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-C',2,function (file,nodeid) {
							 | 
						||
| 
								 | 
							
								    var code='{}',ac,classes='',p ;
							 | 
						||
| 
								 | 
							
								    if (global.DEBUG||options.debug)
							 | 
						||
| 
								 | 
							
								      ac=myJamc.compile(file)    
							 | 
						||
| 
								 | 
							
								    else try {
							 | 
						||
| 
								 | 
							
								      ac=myJamc.compile(file)
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Compilation failed: '+e+'.');
							 | 
						||
| 
								 | 
							
								      Io.exit();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (p in ac) classes=classes+(classes==''?'':',')+p;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    code=Json.stringify(ac);
							 | 
						||
| 
								 | 
							
								    myJamc.out('Sending agent class template(s) '+classes+' to '+nodeid+' ..');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    myJamc.send(code,nodeid,Command.PS_WRITE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (options.output) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Writing agent class template (JSON+) to file '+options.output+'..');
							 | 
						||
| 
								 | 
							
								      Io.write_file(options.output,data);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-S',2,function (classname,nodeid) {
							 | 
						||
| 
								 | 
							
								    var code='{}',ac;
							 | 
						||
| 
								 | 
							
								    ac=myJamc.getclass(classname);
							 | 
						||
| 
								 | 
							
								    if (!ac) 
							 | 
						||
| 
								 | 
							
								      myJamc.out('Unknown agent class '+classname);
							 | 
						||
| 
								 | 
							
								    code=Json.stringify(ac);
							 | 
						||
| 
								 | 
							
								    myJamc.out('Sending agent class template '+classname+' to '+nodeid+' ..');
							 | 
						||
| 
								 | 
							
								    myJamc.send(code,nodeid,Command.PS_WRITE);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-r',2,function (ac,args) {
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      var _args = Comp.array.map(Comp.string.split(',',Comp.string.trim(args,1,1)),function (arg) {
							 | 
						||
| 
								 | 
							
								        try {var num=Number(arg); if (isNaN(num)) return arg; else return num;}
							 | 
						||
| 
								 | 
							
								        catch (e) {return arg }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      var cp = myJamc.generate(ac,_args);
							 | 
						||
| 
								 | 
							
								      var filename = ac+'.'+cp.process.agent.id+'.json'; 
							 | 
						||
| 
								 | 
							
								      /* Compact the code, remove newlines, comments, white spaces */
							 | 
						||
| 
								 | 
							
								      var regex1= /\\n/g;
							 | 
						||
| 
								 | 
							
								      var regex2= /\/\*([\S\s]*?)\*\//gm;
							 | 
						||
| 
								 | 
							
								      var regex4= /\/\/[^\n]+/g; 
							 | 
						||
| 
								 | 
							
								      var regex5= /\\n/g;
							 | 
						||
| 
								 | 
							
								      var regex6= /\s[\s]+/g;
							 | 
						||
| 
								 | 
							
								      var code = cp.code.replace(regex1,'\n')
							 | 
						||
| 
								 | 
							
								                        .replace(regex4,"")
							 | 
						||
| 
								 | 
							
								                        .replace(regex5,"")
							 | 
						||
| 
								 | 
							
								                        .replace(regex6,' ');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      myJamc.out('Writing compiled agent '+cp.process.agent.id+' to file '+filename+' ['+cp.code.length+']');
							 | 
						||
| 
								 | 
							
								      Io.write_file(filename,code);
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Failed to generate agent '+ac+' '+args);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-p',2,function (ac,args) {
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      var _args = Comp.array.map(Comp.string.split(',',Comp.string.trim(args,1,1)),function (arg) {
							 | 
						||
| 
								 | 
							
								        try {var num=Number(arg); if (isNaN(num)) return arg; else return num;}
							 | 
						||
| 
								 | 
							
								        catch (e) {return arg }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      var cp = myJamc.generate(ac,_args);
							 | 
						||
| 
								 | 
							
								      var filename = ac+'.'+cp.process.agent.id+'.json'; 
							 | 
						||
| 
								 | 
							
								      /* Compact the code, remove newlines, comments, white spaces */
							 | 
						||
| 
								 | 
							
								      var regex1= /\\n/g;
							 | 
						||
| 
								 | 
							
								      var regex2= /\/\*([\S\s]*?)\*\//gm;
							 | 
						||
| 
								 | 
							
								      var regex4= /\/\/[^\n]+/g; 
							 | 
						||
| 
								 | 
							
								      var regex5= /\\n/g;
							 | 
						||
| 
								 | 
							
								      var regex6= /\s[\s]+/g;
							 | 
						||
| 
								 | 
							
								      var code = cp.code.replace(regex1,'\n')
							 | 
						||
| 
								 | 
							
								                        .replace(regex2,"")
							 | 
						||
| 
								 | 
							
								                        .replace(regex4,"")
							 | 
						||
| 
								 | 
							
								                        .replace(regex5,"")
							 | 
						||
| 
								 | 
							
								                        .replace(regex6,' ');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      myJamc.out('Agent '+cp.process.agent.id+':\n'+code);
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Failed to generate agent '+ac+' '+args);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-x',3,function (ac,args,nodeid) {
							 | 
						||
| 
								 | 
							
								    try {      
							 | 
						||
| 
								 | 
							
								      var _args = Comp.array.map(Comp.string.split(',',Comp.string.trim(args,1,1)),function (arg) {
							 | 
						||
| 
								 | 
							
								        try {var num=Number(arg); if (isNaN(num)) return arg; else return num;}
							 | 
						||
| 
								 | 
							
								        catch (e) {return arg }
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      if (!isNaN(Number(nodeid))) options.amp=true;
							 | 
						||
| 
								 | 
							
								      function newagent(num) {
							 | 
						||
| 
								 | 
							
								        var cp = myJamc.generate(ac,_args),
							 | 
						||
| 
								 | 
							
								            filename = ac+'.'+cp.process.agent.id+'.json',
							 | 
						||
| 
								 | 
							
								            regex1= /\\n/g,
							 | 
						||
| 
								 | 
							
								            code = cp.code; // .replace(regex1,'\n');
							 | 
						||
| 
								 | 
							
								        //console.log(data)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        myJamc.out('Sending agent '+cp.process.agent.id+' from class '+ac+' to '+nodeid+' ..');
							 | 
						||
| 
								 | 
							
								        myJamc.send(code,nodeid,Command.PS_EXEC);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (num>1) newagent(num-1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      newagent(myJamc.repeat||1);
							 | 
						||
| 
								 | 
							
								      myJamc.pending=true;
							 | 
						||
| 
								 | 
							
								    } catch (e) {
							 | 
						||
| 
								 | 
							
								      myJamc.out('Failed to generate or send agent(s) of class '+ac+' '+args+' to node '+nodeid+': '+e);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-s',2,function (agentid,nodeid) {
							 | 
						||
| 
								 | 
							
								    myJamc.out('Terminating agent '+agentid+' on node '+nodeid);
							 | 
						||
| 
								 | 
							
								    myJamc.send(agentid,nodeid,Command.PS_STUN);
							 | 
						||
| 
								 | 
							
								    myJamc.pending=true;
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-P',1,function (file) {
							 | 
						||
| 
								 | 
							
								    myJamc.print(file,options.depth);
							 | 
						||
| 
								 | 
							
								  }],
							 | 
						||
| 
								 | 
							
								  ['-depth',1,function (depth) {
							 | 
						||
| 
								 | 
							
								    options.depth=depth;
							 | 
						||
| 
								 | 
							
								  }]
							 | 
						||
| 
								 | 
							
								]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (myJamc.pending) {
							 | 
						||
| 
								 | 
							
								  myJamc.init();
							 | 
						||
| 
								 | 
							
								  myJamc.start();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.3
							 | 
						||
| 
								 | 
							
								log
							 | 
						||
| 
								 | 
							
								@.
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								text
							 | 
						||
| 
								 | 
							
								@d20 1
							 | 
						||
| 
								 | 
							
								a20 1
							 | 
						||
| 
								 | 
							
								 **    $INITIAL:     (C) 2006-2017 bLAB
							 | 
						||
| 
								 | 
							
								d22 1
							 | 
						||
| 
								 | 
							
								a22 1
							 | 
						||
| 
								 | 
							
								 **    $VERSION:     1.7.3
							 | 
						||
| 
								 | 
							
								d35 2
							 | 
						||
| 
								 | 
							
								d58 1
							 | 
						||
| 
								 | 
							
								d64 2
							 | 
						||
| 
								 | 
							
								d69 1
							 | 
						||
| 
								 | 
							
								a69 1
							 | 
						||
| 
								 | 
							
								  aport:6001,
							 | 
						||
| 
								 | 
							
								d91 1
							 | 
						||
| 
								 | 
							
								a91 1
							 | 
						||
| 
								 | 
							
								var out = function (msg) { Io.out('[JAMC] '+msg)};
							 | 
						||
| 
								 | 
							
								d95 2
							 | 
						||
| 
								 | 
							
								a96 2
							 | 
						||
| 
								 | 
							
								  this.options=options||{};
							 | 
						||
| 
								 | 
							
								  this.env=options.env||{};
							 | 
						||
| 
								 | 
							
								d108 1
							 | 
						||
| 
								 | 
							
								a108 1
							 | 
						||
| 
								 | 
							
								  this.bport=options.bport||3001;
							 | 
						||
| 
								 | 
							
								d121 1
							 | 
						||
| 
								 | 
							
								a121 1
							 | 
						||
| 
								 | 
							
								  this.verbose=options.verbose||0;
							 | 
						||
| 
								 | 
							
								d127 1
							 | 
						||
| 
								 | 
							
								a127 1
							 | 
						||
| 
								 | 
							
								jamc.prototype.analyze=JamAnal.jamc.prototype.analyze;
							 | 
						||
| 
								 | 
							
								d134 3
							 | 
						||
| 
								 | 
							
								a136 4
							 | 
						||
| 
								 | 
							
								jamc.prototype.addclass = function (ac) {
							 | 
						||
| 
								 | 
							
								  for (var p in ac) {
							 | 
						||
| 
								 | 
							
								    this.classes[p]=ac[p];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								d139 23
							 | 
						||
| 
								 | 
							
								d163 9
							 | 
						||
| 
								 | 
							
								a171 20
							 | 
						||
| 
								 | 
							
								/** Read and compile (check) agent class templates from file
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								jamc.prototype.compile = function (file) {
							 | 
						||
| 
								 | 
							
								  var ac,
							 | 
						||
| 
								 | 
							
								      syntax,
							 | 
						||
| 
								 | 
							
								      modu, 
							 | 
						||
| 
								 | 
							
								      content,
							 | 
						||
| 
								 | 
							
								      p,
							 | 
						||
| 
								 | 
							
								      text,
							 | 
						||
| 
								 | 
							
								      regex1,
							 | 
						||
| 
								 | 
							
								      all,
							 | 
						||
| 
								 | 
							
								      ast,
							 | 
						||
| 
								 | 
							
								      off;
							 | 
						||
| 
								 | 
							
								  if (this.options.verbose>=0) this.out('Compiling agent class template(s) from file '+file+' ..');
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    modu=Require(file);
							 | 
						||
| 
								 | 
							
								    all=Io.read_file(file);
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    this.err('Importing of agent class template(s) from '+file+' failed: '+e);
							 | 
						||
| 
								 | 
							
								d174 20
							 | 
						||
| 
								 | 
							
								a193 24
							 | 
						||
| 
								 | 
							
								  if (!modu) this.out('Importing of agent class template(s) from '+file+' failed (empty).');
							 | 
						||
| 
								 | 
							
								  ast=Esprima.parse(all, { tolerant: true, loc:true });
							 | 
						||
| 
								 | 
							
								  //console.log(ast)
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  for (var p in modu) {
							 | 
						||
| 
								 | 
							
								    ac={};
							 | 
						||
| 
								 | 
							
								    ac[p]=modu[p];
							 | 
						||
| 
								 | 
							
								    if (this.options.verbose>0) this.out(' .. agent class template '+p+'.');
							 | 
						||
| 
								 | 
							
								    off=this.syntax.find(ast,'VariableDeclarator',p);
							 | 
						||
| 
								 | 
							
								    if (off && off.loc) this.syntax.offset=off.loc.start.line-1;
							 | 
						||
| 
								 | 
							
								    content = 'var ac = '+modu[p];
							 | 
						||
| 
								 | 
							
								    syntax = Esprima.parse(content, { tolerant: true, loc:true });
							 | 
						||
| 
								 | 
							
								    this.analyze(syntax,{classname:p,level:2});
							 | 
						||
| 
								 | 
							
								    text=Json.stringify(ac);
							 | 
						||
| 
								 | 
							
								    regex1= /this\.next=([a-zA-Z0-9_]+)/;
							 | 
						||
| 
								 | 
							
								    text=text.replace(regex1,"this.next='$1'");
							 | 
						||
| 
								 | 
							
								    // console.log(text);
							 | 
						||
| 
								 | 
							
								    ac=Json.parse(text,{});    
							 | 
						||
| 
								 | 
							
								    if (this.options.verbose>0) this.out('Adding agent class template '+p+'.');
							 | 
						||
| 
								 | 
							
								    this.addclass(ac);
							 | 
						||
| 
								 | 
							
								    this.syntax.offset=0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return ac;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								d242 54
							 | 
						||
| 
								 | 
							
								d409 1
							 | 
						||
| 
								 | 
							
								a409 1
							 | 
						||
| 
								 | 
							
								/** Start an AMP service port
							 | 
						||
| 
								 | 
							
								d434 13
							 | 
						||
| 
								 | 
							
								a446 14
							 | 
						||
| 
								 | 
							
								  msg += ' -c <template>.js\n  : Load and compile an agent class template file'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -C <template>.js <nodeid>\n  : Load and compile an agent class template(s) from a file and send it to a JAM node'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -r <agentclass> [<arg>,<arg>,..]\n  : Generate an agent from a class template and save the snapshot to a file.'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -p <agentclass> [<arg>,<arg>,..]\n  : Generate an agent from a class template and print the snapshot.'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -x <agentclass> [<arg>,<arg>,..] <nodeid> \n  : Generate an agent from a class template and send snapshot to a JAM node'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -S <agentclass> <nodeid> \n  : Send a class template to a JAM node'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -s  <agentid> <nodeid>\n  : Stun (terminate) an agent with specified identification.'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -n <n>\n  : repeat operation <n> times'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -o <file>\n  : output file'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -v \n  : Increase verbosity level'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -debug \n  : Setting debug mode'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -d -default        : Ask broker for default DNS'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -A <port>          : Start AMP service on specified port (Default port='+options.aport+')'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-H -T -T2]  Enable HTTP or TCPNET Broker connection'+NL;
							 | 
						||
| 
								 | 
							
								d448 3
							 | 
						||
| 
								 | 
							
								a450 8
							 | 
						||
| 
								 | 
							
								  msg += '    H: bport, T: bport+100'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '   (Default: -)'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-broker <ip[:ipport]>]  Broker URL (Default: '+options.bip+': HTTP '+options.bport+' TCPNET '+(options.bport+100)+')'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-D <port>] UDP Server port'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-L <src port> <UDP dst [address:]port] UDP P2P Connection'+NL;
							 | 
						||
| 
								 | 
							
								  msg += '  [-dip <UDP server IP>] (Default: '+options.dip+')'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -h -help --help\n  : Print this help'+NL;
							 | 
						||
| 
								 | 
							
								  msg += ' -P <file>|"<string> [-depth #n]"\n  : Print ECMA Parser tree'+NL;
							 | 
						||
| 
								 | 
							
								d454 2
							 | 
						||
| 
								 | 
							
								a455 1
							 | 
						||
| 
								 | 
							
								  msg += 'agentid: CCCCCCCC with C: a-z0-9'+NL;
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.2
							 | 
						||
| 
								 | 
							
								log
							 | 
						||
| 
								 | 
							
								@.
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								text
							 | 
						||
| 
								 | 
							
								@d22 1
							 | 
						||
| 
								 | 
							
								a22 1
							 | 
						||
| 
								 | 
							
								 **    $VERSION:     1.7.2
							 | 
						||
| 
								 | 
							
								d39 2
							 | 
						||
| 
								 | 
							
								a40 1
							 | 
						||
| 
								 | 
							
								var Esprima = Require('parser/esprimaT');
							 | 
						||
| 
								 | 
							
								d230 2
							 | 
						||
| 
								 | 
							
								d233 1
							 | 
						||
| 
								 | 
							
								a233 5
							 | 
						||
| 
								 | 
							
								  var ac,
							 | 
						||
| 
								 | 
							
								      syntax,
							 | 
						||
| 
								 | 
							
								      modu, 
							 | 
						||
| 
								 | 
							
								      content,
							 | 
						||
| 
								 | 
							
								      p,
							 | 
						||
| 
								 | 
							
								d235 1
							 | 
						||
| 
								 | 
							
								a235 4
							 | 
						||
| 
								 | 
							
								      regex1,
							 | 
						||
| 
								 | 
							
								      all,
							 | 
						||
| 
								 | 
							
								      ast,
							 | 
						||
| 
								 | 
							
								      off;
							 | 
						||
| 
								 | 
							
								d246 2
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.1
							 | 
						||
| 
								 | 
							
								log
							 | 
						||
| 
								 | 
							
								@Initial revision
							 | 
						||
| 
								 | 
							
								@
							 | 
						||
| 
								 | 
							
								text
							 | 
						||
| 
								 | 
							
								@d22 1
							 | 
						||
| 
								 | 
							
								a22 1
							 | 
						||
| 
								 | 
							
								 **    $VERSION:     1.7.1
							 | 
						||
| 
								 | 
							
								d39 1
							 | 
						||
| 
								 | 
							
								a39 1
							 | 
						||
| 
								 | 
							
								var Esprima = Require('parser/esprima');
							 | 
						||
| 
								 | 
							
								d240 7
							 | 
						||
| 
								 | 
							
								a246 3
							 | 
						||
| 
								 | 
							
								  if (this.options.verbose>=0) this.out('Parsing Javascript from file '+file+' ..');
							 | 
						||
| 
								 | 
							
								  text=Io.read_file(file);
							 | 
						||
| 
								 | 
							
								  if (!text) text=file; // Is it text string?
							 | 
						||
| 
								 | 
							
								@
							 |