raven
Advanced tools
Comparing version 0.1.0 to 0.2.0
@@ -1,2 +0,3 @@ | ||
var zlib = require('zlib'), | ||
var parsers = require('./parsers'), | ||
zlib = require('zlib'), | ||
utils = require('./utils'), | ||
@@ -7,10 +8,22 @@ parseUrl = require('url').parse, | ||
module.exports.version = '0.2.0'; | ||
var Client = function Client(dsn, options) { | ||
if(arguments.length === 0) { | ||
// no arguments, use default from environment | ||
dsn = process.env.SENTRY_DSN; | ||
options = {}; | ||
} | ||
if(typeof dsn === 'object') { | ||
// They must only be passing through options | ||
options = dsn; | ||
dsn = process.env.SENTRY_DSN; | ||
} | ||
options = options || {}; | ||
this.dsn = utils.parseDSN(dsn); | ||
this.name = options.name || require('os').hostname(); | ||
this.site = options.site; | ||
this.name = options.name || process.env.SENTRY_NAME || require('os').hostname(); | ||
this.site = options.site || process.env.SENTRY_SITE; | ||
this.root = options.root || process.cwd(); | ||
if(!process.env.NODE_ENV || !(process.env.NODE_ENV == 'production' || process.env.NODE_ENV == 'test')) { | ||
console.log('Warning: Sentry logging is disabled, please set NODE_ENV=production'); | ||
console.warn('Warning: Sentry logging is disabled, please set NODE_ENV=production'); | ||
this._enabled = false; | ||
@@ -33,8 +46,9 @@ } else { | ||
kwargs['event_id'] = event_id; | ||
kwargs['timestamp'] = new Date().toISOString().split('.')[0]; | ||
kwargs['project'] = this.dsn.project_id; | ||
kwargs['modules'] = utils.getModules(); | ||
kwargs['server_name'] = kwargs['server_name'] || this.name; | ||
kwargs['extra'] = kwargs['extra'] || {}; | ||
kwargs['extra']['node'] = process.version; | ||
if(!kwargs['checksum']){ | ||
checksum = kwargs['checksum'] = utils.construct_checksum(kwargs); | ||
checksum = kwargs['checksum'] = utils.constructChecksum(kwargs); | ||
} else { | ||
@@ -44,5 +58,6 @@ checksum = kwargs['checksum']; | ||
kwargs['server_name'] = kwargs['server_name'] || this.name; | ||
kwargs['event_id'] = event_id; | ||
kwargs['timestamp'] = new Date().toISOString().split('.')[0]; | ||
kwargs['project'] = this.dsn.project_id; | ||
kwargs['site'] = kwargs['site'] || this.site; | ||
kwargs['extra'] = kwargs['extra'] || {}; | ||
@@ -55,3 +70,3 @@ // this will happen asynchronously. We don't care about it's response. | ||
_.sendRemote = function sendRemote(message, headers, callback) { | ||
_.sendRemote = function sendRemote(message, headers, cb) { | ||
var self = this; | ||
@@ -80,5 +95,5 @@ var options = { | ||
timestamp = new Date().getTime(), | ||
signature = utils.get_signature(self.dsn.private_key, message, timestamp), | ||
signature = utils.getSignature(self.dsn.private_key, message, timestamp), | ||
headers = { | ||
'X-Sentry-Auth': utils.get_auth_header(signature, timestamp, self.dsn.public_key, self.dsn.project_id), | ||
'X-Sentry-Auth': utils.getAuthHeader(signature, timestamp, self.dsn.public_key, self.dsn.project_id), | ||
'Content-Type': 'application/octet-stream', | ||
@@ -92,6 +107,5 @@ 'Content-Length': message.length | ||
_.createFromText = | ||
_.create_from_text = function createFromText(message, kwargs, callback) { | ||
if(!callback && typeof kwargs === 'function') { | ||
callback = kwargs; | ||
_.captureMessage = function captureMessage(message, kwargs, cb) { | ||
if(!cb && typeof kwargs === 'function') { | ||
cb = kwargs; | ||
kwargs = {}; | ||
@@ -101,18 +115,12 @@ } else { | ||
} | ||
kwargs['message'] = message; | ||
kwargs['sentry.interfaces.Message'] = { | ||
message: message, | ||
params: [] | ||
}; | ||
var result = this.process(kwargs); | ||
callback && callback(result); | ||
var result = this.process(parsers.parseText(message, kwargs)); | ||
cb && cb(result); | ||
return result; | ||
}; | ||
_.createFromError = | ||
_.create_from_exception = | ||
_.create_from_error = function createFromError(err, kwargs, callback) { | ||
_.captureError = | ||
_.captureException = function captureError(err, kwargs, cb) { | ||
var self = this; | ||
if(!callback && typeof kwargs === 'function') { | ||
callback = kwargs; | ||
if(!cb && typeof kwargs === 'function') { | ||
cb = kwargs; | ||
kwargs = {}; | ||
@@ -122,12 +130,20 @@ } else { | ||
} | ||
utils.parseStack(err.stack, function(e, frames) { | ||
kwargs['message'] = err.name+': '+err.message; | ||
kwargs['sentry.interfaces.Exception'] = {type:err.name, value:err.message}; | ||
kwargs['sentry.interfaces.Stacktrace'] = {frames:frames}; | ||
kwargs['culprit'] = err.name + ' in ' + err.stack.split('\n')[1].match(/^.*?\((.*?):\d+:\d+\)$/)[1].replace(process.cwd()+'/', ''); | ||
var result = self.process(kwargs); | ||
callback && callback(result); | ||
parsers.parseError(err, kwargs, function(kw) { | ||
var result = self.process(kw); | ||
cb && cb(result); | ||
}); | ||
}; | ||
_.captureQuery = function captureQuery(query, engine, kwargs, cb) { | ||
if(!cb && typeof kwargs === 'function') { | ||
cb = kwargs; | ||
kwargs = {}; | ||
} else { | ||
kwargs = kwargs || {}; | ||
} | ||
var result = this.process(parsers.parseQuery(query, engine, kwargs)); | ||
cb && cb(result); | ||
return result; | ||
}; | ||
_.patchGlobal = function patchGlobal() { | ||
@@ -134,0 +150,0 @@ module.exports.patchGlobal(this); |
@@ -1,22 +0,8 @@ | ||
var Client = require('../client').Client | ||
, url = require('url'); | ||
var raven = require('../client'), | ||
parsers = require('../parsers'); | ||
module.exports = function raven(client) { | ||
client = (client instanceof Client) ? client : new Client(client); | ||
module.exports = function connectMiddleware(client) { | ||
client = (client instanceof raven.Client) ? client : new raven.Client(client); | ||
return function(err, req, res, next) { | ||
var kwargs = { | ||
'sentry.interfaces.Http': { | ||
method: req.method, | ||
query_string: url.parse(req.url).query, | ||
headers: req.headers, | ||
cookies: req.cookies || '<unavailable: use cookieParser middleware>', | ||
data: req.body || '<unavailable: use bodyParser middleware>', | ||
url: (function build_absolute_url() { | ||
var protocol = req.socket.encrypted ? 'https' : 'http', | ||
host = req.headers.host || '<no host>'; | ||
return protocol+'://'+host+req.url; | ||
}()), | ||
env: process.env | ||
} | ||
}; | ||
var kwargs = parsers.parseRequest(req); | ||
client.createFromError(err, kwargs, function(result) { | ||
@@ -23,0 +9,0 @@ res.sentry = client.getIdent(result); |
@@ -1,7 +0,7 @@ | ||
var crypto = require('crypto'), | ||
var raven = require('./client'), | ||
crypto = require('crypto'), | ||
fs = require('fs'), | ||
url = require('url'), | ||
LINES_OF_CONTEXT = 7; | ||
url = require('url'); | ||
module.exports.construct_checksum = function construct_checksum(kwargs) { | ||
module.exports.constructChecksum = function constructChecksum(kwargs) { | ||
var checksum = crypto.createHash('md5'); | ||
@@ -12,3 +12,3 @@ checksum.update(kwargs['message'] || ''); | ||
module.exports.get_signature = function get_signature(key, message, timestamp) { | ||
module.exports.getSignature = function getSignature(key, message, timestamp) { | ||
var hmac = crypto.createHmac('sha1', key); | ||
@@ -19,9 +19,9 @@ hmac.update(timestamp+' '+message); | ||
module.exports.get_auth_header = function get_auth_header(signature, timestamp, api_key, project_id) { | ||
module.exports.getAuthHeader = function getAuthHeader(signature, timestamp, api_key, project_id) { | ||
var header = ['Sentry sentry_version=2.0']; | ||
header.push('sentry_signature='+signature); | ||
header.push('sentry_timestamp='+timestamp); | ||
header.push('sentry_client=raven-node/0.1'); | ||
if(api_key) header.push('sentry_key='+api_key); | ||
if(project_id) header.push('project_id='+project_id); | ||
header.push('sentry_client=raven-node/'+raven.version); | ||
header.push('sentry_key='+api_key); | ||
header.push('project_id='+project_id); | ||
return header.join(', '); | ||
@@ -50,2 +50,25 @@ }; | ||
var module_cache; | ||
module.exports.getModules = function getModules() { | ||
if(module_cache) { | ||
return module_cache; | ||
} | ||
var path = require('path'); | ||
var cwd = path.resolve('.'); | ||
var folders = fs.readdirSync(path.join(cwd, './node_modules/')); | ||
folders = folders.filter(function(f){ | ||
return f.charAt(0) !== '.'; | ||
}); | ||
module_cache = {}; | ||
folders.forEach(function(folder) { | ||
try { | ||
var json = require(path.join(cwd, './node_modules/'+folder+'/package.json')); | ||
module_cache[json.name] = json.version; | ||
} catch(e){} | ||
}); | ||
return module_cache; | ||
}; | ||
var LINES_OF_CONTEXT = 7; | ||
/* | ||
@@ -55,3 +78,3 @@ * Testing out with a custom stack track. | ||
*/ | ||
module.exports.parseStackBetter = function parseStackBetter(err, callback) { | ||
module.exports.parseStackBetter = function parseStackBetter(err, cb) { | ||
var orig = Error.prepareStackTrace; | ||
@@ -82,3 +105,3 @@ Error.prepareStackTrace = function(_, stack){ return stack; }; | ||
module.exports.parseStack = function parseStack(stack, callback) { | ||
module.exports.parseStack = function parseStack(stack, cb) { | ||
// grab all lines except the first | ||
@@ -88,8 +111,12 @@ var lines = stack.split('\n').slice(1), callbacks=lines.length, frames=[], cache={}; | ||
lines.forEach(function(line, index) { | ||
var data = line.match(/^\s*at (.+?) \((.+?):(\d+):(\d+)\)$/).slice(1), | ||
var data = line.match(/^\s*at (?:(.+(?: \[\w\s+\])?) )?\(?(.+?)(?::(\d+):(\d+))?\)?$/).slice(1), | ||
frame = { | ||
'function': data[0], | ||
filename: data[1], | ||
lineno: ~~data[2] | ||
}; | ||
// only set the function key if it exists | ||
if(data[0]) { | ||
frame['function'] = data[0]; | ||
} | ||
// internal Node files are not full path names. Ignore them. | ||
@@ -100,9 +127,12 @@ if(frame.filename[0] === '/' || frame.filename[0] === '.') { | ||
parseLines(cache[frame.filename]); | ||
if(--callbacks === 0) callback(null, frames); | ||
if(--callbacks === 0) cb(null, frames); | ||
} else { | ||
fs.readFile(frame.filename, function(err, file) { | ||
file = file.toString().split('\n'); | ||
cache[frame.filename] = file; | ||
parseLines(file); | ||
if(--callbacks === 0) callback(null, frames); | ||
if(!err) { | ||
file = file.toString().split('\n'); | ||
cache[frame.filename] = file; | ||
parseLines(file); | ||
} | ||
frames[index] = frame; | ||
if(--callbacks === 0) cb(null, frames); | ||
}); | ||
@@ -112,3 +142,3 @@ } | ||
frames[index] = frame; | ||
if(--callbacks === 0) callback(null, frames); | ||
if(--callbacks === 0) cb(null, frames); | ||
} | ||
@@ -120,5 +150,4 @@ | ||
frame.post_context = lines.slice(frame.lineno, frame.lineno+LINES_OF_CONTEXT); | ||
frames[index] = frame; | ||
} | ||
}); | ||
}; |
@@ -5,3 +5,3 @@ { | ||
"keywords": ["raven", "sentry", "python"], | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"repository": "git://github.com/mattrobenolt/raven-node.git", | ||
@@ -14,3 +14,3 @@ "author": "Matt Robenolt <matt@ydekproductions.com>", | ||
"engines": { | ||
"node": ">= 0.6.0 < 0.7.0" | ||
"node": ">= 0.6.0" | ||
}, | ||
@@ -25,4 +25,5 @@ "dependencies": { | ||
"should": "*", | ||
"nock": "*" | ||
"nock": "*", | ||
"glob": "*" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
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 3 instances in 1 package
12844
6
7
329
2
0
11
3