{"version":3,"file":"pidTree.cjs","names":["os"],"sources":["../../../../src/utils/runParallel/pidTree.ts"],"sourcesContent":["import * as os from 'node:os';\nimport { ps } from './ps';\nimport { wmic } from './wmic';\n\ntype Platform =\n  | 'darwin'\n  | 'sunos'\n  | 'freebsd'\n  | 'netbsd'\n  | 'win'\n  | 'linux'\n  | 'aix';\ntype Method = 'ps' | 'wmic';\n\ntype ProcessList = [number, number][]; // [PPID, PID][]\n\ninterface ListOptions {\n  root?: boolean;\n  advanced?: boolean;\n}\n\ntype ProcessInfo = { pid: number; ppid?: number };\ntype ResultType<T extends ListOptions | undefined> = T extends {\n  advanced: true;\n}\n  ? ProcessInfo[]\n  : number[];\n\ntype ProcessListCallback = (err: Error | null, list?: ProcessList) => void;\ntype ListCallback<T extends ListOptions | undefined> = (\n  err: Error | null,\n  list?: ResultType<T>\n) => void;\n\ntype ProcessListFn = (callback: ProcessListCallback) => void;\n\nconst platformToMethod: Record<Platform, Method> = {\n  darwin: 'ps',\n  sunos: 'ps',\n  freebsd: 'ps',\n  netbsd: 'ps',\n  win: 'wmic',\n  linux: 'ps',\n  aix: 'ps',\n};\n\nconst methodToFn: Record<Method, ProcessListFn> = {\n  ps,\n  wmic,\n};\n\nlet platform: string = os.platform();\nif (platform.startsWith('win')) {\n  platform = 'win';\n}\n\nconst method: Method | undefined = platformToMethod[platform as Platform];\n\n/**\n * Gets the list of all the pids of the system.\n */\nconst getAll = (callback: ProcessListCallback): void => {\n  if (method === undefined) {\n    callback(\n      new Error(\n        os.platform() +\n          ' is not supported yet, please open an issue (https://github.com/simonepri/pidtree)'\n      ),\n      undefined\n    );\n    return;\n  }\n\n  const listFn = methodToFn[method];\n  listFn(callback);\n};\n\n/**\n * Get the list of children and grandchildren pids of the given PID.\n * @param PID A PID. If -1 will return all the pids.\n * @param options Optional options object.\n * @param callback Called when the list is ready.\n */\nconst pidtree = <T extends ListOptions | undefined>(\n  PID: number | string,\n  options: T | ListCallback<T> | undefined,\n  callback?: ListCallback<T>\n): void => {\n  let normalizedOptions: ListOptions;\n  let normalizedCallback: ListCallback<T>;\n\n  if (typeof options === 'function') {\n    normalizedCallback = options;\n    normalizedOptions = {};\n  } else {\n    normalizedCallback = callback!;\n    normalizedOptions = typeof options === 'object' ? options : {};\n  }\n\n  const parsedPID = parseInt(String(PID), 10);\n  if (Number.isNaN(parsedPID) || parsedPID < -1) {\n    normalizedCallback(\n      new TypeError('The pid provided is invalid') as Error,\n      undefined\n    );\n    return;\n  }\n\n  getAll((err, processList) => {\n    if (err) {\n      normalizedCallback(err, undefined);\n      return;\n    }\n\n    if (!processList) {\n      normalizedCallback(new Error('Failed to get process list'), undefined);\n      return;\n    }\n\n    // If the user wants the whole list just return it\n    if (parsedPID === -1) {\n      const result = processList.map(([ppid, pid]) =>\n        normalizedOptions.advanced ? { ppid, pid } : pid\n      ) as ResultType<T>;\n\n      normalizedCallback(null, result);\n      return;\n    }\n\n    let root: ProcessInfo | number | undefined;\n    for (let l = 0; l < processList.length; l++) {\n      if (processList[l][1] === parsedPID) {\n        root = normalizedOptions.advanced\n          ? { ppid: processList[l][0], pid: parsedPID }\n          : parsedPID;\n        break;\n      }\n\n      if (processList[l][0] === parsedPID) {\n        root = normalizedOptions.advanced ? { pid: parsedPID } : parsedPID; // Special pids like 0 on *nix\n      }\n    }\n\n    if (root === undefined) {\n      normalizedCallback(new Error('No matching pid found'), undefined);\n      return;\n    }\n\n    // Build the adjacency Hash Map (pid -> [children of pid])\n    const tree: Record<number, number[]> = {};\n    const listCopy = [...processList];\n    while (listCopy.length > 0) {\n      const element = listCopy.pop()!;\n      if (tree[element[0]]) {\n        tree[element[0]].push(element[1]);\n      } else {\n        tree[element[0]] = [element[1]];\n      }\n    }\n\n    // Starting by the PID provided by the user, traverse the tree using the\n    // adjacency Hash Map until the whole subtree is visited.\n    // Each pid encountered while visiting is added to the pids array.\n    let idx = 0;\n    const pids: (ProcessInfo | number)[] = [root];\n    while (idx < pids.length) {\n      const curpid = normalizedOptions.advanced\n        ? (pids[idx++] as ProcessInfo).pid\n        : (pids[idx++] as number);\n      if (!tree[curpid]) continue;\n      const length = tree[curpid].length;\n      for (let j = 0; j < length; j++) {\n        pids.push(\n          normalizedOptions.advanced\n            ? { ppid: curpid, pid: tree[curpid][j] }\n            : tree[curpid][j]\n        );\n      }\n\n      delete tree[curpid];\n    }\n\n    if (!normalizedOptions.root) {\n      pids.shift(); // Remove root\n    }\n\n    normalizedCallback(null, pids as ResultType<T>);\n  });\n};\n\nconst pify = <T extends ListOptions | undefined>(\n  fn: typeof pidtree,\n  arg1: number | string,\n  arg2: T | undefined\n): Promise<ResultType<T>> => {\n  return new Promise((resolve, reject) => {\n    fn(arg1, arg2, (err, data) => {\n      if (err) return reject(err);\n      if (data === undefined) {\n        return reject(new Error('No data returned'));\n      }\n      resolve(data);\n    });\n  });\n};\n\n// Node versions prior to 4.0.0 do not define have `startsWith`.\n/* istanbul ignore if */\nif (!String.prototype.startsWith) {\n  String.prototype.startsWith = function (suffix: string): boolean {\n    return this.substring(0, suffix.length) === suffix;\n  };\n}\n\n/**\n * Get the list of children pids of the given pid.\n * @param pid A PID. If -1 will return all the pids.\n * @param options Optional options object.\n * @param callback Called when the list is ready. If not provided a promise is returned instead.\n * @returns Only when the callback is not provided.\n */\nexport const list = <T extends ListOptions | undefined>(\n  pid: number | string,\n  options?: T | ListCallback<T>,\n  callback?: ListCallback<T>\n): Promise<ResultType<T>> | undefined => {\n  if (typeof options === 'function') {\n    pidtree(pid, undefined, options);\n    return;\n  }\n\n  if (typeof callback === 'function') {\n    pidtree(pid, options, callback);\n    return;\n  }\n\n  return pify(pidtree, pid, options);\n};\n"],"mappings":"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"}