|
| 1 | +module Node.ChildProcess where |
| 2 | + |
| 3 | + import Control.Monad.Eff (Eff()) |
| 4 | + |
| 5 | + import Data.Function (Fn0(), Fn1(), Fn2()) |
| 6 | + |
| 7 | + import Node.ChildProcess.Signal (Signal(..)) |
| 8 | + import Node.Events (Event(..), EventEmitter) |
| 9 | + |
| 10 | + foreign import data Handle :: * |
| 11 | + foreign import data Spawn :: ! |
| 12 | + foreign import data Stream :: ! -> * |
| 13 | + foreign import data Stderr :: ! |
| 14 | + foreign import data Stdin :: ! |
| 15 | + foreign import data Stdout :: ! |
| 16 | + |
| 17 | + newtype ChildProcess = ChildProcess ChildProcessRec |
| 18 | + |
| 19 | + type ChildProcessRec = |
| 20 | + { stderr :: Stream Stderr |
| 21 | + , stdin :: Stream Stdin |
| 22 | + , stdout :: Stream Stdout |
| 23 | + , pid :: Number |
| 24 | + , connected :: Boolean |
| 25 | + , kill :: forall eff. Fn1 Signal Boolean |
| 26 | + , send :: forall eff r. Fn2 { | r} Handle (Eff eff Unit) |
| 27 | + , disconnect :: forall eff. Fn0 (Eff eff Unit) |
| 28 | + } |
| 29 | + |
| 30 | + type SpawnOptions = |
| 31 | + { cwd :: String |
| 32 | + , stdio :: [String] |
| 33 | + , env :: forall r. { | r} |
| 34 | + , detached :: Boolean |
| 35 | + , uid :: Number |
| 36 | + , gid :: Number |
| 37 | + } |
| 38 | + |
| 39 | + instance eventEmitterStreamStderr :: EventEmitter (Stream Stderr) |
| 40 | + instance eventEmitterStreamStdin :: EventEmitter (Stream Stdin) |
| 41 | + instance eventEmitterStreamStdout :: EventEmitter (Stream Stdout) |
| 42 | + |
| 43 | + instance eventEmitterChildProcess :: EventEmitter ChildProcess |
| 44 | + |
| 45 | + closeEvent :: Event |
| 46 | + closeEvent = Event "close" |
| 47 | + |
| 48 | + disconnectEvent :: Event |
| 49 | + disconnectEvent = Event "disconnect" |
| 50 | + |
| 51 | + errorEvent :: Event |
| 52 | + errorEvent = Event "error" |
| 53 | + |
| 54 | + exitEvent :: Event |
| 55 | + exitEvent = Event "exit" |
| 56 | + |
| 57 | + messageEvent :: Event |
| 58 | + messageEvent = Event "message" |
| 59 | + |
| 60 | + foreign import spawn |
| 61 | + "function spawn(command) {\ |
| 62 | + \ return function(args) {\ |
| 63 | + \ return function(opts) {\ |
| 64 | + \ return function() {\ |
| 65 | + \ return require('child_process').spawn(command, args, opts);\ |
| 66 | + \ }\ |
| 67 | + \ }\ |
| 68 | + \ }\ |
| 69 | + \}" :: forall eff. String -> [String] -> SpawnOptions -> Eff (spawn :: Spawn | eff) ChildProcess |
| 70 | + |
| 71 | + defaultSpawnOptions :: SpawnOptions |
| 72 | + defaultSpawnOptions = |
| 73 | + { cwd: undefined |
| 74 | + , stdio: ["pipe", "pipe", "pipe"] |
| 75 | + , env: process.env |
| 76 | + , detached: false |
| 77 | + , uid: undefined |
| 78 | + , gid: undefined |
| 79 | + } |
| 80 | + |
| 81 | + -- There's gotta be a better way. |
| 82 | + foreign import undefined :: forall a. a |
| 83 | + foreign import process :: forall r. {env :: { | r}} |
0 commit comments