UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

81 lines (80 loc) 3.89 kB
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); } }