WProcessStatus.mjs

import path from 'path'
import fs from 'fs'
import process from 'process'
import genID from 'wsemi/src/genID.mjs'
import str2b64 from 'wsemi/src/str2b64.mjs'
import j2o from 'wsemi/src/j2o.mjs'
import isestr from 'wsemi/src/isestr.mjs'
import isarr from 'wsemi/src/isarr.mjs'
import cstr from 'wsemi/src/cstr.mjs'
import execProcess from 'wsemi/src/execProcess.mjs'
import autoDownloadFiles from './autoDownloadFiles.mjs'


function isWindows() {
    return process.platform === 'win32'
}


/**
 * 列出指定程序名稱的pid與狀態之清單
 *
 * @param {String} name 輸入程序名稱字串
 * @returns {Promise} 回傳Promise,resolve回傳成功訊息,reject回傳錯誤訊息
 * @example
 *
 * async function test() {
 *
 *     let name = 'chrome.exe'
 *     let opt = {}
 *
 *     let rs = await WProcessStatus(name, opt)
 *     console.log('rs', rs)
 *     // rs => [
 *     //   {
 *     //     name: 'chrome.exe',
 *     //     pid: 400,
 *     //     ram: 169404,
 *     //     username: '{username}',
 *     //     status: 'running'
 *     //   },
 *     //   {
 *     //     name: 'chrome.exe',
 *     //     pid: 11648,
 *     //     ram: 2300,
 *     //     username: '{username}',
 *     //     status: 'stopped'
 *     //   }
 *     //   {
 *     //     name: 'chrome.exe',
 *     //     pid: 4984,
 *     //     ram: 211720,
 *     //     username: '{username}',
 *     //     status: 'running'
 *     //   },
 *     //   ...
 *     // ]
 *
 * }
 * test()
 *     .catch((err) => {
 *         console.log(err)
 *     })
 *
 */
async function WProcessStatus(name) {
    let errTemp = null

    //isWindows
    if (!isWindows()) {
        return Promise.reject('operating system is not windows')
    }

    //check
    if (!isestr(name)) {
        return Promise.reject('name is not an effective string')
    }

    //prog, 自動定位processStatus.exe, 無檔案(安裝時npm封鎖scripts致postinstall未執行)則自動下載
    let { fpExe } = await autoDownloadFiles()
    let prog = fpExe
    // console.log('prog', prog)

    //fdExe, prog所在資料夾, 供暫存json檔使用
    let fdExe = `${path.dirname(prog)}/`
    // console.log('fdExe', fdExe)

    //id
    let id = genID()

    //fpIn
    let fpIn = `${fdExe}_${id}_fpIn.json`

    //fpIn
    let fpOut = `${fdExe}_${id}_fpOut.json`

    //rIn
    let rIn = {
        name,
    }

    //save
    fs.writeFileSync(fpIn, JSON.stringify(rIn), 'utf8')

    //inp
    let inp = {
        fpIn,
        fpOut,
        opt: {},
    }
    // console.log('inp', inp)

    //input to b64
    let cInput = JSON.stringify(inp)
    let b64Input = str2b64(cInput)

    //execProcess
    await execProcess(prog, b64Input)
        .catch((err) => {
            console.log('execProcess catch', err)
            errTemp = err.toString()
        })

    //read output
    let output = null
    try {
        let j = fs.readFileSync(fpOut, 'utf8')
        // console.log('j', j)
        output = j2o(j)
        // console.log('output', output)
    }
    catch (err) {}

    //unlinkSync
    try {
        fs.unlinkSync(fpIn)
    }
    catch (err) {}

    //unlinkSync
    try {
        fs.unlinkSync(fpOut)
    }
    catch (err) {}

    //check
    if (errTemp) {
        return Promise.reject(errTemp)
    }

    //check
    if (!isarr(output)) {
        return Promise.reject(`output[${cstr(output)}] is not an array`)
    }

    //rs
    let rs = output

    return rs
}


export default WProcessStatus