diff options
Diffstat (limited to 'src/js/node/os.ts')
-rw-r--r-- | src/js/node/os.ts | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/js/node/os.ts b/src/js/node/os.ts new file mode 100644 index 000000000..c5b202444 --- /dev/null +++ b/src/js/node/os.ts @@ -0,0 +1,107 @@ +// Hardcoded module "node:os" + +var tmpdir = function () { + var env = Bun.env; + + tmpdir = function () { + var path = env["TMPDIR"] || env["TMP"] || env["TEMP"] || "/tmp"; + const length = path.length; + if (length > 1 && path[length - 1] === "/") path = path.slice(0, -1); + return path; + }; + + return tmpdir(); +}; + +// os.cpus() is super expensive +// Specifically: getting the CPU speed on Linux is very expensive +// Some packages like FastGlob only bother to read the length of the array +// so instead of actually populating the entire object +// we turn them into getters +function lazyCpus({ cpus }) { + return () => { + const array = new Array(navigator.hardwareConcurrency); + function populate() { + const results = cpus(); + const length = results.length; + array.length = length; + for (let i = 0; i < length; i++) { + array[i] = results[i]; + } + } + + for (let i = 0; i < array.length; i++) { + // This is technically still observable via + // Object.getOwnPropertyDescriptors(), but it should be okay. + const instance = { + get model() { + if (array[i] === instance) populate(); + return array[i].model; + }, + set model(value) { + if (array[i] === instance) populate(); + array[i].model = value; + }, + + get speed() { + if (array[i] === instance) populate(); + return array[i].speed; + }, + + set speed(value) { + if (array[i] === instance) populate(); + array[i].speed = value; + }, + + get times() { + if (array[i] === instance) populate(); + return array[i].times; + }, + set times(value) { + if (array[i] === instance) populate(); + array[i].times = value; + }, + + toJSON() { + if (array[i] === instance) populate(); + return array[i]; + }, + }; + + array[i] = instance; + } + + return array; + }; +} + +function bound(obj) { + return { + arch: obj.arch.bind(obj), + cpus: lazyCpus(obj), + endianness: obj.endianness.bind(obj), + freemem: obj.freemem.bind(obj), + getPriority: obj.getPriority.bind(obj), + homedir: obj.homedir.bind(obj), + hostname: obj.hostname.bind(obj), + loadavg: obj.loadavg.bind(obj), + networkInterfaces: obj.networkInterfaces.bind(obj), + platform: obj.platform.bind(obj), + release: obj.release.bind(obj), + setPriority: obj.setPriority.bind(obj), + get tmpdir() { + return tmpdir; + }, + totalmem: obj.totalmem.bind(obj), + type: obj.type.bind(obj), + uptime: obj.uptime.bind(obj), + userInfo: obj.userInfo.bind(obj), + version: obj.version.bind(obj), + machine: obj.machine.bind(obj), + devNull: obj.devNull, + EOL: obj.EOL, + constants: $processBindingConstants.os, + }; +} + +export default bound(Bun._Os()); |