@effect/platform-node-shared 0.57.0 → 4.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/NodeChildProcessSpawner.d.ts +37 -0
- package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
- package/dist/NodeChildProcessSpawner.js +567 -0
- package/dist/NodeChildProcessSpawner.js.map +1 -0
- package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +4 -7
- package/dist/NodeClusterSocket.d.ts.map +1 -0
- package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +9 -10
- package/dist/NodeClusterSocket.js.map +1 -0
- package/dist/NodeFileSystem.d.ts +8 -0
- package/dist/NodeFileSystem.d.ts.map +1 -0
- package/dist/{esm/internal/fileSystem.js → NodeFileSystem.js} +125 -96
- package/dist/NodeFileSystem.js.map +1 -0
- package/dist/NodePath.d.ts +18 -0
- package/dist/NodePath.d.ts.map +1 -0
- package/dist/NodePath.js +56 -0
- package/dist/NodePath.js.map +1 -0
- package/dist/NodeRuntime.d.ts +28 -0
- package/dist/NodeRuntime.d.ts.map +1 -0
- package/dist/{esm/internal/runtime.js → NodeRuntime.js} +8 -8
- package/dist/NodeRuntime.js.map +1 -0
- package/dist/NodeSink.d.ts +40 -0
- package/dist/NodeSink.d.ts.map +1 -0
- package/dist/NodeSink.js +50 -0
- package/dist/NodeSink.js.map +1 -0
- package/dist/{dts/NodeSocket.d.ts → NodeSocket.d.ts} +10 -10
- package/dist/NodeSocket.d.ts.map +1 -0
- package/dist/{esm/NodeSocket.js → NodeSocket.js} +51 -39
- package/dist/NodeSocket.js.map +1 -0
- package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +8 -10
- package/dist/NodeSocketServer.d.ts.map +1 -0
- package/dist/NodeSocketServer.js +192 -0
- package/dist/NodeSocketServer.js.map +1 -0
- package/dist/NodeStdio.d.ts +11 -0
- package/dist/NodeStdio.d.ts.map +1 -0
- package/dist/NodeStdio.js +43 -0
- package/dist/NodeStdio.js.map +1 -0
- package/dist/NodeStream.d.ts +127 -0
- package/dist/NodeStream.d.ts.map +1 -0
- package/dist/NodeStream.js +249 -0
- package/dist/NodeStream.js.map +1 -0
- package/dist/NodeTerminal.d.ts +15 -0
- package/dist/NodeTerminal.d.ts.map +1 -0
- package/dist/{esm/internal/terminal.js → NodeTerminal.js} +28 -21
- package/dist/NodeTerminal.js.map +1 -0
- package/dist/internal/utils.d.ts +2 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/{esm/internal/error.js → internal/utils.js} +4 -5
- package/dist/internal/utils.js.map +1 -0
- package/package.json +53 -124
- package/src/NodeChildProcessSpawner.ts +713 -0
- package/src/NodeClusterSocket.ts +12 -13
- package/src/NodeFileSystem.ts +632 -5
- package/src/NodePath.ts +48 -9
- package/src/NodeRuntime.ts +53 -4
- package/src/NodeSink.ts +65 -62
- package/src/NodeSocket.ts +65 -49
- package/src/NodeSocketServer.ts +108 -88
- package/src/NodeStdio.ts +49 -0
- package/src/NodeStream.ts +324 -83
- package/src/NodeTerminal.ts +100 -9
- package/src/internal/{error.ts → utils.ts} +6 -7
- package/NodeClusterSocket/package.json +0 -6
- package/NodeCommandExecutor/package.json +0 -6
- package/NodeFileSystem/ParcelWatcher/package.json +0 -6
- package/NodeFileSystem/package.json +0 -6
- package/NodeKeyValueStore/package.json +0 -6
- package/NodeMultipart/package.json +0 -6
- package/NodePath/package.json +0 -6
- package/NodeRuntime/package.json +0 -6
- package/NodeSink/package.json +0 -6
- package/NodeSocket/package.json +0 -6
- package/NodeSocketServer/package.json +0 -6
- package/NodeStream/package.json +0 -6
- package/NodeTerminal/package.json +0 -6
- package/dist/cjs/NodeClusterSocket.js +0 -50
- package/dist/cjs/NodeClusterSocket.js.map +0 -1
- package/dist/cjs/NodeCommandExecutor.js +0 -14
- package/dist/cjs/NodeCommandExecutor.js.map +0 -1
- package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -20
- package/dist/cjs/NodeFileSystem/ParcelWatcher.js.map +0 -1
- package/dist/cjs/NodeFileSystem.js +0 -18
- package/dist/cjs/NodeFileSystem.js.map +0 -1
- package/dist/cjs/NodeKeyValueStore.js +0 -18
- package/dist/cjs/NodeKeyValueStore.js.map +0 -1
- package/dist/cjs/NodeMultipart.js +0 -24
- package/dist/cjs/NodeMultipart.js.map +0 -1
- package/dist/cjs/NodePath.js +0 -28
- package/dist/cjs/NodePath.js.map +0 -1
- package/dist/cjs/NodeRuntime.js +0 -14
- package/dist/cjs/NodeRuntime.js.map +0 -1
- package/dist/cjs/NodeSink.js +0 -50
- package/dist/cjs/NodeSink.js.map +0 -1
- package/dist/cjs/NodeSocket.js +0 -153
- package/dist/cjs/NodeSocket.js.map +0 -1
- package/dist/cjs/NodeSocketServer.js +0 -178
- package/dist/cjs/NodeSocketServer.js.map +0 -1
- package/dist/cjs/NodeStream.js +0 -76
- package/dist/cjs/NodeStream.js.map +0 -1
- package/dist/cjs/NodeTerminal.js +0 -19
- package/dist/cjs/NodeTerminal.js.map +0 -1
- package/dist/cjs/internal/commandExecutor.js +0 -153
- package/dist/cjs/internal/commandExecutor.js.map +0 -1
- package/dist/cjs/internal/error.js +0 -45
- package/dist/cjs/internal/error.js.map +0 -1
- package/dist/cjs/internal/fileSystem/parcelWatcher.js +0 -68
- package/dist/cjs/internal/fileSystem/parcelWatcher.js.map +0 -1
- package/dist/cjs/internal/fileSystem.js +0 -400
- package/dist/cjs/internal/fileSystem.js.map +0 -1
- package/dist/cjs/internal/multipart.js +0 -147
- package/dist/cjs/internal/multipart.js.map +0 -1
- package/dist/cjs/internal/path.js +0 -53
- package/dist/cjs/internal/path.js.map +0 -1
- package/dist/cjs/internal/runtime.js +0 -37
- package/dist/cjs/internal/runtime.js.map +0 -1
- package/dist/cjs/internal/sink.js +0 -28
- package/dist/cjs/internal/sink.js.map +0 -1
- package/dist/cjs/internal/stream.js +0 -233
- package/dist/cjs/internal/stream.js.map +0 -1
- package/dist/cjs/internal/terminal.js +0 -86
- package/dist/cjs/internal/terminal.js.map +0 -1
- package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
- package/dist/dts/NodeCommandExecutor.d.ts +0 -12
- package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -13
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem.d.ts +0 -11
- package/dist/dts/NodeFileSystem.d.ts.map +0 -1
- package/dist/dts/NodeKeyValueStore.d.ts +0 -12
- package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
- package/dist/dts/NodeMultipart.d.ts +0 -27
- package/dist/dts/NodeMultipart.d.ts.map +0 -1
- package/dist/dts/NodePath.d.ts +0 -21
- package/dist/dts/NodePath.d.ts.map +0 -1
- package/dist/dts/NodeRuntime.d.ts +0 -10
- package/dist/dts/NodeRuntime.d.ts.map +0 -1
- package/dist/dts/NodeSink.d.ts +0 -36
- package/dist/dts/NodeSink.d.ts.map +0 -1
- package/dist/dts/NodeSocket.d.ts.map +0 -1
- package/dist/dts/NodeSocketServer.d.ts.map +0 -1
- package/dist/dts/NodeStream.d.ts +0 -119
- package/dist/dts/NodeStream.d.ts.map +0 -1
- package/dist/dts/NodeTerminal.d.ts +0 -18
- package/dist/dts/NodeTerminal.d.ts.map +0 -1
- package/dist/dts/internal/commandExecutor.d.ts +0 -2
- package/dist/dts/internal/commandExecutor.d.ts.map +0 -1
- package/dist/dts/internal/error.d.ts +0 -2
- package/dist/dts/internal/error.d.ts.map +0 -1
- package/dist/dts/internal/fileSystem/parcelWatcher.d.ts +0 -4
- package/dist/dts/internal/fileSystem/parcelWatcher.d.ts.map +0 -1
- package/dist/dts/internal/fileSystem.d.ts +0 -2
- package/dist/dts/internal/fileSystem.d.ts.map +0 -1
- package/dist/dts/internal/multipart.d.ts +0 -2
- package/dist/dts/internal/multipart.d.ts.map +0 -1
- package/dist/dts/internal/path.d.ts +0 -2
- package/dist/dts/internal/path.d.ts.map +0 -1
- package/dist/dts/internal/runtime.d.ts +0 -2
- package/dist/dts/internal/runtime.d.ts.map +0 -1
- package/dist/dts/internal/sink.d.ts +0 -2
- package/dist/dts/internal/sink.d.ts.map +0 -1
- package/dist/dts/internal/stream.d.ts +0 -2
- package/dist/dts/internal/stream.d.ts.map +0 -1
- package/dist/dts/internal/terminal.d.ts +0 -2
- package/dist/dts/internal/terminal.d.ts.map +0 -1
- package/dist/esm/NodeClusterSocket.js.map +0 -1
- package/dist/esm/NodeCommandExecutor.js +0 -7
- package/dist/esm/NodeCommandExecutor.js.map +0 -1
- package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -12
- package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
- package/dist/esm/NodeFileSystem.js +0 -10
- package/dist/esm/NodeFileSystem.js.map +0 -1
- package/dist/esm/NodeKeyValueStore.js +0 -10
- package/dist/esm/NodeKeyValueStore.js.map +0 -1
- package/dist/esm/NodeMultipart.js +0 -17
- package/dist/esm/NodeMultipart.js.map +0 -1
- package/dist/esm/NodePath.js +0 -20
- package/dist/esm/NodePath.js.map +0 -1
- package/dist/esm/NodeRuntime.js +0 -7
- package/dist/esm/NodeRuntime.js.map +0 -1
- package/dist/esm/NodeSink.js +0 -43
- package/dist/esm/NodeSink.js.map +0 -1
- package/dist/esm/NodeSocket.js.map +0 -1
- package/dist/esm/NodeSocketServer.js +0 -167
- package/dist/esm/NodeSocketServer.js.map +0 -1
- package/dist/esm/NodeStream.js +0 -69
- package/dist/esm/NodeStream.js.map +0 -1
- package/dist/esm/NodeTerminal.js +0 -12
- package/dist/esm/NodeTerminal.js.map +0 -1
- package/dist/esm/internal/commandExecutor.js +0 -146
- package/dist/esm/internal/commandExecutor.js.map +0 -1
- package/dist/esm/internal/error.js.map +0 -1
- package/dist/esm/internal/fileSystem/parcelWatcher.js +0 -61
- package/dist/esm/internal/fileSystem/parcelWatcher.js.map +0 -1
- package/dist/esm/internal/fileSystem.js.map +0 -1
- package/dist/esm/internal/multipart.js +0 -137
- package/dist/esm/internal/multipart.js.map +0 -1
- package/dist/esm/internal/path.js +0 -46
- package/dist/esm/internal/path.js.map +0 -1
- package/dist/esm/internal/runtime.js.map +0 -1
- package/dist/esm/internal/sink.js +0 -19
- package/dist/esm/internal/sink.js.map +0 -1
- package/dist/esm/internal/stream.js +0 -217
- package/dist/esm/internal/stream.js.map +0 -1
- package/dist/esm/internal/terminal.js.map +0 -1
- package/dist/esm/package.json +0 -4
- package/src/NodeCommandExecutor.ts +0 -13
- package/src/NodeFileSystem/ParcelWatcher.ts +0 -15
- package/src/NodeKeyValueStore.ts +0 -20
- package/src/NodeMultipart.ts +0 -40
- package/src/internal/commandExecutor.ts +0 -251
- package/src/internal/fileSystem/parcelWatcher.ts +0 -64
- package/src/internal/fileSystem.ts +0 -648
- package/src/internal/multipart.ts +0 -141
- package/src/internal/path.ts +0 -63
- package/src/internal/runtime.ts +0 -34
- package/src/internal/sink.ts +0 -57
- package/src/internal/stream.ts +0 -375
- package/src/internal/terminal.ts +0 -100
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# `@effect/platform-node
|
|
1
|
+
# `@effect/platform-node`
|
|
2
2
|
|
|
3
|
-
Provides
|
|
3
|
+
Provides Node.js-specific implementations for the abstractions defined in [`@effect/platform`](https://github.com/Effect-TS/effect/tree/main/packages/platform), allowing you to write platform-independent code that integrates smoothly with Node.js.
|
|
4
4
|
|
|
5
5
|
## Documentation
|
|
6
6
|
|
|
7
|
-
- **API Reference**: [View the full documentation](https://effect-ts.github.io/effect/docs/platform-node
|
|
7
|
+
- **API Reference**: [View the full documentation](https://effect-ts.github.io/effect/docs/platform-node).
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js implementation of `ChildProcessSpawner`.
|
|
3
|
+
*
|
|
4
|
+
* @since 4.0.0
|
|
5
|
+
*/
|
|
6
|
+
import type * as Arr from "effect/Array";
|
|
7
|
+
import * as FileSystem from "effect/FileSystem";
|
|
8
|
+
import * as Layer from "effect/Layer";
|
|
9
|
+
import * as Path from "effect/Path";
|
|
10
|
+
import * as ChildProcess from "effect/unstable/process/ChildProcess";
|
|
11
|
+
import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
|
|
12
|
+
/**
|
|
13
|
+
* Layer providing the `NodeChildProcessSpawner` implementation.
|
|
14
|
+
*
|
|
15
|
+
* @since 4.0.0
|
|
16
|
+
* @category Layers
|
|
17
|
+
*/
|
|
18
|
+
export declare const layer: Layer.Layer<ChildProcessSpawner, never, FileSystem.FileSystem | Path.Path>;
|
|
19
|
+
/**
|
|
20
|
+
* Result of flattening a pipeline of commands.
|
|
21
|
+
*
|
|
22
|
+
* @since 4.0.0
|
|
23
|
+
* @category Models
|
|
24
|
+
*/
|
|
25
|
+
export interface FlattenedPipeline {
|
|
26
|
+
readonly commands: Arr.NonEmptyReadonlyArray<ChildProcess.StandardCommand>;
|
|
27
|
+
readonly pipeOptions: ReadonlyArray<ChildProcess.PipeOptions>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Flattens a `Command` into an array of `StandardCommand`s along with pipe
|
|
31
|
+
* options for each connection.
|
|
32
|
+
*
|
|
33
|
+
* @since 4.0.0
|
|
34
|
+
* @category Utilities
|
|
35
|
+
*/
|
|
36
|
+
export declare const flattenCommand: (command: ChildProcess.Command) => FlattenedPipeline;
|
|
37
|
+
//# sourceMappingURL=NodeChildProcessSpawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeChildProcessSpawner.d.ts","sourceRoot":"","sources":["../src/NodeChildProcessSpawner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAMnC,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAmC,MAAM,6CAA6C,CAAA;AA6mBlH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,mBAAmB,EACnB,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CACQ,CAAA;AAM3C;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,qBAAqB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;IAC1E,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;CAC9D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GACzB,SAAS,YAAY,CAAC,OAAO,KAC5B,iBAoCF,CAAA"}
|
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import * as Deferred from "effect/Deferred";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Exit from "effect/Exit";
|
|
4
|
+
import * as FileSystem from "effect/FileSystem";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import * as Path from "effect/Path";
|
|
7
|
+
import * as Predicate from "effect/Predicate";
|
|
8
|
+
import * as Sink from "effect/Sink";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
10
|
+
import * as ChildProcess from "effect/unstable/process/ChildProcess";
|
|
11
|
+
import { ChildProcessSpawner, ExitCode, makeHandle, ProcessId } from "effect/unstable/process/ChildProcessSpawner";
|
|
12
|
+
import * as NodeChildProcess from "node:child_process";
|
|
13
|
+
import * as NodeJSStream from "node:stream";
|
|
14
|
+
import { handleErrnoException } from "./internal/utils.js";
|
|
15
|
+
import * as NodeSink from "./NodeSink.js";
|
|
16
|
+
import * as NodeStream from "./NodeStream.js";
|
|
17
|
+
const toError = error => error instanceof globalThis.Error ? error : new globalThis.Error(String(error));
|
|
18
|
+
const toPlatformError = (method, error, command) => {
|
|
19
|
+
const {
|
|
20
|
+
commands
|
|
21
|
+
} = flattenCommand(command);
|
|
22
|
+
const commandStr = commands.reduce((acc, curr) => {
|
|
23
|
+
const cmd = `${curr.command} ${curr.args.join(" ")}`;
|
|
24
|
+
return acc.length === 0 ? cmd : `${acc} | ${cmd}`;
|
|
25
|
+
}, "");
|
|
26
|
+
return handleErrnoException("ChildProcess", method)(error, [commandStr]);
|
|
27
|
+
};
|
|
28
|
+
const make = /*#__PURE__*/Effect.gen(function* () {
|
|
29
|
+
const fs = yield* FileSystem.FileSystem;
|
|
30
|
+
const path = yield* Path.Path;
|
|
31
|
+
const resolveWorkingDirectory = Effect.fnUntraced(function* (options) {
|
|
32
|
+
if (Predicate.isUndefined(options.cwd)) return undefined;
|
|
33
|
+
// Validate that the specified directory is accessible
|
|
34
|
+
yield* fs.access(options.cwd);
|
|
35
|
+
return path.resolve(options.cwd);
|
|
36
|
+
});
|
|
37
|
+
const resolveEnvironment = options => {
|
|
38
|
+
return options.extendEnv ? {
|
|
39
|
+
...globalThis.process.env,
|
|
40
|
+
...options.env
|
|
41
|
+
} : options.env;
|
|
42
|
+
};
|
|
43
|
+
const inputToStdioOption = input => Stream.isStream(input) ? "pipe" : input;
|
|
44
|
+
const outputToStdioOption = input => Sink.isSink(input) ? "pipe" : input;
|
|
45
|
+
const resolveStdinOption = options => {
|
|
46
|
+
const defaultConfig = {
|
|
47
|
+
stream: "pipe",
|
|
48
|
+
encoding: "utf-8",
|
|
49
|
+
endOnDone: true
|
|
50
|
+
};
|
|
51
|
+
if (Predicate.isUndefined(options.stdin)) {
|
|
52
|
+
return defaultConfig;
|
|
53
|
+
}
|
|
54
|
+
if (typeof options.stdin === "string") {
|
|
55
|
+
return {
|
|
56
|
+
...defaultConfig,
|
|
57
|
+
stream: options.stdin
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (Stream.isStream(options.stdin)) {
|
|
61
|
+
return {
|
|
62
|
+
...defaultConfig,
|
|
63
|
+
stream: options.stdin
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
stream: options.stdin.stream,
|
|
68
|
+
encoding: options.stdin.encoding ?? defaultConfig.encoding,
|
|
69
|
+
endOnDone: options.stdin.endOnDone ?? defaultConfig.endOnDone
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
const resolveOutputOption = (options, streamName) => {
|
|
73
|
+
const option = options[streamName];
|
|
74
|
+
if (Predicate.isUndefined(option)) {
|
|
75
|
+
return {
|
|
76
|
+
stream: "pipe"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (typeof option === "string") {
|
|
80
|
+
return {
|
|
81
|
+
stream: option
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (Sink.isSink(option)) {
|
|
85
|
+
return {
|
|
86
|
+
stream: option
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
stream: option.stream
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
const resolveAdditionalFds = options => {
|
|
94
|
+
if (Predicate.isUndefined(options.additionalFds)) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
const result = [];
|
|
98
|
+
for (const [name, config] of Object.entries(options.additionalFds)) {
|
|
99
|
+
const fd = ChildProcess.parseFdName(name);
|
|
100
|
+
if (Predicate.isNotUndefined(fd)) {
|
|
101
|
+
result.push({
|
|
102
|
+
fd,
|
|
103
|
+
config
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Sort by fd number to ensure correct ordering
|
|
108
|
+
return result.sort((a, b) => a.fd - b.fd);
|
|
109
|
+
};
|
|
110
|
+
const buildStdioArray = (stdinConfig, stdoutConfig, stderrConfig, additionalFds) => {
|
|
111
|
+
const stdio = [inputToStdioOption(stdinConfig.stream), outputToStdioOption(stdoutConfig.stream), outputToStdioOption(stderrConfig.stream)];
|
|
112
|
+
if (additionalFds.length === 0) {
|
|
113
|
+
return stdio;
|
|
114
|
+
}
|
|
115
|
+
// Find the maximum fd number to size the array correctly
|
|
116
|
+
const maxFd = additionalFds.reduce((max, {
|
|
117
|
+
fd
|
|
118
|
+
}) => Math.max(max, fd), 2);
|
|
119
|
+
// Fill gaps with "ignore"
|
|
120
|
+
for (let i = 3; i <= maxFd; i++) {
|
|
121
|
+
stdio[i] = "ignore";
|
|
122
|
+
}
|
|
123
|
+
// Set up additional fds as "pipe"
|
|
124
|
+
for (const {
|
|
125
|
+
fd
|
|
126
|
+
} of additionalFds) {
|
|
127
|
+
stdio[fd] = "pipe";
|
|
128
|
+
}
|
|
129
|
+
return stdio;
|
|
130
|
+
};
|
|
131
|
+
const setupAdditionalFds = Effect.fnUntraced(function* (command, childProcess, additionalFds) {
|
|
132
|
+
if (additionalFds.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
getInputFd: () => Sink.drain,
|
|
135
|
+
getOutputFd: () => Stream.empty
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const inputSinks = new Map();
|
|
139
|
+
const outputStreams = new Map();
|
|
140
|
+
for (const {
|
|
141
|
+
config,
|
|
142
|
+
fd
|
|
143
|
+
} of additionalFds) {
|
|
144
|
+
const nodeStream = childProcess.stdio[fd];
|
|
145
|
+
switch (config.type) {
|
|
146
|
+
case "input":
|
|
147
|
+
{
|
|
148
|
+
// Create a sink to write to for input file descriptors
|
|
149
|
+
let sink = Sink.drain;
|
|
150
|
+
if (Predicate.isNotNullish(nodeStream) && "write" in nodeStream) {
|
|
151
|
+
sink = NodeSink.fromWritable({
|
|
152
|
+
evaluate: () => nodeStream,
|
|
153
|
+
onError: error => toPlatformError(`fromWritable(fd${fd})`, toError(error), command)
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// If user provided a stream, pipe it into the sink
|
|
157
|
+
if (Predicate.isNotUndefined(config.stream)) {
|
|
158
|
+
yield* Effect.forkScoped(Stream.run(config.stream, sink));
|
|
159
|
+
}
|
|
160
|
+
inputSinks.set(fd, sink);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case "output":
|
|
164
|
+
{
|
|
165
|
+
// Create a stream to read from for output file descriptors
|
|
166
|
+
let stream = Stream.empty;
|
|
167
|
+
if (Predicate.isNotNull(nodeStream) && Predicate.isNotUndefined(nodeStream) && "read" in nodeStream) {
|
|
168
|
+
stream = NodeStream.fromReadable({
|
|
169
|
+
evaluate: () => nodeStream,
|
|
170
|
+
onError: error => toPlatformError(`fromReadable(fd${fd})`, toError(error), command)
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// If user provided a sink, transduce the stream through it
|
|
174
|
+
if (Predicate.isNotUndefined(config.sink)) {
|
|
175
|
+
stream = Stream.transduce(stream, config.sink);
|
|
176
|
+
}
|
|
177
|
+
outputStreams.set(fd, stream);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
getInputFd: fd => inputSinks.get(fd) ?? Sink.drain,
|
|
184
|
+
getOutputFd: fd => outputStreams.get(fd) ?? Stream.empty
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
const setupChildStdin = (command, childProcess, config) => Effect.suspend(() => {
|
|
188
|
+
// If the child process has a standard input stream, connect it to the
|
|
189
|
+
// sink that will attached to the process handle
|
|
190
|
+
let sink = Sink.drain;
|
|
191
|
+
if (Predicate.isNotNull(childProcess.stdin)) {
|
|
192
|
+
sink = NodeSink.fromWritable({
|
|
193
|
+
evaluate: () => childProcess.stdin,
|
|
194
|
+
onError: error => toPlatformError("fromWritable(stdin)", toError(error), command),
|
|
195
|
+
endOnDone: config.endOnDone,
|
|
196
|
+
encoding: config.encoding
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// If the user provided a `Stream`, run it into the stdin sink
|
|
200
|
+
if (Stream.isStream(config.stream)) {
|
|
201
|
+
return Effect.as(Effect.forkScoped(Stream.run(config.stream, sink)), sink);
|
|
202
|
+
}
|
|
203
|
+
return Effect.succeed(sink);
|
|
204
|
+
});
|
|
205
|
+
/**
|
|
206
|
+
* Given that `NodeStream.fromReadable` uses `.read` to read data from the
|
|
207
|
+
* provided `Readable` stream, consumers would race to read data from the
|
|
208
|
+
* `handle.stdout` and `handle.stderr` streams if they were also simultaneously
|
|
209
|
+
* reading from the `handle.all` stream.
|
|
210
|
+
*
|
|
211
|
+
* To solve this, we leverage the fact that NodeJS `Readable` streams can be
|
|
212
|
+
* piped to multiple destinations simultaneously. The logic for the solution
|
|
213
|
+
* is as follows:
|
|
214
|
+
*
|
|
215
|
+
* 1. Pipe each original stream to two `PassThrough` streams:
|
|
216
|
+
* - One dedicated PassThrough for individual access (.stdout / .stderr)
|
|
217
|
+
* - One shared PassThrough for combined access (.all)
|
|
218
|
+
* 2. Create Effect streams from the PassThrough streams (not the originals)
|
|
219
|
+
*
|
|
220
|
+
* **Diagram**
|
|
221
|
+
*
|
|
222
|
+
* ┌─────────────┐
|
|
223
|
+
* ┌────►│ passthrough │────► Effect stdout Stream
|
|
224
|
+
* │ └─────────────┘
|
|
225
|
+
* childProcess.stdout ────┤
|
|
226
|
+
* │ ┌─────────────┐
|
|
227
|
+
* └────►│ passthrough │────► Effect all Stream
|
|
228
|
+
* ┌────►│ │
|
|
229
|
+
* childProcess.stderr ────┤ └─────────────┘
|
|
230
|
+
* │ ┌─────────────┐
|
|
231
|
+
* └────►│ passthrough │────► Effect stderr Stream
|
|
232
|
+
* └─────────────┘
|
|
233
|
+
*/
|
|
234
|
+
const setupChildOutputStreams = (command, childProcess, stdoutConfig, stderrConfig) => {
|
|
235
|
+
const nodeStdout = childProcess.stdout;
|
|
236
|
+
const nodeStderr = childProcess.stderr;
|
|
237
|
+
// Create PassThrough streams for individual access to stdout and stderr.
|
|
238
|
+
// We pipe the original Node.js streams to these PassThroughs so that
|
|
239
|
+
// the data can be consumed by both the individual streams AND the
|
|
240
|
+
// combined stream (.all) simultaneously.
|
|
241
|
+
const stdoutPassThrough = Predicate.isNotNull(nodeStdout) ? new NodeJSStream.PassThrough() : null;
|
|
242
|
+
const stderrPassThrough = Predicate.isNotNull(nodeStderr) ? new NodeJSStream.PassThrough() : null;
|
|
243
|
+
// Create PassThrough for combined output (.all)
|
|
244
|
+
const combinedPassThrough = new NodeJSStream.PassThrough();
|
|
245
|
+
// Track stream endings for the combined stream
|
|
246
|
+
const totalStreams = (Predicate.isNotNull(nodeStdout) ? 1 : 0) + (Predicate.isNotNull(nodeStderr) ? 1 : 0);
|
|
247
|
+
let endedCount = 0;
|
|
248
|
+
const onStreamEnd = () => {
|
|
249
|
+
endedCount++;
|
|
250
|
+
if (endedCount >= totalStreams) {
|
|
251
|
+
combinedPassThrough.end();
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
// Pipe stdout to both its own PassThrough and the combined PassThrough
|
|
255
|
+
if (Predicate.isNotNull(nodeStdout) && Predicate.isNotNull(stdoutPassThrough)) {
|
|
256
|
+
nodeStdout.pipe(stdoutPassThrough);
|
|
257
|
+
nodeStdout.pipe(combinedPassThrough, {
|
|
258
|
+
end: false
|
|
259
|
+
});
|
|
260
|
+
nodeStdout.once("end", onStreamEnd);
|
|
261
|
+
}
|
|
262
|
+
// Pipe stderr to both its own PassThrough and the combined PassThrough
|
|
263
|
+
if (Predicate.isNotNull(nodeStderr) && Predicate.isNotNull(stderrPassThrough)) {
|
|
264
|
+
nodeStderr.pipe(stderrPassThrough);
|
|
265
|
+
nodeStderr.pipe(combinedPassThrough, {
|
|
266
|
+
end: false
|
|
267
|
+
});
|
|
268
|
+
nodeStderr.once("end", onStreamEnd);
|
|
269
|
+
}
|
|
270
|
+
// Handle edge case: no streams available
|
|
271
|
+
if (totalStreams === 0) {
|
|
272
|
+
combinedPassThrough.end();
|
|
273
|
+
}
|
|
274
|
+
// Create Effect stream for stdout from its PassThrough
|
|
275
|
+
let stdout = Stream.empty;
|
|
276
|
+
if (Predicate.isNotNull(stdoutPassThrough)) {
|
|
277
|
+
stdout = NodeStream.fromReadable({
|
|
278
|
+
evaluate: () => stdoutPassThrough,
|
|
279
|
+
onError: error => toPlatformError("fromReadable(stdout)", toError(error), command)
|
|
280
|
+
});
|
|
281
|
+
// Apply user-provided Sink if configured
|
|
282
|
+
if (Sink.isSink(stdoutConfig.stream)) {
|
|
283
|
+
stdout = Stream.transduce(stdout, stdoutConfig.stream);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Create Effect stream for stderr from its PassThrough
|
|
287
|
+
let stderr = Stream.empty;
|
|
288
|
+
if (Predicate.isNotNull(stderrPassThrough)) {
|
|
289
|
+
stderr = NodeStream.fromReadable({
|
|
290
|
+
evaluate: () => stderrPassThrough,
|
|
291
|
+
onError: error => toPlatformError("fromReadable(stderr)", toError(error), command)
|
|
292
|
+
});
|
|
293
|
+
// Apply user-provided Sink if configured
|
|
294
|
+
if (Sink.isSink(stderrConfig.stream)) {
|
|
295
|
+
stderr = Stream.transduce(stderr, stderrConfig.stream);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Create Effect stream for combined output from the combined PassThrough
|
|
299
|
+
const all = NodeStream.fromReadable({
|
|
300
|
+
evaluate: () => combinedPassThrough,
|
|
301
|
+
onError: error => toPlatformError("fromReadable(all)", toError(error), command)
|
|
302
|
+
});
|
|
303
|
+
return {
|
|
304
|
+
stdout,
|
|
305
|
+
stderr,
|
|
306
|
+
all
|
|
307
|
+
};
|
|
308
|
+
};
|
|
309
|
+
const spawn = (command, spawnOptions) => Effect.callback(resume => {
|
|
310
|
+
const deferred = Deferred.makeUnsafe();
|
|
311
|
+
const handle = NodeChildProcess.spawn(command.command, command.args, spawnOptions);
|
|
312
|
+
handle.on("error", error => {
|
|
313
|
+
resume(Effect.fail(toPlatformError("spawn", error, command)));
|
|
314
|
+
});
|
|
315
|
+
handle.on("exit", (...args) => {
|
|
316
|
+
Deferred.doneUnsafe(deferred, Exit.succeed(args));
|
|
317
|
+
});
|
|
318
|
+
handle.on("spawn", () => {
|
|
319
|
+
resume(Effect.succeed([handle, deferred]));
|
|
320
|
+
});
|
|
321
|
+
return Effect.sync(() => {
|
|
322
|
+
handle.kill("SIGTERM");
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
const killProcessGroup = (command, childProcess, signal) => {
|
|
326
|
+
if (globalThis.process.platform === "win32") {
|
|
327
|
+
return Effect.callback(resume => {
|
|
328
|
+
NodeChildProcess.exec(`taskkill /pid ${childProcess.pid} /T /F`, error => {
|
|
329
|
+
if (error) {
|
|
330
|
+
resume(Effect.fail(toPlatformError("kill", toError(error), command)));
|
|
331
|
+
} else {
|
|
332
|
+
resume(Effect.void);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return Effect.try({
|
|
338
|
+
try: () => {
|
|
339
|
+
globalThis.process.kill(-childProcess.pid, signal);
|
|
340
|
+
},
|
|
341
|
+
catch: error => toPlatformError("kill", toError(error), command)
|
|
342
|
+
});
|
|
343
|
+
};
|
|
344
|
+
const killProcess = (command, childProcess, signal) => Effect.suspend(() => {
|
|
345
|
+
const killed = childProcess.kill(signal);
|
|
346
|
+
if (!killed) {
|
|
347
|
+
const error = new globalThis.Error("Failed to kill child process");
|
|
348
|
+
return Effect.fail(toPlatformError("kill", error, command));
|
|
349
|
+
}
|
|
350
|
+
return Effect.void;
|
|
351
|
+
});
|
|
352
|
+
const withTimeout = (childProcess, command, options) => kill => {
|
|
353
|
+
const killSignal = options?.killSignal ?? "SIGTERM";
|
|
354
|
+
return Predicate.isUndefined(options?.forceKillAfter) ? kill(command, childProcess, killSignal) : Effect.timeoutOrElse(kill(command, childProcess, killSignal), {
|
|
355
|
+
duration: options.forceKillAfter,
|
|
356
|
+
onTimeout: () => kill(command, childProcess, "SIGKILL")
|
|
357
|
+
});
|
|
358
|
+
};
|
|
359
|
+
/**
|
|
360
|
+
* Get the appropriate source stream from a process handle based on the
|
|
361
|
+
* `from` pipe option.
|
|
362
|
+
*/
|
|
363
|
+
const getSourceStream = (handle, from) => {
|
|
364
|
+
const fromOption = from ?? "stdout";
|
|
365
|
+
switch (fromOption) {
|
|
366
|
+
case "stdout":
|
|
367
|
+
return handle.stdout;
|
|
368
|
+
case "stderr":
|
|
369
|
+
return handle.stderr;
|
|
370
|
+
case "all":
|
|
371
|
+
return handle.all;
|
|
372
|
+
default:
|
|
373
|
+
{
|
|
374
|
+
// Handle fd3, fd4, etc.
|
|
375
|
+
const fd = ChildProcess.parseFdName(fromOption);
|
|
376
|
+
if (Predicate.isNotUndefined(fd)) {
|
|
377
|
+
return handle.getOutputFd(fd);
|
|
378
|
+
}
|
|
379
|
+
// Fallback to stdout for invalid fd names
|
|
380
|
+
return handle.stdout;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
const spawnCommand = Effect.fnUntraced(function* (cmd) {
|
|
385
|
+
switch (cmd._tag) {
|
|
386
|
+
case "StandardCommand":
|
|
387
|
+
{
|
|
388
|
+
const stdinConfig = resolveStdinOption(cmd.options);
|
|
389
|
+
const stdoutConfig = resolveOutputOption(cmd.options, "stdout");
|
|
390
|
+
const stderrConfig = resolveOutputOption(cmd.options, "stderr");
|
|
391
|
+
const resolvedAdditionalFds = resolveAdditionalFds(cmd.options);
|
|
392
|
+
const cwd = yield* resolveWorkingDirectory(cmd.options);
|
|
393
|
+
const env = resolveEnvironment(cmd.options);
|
|
394
|
+
const stdio = buildStdioArray(stdinConfig, stdoutConfig, stderrConfig, resolvedAdditionalFds);
|
|
395
|
+
const [childProcess, exitSignal] = yield* Effect.acquireRelease(spawn(cmd, {
|
|
396
|
+
cwd,
|
|
397
|
+
env,
|
|
398
|
+
stdio,
|
|
399
|
+
detached: cmd.options.detached ?? process.platform !== "win32",
|
|
400
|
+
shell: cmd.options.shell
|
|
401
|
+
}), Effect.fnUntraced(function* ([childProcess, exitSignal]) {
|
|
402
|
+
const exited = yield* Deferred.isDone(exitSignal);
|
|
403
|
+
const killWithTimeout = withTimeout(childProcess, cmd, cmd.options);
|
|
404
|
+
if (exited) {
|
|
405
|
+
// Process already exited, check if children need cleanup
|
|
406
|
+
const [code] = yield* Deferred.await(exitSignal);
|
|
407
|
+
if (code !== 0 && Predicate.isNotNull(code)) {
|
|
408
|
+
// Non-zero exit code ,attempt to clean up process group
|
|
409
|
+
return yield* Effect.ignore(killWithTimeout(killProcessGroup));
|
|
410
|
+
}
|
|
411
|
+
return yield* Effect.void;
|
|
412
|
+
}
|
|
413
|
+
// Process is still running, kill it
|
|
414
|
+
return yield* killWithTimeout((command, childProcess, signal) => Effect.catch(killProcessGroup(command, childProcess, signal), () => killProcess(command, childProcess, signal))).pipe(Effect.andThen(Deferred.await(exitSignal)), Effect.ignore);
|
|
415
|
+
}));
|
|
416
|
+
const pid = ProcessId(childProcess.pid);
|
|
417
|
+
const stdin = yield* setupChildStdin(cmd, childProcess, stdinConfig);
|
|
418
|
+
const {
|
|
419
|
+
all,
|
|
420
|
+
stderr,
|
|
421
|
+
stdout
|
|
422
|
+
} = setupChildOutputStreams(cmd, childProcess, stdoutConfig, stderrConfig);
|
|
423
|
+
const {
|
|
424
|
+
getInputFd,
|
|
425
|
+
getOutputFd
|
|
426
|
+
} = yield* setupAdditionalFds(cmd, childProcess, resolvedAdditionalFds);
|
|
427
|
+
const isRunning = Effect.map(Deferred.isDone(exitSignal), done => !done);
|
|
428
|
+
const exitCode = Effect.flatMap(Deferred.await(exitSignal), ([code, signal]) => {
|
|
429
|
+
if (Predicate.isNotNull(code)) {
|
|
430
|
+
return Effect.succeed(ExitCode(code));
|
|
431
|
+
}
|
|
432
|
+
// If code is `null`, then `signal` must be defined. See the NodeJS
|
|
433
|
+
// documentation for the `"exit"` event on a `child_process`.
|
|
434
|
+
// https://nodejs.org/api/child_process.html#child_process_event_exit
|
|
435
|
+
const error = new globalThis.Error(`Process interrupted due to receipt of signal: '${signal}'`);
|
|
436
|
+
return Effect.fail(toPlatformError("exitCode", error, cmd));
|
|
437
|
+
});
|
|
438
|
+
const kill = options => {
|
|
439
|
+
const killWithTimeout = withTimeout(childProcess, cmd, options);
|
|
440
|
+
return killWithTimeout((command, childProcess, signal) => Effect.catch(killProcessGroup(command, childProcess, signal), () => killProcess(command, childProcess, signal))).pipe(Effect.andThen(Deferred.await(exitSignal)), Effect.asVoid);
|
|
441
|
+
};
|
|
442
|
+
return makeHandle({
|
|
443
|
+
pid,
|
|
444
|
+
exitCode,
|
|
445
|
+
isRunning,
|
|
446
|
+
kill,
|
|
447
|
+
stdin,
|
|
448
|
+
stdout,
|
|
449
|
+
stderr,
|
|
450
|
+
all,
|
|
451
|
+
getInputFd,
|
|
452
|
+
getOutputFd
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
case "PipedCommand":
|
|
456
|
+
{
|
|
457
|
+
const {
|
|
458
|
+
commands,
|
|
459
|
+
pipeOptions
|
|
460
|
+
} = flattenCommand(cmd);
|
|
461
|
+
const [root, ...pipeline] = commands;
|
|
462
|
+
let handle = spawnCommand(root);
|
|
463
|
+
for (let i = 0; i < pipeline.length; i++) {
|
|
464
|
+
const command = pipeline[i];
|
|
465
|
+
const options = pipeOptions[i] ?? {};
|
|
466
|
+
const stdinConfig = resolveStdinOption(command.options);
|
|
467
|
+
// Get the appropriate stream from the source based on `from` option
|
|
468
|
+
const sourceStream = Stream.unwrap(Effect.map(handle, h => getSourceStream(h, options.from)));
|
|
469
|
+
// Determine where to pipe: stdin or custom fd
|
|
470
|
+
const toOption = options.to ?? "stdin";
|
|
471
|
+
if (toOption === "stdin") {
|
|
472
|
+
// Pipe to stdin (default behavior)
|
|
473
|
+
handle = spawnCommand(ChildProcess.make(command.command, command.args, {
|
|
474
|
+
...command.options,
|
|
475
|
+
stdin: {
|
|
476
|
+
...stdinConfig,
|
|
477
|
+
stream: sourceStream
|
|
478
|
+
}
|
|
479
|
+
}));
|
|
480
|
+
} else {
|
|
481
|
+
// Pipe to custom fd (fd3, fd4, etc.)
|
|
482
|
+
const fd = ChildProcess.parseFdName(toOption);
|
|
483
|
+
if (Predicate.isNotUndefined(fd)) {
|
|
484
|
+
const fdName = ChildProcess.fdName(fd);
|
|
485
|
+
const existingFds = command.options.additionalFds ?? {};
|
|
486
|
+
handle = spawnCommand(ChildProcess.make(command.command, command.args, {
|
|
487
|
+
...command.options,
|
|
488
|
+
additionalFds: {
|
|
489
|
+
...existingFds,
|
|
490
|
+
[fdName]: {
|
|
491
|
+
type: "input",
|
|
492
|
+
stream: sourceStream
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}));
|
|
496
|
+
} else {
|
|
497
|
+
// Invalid fd name, fall back to stdin
|
|
498
|
+
handle = spawnCommand(ChildProcess.make(command.command, command.args, {
|
|
499
|
+
...command.options,
|
|
500
|
+
stdin: {
|
|
501
|
+
...stdinConfig,
|
|
502
|
+
stream: sourceStream
|
|
503
|
+
}
|
|
504
|
+
}));
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return yield* handle;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
return ChildProcessSpawner.of({
|
|
513
|
+
spawn: spawnCommand
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
/**
|
|
517
|
+
* Layer providing the `NodeChildProcessSpawner` implementation.
|
|
518
|
+
*
|
|
519
|
+
* @since 4.0.0
|
|
520
|
+
* @category Layers
|
|
521
|
+
*/
|
|
522
|
+
export const layer = /*#__PURE__*/Layer.effect(ChildProcessSpawner, make);
|
|
523
|
+
/**
|
|
524
|
+
* Flattens a `Command` into an array of `StandardCommand`s along with pipe
|
|
525
|
+
* options for each connection.
|
|
526
|
+
*
|
|
527
|
+
* @since 4.0.0
|
|
528
|
+
* @category Utilities
|
|
529
|
+
*/
|
|
530
|
+
export const flattenCommand = command => {
|
|
531
|
+
const commands = [];
|
|
532
|
+
const pipeOptions = [];
|
|
533
|
+
const flatten = cmd => {
|
|
534
|
+
switch (cmd._tag) {
|
|
535
|
+
case "StandardCommand":
|
|
536
|
+
{
|
|
537
|
+
commands.push(cmd);
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
case "PipedCommand":
|
|
541
|
+
{
|
|
542
|
+
// Recursively flatten left side first
|
|
543
|
+
flatten(cmd.left);
|
|
544
|
+
// Store the pipe options for this connection
|
|
545
|
+
pipeOptions.push(cmd.options);
|
|
546
|
+
// Then flatten right side
|
|
547
|
+
flatten(cmd.right);
|
|
548
|
+
break;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
flatten(command);
|
|
553
|
+
// The commands array is guaranteed to be non-empty since we always have at
|
|
554
|
+
// least one command in the input. We validate this at runtime and return a
|
|
555
|
+
// properly typed tuple.
|
|
556
|
+
if (commands.length === 0) {
|
|
557
|
+
// This should never happen given a valid Command input
|
|
558
|
+
throw new Error("flattenCommand produced empty commands array");
|
|
559
|
+
}
|
|
560
|
+
const [first, ...rest] = commands;
|
|
561
|
+
const nonEmptyCommands = [first, ...rest];
|
|
562
|
+
return {
|
|
563
|
+
commands: nonEmptyCommands,
|
|
564
|
+
pipeOptions
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
//# sourceMappingURL=NodeChildProcessSpawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeChildProcessSpawner.js","names":["Deferred","Effect","Exit","FileSystem","Layer","Path","Predicate","Sink","Stream","ChildProcess","ChildProcessSpawner","ExitCode","makeHandle","ProcessId","NodeChildProcess","NodeJSStream","handleErrnoException","NodeSink","NodeStream","toError","error","globalThis","Error","String","toPlatformError","method","command","commands","flattenCommand","commandStr","reduce","acc","curr","cmd","args","join","length","make","gen","fs","path","resolveWorkingDirectory","fnUntraced","options","isUndefined","cwd","undefined","access","resolve","resolveEnvironment","extendEnv","process","env","inputToStdioOption","input","isStream","outputToStdioOption","isSink","resolveStdinOption","defaultConfig","stream","encoding","endOnDone","stdin","resolveOutputOption","streamName","option","resolveAdditionalFds","additionalFds","result","name","config","Object","entries","fd","parseFdName","isNotUndefined","push","sort","a","b","buildStdioArray","stdinConfig","stdoutConfig","stderrConfig","stdio","maxFd","max","Math","i","setupAdditionalFds","childProcess","getInputFd","drain","getOutputFd","empty","inputSinks","Map","outputStreams","nodeStream","type","sink","isNotNullish","fromWritable","evaluate","onError","forkScoped","run","set","isNotNull","fromReadable","transduce","get","setupChildStdin","suspend","as","succeed","setupChildOutputStreams","nodeStdout","stdout","nodeStderr","stderr","stdoutPassThrough","PassThrough","stderrPassThrough","combinedPassThrough","totalStreams","endedCount","onStreamEnd","end","pipe","once","all","spawn","spawnOptions","callback","resume","deferred","makeUnsafe","handle","on","fail","doneUnsafe","sync","kill","killProcessGroup","signal","platform","exec","pid","void","try","catch","killProcess","killed","withTimeout","killSignal","forceKillAfter","timeoutOrElse","duration","onTimeout","getSourceStream","from","fromOption","spawnCommand","_tag","resolvedAdditionalFds","exitSignal","acquireRelease","detached","shell","exited","isDone","killWithTimeout","code","await","ignore","andThen","isRunning","map","done","exitCode","flatMap","asVoid","pipeOptions","root","pipeline","sourceStream","unwrap","h","toOption","to","fdName","existingFds","of","layer","effect","flatten","left","right","first","rest","nonEmptyCommands"],"sources":["../src/NodeChildProcessSpawner.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|