77 lines
1.9 KiB
JavaScript
Raw Normal View History

'use strict';
/**
* Strapi telemetry package.
* You can learn more at https://strapi.io/documentation/3.0.0-beta.x/global-strapi/usage-information.html#commitment-to-our-users-data-collection
*/
const os = require('os');
const isDocker = require('is-docker');
const { machineIdSync } = require('node-machine-id');
const fetch = require('node-fetch');
const ciEnv = require('ci-info');
const { scheduleJob } = require('node-schedule');
const createMiddleware = require('./middleware');
const isTruthyEnvVar = require('./truthy-var');
const createTelemetryInstance = strapi => {
const uuid = strapi.config.uuid;
const deviceId = machineIdSync();
const isDisabled = !uuid || isTruthyEnvVar(process.env.STRAPI_TELEMETRY_DISABLED);
const anonymous_metadata = {
environment: strapi.config.environment,
os: os.type(),
osPlatform: os.platform(),
osRelease: os.release(),
nodeVersion: process.version,
docker: process.env.DOCKER || isDocker(),
isCI: ciEnv.isCI,
version: strapi.config.info.strapi,
strapiVersion: strapi.config.info.strapi,
};
const sendEvent = async (event, payload) => {
// do not send anything when user has disabled analytics
if (isDisabled) return true;
try {
const res = await fetch('https://analytics.strapi.io/track', {
method: 'POST',
body: JSON.stringify({
event,
uuid,
deviceId,
properties: {
...payload,
...anonymous_metadata,
},
}),
timeout: 1000,
headers: { 'Content-Type': 'application/json' },
});
return res.ok;
} catch (err) {
return false;
}
};
const initPing = () => {
if (isDisabled) {
return;
}
scheduleJob('0 0 12 * * *', () => sendEvent('ping'));
};
return {
initPing,
send: sendEvent,
middleware: createMiddleware({ sendEvent, isDisabled }),
};
};
module.exports = createTelemetryInstance;