raas-proxy
Version:
Rule as a Service (RaaS), change business rules on the fly from any browser. Quick integration, parallel execution, approval workflow and more..
85 lines (68 loc) • 2.28 kB
JavaScript
//Author: Bobby Thomas (bobtxt@gmail.com)
let axios = require('axios');
module.exports = function (subscribeToken, proxyBearerToken, learningMode=false) {
console.log('RaaS Initializing ..');
let ruleEventLists = new Map();
if(!learningMode){
getRuleToTrigger((data)=> {
ruleEventLists = data;
});
}
return async function (req, res, next) {
next(); //Return immidiatily so that the actual Api call is not delayed
if(!req.body){
console.log('RaaS Warning: Make sure you have a "bodyParser" middleware installed.');
}
let pattern = req.originalUrl.toLowerCase().replace(/\/[0-9]+/g,'');
let match = `${req.method.toLowerCase()}:${pattern}`;
let matchingRules = ruleEventLists.get(match);
if(learningMode || (matchingRules && matchingRules.length > 0)){
try {
let params = {
//rules: matchingRules.map(x=> ruleLists.get(x)),
url: req.originalUrl.toLowerCase(),
method: req.method,
body: JSON.stringify(req.body),
param: JSON.stringify(req.params),
subscription: JSON.stringify(subscribeToken),
token: JSON.stringify(proxyBearerToken),
};
let a = await sendToPolicyEngine(params);
console.log(a);
}
catch(ex){
console.log('RaaS Error: ', ex);
}
}
else{
//console.log('RaaS Info: No rules captured.');
}
console.log('------------ Scanned by RaaS ------------');
}
async function sendToPolicyEngine(params){
let url = 'https://7ijcibrpvf.execute-api.us-east-1.amazonaws.com/prod';
const response = await axios.post(url, params);
return response.data;
}
async function getRuleToTrigger(cb){
let url = 'https://gr4m466yx1.execute-api.us-east-1.amazonaws.com/prod';
const response = await axios.get(url);
let ruleEventLists = new Map();
response.data.map(x=>{
ruleEventLists.set(x, 0);
});
cb(ruleEventLists);
}
async function longPolling(){
let url = 'https://d5h5fxomug.execute-api.us-east-1.amazonaws.com/prod';
const response = await axios.get(url); //After 20 seconds this line returns
console.log(response.data);
if(response.data.available){
dataAvailable(response.data);
}
//longPolling();
}
function dataAvailable(data){
//Trigger Transmute Action by calling local API
}
}