@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.
Files changed (218) hide show
  1. package/README.md +3 -3
  2. package/dist/NodeChildProcessSpawner.d.ts +37 -0
  3. package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
  4. package/dist/NodeChildProcessSpawner.js +567 -0
  5. package/dist/NodeChildProcessSpawner.js.map +1 -0
  6. package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +4 -7
  7. package/dist/NodeClusterSocket.d.ts.map +1 -0
  8. package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +9 -10
  9. package/dist/NodeClusterSocket.js.map +1 -0
  10. package/dist/NodeFileSystem.d.ts +8 -0
  11. package/dist/NodeFileSystem.d.ts.map +1 -0
  12. package/dist/{esm/internal/fileSystem.js → NodeFileSystem.js} +125 -96
  13. package/dist/NodeFileSystem.js.map +1 -0
  14. package/dist/NodePath.d.ts +18 -0
  15. package/dist/NodePath.d.ts.map +1 -0
  16. package/dist/NodePath.js +56 -0
  17. package/dist/NodePath.js.map +1 -0
  18. package/dist/NodeRuntime.d.ts +28 -0
  19. package/dist/NodeRuntime.d.ts.map +1 -0
  20. package/dist/{esm/internal/runtime.js → NodeRuntime.js} +8 -8
  21. package/dist/NodeRuntime.js.map +1 -0
  22. package/dist/NodeSink.d.ts +40 -0
  23. package/dist/NodeSink.d.ts.map +1 -0
  24. package/dist/NodeSink.js +50 -0
  25. package/dist/NodeSink.js.map +1 -0
  26. package/dist/{dts/NodeSocket.d.ts → NodeSocket.d.ts} +10 -10
  27. package/dist/NodeSocket.d.ts.map +1 -0
  28. package/dist/{esm/NodeSocket.js → NodeSocket.js} +51 -39
  29. package/dist/NodeSocket.js.map +1 -0
  30. package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +8 -10
  31. package/dist/NodeSocketServer.d.ts.map +1 -0
  32. package/dist/NodeSocketServer.js +192 -0
  33. package/dist/NodeSocketServer.js.map +1 -0
  34. package/dist/NodeStdio.d.ts +11 -0
  35. package/dist/NodeStdio.d.ts.map +1 -0
  36. package/dist/NodeStdio.js +43 -0
  37. package/dist/NodeStdio.js.map +1 -0
  38. package/dist/NodeStream.d.ts +127 -0
  39. package/dist/NodeStream.d.ts.map +1 -0
  40. package/dist/NodeStream.js +249 -0
  41. package/dist/NodeStream.js.map +1 -0
  42. package/dist/NodeTerminal.d.ts +15 -0
  43. package/dist/NodeTerminal.d.ts.map +1 -0
  44. package/dist/{esm/internal/terminal.js → NodeTerminal.js} +28 -21
  45. package/dist/NodeTerminal.js.map +1 -0
  46. package/dist/internal/utils.d.ts +2 -0
  47. package/dist/internal/utils.d.ts.map +1 -0
  48. package/dist/{esm/internal/error.js → internal/utils.js} +4 -5
  49. package/dist/internal/utils.js.map +1 -0
  50. package/package.json +53 -124
  51. package/src/NodeChildProcessSpawner.ts +713 -0
  52. package/src/NodeClusterSocket.ts +12 -13
  53. package/src/NodeFileSystem.ts +632 -5
  54. package/src/NodePath.ts +48 -9
  55. package/src/NodeRuntime.ts +53 -4
  56. package/src/NodeSink.ts +65 -62
  57. package/src/NodeSocket.ts +65 -49
  58. package/src/NodeSocketServer.ts +108 -88
  59. package/src/NodeStdio.ts +49 -0
  60. package/src/NodeStream.ts +324 -83
  61. package/src/NodeTerminal.ts +100 -9
  62. package/src/internal/{error.ts → utils.ts} +6 -7
  63. package/NodeClusterSocket/package.json +0 -6
  64. package/NodeCommandExecutor/package.json +0 -6
  65. package/NodeFileSystem/ParcelWatcher/package.json +0 -6
  66. package/NodeFileSystem/package.json +0 -6
  67. package/NodeKeyValueStore/package.json +0 -6
  68. package/NodeMultipart/package.json +0 -6
  69. package/NodePath/package.json +0 -6
  70. package/NodeRuntime/package.json +0 -6
  71. package/NodeSink/package.json +0 -6
  72. package/NodeSocket/package.json +0 -6
  73. package/NodeSocketServer/package.json +0 -6
  74. package/NodeStream/package.json +0 -6
  75. package/NodeTerminal/package.json +0 -6
  76. package/dist/cjs/NodeClusterSocket.js +0 -50
  77. package/dist/cjs/NodeClusterSocket.js.map +0 -1
  78. package/dist/cjs/NodeCommandExecutor.js +0 -14
  79. package/dist/cjs/NodeCommandExecutor.js.map +0 -1
  80. package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -20
  81. package/dist/cjs/NodeFileSystem/ParcelWatcher.js.map +0 -1
  82. package/dist/cjs/NodeFileSystem.js +0 -18
  83. package/dist/cjs/NodeFileSystem.js.map +0 -1
  84. package/dist/cjs/NodeKeyValueStore.js +0 -18
  85. package/dist/cjs/NodeKeyValueStore.js.map +0 -1
  86. package/dist/cjs/NodeMultipart.js +0 -24
  87. package/dist/cjs/NodeMultipart.js.map +0 -1
  88. package/dist/cjs/NodePath.js +0 -28
  89. package/dist/cjs/NodePath.js.map +0 -1
  90. package/dist/cjs/NodeRuntime.js +0 -14
  91. package/dist/cjs/NodeRuntime.js.map +0 -1
  92. package/dist/cjs/NodeSink.js +0 -50
  93. package/dist/cjs/NodeSink.js.map +0 -1
  94. package/dist/cjs/NodeSocket.js +0 -153
  95. package/dist/cjs/NodeSocket.js.map +0 -1
  96. package/dist/cjs/NodeSocketServer.js +0 -178
  97. package/dist/cjs/NodeSocketServer.js.map +0 -1
  98. package/dist/cjs/NodeStream.js +0 -76
  99. package/dist/cjs/NodeStream.js.map +0 -1
  100. package/dist/cjs/NodeTerminal.js +0 -19
  101. package/dist/cjs/NodeTerminal.js.map +0 -1
  102. package/dist/cjs/internal/commandExecutor.js +0 -153
  103. package/dist/cjs/internal/commandExecutor.js.map +0 -1
  104. package/dist/cjs/internal/error.js +0 -45
  105. package/dist/cjs/internal/error.js.map +0 -1
  106. package/dist/cjs/internal/fileSystem/parcelWatcher.js +0 -68
  107. package/dist/cjs/internal/fileSystem/parcelWatcher.js.map +0 -1
  108. package/dist/cjs/internal/fileSystem.js +0 -400
  109. package/dist/cjs/internal/fileSystem.js.map +0 -1
  110. package/dist/cjs/internal/multipart.js +0 -147
  111. package/dist/cjs/internal/multipart.js.map +0 -1
  112. package/dist/cjs/internal/path.js +0 -53
  113. package/dist/cjs/internal/path.js.map +0 -1
  114. package/dist/cjs/internal/runtime.js +0 -37
  115. package/dist/cjs/internal/runtime.js.map +0 -1
  116. package/dist/cjs/internal/sink.js +0 -28
  117. package/dist/cjs/internal/sink.js.map +0 -1
  118. package/dist/cjs/internal/stream.js +0 -233
  119. package/dist/cjs/internal/stream.js.map +0 -1
  120. package/dist/cjs/internal/terminal.js +0 -86
  121. package/dist/cjs/internal/terminal.js.map +0 -1
  122. package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
  123. package/dist/dts/NodeCommandExecutor.d.ts +0 -12
  124. package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
  125. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -13
  126. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
  127. package/dist/dts/NodeFileSystem.d.ts +0 -11
  128. package/dist/dts/NodeFileSystem.d.ts.map +0 -1
  129. package/dist/dts/NodeKeyValueStore.d.ts +0 -12
  130. package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
  131. package/dist/dts/NodeMultipart.d.ts +0 -27
  132. package/dist/dts/NodeMultipart.d.ts.map +0 -1
  133. package/dist/dts/NodePath.d.ts +0 -21
  134. package/dist/dts/NodePath.d.ts.map +0 -1
  135. package/dist/dts/NodeRuntime.d.ts +0 -10
  136. package/dist/dts/NodeRuntime.d.ts.map +0 -1
  137. package/dist/dts/NodeSink.d.ts +0 -36
  138. package/dist/dts/NodeSink.d.ts.map +0 -1
  139. package/dist/dts/NodeSocket.d.ts.map +0 -1
  140. package/dist/dts/NodeSocketServer.d.ts.map +0 -1
  141. package/dist/dts/NodeStream.d.ts +0 -119
  142. package/dist/dts/NodeStream.d.ts.map +0 -1
  143. package/dist/dts/NodeTerminal.d.ts +0 -18
  144. package/dist/dts/NodeTerminal.d.ts.map +0 -1
  145. package/dist/dts/internal/commandExecutor.d.ts +0 -2
  146. package/dist/dts/internal/commandExecutor.d.ts.map +0 -1
  147. package/dist/dts/internal/error.d.ts +0 -2
  148. package/dist/dts/internal/error.d.ts.map +0 -1
  149. package/dist/dts/internal/fileSystem/parcelWatcher.d.ts +0 -4
  150. package/dist/dts/internal/fileSystem/parcelWatcher.d.ts.map +0 -1
  151. package/dist/dts/internal/fileSystem.d.ts +0 -2
  152. package/dist/dts/internal/fileSystem.d.ts.map +0 -1
  153. package/dist/dts/internal/multipart.d.ts +0 -2
  154. package/dist/dts/internal/multipart.d.ts.map +0 -1
  155. package/dist/dts/internal/path.d.ts +0 -2
  156. package/dist/dts/internal/path.d.ts.map +0 -1
  157. package/dist/dts/internal/runtime.d.ts +0 -2
  158. package/dist/dts/internal/runtime.d.ts.map +0 -1
  159. package/dist/dts/internal/sink.d.ts +0 -2
  160. package/dist/dts/internal/sink.d.ts.map +0 -1
  161. package/dist/dts/internal/stream.d.ts +0 -2
  162. package/dist/dts/internal/stream.d.ts.map +0 -1
  163. package/dist/dts/internal/terminal.d.ts +0 -2
  164. package/dist/dts/internal/terminal.d.ts.map +0 -1
  165. package/dist/esm/NodeClusterSocket.js.map +0 -1
  166. package/dist/esm/NodeCommandExecutor.js +0 -7
  167. package/dist/esm/NodeCommandExecutor.js.map +0 -1
  168. package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -12
  169. package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
  170. package/dist/esm/NodeFileSystem.js +0 -10
  171. package/dist/esm/NodeFileSystem.js.map +0 -1
  172. package/dist/esm/NodeKeyValueStore.js +0 -10
  173. package/dist/esm/NodeKeyValueStore.js.map +0 -1
  174. package/dist/esm/NodeMultipart.js +0 -17
  175. package/dist/esm/NodeMultipart.js.map +0 -1
  176. package/dist/esm/NodePath.js +0 -20
  177. package/dist/esm/NodePath.js.map +0 -1
  178. package/dist/esm/NodeRuntime.js +0 -7
  179. package/dist/esm/NodeRuntime.js.map +0 -1
  180. package/dist/esm/NodeSink.js +0 -43
  181. package/dist/esm/NodeSink.js.map +0 -1
  182. package/dist/esm/NodeSocket.js.map +0 -1
  183. package/dist/esm/NodeSocketServer.js +0 -167
  184. package/dist/esm/NodeSocketServer.js.map +0 -1
  185. package/dist/esm/NodeStream.js +0 -69
  186. package/dist/esm/NodeStream.js.map +0 -1
  187. package/dist/esm/NodeTerminal.js +0 -12
  188. package/dist/esm/NodeTerminal.js.map +0 -1
  189. package/dist/esm/internal/commandExecutor.js +0 -146
  190. package/dist/esm/internal/commandExecutor.js.map +0 -1
  191. package/dist/esm/internal/error.js.map +0 -1
  192. package/dist/esm/internal/fileSystem/parcelWatcher.js +0 -61
  193. package/dist/esm/internal/fileSystem/parcelWatcher.js.map +0 -1
  194. package/dist/esm/internal/fileSystem.js.map +0 -1
  195. package/dist/esm/internal/multipart.js +0 -137
  196. package/dist/esm/internal/multipart.js.map +0 -1
  197. package/dist/esm/internal/path.js +0 -46
  198. package/dist/esm/internal/path.js.map +0 -1
  199. package/dist/esm/internal/runtime.js.map +0 -1
  200. package/dist/esm/internal/sink.js +0 -19
  201. package/dist/esm/internal/sink.js.map +0 -1
  202. package/dist/esm/internal/stream.js +0 -217
  203. package/dist/esm/internal/stream.js.map +0 -1
  204. package/dist/esm/internal/terminal.js.map +0 -1
  205. package/dist/esm/package.json +0 -4
  206. package/src/NodeCommandExecutor.ts +0 -13
  207. package/src/NodeFileSystem/ParcelWatcher.ts +0 -15
  208. package/src/NodeKeyValueStore.ts +0 -20
  209. package/src/NodeMultipart.ts +0 -40
  210. package/src/internal/commandExecutor.ts +0 -251
  211. package/src/internal/fileSystem/parcelWatcher.ts +0 -64
  212. package/src/internal/fileSystem.ts +0 -648
  213. package/src/internal/multipart.ts +0 -141
  214. package/src/internal/path.ts +0 -63
  215. package/src/internal/runtime.ts +0 -34
  216. package/src/internal/sink.ts +0 -57
  217. package/src/internal/stream.ts +0 -375
  218. package/src/internal/terminal.ts +0 -100
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
- # `@effect/platform-node-shared`
1
+ # `@effect/platform-node`
2
2
 
3
- Provides shared utilities and abstractions used by the [`@effect/platform-node`](https://github.com/Effect-TS/effect/tree/main/packages/platform-node) package.
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-shared).
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":[]}