1
>
/*---------------------------------------------------------------------------------------------
libc.ts
2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { familySync, MUSL } from 'detect-libc';
7
>
import * as Platform from '../common/platform.js';
8
>
9
>
/** The libc family the current process is linked against. */
10
>
export type LibcFamily = 'glibc' | 'musl';
11
>
12
>
let _cached: LibcFamily | undefined;
13
>
let _cacheValid = false;
14
>
15
>
/**
16
>
* Returns the libc family of the running Node process on Linux, or `undefined`
17
>
* on non-Linux platforms (where the question is meaningless).
18
>
*
19
>
* Delegates to the `detect-libc` package, which probes cheap signals first (the
20
>
* ELF interpreter of `/proc/self/exe`, then `/usr/bin/ldd`) and only falls back
21
>
* to Node's process report — with the libuv/socket section excluded so it does
22
>
* not peg the CPU on busy hosts. When detection is inconclusive we assume
23
>
* `glibc`, the dominant Linux libc.
24
>
*
25
>
* Cached after first call; libc never changes mid-process. This is the
26
>
* synchronous variant; add a promise-based `detectLibc` wrapping
27
>
* `detect-libc`'s async `family()` if a non-blocking caller ever needs one.
28
>
*/
29
>
export function detectLibcSync(): LibcFamily | undefined {
30
if (_cacheValid) {
31
return _cached;