New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

botpress-analytics

Package Overview
Dependencies
Maintainers
2
Versions
27
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

botpress-analytics - npm Package Compare versions

Comparing version 2.0.1 to 2.0.2

308

bin/node.bundle.js

@@ -55,11 +55,20 @@ module.exports =

'use strict';
/* WEBPACK VAR INJECTION */(function(__dirname) {'use strict';
var Analytics = __webpack_require__(2);
var DB = __webpack_require__(10);
var checkVersion = __webpack_require__(2);
var Analytics = __webpack_require__(3);
var DB = __webpack_require__(12);
var _ = __webpack_require__(7);
var analytics = null;
var db = null;
var interactionsToTrack = ['message', 'text', 'button', 'template', 'quick_reply', 'postback'];
var incomingMiddleware = function incomingMiddleware(event, next) {
if (!_.includes(interactionsToTrack, event.type)) {
return next();
}
if (event.user) {

@@ -75,2 +84,6 @@ db && db.saveIncoming(event).then(function () {

var outgoingMiddleware = function outgoingMiddleware(event, next) {
if (!_.includes(interactionsToTrack, event.type)) {
return next();
}
db && db.saveOutgoing(event);

@@ -82,4 +95,5 @@ next();

init: function init(bp) {
checkVersion(bp, __dirname);
bp.registerMiddleware({
bp.middlewares.register({
name: 'analytics.incoming',

@@ -89,6 +103,7 @@ module: 'botpress-analytics',

handler: incomingMiddleware,
order: 5,
description: 'Tracks incoming messages for Analytics purposes'
});
bp.registerMiddleware({
bp.middlewares.register({
name: 'analytics.outgoing',

@@ -122,5 +137,12 @@ module: 'botpress-analytics',

};
/* WEBPACK VAR INJECTION */}.call(exports, "/"))
/***/ },
/* 2 */
/***/ function(module, exports) {
module.exports = require("botpress-version-manager");
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {

@@ -134,9 +156,9 @@

var fs = __webpack_require__(3);
var path = __webpack_require__(4);
var EventEmitter = __webpack_require__(5);
var _ = __webpack_require__(6);
var moment = __webpack_require__(7);
var fs = __webpack_require__(4);
var path = __webpack_require__(5);
var EventEmitter = __webpack_require__(6);
var _ = __webpack_require__(7);
var moment = __webpack_require__(8);
var Stats = __webpack_require__(8);
var Stats = __webpack_require__(9);

@@ -176,5 +198,3 @@ var createEmptyFileIfDoesntExist = function createEmptyFileIfDoesntExist(file) {

_this.stats.getLastRun().then(function (ts) {
var run = moment(new Date(ts));
var then = moment(new Date()).subtract(30, 'min');
var elasped = moment.duration(then.diff(run)).asMinutes();
var elasped = moment.duration(moment().diff(ts)).asMinutes();
if (!ts || elasped >= _this.getUpdateFrequency()) {

@@ -190,3 +210,7 @@ _this.updateData();

value: function getDBSize() {
return fs.statSync(this.bp.db.location)['size'] / 1000000.0; // in megabytes
if (this.bp.db.location !== 'postgres') {
return fs.statSync(this.bp.db.location)['size'] / 1000000.0; // in megabytes
} else {
return 1;
}
}

@@ -296,3 +320,3 @@ }, {

/***/ },
/* 3 */
/* 4 */
/***/ function(module, exports) {

@@ -303,3 +327,3 @@

/***/ },
/* 4 */
/* 5 */
/***/ function(module, exports) {

@@ -310,3 +334,3 @@

/***/ },
/* 5 */
/* 6 */
/***/ function(module, exports) {

@@ -317,3 +341,3 @@

/***/ },
/* 6 */
/* 7 */
/***/ function(module, exports) {

@@ -324,3 +348,3 @@

/***/ },
/* 7 */
/* 8 */
/***/ function(module, exports) {

@@ -331,3 +355,3 @@

/***/ },
/* 8 */
/* 9 */
/***/ function(module, exports, __webpack_require__) {

@@ -339,6 +363,20 @@

var moment = __webpack_require__(7);
var Promise = __webpack_require__(9);
var _ = __webpack_require__(6);
var _moment = __webpack_require__(8);
var _moment2 = _interopRequireDefault(_moment);
var _bluebird = __webpack_require__(10);
var _bluebird2 = _interopRequireDefault(_bluebird);
var _lodash = __webpack_require__(7);
var _lodash2 = _interopRequireDefault(_lodash);
var _botpress = __webpack_require__(11);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var oneDayMs = 1000 * 60 * 60 * 24;

@@ -354,3 +392,3 @@

var range = result.max - result.min;
var range = (0, _moment2.default)(result.max).diff((0, _moment2.default)(result.min), 'days');
var ranges = [];

@@ -366,5 +404,5 @@ for (var i = 1; i <= 10; i++) {

};
if (range / oneDayMs < 360) {
if (range < 360) {
ret.format = function (date) {
return moment(date).format('MMM Do');
return (0, _moment2.default)(date).format('MMM Do');
};

@@ -374,3 +412,3 @@ } else {

ret.format = function (date) {
return moment(date).format('MMM YY');
return (0, _moment2.default)(date).format('MMM YY');
};

@@ -387,2 +425,3 @@ }

return knex('users').select(knex.raw('distinct platform')).then(function (platforms) {
var statsBase = platforms.reduce(function (acc, curr) {

@@ -392,7 +431,8 @@ acc[curr.platform] = 0;

}, { total: 0 });
return knex('users').select(knex.raw('count(*) as count, created_on as date, platform')).groupBy(knex.raw("strftime('%Y-%m-%d', created_on/1000, 'unixepoch'), platform")).orderBy('created_on').then(function (rows) {
return knex('users').select(knex.raw('count(*) as count, max(created_on) as date, max(platform) as platform')).groupBy(knex.raw("date(created_on), platform")).orderBy(knex.raw('date(created_on)')).then(function (rows) {
var total = 0;
var totalPlatform = {};
var result = {};
var min = dates.format(moment(new Date(dates.min)).subtract(1, 'day'));
var min = dates.format((0, _moment2.default)(new Date(dates.min)).subtract(1, 'day'));
result[min] = Object.assign({}, statsBase);

@@ -407,9 +447,10 @@ rows.map(function (row) {

}
totalPlatform[row.platform] += row.count;
result[date].total = total += row.count;
var count = parseInt(row.count);
totalPlatform[row.platform] += count;
result[date].total = total += count;
result[date][row.platform] = totalPlatform[row.platform];
});
var max = dates.format(moment(new Date(dates.max)).add(1, 'hour'));
var max = dates.format((0, _moment2.default)(new Date(dates.max)).add(1, 'hour'));
result[max] = Object.assign({}, statsBase, { total: total }, totalPlatform);
return _.toPairs(result).map(function (_ref) {
return _lodash2.default.toPairs(result).map(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),

@@ -430,9 +471,9 @@ k = _ref2[0],

var ranges = _.times(nbOfDays, Number);
var ranges = _lodash2.default.times(nbOfDays, Number);
return ranges.map(function (n) {
var date = moment(new Date()).subtract(n, 'days');
var date = (0, _moment2.default)(new Date()).subtract(n, 'days');
return {
date: date.format('MMM Do'),
start: date.startOf('day').format('x'),
end: date.endOf('day').format('x'),
start: date.startOf('day').toDate(),
end: date.endOf('day').toDate(),
day: date.format('l')

@@ -444,10 +485,9 @@ };

function getDailyActiveUsers() {
var ranges = _.reverse(getLastDaysRange());
return Promise.mapSeries(ranges, function (range) {
return knex.select(knex.raw('count(*) as count, platform')).from(function () {
return this.from('analytics_interactions').join('users', 'users.id', 'analytics_interactions.user').where('ts', '<', range.end).andWhere('ts', '>', range.start).andWhere('direction', '=', 'in').groupBy('user');
}).groupBy('platform').then(function (results) {
var ranges = _lodash2.default.reverse(getLastDaysRange());
return _bluebird2.default.mapSeries(ranges, function (range) {
return knex('analytics_interactions').select(knex.raw('count(*) as count, platform')).join('users', 'users.id', 'analytics_interactions.user').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', range.start, range.end)).andWhere('direction', '=', 'in').groupBy(['user', 'platform']).then(function (results) {
return results.reduce(function (acc, curr) {
acc.total += curr.count;
acc[curr.platform] = curr.count;
var count = parseInt(curr.count);
acc.total += count;
acc[curr.platform] = count;
return acc;

@@ -460,10 +500,9 @@ }, { total: 0, name: range.date });

function getDailyGender() {
var ranges = _.reverse(getLastDaysRange());
return Promise.mapSeries(ranges, function (range) {
return knex.select(knex.raw('count(*) as count, gender')).from(function () {
return this.from('analytics_interactions').join('users', 'users.id', 'analytics_interactions.user').where('ts', '<', range.end).andWhere('ts', '>', range.start).andWhere('direction', '=', 'in').groupBy('user').select('users.gender');
}).groupBy('gender').then(function (results) {
var ranges = _lodash2.default.reverse(getLastDaysRange());
return _bluebird2.default.mapSeries(ranges, function (range) {
return knex('analytics_interactions').select(knex.raw('count(*) as count, gender')).join('users', 'users.id', 'analytics_interactions.user').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', range.start, range.end)).andWhere('direction', '=', 'in').groupBy(['user', 'gender']).then(function (results) {
return results.reduce(function (acc, curr) {
acc.total += curr.count;
acc[curr.gender] = curr.count;
var count = parseInt(curr.count);
acc.total += count;
acc[curr.gender] = count;
return acc;

@@ -477,11 +516,21 @@ }, { total: 0, name: range.date });

var ranges = getLastDaysRange();
return Promise.mapSeries(ranges, function (range) {
return _bluebird2.default.mapSeries(ranges, function (range) {
var inner = knex.from('analytics_interactions').where('ts', '<', range.end).andWhere('ts', '>', range.start).andWhere('direction', '=', 'in').groupBy('user').select(knex.raw('count(*) as c')).toString();
var inner = knex.from('analytics_interactions').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', range.start, range.end)).andWhere('direction', '=', 'in').groupBy('user').select(knex.raw('count(*) as c')).toString();
return knex.raw('select\n sum(r1) as s1,\n sum(r2) as s2,\n sum(r3) as s3,\n sum(r4) as s4,\n sum(r5) as s5,\n sum(r6) as s6,\n sum(r7) as s7,\n sum(r8) as s8\n from (select \n (select count(*) where c between 0 and 1) as r1,\n (select count(*) where c between 2 and 3) as r2,\n (select count(*) where c between 4 and 5) as r3,\n (select count(*) where c between 6 and 9) as r4,\n (select count(*) where c between 10 and 14) as r5,\n (select count(*) where c between 15 and 29) as r6,\n (select count(*) where c between 30 and 50) as r7,\n (select count(*) where c > 50) as r8\n from (' + inner + '))');
}).then().get(0).then(function (results) {
return knex.raw('select\n sum(r1) as s1,\n sum(r2) as s2,\n sum(r3) as s3,\n sum(r4) as s4,\n sum(r5) as s5,\n sum(r6) as s6,\n sum(r7) as s7,\n sum(r8) as s8\n from (select \n (select count(*) as count where c between 0 and 1) as r1,\n (select count(*) where c between 2 and 3) as r2,\n (select count(*) where c between 4 and 5) as r3,\n (select count(*) where c between 6 and 9) as r4,\n (select count(*) where c between 10 and 14) as r5,\n (select count(*) where c between 15 and 29) as r6,\n (select count(*) where c between 30 and 50) as r7,\n (select count(*) where c > 50) as r8\n from (' + inner + ') as q1 ) as q2');
}).then(function (rows) {
if (rows[0].rows) {
return rows.map(function (r) {
return r.rows[0];
});
} else {
return rows.map(function (r) {
return r[0];
});
}
}).then(function (results) {
return results.reduce(function (acc, curr) {
return _.mapValues(acc, function (a, k) {
return a + (curr[k] || 0);
return _lodash2.default.mapValues(acc, function (a, k) {
return a + (parseInt(curr[k]) || 0);
});

@@ -496,9 +545,9 @@ }, { s1: 0, s2: 0, s3: 0, s4: 0, s5: 0, s6: 0, s7: 0, s8: 0 });

// Average incoming interactions per user per day for the last 7 days
var now = new Date();
var daysAgo = moment(new Date()).subtract(7, 'days').format('x');
var lastWeek = (0, _moment2.default)(new Date()).subtract(7, 'days').toDate();
var now = (0, _botpress.DatabaseHelpers)(knex).date.now();
return knex.select(knex.raw('avg(c) as count')).from(function () {
return this.from('analytics_interactions').where('ts', '<', now).andWhere('ts', '>', daysAgo).andWhere('direction', '=', 'in').groupBy(knex.raw("user, strftime('%d/%m/%Y', ts/1000, 'unixepoch')")).select(knex.raw('count(*) as c'));
return this.from('analytics_interactions').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', lastWeek, now)).andWhere('direction', '=', 'in').groupBy(knex.raw("user, date(ts)")).select(knex.raw('count(*) as c')).as('q1');
}).then().get(0).then(function (result) {
return result.count;
return parseFloat(result.count) || 0.0;
});

@@ -510,15 +559,19 @@ }

var ranges = [{ label: 'today', start: moment(new Date()).startOf('day').format('x'), end: new Date() }, {
var ranges = [{
label: 'today',
start: (0, _moment2.default)(new Date()).startOf('day').toDate(),
end: new Date()
}, {
label: 'yesterday',
start: moment(new Date()).subtract(1, 'days').startOf('day').format('x'),
end: moment(new Date()).subtract(1, 'days').endOf('day').format('x')
start: (0, _moment2.default)(new Date()).subtract(1, 'days').startOf('day').toDate(),
end: (0, _moment2.default)(new Date()).subtract(1, 'days').endOf('day').toDate()
}, {
label: 'week',
start: moment(new Date()).startOf('week').format('x'),
end: moment(new Date()).endOf('week').format('x')
start: (0, _moment2.default)(new Date()).startOf('week').toDate(),
end: (0, _moment2.default)(new Date()).endOf('week').toDate()
}];
return Promise.mapSeries(ranges, function (range) {
return _bluebird2.default.mapSeries(ranges, function (range) {
return knex.select(knex.raw('count(*) as count')).from(function () {
return this.from('analytics_interactions').where('ts', '<', range.end).andWhere('ts', '>', range.start).andWhere('direction', '=', 'in').groupBy('user').select(knex.raw(1));
return this.from('analytics_interactions').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', range.start, range.end)).andWhere('direction', '=', 'in').groupBy('user').select(knex.raw(1)).as('q1');
}).then().get(0).then(function (result) {

@@ -538,10 +591,10 @@ return { label: range.label, count: result.count };

var cohorts = _.times(8, function (n) {
var cohorts = _lodash2.default.times(8, function (n) {
return Number(8 - n);
});
cohorts = cohorts.map(function (n) {
var day = moment(new Date()).subtract(n, 'days');
var day = (0, _moment2.default)().subtract(n, 'days');
return {
start: day.startOf('day').format('x'),
end: day.endOf('day').format('x'),
start: day.startOf('day').toDate(),
end: day.endOf('day').toDate(),
name: day.format('MMM Do'),

@@ -554,33 +607,48 @@ date: day

return Promise.mapSeries(cohorts, function (coo) {
return knex.raw('\n select count(*) total, ts date from\n (select user, ts from analytics_interactions\n join users on analytics_interactions.user = users.id\n where analytics_interactions.direction = \'in\'\n and users.created_on > ?\n and users.created_on < ?\n group by user, date(ts/1000, \'unixepoch\'))\n group by date(ts/1000, \'unixepoch\')\n order by ts', [coo.start, coo.end]).then(function (results) {
return knex('users').whereBetween('created_on', [coo.start, coo.end]).select(knex.raw('count(*) as total')).then().get(0).then(function (_ref3) {
var total = _ref3.total;
// For each days of the cohort
return _bluebird2.default.mapSeries(cohorts, function (coo) {
// Compute the cohort size [i.e. how many new users on this day?]
return knex('users').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('created_on', coo.start, coo.end)).select(knex.raw('count(*) as cohort_size')).then().get(0).then(function (_ref3) {
var cohort_size = _ref3.cohort_size;
var row = [];
cohort_size = parseFloat(cohort_size);
var _loop = function _loop() {
var anchor = moment(coo.date).add(i, 'days').startOf('day').format('l');
var f = _.find(results, function (_ref4) {
var date = _ref4.date;
// Compute the next 7 days of the cohort
// and check how many users [from this cohort] spoke on or before this date
// A user is considered as retentioned if he interacted with the bot any day after he onboarded
var d = moment(date).startOf('day').format('l');
return anchor == d;
});
if (f) {
row.push(Number((f.total / total).toFixed(2)));
} else {
row.push(null);
var daysToAdd = _lodash2.default.times(7, function (n) {
return n;
}); // from 0 to 6
return _bluebird2.default.mapSeries(daysToAdd, function (dta) {
var since = (0, _moment2.default)(coo.start).add(dta, 'days').endOf('day').toDate(); // +x days
return knex.from(function () {
this.from('analytics_interactions').join('users', 'analytics_interactions.user', 'users.id')
// where he is a member a this cohort
.where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('created_on', coo.start, coo.end))
// and where he interacted with the bot since onboard+X days
.andWhere((0, _botpress.DatabaseHelpers)(knex).date.isAfter('ts', since))
// and where the user spoke, not the bot
.andWhere('direction', '=', 'in').groupBy('users')
// returns the number of interactions per user
.select(knex.raw('count(*) as interaction_count')).as('q1');
}).select(knex.raw('count(*) as partial_retention')) // return the total number of users
.then().get(0).then(function (_ref4) {
var partial_retention = _ref4.partial_retention;
partial_retention = parseFloat(partial_retention);
// if the date is out of the cohort sample
if ((0, _moment2.default)(since).startOf('day').isSameOrAfter((0, _moment2.default)().startOf('day'))) {
return null;
}
};
for (var i = 1; i <= 7; i++) {
_loop();
}
var mean = _.mean(_.filter(row, function (v) {
return partial_retention / cohort_size || 0;
});
}).then(function (retention) {
var mean = _lodash2.default.mean(_lodash2.default.filter(retention, function (v) {
return v !== null;
}));
row.unshift(total);
row.push(_.isNaN(mean) ? 0 : mean);
result[coo.name] = row;
result[coo.name] = [cohort_size].concat(_toConsumableArray(retention), [mean]);
});

@@ -597,9 +665,8 @@ });

return Promise.mapSeries(ranges, function (range) {
return _bluebird2.default.mapSeries(ranges, function (range) {
// select count(*) as count, ts from interactions
// group by strftime('%H', ts/1000, 'unixepoch')
return knex('analytics_interactions').whereBetween('ts', [range.start, range.end]).select(knex.raw('count(*) as count, ts')).groupBy(knex.raw("strftime('%H', ts/1000, 'unixepoch')")).then(function (rows) {
return knex('analytics_interactions').where((0, _botpress.DatabaseHelpers)(knex).date.isBetween('ts', range.start, range.end)).select(knex.raw('count(*) as count, ' + (0, _botpress.DatabaseHelpers)(knex).date.hourOfDay('ts').sql + ' as ts')).groupBy((0, _botpress.DatabaseHelpers)(knex).date.hourOfDay('ts')).then(function (rows) {
var row = [];
_.times(24, function () {
_lodash2.default.times(24, function () {
return row.push(0);

@@ -611,3 +678,3 @@ });

rows.map(function (x) {
row[moment(x.ts).format('H')] = Math.min(Number((x.count / biggest).toFixed(2)), 0.75);
row[parseInt(x.ts)] = Math.min(Number((x.count / biggest).toFixed(2)), 0.75);
});

@@ -624,3 +691,3 @@

return knex('analytics_runs').orderBy('ts', 'desc').limit(1).then().get(0).then(function (entry) {
return entry && Number(entry.ts);
return entry && (0, _moment2.default)(entry.ts);
});

@@ -630,5 +697,3 @@ }

function setLastRun() {
return knex('analytics_runs').insert({ ts: moment(new Date()).format('x') }).then(function () {
return true;
});
return knex('analytics_runs').insert({ ts: (0, _botpress.DatabaseHelpers)(knex).date.now() }).then(true);
}

@@ -653,3 +718,3 @@

/***/ },
/* 9 */
/* 10 */
/***/ function(module, exports) {

@@ -660,3 +725,9 @@

/***/ },
/* 10 */
/* 11 */
/***/ function(module, exports) {
module.exports = require("botpress");
/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {

@@ -666,5 +737,14 @@

var Promise = __webpack_require__(9);
var moment = __webpack_require__(7);
var _bluebird = __webpack_require__(10);
var _bluebird2 = _interopRequireDefault(_bluebird);
var _moment = __webpack_require__(8);
var _moment2 = _interopRequireDefault(_moment);
var _botpress = __webpack_require__(11);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var knex = null;

@@ -678,3 +758,3 @@ var bp = null;

return knex.schema.createTableIfNotExists('analytics_interactions', function (table) {
return (0, _botpress.DatabaseHelpers)(knex).createTableIfNotExists('analytics_interactions', function (table) {
table.increments('id').primary();

@@ -687,3 +767,3 @@ table.timestamp('ts');

}).then(function () {
return knex.schema.createTableIfNotExists('analytics_runs', function (table) {
return (0, _botpress.DatabaseHelpers)(knex).createTableIfNotExists('analytics_runs', function (table) {
table.increments('id').primary();

@@ -700,3 +780,3 @@ table.timestamp('ts');

var interactionRow = {
ts: moment(new Date()).format('x'),
ts: (0, _botpress.DatabaseHelpers)(knex).date.now(),
type: event.type,

@@ -715,3 +795,3 @@ text: event.text,

var interactionRow = {
ts: moment(new Date()).format('x'),
ts: (0, _botpress.DatabaseHelpers)(knex).date.now(),
type: event.type,

@@ -718,0 +798,0 @@ text: event.text,

{
"name": "botpress-analytics",
"version": "2.0.1",
"version": "2.0.2",
"description": "Provides high level analytics about your bot usage.",

@@ -5,0 +5,0 @@ "main": "bin/node.bundle.js",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc