Socket
Socket
Sign inDemoInstall

caddis

Package Overview
Dependencies
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

caddis - npm Package Compare versions

Comparing version 0.3.6 to 0.4.0

HISTORY.md

60

lib/caddis.js

@@ -0,13 +1,39 @@

var fs = require('fs');
var _ = require('lodash');
var path = require('path');
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
var forever = require('forever');
var map = require('map-stream');
require('colors');
var tmp = process.cwd() + '/.caddis-tmp';
var PORT_ENTRY = /^var port = (\d+);$/;
var tmp = path.normalize([process.env.HOME, '.caddis'].join(path.sep));
var caddis = module.exports;
caddis.outlog = [tmp, 'forever.log'].join('/');
caddis.original = __dirname + '/caddis/server.js';
caddis.outlog = [tmp, 'caddis.log'].join(path.sep);
caddis.original = [__dirname, 'caddis', 'server.js'].join(path.sep);
caddis.server = [tmp, 'server.js'].join(path.sep);
var replacePort = function replacePort(port, original, out) {
fs.createReadStream(original)
.pipe(map(function(file, cb) {
var contents = file.toString();
var lines = contents.split('\n');
lines = _.map(lines, function(line) {
if(line.match(PORT_ENTRY)) {
return 'var port = ' + port.toString() + ';';
}
return line;
});
cb(null, lines.join('\n'));
}))
.pipe(fs.createWriteStream(out));
};
var generateServerScript = function generateServerScript(port, originalScript, outScript) {
var previousScript = fs.existsSync(outScript);
replacePort(port, originalScript, outScript);
};
var checkRegistry = function checkRegistry(script, callback) {

@@ -20,3 +46,2 @@ var timeout = 0;

if(process) {
// console.log(('Found process: ' + JSON.stringify(process, null, 2)).cyan);
callback();

@@ -32,6 +57,15 @@ }

caddis.start = function(callback) {
caddis.start = function(port, callback) {
mkdirp.sync(tmp);
forever.startDaemon(caddis.original, {
logFile: caddis.outlog
if(fs.existsSync(caddis.outlog)) {
fs.writeFileSync(caddis.outlog, '', 'utf8');
}
generateServerScript(port, caddis.original, caddis.server);
forever.startDaemon(caddis.server, {
logFile: caddis.outlog,
append: false
})

@@ -41,12 +75,8 @@ .on('error', function(error) {

});
checkRegistry(caddis.original, callback);
checkRegistry(caddis.server, callback);
};
caddis.stop = function(callback) {
rimraf(tmp, function(error) {
if(error) {
console.log(('Error in cleanup temporary files from ' + tmp + '.').red);
}
});
forever.stop(caddis.original)
forever.stop(caddis.server)
.on('stop', function() {

@@ -53,0 +83,0 @@ callback();

'use strict';
var express = require('express');
var app = express();
var http = require('http');
var port = 3001;
app.use(express.bodyParser());
var routeMap = {};
var routeSupport = ['get', 'post', 'put', 'delete'];
var ROOT_ENDPOINT = /^\/$/i;
var API_ENDPOINT = /\/api/i;
var COLON_TOKEN = /(:\w+)/gi;
var COLON_REPLACE = '(' + '\\' + 'w+)';
var print = function(message) {
console.log([new Date(), message].join(':: '));
};
var requestIsRoot = function(req) {
return req.length === 0 || req.url.match(ROOT_ENDPOINT);
};
var requestIsAPIRoute = function(req) {
return req.method.toLowerCase() === 'post' && req.url.match(API_ENDPOINT);
};
var isValidInt = function(value) {

@@ -22,67 +40,155 @@ var n = parseInt(value, 10);

var convertToJSONHash = function(objectOrString) {
return typeof objectOrString === 'string' ? JSON.parse(objectOrString) : objectOrString;
var tokenizeURI = function(uri) {
return '^' + uri.replace(COLON_TOKEN, COLON_REPLACE) + '$';
};
// ## CORS middleware
// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// intercept OPTIONS method
if ('OPTIONS' === req.method) {
res.send(200);
var addRoute = function(route) {
var normalizedMethod = route.method.toLowerCase();
if(routeMap.hasOwnProperty(normalizedMethod)) {
route.regex = new RegExp(tokenizeURI(route.uri));
route.match = function(uri) {
return uri.match(this.regex);
};
routeMap[normalizedMethod].push(route);
}
};
var findRouteFromRequest = function(req) {
var routeList = routeMap[req.method.toLowerCase()];
var route;
var index;
if(routeList) {
index = routeList.length;
while(--index > -1) {
route = routeList[index];
if(route.match(req.url)) {
return route;
}
}
else {
next();
}
}
return undefined;
};
app.use(allowCrossDomain);
app.use(express.logger());
app.get('/', function(req, res) {
res.json({hello: 'world'});
});
// Solution coutesy of:
// http://stackoverflow.com/questions/8648892/convert-url-parameters-to-a-javascript-object
var bodyParser = function(value) {
var data = value;
// Check if issuer passed as params.
if(!data.match(/^{(.*)/)) {
print('Recieved response payload as param string.');
data = JSON.parse('{"' + value.replace(/"/g, '\\"').replace(/&/g, '","').replace(/\=/g,'":"') + '"}');
data.response = JSON.parse(data.response.replace(/\\"/g, '"'));
print('Parsed and formatted to ' + JSON.stringify(data, null, 2));
}
// If not, assuming as json string.
else {
print('Received response payload as proper JSON string.');
data = JSON.parse(data);
print('Parsed and formatted as: ' + JSON.stringify(data, null, 2));
}
return data;
};
app.post('/api', function(req, res) {
var config = req.body;
if(config) {
var establishRouteMap = function() {
while(routeSupport.length > 0) {
routeMap[routeSupport.shift()] = [];
}
};
var delay = validateDelay(config.delay);
var statusCode = validateStatusCode(config.status);
var jsonResponse = convertToJSONHash(config.response);
app[config.method.toLowerCase()](config.uri, function(request, response) {
var server = http.createServer(function(request, response) {
var data = '';
var body;
// Cross Domain.
response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
response.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
request.setEncoding('utf8');
request.on('data', function(chunk) {
data += chunk;
});
if(request.method === 'OPTIONS') {
request.on('end', function() {
response.writeHead(200);
response.end('\n');
print('OPTIONS request.');
});
}
else if(requestIsRoot(request)) {
request.on('end', function() {
body = JSON.stringify({result: 'hello, caddis!'}) + '\n';
response.writeHead(200, {
'Content-Type': 'application/json',
'Content-Length': body.length
});
response.end(body);
print('Root request.');
});
}
else if(requestIsAPIRoute(request)) {
request.on('end', function() {
var route = bodyParser(decodeURIComponent(data));
addRoute(route);
body = JSON.stringify({result: true}) + '\n';
response.writeHead(200, {
'Content-Type': 'application/json',
'Content-Length': body.length
});
response.end(body);
print('Route added to ' + route.method + '.');
print(JSON.stringify(route, null, 2));
});
}
else {
request.on('end', function() {
var route;
var delay;
var statusCode;
var timeout;
var respond = function() {
if(!isNaN(statusCode)) {
response.status(statusCode).json(jsonResponse);
var respond;
route = findRouteFromRequest(request);
if(route !== undefined) {
delay = validateDelay(route.delay);
statusCode = validateStatusCode(route.status);
body = JSON.stringify(route.response) + '\n';
respond = function() {
response.writeHead(!isNaN(statusCode) ? statusCode : 200, {
'Content-Type': 'application/json',
'Content-Length': body.length
});
response.end(body);
};
print('Stored route found.');
print('Returning: ' + body +
'after ' + (!isNaN(delay) ? delay : 0) +
' milliseconds with status ' + (!isNaN(statusCode) ? statusCode : 200));
if(!isNaN(delay)) {
timeout = setTimeout(function() {
clearTimeout(timeout);
respond();
}, delay);
}
else {
response.json(jsonResponse);
respond();
}
};
if(!isNaN(delay)) {
timeout = setTimeout(function() {
clearTimeout(timeout);
respond();
}, delay);
}
else {
respond();
body = JSON.stringify({
message: request.url + ' not implemented.'
}) + '\n';
response.writeHead(501, {
'Content-Type': 'application/json',
'Content-Length': body.length
});
response.end(body);
}
});
res.json({result:true});
}
else {
res.json({error:'Must post JSON for modification of API.'});
}
});
app.listen(port);
console.log('Caddis started on port ' + port + '.');
establishRouteMap();
server.listen(port);
print(new Date() + ':: Caddis started on port ' + port + '.');
{
"name": "caddis",
"version": "0.3.6",
"version": "0.4.0",
"repository": {

@@ -31,11 +31,9 @@ "type": "git",

"dependencies": {
"express": "~3.4.8",
"forever": "~0.10.11",
"colors": "~0.6.2",
"mkdirp": "~0.3.5",
"map-stream": "~0.1.0",
"lodash": "~2.4.1",
"rimraf": "~2.2.6",
"minimist": "0.0.8"
"minimist": "0.0.8",
"map-stream": "~0.1.0"
}
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc