From 51889f6b686023a0d5c2e50ea840ef07892b65b8 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Tue, 25 Jul 2023 10:53:41 -0700 Subject: [PATCH 1/2] Add pidExists --- CHANGELOG.md | 1 + src/Node/ChildProcess.purs | 4 ++++ src/Node/UnsafeChildProcess/Safe.purs | 6 +++++- 3 files changed, 10 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..5cf5709 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,9 @@ pid cp = map toMaybe $ runEffectFn1 pidImpl cp foreign import pidImpl :: EffectFn1 (UnsafeChildProcess) (Nullable Pid) +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 From 5a1af9e52c7bdb1fbd328f623d2be825a2b2033f Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Tue, 25 Jul 2023 11:01:35 -0700 Subject: [PATCH 2/2] Add docs --- src/Node/UnsafeChildProcess/Safe.purs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Node/UnsafeChildProcess/Safe.purs b/src/Node/UnsafeChildProcess/Safe.purs index 5cf5709..541462e 100644 --- a/src/Node/UnsafeChildProcess/Safe.purs +++ b/src/Node/UnsafeChildProcess/Safe.purs @@ -80,6 +80,8 @@ 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