@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
81 lines (80 loc) • 3.89 kB
JavaScript
import { readConfObject } from "../configuration/index.js";
import { isElectron } from "../util/index.js";
export async function writeAWSAnalytics(rootModel, initialTimeStamp, sessionQuery) {
try {
const url = 'https://analytics.jbrowse.org/api/v1';
const multiAssemblyTracks = rootModel.jbrowse.tracks.filter((track) => (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?.length || 0,
'plugin-names': plugins?.map((p) => p.name).join(','),
'assemblies-count': assemblies.length,
'tracks-count': tracks.length,
'session-tracks-count': session?.sessionTracks.length || 0,
'open-views': session?.views.length || 0,
'synteny-tracks-count': multiAssemblyTracks,
'saved-sessions-count': savedSessionCount,
'existing-session-param-type': sessionQuery?.split('-')[0] || 'none',
'scn-h': window.screen.height,
'scn-w': window.screen.width,
'win-h': window.innerHeight,
'win-w': window.innerWidth,
electron: isElectron,
loadTime: (Date.now() - initialTimeStamp) / 1000,
jb2: true,
};
tracks.forEach((track) => {
const key = `track-types-${track.type}`;
stats[key] = stats[key] + 1 || 1;
});
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);
}
}
export async function writeGAAnalytics(rootModel, initialTimestamp) {
const jbrowseUser = 'UA-7115575-5';
const stats = {
'tracks-count': rootModel.jbrowse.tracks.length,
ver: rootModel.version,
electron: isElectron,
loadTime: Date.now() - initialTimestamp,
pluginNames: rootModel.jbrowse.plugins?.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);
}
export function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
if (rootModel &&
!readConfObject(rootModel.jbrowse.configuration, 'disableAnalytics')) {
writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
writeGAAnalytics(rootModel, initialTimestamp);
}
}