51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { randomUUID } from "node:crypto";
|
|
|
|
export type TelemetryBootstrap = {
|
|
distinctId: string;
|
|
appVersion: string;
|
|
platform: NodeJS.Platform;
|
|
};
|
|
|
|
export function defaultDataDir(
|
|
platform: NodeJS.Platform,
|
|
env: Record<string, string | undefined>,
|
|
homeDir: string,
|
|
): string | null {
|
|
void platform;
|
|
if (env.AO_DATA_DIR) return env.AO_DATA_DIR;
|
|
if (!homeDir) return null;
|
|
return path.join(homeDir, ".ao", "data");
|
|
}
|
|
|
|
export async function loadOrCreateTelemetryInstallId(dataDir: string): Promise<string> {
|
|
const file = path.join(dataDir, "telemetry_install_id");
|
|
try {
|
|
const existing = (await readFile(file, "utf8")).trim();
|
|
if (existing) return existing;
|
|
} catch {
|
|
// Create the id on first use.
|
|
}
|
|
await mkdir(dataDir, { recursive: true });
|
|
const distinctId = `ins_${randomUUID()}`;
|
|
await writeFile(file, `${distinctId}\n`, { mode: 0o600 });
|
|
return distinctId;
|
|
}
|
|
|
|
export async function buildTelemetryBootstrap(
|
|
env: Record<string, string | undefined>,
|
|
appVersion: string,
|
|
platform: NodeJS.Platform,
|
|
homeDir = os.homedir(),
|
|
): Promise<TelemetryBootstrap | null> {
|
|
const dataDir = defaultDataDir(platform, env, homeDir);
|
|
if (!dataDir) return null;
|
|
return {
|
|
distinctId: await loadOrCreateTelemetryInstallId(dataDir),
|
|
appVersion,
|
|
platform,
|
|
};
|
|
}
|