Comparing version 0.4.6 to 0.4.7
@@ -7,2 +7,5 @@ module.exports = require('./lib/client'); | ||
// friendly alias for "raven.middleware.express" | ||
module.exports.middleware.express = module.exports.middleware.connect; | ||
module.exports.middleware.express = module.exports.middleware.connect; | ||
// To infinity and beyond | ||
Error.stackTraceLimit = Infinity; |
@@ -28,3 +28,4 @@ var parsers = require('./parsers'); | ||
this.root = options.root || process.cwd(); | ||
if(!this.dsn || !process.env.NODE_ENV || !(process.env.NODE_ENV == 'production' || process.env.NODE_ENV == 'test')) { | ||
this.loggerName = options.logger || ''; | ||
if(!this.dsn || !process.env.NODE_ENV || process.env.NODE_ENV !== 'production') { | ||
this._enabled = false; | ||
@@ -59,2 +60,3 @@ } else { | ||
kwargs['extra']['node'] = process.version; | ||
kwargs['logger'] = this.loggerName; | ||
@@ -72,3 +74,3 @@ if(!kwargs['checksum']){ | ||
kwargs['platform'] = 'node'; | ||
// this will happen asynchronously. We don't care about it's response. | ||
@@ -85,5 +87,4 @@ this._enabled && this.send(kwargs); | ||
timestamp = new Date().getTime(), | ||
signature = utils.getSignature(self.dsn.private_key, message, timestamp), | ||
headers = { | ||
'X-Sentry-Auth': utils.getAuthHeader(signature, timestamp, self.dsn.public_key, self.dsn.project_id), | ||
'X-Sentry-Auth': utils.getAuthHeader(timestamp, self.dsn.public_key, self.dsn.project_id), | ||
'Content-Type': 'application/octet-stream', | ||
@@ -90,0 +91,0 @@ 'Content-Length': message.length |
@@ -7,26 +7,24 @@ var utils = require('./utils'); | ||
kwargs['message'] = message; | ||
kwargs['sentry.interfaces.Message'] = { | ||
message: message, | ||
params: [] | ||
}; | ||
return kwargs; | ||
}; | ||
module.exports.parseError = function parseError(err, kwargs, cb) { | ||
utils.parseStack(err.stack, function(e, frames) { | ||
kwargs['message'] = err.name+': '+(err.message || '<no message>'); | ||
kwargs['sentry.interfaces.Exception'] = {type:err.name, value:err.message}; | ||
if(frames) { | ||
kwargs['sentry.interfaces.Stacktrace'] = {frames:frames}; | ||
kwargs['culprit'] = [ | ||
(frames[0].filename || 'unknown file').replace(process.cwd()+'/', ''), | ||
(frames[0]['function'] || 'unknown function') | ||
].join(':'); | ||
} | ||
if(err) { | ||
kwargs['sentry.interfaces.Message'] = { | ||
message: err, | ||
params: [] | ||
}; | ||
} | ||
var orig = Error.prepareStackTrace; | ||
Error.prepareStackTrace = function(_, stack) { return stack; }; | ||
// prepareStackTrace is triggered the first time .stack is accessed | ||
// so this is explicitly triggering it | ||
var stack = err.stack; | ||
// TODO: restore back an original style stack for anyone else that cares. | ||
Error.prepareStackTrace = orig; | ||
utils.parseStack(stack, function(frames) { | ||
kwargs['message'] = err.name + ': ' + (err.message || '<no message>'); | ||
kwargs['sentry.interfaces.Exception'] = { | ||
type: err.name, | ||
value:err.message | ||
}; | ||
kwargs['sentry.interfaces.Stacktrace'] = {frames: frames}; | ||
cb(kwargs); | ||
@@ -62,2 +60,2 @@ }); | ||
return kwargs; | ||
}; | ||
}; |
117
lib/utils.js
@@ -19,11 +19,4 @@ var raven = require('./client'); | ||
module.exports.getSignature = function getSignature(key, message, timestamp) { | ||
var hmac = crypto.createHmac('sha1', key); | ||
hmac.update(timestamp+' '+message); | ||
return hmac.digest('hex'); | ||
}; | ||
module.exports.getAuthHeader = function getAuthHeader(signature, timestamp, api_key, project_id) { | ||
module.exports.getAuthHeader = function getAuthHeader(timestamp, api_key, project_id) { | ||
var header = ['Sentry sentry_version=2.0']; | ||
header.push('sentry_signature='+signature); | ||
header.push('sentry_timestamp='+timestamp); | ||
@@ -96,59 +89,67 @@ header.push('sentry_client=raven-node/'+raven.version); | ||
var LINES_OF_CONTEXT = 7; | ||
module.exports.parseStack = function parseStack(stack, cb) { | ||
try { | ||
// grab all lines except the first | ||
var lines = stack.split('\n').slice(1), | ||
callbacks=lines.length, | ||
frames=[], | ||
cache={}; | ||
function parseStack(stack, cb) { | ||
var frames = [], | ||
cache = {}, | ||
callbacks = stack.length; | ||
if(lines.length === 0) { | ||
throw new Error('No lines to parse!'); | ||
stack.forEach(function(line, index) { | ||
var frame = { | ||
filename: line.getFileName(), | ||
lineno: line.getLineNumber(), | ||
'function': line.getFunctionName() || '?' | ||
}, isInternal = line.isNative() || | ||
(frame.filename[0] !== '/' && | ||
frame.filename[0] !== '.'); | ||
// in_app is either an internal Node function or a module within node_modules | ||
frame.in_app = isInternal || !!~frame.filename.indexOf('node_modules/'); | ||
// internal Node files are not full path names. Ignore them. | ||
if (isInternal) { | ||
frames[index] = frame; | ||
if (--callbacks === 0) cb(frames); | ||
return; | ||
} | ||
lines.forEach(function(line, index) { | ||
var pattern = /^\s*at (?:(.+(?: \[\w\s+\])?) )?\(?(.+?)(?::(\d+):(\d+))?\)?$/, | ||
data = line.match(pattern).slice(1), | ||
frame = { | ||
filename: data[1], | ||
lineno: ~~data[2] | ||
}; | ||
if (frame.filename in cache) { | ||
parseLines(cache[frame.filename]); | ||
if (--callbcaks === 0) cb(frames); | ||
return; | ||
} | ||
// only set the function key if it exists | ||
if(data[0]) { | ||
frame['function'] = data[0]; | ||
fs.readFile(frame.filename, function(err, file) { | ||
if (!err) { | ||
file = file.toString().split('\n'); | ||
cache[frame.filename] = file; | ||
parseLines(file, frame); | ||
} | ||
// internal Node files are not full path names. Ignore them. | ||
if(frame.filename[0] === '/' || frame.filename[0] === '.') { | ||
// check if it has been read in first | ||
if(frame.filename in cache) { | ||
parseLines(cache[frame.filename]); | ||
if(--callbacks === 0) cb(null, frames); | ||
} else { | ||
fs.readFile(frame.filename, function(err, file) { | ||
if(!err) { | ||
file = file.toString().split('\n'); | ||
cache[frame.filename] = file; | ||
parseLines(file); | ||
} | ||
frames[index] = frame; | ||
if(--callbacks === 0) cb(null, frames); | ||
}); | ||
} | ||
} else { | ||
frames[index] = frame; | ||
if(--callbacks === 0) cb(null, frames); | ||
} | ||
frames[index] = frame; | ||
if (--callbacks === 0) cb(frames); | ||
}); | ||
function parseLines(lines) { | ||
frame.pre_context = lines.slice(Math.max(0, frame.lineno-(LINES_OF_CONTEXT+1)), frame.lineno-1); | ||
frame.context_line = lines[frame.lineno-1]; | ||
frame.post_context = lines.slice(frame.lineno, frame.lineno+LINES_OF_CONTEXT); | ||
} | ||
}); | ||
} catch(e) { | ||
cb(new Error('Can\'t parse stack trace:\n' + stack)); | ||
} | ||
}; | ||
function parseLines(lines) { | ||
frame.pre_context = lines.slice(Math.max(0, frame.lineno-(LINES_OF_CONTEXT+1)), frame.lineno-1); | ||
frame.context_line = lines[frame.lineno-1]; | ||
frame.post_context = lines.slice(frame.lineno, frame.lineno+LINES_OF_CONTEXT); | ||
} | ||
// console.log(line.getThis()); | ||
// console.log(line.getTypeName()); | ||
// console.log(line.getFunction().caller); | ||
// console.log(line.getFunction()+''); | ||
// console.log(line.getFunctionName()); | ||
// console.log(line.getMethodName()); | ||
// console.log(line.getFileName()); | ||
// console.log(line.getLineNumber()); | ||
// console.log(line.getColumnNumber()); | ||
// console.log(line.getEvalOrigin()); | ||
// console.log(line.isToplevel()); | ||
// console.log(line.isNative()); | ||
// console.log(line.isConstructor()); | ||
}); | ||
} | ||
module.exports.parseStack = parseStack; |
@@ -5,3 +5,3 @@ { | ||
"keywords": ["raven", "sentry", "python"], | ||
"version": "0.4.6", | ||
"version": "0.4.7", | ||
"repository": "git://github.com/mattrobenolt/raven-node.git", | ||
@@ -8,0 +8,0 @@ "author": "Matt Robenolt <matt@ydekproductions.com>", |
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
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
Non-existent author
Supply chain riskThe package was published by an npm account that no longer exists.
Found 1 instance in 1 package
0
10
22336
420