@gjsify/os 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/esm/darwin.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import"./_virtual/_rolldown/runtime.js";import{createSubnet as e}from"./createSubnet.js";import{cli as t}from"@gjsify/utils";const n=e(128,16,16,`:`),parseInterfaces=function(e){if(e=e.trim(),e.length<1||!/\binet6?\b/.test(e))return;let t=e.split(`
2
- `),r=[],i=t.length,a=`00:00:00:00:00:00`,o=/<[^>]*\bLOOPBACK\b[^>]*>/.test(t[0]??``);for(let e,s=0;s<i;s++)switch(e=t[s],!0){case/ether\s+((?:\S{2}:)+\S{2})/.test(e):a=RegExp.$1;break;case/inet\s+(\d+\.\d+\.\d+\.\d+)\s+netmask\s+0x(.{2})(.{2})(.{2})(.{2})/.test(e):r.push({address:RegExp.$1,netmask:[parseInt(RegExp.$2,16),parseInt(RegExp.$3,16),parseInt(RegExp.$4,16),parseInt(RegExp.$5,16)].join(`.`),family:`IPv4`,mac:a,internal:o});break;case/inet6\s+([^\s%]+)(?:%\S+)?\s+prefixlen\s+(\d+)/.test(e):r.push({address:RegExp.$1,netmask:n(RegExp.$2),family:`IPv6`,mac:a,internal:o});break}this[e.slice(0,e.indexOf(`:`))]=r},sysctl=e=>{try{let n=t(`sysctl -n ${e}`).trim();return n.length>0?n:null}catch{return null}},cpus=()=>{let e=parseFloat(t(`sysctl -n hw.ncpu`)),n=sysctl(`machdep.cpu.brand_string`)?.replace(/\s+/g,` `)??`unknown`,r=sysctl(`hw.cpufrequency`),i=r?parseFloat(r)/1e3/1e3:0,a=[];for(let t=0;t<e;t++)a.push({model:n,speed:i,get times(){return console.warn(`cpus.times is not supported`),{}}});return a},endianness=()=>`LE`,freemem=()=>{try{let e=t(`vm_stat`),n=/page size of (\d+) bytes/.exec(e),r=n?parseInt(n[1],10):16384,i=0,a=/Pages free:\s+(\d+)/.exec(e);a&&(i+=parseInt(a[1],10));let o=/Pages speculative:\s+(\d+)/.exec(e);o&&(i+=parseInt(o[1],10));let s=/Pages purgeable:\s+(\d+)/.exec(e);if(s&&(i+=parseInt(s[1],10)),i>0)return i*r}catch{}try{return parseFloat(t(`sysctl -n hw.memsize`))-parseFloat(t(`sysctl -n hw.physmem`))}catch{return 0}},loadavg=()=>/load\s+averages:\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)/.test(t(`uptime`))?[parseFloat(RegExp.$1),parseFloat(RegExp.$2),parseFloat(RegExp.$3)]:[0,0,0],networkInterfaces=()=>{let e={},n=[],r=t(`ifconfig`).split(/\r\n|\n/),i=r.length;for(let e=[],t=/^\S+?:/,a=0;a<i;a++){if(t.test(r[a])){for(e=[r[a]];++a<i&&!t.test(r[a]);)e.push(r[a]);--a}n.push(e.join(`
2
+ `),r=[],i=t.length,a=`00:00:00:00:00:00`,o=/<[^>]*\bLOOPBACK\b[^>]*>/.test(t[0]??``);for(let e,s=0;s<i;s++)switch(e=t[s],!0){case/ether\s+((?:\S{2}:)+\S{2})/.test(e):a=RegExp.$1;break;case/inet\s+(\d+\.\d+\.\d+\.\d+)\s+netmask\s+0x(.{2})(.{2})(.{2})(.{2})/.test(e):r.push({address:RegExp.$1,netmask:[parseInt(RegExp.$2,16),parseInt(RegExp.$3,16),parseInt(RegExp.$4,16),parseInt(RegExp.$5,16)].join(`.`),family:`IPv4`,mac:a,internal:o});break;case/inet6\s+([^\s%]+)(?:%\S+)?\s+prefixlen\s+(\d+)/.test(e):r.push({address:RegExp.$1,netmask:n(RegExp.$2),family:`IPv6`,mac:a,internal:o});break}this[e.slice(0,e.indexOf(`:`))]=r},sysctl=e=>{try{let n=t(`sysctl -n ${e}`).trim();return n.length>0?n:null}catch{return null}},r=Object.freeze({user:0,nice:0,sys:0,idle:0,irq:0}),cpus=()=>{let e=parseFloat(t(`sysctl -n hw.ncpu`)),n=sysctl(`machdep.cpu.brand_string`)?.replace(/\s+/g,` `)??`unknown`,i=sysctl(`hw.cpufrequency`),a=i?parseFloat(i)/1e3/1e3:0,o=[];for(let t=0;t<e;t++)o.push({model:n,speed:a,times:{...r}});return o},endianness=()=>`LE`,freemem=()=>{try{let e=t(`vm_stat`),n=/page size of (\d+) bytes/.exec(e),r=n?parseInt(n[1],10):16384,i=0,a=/Pages free:\s+(\d+)/.exec(e);a&&(i+=parseInt(a[1],10));let o=/Pages speculative:\s+(\d+)/.exec(e);o&&(i+=parseInt(o[1],10));let s=/Pages purgeable:\s+(\d+)/.exec(e);if(s&&(i+=parseInt(s[1],10)),i>0)return i*r}catch{}try{return parseFloat(t(`sysctl -n hw.memsize`))-parseFloat(t(`sysctl -n hw.physmem`))}catch{return 0}},loadavg=()=>/load\s+averages:\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)/.test(t(`uptime`))?[parseFloat(RegExp.$1),parseFloat(RegExp.$2),parseFloat(RegExp.$3)]:[0,0,0],networkInterfaces=()=>{let e={},n=[],r=t(`ifconfig`).split(/\r\n|\n/),i=r.length;for(let e=[],t=/^\S+?:/,a=0;a<i;a++){if(t.test(r[a])){for(e=[r[a]];++a<i&&!t.test(r[a]);)e.push(r[a]);--a}n.push(e.join(`
3
3
  `))}return n.forEach(parseInterfaces,e),e},totalmem=()=>{try{return parseFloat(t(`sysctl -n hw.memsize`))}catch{return 0}},uptime=()=>{try{let e=t(`sysctl -n kern.boottime`),n=/sec\s*=\s*(\d+)/.exec(e);if(n){let e=parseInt(n[1],10);return Math.floor(Date.now()/1e3)-e}}catch{}let e=t(`uptime`),n=/up\s+([^,]+)?,/.test(e)&&RegExp.$1;switch(!0){case/^(\d+):(\d+)$/.test(n):return(parseInt(RegExp.$1,10)*60+parseInt(RegExp.$2,10))*60;case/^(\d+)\s+mins?$/.test(n):return parseInt(RegExp.$1,10)*60;case/^(\d+)\s+days?$/.test(n):{let t=parseInt(RegExp.$1,10)*86400,n=/days?,\s+(\d+):(\d+)/.exec(e);return n?t+(parseInt(n[1],10)*60+parseInt(n[2],10))*60:t}}return 0};export{cpus,endianness,freemem,loadavg,networkInterfaces,totalmem,uptime};
package/lib/esm/linux.js CHANGED
@@ -1,4 +1,4 @@
1
- import"./_virtual/_rolldown/runtime.js";import{createSubnet as e}from"./createSubnet.js";import{cli as t}from"@gjsify/utils";import n from"@girs/glib-2.0";const r=new TextDecoder,i=/\r\n|\n/;function readTextFile(e){let[t,i]=n.file_get_contents(e);return!t||!i?``:r.decode(i)}const a=e(32,8,10,`.`),o=e(128,16,16,`:`);function parseInterfaces(e){if(e=e.trim(),e.length<1)return;let t=[],n;for(let r,s=e.split(i),c=0;c<s.length;c++)switch(r=s[c],!0){case/link\/\S+\s+((?:\S{2}:)+\S{2})/.test(r):n=RegExp.$1;break;case/inet(\d*)\s+(\S+)/.test(r):let e=RegExp.$2.split(`/`),i=RegExp.$1||`4`;t.push({address:e[0],netmask:(i===`4`?a:o)(e[1]),family:`IPv`+i,mac:n,internal:e[0]===`127.0.0.1`});break}n&&(this[e.slice(0,e.indexOf(`:`))]=t)}const cpus=()=>{let e=/^processor\s*:\s*(\d+)/i,t=/^model[\s_]+name\s*:([^\r\n]+)/i,n=/^cpu[\s_]+MHz\s*:\s*(\d+)/i,r=[],a;readTextFile(`/proc/cpuinfo`).split(i).forEach(i=>{switch(!0){case e.test(i):r[RegExp.$1.trim()]=a={model:``,speed:0,times:{user:0,nice:0,sys:0,idle:0,irq:0}};break;case t.test(i):a.model=RegExp.$1.trim();break;case n.test(i):a.speed=parseFloat(RegExp.$1.trim());break}});try{let e=readTextFile(`/proc/stat`).split(i);for(let t of e){let e=/^cpu(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+(\d+)/.exec(t);e&&r[parseInt(e[1],10)]&&(r[parseInt(e[1],10)].times={user:parseInt(e[2],10)*10,nice:parseInt(e[3],10)*10,sys:parseInt(e[4],10)*10,idle:parseInt(e[5],10)*10,irq:parseInt(e[6],10)*10})}}catch{}return r},endianness=()=>`LE`,freemem=()=>{let e=readTextFile(`/proc/meminfo`),t=0;for(let n of e.split(`
1
+ import"./_virtual/_rolldown/runtime.js";import{createSubnet as e}from"./createSubnet.js";import{cli as t}from"@gjsify/utils";import n from"@girs/glib-2.0";const r=new TextDecoder,i=/\r\n|\n/;function readTextFile(e){let[t,i]=n.file_get_contents(e);return!t||!i?``:r.decode(i)}const a=e(32,8,10,`.`),o=e(128,16,16,`:`);function parseInterfaces(e){if(e=e.trim(),e.length<1)return;let t=/<[^>]*\bLOOPBACK\b[^>]*>/.test(e.split(i)[0]??``),n=[],r;for(let s,c=e.split(i),l=0;l<c.length;l++)switch(s=c[l],!0){case/link\/\S+\s+((?:\S{2}:)+\S{2})/.test(s):r=RegExp.$1;break;case/inet(\d*)\s+(\S+)/.test(s):let e=RegExp.$2.split(`/`),i=RegExp.$1||`4`;n.push({address:e[0],netmask:(i===`4`?a:o)(e[1]),family:`IPv`+i,mac:r,internal:t});break}r&&(this[e.slice(0,e.indexOf(`:`))]=n)}const cpus=()=>{let e=/^processor\s*:\s*(\d+)/i,t=/^model[\s_]+name\s*:([^\r\n]+)/i,n=/^cpu[\s_]+MHz\s*:\s*(\d+)/i,r=[],a;readTextFile(`/proc/cpuinfo`).split(i).forEach(i=>{switch(!0){case e.test(i):r[RegExp.$1.trim()]=a={model:``,speed:0,times:{user:0,nice:0,sys:0,idle:0,irq:0}};break;case t.test(i):a.model=RegExp.$1.trim();break;case n.test(i):a.speed=parseFloat(RegExp.$1.trim());break}});try{let e=readTextFile(`/proc/stat`).split(i);for(let t of e){let e=/^cpu(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+(\d+)/.exec(t);e&&r[parseInt(e[1],10)]&&(r[parseInt(e[1],10)].times={user:parseInt(e[2],10)*10,nice:parseInt(e[3],10)*10,sys:parseInt(e[4],10)*10,idle:parseInt(e[5],10)*10,irq:parseInt(e[6],10)*10})}}catch{}return r},endianness=()=>`LE`,freemem=()=>{let e=readTextFile(`/proc/meminfo`),t=0;for(let n of e.split(`
2
2
  `)){let e=/^MemAvailable:\s+(\d+)\s+kB/.exec(n);if(e)return parseInt(e[1],10)*1024;let r=/^MemFree:\s+(\d+)\s+kB/.exec(n);r&&(t=parseInt(r[1],10)*1024)}return t},loadavg=()=>/(\d+(?:\.\d+))\s+(\d+(?:\.\d+))\s+(\d+(?:\.\d+))/.test(readTextFile(`/proc/loadavg`))&&[parseFloat(RegExp.$1),parseFloat(RegExp.$2),parseFloat(RegExp.$3)],networkInterfaces=()=>{try{let e={};return t(`ip addr`).split(/^\d+:\s+/m).forEach(parseInterfaces,e),e}catch{return readNetworkInterfacesFromProc()}};function readNetworkInterfacesFromProc(){let e={},t={};try{let n=readTextFile(`/proc/net/dev`);for(let r of n.split(`
3
3
  `).slice(2)){let n=r.split(`:`)[0]?.trim();if(n){e[n]=[];try{t[n]=readTextFile(`/sys/class/net/${n}/address`).trim()}catch{t[n]=`00:00:00:00:00:00`}}}}catch{return e}try{let n=readTextFile(`/proc/net/if_inet6`);for(let r of n.split(`
4
4
  `)){let n=r.trim().split(/\s+/);if(n.length<6)continue;let[i,,a,,,s]=n,c=i.match(/.{4}/g);!c||!e[s]||e[s].push({address:c.join(`:`),netmask:o(a),family:`IPv6`,mac:t[s]||`00:00:00:00:00:00`,internal:s===`lo`})}}catch{}e.lo&&e.lo.unshift({address:`127.0.0.1`,netmask:`255.0.0.0`,family:`IPv4`,mac:t.lo||`00:00:00:00:00:00`,internal:!0});for(let t of Object.keys(e))e[t].length===0&&delete e[t];return e}const totalmem=()=>{let e=readTextFile(`/proc/meminfo`);for(let t of e.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/os",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "description": "Node.js os module for Gjs",
5
5
  "module": "lib/esm/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -40,11 +40,11 @@
40
40
  "dependencies": {
41
41
  "@girs/gio-2.0": "^4.1.0",
42
42
  "@girs/glib-2.0": "^4.1.0",
43
- "@gjsify/utils": "^0.29.0"
43
+ "@gjsify/utils": "^0.31.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@gjsify/cli": "^0.29.0",
47
- "@gjsify/unit": "^0.29.0",
46
+ "@gjsify/cli": "^0.31.0",
47
+ "@gjsify/unit": "^0.31.0",
48
48
  "@types/node": "^25.9.2",
49
49
  "typescript": "^6.0.3"
50
50
  },
@@ -55,7 +55,16 @@
55
55
  "browser": "polyfill",
56
56
  "nativescript": "none"
57
57
  },
58
- "tier": 1
58
+ "tier": 1,
59
+ "os": {
60
+ "linux": "supported",
61
+ "darwin": "partial",
62
+ "win32": "partial"
63
+ },
64
+ "osNotes": {
65
+ "darwin": "`os.cpus()` reports the documented all-zero `times` on macOS. Linux reads the per-CPU tick counters from `/proc/stat`; the darwin equivalent is Mach's `host_processor_info(PROCESSOR_CPU_LOAD_INFO)`, which GJS cannot call without a native bridge, and no userland tool prints the cumulative per-core totals Node returns (`top`/`iostat` give an instantaneous aggregate percentage). Every other export — cpus model/speed, memory, uptime, loadavg, networkInterfaces, userInfo — is real on darwin and covered by the macOS suites. `src/index.spec.ts` carries the matching `it.failing(…, { when })`, so the claim retires itself the day a reader exists.",
66
+ "win32": "A `src/win32.ts` covers the per-platform answers, but it is unexercised for the same structural reason as `@gjsify/child_process`: `runtimes.node: \"none\"` sends `test:node` to native Node, and there is no GJS host on Windows to run `test:gjs`. Measured on the win11-gjsify VM: 10 of 178 specs fail there, and all ten are POSIX assumptions in the SPECS (asserting `type()` is `Linux`, EOL is `\\n`, devNull is `/dev/null`) rather than defects in this module."
67
+ }
59
68
  },
60
69
  "license": "MIT",
61
70
  "repository": {