123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- import storage from './storage';
- import { platform, locale } from './utils';
- import { sendMetrics } from './api';
- let appState = null;
- let experiment = null;
- const HOUR = 1000 * 60 * 60;
- const events = [];
- let session_id = Date.now();
- const lang = locale();
- export default function initialize(state, emitter) {
- appState = state;
- emitter.on('DOMContentLoaded', () => {
- experiment = storage.enrolled;
- if (!appState.user.firstAction) {
- appState.user.firstAction =
- appState.route === '/' ? 'upload' : 'download';
- }
- const query = appState.query;
- addEvent('client_visit', {
- entrypoint: appState.route === '/' ? 'upload' : 'download',
- referrer: document.referrer,
- utm_campaign: query.utm_campaign,
- utm_content: query.utm_content,
- utm_medium: query.utm_medium,
- utm_source: query.utm_source,
- utm_term: query.utm_term
- });
- });
- emitter.on('experiment', experimentEvent);
- window.addEventListener('unload', submitEvents);
- }
- function sizeOrder(n) {
- return Math.floor(Math.log10(n));
- }
- function submitEvents() {
- if (navigator.doNotTrack === '1') {
- return;
- }
- sendMetrics(
- new Blob(
- [
- JSON.stringify({
- now: Date.now(),
- session_id,
- lang,
- platform: platform(),
- events
- })
- ],
- { type: 'text/plain' } // see http://crbug.com/490015
- )
- );
- events.splice(0);
- }
- async function addEvent(event_type, event_properties) {
- const user_id = await appState.user.metricId();
- const device_id = await appState.user.deviceId();
- const ab_id = Object.keys(experiment)[0];
- if (ab_id) {
- event_properties.experiment = ab_id;
- event_properties.variant = experiment[ab_id];
- }
- events.push({
- device_id,
- event_properties,
- event_type,
- time: Date.now(),
- user_id,
- user_properties: {
- anonymous: !appState.user.loggedIn,
- first_action: appState.user.firstAction,
- active_count: storage.files.length
- }
- });
- if (events.length === 25) {
- submitEvents();
- }
- }
- function cancelledUpload(archive, duration) {
- return addEvent('client_upload', {
- download_limit: archive.dlimit,
- duration: sizeOrder(duration),
- file_count: archive.numFiles,
- password_protected: !!archive.password,
- size: sizeOrder(archive.size),
- status: 'cancel',
- time_limit: archive.timeLimit
- });
- }
- function completedUpload(archive, duration) {
- return addEvent('client_upload', {
- download_limit: archive.dlimit,
- duration: sizeOrder(duration),
- file_count: archive.numFiles,
- password_protected: !!archive.password,
- size: sizeOrder(archive.size),
- status: 'ok',
- time_limit: archive.timeLimit
- });
- }
- function stoppedUpload(archive, duration = 0) {
- return addEvent('client_upload', {
- download_limit: archive.dlimit,
- duration: sizeOrder(duration),
- file_count: archive.numFiles,
- password_protected: !!archive.password,
- size: sizeOrder(archive.size),
- status: 'error',
- time_limit: archive.timeLimit
- });
- }
- function stoppedDownload(params) {
- return addEvent('client_download', {
- duration: sizeOrder(params.duration),
- password_protected: params.password_protected,
- size: sizeOrder(params.size),
- status: 'error'
- });
- }
- function completedDownload(params) {
- return addEvent('client_download', {
- duration: sizeOrder(params.duration),
- password_protected: params.password_protected,
- size: sizeOrder(params.size),
- status: 'ok'
- });
- }
- function deletedUpload(ownedFile) {
- return addEvent('client_delete', {
- age: Math.floor((Date.now() - ownedFile.createdAt) / HOUR),
- downloaded: ownedFile.dtotal > 0,
- status: 'ok'
- });
- }
- function experimentEvent(params) {
- return addEvent('client_experiment', params);
- }
- function submittedSignup(params) {
- return addEvent('client_login', {
- status: 'ok',
- trigger: params.trigger
- });
- }
- function canceledSignup(params) {
- return addEvent('client_login', {
- status: 'cancel',
- trigger: params.trigger
- });
- }
- function loggedOut(params) {
- addEvent('client_logout', {
- status: 'ok',
- trigger: params.trigger
- });
- // flush events and start new anon session
- submitEvents();
- session_id = Date.now();
- }
- export {
- cancelledUpload,
- stoppedUpload,
- completedUpload,
- deletedUpload,
- stoppedDownload,
- completedDownload,
- submittedSignup,
- canceledSignup,
- loggedOut
- };
|