mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-24 03:36:36 +00:00
Convert analytics.js to typescript
Change-type: patch
This commit is contained in:
parent
fadfadd9e9
commit
a5825373e1
@ -33,6 +33,7 @@ const flashState = require('./models/flash-state')
|
||||
const settings = require('./models/settings')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const windowProgress = require('./os/window-progress')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const analytics = require('./modules/analytics')
|
||||
const availableDrives = require('./models/available-drives')
|
||||
const driveScanner = require('./modules/drive-scanner')
|
||||
|
@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 balena.io
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
'use strict'
|
||||
|
||||
const _ = require('lodash')
|
||||
const resinCorvus = require('resin-corvus/browser')
|
||||
const packageJSON = require('../../../../package.json')
|
||||
const settings = require('../models/settings')
|
||||
const { getConfig, hasProps } = require('../../../shared/utils')
|
||||
|
||||
const sentryToken = settings.get('analyticsSentryToken') ||
|
||||
_.get(packageJSON, [ 'analytics', 'sentry', 'token' ])
|
||||
const mixpanelToken = settings.get('analyticsMixpanelToken') ||
|
||||
_.get(packageJSON, [ 'analytics', 'mixpanel', 'token' ])
|
||||
|
||||
const configUrl = settings.get('configUrl') || 'https://balena.io/etcher/static/config.json'
|
||||
|
||||
const DEFAULT_PROBABILITY = 0.1
|
||||
|
||||
const services = {
|
||||
sentry: sentryToken,
|
||||
mixpanel: mixpanelToken
|
||||
}
|
||||
resinCorvus.install({
|
||||
services,
|
||||
options: {
|
||||
release: packageJSON.version,
|
||||
shouldReport: () => {
|
||||
return settings.get('errorReporting')
|
||||
},
|
||||
mixpanelDeferred: true
|
||||
}
|
||||
})
|
||||
|
||||
let mixpanelSample = DEFAULT_PROBABILITY
|
||||
|
||||
/**
|
||||
* @summary Init analytics configurations
|
||||
* @example initConfig()
|
||||
*/
|
||||
const initConfig = async () => {
|
||||
let validatedConfig = null
|
||||
try {
|
||||
const config = await getConfig(configUrl)
|
||||
const mixpanel = _.get(config, [ 'analytics', 'mixpanel' ], {})
|
||||
mixpanelSample = mixpanel.probability || DEFAULT_PROBABILITY
|
||||
if (isClientEligible(mixpanelSample)) {
|
||||
validatedConfig = validateMixpanelConfig(mixpanel)
|
||||
}
|
||||
} catch (err) {
|
||||
resinCorvus.logException(err)
|
||||
}
|
||||
resinCorvus.setConfigs({
|
||||
mixpanel: validatedConfig
|
||||
})
|
||||
}
|
||||
|
||||
initConfig()
|
||||
|
||||
/**
|
||||
* @summary Check that the client is eligible for analytics
|
||||
* @param {Object} - config
|
||||
*/
|
||||
// eslint-disable-next-line
|
||||
function isClientEligible(probability) {
|
||||
return Math.random() < probability
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Check that config has at least HTTP_PROTOCOL and api_host
|
||||
* @param {Object} - config
|
||||
*/
|
||||
// eslint-disable-next-line
|
||||
function validateMixpanelConfig (config) {
|
||||
/* eslint-disable camelcase */
|
||||
const mixpanelConfig = {
|
||||
api_host: 'https://api.mixpanel.com'
|
||||
}
|
||||
if (hasProps(config, [ 'HTTP_PROTOCOL', 'api_host' ])) {
|
||||
mixpanelConfig.api_host = `${config.HTTP_PROTOCOL}://${config.api_host}`
|
||||
}
|
||||
return mixpanelConfig
|
||||
/* eslint-enable camelcase */
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Log a debug message
|
||||
* @function
|
||||
* @public
|
||||
*
|
||||
* @description
|
||||
* This function sends the debug message to error reporting services.
|
||||
*
|
||||
* @param {String} message - message
|
||||
*
|
||||
* @example
|
||||
* analytics.log('Hello World');
|
||||
*/
|
||||
exports.logDebug = resinCorvus.logDebug
|
||||
|
||||
/**
|
||||
* @summary Log an event
|
||||
* @function
|
||||
* @public
|
||||
*
|
||||
* @description
|
||||
* This function sends the debug message to product analytics services.
|
||||
*
|
||||
* @param {String} message - message
|
||||
* @param {Object} [data] - event data
|
||||
*
|
||||
* @example
|
||||
* analytics.logEvent('Select image', {
|
||||
* image: '/dev/disk2'
|
||||
* });
|
||||
*/
|
||||
exports.logEvent = (message, data) => {
|
||||
resinCorvus.logEvent(message, { ...data, sample: mixpanelSample })
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Log an exception
|
||||
* @function
|
||||
* @public
|
||||
*
|
||||
* @description
|
||||
* This function logs an exception to error reporting services.
|
||||
*
|
||||
* @param {Error} exception - exception
|
||||
*
|
||||
* @example
|
||||
* analytics.logException(new Error('Something happened'));
|
||||
*/
|
||||
exports.logException = resinCorvus.logException
|
123
lib/gui/app/modules/analytics.ts
Normal file
123
lib/gui/app/modules/analytics.ts
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright 2016 balena.io
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import * as _ from 'lodash';
|
||||
import * as resinCorvus from 'resin-corvus/browser';
|
||||
|
||||
import * as packageJSON from '../../../../package.json';
|
||||
import { getConfig, hasProps } from '../../../shared/utils';
|
||||
import * as settings from '../models/settings';
|
||||
|
||||
const sentryToken =
|
||||
settings.get('analyticsSentryToken') ||
|
||||
_.get(packageJSON, ['analytics', 'sentry', 'token']);
|
||||
const mixpanelToken =
|
||||
settings.get('analyticsMixpanelToken') ||
|
||||
_.get(packageJSON, ['analytics', 'mixpanel', 'token']);
|
||||
|
||||
const configUrl =
|
||||
settings.get('configUrl') || 'https://balena.io/etcher/static/config.json';
|
||||
|
||||
const DEFAULT_PROBABILITY = 0.1;
|
||||
|
||||
const services = {
|
||||
sentry: sentryToken,
|
||||
mixpanel: mixpanelToken,
|
||||
};
|
||||
|
||||
resinCorvus.install({
|
||||
services,
|
||||
options: {
|
||||
release: packageJSON.version,
|
||||
shouldReport: () => {
|
||||
return settings.get('errorReporting');
|
||||
},
|
||||
mixpanelDeferred: true,
|
||||
},
|
||||
});
|
||||
|
||||
let mixpanelSample = DEFAULT_PROBABILITY;
|
||||
|
||||
/**
|
||||
* @summary Init analytics configurations
|
||||
*/
|
||||
async function initConfig() {
|
||||
let validatedConfig = null;
|
||||
try {
|
||||
const config = await getConfig(configUrl);
|
||||
const mixpanel = _.get(config, ['analytics', 'mixpanel'], {});
|
||||
mixpanelSample = mixpanel.probability || DEFAULT_PROBABILITY;
|
||||
if (isClientEligible(mixpanelSample)) {
|
||||
validatedConfig = validateMixpanelConfig(mixpanel);
|
||||
}
|
||||
} catch (err) {
|
||||
resinCorvus.logException(err);
|
||||
}
|
||||
resinCorvus.setConfigs({
|
||||
mixpanel: validatedConfig,
|
||||
});
|
||||
}
|
||||
|
||||
initConfig();
|
||||
|
||||
/**
|
||||
* @summary Check that the client is eligible for analytics
|
||||
*/
|
||||
function isClientEligible(probability: number) {
|
||||
return Math.random() < probability;
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Check that config has at least HTTP_PROTOCOL and api_host
|
||||
*/
|
||||
function validateMixpanelConfig(config: {
|
||||
api_host?: string;
|
||||
HTTP_PROTOCOL?: string;
|
||||
}) {
|
||||
const mixpanelConfig = {
|
||||
api_host: 'https://api.mixpanel.com',
|
||||
};
|
||||
if (hasProps(config, ['HTTP_PROTOCOL', 'api_host'])) {
|
||||
mixpanelConfig.api_host = `${config.HTTP_PROTOCOL}://${config.api_host}`;
|
||||
}
|
||||
return mixpanelConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Log a debug message
|
||||
*
|
||||
* @description
|
||||
* This function sends the debug message to error reporting services.
|
||||
*/
|
||||
export const logDebug = resinCorvus.logDebug;
|
||||
|
||||
/**
|
||||
* @summary Log an event
|
||||
*
|
||||
* @description
|
||||
* This function sends the debug message to product analytics services.
|
||||
*/
|
||||
export function logEvent(message: string, data: any) {
|
||||
resinCorvus.logEvent(message, { ...data, sample: mixpanelSample });
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Log an exception
|
||||
*
|
||||
* @description
|
||||
* This function logs an exception to error reporting services.
|
||||
*/
|
||||
export const logException = resinCorvus.logException;
|
@ -29,6 +29,7 @@ const errors = require('../../../shared/errors')
|
||||
const permissions = require('../../../shared/permissions')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const windowProgress = require('../os/window-progress')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const analytics = require('../modules/analytics')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const { updateLock } = require('./update-lock')
|
||||
|
@ -26,6 +26,7 @@ const EXIT_CODES = require('../shared/exit-codes')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const { buildWindowMenu } = require('./menu')
|
||||
const settings = require('./app/models/settings')
|
||||
// eslint-disable-next-line node/no-missing-require
|
||||
const analytics = require('./app/modules/analytics')
|
||||
const { getConfig } = require('../shared/utils')
|
||||
const { version, packageType } = require('../../package.json')
|
||||
|
@ -10,11 +10,11 @@
|
||||
"module": "commonjs",
|
||||
"target": "es2017",
|
||||
"jsx": "react",
|
||||
"typeRoots": ["./node_modules/@types", "./typings"],
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"include": [
|
||||
"lib/**/*.ts",
|
||||
"node_modules/electron/**/*.d.ts",
|
||||
"typings/**/*.d.ts"
|
||||
"node_modules/electron/**/*.d.ts"
|
||||
]
|
||||
}
|
||||
|
1
typings/resin-corvus/index.d.ts
vendored
Normal file
1
typings/resin-corvus/index.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
||||
declare module 'resin-corvus/browser';
|
Loading…
x
Reference in New Issue
Block a user