@effect/platform-node 0.42.10 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/NodeCommandExecutor/package.json +6 -0
  2. package/NodeFileSystem/package.json +6 -0
  3. package/NodeHttpClient/package.json +6 -0
  4. package/NodeHttpServer/package.json +6 -0
  5. package/NodeKeyValueStore/package.json +6 -0
  6. package/NodePath/package.json +6 -0
  7. package/NodeRuntime/package.json +6 -0
  8. package/NodeSink/package.json +6 -0
  9. package/NodeStream/package.json +6 -0
  10. package/NodeTerminal/package.json +6 -0
  11. package/NodeWorker/package.json +6 -0
  12. package/NodeWorkerRunner/package.json +6 -0
  13. package/dist/cjs/Http/Platform.js +0 -20
  14. package/dist/cjs/Http/Platform.js.map +1 -1
  15. package/dist/cjs/Http/Server.js +6 -23
  16. package/dist/cjs/Http/Server.js.map +1 -1
  17. package/dist/cjs/Http/ServerRequest.js +0 -19
  18. package/dist/cjs/Http/ServerRequest.js.map +1 -1
  19. package/dist/cjs/{FileSystem.js → NodeCommandExecutor.js} +3 -16
  20. package/dist/cjs/NodeCommandExecutor.js.map +1 -0
  21. package/dist/cjs/NodeContext.js +6 -6
  22. package/dist/cjs/NodeContext.js.map +1 -1
  23. package/dist/cjs/NodeFileSystem.js +42 -0
  24. package/dist/cjs/NodeFileSystem.js.map +1 -0
  25. package/dist/cjs/{Http/NodeClient.js → NodeHttpClient.js} +2 -2
  26. package/dist/cjs/{Http/NodeClient.js.map → NodeHttpClient.js.map} +1 -1
  27. package/dist/cjs/NodeHttpServer.js +40 -0
  28. package/dist/cjs/NodeHttpServer.js.map +1 -0
  29. package/dist/cjs/NodeKeyValueStore.js +42 -0
  30. package/dist/cjs/NodeKeyValueStore.js.map +1 -0
  31. package/dist/cjs/{Path.js → NodePath.js} +5 -12
  32. package/dist/cjs/NodePath.js.map +1 -0
  33. package/dist/cjs/{Runtime.js → NodeRuntime.js} +7 -10
  34. package/dist/cjs/NodeRuntime.js.map +1 -0
  35. package/dist/cjs/NodeSink.js +17 -0
  36. package/dist/cjs/NodeSink.js.map +1 -0
  37. package/dist/cjs/NodeStream.js +17 -0
  38. package/dist/cjs/NodeStream.js.map +1 -0
  39. package/dist/cjs/{Terminal.js → NodeTerminal.js} +8 -11
  40. package/dist/cjs/NodeTerminal.js.map +1 -0
  41. package/dist/cjs/{Sink.js → NodeWorker.js} +9 -8
  42. package/dist/cjs/NodeWorker.js.map +1 -0
  43. package/dist/cjs/{CommandExecutor.js → NodeWorkerRunner.js} +3 -10
  44. package/dist/cjs/NodeWorkerRunner.js.map +1 -0
  45. package/dist/cjs/index.js +25 -33
  46. package/dist/cjs/internal/http/{nodeClient.js → client.js} +3 -3
  47. package/dist/cjs/internal/http/{nodeClient.js.map → client.js.map} +1 -1
  48. package/dist/cjs/internal/http/incomingMessage.js +1 -1
  49. package/dist/cjs/internal/http/incomingMessage.js.map +1 -1
  50. package/dist/cjs/internal/http/platform.js +3 -3
  51. package/dist/cjs/internal/http/platform.js.map +1 -1
  52. package/dist/cjs/internal/http/server.js +13 -8
  53. package/dist/cjs/internal/http/server.js.map +1 -1
  54. package/dist/cjs/internal/worker.js +3 -8
  55. package/dist/cjs/internal/worker.js.map +1 -1
  56. package/dist/cjs/internal/workerRunner.js +2 -8
  57. package/dist/cjs/internal/workerRunner.js.map +1 -1
  58. package/dist/dts/Http/Platform.d.ts +2 -8
  59. package/dist/dts/Http/Platform.d.ts.map +1 -1
  60. package/dist/dts/Http/Server.d.ts +10 -9
  61. package/dist/dts/Http/Server.d.ts.map +1 -1
  62. package/dist/dts/Http/ServerRequest.d.ts +0 -6
  63. package/dist/dts/Http/ServerRequest.d.ts.map +1 -1
  64. package/dist/dts/NodeCommandExecutor.d.ts +9 -0
  65. package/dist/dts/NodeCommandExecutor.d.ts.map +1 -0
  66. package/dist/dts/NodeContext.d.ts +6 -6
  67. package/dist/dts/NodeContext.d.ts.map +1 -1
  68. package/dist/dts/NodeFileSystem.d.ts +8 -0
  69. package/dist/dts/NodeFileSystem.d.ts.map +1 -0
  70. package/dist/dts/{Http/NodeClient.d.ts → NodeHttpClient.d.ts} +7 -7
  71. package/dist/dts/{Http/NodeClient.d.ts.map → NodeHttpClient.d.ts.map} +1 -1
  72. package/dist/dts/NodeHttpServer.d.ts +37 -0
  73. package/dist/dts/NodeHttpServer.d.ts.map +1 -0
  74. package/dist/dts/NodeKeyValueStore.d.ts +9 -0
  75. package/dist/dts/NodeKeyValueStore.d.ts.map +1 -0
  76. package/dist/dts/NodePath.d.ts +21 -0
  77. package/dist/dts/NodePath.d.ts.map +1 -0
  78. package/dist/dts/NodeRuntime.d.ts +7 -0
  79. package/dist/dts/NodeRuntime.d.ts.map +1 -0
  80. package/dist/dts/NodeSink.d.ts +8 -0
  81. package/dist/dts/NodeSink.d.ts.map +1 -0
  82. package/dist/dts/NodeStream.d.ts +8 -0
  83. package/dist/dts/NodeStream.d.ts.map +1 -0
  84. package/dist/dts/NodeTerminal.d.ts +15 -0
  85. package/dist/dts/NodeTerminal.d.ts.map +1 -0
  86. package/dist/dts/NodeWorker.d.ts +23 -0
  87. package/dist/dts/NodeWorker.d.ts.map +1 -0
  88. package/dist/dts/NodeWorkerRunner.d.ts +11 -0
  89. package/dist/dts/NodeWorkerRunner.d.ts.map +1 -0
  90. package/dist/dts/index.d.ts +13 -37
  91. package/dist/dts/index.d.ts.map +1 -1
  92. package/dist/dts/internal/http/client.d.ts +2 -0
  93. package/dist/dts/internal/http/client.d.ts.map +1 -0
  94. package/dist/esm/Http/Platform.js +0 -4
  95. package/dist/esm/Http/Platform.js.map +1 -1
  96. package/dist/esm/Http/Server.js +5 -4
  97. package/dist/esm/Http/Server.js.map +1 -1
  98. package/dist/esm/Http/ServerRequest.js +0 -4
  99. package/dist/esm/Http/ServerRequest.js.map +1 -1
  100. package/dist/esm/NodeCommandExecutor.js +10 -0
  101. package/dist/esm/NodeCommandExecutor.js.map +1 -0
  102. package/dist/esm/NodeContext.js +6 -6
  103. package/dist/esm/NodeContext.js.map +1 -1
  104. package/dist/esm/NodeFileSystem.js +10 -0
  105. package/dist/esm/NodeFileSystem.js.map +1 -0
  106. package/dist/esm/{Http/NodeClient.js → NodeHttpClient.js} +2 -2
  107. package/dist/esm/NodeHttpClient.js.map +1 -0
  108. package/dist/esm/NodeHttpServer.js +37 -0
  109. package/dist/esm/NodeHttpServer.js.map +1 -0
  110. package/dist/esm/NodeKeyValueStore.js +10 -0
  111. package/dist/esm/NodeKeyValueStore.js.map +1 -0
  112. package/dist/esm/NodePath.js +20 -0
  113. package/dist/esm/NodePath.js.map +1 -0
  114. package/dist/esm/NodeRuntime.js +10 -0
  115. package/dist/esm/NodeRuntime.js.map +1 -0
  116. package/dist/esm/NodeSink.js +8 -0
  117. package/dist/esm/NodeSink.js.map +1 -0
  118. package/dist/esm/NodeStream.js +8 -0
  119. package/dist/esm/NodeStream.js.map +1 -0
  120. package/dist/esm/NodeTerminal.js +15 -0
  121. package/dist/esm/NodeTerminal.js.map +1 -0
  122. package/dist/esm/NodeWorker.js +17 -0
  123. package/dist/esm/NodeWorker.js.map +1 -0
  124. package/dist/esm/NodeWorkerRunner.js +7 -0
  125. package/dist/esm/NodeWorkerRunner.js.map +1 -0
  126. package/dist/esm/index.js +13 -37
  127. package/dist/esm/index.js.map +1 -1
  128. package/dist/esm/internal/http/{nodeClient.js → client.js} +3 -3
  129. package/dist/esm/internal/http/client.js.map +1 -0
  130. package/dist/esm/internal/http/incomingMessage.js +1 -1
  131. package/dist/esm/internal/http/incomingMessage.js.map +1 -1
  132. package/dist/esm/internal/http/platform.js +3 -3
  133. package/dist/esm/internal/http/platform.js.map +1 -1
  134. package/dist/esm/internal/http/server.js +11 -7
  135. package/dist/esm/internal/http/server.js.map +1 -1
  136. package/dist/esm/internal/worker.js +1 -7
  137. package/dist/esm/internal/worker.js.map +1 -1
  138. package/dist/esm/internal/workerRunner.js +1 -5
  139. package/dist/esm/internal/workerRunner.js.map +1 -1
  140. package/package.json +89 -145
  141. package/src/Http/Platform.ts +2 -9
  142. package/src/Http/Server.ts +19 -11
  143. package/src/Http/ServerRequest.ts +0 -7
  144. package/src/NodeCommandExecutor.ts +13 -0
  145. package/src/NodeContext.ts +16 -11
  146. package/src/NodeFileSystem.ts +12 -0
  147. package/src/{Http/NodeClient.ts → NodeHttpClient.ts} +7 -8
  148. package/src/NodeHttpServer.ts +38 -0
  149. package/src/NodeKeyValueStore.ts +15 -0
  150. package/src/NodePath.ts +25 -0
  151. package/src/NodeRuntime.ts +11 -0
  152. package/src/NodeSink.ts +8 -0
  153. package/src/NodeStream.ts +8 -0
  154. package/src/NodeTerminal.ts +20 -0
  155. package/src/NodeWorker.ts +27 -0
  156. package/src/NodeWorkerRunner.ts +12 -0
  157. package/src/index.ts +13 -41
  158. package/src/internal/http/{nodeClient.ts → client.ts} +10 -10
  159. package/src/internal/http/incomingMessage.ts +7 -7
  160. package/src/internal/http/platform.ts +3 -3
  161. package/src/internal/http/server.ts +35 -23
  162. package/src/internal/worker.ts +7 -14
  163. package/src/internal/workerRunner.ts +3 -26
  164. package/Command/package.json +0 -6
  165. package/CommandExecutor/package.json +0 -6
  166. package/Effectify/package.json +0 -6
  167. package/Error/package.json +0 -6
  168. package/FileSystem/package.json +0 -6
  169. package/Http/Etag/package.json +0 -6
  170. package/Http/Multipart/package.json +0 -6
  171. package/Http/NodeClient/package.json +0 -6
  172. package/HttpClient/package.json +0 -6
  173. package/HttpServer/package.json +0 -6
  174. package/KeyValueStore/package.json +0 -6
  175. package/Path/package.json +0 -6
  176. package/Runtime/package.json +0 -6
  177. package/Sink/package.json +0 -6
  178. package/Stream/package.json +0 -6
  179. package/Terminal/package.json +0 -6
  180. package/Transferable/package.json +0 -6
  181. package/Worker/package.json +0 -6
  182. package/WorkerRunner/package.json +0 -6
  183. package/dist/cjs/Command.js +0 -109
  184. package/dist/cjs/Command.js.map +0 -1
  185. package/dist/cjs/CommandExecutor.js.map +0 -1
  186. package/dist/cjs/Effectify.js +0 -13
  187. package/dist/cjs/Effectify.js.map +0 -1
  188. package/dist/cjs/Error.js +0 -25
  189. package/dist/cjs/Error.js.map +0 -1
  190. package/dist/cjs/FileSystem.js.map +0 -1
  191. package/dist/cjs/Http/Etag.js +0 -63
  192. package/dist/cjs/Http/Etag.js.map +0 -1
  193. package/dist/cjs/Http/Multipart.js +0 -69
  194. package/dist/cjs/Http/Multipart.js.map +0 -1
  195. package/dist/cjs/HttpClient.js +0 -48
  196. package/dist/cjs/HttpClient.js.map +0 -1
  197. package/dist/cjs/HttpServer.js +0 -58
  198. package/dist/cjs/HttpServer.js.map +0 -1
  199. package/dist/cjs/KeyValueStore.js +0 -60
  200. package/dist/cjs/KeyValueStore.js.map +0 -1
  201. package/dist/cjs/Path.js.map +0 -1
  202. package/dist/cjs/Runtime.js.map +0 -1
  203. package/dist/cjs/Sink.js.map +0 -1
  204. package/dist/cjs/Stream.js +0 -68
  205. package/dist/cjs/Stream.js.map +0 -1
  206. package/dist/cjs/Terminal.js.map +0 -1
  207. package/dist/cjs/Transferable.js +0 -17
  208. package/dist/cjs/Transferable.js.map +0 -1
  209. package/dist/cjs/Worker.js +0 -87
  210. package/dist/cjs/Worker.js.map +0 -1
  211. package/dist/cjs/WorkerRunner.js +0 -69
  212. package/dist/cjs/WorkerRunner.js.map +0 -1
  213. package/dist/cjs/internal/commandExecutor.js +0 -151
  214. package/dist/cjs/internal/commandExecutor.js.map +0 -1
  215. package/dist/cjs/internal/error.js +0 -44
  216. package/dist/cjs/internal/error.js.map +0 -1
  217. package/dist/cjs/internal/fileSystem.js +0 -370
  218. package/dist/cjs/internal/fileSystem.js.map +0 -1
  219. package/dist/cjs/internal/http/etag.js +0 -74
  220. package/dist/cjs/internal/http/etag.js.map +0 -1
  221. package/dist/cjs/internal/http/multipart.js +0 -119
  222. package/dist/cjs/internal/http/multipart.js.map +0 -1
  223. package/dist/cjs/internal/path.js +0 -72
  224. package/dist/cjs/internal/path.js.map +0 -1
  225. package/dist/cjs/internal/runtime.js +0 -59
  226. package/dist/cjs/internal/runtime.js.map +0 -1
  227. package/dist/cjs/internal/sink.js +0 -52
  228. package/dist/cjs/internal/sink.js.map +0 -1
  229. package/dist/cjs/internal/stream.js +0 -208
  230. package/dist/cjs/internal/stream.js.map +0 -1
  231. package/dist/cjs/internal/terminal.js +0 -121
  232. package/dist/cjs/internal/terminal.js.map +0 -1
  233. package/dist/dts/Command.d.ts +0 -116
  234. package/dist/dts/Command.d.ts.map +0 -1
  235. package/dist/dts/CommandExecutor.d.ts +0 -44
  236. package/dist/dts/CommandExecutor.d.ts.map +0 -1
  237. package/dist/dts/Effectify.d.ts +0 -19
  238. package/dist/dts/Effectify.d.ts.map +0 -1
  239. package/dist/dts/Error.d.ts +0 -31
  240. package/dist/dts/Error.d.ts.map +0 -1
  241. package/dist/dts/FileSystem.d.ts +0 -78
  242. package/dist/dts/FileSystem.d.ts.map +0 -1
  243. package/dist/dts/Http/Etag.d.ts +0 -22
  244. package/dist/dts/Http/Etag.d.ts.map +0 -1
  245. package/dist/dts/Http/Multipart.d.ts +0 -35
  246. package/dist/dts/Http/Multipart.d.ts.map +0 -1
  247. package/dist/dts/HttpClient.d.ts +0 -69
  248. package/dist/dts/HttpClient.d.ts.map +0 -1
  249. package/dist/dts/HttpServer.d.ts +0 -109
  250. package/dist/dts/HttpServer.d.ts.map +0 -1
  251. package/dist/dts/KeyValueStore.d.ts +0 -18
  252. package/dist/dts/KeyValueStore.d.ts.map +0 -1
  253. package/dist/dts/Path.d.ts +0 -27
  254. package/dist/dts/Path.d.ts.map +0 -1
  255. package/dist/dts/Runtime.d.ts +0 -27
  256. package/dist/dts/Runtime.d.ts.map +0 -1
  257. package/dist/dts/Sink.d.ts +0 -22
  258. package/dist/dts/Sink.d.ts.map +0 -1
  259. package/dist/dts/Stream.d.ts +0 -79
  260. package/dist/dts/Stream.d.ts.map +0 -1
  261. package/dist/dts/Terminal.d.ts +0 -35
  262. package/dist/dts/Terminal.d.ts.map +0 -1
  263. package/dist/dts/Transferable.d.ts +0 -7
  264. package/dist/dts/Transferable.d.ts.map +0 -1
  265. package/dist/dts/Worker.d.ts +0 -48
  266. package/dist/dts/Worker.d.ts.map +0 -1
  267. package/dist/dts/WorkerRunner.d.ts +0 -30
  268. package/dist/dts/WorkerRunner.d.ts.map +0 -1
  269. package/dist/dts/internal/commandExecutor.d.ts +0 -2
  270. package/dist/dts/internal/commandExecutor.d.ts.map +0 -1
  271. package/dist/dts/internal/error.d.ts +0 -2
  272. package/dist/dts/internal/error.d.ts.map +0 -1
  273. package/dist/dts/internal/fileSystem.d.ts +0 -2
  274. package/dist/dts/internal/fileSystem.d.ts.map +0 -1
  275. package/dist/dts/internal/http/etag.d.ts +0 -2
  276. package/dist/dts/internal/http/etag.d.ts.map +0 -1
  277. package/dist/dts/internal/http/multipart.d.ts +0 -2
  278. package/dist/dts/internal/http/multipart.d.ts.map +0 -1
  279. package/dist/dts/internal/http/nodeClient.d.ts +0 -2
  280. package/dist/dts/internal/http/nodeClient.d.ts.map +0 -1
  281. package/dist/dts/internal/path.d.ts +0 -2
  282. package/dist/dts/internal/path.d.ts.map +0 -1
  283. package/dist/dts/internal/runtime.d.ts +0 -2
  284. package/dist/dts/internal/runtime.d.ts.map +0 -1
  285. package/dist/dts/internal/sink.d.ts +0 -2
  286. package/dist/dts/internal/sink.d.ts.map +0 -1
  287. package/dist/dts/internal/stream.d.ts +0 -2
  288. package/dist/dts/internal/stream.d.ts.map +0 -1
  289. package/dist/dts/internal/terminal.d.ts +0 -2
  290. package/dist/dts/internal/terminal.d.ts.map +0 -1
  291. package/dist/esm/Command.js +0 -90
  292. package/dist/esm/Command.js.map +0 -1
  293. package/dist/esm/CommandExecutor.js +0 -13
  294. package/dist/esm/CommandExecutor.js.map +0 -1
  295. package/dist/esm/Effectify.js +0 -10
  296. package/dist/esm/Effectify.js.map +0 -1
  297. package/dist/esm/Error.js +0 -20
  298. package/dist/esm/Error.js.map +0 -1
  299. package/dist/esm/FileSystem.js +0 -21
  300. package/dist/esm/FileSystem.js.map +0 -1
  301. package/dist/esm/Http/Etag.js +0 -16
  302. package/dist/esm/Http/Etag.js.map +0 -1
  303. package/dist/esm/Http/Multipart.js +0 -21
  304. package/dist/esm/Http/Multipart.js.map +0 -1
  305. package/dist/esm/Http/NodeClient.js.map +0 -1
  306. package/dist/esm/HttpClient.js +0 -69
  307. package/dist/esm/HttpClient.js.map +0 -1
  308. package/dist/esm/HttpServer.js +0 -109
  309. package/dist/esm/HttpServer.js.map +0 -1
  310. package/dist/esm/KeyValueStore.js +0 -14
  311. package/dist/esm/KeyValueStore.js.map +0 -1
  312. package/dist/esm/Path.js +0 -26
  313. package/dist/esm/Path.js.map +0 -1
  314. package/dist/esm/Runtime.js +0 -13
  315. package/dist/esm/Runtime.js.map +0 -1
  316. package/dist/esm/Sink.js +0 -15
  317. package/dist/esm/Sink.js.map +0 -1
  318. package/dist/esm/Stream.js +0 -37
  319. package/dist/esm/Stream.js.map +0 -1
  320. package/dist/esm/Terminal.js +0 -18
  321. package/dist/esm/Terminal.js.map +0 -1
  322. package/dist/esm/Transferable.js +0 -7
  323. package/dist/esm/Transferable.js.map +0 -1
  324. package/dist/esm/Worker.js +0 -36
  325. package/dist/esm/Worker.js.map +0 -1
  326. package/dist/esm/WorkerRunner.js +0 -21
  327. package/dist/esm/WorkerRunner.js.map +0 -1
  328. package/dist/esm/internal/commandExecutor.js +0 -120
  329. package/dist/esm/internal/commandExecutor.js.map +0 -1
  330. package/dist/esm/internal/error.js +0 -37
  331. package/dist/esm/internal/error.js.map +0 -1
  332. package/dist/esm/internal/fileSystem.js +0 -339
  333. package/dist/esm/internal/fileSystem.js.map +0 -1
  334. package/dist/esm/internal/http/etag.js +0 -43
  335. package/dist/esm/internal/http/etag.js.map +0 -1
  336. package/dist/esm/internal/http/multipart.js +0 -85
  337. package/dist/esm/internal/http/multipart.js.map +0 -1
  338. package/dist/esm/internal/http/nodeClient.js.map +0 -1
  339. package/dist/esm/internal/path.js +0 -41
  340. package/dist/esm/internal/path.js.map +0 -1
  341. package/dist/esm/internal/runtime.js +0 -27
  342. package/dist/esm/internal/runtime.js.map +0 -1
  343. package/dist/esm/internal/sink.js +0 -19
  344. package/dist/esm/internal/sink.js.map +0 -1
  345. package/dist/esm/internal/stream.js +0 -170
  346. package/dist/esm/internal/stream.js.map +0 -1
  347. package/dist/esm/internal/terminal.js +0 -89
  348. package/dist/esm/internal/terminal.js.map +0 -1
  349. package/src/Command.ts +0 -119
  350. package/src/CommandExecutor.ts +0 -49
  351. package/src/Effectify.ts +0 -22
  352. package/src/Error.ts +0 -34
  353. package/src/FileSystem.ts +0 -84
  354. package/src/Http/Etag.ts +0 -25
  355. package/src/Http/Multipart.ts +0 -47
  356. package/src/HttpClient.ts +0 -70
  357. package/src/HttpServer.ts +0 -110
  358. package/src/KeyValueStore.ts +0 -27
  359. package/src/Path.ts +0 -33
  360. package/src/Runtime.ts +0 -32
  361. package/src/Sink.ts +0 -31
  362. package/src/Stream.ts +0 -109
  363. package/src/Terminal.ts +0 -42
  364. package/src/Transferable.ts +0 -7
  365. package/src/Worker.ts +0 -65
  366. package/src/WorkerRunner.ts +0 -45
  367. package/src/internal/commandExecutor.ts +0 -203
  368. package/src/internal/error.ts +0 -51
  369. package/src/internal/fileSystem.ts +0 -575
  370. package/src/internal/http/etag.ts +0 -44
  371. package/src/internal/http/multipart.ts +0 -107
  372. package/src/internal/path.ts +0 -58
  373. package/src/internal/runtime.ts +0 -36
  374. package/src/internal/sink.ts +0 -57
  375. package/src/internal/stream.ts +0 -325
  376. package/src/internal/terminal.ts +0 -123
@@ -1,107 +0,0 @@
1
- import * as Multipart from "@effect/platform/Http/Multipart"
2
- import * as Effect from "effect/Effect"
3
- import { pipe } from "effect/Function"
4
- import * as Stream from "effect/Stream"
5
- import type { MultipartError, PartInfo } from "multipasta"
6
- import { decodeField } from "multipasta"
7
- import * as MP from "multipasta/node"
8
- import * as NFS from "node:fs"
9
- import type { IncomingHttpHeaders } from "node:http"
10
- import type { Readable } from "node:stream"
11
- import * as NodeStreamP from "node:stream/promises"
12
- import * as NodeStream from "../stream.js"
13
-
14
- /** @internal */
15
- export const stream = (
16
- source: Readable,
17
- headers: IncomingHttpHeaders
18
- ): Stream.Stream<never, Multipart.MultipartError, Multipart.Part> =>
19
- pipe(
20
- Multipart.makeConfig(headers as any),
21
- Effect.map(
22
- (config) =>
23
- NodeStream.fromReadable<Multipart.MultipartError, MP.Part>(() => {
24
- const parser = MP.make(config)
25
- source.pipe(parser)
26
- return parser
27
- }, (error) => convertError(error as any))
28
- ),
29
- Stream.unwrap,
30
- Stream.map(convertPart)
31
- )
32
-
33
- /** @internal */
34
- export const persisted = (
35
- source: Readable,
36
- headers: IncomingHttpHeaders
37
- ) =>
38
- Multipart.toPersisted(stream(source, headers), (path, file) =>
39
- Effect.tryPromise({
40
- try: (signal) => NodeStreamP.pipeline((file as FileImpl).file, NFS.createWriteStream(path), { signal }),
41
- catch: (error) => Multipart.MultipartError("InternalError", error)
42
- }))
43
-
44
- const convertPart = (part: MP.Part): Multipart.Part =>
45
- part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part)
46
-
47
- class FieldImpl implements Multipart.Field {
48
- readonly [Multipart.TypeId]: Multipart.TypeId
49
- readonly _tag = "Field"
50
- readonly key: string
51
- readonly contentType: string
52
- readonly value: string
53
-
54
- constructor(
55
- info: PartInfo,
56
- value: Uint8Array
57
- ) {
58
- this[Multipart.TypeId] = Multipart.TypeId
59
- this.key = info.name
60
- this.contentType = info.contentType
61
- this.value = decodeField(info, value)
62
- }
63
- }
64
-
65
- class FileImpl implements Multipart.File {
66
- readonly _tag = "File"
67
- readonly [Multipart.TypeId]: Multipart.TypeId
68
- readonly key: string
69
- readonly name: string
70
- readonly contentType: string
71
- readonly content: Stream.Stream<never, Multipart.MultipartError, Uint8Array>
72
-
73
- constructor(readonly file: MP.FileStream) {
74
- this[Multipart.TypeId] = Multipart.TypeId
75
- this.key = file.info.name
76
- this.name = file.filename ?? file.info.name
77
- this.contentType = file.info.contentType
78
- this.content = NodeStream.fromReadable(() => file, (error) => Multipart.MultipartError("InternalError", error))
79
- }
80
- }
81
-
82
- /** @internal */
83
- export const fileToReadable = (file: Multipart.File): Readable => (file as FileImpl).file
84
-
85
- function convertError(error: MultipartError): Multipart.MultipartError {
86
- switch (error._tag) {
87
- case "ReachedLimit": {
88
- switch (error.limit) {
89
- case "MaxParts": {
90
- return Multipart.MultipartError("TooManyParts", error)
91
- }
92
- case "MaxFieldSize": {
93
- return Multipart.MultipartError("FieldTooLarge", error)
94
- }
95
- case "MaxPartSize": {
96
- return Multipart.MultipartError("FileTooLarge", error)
97
- }
98
- case "MaxTotalSize": {
99
- return Multipart.MultipartError("BodyTooLarge", error)
100
- }
101
- }
102
- }
103
- default: {
104
- return Multipart.MultipartError("Parse", error)
105
- }
106
- }
107
- }
@@ -1,58 +0,0 @@
1
- import { BadArgument } from "@effect/platform/Error"
2
- import { Path } from "@effect/platform/Path"
3
- import * as Effect from "effect/Effect"
4
- import * as Layer from "effect/Layer"
5
- import * as NodePath from "node:path"
6
- import * as NodeUrl from "node:url"
7
-
8
- const fromFileUrl = (url: URL): Effect.Effect<never, BadArgument, string> =>
9
- Effect.try({
10
- try: () => NodeUrl.fileURLToPath(url),
11
- catch: (error) =>
12
- BadArgument({
13
- module: "Path",
14
- method: "fromFileUrl",
15
- message: `${error}`
16
- })
17
- })
18
-
19
- const toFileUrl = (path: string): Effect.Effect<never, BadArgument, URL> =>
20
- Effect.try({
21
- try: () => NodeUrl.pathToFileURL(path),
22
- catch: (error) =>
23
- BadArgument({
24
- module: "Path",
25
- method: "toFileUrl",
26
- message: `${error}`
27
- })
28
- })
29
-
30
- /** @internal */
31
- export const layerPosix = Layer.succeed(
32
- Path,
33
- Path.of({
34
- ...NodePath.posix,
35
- fromFileUrl,
36
- toFileUrl
37
- })
38
- )
39
-
40
- /** @internal */
41
- export const layerWin32 = Layer.succeed(
42
- Path,
43
- Path.of({
44
- ...NodePath.win32,
45
- fromFileUrl,
46
- toFileUrl
47
- })
48
- )
49
-
50
- /** @internal */
51
- export const layer = Layer.succeed(
52
- Path,
53
- Path.of({
54
- ...NodePath,
55
- fromFileUrl,
56
- toFileUrl
57
- })
58
- )
@@ -1,36 +0,0 @@
1
- import { defaultTeardown, type RunMain } from "@effect/platform/Runtime"
2
- import * as Cause from "effect/Cause"
3
- import * as Effect from "effect/Effect"
4
-
5
- /** @internal */
6
- export const runMain: RunMain = <E, A>(
7
- effect: Effect.Effect<never, E, A>,
8
- teardown = defaultTeardown
9
- ) => {
10
- const keepAlive = setInterval(() => {}, 2 ** 31 - 1)
11
-
12
- const fiber = Effect.runFork(
13
- Effect.tapErrorCause(effect, (cause) => {
14
- if (Cause.isInterruptedOnly(cause)) {
15
- return Effect.unit
16
- }
17
- return Effect.logError(cause)
18
- })
19
- )
20
-
21
- fiber.addObserver((exit) => {
22
- clearInterval(keepAlive)
23
- teardown(exit, (code) => {
24
- process.exit(code)
25
- })
26
- })
27
-
28
- function onSigint() {
29
- process.removeListener("SIGINT", onSigint)
30
- process.removeListener("SIGTERM", onSigint)
31
- fiber.unsafeInterruptAsFork(fiber.id())
32
- }
33
-
34
- process.once("SIGINT", onSigint)
35
- process.once("SIGTERM", onSigint)
36
- }
@@ -1,57 +0,0 @@
1
- import * as Channel from "effect/Channel"
2
- import type * as Chunk from "effect/Chunk"
3
- import * as Deferred from "effect/Deferred"
4
- import * as Effect from "effect/Effect"
5
- import type { LazyArg } from "effect/Function"
6
- import * as Sink from "effect/Sink"
7
- import type { Writable } from "node:stream"
8
- import type { FromWritableOptions } from "../Stream.js"
9
- import { writeInput } from "./stream.js"
10
-
11
- /** @internal */
12
- export const fromWritable = <E, A = Uint8Array | string>(
13
- evaluate: LazyArg<Writable | NodeJS.WritableStream>,
14
- onError: (error: unknown) => E,
15
- options?: FromWritableOptions
16
- ): Sink.Sink<never, E, A, never, void> => Sink.fromChannel(fromWritableChannel(evaluate, onError, options))
17
-
18
- /** @internal */
19
- export const fromWritableChannel = <IE, OE, A>(
20
- writable: LazyArg<Writable | NodeJS.WritableStream>,
21
- onError: (error: unknown) => OE,
22
- options?: FromWritableOptions
23
- ): Channel.Channel<never, IE, Chunk.Chunk<A>, unknown, IE | OE, Chunk.Chunk<never>, void> =>
24
- Channel.flatMap(
25
- Effect.zip(
26
- Effect.sync(() => writable()),
27
- Deferred.make<IE | OE, void>()
28
- ),
29
- ([writable, deferred]) =>
30
- Channel.embedInput(
31
- writableOutput(writable, deferred, onError),
32
- writeInput<IE, A>(
33
- writable,
34
- (cause) => Deferred.failCause(deferred, cause),
35
- options,
36
- Deferred.complete(deferred, Effect.unit)
37
- )
38
- )
39
- )
40
-
41
- const writableOutput = <IE, E>(
42
- writable: Writable | NodeJS.WritableStream,
43
- deferred: Deferred.Deferred<IE | E, void>,
44
- onError: (error: unknown) => E
45
- ) =>
46
- Effect.suspend(() => {
47
- function handleError(err: unknown) {
48
- Deferred.unsafeDone(deferred, Effect.fail(onError(err)))
49
- }
50
- writable.on("error", handleError)
51
- return Effect.ensuring(
52
- Deferred.await(deferred),
53
- Effect.sync(() => {
54
- writable.removeListener("error", handleError)
55
- })
56
- )
57
- })
@@ -1,325 +0,0 @@
1
- import type { SizeInput } from "@effect/platform/FileSystem"
2
- import type * as Cause from "effect/Cause"
3
- import * as Channel from "effect/Channel"
4
- import * as Chunk from "effect/Chunk"
5
- import * as Effect from "effect/Effect"
6
- import * as Either from "effect/Either"
7
- import * as Exit from "effect/Exit"
8
- import type { LazyArg } from "effect/Function"
9
- import { dual } from "effect/Function"
10
- import * as Queue from "effect/Queue"
11
- import type * as AsyncInput from "effect/SingleProducerAsyncInput"
12
- import * as Stream from "effect/Stream"
13
- import type { Duplex, Readable, Writable } from "node:stream"
14
- import { type PlatformError, SystemError } from "../Error.js"
15
- import type { FromReadableOptions, FromWritableOptions } from "../Stream.js"
16
-
17
- /** @internal */
18
- export const fromReadable = <E, A = Uint8Array>(
19
- evaluate: LazyArg<Readable | NodeJS.ReadableStream>,
20
- onError: (error: unknown) => E,
21
- { chunkSize }: FromReadableOptions = {}
22
- ): Stream.Stream<never, E, A> =>
23
- Stream.fromChannel(
24
- fromReadableChannel<E, A>(evaluate, onError, chunkSize ? Number(chunkSize) : undefined)
25
- )
26
-
27
- /** @internal */
28
- export const toString = <E>(
29
- readable: LazyArg<Readable | NodeJS.ReadableStream>,
30
- options: {
31
- readonly onFailure: (error: unknown) => E
32
- readonly encoding?: BufferEncoding | undefined
33
- readonly maxBytes?: SizeInput | undefined
34
- }
35
- ): Effect.Effect<never, E, string> => {
36
- const maxBytesNumber = options.maxBytes ? Number(options.maxBytes) : undefined
37
- return Effect.acquireUseRelease(
38
- Effect.sync(() => {
39
- const stream = readable()
40
- stream.setEncoding(options.encoding ?? "utf8")
41
- return stream
42
- }),
43
- (stream) =>
44
- Effect.async((resume) => {
45
- let string = ""
46
- let bytes = 0
47
- stream.once("error", (err) => {
48
- resume(Effect.fail(options.onFailure(err)))
49
- })
50
- stream.once("end", () => {
51
- resume(Effect.succeed(string))
52
- })
53
- stream.on("data", (chunk) => {
54
- string += chunk
55
- bytes += Buffer.byteLength(chunk)
56
- if (maxBytesNumber && bytes > maxBytesNumber) {
57
- resume(Effect.fail(options.onFailure(new Error("maxBytes exceeded"))))
58
- }
59
- })
60
- }),
61
- (stream) =>
62
- Effect.sync(() => {
63
- stream.removeAllListeners()
64
- if ("closed" in stream && !stream.closed) {
65
- stream.destroy()
66
- }
67
- })
68
- )
69
- }
70
-
71
- /** @internal */
72
- export const toUint8Array = <E>(
73
- readable: LazyArg<Readable | NodeJS.ReadableStream>,
74
- options: {
75
- readonly onFailure: (error: unknown) => E
76
- readonly maxBytes?: SizeInput | undefined
77
- }
78
- ): Effect.Effect<never, E, Uint8Array> => {
79
- const maxBytesNumber = options.maxBytes ? Number(options.maxBytes) : undefined
80
- return Effect.acquireUseRelease(
81
- Effect.sync(readable),
82
- (stream) =>
83
- Effect.async((resume) => {
84
- let buffer = Buffer.alloc(0)
85
- let bytes = 0
86
- stream.once("error", (err) => {
87
- resume(Effect.fail(options.onFailure(err)))
88
- })
89
- stream.once("end", () => {
90
- resume(Effect.succeed(buffer))
91
- })
92
- stream.on("data", (chunk) => {
93
- buffer = Buffer.concat([buffer, chunk])
94
- bytes += chunk.length
95
- if (maxBytesNumber && bytes > maxBytesNumber) {
96
- resume(Effect.fail(options.onFailure(new Error("maxBytes exceeded"))))
97
- }
98
- })
99
- }),
100
- (stream) =>
101
- Effect.sync(() => {
102
- stream.removeAllListeners()
103
- if ("closed" in stream && !stream.closed) {
104
- stream.destroy()
105
- }
106
- })
107
- )
108
- }
109
-
110
- /** @internal */
111
- export const fromDuplex = <IE, E, I = Uint8Array | string, O = Uint8Array>(
112
- evaluate: LazyArg<Duplex>,
113
- onError: (error: unknown) => E,
114
- options: FromReadableOptions & FromWritableOptions = {}
115
- ): Channel.Channel<never, IE, Chunk.Chunk<I>, unknown, IE | E, Chunk.Chunk<O>, void> =>
116
- Channel.acquireUseRelease(
117
- Effect.tap(
118
- Effect.zip(
119
- Effect.sync(evaluate),
120
- Queue.unbounded<Either.Either<Exit.Exit<IE | E, void>, void>>()
121
- ),
122
- ([duplex, queue]) => readableOffer(duplex, queue, onError)
123
- ),
124
- ([duplex, queue]) =>
125
- Channel.embedInput(
126
- readableTake(duplex, queue, options.chunkSize ? Number(options.chunkSize) : undefined),
127
- writeInput(
128
- duplex,
129
- (cause) => Queue.offer(queue, Either.left(Exit.failCause(cause))),
130
- options
131
- )
132
- ),
133
- ([duplex, queue]) =>
134
- Effect.zipRight(
135
- Effect.sync(() => {
136
- duplex.removeAllListeners()
137
- if (!duplex.closed) {
138
- duplex.destroy()
139
- }
140
- }),
141
- Queue.shutdown(queue)
142
- )
143
- )
144
-
145
- /** @internal */
146
- export const pipeThroughDuplex = dual<
147
- <E2, B = Uint8Array>(
148
- duplex: LazyArg<Duplex>,
149
- onError: (error: unknown) => E2,
150
- options?: FromReadableOptions & FromWritableOptions
151
- ) => <R, E, A>(self: Stream.Stream<R, E, A>) => Stream.Stream<R, E | E2, B>,
152
- <R, E, A, E2, B = Uint8Array>(
153
- self: Stream.Stream<R, E, A>,
154
- duplex: LazyArg<Duplex>,
155
- onError: (error: unknown) => E2,
156
- options?: FromReadableOptions & FromWritableOptions
157
- ) => Stream.Stream<R, E | E2, B>
158
- >(
159
- (args) => Stream.StreamTypeId in args[0],
160
- (self, duplex, onError, options) =>
161
- Stream.pipeThroughChannelOrFail(
162
- self,
163
- fromDuplex(duplex, onError, options)
164
- )
165
- )
166
-
167
- /** @internal */
168
- export const pipeThroughSimple = dual<
169
- (
170
- duplex: LazyArg<Duplex>
171
- ) => <R, E>(self: Stream.Stream<R, E, string | Uint8Array>) => Stream.Stream<R, E | PlatformError, Uint8Array>,
172
- <R, E>(
173
- self: Stream.Stream<R, E, string | Uint8Array>,
174
- duplex: LazyArg<Duplex>
175
- ) => Stream.Stream<R, E | PlatformError, Uint8Array>
176
- >(
177
- 2,
178
- (self, duplex) =>
179
- Stream.pipeThroughChannelOrFail(
180
- self,
181
- fromDuplex(duplex, (error) =>
182
- SystemError({
183
- module: "Stream",
184
- method: "pipeThroughSimple",
185
- pathOrDescriptor: "",
186
- reason: "Unknown",
187
- message: String(error)
188
- }))
189
- )
190
- )
191
-
192
- /** @internal */
193
- export const fromReadableChannel = <E, A = Uint8Array>(
194
- evaluate: LazyArg<Readable | NodeJS.ReadableStream>,
195
- onError: (error: unknown) => E,
196
- chunkSize: number | undefined
197
- ): Channel.Channel<never, unknown, unknown, unknown, E, Chunk.Chunk<A>, void> =>
198
- Channel.acquireUseRelease(
199
- Effect.tap(
200
- Effect.zip(
201
- Effect.sync(evaluate),
202
- Queue.unbounded<Either.Either<Exit.Exit<E, void>, void>>()
203
- ),
204
- ([readable, queue]) => readableOffer(readable, queue, onError)
205
- ),
206
- ([readable, queue]) => readableTake(readable, queue, chunkSize),
207
- ([readable, queue]) =>
208
- Effect.zipRight(
209
- Effect.sync(() => {
210
- readable.removeAllListeners()
211
- if ("closed" in readable && !readable.closed) {
212
- readable.destroy()
213
- }
214
- }),
215
- Queue.shutdown(queue)
216
- )
217
- )
218
-
219
- /** @internal */
220
- export const writeInput = <IE, A>(
221
- writable: Writable | NodeJS.WritableStream,
222
- onFailure: (cause: Cause.Cause<IE>) => Effect.Effect<never, never, void>,
223
- { encoding, endOnDone = true }: FromWritableOptions = {},
224
- onDone = Effect.unit
225
- ): AsyncInput.AsyncInputProducer<IE, Chunk.Chunk<A>, unknown> => {
226
- const write = writeEffect(writable, encoding)
227
- const close = endOnDone
228
- ? Effect.async<never, never, void>((resume) => {
229
- if ("closed" in writable && writable.closed) {
230
- resume(Effect.unit)
231
- } else {
232
- writable.once("finish", () => resume(Effect.unit))
233
- writable.end()
234
- }
235
- })
236
- : Effect.unit
237
- return {
238
- awaitRead: () => Effect.unit,
239
- emit: write,
240
- error: (cause) => Effect.zipRight(close, onFailure(cause)),
241
- done: (_) => Effect.zipRight(close, onDone)
242
- }
243
- }
244
-
245
- /** @internal */
246
- export const writeEffect = <A>(
247
- writable: Writable | NodeJS.WritableStream,
248
- encoding?: BufferEncoding
249
- ) =>
250
- (chunk: Chunk.Chunk<A>) =>
251
- chunk.length === 0 ?
252
- Effect.unit :
253
- Effect.async<never, never, void>((resume) => {
254
- const iterator = chunk[Symbol.iterator]()
255
- let next = iterator.next()
256
- function loop() {
257
- const item = next
258
- next = iterator.next()
259
- const success = writable.write(item.value, encoding as any)
260
- if (next.done) {
261
- resume(Effect.unit)
262
- } else if (success) {
263
- loop()
264
- } else {
265
- writable.once("drain", loop)
266
- }
267
- }
268
- loop()
269
- })
270
-
271
- const readableOffer = <E>(
272
- readable: Readable | NodeJS.ReadableStream,
273
- queue: Queue.Queue<Either.Either<Exit.Exit<E, void>, void>>,
274
- onError: (error: unknown) => E
275
- ) =>
276
- Effect.sync(() => {
277
- readable.on("readable", () => {
278
- const size = queue.unsafeSize()
279
- if (size._tag === "Some" && size.value <= 0) {
280
- queue.unsafeOffer(Either.right(void 0))
281
- }
282
- })
283
- readable.on("error", (err) => {
284
- queue.unsafeOffer(Either.left(Exit.fail(onError(err))))
285
- })
286
- readable.on("end", () => {
287
- queue.unsafeOffer(Either.left(Exit.unit))
288
- })
289
- if (readable.readable) {
290
- queue.unsafeOffer(Either.right(void 0))
291
- }
292
- })
293
-
294
- const readableTake = <E, A>(
295
- readable: Readable | NodeJS.ReadableStream,
296
- queue: Queue.Queue<Either.Either<Exit.Exit<E, void>, void>>,
297
- chunkSize: number | undefined
298
- ) => {
299
- const read = readChunkChannel<A>(readable, chunkSize)
300
- const loop: Channel.Channel<never, unknown, unknown, unknown, E, Chunk.Chunk<A>, void> = Channel.flatMap(
301
- Queue.take(queue),
302
- Either.match({
303
- onLeft: Exit.match({
304
- onFailure: Channel.failCause,
305
- onSuccess: (_) => Channel.unit
306
- }),
307
- onRight: (_) => Channel.flatMap(read, () => loop)
308
- })
309
- )
310
- return loop
311
- }
312
-
313
- const readChunkChannel = <A>(
314
- readable: Readable | NodeJS.ReadableStream,
315
- chunkSize: number | undefined
316
- ) =>
317
- Channel.suspend(() => {
318
- const arr: Array<A> = []
319
- let chunk = readable.read(chunkSize)
320
- while (chunk !== null) {
321
- arr.push(chunk)
322
- chunk = readable.read(chunkSize)
323
- }
324
- return Channel.write(Chunk.unsafeFromArray(arr))
325
- })
@@ -1,123 +0,0 @@
1
- import * as Error from "@effect/platform/Error"
2
- import * as Terminal from "@effect/platform/Terminal"
3
- import * as Effect from "effect/Effect"
4
- import * as Layer from "effect/Layer"
5
- import * as Option from "effect/Option"
6
- import * as readline from "node:readline"
7
-
8
- const defaultShouldQuit = (input: Terminal.UserInput): boolean =>
9
- input.key.ctrl && (input.key.name === "c" || input.key.name === "d")
10
-
11
- /** @internal */
12
- export const make = (
13
- shouldQuit: (input: Terminal.UserInput) => boolean = defaultShouldQuit
14
- ) =>
15
- Effect.gen(function*(_) {
16
- const input = yield* _(Effect.sync(() => globalThis.process.stdin))
17
- const output = yield* _(Effect.sync(() => globalThis.process.stdout))
18
-
19
- // Acquire a readline interface
20
- const acquireReadlineInterface = Effect.sync(() =>
21
- readline.createInterface({
22
- input,
23
- escapeCodeTimeout: 50
24
- })
25
- )
26
-
27
- // Uses the readline interface to force `stdin` to emit keypress events
28
- const emitKeypressEvents = (rl: readline.Interface): readline.Interface => {
29
- readline.emitKeypressEvents(input, rl)
30
- if (input.isTTY) {
31
- input.setRawMode(true)
32
- }
33
- return rl
34
- }
35
-
36
- // Close the `readline` interface
37
- const releaseReadlineInterface = (rl: readline.Interface) =>
38
- Effect.sync(() => {
39
- if (input.isTTY) {
40
- input.setRawMode(false)
41
- }
42
- rl.close()
43
- })
44
-
45
- // Handle the `"keypress"` event emitted by `stdin` (forced by readline)
46
- const handleKeypressEvent = (input: typeof globalThis.process.stdin) =>
47
- Effect.async<never, Terminal.QuitException, Terminal.UserInput>((resume) => {
48
- const handleKeypress = (input: string | undefined, key: readline.Key) => {
49
- const userInput: Terminal.UserInput = {
50
- input: Option.fromNullable(input),
51
- key: {
52
- name: key.name || "",
53
- ctrl: key.ctrl || false,
54
- meta: key.meta || false,
55
- shift: key.shift || false
56
- }
57
- }
58
- if (shouldQuit(userInput)) {
59
- resume(Effect.fail(new Terminal.QuitException()))
60
- } else {
61
- resume(Effect.succeed(userInput))
62
- }
63
- }
64
- input.once("keypress", handleKeypress)
65
- return Effect.sync(() => {
66
- input.removeListener("keypress", handleKeypress)
67
- })
68
- })
69
-
70
- // Handle the `"line"` event emitted by the readline interface
71
- const handleLineEvent = (rl: readline.Interface) =>
72
- Effect.async<never, Terminal.QuitException, string>((resume) => {
73
- const handleLine = (line: string) => {
74
- resume(Effect.succeed(line))
75
- }
76
- rl.on("line", handleLine)
77
- return Effect.sync(() => {
78
- rl.removeListener("line", handleLine)
79
- })
80
- })
81
-
82
- const readInput = Effect.acquireUseRelease(
83
- acquireReadlineInterface.pipe(Effect.map(emitKeypressEvents)),
84
- () => handleKeypressEvent(input),
85
- releaseReadlineInterface
86
- )
87
-
88
- const readLine = Effect.acquireUseRelease(
89
- acquireReadlineInterface,
90
- (rl) => handleLineEvent(rl),
91
- releaseReadlineInterface
92
- )
93
-
94
- const display = (prompt: string): Effect.Effect<never, Error.PlatformError, void> =>
95
- Effect.uninterruptible(
96
- Effect.async((resume) => {
97
- output.write(prompt, (err) => {
98
- if (err) {
99
- resume(Effect.fail(Error.BadArgument({
100
- module: "Terminal",
101
- method: "display",
102
- message: (err as Error).message ?? String(err)
103
- })))
104
- }
105
- resume(Effect.unit)
106
- })
107
- })
108
- )
109
-
110
- return Terminal.Terminal.of({
111
- // The columns property can be undefined if stdout was redirected
112
- columns: Effect.sync(() => output.columns || 0),
113
- readInput,
114
- readLine,
115
- display
116
- })
117
- })
118
-
119
- /** @internal */
120
- export const layer: Layer.Layer<never, never, Terminal.Terminal> = Layer.scoped(
121
- Terminal.Terminal,
122
- make(defaultShouldQuit)
123
- )