@smthrs/platform-node 0.0.0-stage → 1.0.0-rc.4

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 (442) hide show
  1. package/CHANGELOG.md +211 -0
  2. package/LICENSE +21 -0
  3. package/README.md +165 -2
  4. package/bin/darwin-arm64/smithers-jj-export +0 -0
  5. package/bin/darwin-x64/smithers-jj-export +0 -0
  6. package/bin/linux-arm64/smithers-jj-export +0 -0
  7. package/bin/linux-x64/smithers-jj-export +4 -0
  8. package/bin/win32-x64/smithers-jj-export.exe +0 -0
  9. package/dist/cjs/AtomicFileSystem.d.ts +147 -0
  10. package/dist/cjs/AtomicFileSystem.d.ts.map +1 -0
  11. package/dist/cjs/AtomicFileSystem.js +234 -0
  12. package/dist/cjs/AtomicFileSystem.js.map +7 -0
  13. package/dist/cjs/EgressHttpClient.d.ts +106 -0
  14. package/dist/cjs/EgressHttpClient.d.ts.map +1 -0
  15. package/dist/cjs/EgressHttpClient.js +202 -0
  16. package/dist/cjs/EgressHttpClient.js.map +7 -0
  17. package/dist/cjs/HostLiveness.d.ts +81 -0
  18. package/dist/cjs/HostLiveness.d.ts.map +1 -0
  19. package/dist/cjs/HostLiveness.js +49 -0
  20. package/dist/cjs/HostLiveness.js.map +7 -0
  21. package/dist/cjs/NodeHost.d.ts +145 -0
  22. package/dist/cjs/NodeHost.d.ts.map +1 -0
  23. package/dist/cjs/NodeHost.js +128 -0
  24. package/dist/cjs/NodeHost.js.map +7 -0
  25. package/dist/cjs/ProcessConfinement.d.ts +61 -0
  26. package/dist/cjs/ProcessConfinement.d.ts.map +1 -0
  27. package/dist/cjs/ProcessConfinement.js +292 -0
  28. package/dist/cjs/ProcessConfinement.js.map +7 -0
  29. package/dist/cjs/ProcessReaper.d.ts +457 -0
  30. package/dist/cjs/ProcessReaper.d.ts.map +1 -0
  31. package/dist/cjs/ProcessReaper.js +349 -0
  32. package/dist/cjs/ProcessReaper.js.map +7 -0
  33. package/dist/cjs/ProcessSandbox.d.ts +391 -0
  34. package/dist/cjs/ProcessSandbox.d.ts.map +1 -0
  35. package/dist/cjs/ProcessSandbox.js +774 -0
  36. package/dist/cjs/ProcessSandbox.js.map +7 -0
  37. package/dist/cjs/ScopedProcess.d.ts +66 -0
  38. package/dist/cjs/ScopedProcess.d.ts.map +1 -0
  39. package/dist/cjs/ScopedProcess.js +87 -0
  40. package/dist/cjs/ScopedProcess.js.map +7 -0
  41. package/dist/cjs/index.d.ts +38 -0
  42. package/dist/cjs/index.d.ts.map +1 -0
  43. package/dist/cjs/index.js +47 -0
  44. package/dist/cjs/index.js.map +7 -0
  45. package/dist/cjs/internal/AtomicFileSystemExecutable.d.ts +61 -0
  46. package/dist/cjs/internal/AtomicFileSystemExecutable.d.ts.map +1 -0
  47. package/dist/cjs/internal/AtomicFileSystemExecutable.js +250 -0
  48. package/dist/cjs/internal/AtomicFileSystemExecutable.js.map +7 -0
  49. package/dist/cjs/internal/AtomicFileSystemProtocol.d.ts +78 -0
  50. package/dist/cjs/internal/AtomicFileSystemProtocol.d.ts.map +1 -0
  51. package/dist/cjs/internal/AtomicFileSystemProtocol.js +382 -0
  52. package/dist/cjs/internal/AtomicFileSystemProtocol.js.map +7 -0
  53. package/dist/cjs/internal/AtomicFileSystemTransport.d.ts +44 -0
  54. package/dist/cjs/internal/AtomicFileSystemTransport.d.ts.map +1 -0
  55. package/dist/cjs/internal/AtomicFileSystemTransport.js +197 -0
  56. package/dist/cjs/internal/AtomicFileSystemTransport.js.map +7 -0
  57. package/dist/cjs/internal/AtomicHelperError.d.ts +35 -0
  58. package/dist/cjs/internal/AtomicHelperError.d.ts.map +1 -0
  59. package/dist/cjs/internal/AtomicHelperError.js +45 -0
  60. package/dist/cjs/internal/AtomicHelperError.js.map +7 -0
  61. package/dist/cjs/internal/AtomicHelperFault.d.ts +59 -0
  62. package/dist/cjs/internal/AtomicHelperFault.d.ts.map +1 -0
  63. package/dist/cjs/internal/AtomicHelperFault.js +66 -0
  64. package/dist/cjs/internal/AtomicHelperFault.js.map +7 -0
  65. package/dist/cjs/internal/PipedProcess.d.ts +35 -0
  66. package/dist/cjs/internal/PipedProcess.d.ts.map +1 -0
  67. package/dist/cjs/internal/PipedProcess.js +309 -0
  68. package/dist/cjs/internal/PipedProcess.js.map +7 -0
  69. package/dist/cjs/internal/ProcSnapshot.d.ts +85 -0
  70. package/dist/cjs/internal/ProcSnapshot.d.ts.map +1 -0
  71. package/dist/cjs/internal/ProcSnapshot.js +123 -0
  72. package/dist/cjs/internal/ProcSnapshot.js.map +7 -0
  73. package/dist/cjs/internal/ProcessCleanup.d.ts +64 -0
  74. package/dist/cjs/internal/ProcessCleanup.d.ts.map +1 -0
  75. package/dist/cjs/internal/ProcessCleanup.js +62 -0
  76. package/dist/cjs/internal/ProcessCleanup.js.map +7 -0
  77. package/dist/cjs/internal/ProcessCleanupPolicyError.d.ts +30 -0
  78. package/dist/cjs/internal/ProcessCleanupPolicyError.d.ts.map +1 -0
  79. package/dist/cjs/internal/ProcessCleanupPolicyError.js +33 -0
  80. package/dist/cjs/internal/ProcessCleanupPolicyError.js.map +7 -0
  81. package/dist/cjs/internal/ProcessFault.d.ts +63 -0
  82. package/dist/cjs/internal/ProcessFault.d.ts.map +1 -0
  83. package/dist/cjs/internal/ProcessFault.js +63 -0
  84. package/dist/cjs/internal/ProcessFault.js.map +7 -0
  85. package/dist/cjs/internal/ProcessSupervisor.d.ts +143 -0
  86. package/dist/cjs/internal/ProcessSupervisor.d.ts.map +1 -0
  87. package/dist/cjs/internal/ProcessSupervisor.js +685 -0
  88. package/dist/cjs/internal/ProcessSupervisor.js.map +7 -0
  89. package/dist/cjs/internal/SupervisorProgram.d.ts +9 -0
  90. package/dist/cjs/internal/SupervisorProgram.d.ts.map +1 -0
  91. package/dist/cjs/internal/SupervisorProgram.js +326 -0
  92. package/dist/cjs/internal/SupervisorProgram.js.map +7 -0
  93. package/dist/cjs/internal/WindowsProcessJob.d.ts +39 -0
  94. package/dist/cjs/internal/WindowsProcessJob.d.ts.map +1 -0
  95. package/dist/cjs/internal/WindowsProcessJob.js +113 -0
  96. package/dist/cjs/internal/WindowsProcessJob.js.map +7 -0
  97. package/dist/cjs/package.json +1 -0
  98. package/dist/esm/AtomicFileSystem.d.ts +147 -0
  99. package/dist/esm/AtomicFileSystem.d.ts.map +1 -0
  100. package/dist/esm/AtomicFileSystem.js +290 -0
  101. package/dist/esm/AtomicFileSystem.js.map +1 -0
  102. package/dist/esm/EgressHttpClient.d.ts +106 -0
  103. package/dist/esm/EgressHttpClient.d.ts.map +1 -0
  104. package/dist/esm/EgressHttpClient.js +259 -0
  105. package/dist/esm/EgressHttpClient.js.map +1 -0
  106. package/dist/esm/HostLiveness.d.ts +81 -0
  107. package/dist/esm/HostLiveness.d.ts.map +1 -0
  108. package/dist/esm/HostLiveness.js +68 -0
  109. package/dist/esm/HostLiveness.js.map +1 -0
  110. package/dist/esm/NodeHost.d.ts +145 -0
  111. package/dist/esm/NodeHost.d.ts.map +1 -0
  112. package/dist/esm/NodeHost.js +162 -0
  113. package/dist/esm/NodeHost.js.map +1 -0
  114. package/dist/esm/ProcessConfinement.d.ts +61 -0
  115. package/dist/esm/ProcessConfinement.d.ts.map +1 -0
  116. package/dist/esm/ProcessConfinement.js +311 -0
  117. package/dist/esm/ProcessConfinement.js.map +1 -0
  118. package/dist/esm/ProcessReaper.d.ts +457 -0
  119. package/dist/esm/ProcessReaper.d.ts.map +1 -0
  120. package/dist/esm/ProcessReaper.js +711 -0
  121. package/dist/esm/ProcessReaper.js.map +1 -0
  122. package/dist/esm/ProcessSandbox.d.ts +391 -0
  123. package/dist/esm/ProcessSandbox.d.ts.map +1 -0
  124. package/dist/esm/ProcessSandbox.js +1043 -0
  125. package/dist/esm/ProcessSandbox.js.map +1 -0
  126. package/dist/esm/ScopedProcess.d.ts +66 -0
  127. package/dist/esm/ScopedProcess.d.ts.map +1 -0
  128. package/dist/esm/ScopedProcess.js +67 -0
  129. package/dist/esm/ScopedProcess.js.map +1 -0
  130. package/dist/esm/index.d.ts +38 -0
  131. package/dist/esm/index.d.ts.map +1 -0
  132. package/dist/esm/index.js +38 -0
  133. package/dist/esm/index.js.map +1 -0
  134. package/dist/esm/internal/AtomicFileSystemExecutable.d.ts +61 -0
  135. package/dist/esm/internal/AtomicFileSystemExecutable.d.ts.map +1 -0
  136. package/dist/esm/internal/AtomicFileSystemExecutable.js +350 -0
  137. package/dist/esm/internal/AtomicFileSystemExecutable.js.map +1 -0
  138. package/dist/esm/internal/AtomicFileSystemProtocol.d.ts +78 -0
  139. package/dist/esm/internal/AtomicFileSystemProtocol.d.ts.map +1 -0
  140. package/dist/esm/internal/AtomicFileSystemProtocol.js +412 -0
  141. package/dist/esm/internal/AtomicFileSystemProtocol.js.map +1 -0
  142. package/dist/esm/internal/AtomicFileSystemTransport.d.ts +44 -0
  143. package/dist/esm/internal/AtomicFileSystemTransport.d.ts.map +1 -0
  144. package/dist/esm/internal/AtomicFileSystemTransport.js +242 -0
  145. package/dist/esm/internal/AtomicFileSystemTransport.js.map +1 -0
  146. package/dist/esm/internal/AtomicHelperError.d.ts +35 -0
  147. package/dist/esm/internal/AtomicHelperError.d.ts.map +1 -0
  148. package/dist/esm/internal/AtomicHelperError.js +39 -0
  149. package/dist/esm/internal/AtomicHelperError.js.map +1 -0
  150. package/dist/esm/internal/AtomicHelperFault.d.ts +59 -0
  151. package/dist/esm/internal/AtomicHelperFault.d.ts.map +1 -0
  152. package/dist/esm/internal/AtomicHelperFault.js +66 -0
  153. package/dist/esm/internal/AtomicHelperFault.js.map +1 -0
  154. package/dist/esm/internal/PipedProcess.d.ts +35 -0
  155. package/dist/esm/internal/PipedProcess.d.ts.map +1 -0
  156. package/dist/esm/internal/PipedProcess.js +321 -0
  157. package/dist/esm/internal/PipedProcess.js.map +1 -0
  158. package/dist/esm/internal/ProcSnapshot.d.ts +85 -0
  159. package/dist/esm/internal/ProcSnapshot.d.ts.map +1 -0
  160. package/dist/esm/internal/ProcSnapshot.js +188 -0
  161. package/dist/esm/internal/ProcSnapshot.js.map +1 -0
  162. package/dist/esm/internal/ProcessCleanup.d.ts +64 -0
  163. package/dist/esm/internal/ProcessCleanup.d.ts.map +1 -0
  164. package/dist/esm/internal/ProcessCleanup.js +45 -0
  165. package/dist/esm/internal/ProcessCleanup.js.map +1 -0
  166. package/dist/esm/internal/ProcessCleanupPolicyError.d.ts +30 -0
  167. package/dist/esm/internal/ProcessCleanupPolicyError.d.ts.map +1 -0
  168. package/dist/esm/internal/ProcessCleanupPolicyError.js +25 -0
  169. package/dist/esm/internal/ProcessCleanupPolicyError.js.map +1 -0
  170. package/dist/esm/internal/ProcessFault.d.ts +63 -0
  171. package/dist/esm/internal/ProcessFault.d.ts.map +1 -0
  172. package/dist/esm/internal/ProcessFault.js +64 -0
  173. package/dist/esm/internal/ProcessFault.js.map +1 -0
  174. package/dist/esm/internal/ProcessSupervisor.d.ts +143 -0
  175. package/dist/esm/internal/ProcessSupervisor.d.ts.map +1 -0
  176. package/dist/esm/internal/ProcessSupervisor.js +689 -0
  177. package/dist/esm/internal/ProcessSupervisor.js.map +1 -0
  178. package/dist/esm/internal/SupervisorProgram.d.ts +9 -0
  179. package/dist/esm/internal/SupervisorProgram.d.ts.map +1 -0
  180. package/dist/esm/internal/SupervisorProgram.js +310 -0
  181. package/dist/esm/internal/SupervisorProgram.js.map +1 -0
  182. package/dist/esm/internal/WindowsProcessJob.d.ts +39 -0
  183. package/dist/esm/internal/WindowsProcessJob.d.ts.map +1 -0
  184. package/dist/esm/internal/WindowsProcessJob.js +115 -0
  185. package/dist/esm/internal/WindowsProcessJob.js.map +1 -0
  186. package/dist/vendor/adapters.json +1757 -0
  187. package/dist/vendor/chunk-2Y7WC4KU.js +109 -0
  188. package/dist/vendor/chunk-3GR5VZ2M.js +118 -0
  189. package/dist/vendor/chunk-42QKY6T6.js +40 -0
  190. package/dist/vendor/chunk-54RLBMTZ.js +61 -0
  191. package/dist/vendor/chunk-5ZMHBXIK.js +55 -0
  192. package/dist/vendor/chunk-6ME2W7TF.js +28 -0
  193. package/dist/vendor/chunk-AMQKOQNT.js +34 -0
  194. package/dist/vendor/chunk-B3FZ67QU.js +59 -0
  195. package/dist/vendor/chunk-BKTBUBQY.js +437 -0
  196. package/dist/vendor/chunk-DS7GF46S.js +34 -0
  197. package/dist/vendor/chunk-DVOAHXPG.js +104 -0
  198. package/dist/vendor/chunk-DWSHTSVX.js +229 -0
  199. package/dist/vendor/chunk-EGBNVEEW.js +14 -0
  200. package/dist/vendor/chunk-EZWY45HP.js +18 -0
  201. package/dist/vendor/chunk-FNZOJHSV.js +71 -0
  202. package/dist/vendor/chunk-GXCHI7BM.js +131 -0
  203. package/dist/vendor/chunk-IIJ52ZU6.js +20 -0
  204. package/dist/vendor/chunk-J7A4CZDO.js +92 -0
  205. package/dist/vendor/chunk-JG5TTWPT.js +85 -0
  206. package/dist/vendor/chunk-JJ24ARBQ.js +394 -0
  207. package/dist/vendor/chunk-KOZMM5PZ.js +426 -0
  208. package/dist/vendor/chunk-KUUXSID7.js +18 -0
  209. package/dist/vendor/chunk-LEUPYT3Q.js +36 -0
  210. package/dist/vendor/chunk-M32LDTW7.js +18 -0
  211. package/dist/vendor/chunk-M7CLUILA.js +0 -0
  212. package/dist/vendor/chunk-MBSKBQ5D.js +21 -0
  213. package/dist/vendor/chunk-MLKGABMK.js +9 -0
  214. package/dist/vendor/chunk-NBVRTDTV.js +129 -0
  215. package/dist/vendor/chunk-OXNGN5H7.js +81 -0
  216. package/dist/vendor/chunk-QPLDT6A6.js +564 -0
  217. package/dist/vendor/chunk-QYBKAIA6.js +18 -0
  218. package/dist/vendor/chunk-RO2R4MJH.js +62 -0
  219. package/dist/vendor/chunk-SIR62W3Y.js +398 -0
  220. package/dist/vendor/chunk-TFIKFFSC.js +26 -0
  221. package/dist/vendor/chunk-TXKLEBBL.js +143 -0
  222. package/dist/vendor/chunk-UFH5UUZK.js +48 -0
  223. package/dist/vendor/chunk-VANKHF46.js +96 -0
  224. package/dist/vendor/chunk-VZBDV3TV.js +18 -0
  225. package/dist/vendor/chunk-XDKNKFBW.js +22 -0
  226. package/dist/vendor/chunk-XH4U3JSV.js +249 -0
  227. package/dist/vendor/chunk-Y35ZAO5U.js +53 -0
  228. package/dist/vendor/chunk-ZJMRMY57.js +0 -0
  229. package/dist/vendor/cjs/node/NodeChildProcessSpawner.d.ts +7 -0
  230. package/dist/vendor/cjs/node/NodeChildProcessSpawner.js +1 -0
  231. package/dist/vendor/cjs/node/NodeClusterHttp.d.ts +63 -0
  232. package/dist/vendor/cjs/node/NodeClusterHttp.js +1 -0
  233. package/dist/vendor/cjs/node/NodeClusterSocket.d.ts +79 -0
  234. package/dist/vendor/cjs/node/NodeClusterSocket.js +1 -0
  235. package/dist/vendor/cjs/node/NodeCrypto.d.ts +10 -0
  236. package/dist/vendor/cjs/node/NodeCrypto.js +1 -0
  237. package/dist/vendor/cjs/node/NodeFileSystem.d.ts +10 -0
  238. package/dist/vendor/cjs/node/NodeFileSystem.js +1 -0
  239. package/dist/vendor/cjs/node/NodeHttpClient.d.ts +179 -0
  240. package/dist/vendor/cjs/node/NodeHttpClient.js +1 -0
  241. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.d.ts +62 -0
  242. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.js +1 -0
  243. package/dist/vendor/cjs/node/NodeHttpPlatform.d.ts +36 -0
  244. package/dist/vendor/cjs/node/NodeHttpPlatform.js +1 -0
  245. package/dist/vendor/cjs/node/NodeHttpServer.d.ts +120 -0
  246. package/dist/vendor/cjs/node/NodeHttpServer.js +1 -0
  247. package/dist/vendor/cjs/node/NodeHttpServerRequest.d.ts +29 -0
  248. package/dist/vendor/cjs/node/NodeHttpServerRequest.js +1 -0
  249. package/dist/vendor/cjs/node/NodeMultipart.d.ts +46 -0
  250. package/dist/vendor/cjs/node/NodeMultipart.js +1 -0
  251. package/dist/vendor/cjs/node/NodeMultipartParser.d.ts +97 -0
  252. package/dist/vendor/cjs/node/NodeMultipartParser.js +1 -0
  253. package/dist/vendor/cjs/node/NodePath.d.ts +27 -0
  254. package/dist/vendor/cjs/node/NodePath.js +1 -0
  255. package/dist/vendor/cjs/node/NodeRedis.d.ts +74 -0
  256. package/dist/vendor/cjs/node/NodeRedis.js +1 -0
  257. package/dist/vendor/cjs/node/NodeRuntime.d.ts +85 -0
  258. package/dist/vendor/cjs/node/NodeRuntime.js +1 -0
  259. package/dist/vendor/cjs/node/NodeServices.d.ts +34 -0
  260. package/dist/vendor/cjs/node/NodeServices.js +1 -0
  261. package/dist/vendor/cjs/node/NodeSink.d.ts +8 -0
  262. package/dist/vendor/cjs/node/NodeSink.js +1 -0
  263. package/dist/vendor/cjs/node/NodeSocket.d.ts +38 -0
  264. package/dist/vendor/cjs/node/NodeSocket.js +1 -0
  265. package/dist/vendor/cjs/node/NodeSocketServer.d.ts +8 -0
  266. package/dist/vendor/cjs/node/NodeSocketServer.js +1 -0
  267. package/dist/vendor/cjs/node/NodeStdio.d.ts +11 -0
  268. package/dist/vendor/cjs/node/NodeStdio.js +1 -0
  269. package/dist/vendor/cjs/node/NodeStream.d.ts +8 -0
  270. package/dist/vendor/cjs/node/NodeStream.js +1 -0
  271. package/dist/vendor/cjs/node/NodeTerminal.d.ts +21 -0
  272. package/dist/vendor/cjs/node/NodeTerminal.js +1 -0
  273. package/dist/vendor/cjs/node/NodeWorker.d.ts +22 -0
  274. package/dist/vendor/cjs/node/NodeWorker.js +1 -0
  275. package/dist/vendor/cjs/node/NodeWorkerRunner.d.ts +12 -0
  276. package/dist/vendor/cjs/node/NodeWorkerRunner.js +1 -0
  277. package/dist/vendor/cjs/node/Undici.d.ts +28 -0
  278. package/dist/vendor/cjs/node/Undici.js +1 -0
  279. package/dist/vendor/cjs/node/index.d.ts +100 -0
  280. package/dist/vendor/cjs/node/index.js +1 -0
  281. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  282. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.js +1 -0
  283. package/dist/vendor/cjs/node-shared/NodeClusterSocket.d.ts +22 -0
  284. package/dist/vendor/cjs/node-shared/NodeClusterSocket.js +1 -0
  285. package/dist/vendor/cjs/node-shared/NodeCrypto.d.ts +27 -0
  286. package/dist/vendor/cjs/node-shared/NodeCrypto.js +1 -0
  287. package/dist/vendor/cjs/node-shared/NodeFileSystem.d.ts +11 -0
  288. package/dist/vendor/cjs/node-shared/NodeFileSystem.js +1 -0
  289. package/dist/vendor/cjs/node-shared/NodeHttpCompression.d.ts +36 -0
  290. package/dist/vendor/cjs/node-shared/NodeHttpCompression.js +1 -0
  291. package/dist/vendor/cjs/node-shared/NodePath.d.ts +27 -0
  292. package/dist/vendor/cjs/node-shared/NodePath.js +1 -0
  293. package/dist/vendor/cjs/node-shared/NodeRuntime.d.ts +47 -0
  294. package/dist/vendor/cjs/node-shared/NodeRuntime.js +1 -0
  295. package/dist/vendor/cjs/node-shared/NodeSink.d.ts +69 -0
  296. package/dist/vendor/cjs/node-shared/NodeSink.js +1 -0
  297. package/dist/vendor/cjs/node-shared/NodeSocket.d.ts +134 -0
  298. package/dist/vendor/cjs/node-shared/NodeSocket.js +1 -0
  299. package/dist/vendor/cjs/node-shared/NodeSocketServer.d.ts +80 -0
  300. package/dist/vendor/cjs/node-shared/NodeSocketServer.js +1 -0
  301. package/dist/vendor/cjs/node-shared/NodeStdio.d.ts +12 -0
  302. package/dist/vendor/cjs/node-shared/NodeStdio.js +1 -0
  303. package/dist/vendor/cjs/node-shared/NodeStream.d.ts +179 -0
  304. package/dist/vendor/cjs/node-shared/NodeStream.js +1 -0
  305. package/dist/vendor/cjs/node-shared/NodeTerminal.d.ts +22 -0
  306. package/dist/vendor/cjs/node-shared/NodeTerminal.js +1 -0
  307. package/dist/vendor/cjs/node-shared/index.d.ts +56 -0
  308. package/dist/vendor/cjs/node-shared/index.js +1 -0
  309. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  310. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.js +1 -0
  311. package/dist/vendor/cjs/node-shared/internal/utils.d.ts +2 -0
  312. package/dist/vendor/cjs/node-shared/internal/utils.js +1 -0
  313. package/dist/vendor/cjs/package.json +1 -0
  314. package/dist/vendor/cjs/platform-node-shared.d.ts +56 -0
  315. package/dist/vendor/cjs/platform-node-shared.js +1 -0
  316. package/dist/vendor/cjs/platform-node.d.ts +100 -0
  317. package/dist/vendor/cjs/platform-node.js +1 -0
  318. package/dist/vendor/node/LICENSE +21 -0
  319. package/dist/vendor/node/NodeChildProcessSpawner.d.ts +7 -0
  320. package/dist/vendor/node/NodeChildProcessSpawner.js +14 -0
  321. package/dist/vendor/node/NodeClusterHttp.d.ts +63 -0
  322. package/dist/vendor/node/NodeClusterHttp.js +43 -0
  323. package/dist/vendor/node/NodeClusterSocket.d.ts +79 -0
  324. package/dist/vendor/node/NodeClusterSocket.js +30 -0
  325. package/dist/vendor/node/NodeCrypto.d.ts +10 -0
  326. package/dist/vendor/node/NodeCrypto.js +8 -0
  327. package/dist/vendor/node/NodeFileSystem.d.ts +10 -0
  328. package/dist/vendor/node/NodeFileSystem.js +9 -0
  329. package/dist/vendor/node/NodeHttpClient.d.ts +179 -0
  330. package/dist/vendor/node/NodeHttpClient.js +46 -0
  331. package/dist/vendor/node/NodeHttpIncomingMessage.d.ts +62 -0
  332. package/dist/vendor/node/NodeHttpIncomingMessage.js +10 -0
  333. package/dist/vendor/node/NodeHttpPlatform.d.ts +36 -0
  334. package/dist/vendor/node/NodeHttpPlatform.js +16 -0
  335. package/dist/vendor/node/NodeHttpServer.d.ts +120 -0
  336. package/dist/vendor/node/NodeHttpServer.js +46 -0
  337. package/dist/vendor/node/NodeHttpServerRequest.d.ts +29 -0
  338. package/dist/vendor/node/NodeHttpServerRequest.js +9 -0
  339. package/dist/vendor/node/NodeMultipart.d.ts +46 -0
  340. package/dist/vendor/node/NodeMultipart.js +15 -0
  341. package/dist/vendor/node/NodeMultipartParser.d.ts +97 -0
  342. package/dist/vendor/node/NodeMultipartParser.js +11 -0
  343. package/dist/vendor/node/NodePath.d.ts +27 -0
  344. package/dist/vendor/node/NodePath.js +12 -0
  345. package/dist/vendor/node/NodeRedis.d.ts +74 -0
  346. package/dist/vendor/node/NodeRedis.js +11 -0
  347. package/dist/vendor/node/NodeRuntime.d.ts +85 -0
  348. package/dist/vendor/node/NodeRuntime.js +8 -0
  349. package/dist/vendor/node/NodeServices.d.ts +34 -0
  350. package/dist/vendor/node/NodeServices.js +23 -0
  351. package/dist/vendor/node/NodeSink.d.ts +8 -0
  352. package/dist/vendor/node/NodeSink.js +12 -0
  353. package/dist/vendor/node/NodeSocket.d.ts +38 -0
  354. package/dist/vendor/node/NodeSocket.js +31 -0
  355. package/dist/vendor/node/NodeSocketServer.d.ts +8 -0
  356. package/dist/vendor/node/NodeSocketServer.js +21 -0
  357. package/dist/vendor/node/NodeStdio.d.ts +11 -0
  358. package/dist/vendor/node/NodeStdio.js +10 -0
  359. package/dist/vendor/node/NodeStream.d.ts +8 -0
  360. package/dist/vendor/node/NodeStream.js +27 -0
  361. package/dist/vendor/node/NodeTerminal.d.ts +21 -0
  362. package/dist/vendor/node/NodeTerminal.js +10 -0
  363. package/dist/vendor/node/NodeWorker.d.ts +22 -0
  364. package/dist/vendor/node/NodeWorker.js +9 -0
  365. package/dist/vendor/node/NodeWorkerRunner.d.ts +12 -0
  366. package/dist/vendor/node/NodeWorkerRunner.js +7 -0
  367. package/dist/vendor/node/Undici.d.ts +28 -0
  368. package/dist/vendor/node/Undici.js +9 -0
  369. package/dist/vendor/node/index.d.ts +100 -0
  370. package/dist/vendor/node/index.js +115 -0
  371. package/dist/vendor/node-shared/LICENSE +21 -0
  372. package/dist/vendor/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  373. package/dist/vendor/node-shared/NodeChildProcessSpawner.js +13 -0
  374. package/dist/vendor/node-shared/NodeClusterSocket.d.ts +22 -0
  375. package/dist/vendor/node-shared/NodeClusterSocket.js +11 -0
  376. package/dist/vendor/node-shared/NodeCrypto.d.ts +27 -0
  377. package/dist/vendor/node-shared/NodeCrypto.js +9 -0
  378. package/dist/vendor/node-shared/NodeFileSystem.d.ts +11 -0
  379. package/dist/vendor/node-shared/NodeFileSystem.js +8 -0
  380. package/dist/vendor/node-shared/NodeHttpCompression.d.ts +36 -0
  381. package/dist/vendor/node-shared/NodeHttpCompression.js +13 -0
  382. package/dist/vendor/node-shared/NodePath.d.ts +27 -0
  383. package/dist/vendor/node-shared/NodePath.js +11 -0
  384. package/dist/vendor/node-shared/NodeRuntime.d.ts +47 -0
  385. package/dist/vendor/node-shared/NodeRuntime.js +7 -0
  386. package/dist/vendor/node-shared/NodeSink.d.ts +69 -0
  387. package/dist/vendor/node-shared/NodeSink.js +11 -0
  388. package/dist/vendor/node-shared/NodeSocket.d.ts +134 -0
  389. package/dist/vendor/node-shared/NodeSocket.js +23 -0
  390. package/dist/vendor/node-shared/NodeSocketServer.d.ts +80 -0
  391. package/dist/vendor/node-shared/NodeSocketServer.js +20 -0
  392. package/dist/vendor/node-shared/NodeStdio.d.ts +12 -0
  393. package/dist/vendor/node-shared/NodeStdio.js +9 -0
  394. package/dist/vendor/node-shared/NodeStream.d.ts +179 -0
  395. package/dist/vendor/node-shared/NodeStream.js +26 -0
  396. package/dist/vendor/node-shared/NodeTerminal.d.ts +22 -0
  397. package/dist/vendor/node-shared/NodeTerminal.js +9 -0
  398. package/dist/vendor/node-shared/index.d.ts +56 -0
  399. package/dist/vendor/node-shared/index.js +58 -0
  400. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  401. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.js +7 -0
  402. package/dist/vendor/node-shared/internal/utils.d.ts +2 -0
  403. package/dist/vendor/node-shared/internal/utils.js +7 -0
  404. package/dist/vendor/platform-node-shared.d.ts +56 -0
  405. package/dist/vendor/platform-node-shared.js +58 -0
  406. package/dist/vendor/platform-node.d.ts +100 -0
  407. package/dist/vendor/platform-node.js +115 -0
  408. package/docs/README.md +129 -0
  409. package/docs/api.md +553 -0
  410. package/docs/concepts/descriptor-relative-filesystem.md +181 -0
  411. package/docs/concepts/host-bundle.md +125 -0
  412. package/docs/concepts/process-containment.md +190 -0
  413. package/docs/guides/answer-run-ownership.md +87 -0
  414. package/docs/guides/configure-the-filesystem-helper.md +152 -0
  415. package/docs/guides/contain-child-processes.md +139 -0
  416. package/docs/guides/match-files-with-glob.md +151 -0
  417. package/docs/installation.md +204 -0
  418. package/docs/quickstart.md +147 -0
  419. package/docs/troubleshooting.md +130 -0
  420. package/package.json +202 -3
  421. package/src/AtomicFileSystem.ts +415 -0
  422. package/src/EgressHttpClient.ts +327 -0
  423. package/src/HostLiveness.ts +103 -0
  424. package/src/NodeHost.ts +253 -0
  425. package/src/ProcessConfinement.ts +363 -0
  426. package/src/ProcessReaper.ts +951 -0
  427. package/src/ProcessSandbox.ts +1307 -0
  428. package/src/ScopedProcess.ts +124 -0
  429. package/src/index.ts +44 -0
  430. package/src/internal/AtomicFileSystemExecutable.ts +379 -0
  431. package/src/internal/AtomicFileSystemProtocol.ts +502 -0
  432. package/src/internal/AtomicFileSystemTransport.ts +272 -0
  433. package/src/internal/AtomicHelperError.ts +50 -0
  434. package/src/internal/AtomicHelperFault.ts +84 -0
  435. package/src/internal/PipedProcess.ts +357 -0
  436. package/src/internal/ProcSnapshot.ts +193 -0
  437. package/src/internal/ProcessCleanup.ts +99 -0
  438. package/src/internal/ProcessCleanupPolicyError.ts +30 -0
  439. package/src/internal/ProcessFault.ts +82 -0
  440. package/src/internal/ProcessSupervisor.ts +807 -0
  441. package/src/internal/SupervisorProgram.ts +309 -0
  442. package/src/internal/WindowsProcessJob.ts +114 -0
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Native I/O ownership for transient commands and prepared process owners.
3
+ * @since 1.0.0
4
+ */
5
+ import * as NodeSink from "../../vendor/node/NodeSink.js";
6
+ import * as NodeStream from "../../vendor/node/NodeStream.js";
7
+ import * as Effect from "effect/Effect";
8
+ import * as PlatformError from "effect/PlatformError";
9
+ import * as Sink from "effect/Sink";
10
+ import * as Stream from "effect/Stream";
11
+ import * as ChildProcess from "effect/unstable/process/ChildProcess";
12
+ import { ExitCode, makeHandle, ProcessId } from "effect/unstable/process/ChildProcessSpawner";
13
+ import * as Native from "node:child_process";
14
+ import { NativeProcessError } from "./ProcessFault.js";
15
+ const ownerDescriptors = new WeakMap();
16
+ /**
17
+ * Windows owners receive caller streams above the reserved CRT standard slots.
18
+ * @private
19
+ * @since 1.0.0
20
+ */
21
+ export const standardFdsOf = (handle) => ownerDescriptors.get(handle);
22
+ const promise = () => {
23
+ let resolve;
24
+ let reject;
25
+ const promise = new Promise((onSuccess, onFailure) => {
26
+ resolve = onSuccess;
27
+ reject = onFailure;
28
+ });
29
+ void promise.catch(() => { });
30
+ return { promise, resolve, reject };
31
+ };
32
+ /**
33
+ * Converts native errors without losing their errno or signal.
34
+ * @private
35
+ * @since 1.0.0
36
+ */
37
+ export const failure = (method, cause) => {
38
+ const error = cause instanceof Error ? cause : new NativeProcessError({ message: String(cause) });
39
+ const code = error.code;
40
+ return PlatformError.systemError({
41
+ _tag: code === "ENOENT" ? "NotFound" : code === "EACCES" || code === "EPERM" ? "PermissionDenied" : "Unknown",
42
+ module: "ChildProcess",
43
+ method,
44
+ description: error.message,
45
+ cause: error
46
+ });
47
+ };
48
+ const inputConfig = (value) => value === undefined || typeof value === "string" || Stream.isStream(value)
49
+ ? { stream: value ?? "pipe" }
50
+ : value;
51
+ const outputConfig = (value) => value === undefined || typeof value === "string" || Sink.isSink(value)
52
+ ? value ?? "pipe"
53
+ : value.stream ?? "pipe";
54
+ const descriptorConfig = (options) => {
55
+ const stdin = inputConfig(options.stdin);
56
+ const stdout = outputConfig(options.stdout);
57
+ const stderr = outputConfig(options.stderr);
58
+ const additional = [];
59
+ for (const [name, config] of Object.entries(options.additionalFds ?? {})) {
60
+ const fd = ChildProcess.parseFdName(name);
61
+ if (fd === undefined)
62
+ continue;
63
+ // A sparse descriptor declaration must not allocate an unbounded stdio
64
+ // table. The OS may impose a smaller limit when opening the actual pipes.
65
+ if (!Number.isSafeInteger(fd) || fd > 65_535) {
66
+ throw new RangeError("Additional file descriptors must be below 65536");
67
+ }
68
+ additional.push({ fd, config });
69
+ }
70
+ additional.sort((left, right) => left.fd - right.fd);
71
+ const stdio = Array.from({ length: Math.max(2, ...additional.map(({ fd }) => fd)) + 1 }, () => "ignore");
72
+ stdio[0] = typeof stdin.stream === "string" ? stdin.stream : "pipe";
73
+ stdio[1] = typeof stdout === "string" ? stdout : "pipe";
74
+ stdio[2] = typeof stderr === "string" ? stderr : "pipe";
75
+ for (const { fd } of additional)
76
+ stdio[fd] = "pipe";
77
+ return { stdin, stdout, stderr, additional, stdio };
78
+ };
79
+ /**
80
+ * Native standard-command I/O, including configured streams and custom pipes.
81
+ * Lifetime error listeners remain on every owned pipe after any consumer is
82
+ * interrupted, so a pending native write cannot raise an unhandled late EPIPE.
83
+ * Consumers still receive the original error through NodeStream/NodeSink.
84
+ * This adapter also preserves native Windows verbatim arguments.
85
+ *
86
+ * It never sends a negative-pid signal. POSIX tree cleanup belongs to the
87
+ * prepared supervisor, which remains alive while it signals its own group.
88
+ * @private
89
+ * @since 1.0.0
90
+ */
91
+ export const spawn = (command, windowsVerbatimArguments, owner = false) => Effect.gen(function* () {
92
+ const descriptors = yield* Effect.try({
93
+ try: () => descriptorConfig(command.options),
94
+ catch: (cause) => failure("spawn", cause)
95
+ });
96
+ const standardFds = [0, 1, 2];
97
+ const physicalFds = [0, 1, 2];
98
+ const stdio = [...descriptors.stdio];
99
+ if (owner && process.platform === "win32") {
100
+ const first = stdio.length;
101
+ for (const fd of [0, 1, 2]) {
102
+ const mode = stdio[fd];
103
+ physicalFds[fd] = first + fd;
104
+ standardFds[fd] = mode === "ignore" ? "ignore" : first + fd;
105
+ stdio.push(mode === "inherit" ? fd : mode);
106
+ stdio[fd] = "ignore";
107
+ }
108
+ }
109
+ const state = yield* Effect.acquireRelease(Effect.try({
110
+ try: () => {
111
+ const ready = promise();
112
+ // Startup errors reject ready before any handle is exposed. Once
113
+ // started, the native exit event or retained native status supplies
114
+ // this result.
115
+ let recordExit;
116
+ const exited = new Promise((resolve) => {
117
+ recordExit = resolve;
118
+ });
119
+ const options = command.options;
120
+ const child = Native.spawn(command.command, [...command.args], {
121
+ cwd: options.cwd,
122
+ env: options.extendEnv ? { ...process.env, ...options.env } : options.env,
123
+ shell: options.shell,
124
+ detached: options.detached ?? process.platform !== "win32",
125
+ windowsHide: options.windowsHide ?? true,
126
+ windowsVerbatimArguments,
127
+ stdio
128
+ });
129
+ const state = {
130
+ child,
131
+ ready: ready.promise,
132
+ exited,
133
+ ended: false,
134
+ started: false,
135
+ referenced: true,
136
+ pipeErrors: new WeakMap(),
137
+ error: undefined
138
+ };
139
+ child.once("spawn", () => {
140
+ state.started = true;
141
+ ready.resolve();
142
+ });
143
+ child.on("error", (error) => {
144
+ state.error = error;
145
+ if (!state.started) {
146
+ state.ended = true;
147
+ ready.reject(error);
148
+ }
149
+ });
150
+ const onExit = (code, signal) => {
151
+ state.ended = true;
152
+ recordExit([code, signal]);
153
+ };
154
+ child.once("exit", onExit);
155
+ // Bun can emit spawn before Native.spawn returns on a cold start.
156
+ // A returned pid proves that the native child was created; failed
157
+ // native spawns have no pid and still reject through the error event.
158
+ if (child.pid !== undefined) {
159
+ state.started = true;
160
+ ready.resolve();
161
+ }
162
+ // Likewise retain an exit already reflected by the native handle
163
+ // before listeners could attach. Later events settle the same result.
164
+ if (child.exitCode != null || child.signalCode != null) {
165
+ onExit(child.exitCode ?? null, child.signalCode ?? null);
166
+ }
167
+ // A pipe can fail before a consumer has started reading or writing.
168
+ // Preserve the cause for consumers that attach after its error event.
169
+ for (const pipe of child.stdio) {
170
+ pipe?.on("error", (error) => {
171
+ state.pipeErrors.set(pipe, error);
172
+ });
173
+ }
174
+ // Node resumes unread stdio after exit to deliver its close event.
175
+ // A fast target can exit before activation returns the public handle;
176
+ // flowing at that point discards bytes before any consumer subscribes.
177
+ // Keep declared outputs in readable mode for their entire lifetime.
178
+ // This listener does not drain or copy data: the native high-water
179
+ // mark still applies backpressure until NodeStream pulls the bytes.
180
+ for (const fd of [
181
+ physicalFds[1],
182
+ physicalFds[2],
183
+ ...descriptors.additional.filter(({ config }) => config.type === "output").map(({ fd }) => fd)
184
+ ]) {
185
+ const pipe = child.stdio[fd];
186
+ pipe?.on("readable", () => { });
187
+ // POSIX sockets can close the unused writer independently. Bun
188
+ // needs this to retain buffered output after child exit. Windows
189
+ // named-pipe shutdown instead starts libuv's EOF timer, which can
190
+ // close both directions before the child writes. Leave it open.
191
+ if (process.platform !== "win32" && fd > 2 && pipe !== null && pipe !== undefined && "end" in pipe) {
192
+ pipe.end();
193
+ }
194
+ }
195
+ return state;
196
+ },
197
+ catch: (cause) => failure("spawn", cause)
198
+ }), (state) => Effect.gen(function* () {
199
+ if (state.referenced && !state.ended) {
200
+ yield* Effect.try({
201
+ try: () => {
202
+ // Native kill returns false for an exit whose event is still
203
+ // queued. Require that event below; never infer a live failure
204
+ // or successful cleanup from the boolean alone.
205
+ if (!state.child.kill("SIGKILL") && state.error !== undefined)
206
+ throw state.error;
207
+ },
208
+ catch: (cause) => failure("kill", cause)
209
+ });
210
+ yield* Effect.promise(() => state.exited).pipe(Effect.timeout("2 seconds"));
211
+ }
212
+ }).pipe(Effect.ensuring(Effect.sync(() => {
213
+ for (const pipe of state.child.stdio) {
214
+ if (pipe !== null && pipe !== undefined && "destroy" in pipe && typeof pipe.destroy === "function") {
215
+ pipe.destroy();
216
+ }
217
+ }
218
+ })), Effect.orDie));
219
+ yield* Effect.tryPromise({ try: () => state.ready, catch: (cause) => failure("spawn", cause) });
220
+ const wait = Effect.promise(() => state.exited);
221
+ const kill = (options) => Effect.suspend(() => {
222
+ if (state.ended)
223
+ return Effect.void;
224
+ const signal = options?.killSignal ?? command.options.killSignal ?? "SIGTERM";
225
+ const send = (signal) => Effect.try({
226
+ try: () => {
227
+ if (!state.child.kill(signal) && state.error !== undefined)
228
+ throw state.error;
229
+ },
230
+ catch: (cause) => failure("kill", cause)
231
+ });
232
+ return send(signal).pipe(Effect.andThen(wait.pipe(Effect.timeoutOrElse({
233
+ duration: options?.forceKillAfter ?? command.options.forceKillAfter ?? 2000,
234
+ orElse: () => send("SIGKILL").pipe(Effect.andThen(wait), Effect.timeout("2 seconds"))
235
+ }))), Effect.mapError((cause) => cause instanceof PlatformError.PlatformError ? cause : failure("kill", cause)), Effect.asVoid, Effect.uninterruptible);
236
+ });
237
+ const input = (fd, config) => {
238
+ const pipe = state.child.stdio[fd];
239
+ if (pipe === null || pipe === undefined || !("write" in pipe))
240
+ return Sink.drain;
241
+ const writable = pipe;
242
+ const method = fd === 0 ? "stdin" : `fd${fd}`;
243
+ return Sink.suspend(() => {
244
+ const error = state.pipeErrors.get(pipe) ?? writable.errored ?? undefined;
245
+ if (error !== undefined)
246
+ return Sink.fail(failure(method, error));
247
+ if (writable.destroyed || writable.writableEnded) {
248
+ return Sink.fail(failure(method, new NativeProcessError({ message: `${method} is closed`, code: "EPIPE" })));
249
+ }
250
+ return NodeSink.fromWritable({
251
+ evaluate: () => writable,
252
+ onError: (cause) => failure(method, cause),
253
+ encoding: config?.encoding,
254
+ endOnDone: config?.endOnDone
255
+ });
256
+ });
257
+ };
258
+ const output = (fd, transform) => {
259
+ const pipe = state.child.stdio[fd];
260
+ const stream = pipe !== null && pipe !== undefined && "read" in pipe
261
+ ? Stream.suspend(() => {
262
+ const method = fd === 1 ? "stdout" : fd === 2 ? "stderr" : `fd${fd}`;
263
+ const error = state.pipeErrors.get(pipe) ?? pipe.errored ?? undefined;
264
+ return error !== undefined ?
265
+ Stream.fail(failure(method, error)) :
266
+ NodeStream.fromReadable({
267
+ evaluate: () => pipe,
268
+ onError: (cause) => failure(method, cause)
269
+ });
270
+ })
271
+ : Stream.empty;
272
+ return Sink.isSink(transform) ? Stream.transduce(stream, transform) : stream;
273
+ };
274
+ const stdin = input(physicalFds[0], descriptors.stdin);
275
+ const stdout = output(physicalFds[1], descriptors.stdout);
276
+ const stderr = output(physicalFds[2], descriptors.stderr);
277
+ if (Stream.isStream(descriptors.stdin.stream)) {
278
+ yield* Stream.run(descriptors.stdin.stream, stdin).pipe(Effect.forkScoped);
279
+ }
280
+ const inputs = new Map();
281
+ const outputs = new Map();
282
+ for (const { fd, config } of descriptors.additional) {
283
+ if (config.type === "input") {
284
+ const sink = input(fd);
285
+ inputs.set(fd, sink);
286
+ if (config.stream !== undefined)
287
+ yield* Stream.run(config.stream, sink).pipe(Effect.forkScoped);
288
+ }
289
+ else
290
+ outputs.set(fd, output(fd, config.sink));
291
+ }
292
+ const handle = makeHandle({
293
+ pid: ProcessId(state.child.pid),
294
+ exitCode: wait.pipe(Effect.flatMap(([code, signal]) => code === null
295
+ ? Effect.fail(failure("exitCode", new NativeProcessError({
296
+ message: `Process interrupted due to receipt of signal: '${signal}'`,
297
+ signal: String(signal)
298
+ })))
299
+ : Effect.succeed(ExitCode(code)))),
300
+ isRunning: Effect.sync(() => !state.ended),
301
+ kill,
302
+ stdin,
303
+ stdout,
304
+ stderr,
305
+ all: Stream.merge(stdout, stderr),
306
+ getInputFd: (fd) => inputs.get(fd) ?? Sink.drain,
307
+ getOutputFd: (fd) => outputs.get(fd) ?? Stream.empty,
308
+ unref: Effect.sync(() => {
309
+ state.referenced = false;
310
+ state.child.unref();
311
+ return Effect.sync(() => {
312
+ state.referenced = true;
313
+ state.child.ref();
314
+ });
315
+ })
316
+ });
317
+ if (owner && process.platform === "win32")
318
+ ownerDescriptors.set(handle, standardFds);
319
+ return handle;
320
+ });
321
+ //# sourceMappingURL=PipedProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipedProcess.js","sourceRoot":"","sources":["../../../src/internal/PipedProcess.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Native I/O ownership for transient commands and prepared process owners.\n * @since 1.0.0\n */\n\nimport * as NodeSink from \"@effect/platform-node/NodeSink\"\nimport * as NodeStream from \"@effect/platform-node/NodeStream\"\nimport * as Effect from \"effect/Effect\"\nimport * as PlatformError from \"effect/PlatformError\"\nimport type * as Scope from \"effect/Scope\"\nimport * as Sink from \"effect/Sink\"\nimport * as Stream from \"effect/Stream\"\nimport * as ChildProcess from \"effect/unstable/process/ChildProcess\"\nimport { type ChildProcessHandle, ExitCode, makeHandle, ProcessId } from \"effect/unstable/process/ChildProcessSpawner\"\nimport * as Native from \"node:child_process\"\nimport { NativeProcessError } from \"./ProcessFault.ts\"\n\nconst ownerDescriptors = new WeakMap<ChildProcessHandle, ReadonlyArray<number | \"ignore\">>()\n\n/**\n * Windows owners receive caller streams above the reserved CRT standard slots.\n * @private\n * @since 1.0.0\n */\nexport const standardFdsOf = (handle: ChildProcessHandle): ReadonlyArray<number | \"ignore\"> | undefined =>\n ownerDescriptors.get(handle)\n\nconst promise = <A>() => {\n let resolve!: (value: A) => void\n let reject!: (cause: unknown) => void\n const promise = new Promise<A>((onSuccess, onFailure) => {\n resolve = onSuccess\n reject = onFailure\n })\n void promise.catch(() => {})\n return { promise, resolve, reject }\n}\n\n/**\n * Converts native errors without losing their errno or signal.\n * @private\n * @since 1.0.0\n */\nexport const failure = (method: string, cause: unknown): PlatformError.PlatformError => {\n const error = cause instanceof Error ? cause : new NativeProcessError({ message: String(cause) })\n const code = (error as NodeJS.ErrnoException).code\n return PlatformError.systemError({\n _tag: code === \"ENOENT\" ? \"NotFound\" : code === \"EACCES\" || code === \"EPERM\" ? \"PermissionDenied\" : \"Unknown\",\n module: \"ChildProcess\",\n method,\n description: error.message,\n cause: error\n })\n}\n\nconst inputConfig = (value: ChildProcess.CommandOptions[\"stdin\"]): ChildProcess.StdinConfig =>\n value === undefined || typeof value === \"string\" || Stream.isStream(value)\n ? { stream: value ?? \"pipe\" }\n : value\n\nconst outputConfig = (\n value: ChildProcess.CommandOptions[\"stdout\"]\n): ChildProcess.CommandOutput =>\n value === undefined || typeof value === \"string\" || Sink.isSink(value)\n ? value ?? \"pipe\"\n : value.stream ?? \"pipe\"\n\nconst descriptorConfig = (options: ChildProcess.CommandOptions) => {\n const stdin = inputConfig(options.stdin)\n const stdout = outputConfig(options.stdout)\n const stderr = outputConfig(options.stderr)\n const additional: Array<{ readonly fd: number; readonly config: ChildProcess.AdditionalFdConfig }> = []\n for (const [name, config] of Object.entries(options.additionalFds ?? {})) {\n const fd = ChildProcess.parseFdName(name)\n if (fd === undefined) continue\n // A sparse descriptor declaration must not allocate an unbounded stdio\n // table. The OS may impose a smaller limit when opening the actual pipes.\n if (!Number.isSafeInteger(fd) || fd > 65_535) {\n throw new RangeError(\"Additional file descriptors must be below 65536\")\n }\n additional.push({ fd, config })\n }\n additional.sort((left, right) => left.fd - right.fd)\n const stdio: Array<Native.IOType> = Array.from(\n { length: Math.max(2, ...additional.map(({ fd }) => fd)) + 1 },\n () => \"ignore\"\n )\n stdio[0] = typeof stdin.stream === \"string\" ? stdin.stream : \"pipe\"\n stdio[1] = typeof stdout === \"string\" ? stdout : \"pipe\"\n stdio[2] = typeof stderr === \"string\" ? stderr : \"pipe\"\n for (const { fd } of additional) stdio[fd] = \"pipe\"\n return { stdin, stdout, stderr, additional, stdio }\n}\n\n/**\n * Native standard-command I/O, including configured streams and custom pipes.\n * Lifetime error listeners remain on every owned pipe after any consumer is\n * interrupted, so a pending native write cannot raise an unhandled late EPIPE.\n * Consumers still receive the original error through NodeStream/NodeSink.\n * This adapter also preserves native Windows verbatim arguments.\n *\n * It never sends a negative-pid signal. POSIX tree cleanup belongs to the\n * prepared supervisor, which remains alive while it signals its own group.\n * @private\n * @since 1.0.0\n */\nexport const spawn = (\n command: ChildProcess.StandardCommand,\n windowsVerbatimArguments: boolean | undefined,\n owner = false\n): Effect.Effect<ChildProcessHandle, PlatformError.PlatformError, Scope.Scope> =>\n Effect.gen(function*() {\n const descriptors = yield* Effect.try({\n try: () => descriptorConfig(command.options),\n catch: (cause) => failure(\"spawn\", cause)\n })\n const standardFds: Array<number | \"ignore\"> = [0, 1, 2]\n const physicalFds = [0, 1, 2]\n const stdio: Array<Native.IOType | number> = [...descriptors.stdio]\n if (owner && process.platform === \"win32\") {\n const first = stdio.length\n for (const fd of [0, 1, 2]) {\n const mode = stdio[fd]!\n physicalFds[fd] = first + fd\n standardFds[fd] = mode === \"ignore\" ? \"ignore\" : first + fd\n stdio.push(mode === \"inherit\" ? fd : mode)\n stdio[fd] = \"ignore\"\n }\n }\n const state = yield* Effect.acquireRelease(\n Effect.try({\n try: () => {\n const ready = promise<void>()\n // Startup errors reject ready before any handle is exposed. Once\n // started, the native exit event or retained native status supplies\n // this result.\n let recordExit!: (result: readonly [number | null, NodeJS.Signals | null]) => void\n const exited = new Promise<readonly [number | null, NodeJS.Signals | null]>((resolve) => {\n recordExit = resolve\n })\n const options = command.options\n const child = Native.spawn(command.command, [...command.args], {\n cwd: options.cwd,\n env: options.extendEnv ? { ...process.env, ...options.env } : options.env,\n shell: options.shell,\n detached: options.detached ?? process.platform !== \"win32\",\n windowsHide: options.windowsHide ?? true,\n windowsVerbatimArguments,\n stdio\n })\n const state = {\n child,\n ready: ready.promise,\n exited,\n ended: false,\n started: false,\n referenced: true,\n pipeErrors: new WeakMap<object, Error>(),\n error: undefined as Error | undefined\n }\n child.once(\"spawn\", () => {\n state.started = true\n ready.resolve()\n })\n child.on(\"error\", (error) => {\n state.error = error\n if (!state.started) {\n state.ended = true\n ready.reject(error)\n }\n })\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n state.ended = true\n recordExit([code, signal])\n }\n child.once(\"exit\", onExit)\n // Bun can emit spawn before Native.spawn returns on a cold start.\n // A returned pid proves that the native child was created; failed\n // native spawns have no pid and still reject through the error event.\n if (child.pid !== undefined) {\n state.started = true\n ready.resolve()\n }\n // Likewise retain an exit already reflected by the native handle\n // before listeners could attach. Later events settle the same result.\n if (child.exitCode != null || child.signalCode != null) {\n onExit(child.exitCode ?? null, child.signalCode ?? null)\n }\n // A pipe can fail before a consumer has started reading or writing.\n // Preserve the cause for consumers that attach after its error event.\n for (const pipe of child.stdio) {\n pipe?.on(\"error\", (error: Error) => {\n state.pipeErrors.set(pipe, error)\n })\n }\n // Node resumes unread stdio after exit to deliver its close event.\n // A fast target can exit before activation returns the public handle;\n // flowing at that point discards bytes before any consumer subscribes.\n // Keep declared outputs in readable mode for their entire lifetime.\n // This listener does not drain or copy data: the native high-water\n // mark still applies backpressure until NodeStream pulls the bytes.\n for (\n const fd of [\n physicalFds[1]!,\n physicalFds[2]!,\n ...descriptors.additional.filter(({ config }) => config.type === \"output\").map(({ fd }) => fd)\n ]\n ) {\n const pipe = child.stdio[fd]\n pipe?.on(\"readable\", () => {})\n // POSIX sockets can close the unused writer independently. Bun\n // needs this to retain buffered output after child exit. Windows\n // named-pipe shutdown instead starts libuv's EOF timer, which can\n // close both directions before the child writes. Leave it open.\n if (process.platform !== \"win32\" && fd > 2 && pipe !== null && pipe !== undefined && \"end\" in pipe) {\n pipe.end()\n }\n }\n return state\n },\n catch: (cause) => failure(\"spawn\", cause)\n }),\n (state) =>\n Effect.gen(function*() {\n if (state.referenced && !state.ended) {\n yield* Effect.try({\n try: () => {\n // Native kill returns false for an exit whose event is still\n // queued. Require that event below; never infer a live failure\n // or successful cleanup from the boolean alone.\n if (!state.child.kill(\"SIGKILL\") && state.error !== undefined) throw state.error\n },\n catch: (cause) => failure(\"kill\", cause)\n })\n yield* Effect.promise(() => state.exited).pipe(\n Effect.timeout(\"2 seconds\")\n )\n }\n }).pipe(\n Effect.ensuring(Effect.sync(() => {\n for (const pipe of state.child.stdio) {\n if (pipe !== null && pipe !== undefined && \"destroy\" in pipe && typeof pipe.destroy === \"function\") {\n pipe.destroy()\n }\n }\n })),\n Effect.orDie\n )\n )\n yield* Effect.tryPromise({ try: () => state.ready, catch: (cause) => failure(\"spawn\", cause) })\n const wait = Effect.promise(() => state.exited)\n const kill: ChildProcessHandle[\"kill\"] = (options) =>\n Effect.suspend(() => {\n if (state.ended) return Effect.void\n const signal = options?.killSignal ?? command.options.killSignal ?? \"SIGTERM\"\n const send = (signal: ChildProcess.Signal) =>\n Effect.try({\n try: () => {\n if (!state.child.kill(signal) && state.error !== undefined) throw state.error\n },\n catch: (cause) => failure(\"kill\", cause)\n })\n return send(signal).pipe(\n Effect.andThen(wait.pipe(Effect.timeoutOrElse({\n duration: options?.forceKillAfter ?? command.options.forceKillAfter ?? 2000,\n orElse: () => send(\"SIGKILL\").pipe(Effect.andThen(wait), Effect.timeout(\"2 seconds\"))\n }))),\n Effect.mapError((cause) => cause instanceof PlatformError.PlatformError ? cause : failure(\"kill\", cause)),\n Effect.asVoid,\n Effect.uninterruptible\n )\n })\n const input = (fd: number, config?: ChildProcess.StdinConfig): ChildProcessHandle[\"stdin\"] => {\n const pipe = state.child.stdio[fd]\n if (pipe === null || pipe === undefined || !(\"write\" in pipe)) return Sink.drain\n const writable = pipe\n const method = fd === 0 ? \"stdin\" : `fd${fd}`\n return Sink.suspend(() => {\n const error = state.pipeErrors.get(pipe) ?? writable.errored ?? undefined\n if (error !== undefined) return Sink.fail(failure(method, error))\n if (writable.destroyed || writable.writableEnded) {\n return Sink.fail(failure(method, new NativeProcessError({ message: `${method} is closed`, code: \"EPIPE\" })))\n }\n return NodeSink.fromWritable({\n evaluate: () => writable,\n onError: (cause) => failure(method, cause),\n encoding: config?.encoding,\n endOnDone: config?.endOnDone\n })\n })\n }\n const output = (fd: number, transform?: ChildProcess.CommandOutput): ChildProcessHandle[\"stdout\"] => {\n const pipe = state.child.stdio[fd]\n const stream = pipe !== null && pipe !== undefined && \"read\" in pipe\n ? Stream.suspend(() => {\n const method = fd === 1 ? \"stdout\" : fd === 2 ? \"stderr\" : `fd${fd}`\n const error = state.pipeErrors.get(pipe) ?? pipe.errored ?? undefined\n return error !== undefined ?\n Stream.fail(failure(method, error)) :\n NodeStream.fromReadable<Uint8Array, PlatformError.PlatformError>({\n evaluate: () => pipe,\n onError: (cause) => failure(method, cause)\n })\n })\n : Stream.empty\n return Sink.isSink(transform) ? Stream.transduce(stream, transform) : stream\n }\n const stdin = input(physicalFds[0]!, descriptors.stdin)\n const stdout = output(physicalFds[1]!, descriptors.stdout)\n const stderr = output(physicalFds[2]!, descriptors.stderr)\n if (Stream.isStream(descriptors.stdin.stream)) {\n yield* Stream.run(descriptors.stdin.stream, stdin).pipe(Effect.forkScoped)\n }\n const inputs = new Map<number, ChildProcessHandle[\"stdin\"]>()\n const outputs = new Map<number, ChildProcessHandle[\"stdout\"]>()\n for (const { fd, config } of descriptors.additional) {\n if (config.type === \"input\") {\n const sink = input(fd)\n inputs.set(fd, sink)\n if (config.stream !== undefined) yield* Stream.run(config.stream, sink).pipe(Effect.forkScoped)\n } else outputs.set(fd, output(fd, config.sink))\n }\n const handle = makeHandle({\n pid: ProcessId(state.child.pid!),\n exitCode: wait.pipe(Effect.flatMap(([code, signal]) =>\n code === null\n ? Effect.fail(\n failure(\n \"exitCode\",\n new NativeProcessError({\n message: `Process interrupted due to receipt of signal: '${signal}'`,\n signal: String(signal)\n })\n )\n )\n : Effect.succeed(ExitCode(code))\n )),\n isRunning: Effect.sync(() => !state.ended),\n kill,\n stdin,\n stdout,\n stderr,\n all: Stream.merge(stdout, stderr),\n getInputFd: (fd) => inputs.get(fd) ?? Sink.drain,\n getOutputFd: (fd) => outputs.get(fd) ?? Stream.empty,\n unref: Effect.sync(() => {\n state.referenced = false\n state.child.unref()\n return Effect.sync(() => {\n state.referenced = true\n state.child.ref()\n })\n })\n })\n if (owner && process.platform === \"win32\") ownerDescriptors.set(handle, standardFds)\n return handle\n })\n"]}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Process-group observation read from Linux `/proc`, with no `ps` binary.
3
+ * @since 1.0.0
4
+ */
5
+ import type * as ProcessCleanup from "./ProcessCleanup.ts";
6
+ /**
7
+ * The kernel's own process table, which is the production root.
8
+ * @private
9
+ * @since 1.0.0
10
+ */
11
+ export declare const defaultProcRoot = "/proc";
12
+ /**
13
+ * The `/proc` root a platform publishes its process table under, if any.
14
+ * @private
15
+ * @since 1.0.0-rc.1
16
+ */
17
+ export declare const rootFor: (platform: string) => string | undefined;
18
+ /**
19
+ * One process's group, zombie state and start time, from a `/proc/<pid>/stat`
20
+ * line.
21
+ *
22
+ * `comm` is the second field, it is wrapped in parentheses, and a process may
23
+ * put both spaces and parentheses inside it, so the numeric fields after it are
24
+ * taken from the LAST `)` rather than by splitting the whole line. The first
25
+ * field after that paren is field 3, so field N is at index N - 3.
26
+ *
27
+ * Anything that is not a stat line in that shape answers `undefined` rather
28
+ * than a record built out of whichever fields happened to parse.
29
+ * @private
30
+ * @since 1.0.0
31
+ */
32
+ export declare const parseStat: (text: string, bootMs: number) => {
33
+ readonly pgid: number;
34
+ readonly member: ProcessCleanup.Member;
35
+ } | undefined;
36
+ /**
37
+ * Every member of `pgid`, plus this process's own group, read from `/proc`.
38
+ *
39
+ * Answering `undefined` means the question could not be asked here, which is
40
+ * what a non-Linux host and a `hidepid` mount both produce; the caller keeps
41
+ * its record rather than acting on a table it could not read. A pid that
42
+ * disappears between listing the directory and reading its `stat` is not an
43
+ * unreadable table: it is a process that ended, which is the same end state as
44
+ * never having been in the group, so it is skipped.
45
+ * @private
46
+ * @since 1.0.0
47
+ */
48
+ export declare const snapshot: (root: string) => (pgid: number) => ProcessCleanup.Snapshot | undefined;
49
+ /**
50
+ * This machine's boot instant from `${root}/stat`, in epoch milliseconds, or
51
+ * `undefined` when the table cannot be read here.
52
+ * @private
53
+ * @since 1.0.0
54
+ */
55
+ export declare const bootMs: (root: string) => number | undefined;
56
+ /**
57
+ * This process's own process group, read from `/proc/self/stat`, or `null`
58
+ * when the file cannot be read or parsed.
59
+ *
60
+ * The reaper's own-group guard needs this number before it may signal any
61
+ * group. Reading it here instead of from `ps` keeps the guard working on a
62
+ * Linux image that ships no `procps`.
63
+ * @private
64
+ * @since 1.0.0
65
+ */
66
+ export declare const ownGroup: (root: string) => () => number | null;
67
+ /**
68
+ * When `pid` started, in epoch milliseconds, read from `/proc/<pid>/stat` and
69
+ * `/proc/stat`'s `btime`.
70
+ *
71
+ * `gone` is the table having no entry for the pid (`ENOENT`). Every other
72
+ * failure is `unavailable`: the question could not be asked, so the caller
73
+ * keeps its record instead of acting on it.
74
+ * @private
75
+ * @since 1.0.0
76
+ */
77
+ export declare const startedAtMs: (root: string) => (pid: number) => {
78
+ readonly _tag: "started";
79
+ readonly startedAtMs: number;
80
+ } | {
81
+ readonly _tag: "gone";
82
+ } | {
83
+ readonly _tag: "unavailable";
84
+ };
85
+ //# sourceMappingURL=ProcSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcSnapshot.d.ts","sourceRoot":"","sources":["../../../src/internal/ProcSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,eAAe,UAAU,CAAA;AAEtC;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,KAAG,MAAM,GAAG,SAA+D,CAAA;AAoBnH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,MAAM,EACZ,QAAQ,MAAM,KACb;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAA;CAAE,GAAG,SAoBtE,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,MAAM,MAAM,MAAM,KAAG,cAAc,CAAC,QAAQ,GAAG,SAgCnF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAS9C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,WAAS,MAAM,GAAG,IAOtD,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,MAEtC,KAAK,MAAM,KAET;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAejC,CAAA"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Process-group observation read from Linux `/proc`, with no `ps` binary.
3
+ * @since 1.0.0
4
+ */
5
+ import { readdirSync, readFileSync } from "node:fs";
6
+ /**
7
+ * The kernel's own process table, which is the production root.
8
+ * @private
9
+ * @since 1.0.0
10
+ */
11
+ export const defaultProcRoot = "/proc";
12
+ /**
13
+ * The `/proc` root a platform publishes its process table under, if any.
14
+ * @private
15
+ * @since 1.0.0-rc.1
16
+ */
17
+ export const rootFor = (platform) => platform === "linux" ? defaultProcRoot : undefined;
18
+ /**
19
+ * `/proc` reports `starttime` in USER_HZ, which Linux fixes at 100 for this
20
+ * interface however the running kernel is configured.
21
+ */
22
+ const userHz = 100;
23
+ /** A pid, as both a directory name and the first field of a stat line. */
24
+ const pidName = /^[0-9]+$/;
25
+ /** `/proc/stat`'s boot instant, in seconds since the epoch. */
26
+ const bootLine = /^btime[ \t]+([0-9]+)$/m;
27
+ /** Fields 3 through 22 inclusive: state, then pgrp third, then starttime. */
28
+ const statFieldsAfterComm = 20;
29
+ /** A read that failed because the file is no longer there. */
30
+ const missing = (cause) => cause.code === "ENOENT";
31
+ /**
32
+ * One process's group, zombie state and start time, from a `/proc/<pid>/stat`
33
+ * line.
34
+ *
35
+ * `comm` is the second field, it is wrapped in parentheses, and a process may
36
+ * put both spaces and parentheses inside it, so the numeric fields after it are
37
+ * taken from the LAST `)` rather than by splitting the whole line. The first
38
+ * field after that paren is field 3, so field N is at index N - 3.
39
+ *
40
+ * Anything that is not a stat line in that shape answers `undefined` rather
41
+ * than a record built out of whichever fields happened to parse.
42
+ * @private
43
+ * @since 1.0.0
44
+ */
45
+ export const parseStat = (text, bootMs) => {
46
+ const open = text.indexOf("(");
47
+ const close = text.lastIndexOf(")");
48
+ if (open <= 0 || close < open)
49
+ return undefined;
50
+ const head = text.slice(0, open).trim();
51
+ if (!pidName.test(head))
52
+ return undefined;
53
+ const after = text.slice(close + 1).trim().split(/[ \t]+/);
54
+ if (after.length < statFieldsAfterComm)
55
+ return undefined;
56
+ const pid = Number(head);
57
+ const pgid = Number(after[2]);
58
+ const startedTicks = Number(after[19]);
59
+ if (!Number.isSafeInteger(pid) || !Number.isSafeInteger(pgid) || !Number.isSafeInteger(startedTicks)) {
60
+ return undefined;
61
+ }
62
+ return {
63
+ pgid,
64
+ // A zombie holds a slot without being a process the caller has to wait for,
65
+ // so the distinction has to survive the read.
66
+ member: { pid, startedAtMs: bootMs + Math.round((startedTicks / userHz) * 1000), zombie: after[0] === "Z" }
67
+ };
68
+ };
69
+ /**
70
+ * Every member of `pgid`, plus this process's own group, read from `/proc`.
71
+ *
72
+ * Answering `undefined` means the question could not be asked here, which is
73
+ * what a non-Linux host and a `hidepid` mount both produce; the caller keeps
74
+ * its record rather than acting on a table it could not read. A pid that
75
+ * disappears between listing the directory and reading its `stat` is not an
76
+ * unreadable table: it is a process that ended, which is the same end state as
77
+ * never having been in the group, so it is skipped.
78
+ * @private
79
+ * @since 1.0.0
80
+ */
81
+ export const snapshot = (root) => (pgid) => {
82
+ let bootMs;
83
+ let ownGroup;
84
+ let names;
85
+ try {
86
+ const boot = bootLine.exec(readFileSync(`${root}/stat`, "utf8"));
87
+ if (boot === null)
88
+ return undefined;
89
+ bootMs = Number(boot[1]) * 1000;
90
+ if (!Number.isSafeInteger(bootMs))
91
+ return undefined;
92
+ const self = parseStat(readFileSync(`${root}/self/stat`, "utf8"), bootMs);
93
+ if (self === undefined || self.pgid <= 0)
94
+ return undefined;
95
+ ownGroup = self.pgid;
96
+ names = readdirSync(root);
97
+ }
98
+ catch {
99
+ return undefined;
100
+ }
101
+ const members = [];
102
+ for (const name of names) {
103
+ if (!pidName.test(name))
104
+ continue;
105
+ let text;
106
+ try {
107
+ text = readFileSync(`${root}/${name}/stat`, "utf8");
108
+ }
109
+ catch (cause) {
110
+ if (missing(cause))
111
+ continue;
112
+ return undefined;
113
+ }
114
+ const parsed = parseStat(text, bootMs);
115
+ if (parsed === undefined)
116
+ return undefined;
117
+ if (parsed.pgid !== pgid)
118
+ continue;
119
+ members.push(parsed.member);
120
+ }
121
+ return { ownGroup, members };
122
+ };
123
+ /**
124
+ * This machine's boot instant from `${root}/stat`, in epoch milliseconds, or
125
+ * `undefined` when the table cannot be read here.
126
+ * @private
127
+ * @since 1.0.0
128
+ */
129
+ export const bootMs = (root) => {
130
+ try {
131
+ const boot = bootLine.exec(readFileSync(`${root}/stat`, "utf8"));
132
+ if (boot === null)
133
+ return undefined;
134
+ const ms = Number(boot[1]) * 1000;
135
+ return Number.isSafeInteger(ms) ? ms : undefined;
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ };
141
+ /**
142
+ * This process's own process group, read from `/proc/self/stat`, or `null`
143
+ * when the file cannot be read or parsed.
144
+ *
145
+ * The reaper's own-group guard needs this number before it may signal any
146
+ * group. Reading it here instead of from `ps` keeps the guard working on a
147
+ * Linux image that ships no `procps`.
148
+ * @private
149
+ * @since 1.0.0
150
+ */
151
+ export const ownGroup = (root) => () => {
152
+ try {
153
+ const self = parseStat(readFileSync(`${root}/self/stat`, "utf8"), 0);
154
+ return self === undefined || self.pgid <= 0 ? null : self.pgid;
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ };
160
+ /**
161
+ * When `pid` started, in epoch milliseconds, read from `/proc/<pid>/stat` and
162
+ * `/proc/stat`'s `btime`.
163
+ *
164
+ * `gone` is the table having no entry for the pid (`ENOENT`). Every other
165
+ * failure is `unavailable`: the question could not be asked, so the caller
166
+ * keeps its record instead of acting on it.
167
+ * @private
168
+ * @since 1.0.0
169
+ */
170
+ export const startedAtMs = (root) => (pid) => {
171
+ if (!Number.isSafeInteger(pid) || pid <= 0)
172
+ return { _tag: "unavailable" };
173
+ const boot = bootMs(root);
174
+ if (boot === undefined)
175
+ return { _tag: "unavailable" };
176
+ let text;
177
+ try {
178
+ text = readFileSync(`${root}/${pid}/stat`, "utf8");
179
+ }
180
+ catch (cause) {
181
+ return missing(cause) ? { _tag: "gone" } : { _tag: "unavailable" };
182
+ }
183
+ const parsed = parseStat(text, boot);
184
+ return parsed === undefined || parsed.member.pid !== pid
185
+ ? { _tag: "unavailable" }
186
+ : { _tag: "started", startedAtMs: parsed.member.startedAtMs };
187
+ };
188
+ //# sourceMappingURL=ProcSnapshot.js.map