@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
87 lines (86 loc) • 4.48 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.writeAWSAnalytics = writeAWSAnalytics;
exports.writeGAAnalytics = writeGAAnalytics;
exports.doAnalytics = doAnalytics;
const configuration_1 = require("../configuration");
const util_1 = require("../util");
async function writeAWSAnalytics(rootModel, initialTimeStamp, sessionQuery) {
try {
const url = 'https://analytics.jbrowse.org/api/v1';
const multiAssemblyTracks = rootModel.jbrowse.tracks.filter((track) => ((0, configuration_1.readConfObject)(track, 'assemblyNames') || []).length > 1).length;
const savedSessionCount = Object.keys(localStorage).filter(name => name.includes('localSaved-')).length;
const { jbrowse: config, session, version: ver } = rootModel;
const { tracks, assemblies, plugins } = config;
const stats = {
ver,
'plugins-count': (plugins === null || plugins === void 0 ? void 0 : plugins.length) || 0,
'plugin-names': plugins === null || plugins === void 0 ? void 0 : plugins.map((p) => p.name).join(','),
'assemblies-count': assemblies.length,
'tracks-count': tracks.length,
'session-tracks-count': (session === null || session === void 0 ? void 0 : session.sessionTracks.length) || 0,
'open-views': (session === null || session === void 0 ? void 0 : session.views.length) || 0,
'synteny-tracks-count': multiAssemblyTracks,
'saved-sessions-count': savedSessionCount,
'existing-session-param-type': (sessionQuery === null || sessionQuery === void 0 ? void 0 : sessionQuery.split('-')[0]) || 'none',
'scn-h': window.screen.height,
'scn-w': window.screen.width,
'win-h': window.innerHeight,
'win-w': window.innerWidth,
electron: util_1.isElectron,
loadTime: (Date.now() - initialTimeStamp) / 1000,
jb2: true,
};
tracks.forEach((track) => {
const key = `track-types-${track.type}`;
stats[key] = stats[key] + 1 || 1;
});
session === null || session === void 0 ? void 0 : session.sessionTracks.forEach((track) => {
const key = `sessionTrack-types-${track.type}`;
stats[key] = stats[key] + 1 || 1;
});
const qs = Object.keys(stats)
.map(key => `${key}=${stats[key]}`)
.join('&');
await fetch(`${url}?${qs}`);
}
catch (e) {
console.error('Failed to write analytics to AWS.', e);
}
}
async function writeGAAnalytics(rootModel, initialTimestamp) {
var _a;
const jbrowseUser = 'UA-7115575-5';
const stats = {
'tracks-count': rootModel.jbrowse.tracks.length,
ver: rootModel.version,
electron: util_1.isElectron,
loadTime: Date.now() - initialTimestamp,
pluginNames: ((_a = rootModel.jbrowse.plugins) === null || _a === void 0 ? void 0 : _a.map((plugin) => plugin.name)) || '',
};
let analyticsScript = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){";
analyticsScript +=
'(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),';
analyticsScript +=
'm=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)';
analyticsScript +=
"})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');";
analyticsScript += `ga('create', '${jbrowseUser}', 'auto', 'jbrowseTracker');`;
const gaData = {};
const googleDimensions = 'tracks-count ver electron loadTime pluginNames';
for (const [index, key] of googleDimensions.split(/\s+/).entries()) {
gaData[`dimension${index + 1}`] = stats[key];
}
gaData.metric1 = Math.round(stats.loadTime);
analyticsScript += `ga('jbrowseTracker.send', 'pageview',${JSON.stringify(gaData)});`;
const analyticsScriptNode = document.createElement('script');
analyticsScriptNode.innerHTML = analyticsScript;
document.getElementsByTagName('head')[0].append(analyticsScriptNode);
}
function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
if (rootModel &&
!(0, configuration_1.readConfObject)(rootModel.jbrowse.configuration, 'disableAnalytics')) {
writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
writeGAAnalytics(rootModel, initialTimestamp);
}
}
;