diff --git a/src/index.js b/src/index.js index fcfd851..c9687df 100644 --- a/src/index.js +++ b/src/index.js @@ -1,91 +1,97 @@ const KeenTracking = require('keen-tracking'); const responseTime = require('response-time'); -const client = new KeenTracking({ - projectId: process.env.KEEN_PROJECT_ID, - writeKey: process.env.KEEN_WRITE_KEY -}); +module.exports = (options = {}) => { -module.exports = responseTime((req, res, time) => { + // Setup options + const eventCollection = options.eventCollection || 'anonlytics'; + const client = new KeenTracking({ + projectId: options.keenProjectId || process.env.KEEN_PROJECT_ID, + writeKey: options.keenWriteKey || process.env.KEEN_WRITE_KEY + }); + + // Return middleware function + return responseTime((req, res, time) => { + + // Setup event data + const eventData = { + http: { + method: req.method, + statusCode: res.statusCode + }, + responseTime: time, + url: { + string: `${req.protocol}://${req.headers.host}${req.originalUrl}` + }, + ip: req.ip.substr(0, 7) == '::ffff:' ? req.ip.substr(7) : req.ip, + userAgent: { + string: req.headers['user-agent'] + }, + referrer: { + url: req.headers.referer + }, + express: { + route: req.route && req.route.path + } + }; - // Setup event data - const eventData = { - http: { - method: req.method, - statusCode: res.statusCode - }, - responseTime: time, - url: { - string: `${req.protocol}://${req.headers.host}${req.originalUrl}` - }, - ip: req.ip.substr(0, 7) == '::ffff:' ? req.ip.substr(7) : req.ip, - userAgent: { - string: req.headers['user-agent'] - }, - referrer: { - url: req.headers.referer - }, - express: { - route: req.route && req.route.path - } - }; + // Enable keen date time addon + eventData.keen = { + addons: [ + { + name: 'keen:date_time_parser', + input: { + date_time: 'keen.timestamp', + }, + output: 'timestamp_info' + } + ] + }; - // Enable keen date time addon - eventData.keen = { - addons: [ + // Only enable other keen addons if we have the required input + const keenAddons = [ { - name: 'keen:date_time_parser', + name: 'keen:url_parser', input: { - date_time: 'keen.timestamp', + url: 'url.string' }, - output: 'timestamp_info' - } - ] - }; - - // Only enable other keen addons if we have the required input - const keenAddons = [ - { - name: 'keen:url_parser', - input: { - url: 'url.string' - }, - output: 'url.components' - }, - { - name: 'keen:ip_to_geo', - input: { - ip: 'ip' + output: 'url.components' }, - output: 'location' - }, - { - name: 'keen:ua_parser', - input: { - ua_string: 'userAgent.string' + { + name: 'keen:ip_to_geo', + input: { + ip: 'ip' + }, + output: 'location' }, - output: 'userAgent.info' - }, - { - name: 'keen:referrer_parser', - input: { - referrer_url: 'referrer.url', - page_url: 'url.string' + { + name: 'keen:ua_parser', + input: { + ua_string: 'userAgent.string' + }, + output: 'userAgent.info' }, - output: 'referrer.info' - } - ]; - keenAddons.forEach(addon => { - const hasRequiredProperties = Object - .keys(addon.input) - .map(key => addon.input[key]) - .every(requiredProp => requiredProp.split('.').reduce((obj, i) => obj[i], eventData)); + { + name: 'keen:referrer_parser', + input: { + referrer_url: 'referrer.url', + page_url: 'url.string' + }, + output: 'referrer.info' + } + ]; + keenAddons.forEach(addon => { + const hasRequiredProperties = Object + .keys(addon.input) + .map(key => addon.input[key]) + .every(requiredProp => requiredProp.split('.').reduce((obj, i) => obj[i], eventData)); - if(hasRequiredProperties) { - eventData.keen.addons.push(addon); - } - }); + if(hasRequiredProperties) { + eventData.keen.addons.push(addon); + } + }); - // Send event data - client.recordEvent('analytics', eventData); -}); + // Send event data + client.recordEvent(eventCollection, eventData); + }); +}