Comparing version 0.3.6 to 0.4.0
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
28300
6
34
531
2
3
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedrimraf@2.7.1(transitive)
+ Addedwrappy@1.0.2(transitive)
- Removedexpress@~3.4.8
- Removedrimraf@~2.2.6
- Removedbatch@0.5.0(transitive)
- Removedbuffer-crc32@0.2.1(transitive)
- Removedbytes@0.2.1(transitive)
- Removedcommander@1.3.2(transitive)
- Removedconnect@2.12.0(transitive)
- Removedcookie@0.1.0(transitive)
- Removedcookie-signature@1.0.1(transitive)
- Removedcore-util-is@1.0.3(transitive)
- Removeddebug@0.8.1(transitive)
- Removedexpress@3.4.8(transitive)
- Removedfresh@0.2.0(transitive)
- Removedisarray@0.0.1(transitive)
- Removedkeypress@0.1.0(transitive)
- Removedmerge-descriptors@0.0.1(transitive)
- Removedmethods@0.1.0(transitive)
- Removedmultiparty@2.2.0(transitive)
- Removednegotiator@0.3.0(transitive)
- Removedpause@0.0.1(transitive)
- Removedqs@0.6.6(transitive)
- Removedrange-parser@0.0.4(transitive)
- Removedraw-body@1.1.2(transitive)
- Removedreadable-stream@1.1.14(transitive)
- Removedrimraf@2.2.8(transitive)
- Removedsend@0.1.4(transitive)
- Removedstream-counter@0.2.0(transitive)
- Removedstring_decoder@0.10.31(transitive)
- Removeduid2@0.0.3(transitive)