UNPKG

jsdb-server

Version:

JSDB Written using Chrome's V8, implemented in Node.js. Having as its main objectives to be: simple, minimalist and effective for data persistence. In addition to easy integration with other programming languages.

134 lines (96 loc) 4.08 kB
const /*--- Declaring imports ---*/ Response = require('./response'), _ = require('underscore'), _definitions = require('./../application/definitions'), _error = require('./../application/error'), _errors = require('./../application/errors.json'), _entitlements = require('./entitlements'), _monitoring = require('./../monitoring/monitoring.manager'); var console = process.console || global.console; module.exports = { execute : function(transaction, dispatch) { console.tag(transaction.getId()).debug('executor.execute'); /** * Closure callback of execute method * * @param {object} transaction * @param {function} dispatch * */ function callback(err, result, rollback){ _monitoring.endTransaction(transaction.getId()); if(!_.isUndefined(err)){ console.tag(transaction.getId()).debug('executor.callback err', err); //Default Status var status = _definitions.trxStatus.FATAL; //Hard error if(!executor){ var error = new _error.EnvironmentError('TRXNF'); dispatch(new Response(status, error)); return; } //Verify if need execute rollback if(rollback){ if(executor.rollback){ console.error('Executing rollback for ID[%s] NAME[%s]', transaction.getId(), transaction.getTransaction()); console.tag(transaction.getId()).tag(transaction.getUserToken()).tag('rollback').audit('Executing rollback'); executor.rollback(transaction, err); console.error('Rollback executed for ID[%s] NAME[%s]', transaction.getId(), transaction.getTransaction()); console.tag(transaction.getId()).tag(transaction.getUserToken()).tag('rollback').audit('Rollback executed'); } } //Define Status of Error if('TypeError' == err.name){ status = _definitions.trxStatus.INVALID; } if('ReferenceError' == err.name){ status = _definitions.trxStatus.FATAL; } if(!_.isEmpty(_errors[err.name])){ status = _definitions.trxStatus.ERROR; } if(typeof err == 'NotAuthorizedError'){ status = _definitions.trxStatus.DENIED; } if(typeof err == 'ForbiddenError'){ status = _definitions.trxStatus.FORBIDDEN; } console.tag(transaction.getId()).tag(transaction.getTransaction()).tag(transaction.getUserToken()).audit('response - status[%s]', status); dispatch(new Response(status, err)); return } console.tag(transaction.getId()).debug('executor.callback status[%s]', _definitions.trxStatus.SUCCESS); console.tag(transaction.getId()).tag(transaction.getTransaction()).tag(transaction.getUserToken()).audit('response - status[%s]', _definitions.trxStatus.SUCCESS); dispatch(new Response(_definitions.trxStatus.SUCCESS, result)); } //Start execution of transaction console.tag(transaction.getId()).tag(transaction.getTransaction()).tag(transaction.getUserToken()).audit('received transaction'); try { //Get fulfillment var fulfillment = './../fulfillment/' + transaction.getTransaction(); //Get executor var executor = require(fulfillment); console.tag(transaction.getId()).debug('executor import fulfillment [%s]', transaction.getTransaction()); _entitlements.validate(transaction, executor, (err) => { if(err){ callback(err); return; } //Validate request if(executor.validateRequest && !executor.validateRequest(transaction.getData())){ var errorData = { 'reason' : 'TRXINV', 'message' : _errors.TRXINV.message }; dispatch(new Response(_definitions.trxStatus.INVALID, errorData)); return; } //Start monitoring _monitoring.registerTransaction(transaction); //Execute transaction executor.execute(transaction, callback); }); } catch (e) { //Fatal error, callback is called and try rollback of this transaction. console.error('Transaction fatal failed [%s][%s]', e.name, e.message); global.console.trace(e); callback(e, _.noop(), true); } } };