Instantly share code, notes, and snippets.
Last activeAugust 25, 2025 13:20
Save RareScrap/0ba9e5aba0f996a31538f2b7869d57ac to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| importosfrom'node:os'; | |
| exportfunctiongetOsPlatformUsingPlatform():NodeJS.Platform|undefined{ | |
| constsanitizedOsType=os.type().toLowerCase() | |
| switch(sanitizedOsType){ | |
| // Значения, представленные в документации os.type(): | |
| case"windows_nt":return"win32" | |
| case"darwin":return"darwin" | |
| case"linux":return"linux" | |
| } | |
| returnundefined | |
| } | |
| exportfunctiongetOsArchitectureUsingPlatform(osPlatform:NodeJS.Platform|undefined):NodeJS.Architecture|undefined{ | |
| constsanitizedOsMachine=os.machine().toLowerCase() | |
| switch(sanitizedOsMachine){ | |
| // Значения, представленные в документации os.machine(): | |
| case"arm":return"arm" | |
| case"arm64":return"arm64" | |
| case"aarch64":return"arm64" | |
| case"mips":return"mips" | |
| case"mips64":return"mips" | |
| case"ppc64":return"ppc64" | |
| case"ppc64le":return"ppc" | |
| case"s390":return"s390" | |
| case"s390x":return"s390x" | |
| case"i386":return"ia32" | |
| // Значение "i686" используется для обозначения x86 приложений, запущенных на x86_64 операционной системе: | |
| // https://github.com/nodejs/node/issues/56975#issuecomment-2650606500 | |
| // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1685 | |
| case"i686":{ | |
| // NodeJS имеет баг, не позволяющий в сборке под x86 точно определить разрядность операционной системы средствами его API | |
| // https://github.com/nodejs/node/issues/58493 | |
| constisWindows=osPlatform==="win32" | |
| if(isWindows){ | |
| constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform() | |
| returnwindowsOsArchitecture | |
| } | |
| return"x64" | |
| } | |
| case"x86_64":{ | |
| // Экспериментально подтверждено, что os.machine() на Windows для arm64 для сборок под x86_64 | |
| // Возвращает значение x86_64, не соответствующее фактической архитектуре операционной системы | |
| constisWindows=osPlatform==="win32" | |
| if(isWindows){ | |
| constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform() | |
| returnwindowsOsArchitecture | |
| } | |
| return"x64" | |
| } | |
| // Остальные значения, возвращаемые реализацией NodeJS: | |
| // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1667 | |
| // Неподдерживаемые значения: | |
| // 1) DEC Aplha: "alpha" | |
| // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1692 | |
| // 2) SuperH: "shx" | |
| // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1698 | |
| case"ia64":return"x64" | |
| case"powerpc":return"ppc" | |
| // Значения, оставшиеся в NodeJS.Architecture (включено на всякий случай): | |
| case"loong64":return"loong64" | |
| case"mipsel":return"mipsel" | |
| case"ppc":return"ppc" | |
| case"riscv64":return"riscv64" | |
| // Значения, выявленные экспериментально: | |
| // Значение "unknown" может использоваться виртуализированными системами (пр. на Windows 11 под arm64 в Parallels Desktop на MacOS под arm64) | |
| case"unknown":{ | |
| constisWindows=osPlatform==="win32" | |
| if(isWindows){ | |
| constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform() | |
| returnwindowsOsArchitecture | |
| } | |
| returnundefined | |
| } | |
| } | |
| returnundefined | |
| } | |
| exportfunctiongetOsArchitectureEnvVar(osPlatform:NodeJS.Platform|undefined):string|undefined{ | |
| // Для лучшей точности в случае неопределенной платформы следует сначала обрабатывать переменные | |
| // среды, специфичные для каждой операционной системы, и только после переходить к общим навроде HOSTTYPE | |
| constisWindows=osPlatform==="win32" | |
| if(isWindows||!osPlatform){ | |
| constrawOsArchitecture=getWindowsOsArchitectureEnvVar() | |
| if(isWindows)returnrawOsArchitecture | |
| constisMostLikelyWindows=!osPlatform&&rawOsArchitecture | |
| if(isMostLikelyWindows)returnrawOsArchitecture | |
| } | |
| constosTypeEnvVar=process.env["OSTYPE"] | |
| constisMacOs=osPlatform==="darwin"||(osTypeEnvVar?.startsWith("darwin")??false) | |
| if(isMacOs||!osPlatform){ | |
| // Экспериментально подтверждено, что MACHTYPE на MacOS для arm64 без использования Rosetta | |
| // возвращает значение x86_64, не соответствующее фактической архитектуре операционной системы | |
| constmachTypeEnvVar=process.env["MACHTYPE"] | |
| constcpuTypeEnvVar=process.env["CPUTYPE"] | |
| constisValuesExpected=machTypeEnvVar&&cpuTypeEnvVar&&machTypeEnvVar.toLocaleLowerCase()===cpuTypeEnvVar.toLocaleLowerCase() | |
| constrawOsArchitecture=isValuesExpected ?machTypeEnvVar :cpuTypeEnvVar | |
| if(isMacOs)returnrawOsArchitecture | |
| constisMostLikelyMacOs=!osPlatform&&rawOsArchitecture | |
| if(isMostLikelyMacOs)returnrawOsArchitecture | |
| } | |
| constisLinux=osPlatform==="linux" | |
| if(isLinux||!osPlatform){ | |
| constrawOsArchitecture=process.env["HOSTTYPE"]??process.env["MACHTYPE"] | |
| if(isLinux)returnrawOsArchitecture | |
| constisMostLikelyLinux=!osPlatform&&rawOsArchitecture | |
| if(isMostLikelyLinux)returnrawOsArchitecture | |
| } | |
| returnundefined | |
| } | |
| functiongetWindowsOsArchitectureUsingPlatform():NodeJS.Architecture|undefined{ | |
| constwindowsOsArchitectureEnvVar=getWindowsOsArchitectureEnvVar() | |
| if(windowsOsArchitectureEnvVar===undefined)returnundefined | |
| constsanitizedOsArchitectureEnvVar=windowsOsArchitectureEnvVar.toLowerCase() | |
| switch(sanitizedOsArchitectureEnvVar){ | |
| // Значения, представленные в документации win32: | |
| // https://learn.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables | |
| case"amd64":{ | |
| // Экспериментально подтверждено, что переменная PROCESSOR_ARCHITECTURE на Windows для arm64 для сборок под x86_64 | |
| // имеет значение AMD64, не соответствующее фактической архитектуре операционной системы | |
| constprogramFilesArmEnvVar=process.env["ProgramFiles(Arm)"] | |
| constisArm64=programFilesArmEnvVar!==undefined | |
| if(isArm64)return"arm64" | |
| return"x64" | |
| } | |
| case"ia64":return"x64" | |
| case"arm64":return"arm64" | |
| case"x86":return"ia32" | |
| } | |
| returnundefined | |
| } | |
| functiongetWindowsOsArchitectureEnvVar():string|undefined{ | |
| // Несмотря на название, переменная среды PROCESSOR_ARCHITECTURE хранит архитектуру операционной системы, а не | |
| // самого процессора (пр. на Windows на x86 на процессоре x86_64 переменная имеет значение `x86`) | |
| constosArchitectureEnvVar=process.env["PROCESSOR_ARCHITECTURE"] | |
| if(osArchitectureEnvVar===undefined)returnundefined | |
| constsanitizedOsArchitectureEnvVar=osArchitectureEnvVar.toLowerCase() | |
| // При запуске 32-битного процесса (x86) на 64-битной операционной системе (x86_64, arm64) | |
| // реальное содержимое PROCESSOR_ARCHITECTURE содержится в PROCESSOR_ARCHITEW6432 | |
| // https://learn.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables | |
| constis32BitProcess=sanitizedOsArchitectureEnvVar==="x86" | |
| if(is32BitProcess){ | |
| constwowCpuArchitectureEnvVar=process.env["PROCESSOR_ARCHITEW6432"] | |
| if(wowCpuArchitectureEnvVar)returnwowCpuArchitectureEnvVar | |
| } | |
| returnosArchitectureEnvVar | |
| } |
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment