jam/js/dos/run.js

266 lines
8.3 KiB
JavaScript

/**
** ==============================
** 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-2017 bLAB
** $CREATED: 23/05/16 by sbosse.
** $VERSION: 1.3.1
**
** $INFO:
**
** JAMDOS: Run Server Client API
**
**
** $ENDOFINFO
*/
var log = 0;
var util = Require('util');
var Io = Require('com/io');
var trace = Io.tracing;
var current=none;
var Aios = none;
var Net = Require('dos/network');
var Rpc = Require('dos/rpc');
var Router = Require('dos/router');
var Compat = Require('com/compat');
var Perv = Compat.pervasives;
var String = Compat.string;
var Array = Compat.array;
var assert = Compat.assert;
var Sch = Require('dos/scheduler');
var Buf = Require('dos/buf');
var DnsCom = Require('dos/dns_srv_common');
var Dns = Require('dos/dns');
var Cs = Require('dos/capset');
var Json = Require('jam/jsonfn');
var Status = Net.Status;
var Command = Net.Command;
var Rights = Net.Rights;
var isNodeJS = Compat.isNodeJS();
var runint = function (rpc) {
this.rpc=rpc;
}
/** Send agent code for execution (code.next points to next activity to be executed)
*
* @param {capability} cap
* @param {string} code JSON+ format
* @param {function((Status.STD_OK|*))} callback
*/
runint.prototype.ps_exec = function (cap,code,callback) {
var self=this,
rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_EXEC;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,code);
Io.log((log<1)||('ps_exec: '+Rpc.Print.rpcio(rpcio)));
B([
function () { self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_exec returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
self.rpc.router.pkt_discard(rpcio);
callback(stat);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
};
/** Send agent code for migration (code.next points to current activity and must be computed on dest.).
*
* @param {capability} cap
* @param {string} code JSON+ format
* @param {function((Status.STD_OK|*))} callback
*/
runint.prototype.ps_migrate = function (cap,code,callback) {
var self=this,
rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_MIGRATE;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,code);
Io.log((log<1)||('ps_migrate: '+Rpc.Print.rpcio(rpcio)));
B([
function () { self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_migrate returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
self.rpc.router.pkt_discard(rpcio);
callback(stat);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
};
/** Receive a code template.
*
* @param {capability} cap
* @param {string} name Agent Class
* @param {function((Status.STD_OK|*),string|undefined)} callback data:JSON+ format
*/
runint.prototype.ps_read = function (cap,name,callback) {
var self=this,
rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_READ;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,name);
Io.log((log<10)||('ps_write: '+Rpc.Print.rpcio(rpcio)));
B([
function () { self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_read returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
var data;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
if (stat == Status.STD_OK) data=Buf.buf_get_string(rpcio);
self.rpc.router.pkt_discard(rpcio);
callback(stat,data);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
};
/** Send agent signal.
*
* @param {capability} cap
* @param {string} signal JSON+ format
* @param {function((Status.STD_OK|*))} callback
*/
runint.prototype.ps_signal = function (cap,code,callback) {
var self=this,
rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_SIGNAL;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,code);
Io.log((log<1)||('ps_signal: '+Rpc.Print.rpcio(rpcio)));
B([
function () { self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_signal returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
self.rpc.router.pkt_discard(rpcio);
callback(stat);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
}
runint.prototype.ps_stun = function (cap,id,callback) {
var self=this,
rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_STUN;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,id);
Io.log((log<1)||('ps_stun: '+Rpc.Print.rpcio(rpcio)));
B([
function () { self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_stun returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
self.rpc.router.pkt_discard(rpcio);
callback(stat);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
}
/** Send a code template.
*
* @param {capability} cap
* @param {string} code JSON+ format
* @param {function((Status.STD_OK|*))} callback
*/
runint.prototype.ps_write = function (cap,code,callback) {
var self=this;
var rpcio = self.rpc.router.pkt_get();
rpcio.header.h_port=cap.cap_port;
rpcio.header.h_priv=cap.cap_priv;
rpcio.header.h_command=Command.PS_WRITE;
Buf.buf_init(rpcio);
Buf.buf_put_string(rpcio,code);
Io.log((log<10)||('ps_write: '+Rpc.Print.rpcio(rpcio)));
B([
function () {self.rpc.trans(rpcio)},
function () {
rpcio.pos=0;
Io.log((log<10)||('ps_write returned '+Rpc.Print.rpcio(rpcio)));
var stat=rpcio.status;
if (stat == Status.STD_OK) stat=rpcio.header.h_status||stat;
self.rpc.router.pkt_discard(rpcio);
callback(stat);
}
], function (e) {
self.rpc.router.pkt_discard(rpcio);
if (typeof e == 'number') callback(e,undefined); else callback(Status.STD_SYSERR,undefined);
});
};
module.exports = {
/**
*
* @param {rpcint} rpc
* @returns {stdint}
*/
RunInt : function(rpc) {
var obj = new runint(rpc);
Object.preventExtensions(obj);
return obj;
},
current:function (module) { current=module.current; Aios=module; }
}