Files
Trilium/apps/server/src/routes/api/system_info.ts
2025-06-12 22:53:15 +03:00

46 lines
1.5 KiB
TypeScript

import { execSync } from "child_process";
import { isMac, isWindows } from "../../services/utils";
import { arch, cpus } from "os";
function systemChecks() {
return {
isCpuArchMismatch: isCpuArchMismatch()
}
}
/**
* Detects if the application is running under emulation on Apple Silicon or Windows on ARM.
* This happens when an x64 version of the app is run on an M1/M2/M3 Mac or on a Windows Snapdragon chip.
* @returns true if running on x86 emulation on ARM, false otherwise.
*/
export const isCpuArchMismatch = () => {
if (isMac) {
try {
// Use child_process to check sysctl.proc_translated
// This is the proper way to detect Rosetta 2 translation
const result = execSync("sysctl -n sysctl.proc_translated 2>/dev/null", {
encoding: "utf8",
timeout: 1000
}).trim();
// 1 means the process is being translated by Rosetta 2
// 0 means native execution
// If the sysctl doesn't exist (on Intel Macs), this will return empty/error
return result === "1";
} catch (error) {
// If sysctl fails or doesn't exist (Intel Macs), not running under Rosetta 2
return false;
}
} else if (isWindows && arch() === "x64") {
return cpus().some(cpu =>
cpu.model.includes('Microsoft SQ') ||
cpu.model.includes('Snapdragon'));
} else {
return false;
}
};
export default {
systemChecks
};