@effect/platform-node 0.104.0 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/Mime.d.ts +15 -0
  2. package/dist/Mime.d.ts.map +1 -0
  3. package/dist/Mime.js +16 -0
  4. package/dist/Mime.js.map +1 -0
  5. package/dist/NodeChildProcessSpawner.d.ts +7 -0
  6. package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
  7. package/dist/NodeChildProcessSpawner.js +7 -0
  8. package/dist/NodeChildProcessSpawner.js.map +1 -0
  9. package/dist/NodeClusterHttp.d.ts +44 -0
  10. package/dist/NodeClusterHttp.d.ts.map +1 -0
  11. package/dist/{esm/NodeClusterHttp.js → NodeClusterHttp.js} +14 -18
  12. package/dist/NodeClusterHttp.js.map +1 -0
  13. package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +13 -13
  14. package/dist/NodeClusterSocket.d.ts.map +1 -0
  15. package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +13 -13
  16. package/dist/NodeClusterSocket.js.map +1 -0
  17. package/dist/NodeFileSystem.d.ts +8 -0
  18. package/dist/NodeFileSystem.d.ts.map +1 -0
  19. package/dist/NodeFileSystem.js.map +1 -0
  20. package/dist/NodeHttpClient.d.ts +110 -0
  21. package/dist/NodeHttpClient.d.ts.map +1 -0
  22. package/dist/NodeHttpClient.js +446 -0
  23. package/dist/NodeHttpClient.js.map +1 -0
  24. package/dist/NodeHttpIncomingMessage.d.ts +35 -0
  25. package/dist/NodeHttpIncomingMessage.d.ts.map +1 -0
  26. package/dist/NodeHttpIncomingMessage.js +77 -0
  27. package/dist/NodeHttpIncomingMessage.js.map +1 -0
  28. package/dist/NodeHttpPlatform.d.ts +26 -0
  29. package/dist/NodeHttpPlatform.d.ts.map +1 -0
  30. package/dist/{esm/internal/httpPlatform.js → NodeHttpPlatform.js} +20 -11
  31. package/dist/NodeHttpPlatform.js.map +1 -0
  32. package/dist/NodeHttpServer.d.ts +73 -0
  33. package/dist/NodeHttpServer.d.ts.map +1 -0
  34. package/dist/NodeHttpServer.js +376 -0
  35. package/dist/NodeHttpServer.js.map +1 -0
  36. package/dist/NodeHttpServerRequest.d.ts +16 -0
  37. package/dist/NodeHttpServerRequest.d.ts.map +1 -0
  38. package/dist/NodeHttpServerRequest.js +14 -0
  39. package/dist/NodeHttpServerRequest.js.map +1 -0
  40. package/dist/NodeMultipart.d.ts +26 -0
  41. package/dist/NodeMultipart.d.ts.map +1 -0
  42. package/dist/NodeMultipart.js +131 -0
  43. package/dist/NodeMultipart.js.map +1 -0
  44. package/dist/NodePath.d.ts +18 -0
  45. package/dist/NodePath.d.ts.map +1 -0
  46. package/dist/NodePath.js.map +1 -0
  47. package/dist/NodeRedis.d.ts +31 -0
  48. package/dist/NodeRedis.d.ts.map +1 -0
  49. package/dist/NodeRedis.js +51 -0
  50. package/dist/NodeRedis.js.map +1 -0
  51. package/dist/NodeRuntime.d.ts +94 -0
  52. package/dist/NodeRuntime.d.ts.map +1 -0
  53. package/dist/NodeRuntime.js +33 -0
  54. package/dist/NodeRuntime.js.map +1 -0
  55. package/dist/NodeServices.d.ts +20 -0
  56. package/dist/NodeServices.d.ts.map +1 -0
  57. package/dist/NodeServices.js +12 -0
  58. package/dist/NodeServices.js.map +1 -0
  59. package/dist/NodeSink.d.ts.map +1 -0
  60. package/dist/NodeSink.js.map +1 -0
  61. package/dist/NodeSocket.d.ts +23 -0
  62. package/dist/NodeSocket.d.ts.map +1 -0
  63. package/dist/{esm/NodeSocket.js → NodeSocket.js} +9 -8
  64. package/dist/NodeSocket.js.map +1 -0
  65. package/dist/NodeSocketServer.d.ts.map +1 -0
  66. package/dist/NodeSocketServer.js.map +1 -0
  67. package/dist/NodeStdio.d.ts +8 -0
  68. package/dist/NodeStdio.d.ts.map +1 -0
  69. package/dist/NodeStdio.js +10 -0
  70. package/dist/NodeStdio.js.map +1 -0
  71. package/dist/{dts/NodeStream.d.ts → NodeStream.d.ts} +1 -1
  72. package/dist/NodeStream.d.ts.map +1 -0
  73. package/dist/{esm/NodeStream.js → NodeStream.js} +1 -1
  74. package/dist/NodeStream.js.map +1 -0
  75. package/dist/{dts/NodeTerminal.d.ts → NodeTerminal.d.ts} +2 -2
  76. package/dist/NodeTerminal.d.ts.map +1 -0
  77. package/dist/{esm/NodeTerminal.js → NodeTerminal.js} +1 -1
  78. package/dist/NodeTerminal.js.map +1 -0
  79. package/dist/NodeWorker.d.ts +15 -0
  80. package/dist/NodeWorker.d.ts.map +1 -0
  81. package/dist/NodeWorker.js +81 -0
  82. package/dist/NodeWorker.js.map +1 -0
  83. package/dist/NodeWorkerRunner.d.ts +8 -0
  84. package/dist/NodeWorkerRunner.d.ts.map +1 -0
  85. package/dist/NodeWorkerRunner.js +85 -0
  86. package/dist/NodeWorkerRunner.js.map +1 -0
  87. package/dist/{dts/Undici.d.ts → Undici.d.ts} +3 -3
  88. package/dist/Undici.d.ts.map +1 -0
  89. package/dist/{esm/Undici.js → Undici.js} +3 -3
  90. package/dist/Undici.js.map +1 -0
  91. package/dist/index.d.ts +102 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/{esm/index.js → index.js} +25 -7
  94. package/dist/index.js.map +1 -0
  95. package/package.json +60 -213
  96. package/src/Mime.ts +18 -0
  97. package/src/NodeChildProcessSpawner.ts +6 -0
  98. package/src/NodeClusterHttp.ts +33 -35
  99. package/src/NodeClusterSocket.ts +23 -24
  100. package/src/NodeFileSystem.ts +3 -3
  101. package/src/NodeHttpClient.ts +506 -70
  102. package/src/NodeHttpIncomingMessage.ts +105 -0
  103. package/src/NodeHttpPlatform.ts +44 -10
  104. package/src/NodeHttpServer.ts +539 -102
  105. package/src/NodeHttpServerRequest.ts +8 -8
  106. package/src/NodeMultipart.ts +156 -1
  107. package/src/NodePath.ts +5 -6
  108. package/src/NodeRedis.ts +74 -0
  109. package/src/NodeRuntime.ts +95 -3
  110. package/src/NodeServices.ts +34 -0
  111. package/src/NodeSocket.ts +24 -16
  112. package/src/NodeStdio.ts +12 -0
  113. package/src/NodeStream.ts +1 -1
  114. package/src/NodeTerminal.ts +2 -2
  115. package/src/NodeWorker.ts +89 -20
  116. package/src/NodeWorkerRunner.ts +89 -12
  117. package/src/Undici.ts +7 -7
  118. package/src/index.ts +44 -21
  119. package/NodeClusterHttp/package.json +0 -6
  120. package/NodeClusterSocket/package.json +0 -6
  121. package/NodeCommandExecutor/package.json +0 -6
  122. package/NodeContext/package.json +0 -6
  123. package/NodeFileSystem/ParcelWatcher/package.json +0 -6
  124. package/NodeFileSystem/package.json +0 -6
  125. package/NodeHttpClient/package.json +0 -6
  126. package/NodeHttpPlatform/package.json +0 -6
  127. package/NodeHttpServer/package.json +0 -6
  128. package/NodeHttpServerRequest/package.json +0 -6
  129. package/NodeKeyValueStore/package.json +0 -6
  130. package/NodeMultipart/package.json +0 -6
  131. package/NodePath/package.json +0 -6
  132. package/NodeRuntime/package.json +0 -6
  133. package/NodeSink/package.json +0 -6
  134. package/NodeSocket/package.json +0 -6
  135. package/NodeSocketServer/package.json +0 -6
  136. package/NodeStream/package.json +0 -6
  137. package/NodeTerminal/package.json +0 -6
  138. package/NodeWorker/package.json +0 -6
  139. package/NodeWorkerRunner/package.json +0 -6
  140. package/Undici/package.json +0 -6
  141. package/dist/cjs/NodeClusterHttp.js +0 -61
  142. package/dist/cjs/NodeClusterHttp.js.map +0 -1
  143. package/dist/cjs/NodeClusterSocket.js +0 -77
  144. package/dist/cjs/NodeClusterSocket.js.map +0 -1
  145. package/dist/cjs/NodeCommandExecutor.js +0 -18
  146. package/dist/cjs/NodeCommandExecutor.js.map +0 -1
  147. package/dist/cjs/NodeContext.js +0 -24
  148. package/dist/cjs/NodeContext.js.map +0 -1
  149. package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -18
  150. package/dist/cjs/NodeFileSystem/ParcelWatcher.js.map +0 -1
  151. package/dist/cjs/NodeFileSystem.js +0 -18
  152. package/dist/cjs/NodeFileSystem.js.map +0 -1
  153. package/dist/cjs/NodeHttpClient.js +0 -92
  154. package/dist/cjs/NodeHttpClient.js.map +0 -1
  155. package/dist/cjs/NodeHttpPlatform.js +0 -19
  156. package/dist/cjs/NodeHttpPlatform.js.map +0 -1
  157. package/dist/cjs/NodeHttpServer.js +0 -68
  158. package/dist/cjs/NodeHttpServer.js.map +0 -1
  159. package/dist/cjs/NodeHttpServerRequest.js +0 -19
  160. package/dist/cjs/NodeHttpServerRequest.js.map +0 -1
  161. package/dist/cjs/NodeKeyValueStore.js +0 -18
  162. package/dist/cjs/NodeKeyValueStore.js.map +0 -1
  163. package/dist/cjs/NodeMultipart.js +0 -17
  164. package/dist/cjs/NodeMultipart.js.map +0 -1
  165. package/dist/cjs/NodePath.js +0 -28
  166. package/dist/cjs/NodePath.js.map +0 -1
  167. package/dist/cjs/NodeRuntime.js +0 -18
  168. package/dist/cjs/NodeRuntime.js.map +0 -1
  169. package/dist/cjs/NodeSink.js +0 -17
  170. package/dist/cjs/NodeSink.js.map +0 -1
  171. package/dist/cjs/NodeSocket.js +0 -51
  172. package/dist/cjs/NodeSocket.js.map +0 -1
  173. package/dist/cjs/NodeSocketServer.js +0 -17
  174. package/dist/cjs/NodeSocketServer.js.map +0 -1
  175. package/dist/cjs/NodeStream.js +0 -17
  176. package/dist/cjs/NodeStream.js.map +0 -1
  177. package/dist/cjs/NodeTerminal.js +0 -23
  178. package/dist/cjs/NodeTerminal.js.map +0 -1
  179. package/dist/cjs/NodeWorker.js +0 -29
  180. package/dist/cjs/NodeWorker.js.map +0 -1
  181. package/dist/cjs/NodeWorkerRunner.js +0 -21
  182. package/dist/cjs/NodeWorkerRunner.js.map +0 -1
  183. package/dist/cjs/Undici.js +0 -26
  184. package/dist/cjs/Undici.js.map +0 -1
  185. package/dist/cjs/index.js +0 -50
  186. package/dist/cjs/index.js.map +0 -1
  187. package/dist/cjs/internal/httpClient.js +0 -196
  188. package/dist/cjs/internal/httpClient.js.map +0 -1
  189. package/dist/cjs/internal/httpClientUndici.js +0 -194
  190. package/dist/cjs/internal/httpClientUndici.js.map +0 -1
  191. package/dist/cjs/internal/httpIncomingMessage.js +0 -74
  192. package/dist/cjs/internal/httpIncomingMessage.js.map +0 -1
  193. package/dist/cjs/internal/httpPlatform.js +0 -49
  194. package/dist/cjs/internal/httpPlatform.js.map +0 -1
  195. package/dist/cjs/internal/httpServer.js +0 -352
  196. package/dist/cjs/internal/httpServer.js.map +0 -1
  197. package/dist/cjs/internal/worker.js +0 -82
  198. package/dist/cjs/internal/worker.js.map +0 -1
  199. package/dist/cjs/internal/workerRunner.js +0 -83
  200. package/dist/cjs/internal/workerRunner.js.map +0 -1
  201. package/dist/dts/NodeClusterHttp.d.ts +0 -41
  202. package/dist/dts/NodeClusterHttp.d.ts.map +0 -1
  203. package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
  204. package/dist/dts/NodeCommandExecutor.d.ts +0 -9
  205. package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
  206. package/dist/dts/NodeContext.d.ts +0 -17
  207. package/dist/dts/NodeContext.d.ts.map +0 -1
  208. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -8
  209. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
  210. package/dist/dts/NodeFileSystem.d.ts +0 -8
  211. package/dist/dts/NodeFileSystem.d.ts.map +0 -1
  212. package/dist/dts/NodeHttpClient.d.ts +0 -116
  213. package/dist/dts/NodeHttpClient.d.ts.map +0 -1
  214. package/dist/dts/NodeHttpPlatform.d.ts +0 -19
  215. package/dist/dts/NodeHttpPlatform.d.ts.map +0 -1
  216. package/dist/dts/NodeHttpServer.d.ts +0 -91
  217. package/dist/dts/NodeHttpServer.d.ts.map +0 -1
  218. package/dist/dts/NodeHttpServerRequest.d.ts +0 -16
  219. package/dist/dts/NodeHttpServerRequest.d.ts.map +0 -1
  220. package/dist/dts/NodeKeyValueStore.d.ts +0 -9
  221. package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
  222. package/dist/dts/NodeMultipart.d.ts +0 -8
  223. package/dist/dts/NodeMultipart.d.ts.map +0 -1
  224. package/dist/dts/NodePath.d.ts +0 -21
  225. package/dist/dts/NodePath.d.ts.map +0 -1
  226. package/dist/dts/NodeRuntime.d.ts +0 -7
  227. package/dist/dts/NodeRuntime.d.ts.map +0 -1
  228. package/dist/dts/NodeSink.d.ts.map +0 -1
  229. package/dist/dts/NodeSocket.d.ts +0 -22
  230. package/dist/dts/NodeSocket.d.ts.map +0 -1
  231. package/dist/dts/NodeSocketServer.d.ts.map +0 -1
  232. package/dist/dts/NodeStream.d.ts.map +0 -1
  233. package/dist/dts/NodeTerminal.d.ts.map +0 -1
  234. package/dist/dts/NodeWorker.d.ts +0 -28
  235. package/dist/dts/NodeWorker.d.ts.map +0 -1
  236. package/dist/dts/NodeWorkerRunner.d.ts +0 -17
  237. package/dist/dts/NodeWorkerRunner.d.ts.map +0 -1
  238. package/dist/dts/Undici.d.ts.map +0 -1
  239. package/dist/dts/index.d.ts +0 -85
  240. package/dist/dts/index.d.ts.map +0 -1
  241. package/dist/dts/internal/httpClient.d.ts +0 -2
  242. package/dist/dts/internal/httpClient.d.ts.map +0 -1
  243. package/dist/dts/internal/httpClientUndici.d.ts +0 -2
  244. package/dist/dts/internal/httpClientUndici.d.ts.map +0 -1
  245. package/dist/dts/internal/httpIncomingMessage.d.ts +0 -2
  246. package/dist/dts/internal/httpIncomingMessage.d.ts.map +0 -1
  247. package/dist/dts/internal/httpPlatform.d.ts +0 -2
  248. package/dist/dts/internal/httpPlatform.d.ts.map +0 -1
  249. package/dist/dts/internal/httpServer.d.ts +0 -2
  250. package/dist/dts/internal/httpServer.d.ts.map +0 -1
  251. package/dist/dts/internal/worker.d.ts +0 -2
  252. package/dist/dts/internal/worker.d.ts.map +0 -1
  253. package/dist/dts/internal/workerRunner.d.ts +0 -2
  254. package/dist/dts/internal/workerRunner.d.ts.map +0 -1
  255. package/dist/esm/NodeClusterHttp.js.map +0 -1
  256. package/dist/esm/NodeClusterSocket.js.map +0 -1
  257. package/dist/esm/NodeCommandExecutor.js +0 -10
  258. package/dist/esm/NodeCommandExecutor.js.map +0 -1
  259. package/dist/esm/NodeContext.js +0 -16
  260. package/dist/esm/NodeContext.js.map +0 -1
  261. package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -10
  262. package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
  263. package/dist/esm/NodeFileSystem.js.map +0 -1
  264. package/dist/esm/NodeHttpClient.js +0 -84
  265. package/dist/esm/NodeHttpClient.js.map +0 -1
  266. package/dist/esm/NodeHttpPlatform.js +0 -12
  267. package/dist/esm/NodeHttpPlatform.js.map +0 -1
  268. package/dist/esm/NodeHttpServer.js +0 -61
  269. package/dist/esm/NodeHttpServer.js.map +0 -1
  270. package/dist/esm/NodeHttpServerRequest.js +0 -12
  271. package/dist/esm/NodeHttpServerRequest.js.map +0 -1
  272. package/dist/esm/NodeKeyValueStore.js +0 -10
  273. package/dist/esm/NodeKeyValueStore.js.map +0 -1
  274. package/dist/esm/NodeMultipart.js +0 -8
  275. package/dist/esm/NodeMultipart.js.map +0 -1
  276. package/dist/esm/NodePath.js.map +0 -1
  277. package/dist/esm/NodeRuntime.js +0 -10
  278. package/dist/esm/NodeRuntime.js.map +0 -1
  279. package/dist/esm/NodeSink.js.map +0 -1
  280. package/dist/esm/NodeSocket.js.map +0 -1
  281. package/dist/esm/NodeSocketServer.js.map +0 -1
  282. package/dist/esm/NodeStream.js.map +0 -1
  283. package/dist/esm/NodeTerminal.js.map +0 -1
  284. package/dist/esm/NodeWorker.js +0 -22
  285. package/dist/esm/NodeWorker.js.map +0 -1
  286. package/dist/esm/NodeWorkerRunner.js +0 -13
  287. package/dist/esm/NodeWorkerRunner.js.map +0 -1
  288. package/dist/esm/Undici.js.map +0 -1
  289. package/dist/esm/index.js.map +0 -1
  290. package/dist/esm/internal/httpClient.js +0 -187
  291. package/dist/esm/internal/httpClient.js.map +0 -1
  292. package/dist/esm/internal/httpClientUndici.js +0 -186
  293. package/dist/esm/internal/httpClientUndici.js.map +0 -1
  294. package/dist/esm/internal/httpIncomingMessage.js +0 -66
  295. package/dist/esm/internal/httpIncomingMessage.js.map +0 -1
  296. package/dist/esm/internal/httpPlatform.js.map +0 -1
  297. package/dist/esm/internal/httpServer.js +0 -337
  298. package/dist/esm/internal/httpServer.js.map +0 -1
  299. package/dist/esm/internal/worker.js +0 -73
  300. package/dist/esm/internal/worker.js.map +0 -1
  301. package/dist/esm/internal/workerRunner.js +0 -76
  302. package/dist/esm/internal/workerRunner.js.map +0 -1
  303. package/dist/esm/package.json +0 -4
  304. package/index/package.json +0 -6
  305. package/src/NodeCommandExecutor.ts +0 -13
  306. package/src/NodeContext.ts +0 -40
  307. package/src/NodeFileSystem/ParcelWatcher.ts +0 -12
  308. package/src/NodeKeyValueStore.ts +0 -15
  309. package/src/internal/httpClient.ts +0 -260
  310. package/src/internal/httpClientUndici.ts +0 -231
  311. package/src/internal/httpIncomingMessage.ts +0 -92
  312. package/src/internal/httpPlatform.ts +0 -46
  313. package/src/internal/httpServer.ts +0 -517
  314. package/src/internal/worker.ts +0 -86
  315. package/src/internal/workerRunner.ts +0 -77
  316. /package/dist/{esm/NodeFileSystem.js → NodeFileSystem.js} +0 -0
  317. /package/dist/{esm/NodePath.js → NodePath.js} +0 -0
  318. /package/dist/{dts/NodeSink.d.ts → NodeSink.d.ts} +0 -0
  319. /package/dist/{esm/NodeSink.js → NodeSink.js} +0 -0
  320. /package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +0 -0
  321. /package/dist/{esm/NodeSocketServer.js → NodeSocketServer.js} +0 -0
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as ServerRequest from "@effect/platform/HttpServerRequest"
4
+ import type { HttpServerRequest } from "effect/unstable/http/HttpServerRequest"
5
5
  import type * as Http from "node:http"
6
- import * as internal from "./internal/httpServer.js"
7
6
 
8
7
  /**
9
- * @category conversions
10
8
  * @since 1.0.0
9
+ * @category Accessors
11
10
  */
12
- export const toIncomingMessage: (self: ServerRequest.HttpServerRequest) => Http.IncomingMessage =
13
- internal.toIncomingMessage
11
+ export const toIncomingMessage = (self: HttpServerRequest): Http.IncomingMessage => self.source as any
14
12
 
15
13
  /**
16
- * @category conversions
17
14
  * @since 1.0.0
15
+ * @category Accessors
18
16
  */
19
- export const toServerResponse: (self: ServerRequest.HttpServerRequest) => Http.ServerResponse =
20
- internal.toServerResponse
17
+ export const toServerResponse = (self: HttpServerRequest): Http.ServerResponse => {
18
+ const res = (self as any).response
19
+ return typeof res === "function" ? res() : res
20
+ }
@@ -1,8 +1,163 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
+ import * as Effect from "effect/Effect"
5
+ import type * as FileSystem from "effect/FileSystem"
6
+ import * as Inspectable from "effect/Inspectable"
7
+ import type * as Path from "effect/Path"
8
+ import type * as Scope from "effect/Scope"
9
+ import * as Stream from "effect/Stream"
10
+ import * as Multipart from "effect/unstable/http/Multipart"
11
+ import * as MP from "effect/unstable/http/Multipasta/Node"
12
+ import * as NFS from "node:fs"
13
+ import type { IncomingHttpHeaders } from "node:http"
14
+ import type { Readable } from "node:stream"
15
+ import * as NodeStreamP from "node:stream/promises"
16
+ import * as NodeStream from "./NodeStream.ts"
4
17
 
5
18
  /**
6
19
  * @since 1.0.0
20
+ * @category constructors
7
21
  */
8
- export * from "@effect/platform-node-shared/NodeMultipart"
22
+ export const stream = (
23
+ source: Readable,
24
+ headers: IncomingHttpHeaders
25
+ ): Stream.Stream<Multipart.Part, Multipart.MultipartError> =>
26
+ Multipart.makeConfig(headers as any).pipe(
27
+ Effect.map((config) =>
28
+ NodeStream.fromReadable<MP.Part, Multipart.MultipartError>({
29
+ evaluate() {
30
+ const parser = MP.make(config)
31
+ source.pipe(parser)
32
+ return parser as any
33
+ },
34
+ onError: (error) => convertError(error as any)
35
+ })
36
+ ),
37
+ Stream.unwrap,
38
+ Stream.map(convertPart)
39
+ )
40
+
41
+ /**
42
+ * @since 1.0.0
43
+ * @category constructors
44
+ */
45
+ export const persisted = (
46
+ source: Readable,
47
+ headers: IncomingHttpHeaders
48
+ ): Effect.Effect<
49
+ Multipart.Persisted,
50
+ Multipart.MultipartError,
51
+ Scope.Scope | FileSystem.FileSystem | Path.Path
52
+ > =>
53
+ Multipart.toPersisted(stream(source, headers), (path, file) =>
54
+ Effect.tryPromise({
55
+ try: (signal) => NodeStreamP.pipeline((file as FileImpl).file, NFS.createWriteStream(path), { signal }),
56
+ catch: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
57
+ }))
58
+
59
+ /**
60
+ * @since 1.0.0
61
+ */
62
+ export const fileToReadable = (file: Multipart.File): Readable => (file as FileImpl).file
63
+
64
+ // -----------------------------------------------------------------------------
65
+ // Internal
66
+ // -----------------------------------------------------------------------------
67
+
68
+ const convertPart = (part: MP.Part): Multipart.Part =>
69
+ part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part)
70
+
71
+ abstract class PartBase extends Inspectable.Class {
72
+ readonly [Multipart.TypeId]: typeof Multipart.TypeId
73
+ constructor() {
74
+ super()
75
+ this[Multipart.TypeId] = Multipart.TypeId
76
+ }
77
+ }
78
+
79
+ class FieldImpl extends PartBase implements Multipart.Field {
80
+ readonly _tag = "Field"
81
+ readonly key: string
82
+ readonly contentType: string
83
+ readonly value: string
84
+
85
+ constructor(
86
+ info: MP.PartInfo,
87
+ value: Uint8Array
88
+ ) {
89
+ super()
90
+ this.key = info.name
91
+ this.contentType = info.contentType
92
+ this.value = MP.decodeField(info, value)
93
+ }
94
+
95
+ toJSON(): unknown {
96
+ return {
97
+ _id: "@effect/platform/Multipart/Part",
98
+ _tag: "Field",
99
+ key: this.key,
100
+ value: this.value,
101
+ contentType: this.contentType
102
+ }
103
+ }
104
+ }
105
+
106
+ class FileImpl extends PartBase implements Multipart.File {
107
+ readonly _tag = "File"
108
+ readonly key: string
109
+ readonly name: string
110
+ readonly contentType: string
111
+ readonly content: Stream.Stream<Uint8Array, Multipart.MultipartError>
112
+ readonly contentEffect: Effect.Effect<Uint8Array, Multipart.MultipartError>
113
+ readonly file: MP.FileStream
114
+
115
+ constructor(file: MP.FileStream) {
116
+ super()
117
+ this.file = file
118
+ this.key = file.info.name
119
+ this.name = file.filename ?? file.info.name
120
+ this.contentType = file.info.contentType
121
+ this.content = NodeStream.fromReadable({
122
+ evaluate: () => file,
123
+ onError: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
124
+ })
125
+ this.contentEffect = NodeStream.toUint8Array(() => file, {
126
+ onError: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
127
+ })
128
+ }
129
+
130
+ toJSON(): unknown {
131
+ return {
132
+ _id: "@effect/platform/Multipart/Part",
133
+ _tag: "File",
134
+ key: this.key,
135
+ name: this.name,
136
+ contentType: this.contentType
137
+ }
138
+ }
139
+ }
140
+
141
+ function convertError(cause: MP.MultipartError): Multipart.MultipartError {
142
+ switch (cause._tag) {
143
+ case "ReachedLimit": {
144
+ switch (cause.limit) {
145
+ case "MaxParts": {
146
+ return Multipart.MultipartError.fromReason("TooManyParts", cause)
147
+ }
148
+ case "MaxFieldSize": {
149
+ return Multipart.MultipartError.fromReason("FieldTooLarge", cause)
150
+ }
151
+ case "MaxPartSize": {
152
+ return Multipart.MultipartError.fromReason("FileTooLarge", cause)
153
+ }
154
+ case "MaxTotalSize": {
155
+ return Multipart.MultipartError.fromReason("BodyTooLarge", cause)
156
+ }
157
+ }
158
+ }
159
+ default: {
160
+ return Multipart.MultipartError.fromReason("Parse", cause)
161
+ }
162
+ }
163
+ }
package/src/NodePath.ts CHANGED
@@ -1,25 +1,24 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
-
5
4
  import * as NodePath from "@effect/platform-node-shared/NodePath"
6
- import type { Path } from "@effect/platform/Path"
7
- import type { Layer } from "effect/Layer"
5
+ import type * as Layer from "effect/Layer"
6
+ import type { Path } from "effect/Path"
8
7
 
9
8
  /**
10
9
  * @since 1.0.0
11
10
  * @category layer
12
11
  */
13
- export const layer: Layer<Path> = NodePath.layer
12
+ export const layer: Layer.Layer<Path> = NodePath.layer
14
13
 
15
14
  /**
16
15
  * @since 1.0.0
17
16
  * @category layer
18
17
  */
19
- export const layerPosix: Layer<Path> = NodePath.layerPosix
18
+ export const layerPosix: Layer.Layer<Path> = NodePath.layerPosix
20
19
 
21
20
  /**
22
21
  * @since 1.0.0
23
22
  * @category layer
24
23
  */
25
- export const layerWin32: Layer<Path> = NodePath.layerWin32
24
+ export const layerWin32: Layer.Layer<Path> = NodePath.layerWin32
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Config from "effect/Config"
5
+ import * as Effect from "effect/Effect"
6
+ import * as Fn from "effect/Function"
7
+ import * as Layer from "effect/Layer"
8
+ import * as Scope from "effect/Scope"
9
+ import * as ServiceMap from "effect/ServiceMap"
10
+ import * as Redis from "effect/unstable/persistence/Redis"
11
+ import * as IoRedis from "ioredis"
12
+
13
+ /**
14
+ * @since 1.0.0
15
+ * @category Service
16
+ */
17
+ export class NodeRedis extends ServiceMap.Service<NodeRedis, {
18
+ readonly client: IoRedis.Redis
19
+ readonly use: <A>(f: (client: IoRedis.Redis) => Promise<A>) => Effect.Effect<A, Redis.RedisError>
20
+ }>()("@effect/platform-node/NodeRedis") {}
21
+
22
+ const make = Effect.fnUntraced(function*(
23
+ options?: IoRedis.RedisOptions
24
+ ) {
25
+ const scope = yield* Effect.scope
26
+ yield* Scope.addFinalizer(scope, Effect.promise(() => client.quit()))
27
+ const client = new IoRedis.Redis(options ?? {})
28
+
29
+ const use = <A>(f: (client: IoRedis.Redis) => Promise<A>) =>
30
+ Effect.tryPromise({
31
+ try: () => f(client),
32
+ catch: (cause) => new Redis.RedisError({ cause })
33
+ })
34
+
35
+ const redis = yield* Redis.make({
36
+ send: <A = unknown>(command: string, ...args: ReadonlyArray<string>) =>
37
+ Effect.tryPromise({
38
+ try: () => client.call(command, ...args) as Promise<A>,
39
+ catch: (cause) => new Redis.RedisError({ cause })
40
+ })
41
+ })
42
+
43
+ const nodeRedis = Fn.identity<NodeRedis["Service"]>({
44
+ client,
45
+ use
46
+ })
47
+
48
+ return ServiceMap.make(NodeRedis, nodeRedis).pipe(
49
+ ServiceMap.add(Redis.Redis, redis)
50
+ )
51
+ })
52
+
53
+ /**
54
+ * @since 1.0.0
55
+ * @category Layers
56
+ */
57
+ export const layer = (
58
+ options?: IoRedis.RedisOptions | undefined
59
+ ): Layer.Layer<Redis.Redis | NodeRedis> => Layer.effectServices(make(options))
60
+
61
+ /**
62
+ * @since 1.0.0
63
+ * @category Layers
64
+ */
65
+ export const layerConfig: (
66
+ options: Config.Wrap<IoRedis.RedisOptions>
67
+ ) => Layer.Layer<Redis.Redis | NodeRedis, Config.ConfigError> = (
68
+ options: Config.Wrap<IoRedis.RedisOptions>
69
+ ): Layer.Layer<Redis.Redis | NodeRedis, Config.ConfigError> =>
70
+ Layer.effectServices(
71
+ Config.unwrap(options).asEffect().pipe(
72
+ Effect.flatMap(make)
73
+ )
74
+ )
@@ -2,10 +2,102 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as NodeRuntime from "@effect/platform-node-shared/NodeRuntime"
5
- import type { RunMain } from "@effect/platform/Runtime"
5
+ import type { Effect } from "effect/Effect"
6
+ import type * as Runtime from "effect/Runtime"
6
7
 
7
8
  /**
9
+ * Helps you run a main effect with built-in error handling, logging, and signal management.
10
+ *
11
+ * **Details**
12
+ *
13
+ * This function launches an Effect as the main entry point, setting exit codes
14
+ * based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
15
+ * logging errors. By default, it logs errors and uses a "pretty" format, but both
16
+ * behaviors can be turned off. You can also provide custom teardown logic to
17
+ * finalize resources or produce different exit codes.
18
+ *
19
+ * **Options**
20
+ *
21
+ * An optional object that can include:
22
+ * - `disableErrorReporting`: Turn off automatic error logging.
23
+ * - `disablePrettyLogger`: Avoid adding the pretty logger.
24
+ * - `teardown`: Provide custom finalization logic.
25
+ *
26
+ * **When to Use**
27
+ *
28
+ * Use this function to run an Effect as your application’s main program, especially
29
+ * when you need structured error handling, log management, interrupt support,
30
+ * or advanced teardown capabilities.
31
+ *
8
32
  * @since 1.0.0
9
- * @category runtime
33
+ * @category Run main
10
34
  */
11
- export const runMain: RunMain = NodeRuntime.runMain
35
+ export const runMain: {
36
+ /**
37
+ * Helps you run a main effect with built-in error handling, logging, and signal management.
38
+ *
39
+ * **Details**
40
+ *
41
+ * This function launches an Effect as the main entry point, setting exit codes
42
+ * based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
43
+ * logging errors. By default, it logs errors and uses a "pretty" format, but both
44
+ * behaviors can be turned off. You can also provide custom teardown logic to
45
+ * finalize resources or produce different exit codes.
46
+ *
47
+ * **Options**
48
+ *
49
+ * An optional object that can include:
50
+ * - `disableErrorReporting`: Turn off automatic error logging.
51
+ * - `disablePrettyLogger`: Avoid adding the pretty logger.
52
+ * - `teardown`: Provide custom finalization logic.
53
+ *
54
+ * **When to Use**
55
+ *
56
+ * Use this function to run an Effect as your application’s main program, especially
57
+ * when you need structured error handling, log management, interrupt support,
58
+ * or advanced teardown capabilities.
59
+ *
60
+ * @since 1.0.0
61
+ * @category Run main
62
+ */
63
+ (
64
+ options?: {
65
+ readonly disableErrorReporting?: boolean | undefined
66
+ readonly teardown?: Runtime.Teardown | undefined
67
+ }
68
+ ): <E, A>(effect: Effect<A, E>) => void
69
+ /**
70
+ * Helps you run a main effect with built-in error handling, logging, and signal management.
71
+ *
72
+ * **Details**
73
+ *
74
+ * This function launches an Effect as the main entry point, setting exit codes
75
+ * based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
76
+ * logging errors. By default, it logs errors and uses a "pretty" format, but both
77
+ * behaviors can be turned off. You can also provide custom teardown logic to
78
+ * finalize resources or produce different exit codes.
79
+ *
80
+ * **Options**
81
+ *
82
+ * An optional object that can include:
83
+ * - `disableErrorReporting`: Turn off automatic error logging.
84
+ * - `disablePrettyLogger`: Avoid adding the pretty logger.
85
+ * - `teardown`: Provide custom finalization logic.
86
+ *
87
+ * **When to Use**
88
+ *
89
+ * Use this function to run an Effect as your application’s main program, especially
90
+ * when you need structured error handling, log management, interrupt support,
91
+ * or advanced teardown capabilities.
92
+ *
93
+ * @since 1.0.0
94
+ * @category Run main
95
+ */
96
+ <E, A>(
97
+ effect: Effect<A, E>,
98
+ options?: {
99
+ readonly disableErrorReporting?: boolean | undefined
100
+ readonly teardown?: Runtime.Teardown | undefined
101
+ }
102
+ ): void
103
+ } = NodeRuntime.runMain
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import type { FileSystem } from "effect/FileSystem"
5
+ import * as Layer from "effect/Layer"
6
+ import type { Path } from "effect/Path"
7
+ import type { Stdio } from "effect/Stdio"
8
+ import type { Terminal } from "effect/Terminal"
9
+ import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
10
+ import * as NodeChildProcessSpawner from "./NodeChildProcessSpawner.ts"
11
+ import * as NodeFileSystem from "./NodeFileSystem.ts"
12
+ import * as NodePath from "./NodePath.ts"
13
+ import * as NodeStdio from "./NodeStdio.ts"
14
+ import * as NodeTerminal from "./NodeTerminal.ts"
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ * @category models
19
+ */
20
+ export type NodeServices = ChildProcessSpawner | FileSystem | Path | Stdio | Terminal
21
+
22
+ /**
23
+ * @since 1.0.0
24
+ * @category layer
25
+ */
26
+ export const layer: Layer.Layer<NodeServices> = Layer.provideMerge(
27
+ NodeChildProcessSpawner.layer,
28
+ Layer.mergeAll(
29
+ NodeFileSystem.layer,
30
+ NodePath.layer,
31
+ NodeStdio.layer,
32
+ NodeTerminal.layer
33
+ )
34
+ )
package/src/NodeSocket.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import * as Socket from "@effect/platform/Socket"
4
+ import { NodeWS as WS } from "@effect/platform-node-shared/NodeSocket"
5
+ import type * as Duration from "effect/Duration"
6
+ import type * as Effect from "effect/Effect"
7
+ import { flow } from "effect/Function"
5
8
  import * as Layer from "effect/Layer"
6
- import * as WS from "ws"
9
+ import * as Socket from "effect/unstable/socket/Socket"
7
10
 
8
11
  /**
9
12
  * @since 1.0.0
@@ -14,23 +17,28 @@ export * from "@effect/platform-node-shared/NodeSocket"
14
17
  * @since 1.0.0
15
18
  * @category layers
16
19
  */
17
- export const layerWebSocket = (url: string, options?: {
18
- readonly closeCodeIsError?: (code: number) => boolean
19
- }): Layer.Layer<Socket.Socket> =>
20
- Layer.scoped(Socket.Socket, Socket.makeWebSocket(url, options)).pipe(
21
- Layer.provide(layerWebSocketConstructor)
22
- )
20
+ export const layerWebSocketConstructor: Layer.Layer<
21
+ Socket.WebSocketConstructor
22
+ > = Layer.sync(Socket.WebSocketConstructor)(() => {
23
+ if ("WebSocket" in globalThis) {
24
+ return (url, protocols) => new globalThis.WebSocket(url, protocols)
25
+ }
26
+ return (url, protocols) => new WS.WebSocket(url, protocols) as unknown as globalThis.WebSocket
27
+ })
23
28
 
24
29
  /**
25
30
  * @since 1.0.0
26
31
  * @category layers
27
32
  */
28
- export const layerWebSocketConstructor: Layer.Layer<Socket.WebSocketConstructor> = Layer.sync(
29
- Socket.WebSocketConstructor,
30
- () => {
31
- if ("WebSocket" in globalThis) {
32
- return (url, protocols) => new globalThis.WebSocket(url, protocols)
33
- }
34
- return (url, protocols) => new WS.WebSocket(url, protocols) as unknown as globalThis.WebSocket
35
- }
33
+ export const layerWebSocket: (
34
+ url: string | Effect.Effect<string>,
35
+ options?: {
36
+ readonly closeCodeIsError?: ((code: number) => boolean) | undefined
37
+ readonly openTimeout?: Duration.DurationInput | undefined
38
+ readonly protocols?: string | Array<string> | undefined
39
+ } | undefined
40
+ ) => Layer.Layer<Socket.Socket, never, never> = flow(
41
+ Socket.makeWebSocket,
42
+ Layer.effect(Socket.Socket),
43
+ Layer.provide(layerWebSocketConstructor)
36
44
  )
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as NodeStdio from "@effect/platform-node-shared/NodeStdio"
5
+ import type * as Layer from "effect/Layer"
6
+ import type { Stdio } from "effect/Stdio"
7
+
8
+ /**
9
+ * @since 1.0.0
10
+ * @category layer
11
+ */
12
+ export const layer: Layer.Layer<Stdio> = NodeStdio.layer
package/src/NodeStream.ts CHANGED
@@ -3,6 +3,6 @@
3
3
  */
4
4
 
5
5
  /**
6
- * @category models
6
+ * @since 1.0.0
7
7
  */
8
8
  export * from "@effect/platform-node-shared/NodeStream"
@@ -2,10 +2,10 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as NodeTerminal from "@effect/platform-node-shared/NodeTerminal"
5
- import type { Terminal, UserInput } from "@effect/platform/Terminal"
6
5
  import type { Effect } from "effect/Effect"
7
6
  import type { Layer } from "effect/Layer"
8
7
  import type { Scope } from "effect/Scope"
8
+ import type { Terminal, UserInput } from "effect/Terminal"
9
9
 
10
10
  /**
11
11
  * @since 1.0.0
@@ -15,6 +15,6 @@ export const make: (shouldQuit?: (input: UserInput) => boolean) => Effect<Termin
15
15
 
16
16
  /**
17
17
  * @since 1.0.0
18
- * @category layer
18
+ * @category layers
19
19
  */
20
20
  export const layer: Layer<Terminal> = NodeTerminal.layer
package/src/NodeWorker.ts CHANGED
@@ -1,36 +1,105 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Worker from "@effect/platform/Worker"
5
- import type * as Layer from "effect/Layer"
4
+ import * as Deferred from "effect/Deferred"
5
+ import * as Effect from "effect/Effect"
6
+ import * as Exit from "effect/Exit"
7
+ import * as Layer from "effect/Layer"
8
+ import * as Scope from "effect/Scope"
9
+ import * as Worker from "effect/unstable/workers/Worker"
10
+ import { WorkerError, WorkerReceiveError } from "effect/unstable/workers/WorkerError"
6
11
  import type * as ChildProcess from "node:child_process"
7
12
  import type * as WorkerThreads from "node:worker_threads"
8
- import * as internal from "./internal/worker.js"
9
13
 
10
14
  /**
11
15
  * @since 1.0.0
12
16
  * @category layers
13
17
  */
14
- export const layerManager: Layer.Layer<Worker.WorkerManager> = internal.layerManager
18
+ export const layerPlatform: Layer.Layer<Worker.WorkerPlatform> = Layer.succeed(Worker.WorkerPlatform)(
19
+ Worker.makePlatform<WorkerThreads.Worker | ChildProcess.ChildProcess>()({
20
+ setup({ scope, worker }) {
21
+ const exitDeferred = Deferred.makeUnsafe<void, WorkerError>()
22
+ const thing = "postMessage" in worker ?
23
+ {
24
+ postMessage(msg: any, t?: any) {
25
+ worker.postMessage(msg, t)
26
+ },
27
+ kill: () => worker.terminate(),
28
+ worker
29
+ } :
30
+ {
31
+ postMessage(msg: any, _?: any) {
32
+ worker.send(msg)
33
+ },
34
+ kill: () => worker.kill("SIGKILL"),
35
+ worker
36
+ }
37
+ worker.on("exit", () => {
38
+ Deferred.doneUnsafe(exitDeferred, Exit.void)
39
+ })
40
+ return Effect.as(
41
+ Scope.addFinalizer(
42
+ scope,
43
+ Effect.suspend(() => {
44
+ thing.postMessage([1])
45
+ return Deferred.await(exitDeferred)
46
+ }).pipe(
47
+ Effect.timeout(5000),
48
+ Effect.catchCause(() => Effect.sync(() => thing.kill()))
49
+ )
50
+ ),
51
+ thing
52
+ )
53
+ },
54
+ listen({ deferred, emit, port }) {
55
+ port.worker.on("message", (message) => {
56
+ emit(message)
57
+ })
58
+ port.worker.on("messageerror", (cause) => {
59
+ Deferred.doneUnsafe(
60
+ deferred,
61
+ new WorkerError({
62
+ reason: new WorkerReceiveError({
63
+ message: "An messageerror event was emitted",
64
+ cause
65
+ })
66
+ }).asEffect()
67
+ )
68
+ })
69
+ port.worker.on("error", (cause) => {
70
+ Deferred.doneUnsafe(
71
+ deferred,
72
+ new WorkerError({
73
+ reason: new WorkerReceiveError({
74
+ message: "An error event was emitted",
75
+ cause
76
+ })
77
+ }).asEffect()
78
+ )
79
+ })
80
+ port.worker.on("exit", (code) => {
81
+ Deferred.doneUnsafe(
82
+ deferred,
83
+ new WorkerError({
84
+ reason: new WorkerReceiveError({
85
+ message: "The worker has exited with code: " + code
86
+ })
87
+ }).asEffect()
88
+ )
89
+ })
90
+ return Effect.void
91
+ }
92
+ })
93
+ )
15
94
 
16
95
  /**
17
96
  * @since 1.0.0
18
97
  * @category layers
19
98
  */
20
- export const layerWorker: Layer.Layer<Worker.PlatformWorker> = internal.layerWorker
21
-
22
- /**
23
- * @since 1.0.0
24
- * @category layers
25
- */
26
- export const layer: (
27
- spawn: (id: number) => WorkerThreads.Worker | ChildProcess.ChildProcess
28
- ) => Layer.Layer<Worker.WorkerManager | Worker.Spawner> = internal.layer
29
-
30
- /**
31
- * @since 1.0.0
32
- * @category layers
33
- */
34
- export const layerPlatform: (
99
+ export const layer = (
35
100
  spawn: (id: number) => WorkerThreads.Worker | ChildProcess.ChildProcess
36
- ) => Layer.Layer<Worker.PlatformWorker | Worker.Spawner> = internal.layerPlatform
101
+ ): Layer.Layer<Worker.WorkerPlatform | Worker.Spawner> =>
102
+ Layer.merge(
103
+ Worker.layerSpawner(spawn),
104
+ layerPlatform
105
+ )