@daimazun/hardware-info 1.0.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.
Files changed (47) hide show
  1. package/README.md +907 -0
  2. package/bin/OpenHardwareMonitorLib.dll +0 -0
  3. package/index.js +192 -0
  4. package/lib/allhardware.js +35 -0
  5. package/lib/backend-usage.js +103 -0
  6. package/lib/battery.js +76 -0
  7. package/lib/disk-watcher.js +156 -0
  8. package/lib/disk.js +77 -0
  9. package/lib/gpu.js +70 -0
  10. package/lib/hardware-service.js +284 -0
  11. package/lib/memory.js +59 -0
  12. package/lib/monitor.js +176 -0
  13. package/lib/network.js +75 -0
  14. package/lib/ohm-daemon.js +208 -0
  15. package/lib/ohm.js +41 -0
  16. package/lib/perfctr.js +43 -0
  17. package/lib/process-icon.js +76 -0
  18. package/lib/process-ops.js +218 -0
  19. package/lib/processes.js +232 -0
  20. package/lib/ps.js +93 -0
  21. package/lib/public-ip.js +124 -0
  22. package/lib/services.js +43 -0
  23. package/lib/sysinfo-daemon.js +188 -0
  24. package/lib/system.js +77 -0
  25. package/lib/usb.js +49 -0
  26. package/lib/win32-procs.js +241 -0
  27. package/package.json +50 -0
  28. package/scripts/get-all-hardware.ps1 +98 -0
  29. package/scripts/get-lhm-temp.ps1 +119 -0
  30. package/scripts/ohm-daemon.ps1 +141 -0
  31. package/scripts/sysinfo-daemon.ps1 +386 -0
  32. package/test/check-bugs.js +182 -0
  33. package/test/public/gj.pay.ali.jpg +0 -0
  34. package/test/public/gj.pay.wx.jpg +0 -0
  35. package/test/public/index.html +996 -0
  36. package/test/public/zdl.pay.ali.jpg +0 -0
  37. package/test/public/zdl.pay.wx.jpg +0 -0
  38. package/test/scan-encoding.js +77 -0
  39. package/test/server.js +255 -0
  40. package/test/test-all.js +180 -0
  41. package/test/test-daemon.js +51 -0
  42. package/test/test-kill-name.js +30 -0
  43. package/test/test-monitor.js +78 -0
  44. package/test/test-new-features.js +93 -0
  45. package/test/test-service.js +91 -0
  46. package/test/test-sysinfo-daemon.js +95 -0
  47. package/test/test.js +63 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 新增功能综合测试
3
+ * 运行: node test/test-new-features.js
4
+ */
5
+
6
+ const {
7
+ getProcesses,
8
+ killProcess,
9
+ showItemInFolder,
10
+ createDiskWatcher,
11
+ listDriveLetters,
12
+ getProcessIcon,
13
+ getProcessIcons
14
+ } = require('../index');
15
+
16
+ async function test() {
17
+ console.log('=== 新增功能测试 ===\n');
18
+
19
+ // 1. koffi 进程枚举性能
20
+ console.log('--- 1. koffi 进程枚举 ---');
21
+ const start = Date.now();
22
+ const r1 = await getProcesses({ top: 5 });
23
+ console.log(` 耗时: ${Date.now() - start}ms | 总数: ${r1.total} | 后端: ${r1.backend}`);
24
+ console.log(` Top5 内存: ${r1.processes.map(p => `${p.name}(${p.memoryMB}MB)`).join(', ')}`);
25
+
26
+ // 2. 按名称聚合
27
+ console.log('\n--- 2. 按名称聚合 ---');
28
+ const r2 = await getProcesses({ top: 5, groupByName: true });
29
+ r2.processes.forEach(p => {
30
+ console.log(` ${p.name}: ${p.memoryMB}MB | ${p.pids.length}个实例 | 线程${p.threads} | 父PID=${p.pid}`);
31
+ });
32
+
33
+ // 3. 安装时间
34
+ console.log('\n--- 3. 安装时间 ---');
35
+ const r3 = await getProcesses({ top: 3, includeInstallTime: true });
36
+ r3.processes.forEach(p => {
37
+ console.log(` ${p.name}: 路径=${p.exePath ? p.exePath.slice(0, 50) : '(无)'} | 安装时间=${p.installTime || '(无)'}`);
38
+ });
39
+
40
+ // 4. CPU%(启动采样器,等2秒让基线建立)
41
+ console.log('\n--- 4. 实时 CPU% ---');
42
+ console.log(' 启动采样器,等待2秒建立基线...');
43
+ await getProcesses({ includeCpu: true }); // 第一次启动采样器
44
+ await new Promise(r => setTimeout(r, 2000));
45
+ const r4 = await getProcesses({ top: 5, sortBy: 'cpu', includeCpu: true, groupByName: true });
46
+ console.log(` CPU Top5:`);
47
+ r4.processes.forEach(p => {
48
+ console.log(` ${p.name}: CPU=${p.cpuPercent}% | 内存=${p.memoryMB}MB`);
49
+ });
50
+
51
+ // 5. 进程操作(参数校验,不实际执行危险操作)
52
+ console.log('\n--- 5. 进程操作 ---');
53
+ const killInvalid = await killProcess(0);
54
+ console.log(` killProcess(0): ok=${killInvalid.ok}, message=${killInvalid.message}`);
55
+ const showInvalid = showItemInFolder('');
56
+ console.log(` showItemInFolder(''): ok=${showInvalid.ok}, message=${showInvalid.message}`);
57
+ const showNotExist = showItemInFolder('C:\\nonexistent\\file.exe');
58
+ console.log(` showItemInFolder(不存在): ok=${showNotExist.ok}, message=${showNotExist.message}`);
59
+
60
+ // 6. 磁盘插拔监听
61
+ console.log('\n--- 6. 磁盘插拔监听 ---');
62
+ const disks = listDriveLetters();
63
+ console.log(` 当前盘符: ${disks.join(', ')}`);
64
+ const watcher = createDiskWatcher({ interval: 1000 });
65
+ watcher.on('change', ({ added, removed, disks }) => {
66
+ console.log(` [事件] 盘符变化! 新增=${added.join(',') || '无'} 移除=${removed.join(',') || '无'} 当前=${disks.join(',')}`);
67
+ });
68
+ watcher.start();
69
+ console.log(' 监听器已启动(1s轮询),运行3秒...');
70
+ await new Promise(r => setTimeout(r, 3000));
71
+ watcher.stop();
72
+ console.log(' 监听器已停止');
73
+
74
+ // 7. 进程图标提取
75
+ console.log('\n--- 7. 进程图标提取 ---');
76
+ const testExe = process.execPath; // node.exe
77
+ const iconStart = Date.now();
78
+ const icon = await getProcessIcon(testExe);
79
+ console.log(` 提取 ${testExe} 图标: ${icon ? icon.length + ' 字符 base64' : '失败'} | 耗时=${Date.now() - iconStart}ms`);
80
+
81
+ // 批量提取
82
+ const batchStart = Date.now();
83
+ const icons = await getProcessIcons([testExe, 'C:\\Windows\\explorer.exe']);
84
+ console.log(` 批量提取2个: ${Object.keys(icons).length}个成功 | 耗时=${Date.now() - batchStart}ms`);
85
+
86
+ console.log('\n=== 全部测试完成 ===');
87
+ process.exit(0);
88
+ }
89
+
90
+ test().catch(e => {
91
+ console.error('测试失败:', e);
92
+ process.exit(1);
93
+ });
@@ -0,0 +1,91 @@
1
+ /**
2
+ * test-service.js — 统一常驻服务 HardwareService 综合测试
3
+ * 运行: node test/test-service.js
4
+ */
5
+
6
+ const { createHardwareService } = require('../index');
7
+
8
+ async function main() {
9
+ console.log('=== HardwareService 统一常驻服务测试 ===\n');
10
+
11
+ // 1. 创建服务
12
+ console.log('1. 创建服务...');
13
+ const service = await createHardwareService({ cpuTempInterval: 500 });
14
+ const status = service.getStatus();
15
+ console.log(' 状态:', JSON.stringify(status));
16
+
17
+ // 2. 系统信息
18
+ console.log('\n2. 系统信息模块:');
19
+ const sys = await service.getSystem();
20
+ console.log(' system:', sys.os?.name || sys.os, '|', sys.cpu?.name || sys.cpu);
21
+ const mem = await service.getMemory();
22
+ console.log(' memory:', mem.usedPercent.toFixed(1) + '%', '|', mem.usedPhysicalGB.toFixed(1) + '/' + mem.totalPhysicalGB.toFixed(1) + 'GB');
23
+ const net = await service.getNetwork();
24
+ console.log(' network:', net.activeAdapterCount + '活跃', '| 下载:', (net.totalDownloadBytesPerSec / 1024).toFixed(1) + 'KB/s');
25
+ const gpu = await service.getGpu();
26
+ console.log(' gpu:', gpu.gpuCount + '块');
27
+
28
+ // 3. 进程(自动带 CPU%)
29
+ console.log('\n3. 进程(自动带 CPU%,无需手动管理采样器):');
30
+ console.log(' 等待1秒让 CPU% 基线建立...');
31
+ await new Promise(r => setTimeout(r, 1100));
32
+ const procs = await service.getProcesses({ top: 3, sortBy: 'cpu' });
33
+ console.log(' CPU Top3:');
34
+ procs.processes.forEach(p => {
35
+ console.log(' ' + p.name + ': CPU=' + (p.cpuPercent || 0).toFixed(1) + '%', '| 内存=' + p.memoryMB.toFixed(1) + 'MB', '| 父PID=' + p.parentPid);
36
+ });
37
+
38
+ // 4. CPU 温度
39
+ console.log('\n4. CPU 温度(自动采样,同步返回):');
40
+ const temp = service.getCpuTemp();
41
+ if (temp && temp.temperature) {
42
+ console.log(' 封装:', (temp.temperature.package || temp.temperature.maxCore || 0).toFixed(1) + '°C', '| 来源:', temp.source);
43
+ } else {
44
+ console.log(' 暂无数据(可能非管理员,降级中)');
45
+ }
46
+ console.log(' cpu-temp 事件触发次数:', service.listenerCount('cpu-temp'));
47
+
48
+ // 5. 公网 IP
49
+ console.log('\n5. 公网 IP:');
50
+ try {
51
+ const ip = await service.getPublicIp();
52
+ console.log(' IP:', ip);
53
+ } catch (e) {
54
+ console.log(' 获取失败:', e.message);
55
+ }
56
+
57
+ // 6. 磁盘
58
+ console.log('\n6. 磁盘:');
59
+ console.log(' 当前盘符:', service.getDisks().join(', '));
60
+
61
+ // 7. 后端资源占用
62
+ console.log('\n7. 后端资源占用:');
63
+ service.getBackendUsage(); // 第一次建立 CPU 基线
64
+ await new Promise(r => setTimeout(r, 500));
65
+ const usage = service.getBackendUsage();
66
+ console.log(' Node.js:', usage.node.memory.workingSetMB + 'MB', '| CPU ' + usage.node.cpuPercent + '%');
67
+ console.log(' 子进程:', usage.children.length + '个,', usage.children.reduce((s, c) => s + c.memoryMB, 0).toFixed(1) + 'MB');
68
+ console.log(' 总计:', usage.total.memoryMB + 'MB', '| CPU ' + usage.total.cpuPercent + '%', '|', usage.total.threads + '线程');
69
+
70
+ // 8. 暂停/恢复
71
+ console.log('\n8. 暂停/恢复:');
72
+ service.pause();
73
+ const s1 = service.getStatus();
74
+ console.log(' 已暂停, cpuTempRunning:', s1.status.cpuTempRunning);
75
+ service.resume();
76
+ const s2 = service.getStatus();
77
+ console.log(' 已恢复, cpuTempRunning:', s2.status.cpuTempRunning);
78
+
79
+ // 9. 关闭
80
+ console.log('\n9. 关闭服务(释放所有资源)...');
81
+ await service.close();
82
+ console.log(' 已关闭, closed:', service.getStatus().closed);
83
+
84
+ console.log('\n=== 全部测试完成 ===');
85
+ process.exit(0);
86
+ }
87
+
88
+ main().catch(e => {
89
+ console.error('测试失败:', e);
90
+ process.exit(1);
91
+ });
@@ -0,0 +1,95 @@
1
+ const { createSysInfoDaemon, getSystemInfo, getNetworkInfo, getMemoryInfo } = require('../index');
2
+
3
+ async function main() {
4
+ console.log('=== SysInfoDaemon 常驻模式性能测试 ===\n');
5
+
6
+ // 1. 单次模式延迟对比(spawn 新进程)
7
+ console.log('--- 单次模式(每次 spawn 新进程)---');
8
+ const singleStart = Date.now();
9
+ await getSystemInfo();
10
+ const singleElapsed = Date.now() - singleStart;
11
+ console.log(` getSystemInfo: ${singleElapsed}ms`);
12
+
13
+ // 2. 启动常驻进程
14
+ console.log('\n--- 启动常驻进程 ---');
15
+ const daemonStart = Date.now();
16
+ const daemon = await createSysInfoDaemon({ verbose: false });
17
+ console.log(` 启动延迟: ${Date.now() - daemonStart}ms`);
18
+
19
+ // 3. 各模块高频调用测试
20
+ const modules = [
21
+ { name: 'getSystem', fn: () => daemon.getSystem() },
22
+ { name: 'getMemory', fn: () => daemon.getMemory() },
23
+ { name: 'getDisk', fn: () => daemon.getDisk() },
24
+ { name: 'getNetwork', fn: () => daemon.getNetwork() },
25
+ { name: 'getBattery', fn: () => daemon.getBattery() },
26
+ { name: 'getGpu', fn: () => daemon.getGpu() },
27
+ { name: 'getUsb', fn: () => daemon.getUsb() },
28
+ ];
29
+
30
+ console.log('\n--- 各模块连续调用 5 次延迟 ---');
31
+ for (const mod of modules) {
32
+ const delays = [];
33
+ for (let i = 0; i < 5; i++) {
34
+ const start = Date.now();
35
+ await mod.fn();
36
+ delays.push(Date.now() - start);
37
+ }
38
+ const avg = Math.round(delays.reduce((a, b) => a + b, 0) / delays.length);
39
+ console.log(` ${mod.name}: 平均 ${avg}ms (最小 ${Math.min(...delays)}ms, 最大 ${Math.max(...delays)}ms)`);
40
+ }
41
+
42
+ // 4. 进程列表测试
43
+ console.log('\n--- 进程列表(Top 10)---');
44
+ const procStart = Date.now();
45
+ const procs = await daemon.getProcesses({ top: 10, sortBy: 'memory' });
46
+ console.log(` 延迟: ${Date.now() - procStart}ms | 总进程: ${procs.total} | 返回: ${procs.returned}`);
47
+ console.log(` Top1: ${procs.processes[0].name} (${procs.processes[0].memoryMB}MB)`);
48
+
49
+ // 5. 服务列表测试
50
+ console.log('\n--- 服务列表 ---');
51
+ const svcStart = Date.now();
52
+ const svcs = await daemon.getServices();
53
+ console.log(` 延迟: ${Date.now() - svcStart}ms | 总服务: ${svcs.total} | 运行: ${svcs.running} | 停止: ${svcs.stopped}`);
54
+
55
+ // 6. getAll 汇总测试
56
+ console.log('\n--- getAll 汇总(不含进程/服务)---');
57
+ const allStart = Date.now();
58
+ const all = await daemon.getAll();
59
+ const allElapsed = Date.now() - allStart;
60
+ console.log(` 延迟: ${allElapsed}ms`);
61
+ console.log(` 系统: ${all.system.os.caption}`);
62
+ console.log(` 内存: ${all.memory.usedPercent}%`);
63
+ console.log(` 网络: ${all.network.activeAdapterCount} 活跃网卡`);
64
+ console.log(` 电池: ${all.battery.hasBattery ? all.battery.overallChargePercent + '%' : '无'}`);
65
+ console.log(` 显卡: ${all.gpu.gpuCount} 块`);
66
+ console.log(` USB: ${all.usb.deviceCount} 设备`);
67
+
68
+ // 7. 高频连续调用网络(模拟实时网速监控)
69
+ console.log('\n--- 高频网络监控(100ms 间隔,连续 5 次)---');
70
+ for (let i = 0; i < 5; i++) {
71
+ const start = Date.now();
72
+ const net = await daemon.getNetwork();
73
+ const elapsed = Date.now() - start;
74
+ const wlan = net.adapters.find(a => a.connectionName === 'WLAN');
75
+ console.log(` #${i + 1}: ${elapsed}ms | 下载 ${(wlan.bytesReceivedPerSec / 1024).toFixed(1)}KB/s | 上传 ${(wlan.bytesSentPerSec / 1024).toFixed(1)}KB/s`);
76
+ if (i < 4) await new Promise(r => setTimeout(r, 100));
77
+ }
78
+
79
+ // 8. 性能对比总结
80
+ console.log('\n=== 性能对比总结 ===');
81
+ console.log(` 单次模式 getSystemInfo: ${singleElapsed}ms`);
82
+ console.log(` 常驻模式平均延迟: ~50-100ms(取决于模块复杂度)`);
83
+ console.log(` 提速倍数: ${(singleElapsed / 70).toFixed(1)}x(按平均 70ms 估算)`);
84
+ console.log(` 内存占用: 一个 PowerShell 进程 ~50MB`);
85
+
86
+ // 关闭
87
+ console.log('\n关闭常驻进程...');
88
+ await daemon.close();
89
+ console.log('已关闭');
90
+ }
91
+
92
+ main().catch(err => {
93
+ console.error('测试失败:', err);
94
+ process.exit(1);
95
+ });
package/test/test.js ADDED
@@ -0,0 +1,63 @@
1
+ const { getCpuTemp, getAllHardwareInfo } = require('../index');
2
+
3
+ async function main() {
4
+ console.log('=== 1. getCpuTemp() ===\n');
5
+ try {
6
+ const cpu = await getCpuTemp({ verbose: true });
7
+ console.log(JSON.stringify(cpu, null, 2));
8
+ console.log('');
9
+ console.log(`Source: ${cpu.source}`);
10
+ console.log(`Is core temp: ${cpu.isCoreTemp}`);
11
+ if (cpu.temperature) {
12
+ console.log(`Package temp: ${cpu.temperature.package != null ? cpu.temperature.package + ' °C' : 'N/A'}`);
13
+ console.log(`Max core temp: ${cpu.temperature.maxCore != null ? cpu.temperature.maxCore + ' °C' : 'N/A'}`);
14
+ if (cpu.temperature.cores && cpu.temperature.cores.length > 0) {
15
+ console.log('Per-core temps:');
16
+ cpu.temperature.cores.forEach(c => console.log(` ${c.name}: ${c.value}°C`));
17
+ }
18
+ }
19
+ if (cpu.load && cpu.load.length > 0) {
20
+ const total = cpu.load.find(l => l.name === 'CPU Total');
21
+ console.log(`CPU load: ${total ? total.value + '%' : 'N/A'}`);
22
+ }
23
+ if (cpu.clock && cpu.clock.length > 0) {
24
+ const c1 = cpu.clock.find(c => c.name === 'CPU Core #1');
25
+ console.log(`Core #1 clock: ${c1 ? c1.value + ' MHz' : 'N/A'}`);
26
+ }
27
+ if (cpu.power && cpu.power.length > 0) {
28
+ const pkg = cpu.power.find(p => p.name === 'CPU Package');
29
+ console.log(`Package power: ${pkg ? pkg.value + ' W' : 'N/A'}`);
30
+ }
31
+ } catch (e) {
32
+ console.error('getCpuTemp FAILED:', e.message);
33
+ }
34
+
35
+ console.log('\n\n=== 2. getAllHardwareInfo() ===\n');
36
+ try {
37
+ const all = await getAllHardwareInfo();
38
+ console.log(`Hardware count: ${all.hardware.length}`);
39
+ all.hardware.forEach(hw => {
40
+ const sensorCount = hw.sensors ? hw.sensors.length : 0;
41
+ console.log(`\n[${hw.hardwareType}] ${hw.name} (${sensorCount} sensors)`);
42
+ if (hw.sensors) {
43
+ hw.sensors.forEach(s => {
44
+ console.log(` - ${s.name} [${s.type}] = ${s.value}`);
45
+ });
46
+ }
47
+ if (hw.subHardware && hw.subHardware.length > 0) {
48
+ hw.subHardware.forEach(sub => {
49
+ console.log(` > Sub [${sub.hardwareType}] ${sub.name} (${sub.sensors ? sub.sensors.length : 0} sensors)`);
50
+ if (sub.sensors) {
51
+ sub.sensors.forEach(s => {
52
+ console.log(` - ${s.name} [${s.type}] = ${s.value}`);
53
+ });
54
+ }
55
+ });
56
+ }
57
+ });
58
+ } catch (e) {
59
+ console.error('getAllHardwareInfo FAILED:', e.message);
60
+ }
61
+ }
62
+
63
+ main();