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

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 +287 -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 +377 -0
  34. package/dist/cjs/ProcessSandbox.d.ts.map +1 -0
  35. package/dist/cjs/ProcessSandbox.js +759 -0
  36. package/dist/cjs/ProcessSandbox.js.map +7 -0
  37. package/dist/cjs/ScopedProcess.d.ts +65 -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 +141 -0
  86. package/dist/cjs/internal/ProcessSupervisor.d.ts.map +1 -0
  87. package/dist/cjs/internal/ProcessSupervisor.js +682 -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 +306 -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 +377 -0
  123. package/dist/esm/ProcessSandbox.d.ts.map +1 -0
  124. package/dist/esm/ProcessSandbox.js +1014 -0
  125. package/dist/esm/ProcessSandbox.js.map +1 -0
  126. package/dist/esm/ScopedProcess.d.ts +65 -0
  127. package/dist/esm/ScopedProcess.d.ts.map +1 -0
  128. package/dist/esm/ScopedProcess.js +66 -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 +141 -0
  175. package/dist/esm/internal/ProcessSupervisor.d.ts.map +1 -0
  176. package/dist/esm/internal/ProcessSupervisor.js +682 -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 +290 -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 +552 -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 +182 -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 +356 -0
  426. package/src/ProcessReaper.ts +951 -0
  427. package/src/ProcessSandbox.ts +1273 -0
  428. package/src/ScopedProcess.ts +123 -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 +801 -0
  441. package/src/internal/SupervisorProgram.ts +289 -0
  442. package/src/internal/WindowsProcessJob.ts +114 -0
@@ -0,0 +1,289 @@
1
+ /**
2
+ * The isolated POSIX group owner. Kept as source because the same fixed program
3
+ * runs in Node and Bun without loading the caller's modules or configuration.
4
+ * Its behavior is exercised through the real prepared lifecycle tests.
5
+ * @private
6
+ * @since 1.0.0
7
+ */
8
+ export const source = String.raw`
9
+ // A fault of the owner itself: reason is its stable code on the status wire.
10
+ class SupervisorFault extends Error {
11
+ constructor(reason, message) { super(message); this.name = 'SupervisorFault'; this.reason = reason; }
12
+ }
13
+ const fs = require('node:fs');
14
+ const net = require('node:net');
15
+ const cp = require('node:child_process');
16
+ const [socketPath, mode] = process.argv.slice(-2);
17
+ const grouped = mode === 'group';
18
+ const jobHelper = process.env.SMITHERS_PROCESS_JOB_HELPER;
19
+ delete process.env.SMITHERS_PROCESS_JOB_HELPER;
20
+ let created;
21
+ if (jobHelper !== undefined) {
22
+ // The still-live owner observes itself. A later PID reuse cannot replace this
23
+ // identity with a different process before the guardian attaches its job.
24
+ const result = cp.spawnSync(jobHelper, ['--process-identity', String(process.pid)], {
25
+ encoding: 'utf8', timeout: 5000, killSignal: 'SIGKILL', maxBuffer: 4096, env: {}
26
+ });
27
+ if (result.error || result.signal !== null || result.status !== 0) throw new SupervisorFault('owner_identity_unavailable', 'Owner identity unavailable');
28
+ const identity = JSON.parse(result.stdout);
29
+ if (identity?.status !== 'started' || typeof identity.created !== 'string' || !/^[1-9][0-9]{0,19}$/.test(identity.created)) {
30
+ throw new SupervisorFault('owner_identity_unavailable', 'Owner creation identity unavailable');
31
+ }
32
+ created = identity.created;
33
+ }
34
+ const channel = process.env.SMITHERS_PROCESS_CHANNEL ? JSON.parse(process.env.SMITHERS_PROCESS_CHANNEL) : undefined;
35
+ delete process.env.SMITHERS_PROCESS_CHANNEL;
36
+ const connect = path => channel === undefined ? net.connect(path) : require('node:tls').connect({
37
+ minVersion: 'TLSv1.3', maxVersion: 'TLSv1.3', ciphers: 'TLS_AES_128_GCM_SHA256',
38
+ host: '127.0.0.1', port: path.endsWith('/r') ? channel.requests : channel.status,
39
+ pskCallback: () => ({ identity: 'smithers-owner', psk: Buffer.from(channel.key, 'hex') })
40
+ });
41
+ const control = connect(socketPath);
42
+ // A request write racing our exit may get EPIPE. Keep status on its own
43
+ // connection so the host still receives the exit and cleanup already sent.
44
+ const requests = connect(socketPath.replace(/\/s$/, '/r'));
45
+ let config;
46
+ let target;
47
+ let targetDone = false;
48
+ let stopping = false;
49
+ let explicitStop = false;
50
+ let killing = false;
51
+ let buffer = '';
52
+ let timer;
53
+ let escaped = new Map();
54
+
55
+ // DirectorySandbox's trusted local explicit-stop contract also covers children
56
+ // that deliberately create another session. This is best-effort positive-pid
57
+ // signalling with identity revalidation, not the atomic own-group guarantee.
58
+ // Linux reads its kernel table because slim images ship no procps (and BusyBox
59
+ // ps lacks these columns); other POSIX hosts ask their system ps.
60
+ const procSnapshot = () => {
61
+ let names;
62
+ try { names = fs.readdirSync('/proc'); }
63
+ catch { throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable'); }
64
+ const rows = new Map();
65
+ for (const name of names) {
66
+ if (!/^[0-9]+$/.test(name)) continue;
67
+ let text;
68
+ try { text = fs.readFileSync('/proc/' + name + '/stat', 'utf8'); }
69
+ catch (error) {
70
+ // A process that ended after the listing is not an unreadable table.
71
+ if (error.code === 'ENOENT' || error.code === 'ESRCH') continue;
72
+ throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');
73
+ }
74
+ // comm may contain spaces and parentheses; fields follow its last paren.
75
+ const close = text.lastIndexOf(')');
76
+ const head = text.slice(0, text.indexOf('(')).trim();
77
+ const fields = text.slice(close + 1).trim().split(/[ \t]+/);
78
+ if (close < 0 || head !== name || fields.length < 20) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');
79
+ // Fields 4, 5 and 22: parent, group and start time in clock ticks since boot.
80
+ const [pid, parent, group, start] = [head, fields[1], fields[2], fields[19]].map(Number);
81
+ if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');
82
+ rows.set(pid, { pid, parent, group, start, zombie: fields[0] === 'Z' });
83
+ }
84
+ return rows;
85
+ };
86
+ const psSnapshot = () => {
87
+ const result = cp.spawnSync('/bin/ps', ['-A', '-o', 'pid=,ppid=,pgid=,stat=,lstart='], {
88
+ encoding: 'utf8', timeout: 500, killSignal: 'SIGKILL', maxBuffer: 4 * 1024 * 1024,
89
+ env: { PATH: '/usr/bin:/bin', LC_ALL: 'C' }
90
+ });
91
+ if (result.error || result.status !== 0) throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');
92
+ const rows = new Map();
93
+ for (const line of result.stdout.trim().split('\n')) {
94
+ const match = /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/.exec(line);
95
+ if (!match) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');
96
+ const [pid, parent, group] = match.slice(1, 4).map(Number);
97
+ const start = Date.parse(match[5]);
98
+ if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');
99
+ rows.set(pid, { pid, parent, group, start, zombie: match[4].startsWith('Z') });
100
+ }
101
+ return rows;
102
+ };
103
+ const snapshot = process.platform === 'linux' ? procSnapshot : psSnapshot;
104
+ const captureEscaped = () => {
105
+ const rows = snapshot();
106
+ const descendants = new Set([target.pid]);
107
+ for (;;) {
108
+ const previous = descendants.size;
109
+ for (const row of rows.values()) if (descendants.has(row.parent)) descendants.add(row.pid);
110
+ if (descendants.size === previous) break;
111
+ }
112
+ for (const pid of descendants) {
113
+ const row = rows.get(pid);
114
+ if (row && !row.zombie && row.group !== process.pid && pid !== process.pid && pid > 1) escaped.set(pid, row);
115
+ }
116
+ };
117
+ const signalEscaped = (signal) => {
118
+ if (escaped.size === 0) return;
119
+ const rows = snapshot();
120
+ for (const [pid, recorded] of escaped) {
121
+ const row = rows.get(pid);
122
+ if (!row || row.zombie) { escaped.delete(pid); continue; }
123
+ if (row.start !== recorded.start || row.group !== recorded.group) {
124
+ throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before signalling');
125
+ }
126
+ try { process.kill(pid, signal); }
127
+ catch (error) { if (error.code === 'ESRCH') escaped.delete(pid); else throw error; }
128
+ }
129
+ };
130
+ const cleanupError = (error) => send({ type: 'cleanup_error', reason: error.reason, message: String(error.message).slice(0, 2048) });
131
+ const escapedSettled = () => {
132
+ if (escaped.size === 0) return true;
133
+ const rows = snapshot();
134
+ for (const [pid, recorded] of escaped) {
135
+ const row = rows.get(pid);
136
+ if (!row || row.zombie) { escaped.delete(pid); continue; }
137
+ if (row.start !== recorded.start || row.group !== recorded.group) {
138
+ throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before cleanup verification');
139
+ }
140
+ }
141
+ return escaped.size === 0;
142
+ };
143
+
144
+ const send = (message, done = () => {}) => {
145
+ if (control.destroyed || !control.writable) return done();
146
+ control.write(JSON.stringify(message) + '\n', done);
147
+ };
148
+ const selfKill = () => process.kill(grouped ? -process.pid : process.pid, 'SIGKILL');
149
+ const force = () => {
150
+ if (killing) return;
151
+ killing = true;
152
+ if (!grouped && target?.pid !== undefined && !targetDone) {
153
+ target.kill('SIGKILL');
154
+ return;
155
+ }
156
+ try { signalEscaped('SIGKILL'); } catch (error) { cleanupError(error); }
157
+ const deadline = Date.now() + 500;
158
+ const complete = () => {
159
+ try {
160
+ if (!escapedSettled()) {
161
+ if (Date.now() < deadline) { setTimeout(complete, 10); return; }
162
+ throw new SupervisorFault('descendants_unsettled', 'Escaped descendants did not settle before the cleanup bound');
163
+ }
164
+ } catch (error) { cleanupError(error); }
165
+ // TLS write completion does not prove the peer received terminal status.
166
+ // Keep the owner alive for its receipt; an unresponsive host still cannot
167
+ // delay cleanup beyond the existing delivery bound.
168
+ setTimeout(selfKill, 100);
169
+ send({ type: 'cleanup' }, config?.acknowledgeCleanup ? () => {} : selfKill);
170
+ };
171
+ complete();
172
+ };
173
+ const stop = (options = {}) => {
174
+ // The first explicit stop owns its signal and deadline, including after EOF
175
+ // or target exit. Only natural cleanup can accept the host's fast shortcut.
176
+ if (stopping && (explicitStop || !options.fast)) return;
177
+ const signal = options.killSignal ?? config?.killSignal ?? 'SIGTERM';
178
+ // A target's exit cannot shorten a captured escaped child's grace period.
179
+ if (options.fast && escaped.size !== 0) return;
180
+ // A grouped owner reaches its members with one group signal and captures
181
+ // only children that left the group. A direct target shares the host's
182
+ // group, so every descendant is captured and signalled by pid.
183
+ if (options.explicit && !targetDone && target?.pid !== undefined) {
184
+ try { captureEscaped(); } catch (error) { cleanupError(error); }
185
+ }
186
+ stopping = true;
187
+ explicitStop = options.explicit === true;
188
+ if (signal === 'SIGKILL' || target?.pid === undefined || (!grouped && targetDone)) return force();
189
+ if (signal === 'SIGSTOP') return force();
190
+ // Keep the group owner alive to enforce escalation, including when the caller
191
+ // chooses a catchable signal other than TERM/INT. SIGSTOP is refused by host.
192
+ process.on(signal, () => {});
193
+ try { signalEscaped(signal); } catch (error) { cleanupError(error); }
194
+ if (grouped) process.kill(-process.pid, signal);
195
+ else target.kill(signal);
196
+ timer = setTimeout(force, options.graceMs ?? config?.graceMs ?? 2000);
197
+ };
198
+ // The grace window exists for the group's remaining members. Once the target
199
+ // has exited and a snapshot shows no other live member and no escaped child,
200
+ // nobody is left to wait for: finish now instead of sleeping out the grace.
201
+ // An unreadable table keeps the deadline.
202
+ const settleVacantGroup = () => {
203
+ if (!stopping || killing || escaped.size !== 0) return;
204
+ let rows;
205
+ try { rows = snapshot(); } catch { return; }
206
+ for (const row of rows.values()) {
207
+ // The owner's only other child is the ps answering this snapshot; the
208
+ // exited target is already reaped and its orphans have another parent.
209
+ if (row.group === process.pid && row.pid !== process.pid && row.parent !== process.pid && !row.zombie) return;
210
+ }
211
+ clearTimeout(timer);
212
+ force();
213
+ };
214
+ const spawnError = (error) => {
215
+ send({ type: 'spawn_error', code: error.code, errno: error.errno,
216
+ syscall: error.syscall, path: error.path, message: String(error.message).slice(0, 2048) });
217
+ stop();
218
+ };
219
+ process.on('SIGTERM', () => { if (!stopping) stop(); });
220
+ process.on('SIGINT', () => { if (!stopping) stop(); });
221
+ process.on('uncaughtException', (error) => {
222
+ try { send({ type: 'fault', reason: error.reason, message: String(error.message).slice(0, 2048) }, force); }
223
+ finally { force(); }
224
+ });
225
+ process.on('unhandledRejection', (error) => { throw error; });
226
+ control.on('end', () => stop({ explicit: true }));
227
+ control.on('error', () => stop({ explicit: true }));
228
+ requests.on('end', () => stop({ explicit: true }));
229
+ requests.on('error', () => stop({ explicit: true }));
230
+ requests.setEncoding('utf8');
231
+ requests.on('data', (data) => {
232
+ buffer += data;
233
+ if (Buffer.byteLength(buffer) > 4 * 1024 * 1024) throw new SupervisorFault('control_frame_too_large', 'Control frame too large');
234
+ for (;;) {
235
+ const end = buffer.indexOf('\n');
236
+ if (end < 0) break;
237
+ const line = buffer.slice(0, end);
238
+ buffer = buffer.slice(end + 1);
239
+ const message = JSON.parse(line);
240
+ if (message.type === 'configure') {
241
+ if (config !== undefined || stopping) throw new SupervisorFault('configuration_invalid', 'Duplicate or late configuration');
242
+ config = message;
243
+ } else if (message.type === 'cleanup_ack') {
244
+ if (!config?.acknowledgeCleanup || !killing) throw new SupervisorFault('cleanup_acknowledgment_unexpected', 'Unexpected cleanup acknowledgment');
245
+ selfKill();
246
+ } else if (message.type === 'stop') stop(message);
247
+ else if (message.type === 'start') {
248
+ if (config === undefined || target !== undefined || stopping) throw new SupervisorFault('activation_invalid', 'Invalid activation');
249
+ const descriptors = Array.from({ length: Math.max(2, ...config.userFds) + 1 }, () => 'ignore');
250
+ for (const fd of [0, 1, 2, ...config.userFds]) descriptors[fd] = fd;
251
+ if (config.standardFds !== undefined) {
252
+ for (const fd of [0, 1, 2]) descriptors[fd] = config.standardFds[fd];
253
+ }
254
+ try {
255
+ target = cp.spawn(config.command, config.args, {
256
+ cwd: config.cwd, env: config.env, shell: config.shell,
257
+ windowsHide: config.windowsHide, windowsVerbatimArguments: config.windowsVerbatimArguments,
258
+ detached: false, stdio: descriptors
259
+ });
260
+ } catch (error) { spawnError(error); continue; }
261
+ target.once('spawn', () => {
262
+ // Release every caller pipe copy. Keep the runtime's standard slots
263
+ // valid so a later internal allocation cannot reuse a closed 0/1/2.
264
+ if (config.standardFds !== undefined) {
265
+ // libuv intentionally does not close Windows CRT descriptors 0..2.
266
+ // Caller pipes arrive in separate slots; the reserved slots are NUL.
267
+ for (const fd of config.standardFds) if (fd !== 'ignore') fs.closeSync(fd);
268
+ } else {
269
+ for (const fd of [0, 1, 2]) {
270
+ fs.closeSync(fd);
271
+ const replacement = fs.openSync(require('node:os').devNull, fd === 0 ? 'r' : 'w');
272
+ if (replacement !== fd) throw new SupervisorFault('stream_detach_failed', 'Could not detach supervisor standard streams');
273
+ }
274
+ }
275
+ for (const fd of config.userFds) fs.closeSync(fd);
276
+ send({ type: 'spawned', pid: target.pid });
277
+ });
278
+ target.once('error', spawnError);
279
+ target.once('exit', (code, signal) => {
280
+ targetDone = true;
281
+ send({ type: 'exit', code, signal });
282
+ if (grouped) { stop(); settleVacantGroup(); }
283
+ else { killing = false; clearTimeout(timer); force(); }
284
+ });
285
+ } else throw new SupervisorFault('control_message_invalid', 'Invalid control message');
286
+ }
287
+ });
288
+ control.once('connect', () => send({ type: 'ready', version: 1, pid: process.pid, created }));
289
+ `
@@ -0,0 +1,114 @@
1
+ /**
2
+ * A native Windows job guardian, attached before the owner can launch a target.
3
+ * @since 1.0.0
4
+ */
5
+
6
+ import { spawn } from "node:child_process"
7
+ import type { Socket } from "node:net"
8
+ import { parse } from "node:path"
9
+ import { packageRoot, resolveConfiguredExecutable, resolveDefaultExecutable } from "./AtomicFileSystemExecutable.ts"
10
+ import { processFault } from "./ProcessFault.ts"
11
+
12
+ const deferred = <A>() => {
13
+ let resolve!: (value: A) => void
14
+ let reject!: (cause: unknown) => void
15
+ const promise = new Promise<A>((yes, no) => {
16
+ resolve = yes
17
+ reject = no
18
+ })
19
+ void promise.catch(() => {})
20
+ return { promise, resolve, reject }
21
+ }
22
+
23
+ /**
24
+ * Resolve the same trusted helper for the owner's self-observation and guardian.
25
+ * @private
26
+ * @since 1.0.0
27
+ */
28
+ export const resolveJobExecutable = (): string => {
29
+ const configured = process.env.SMITHERS_WORKSPACE_JJ_EXPORT_BINARY
30
+ return configured === undefined
31
+ ? resolveDefaultExecutable(packageRoot, undefined)
32
+ : resolveConfiguredExecutable(configured, undefined)
33
+ }
34
+
35
+ /**
36
+ * Retains the guardian's dedicated control pipe until cleanup. EOF, including
37
+ * host death, terminates the job independently of the Node owner's event loop.
38
+ * @private
39
+ * @since 1.0.0
40
+ */
41
+ export class WindowsProcessJob {
42
+ readonly ready = deferred<void>()
43
+ readonly settled = deferred<void>()
44
+ private readonly child
45
+ private receivedReady = false
46
+ private receivedSettled = false
47
+ private failed = false
48
+
49
+ constructor(ownerPid: number, created: unknown, executable: string) {
50
+ if (typeof created !== "string" || !/^[1-9][0-9]{0,19}$/.test(created)) {
51
+ throw processFault("owner_identity_missing", "Windows process owner has no exact creation identity")
52
+ }
53
+ const options = { cwd: parse(process.execPath).root, env: {}, windowsHide: true }
54
+ this.child = spawn(executable, ["--process-job", String(ownerPid), created], {
55
+ ...options,
56
+ stdio: ["pipe", "pipe", "pipe"]
57
+ })
58
+ let buffer = ""
59
+ this.child.stdout.setEncoding("utf8")
60
+ this.child.stdout.on("data", (data: string) => {
61
+ if (this.failed) return
62
+ try {
63
+ buffer += data
64
+ if (Buffer.byteLength(buffer) > 4096) {
65
+ throw processFault("status_too_large", "Windows job status exceeds its bound")
66
+ }
67
+ for (;;) {
68
+ const end = buffer.indexOf("\n")
69
+ if (end < 0) break
70
+ const frame = JSON.parse(buffer.slice(0, end)) as { status?: unknown; ownerPid?: unknown } | null
71
+ buffer = buffer.slice(end + 1)
72
+ if (frame?.status === "ready" && frame.ownerPid === ownerPid && !this.receivedReady) {
73
+ this.receivedReady = true
74
+ this.ready.resolve()
75
+ } else if (frame?.status === "settled" && this.receivedReady && !this.receivedSettled) {
76
+ this.receivedSettled = true
77
+ } else throw processFault("status_invalid", "Invalid Windows job status")
78
+ }
79
+ } catch (cause) {
80
+ this.fail(cause)
81
+ }
82
+ })
83
+ // Drain diagnostics without retaining unbounded native output.
84
+ this.child.stderr.resume()
85
+ this.child.once("error", (cause) => this.fail(cause))
86
+ this.child.stdin.on("error", (cause) => this.fail(cause))
87
+ this.child.stdout.on("error", (cause) => this.fail(cause))
88
+ this.child.stderr.on("error", (cause) => this.fail(cause))
89
+ this.child.once("close", (code, signal) => {
90
+ if (!this.failed && code === 0 && signal === null && this.receivedSettled && buffer === "") {
91
+ this.settled.resolve()
92
+ } else this.fail(processFault("cleanup_unverified", "Windows job cleanup could not be verified"))
93
+ })
94
+ }
95
+
96
+ private fail(cause: unknown): void {
97
+ this.failed = true
98
+ this.ready.reject(cause)
99
+ this.settled.reject(cause)
100
+ this.stop()
101
+ }
102
+
103
+ /** Closing this pipe asks the native guardian to terminate its job. */
104
+ stop(): void {
105
+ this.child.stdin.destroy()
106
+ }
107
+
108
+ /** Keep the guardian and all three pipes consistent with the host handle. */
109
+ reference(referenced: boolean): void {
110
+ const method = referenced ? "ref" : "unref"
111
+ this.child[method]()
112
+ for (const pipe of [this.child.stdin, this.child.stdout, this.child.stderr]) (pipe as Socket)[method]()
113
+ }
114
+ }