diff --git a/lib/audio.js b/lib/audio.js new file mode 100644 index 0000000..f6cc628 --- /dev/null +++ b/lib/audio.js @@ -0,0 +1,235 @@ +'use strict'; +// @ts-check +// ================================================================================== +// audio.js +// ---------------------------------------------------------------------------------- +// Description: System Information - library +// for Node.js +// Copyright: (c) 2014 - 2021 +// Author: Sebastian Hildebrandt +// ---------------------------------------------------------------------------------- +// License: MIT +// ================================================================================== +// 16. audio +// ---------------------------------------------------------------------------------- + +const exec = require('child_process').exec; +// const execSync = require('child_process').execSync; +const util = require('./util'); +// const fs = require('fs'); + +let _platform = process.platform; + +const _linux = (_platform === 'linux'); +const _darwin = (_platform === 'darwin'); +const _windows = (_platform === 'win32'); +const _freebsd = (_platform === 'freebsd'); +const _openbsd = (_platform === 'openbsd'); +const _netbsd = (_platform === 'netbsd'); +const _sunos = (_platform === 'sunos'); + +const winPrinterStatus = { + 1: 'Other', + 2: 'Unknown', + 3: 'Idle', + 4: 'Printing', + 5: 'Warmup', + 6: 'Stopped Printing', + 7: 'Offline', +} + +function parseLinuxCupsHeader(lines) { + const result = {} + if (lines && lines.length) { + if (lines[0].indexOf(' CUPS v') > 0) { + const parts = lines[0].split(' CUPS v'); + result.cupsVersion = parts[1]; + } + } + return result; +} + +function parseLinuxCupsPrinter(lines) { + const result = {}; + const printerId = util.getValue(lines, 'PrinterId', ' '); + result.id = printerId ? parseInt(printerId, 10) : null; + result.name = util.getValue(lines, 'Info', ' '); + result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : ''; + result.uri = util.getValue(lines, 'DeviceURI', ' '); + result.uuid = util.getValue(lines, 'UUID', ' '); + result.status = util.getValue(lines, 'State', ' '); + result.local = util.getValue(lines, 'Location', ' ').toLowerCase().startsWith('local'); + result.default = null; + result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes'); + + return result; +} + +function parseLinuxLpstatPrinter(lines, id) { + const result = {}; + result.id = id + result.name = util.getValue(lines, 'Description', ':', true); + result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : ''; + result.uri = null; + result.uuid = null + result.status = lines.length > 0 && lines[0] ? (lines[0].indexOf(' idle') > 0 ? 'idle' : (lines[0].indexOf(' printing') > 0 ? 'printing' : 'unknown')) : null + result.local = util.getValue(lines, 'Location', ':', true).toLowerCase().startsWith('local'); + result.default = null; + result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes'); + + return result; +} + +// name +// type +// manufacturer +// builtIn +// default +// revision +// driver +// (onboard) +// #channels +// in +// out +// interfaceType HDMI, Display - Port, Build -in, USB, PCIe(darwin: coreaudio_device_transport) +// status + +function parseDarwinChannel(str) { + let result = ''; + + if (str.indexOf('builtin') >= 0) { result = 'Built-In'; } + if (str.indexOf('hdmi') >= 0) { result = 'HDMI'; } + if (str.indexOf('displayport') >= 0) { result = 'Display-Port'; } + if (str.indexOf('usb') >= 0) { result = 'USB'; } + if (str.indexOf('pci') >= 0) { result = 'PCIe'; } + + return result; +} + +function parseDarwinAudio(audioObject, id) { + const result = {}; + const channelStr = (audioObject.coreaudio_device_transport || ''); + + result.id = id; + result.name = audioObject._name + result.manufacturer = audioObject.coreaudio_device_manufacturer; + result.default = !!(audioObject.coreaudio_default_audio_input_device || '') || !!(audioObject.coreaudio_default_audio_output_device || ''); + result.revision = null; + result.driver = null; + result.channel = parseDarwinChannel(channelStr); + result.in = !!(audioObject.coreaudio_device_input || '') + result.out = !!(audioObject.coreaudio_device_output || '') + result.status = 'online'; + + return result; +} + +function parseWindowsAudio(lines, id) { + const result = {}; + const status = parseInt(util.getValue(lines, 'PrinterStatus', '='), 10); + + result.id = id; + result.name = util.getValue(lines, 'name', '='); + result.model = util.getValue(lines, 'DriverName', '='); + result.uri = null; + result.uuid = null + result.status = winPrinterStatus[status] ? winPrinterStatus[status] : null; + result.local = util.getValue(lines, 'Local', '=') === 'TRUE'; + result.default = util.getValue(lines, 'Default', '=') === 'TRUE'; + result.shared = util.getValue(lines, 'Shared', '=') === 'TRUE'; + + return result; +} + +function audio(callback) { + + return new Promise((resolve) => { + process.nextTick(() => { + let result = []; + if (_linux || _freebsd || _openbsd || _netbsd) { + let cmd = 'cat /etc/cups/printers.conf 2>/dev/null' + exec(cmd, function (error, stdout) { + // printers.conf + if (!error) { + const parts = stdout.toString().split(' any): export function printer(cb?: (data: Systeminformation.PrinterData[]) => any): Promise; +export function usb(cb?: (data: Systeminformation.UsbData[]) => any): Promise; + +export function audio(cb?: (data: Systeminformation.AudioData[]) => any): Promise; + export function getStaticData(cb?: (data: Systeminformation.StaticData) => any): Promise; export function getDynamicData(srv?: string, iface?: string, cb?: (data: any) => any): Promise; export function getAllData(srv?: string, iface?: string, cb?: (data: any) => any): Promise; diff --git a/lib/index.js b/lib/index.js index a5e4b2b..ce05876 100755 --- a/lib/index.js +++ b/lib/index.js @@ -39,6 +39,7 @@ const docker = require('./docker'); const vbox = require('./virtualbox'); const printer = require('./printer'); const usb = require('./usb'); +const audio = require('./audio'); let _platform = process.platform; const _windows = (_platform === 'win32'); @@ -491,6 +492,8 @@ exports.printer = printer.printer; exports.usb = usb.usb; +exports.audio = audio.audio; + exports.getStaticData = getStaticData; exports.getDynamicData = getDynamicData; exports.getAllData = getAllData; diff --git a/package.json b/package.json index 538c424..ae48d40 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,7 @@ }, "types": "./lib/index.d.ts", "scripts": { - "clean": "rimraf dist", - "test-bare": "npm run compile && mocha ./test/**/*.test.js", - "compile": "tsc", - "watch": "tsc -w", - "test": "nyc mocha --require ts-node/register --require source-map-support/register ./test/**/*.test.ts", - "coverage": "nyc report --reporter=text-lcov" + "test": "node ./test/test.js" }, "files": [ "lib/" diff --git a/test/test.js b/test/test.js index 9ff4049..4755ab8 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,8 @@ const readline = require('readline'); const util = require('util'); -const { exec } = require('child_process'); +const exec = require('child_process').exec; const lib_version = require('../package.json').version; +const path = require('path'); let waiting = false; let timer; @@ -74,7 +75,8 @@ process.stdin.on('keypress', (key, data) => { if (!waiting) { waiting = true; startDots(); - exec(`node si.js '${key}'`, {timeout: 30000}, (error, stdout) => { + const siPath = path.join(__dirname, 'si.js'); + exec(`node ${siPath} '${key}'`, {timeout: 30000}, (error, stdout) => { waiting = false; stopDots(); clearline();