From 320afb1c58b43244b9d2138acfa61cf2e90ecb98 Mon Sep 17 00:00:00 2001 From: JordanMartinez Date: Tue, 25 Jul 2023 11:07:11 -0700 Subject: [PATCH] Add pidExists (#53) * Add pidExists --- CHANGELOG.md | 1 + src/Node/ChildProcess.purs | 4 ++++ src/Node/UnsafeChildProcess/Safe.purs | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c00eb9c..19a77b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Breaking changes: New features: - Added `fromKillSignal` (#51 by @JordanMartinez) +- Added `pidExists` (#52 by @JordanMartinez) Other improvements: - Fix regression: add `ref`/`unref` APIs that were dropped in `v10.0.0` (#50 by @JordanMartinez) diff --git a/src/Node/ChildProcess.purs b/src/Node/ChildProcess.purs index ac93ee4..211d47a 100644 --- a/src/Node/ChildProcess.purs +++ b/src/Node/ChildProcess.purs @@ -44,6 +44,7 @@ module Node.ChildProcess , stdout , stderr , pid + , pidExists , connected , disconnect , exitCode @@ -158,6 +159,9 @@ stderr = toUnsafeChildProcess >>> UnsafeCP.unsafeStderr >>> unsafeFromNull pid :: ChildProcess -> Effect (Maybe Pid) pid = unsafeCoerce SafeCP.pid +pidExists :: ChildProcess -> Effect Boolean +pidExists = unsafeCoerce SafeCP.pidExists + -- | Indicates whether it is still possible to send and receive -- | messages from the child process. connected :: ChildProcess -> Effect Boolean diff --git a/src/Node/UnsafeChildProcess/Safe.purs b/src/Node/UnsafeChildProcess/Safe.purs index 555b1c1..541462e 100644 --- a/src/Node/UnsafeChildProcess/Safe.purs +++ b/src/Node/UnsafeChildProcess/Safe.purs @@ -10,6 +10,7 @@ module Node.UnsafeChildProcess.Safe , messageH , spawnH , pid + , pidExists , connected , disconnect , exitCode @@ -36,7 +37,7 @@ import Data.Posix.Signal as Signal import Effect (Effect) import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, mkEffectFn2, runEffectFn1, runEffectFn2) import Foreign (Foreign) -import Node.ChildProcess.Types (Exit(..), Handle, KillSignal, StdIO, UnsafeChildProcess, ipc, pipe, stringSignal) +import Node.ChildProcess.Types (Exit(..), Handle, KillSignal, StdIO, UnsafeChildProcess, intSignal, ipc, pipe, stringSignal) import Node.Errors.SystemError (SystemError) import Node.EventEmitter (EventEmitter, EventHandle(..)) import Node.EventEmitter.UtilTypes (EventHandle0, EventHandle1) @@ -79,6 +80,11 @@ pid cp = map toMaybe $ runEffectFn1 pidImpl cp foreign import pidImpl :: EffectFn1 (UnsafeChildProcess) (Nullable Pid) +-- | Note: this will not work if the user does not have permission to kill +-- | a `PID`. Uses `cp.kill(0)` underneath. +pidExists :: UnsafeChildProcess -> Effect Boolean +pidExists cp = kill' (intSignal 0) cp + -- | Indicates whether it is still possible to send and receive -- | messages from the child process. connected :: UnsafeChildProcess -> Effect Boolean