mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-25 12:16:37 +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')
|
const settings = require('./models/settings')
|
||||||
// eslint-disable-next-line node/no-missing-require
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const windowProgress = require('./os/window-progress')
|
const windowProgress = require('./os/window-progress')
|
||||||
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const analytics = require('./modules/analytics')
|
const analytics = require('./modules/analytics')
|
||||||
const availableDrives = require('./models/available-drives')
|
const availableDrives = require('./models/available-drives')
|
||||||
const driveScanner = require('./modules/drive-scanner')
|
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')
|
const permissions = require('../../../shared/permissions')
|
||||||
// eslint-disable-next-line node/no-missing-require
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const windowProgress = require('../os/window-progress')
|
const windowProgress = require('../os/window-progress')
|
||||||
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const analytics = require('../modules/analytics')
|
const analytics = require('../modules/analytics')
|
||||||
// eslint-disable-next-line node/no-missing-require
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const { updateLock } = require('./update-lock')
|
const { updateLock } = require('./update-lock')
|
||||||
|
@ -26,6 +26,7 @@ const EXIT_CODES = require('../shared/exit-codes')
|
|||||||
// eslint-disable-next-line node/no-missing-require
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const { buildWindowMenu } = require('./menu')
|
const { buildWindowMenu } = require('./menu')
|
||||||
const settings = require('./app/models/settings')
|
const settings = require('./app/models/settings')
|
||||||
|
// eslint-disable-next-line node/no-missing-require
|
||||||
const analytics = require('./app/modules/analytics')
|
const analytics = require('./app/modules/analytics')
|
||||||
const { getConfig } = require('../shared/utils')
|
const { getConfig } = require('../shared/utils')
|
||||||
const { version, packageType } = require('../../package.json')
|
const { version, packageType } = require('../../package.json')
|
||||||
|
@ -10,11 +10,11 @@
|
|||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"target": "es2017",
|
"target": "es2017",
|
||||||
"jsx": "react",
|
"jsx": "react",
|
||||||
|
"typeRoots": ["./node_modules/@types", "./typings"],
|
||||||
"allowSyntheticDefaultImports": true
|
"allowSyntheticDefaultImports": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"lib/**/*.ts",
|
"lib/**/*.ts",
|
||||||
"node_modules/electron/**/*.d.ts",
|
"node_modules/electron/**/*.d.ts"
|
||||||
"typings/**/*.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