serverless/lib/utils/userStats.js
2017-05-24 00:21:30 -07:00

102 lines
2.6 KiB
JavaScript

'use strict';
const BbPromise = require('bluebird');
const _ = require('lodash');
const fetch = require('node-fetch');
const configUtils = require('./config');
const isTrackingDisabled = require('./isTrackingDisabled');
const isValidEventName = require('./userStatsValidation');
const TRACKING_IS_DISABLED = isTrackingDisabled();
const TRACK_URL = 'https://serverless.com/api/framework/track';
const IDENTIFY_URL = 'https://serverless.com/api/framework/identify';
const DEBUG = false;
/* note tracking swallows errors */
function request(url, payload) {
return fetch(url, {
method: 'POST',
// set to 1000 b/c no response needed
timeout: '1000',
body: JSON.stringify(payload),
})
.then((response) => {
if (response.status === 404) {
return BbPromise.reject('404 api not found');
}
return response.json();
})
.then((res) => BbPromise.resolve(res))
.catch((e) => BbPromise.resolve(e));
}
function track(eventName, payload) {
// exit early if tracking disabled
if (TRACKING_IS_DISABLED) {
if (DEBUG) {
console.log('abort .track call'); // eslint-disable-line
}
return BbPromise.resolve();
}
const data = payload || {};
let userId = data.id;
let userEmail = data.email;
// getConfig for values if not provided from .track call
if (!userId || !userEmail) {
const config = configUtils.getConfig();
userId = config.userId;
if (config.users && config.users[userId] && !config.users[userId].email) {
// exit early if no user data or email found
return BbPromise.resolve();
}
userEmail = config.users[userId].email;
}
// automatically add `framework:` prefix
if (eventName.indexOf('framework:') === -1) {
eventName = `framework:${eventName}`; // eslint-disable-line
}
// to ensure clean data, validate event name
if (!isValidEventName(eventName)) {
return BbPromise.resolve();
}
const defaultData = {
event: eventName,
id: userId,
email: userEmail,
data: {
id: userId,
timestamp: Math.round(+new Date() / 1000),
},
};
const eventData = _.merge(defaultData, data);
if (DEBUG) {
console.log('.track call', eventData); // eslint-disable-line
}
// return BbPromise.resolve();
return request(TRACK_URL, eventData);
}
function identify(payload) {
if (TRACKING_IS_DISABLED) {
if (DEBUG) {
console.log('abort .identify call'); // eslint-disable-line
}
// exit early is tracking disabled
return BbPromise.resolve();
}
if (DEBUG) {
console.log('.identify call', payload); // eslint-disable-line
}
return request(IDENTIFY_URL, payload);
}
module.exports = {
track,
identify,
};