@r1tsu/payload
Version:
107 lines (106 loc) • 3.59 kB
JavaScript
import { execSync } from 'child_process';
import ciInfo from 'ci-info';
import ConfImport from 'conf';
import { randomBytes } from 'crypto';
import findUp from 'find-up';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { oneWayHash } from './oneWayHash.js';
const Conf = ConfImport.default || ConfImport;
let baseEvent = null;
export const sendEvent = async ({ event, payload })=>{
try {
const packageJSON = await getPackageJSON();
// Only generate the base event once
if (!baseEvent) {
baseEvent = {
ciName: ciInfo.isCI ? ciInfo.name : null,
envID: getEnvID(),
isCI: ciInfo.isCI,
nodeEnv: process.env.NODE_ENV || 'development',
nodeVersion: process.version,
payloadPackages: getPayloadPackages(packageJSON),
payloadVersion: getPayloadVersion(packageJSON),
projectID: getProjectID(payload, packageJSON)
};
}
if (process.env.PAYLOAD_TELEMETRY_DEBUG) {
payload.logger.info({
event: {
...baseEvent,
...event
},
msg: 'Telemetry Event'
});
return;
}
if (payload.config.telemetry !== false) {
await fetch('https://telemetry.payloadcms.com/events', {
body: JSON.stringify({
...baseEvent,
...event
}),
headers: {
'Content-Type': 'application/json'
},
method: 'post'
});
}
} catch (_) {
// Eat any errors in sending telemetry event
}
};
/**
* This is a quasi-persistent identifier used to dedupe recurring events. It's
* generated from random data and completely anonymous.
*/ const getEnvID = ()=>{
const conf = new Conf();
const ENV_ID = 'envID';
const val = conf.get(ENV_ID);
if (val) {
return val;
}
const generated = randomBytes(32).toString('hex');
conf.set(ENV_ID, generated);
return generated;
};
const getProjectID = (payload, packageJSON)=>{
const projectID = getGitID(payload) || getPackageJSONID(payload, packageJSON) || payload.config.serverURL || process.cwd();
return oneWayHash(projectID, payload.secret);
};
const getGitID = (payload)=>{
try {
const originBuffer = execSync('git config --local --get remote.origin.url', {
stdio: 'pipe',
timeout: 1000
});
return oneWayHash(String(originBuffer).trim(), payload.secret);
} catch (_) {
return null;
}
};
const getPayloadPackages = (packageJSON)=>{
return Object.keys(packageJSON.dependencies || {}).reduce((acc, key)=>{
return key.startsWith('@payloadcms/') ? {
...acc,
[key]: packageJSON.dependencies[key]
} : acc;
}, {});
};
const getPackageJSON = async ()=>{
const filename = fileURLToPath(import.meta.url);
const dirname = path.dirname(filename);
const packageJsonPath = await findUp('package.json', {
cwd: dirname
});
const jsonContent = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
return jsonContent;
};
const getPackageJSONID = (payload, packageJSON)=>{
return oneWayHash(packageJSON.name, payload.secret);
};
export const getPayloadVersion = (packageJSON)=>{
return packageJSON?.dependencies?.payload ?? '';
};
//# sourceMappingURL=index.js.map