@effect/platform-node 0.104.1 → 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,138 +1,574 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Client from "@effect/platform/HttpClient"
5
- import * as Context from "effect/Context"
6
- import type * as Effect from "effect/Effect"
7
- import type * as Layer from "effect/Layer"
4
+ import * as Effect from "effect/Effect"
5
+ import { flow } from "effect/Function"
6
+ import * as Inspectable from "effect/Inspectable"
7
+ import * as Layer from "effect/Layer"
8
8
  import type * as Scope from "effect/Scope"
9
- import type * as Http from "node:http"
10
- import type * as Https from "node:https"
11
- import * as internal from "./internal/httpClient.js"
12
- import * as internalUndici from "./internal/httpClientUndici.js"
13
- import type * as Undici from "./Undici.js"
9
+ import * as ServiceMap from "effect/ServiceMap"
10
+ import * as Stream from "effect/Stream"
11
+ import * as Cookies from "effect/unstable/http/Cookies"
12
+ import * as Headers from "effect/unstable/http/Headers"
13
+ import type * as Body from "effect/unstable/http/HttpBody"
14
+ import * as Client from "effect/unstable/http/HttpClient"
15
+ import * as Error from "effect/unstable/http/HttpClientError"
16
+ import type { HttpClientRequest } from "effect/unstable/http/HttpClientRequest"
17
+ import * as Response from "effect/unstable/http/HttpClientResponse"
18
+ import type { HttpClientResponse } from "effect/unstable/http/HttpClientResponse"
19
+ import * as IncomingMessage from "effect/unstable/http/HttpIncomingMessage"
20
+ import * as UrlParams from "effect/unstable/http/UrlParams"
21
+ import * as Http from "node:http"
22
+ import * as Https from "node:https"
23
+ import { Readable } from "node:stream"
24
+ import { pipeline } from "node:stream/promises"
25
+ import { NodeHttpIncomingMessage } from "./NodeHttpIncomingMessage.ts"
26
+ import * as NodeSink from "./NodeSink.ts"
27
+ import * as NodeStream from "./NodeStream.ts"
28
+ import * as Undici from "./Undici.ts"
14
29
 
15
- /**
16
- * @since 1.0.0
17
- * @category agent
18
- */
19
- export const HttpAgentTypeId: unique symbol = internal.HttpAgentTypeId
30
+ // -----------------------------------------------------------------------------
31
+ // Fetch
32
+ // -----------------------------------------------------------------------------
20
33
 
21
- /**
22
- * @since 1.0.0
23
- * @category agent
24
- */
25
- export type HttpAgentTypeId = typeof HttpAgentTypeId
34
+ export {
35
+ /**
36
+ * @since 1.0.0
37
+ * @category Fetch
38
+ */
39
+ Fetch,
40
+ /**
41
+ * @since 1.0.0
42
+ * @category Fetch
43
+ */
44
+ layer as layerFetch,
45
+ /**
46
+ * @since 1.0.0
47
+ * @category Fetch
48
+ */
49
+ RequestInit
50
+ } from "effect/unstable/http/FetchHttpClient"
26
51
 
27
- /**
28
- * @since 1.0.0
29
- * @category agent
30
- */
31
- export interface HttpAgent {
32
- readonly [HttpAgentTypeId]: typeof HttpAgentTypeId
33
- readonly http: Http.Agent
34
- readonly https: Https.Agent
35
- }
52
+ // -----------------------------------------------------------------------------
53
+ // Undici
54
+ // -----------------------------------------------------------------------------
36
55
 
37
56
  /**
38
57
  * @since 1.0.0
39
- * @category agent
58
+ * @category Dispatcher
40
59
  */
41
- export const HttpAgent: Context.Tag<HttpAgent, HttpAgent> = internal.HttpAgent
60
+ export class Dispatcher extends ServiceMap.Service<Dispatcher, Undici.Dispatcher>()(
61
+ "@effect/platform-node/NodeHttpClient/Dispatcher"
62
+ ) {}
42
63
 
43
64
  /**
44
65
  * @since 1.0.0
45
- * @category agent
66
+ * @category Dispatcher
46
67
  */
47
- export const makeAgent: (options?: Https.AgentOptions) => Effect.Effect<HttpAgent, never, Scope.Scope> =
48
- internal.makeAgent
68
+ export const makeDispatcher: Effect.Effect<Undici.Dispatcher, never, Scope.Scope> = Effect.acquireRelease(
69
+ Effect.sync(() => new Undici.Agent()),
70
+ (dispatcher) => Effect.promise(() => dispatcher.destroy())
71
+ )
49
72
 
50
73
  /**
51
74
  * @since 1.0.0
52
- * @category agent
75
+ * @category Dispatcher
53
76
  */
54
- export const agentLayer: Layer.Layer<HttpAgent> = internal.agentLayer
77
+ export const layerDispatcher: Layer.Layer<Dispatcher> = Layer.effect(Dispatcher)(makeDispatcher)
55
78
 
56
79
  /**
57
80
  * @since 1.0.0
58
- * @category agent
81
+ * @category Dispatcher
59
82
  */
60
- export const makeAgentLayer: (options?: Https.AgentOptions) => Layer.Layer<HttpAgent> = internal.makeAgentLayer
83
+ export const dispatcherLayerGlobal: Layer.Layer<Dispatcher> = Layer.sync(Dispatcher)(() => Undici.getGlobalDispatcher())
61
84
 
62
85
  /**
63
86
  * @since 1.0.0
64
- * @category constructors
87
+ * @category undici
65
88
  */
66
- export const make: Effect.Effect<Client.HttpClient, never, HttpAgent> = internal.make
89
+ export const UndiciOptions = ServiceMap.Reference<Partial<Undici.Dispatcher.RequestOptions>>(
90
+ "@effect/platform-node/NodeHttpClient/UndiciOptions",
91
+ { defaultValue: () => ({}) }
92
+ )
67
93
 
68
94
  /**
69
95
  * @since 1.0.0
70
- * @category layers
96
+ * @category undici
71
97
  */
72
- export const layer: Layer.Layer<Client.HttpClient> = internal.layer
98
+ export const makeUndici = Effect.gen(function*() {
99
+ const dispatcher = yield* Dispatcher
100
+ return Client.make((request, url, signal, fiber) =>
101
+ convertBody(request.body).pipe(
102
+ Effect.flatMap((body) =>
103
+ Effect.tryPromise({
104
+ try: () =>
105
+ dispatcher.request({
106
+ ...fiber.getRef(UndiciOptions),
107
+ signal,
108
+ method: request.method,
109
+ headers: request.headers,
110
+ origin: url.origin,
111
+ path: url.pathname + url.search + url.hash,
112
+ body,
113
+ // leave timeouts to Effect.timeout etc
114
+ headersTimeout: 60 * 60 * 1000,
115
+ bodyTimeout: 0
116
+ }),
117
+ catch: (cause) =>
118
+ new Error.HttpClientError({
119
+ reason: new Error.TransportError({
120
+ request,
121
+ cause
122
+ })
123
+ })
124
+ })
125
+ ),
126
+ Effect.map((response) => new UndiciResponse(request, response))
127
+ )
128
+ )
129
+ })
73
130
 
74
- /**
75
- * @since 1.0.0
76
- * @category layers
77
- */
78
- export const layerWithoutAgent: Layer.Layer<Client.HttpClient, never, HttpAgent> = internal.layerWithoutAgent
131
+ function convertBody(
132
+ body: Body.HttpBody
133
+ ): Effect.Effect<Exclude<Undici.Dispatcher.DispatchOptions["body"], undefined>> {
134
+ switch (body._tag) {
135
+ case "Empty": {
136
+ return Effect.succeed(null)
137
+ }
138
+ case "Uint8Array":
139
+ case "Raw": {
140
+ return Effect.succeed(body.body as Uint8Array)
141
+ }
142
+ case "FormData": {
143
+ return Effect.succeed(body.formData as any)
144
+ }
145
+ case "Stream": {
146
+ return NodeStream.toReadable(body.stream)
147
+ }
148
+ }
149
+ }
150
+
151
+ function noopErrorHandler(_: any) {}
152
+
153
+ class UndiciResponse extends Inspectable.Class implements HttpClientResponse {
154
+ readonly [IncomingMessage.TypeId]: typeof IncomingMessage.TypeId
155
+ readonly [Response.TypeId]: typeof Response.TypeId
156
+ readonly request: HttpClientRequest
157
+ readonly source: Undici.Dispatcher.ResponseData
158
+
159
+ constructor(
160
+ request: HttpClientRequest,
161
+ source: Undici.Dispatcher.ResponseData
162
+ ) {
163
+ super()
164
+ this[IncomingMessage.TypeId] = IncomingMessage.TypeId
165
+ this[Response.TypeId] = Response.TypeId
166
+ this.request = request
167
+ this.source = source
168
+ source.body.on("error", noopErrorHandler)
169
+ }
170
+
171
+ get status() {
172
+ return this.source.statusCode!
173
+ }
174
+
175
+ get statusText() {
176
+ return undefined
177
+ }
178
+
179
+ get headers(): Headers.Headers {
180
+ return Headers.fromInput(this.source.headers)
181
+ }
182
+
183
+ cachedCookies?: Cookies.Cookies
184
+ get cookies(): Cookies.Cookies {
185
+ if (this.cachedCookies !== undefined) {
186
+ return this.cachedCookies
187
+ }
188
+ const header = this.source.headers["set-cookie"]
189
+ return this.cachedCookies = header ? Cookies.fromSetCookie(header) : Cookies.empty
190
+ }
191
+
192
+ get remoteAddress(): string | undefined {
193
+ return undefined
194
+ }
195
+
196
+ get stream(): Stream.Stream<Uint8Array, Error.HttpClientError> {
197
+ return NodeStream.fromReadable({
198
+ evaluate: () => this.source.body,
199
+ onError: (cause) =>
200
+ new Error.HttpClientError({
201
+ reason: new Error.DecodeError({
202
+ request: this.request,
203
+ response: this,
204
+ cause
205
+ })
206
+ })
207
+ })
208
+ }
209
+
210
+ get json(): Effect.Effect<unknown, Error.HttpClientError> {
211
+ return Effect.flatMap(this.text, (text) =>
212
+ Effect.try({
213
+ try: () => text === "" ? null : JSON.parse(text) as unknown,
214
+ catch: (cause) =>
215
+ new Error.HttpClientError({
216
+ reason: new Error.DecodeError({
217
+ request: this.request,
218
+ response: this,
219
+ cause
220
+ })
221
+ })
222
+ }))
223
+ }
224
+
225
+ private textBody?: Effect.Effect<string, Error.HttpClientError>
226
+ get text(): Effect.Effect<string, Error.HttpClientError> {
227
+ return this.textBody ??= Effect.tryPromise({
228
+ try: () => this.source.body.text(),
229
+ catch: (cause) =>
230
+ new Error.HttpClientError({
231
+ reason: new Error.DecodeError({
232
+ request: this.request,
233
+ response: this,
234
+ cause
235
+ })
236
+ })
237
+ }).pipe(Effect.cached, Effect.runSync)
238
+ }
239
+
240
+ get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, Error.HttpClientError> {
241
+ return Effect.flatMap(this.text, (_) =>
242
+ Effect.try({
243
+ try: () => UrlParams.fromInput(new URLSearchParams(_)),
244
+ catch: (cause) =>
245
+ new Error.HttpClientError({
246
+ reason: new Error.DecodeError({
247
+ request: this.request,
248
+ response: this,
249
+ cause
250
+ })
251
+ })
252
+ }))
253
+ }
254
+
255
+ private formDataBody?: Effect.Effect<FormData, Error.HttpClientError>
256
+ get formData(): Effect.Effect<FormData, Error.HttpClientError> {
257
+ return this.formDataBody ??= Effect.tryPromise({
258
+ try: () => this.source.body.formData() as Promise<FormData>,
259
+ catch: (cause) =>
260
+ new Error.HttpClientError({
261
+ reason: new Error.DecodeError({
262
+ request: this.request,
263
+ response: this,
264
+ cause
265
+ })
266
+ })
267
+ }).pipe(Effect.cached, Effect.runSync)
268
+ }
269
+
270
+ private arrayBufferBody?: Effect.Effect<ArrayBuffer, Error.HttpClientError>
271
+ get arrayBuffer(): Effect.Effect<ArrayBuffer, Error.HttpClientError> {
272
+ return this.arrayBufferBody ??= Effect.tryPromise({
273
+ try: () => this.source.body.arrayBuffer(),
274
+ catch: (cause) =>
275
+ new Error.HttpClientError({
276
+ reason: new Error.DecodeError({
277
+ request: this.request,
278
+ response: this,
279
+ cause
280
+ })
281
+ })
282
+ }).pipe(Effect.cached, Effect.runSync)
283
+ }
284
+
285
+ toJSON(): unknown {
286
+ return IncomingMessage.inspect(this, {
287
+ _id: "effect/http/HttpClientResponse",
288
+ request: this.request.toJSON(),
289
+ status: this.status
290
+ })
291
+ }
292
+ }
79
293
 
80
294
  /**
81
295
  * @since 1.0.0
82
- * @category undici
296
+ * @category Undici
83
297
  */
84
- export interface Dispatcher {
85
- readonly _: unique symbol
86
- }
298
+ export const layerUndiciNoDispatcher: Layer.Layer<
299
+ Client.HttpClient,
300
+ never,
301
+ Dispatcher
302
+ > = Client.layerMergedServices(makeUndici)
87
303
 
88
304
  /**
89
305
  * @since 1.0.0
90
- * @category undici
306
+ * @category Undici
91
307
  */
92
- export const Dispatcher: Context.Tag<Dispatcher, Undici.Dispatcher> = internalUndici.Dispatcher
308
+ export const layerUndici: Layer.Layer<Client.HttpClient> = Layer.provide(layerUndiciNoDispatcher, layerDispatcher)
309
+
310
+ // -----------------------------------------------------------------------------
311
+ // node:http
312
+ // -----------------------------------------------------------------------------
93
313
 
94
314
  /**
95
315
  * @since 1.0.0
96
- * @category undici
316
+ * @category HttpAgent
97
317
  */
98
- export const makeDispatcher: Effect.Effect<Undici.Dispatcher, never, Scope.Scope> = internalUndici.makeDispatcher
318
+ export class HttpAgent extends ServiceMap.Service<HttpAgent, {
319
+ readonly http: Http.Agent
320
+ readonly https: Https.Agent
321
+ }>()("@effect/platform-node/NodeHttpClient/HttpAgent") {}
99
322
 
100
323
  /**
101
324
  * @since 1.0.0
102
- * @category undici
325
+ * @category HttpAgent
103
326
  */
104
- export const dispatcherLayer: Layer.Layer<Dispatcher> = internalUndici.dispatcherLayer
327
+ export const makeAgent = (options?: Https.AgentOptions): Effect.Effect<HttpAgent["Service"], never, Scope.Scope> =>
328
+ Effect.zipWith(
329
+ Effect.acquireRelease(
330
+ Effect.sync(() => new Http.Agent(options)),
331
+ (agent) => Effect.sync(() => agent.destroy())
332
+ ),
333
+ Effect.acquireRelease(
334
+ Effect.sync(() => new Https.Agent(options)),
335
+ (agent) => Effect.sync(() => agent.destroy())
336
+ ),
337
+ (http, https) => ({ http, https })
338
+ )
105
339
 
106
340
  /**
107
341
  * @since 1.0.0
108
- * @category undici
342
+ * @category HttpAgent
109
343
  */
110
- export const dispatcherLayerGlobal: Layer.Layer<Dispatcher> = internalUndici.dispatcherLayerGlobal
344
+ export const layerAgentOptions: (options?: Https.AgentOptions | undefined) => Layer.Layer<
345
+ HttpAgent
346
+ > = flow(makeAgent, Layer.effect(HttpAgent))
111
347
 
112
348
  /**
113
349
  * @since 1.0.0
114
- * @category undici
350
+ * @category HttpAgent
115
351
  */
116
- export class UndiciRequestOptions extends Context.Tag(internalUndici.undiciOptionsTagKey)<
117
- UndiciRequestOptions,
118
- Undici.Dispatcher.RequestOptions
119
- >() {}
352
+ export const layerAgent: Layer.Layer<HttpAgent> = layerAgentOptions()
120
353
 
121
354
  /**
122
355
  * @since 1.0.0
123
- * @category constructors
356
+ * @category node:http
124
357
  */
125
- export const makeUndici: (dispatcher: Undici.Dispatcher) => Client.HttpClient = internalUndici.make
358
+ export const makeNodeHttp = Effect.gen(function*() {
359
+ const agent = yield* HttpAgent
360
+ return Client.make((request, url, signal) => {
361
+ const nodeRequest = url.protocol === "https:" ?
362
+ Https.request(url, {
363
+ agent: agent.https,
364
+ method: request.method,
365
+ headers: request.headers,
366
+ signal
367
+ }) :
368
+ Http.request(url, {
369
+ agent: agent.http,
370
+ method: request.method,
371
+ headers: request.headers,
372
+ signal
373
+ })
374
+ return Effect.forkChild(sendBody(nodeRequest, request, request.body)).pipe(
375
+ Effect.flatMap(() => waitForResponse(nodeRequest, request)),
376
+ Effect.map((_) => new NodeHttpResponse(request, _))
377
+ )
378
+ })
379
+ })
380
+
381
+ const sendBody = (
382
+ nodeRequest: Http.ClientRequest,
383
+ request: HttpClientRequest,
384
+ body: Body.HttpBody
385
+ ): Effect.Effect<void, Error.HttpClientError> =>
386
+ Effect.suspend((): Effect.Effect<void, Error.HttpClientError> => {
387
+ switch (body._tag) {
388
+ case "Empty": {
389
+ nodeRequest.end()
390
+ return waitForFinish(nodeRequest, request)
391
+ }
392
+ case "Uint8Array":
393
+ case "Raw": {
394
+ nodeRequest.end(body.body)
395
+ return waitForFinish(nodeRequest, request)
396
+ }
397
+ case "FormData": {
398
+ const response = new globalThis.Response(body.formData)
399
+
400
+ response.headers.forEach((value, key) => {
401
+ nodeRequest.setHeader(key, value)
402
+ })
403
+
404
+ return Effect.tryPromise({
405
+ try: () => pipeline(Readable.fromWeb(response.body! as any), nodeRequest),
406
+ catch: (cause) =>
407
+ new Error.HttpClientError({
408
+ reason: new Error.TransportError({
409
+ request,
410
+ cause
411
+ })
412
+ })
413
+ })
414
+ }
415
+ case "Stream": {
416
+ return Stream.run(
417
+ Stream.mapError(body.stream, (cause) =>
418
+ new Error.HttpClientError({
419
+ reason: new Error.EncodeError({
420
+ request,
421
+ cause
422
+ })
423
+ })),
424
+ NodeSink.fromWritable({
425
+ evaluate: () => nodeRequest,
426
+ onError: (cause) =>
427
+ new Error.HttpClientError({
428
+ reason: new Error.TransportError({
429
+ request,
430
+ cause
431
+ })
432
+ })
433
+ })
434
+ )
435
+ }
436
+ }
437
+ })
438
+
439
+ const waitForResponse = (nodeRequest: Http.ClientRequest, request: HttpClientRequest) =>
440
+ Effect.callback<Http.IncomingMessage, Error.HttpClientError>((resume) => {
441
+ function onError(cause: Error) {
442
+ resume(Effect.fail(
443
+ new Error.HttpClientError({
444
+ reason: new Error.TransportError({
445
+ request,
446
+ cause
447
+ })
448
+ })
449
+ ))
450
+ }
451
+ nodeRequest.on("error", onError)
452
+
453
+ function onResponse(response: Http.IncomingMessage) {
454
+ nodeRequest.off("error", onError)
455
+ resume(Effect.succeed(response))
456
+ }
457
+ nodeRequest.on("upgrade", onResponse)
458
+ nodeRequest.on("response", onResponse)
459
+
460
+ return Effect.sync(() => {
461
+ nodeRequest.off("error", onError)
462
+ nodeRequest.off("upgrade", onResponse)
463
+ nodeRequest.off("response", onResponse)
464
+ })
465
+ })
466
+
467
+ const waitForFinish = (nodeRequest: Http.ClientRequest, request: HttpClientRequest) =>
468
+ Effect.callback<void, Error.HttpClientError>((resume) => {
469
+ function onError(cause: Error) {
470
+ resume(Effect.fail(
471
+ new Error.HttpClientError({
472
+ reason: new Error.TransportError({
473
+ request,
474
+ cause
475
+ })
476
+ })
477
+ ))
478
+ }
479
+ nodeRequest.once("error", onError)
480
+
481
+ function onFinish() {
482
+ nodeRequest.off("error", onError)
483
+ resume(Effect.void)
484
+ }
485
+ nodeRequest.once("finish", onFinish)
486
+
487
+ return Effect.sync(() => {
488
+ nodeRequest.off("error", onError)
489
+ nodeRequest.off("finish", onFinish)
490
+ })
491
+ })
492
+
493
+ class NodeHttpResponse extends NodeHttpIncomingMessage<Error.HttpClientError> implements HttpClientResponse {
494
+ readonly [Response.TypeId]: typeof Response.TypeId
495
+ readonly request: HttpClientRequest
496
+
497
+ constructor(
498
+ request: HttpClientRequest,
499
+ source: Http.IncomingMessage
500
+ ) {
501
+ super(source, (cause) =>
502
+ new Error.HttpClientError({
503
+ reason: new Error.DecodeError({
504
+ request,
505
+ response: this,
506
+ cause
507
+ })
508
+ }))
509
+ this[Response.TypeId] = Response.TypeId
510
+ this.request = request
511
+ }
512
+
513
+ get status() {
514
+ return this.source.statusCode!
515
+ }
516
+
517
+ cachedCookies?: Cookies.Cookies
518
+ get cookies(): Cookies.Cookies {
519
+ if (this.cachedCookies !== undefined) {
520
+ return this.cachedCookies
521
+ }
522
+ const header = this.source.headers["set-cookie"]
523
+ return this.cachedCookies = header ? Cookies.fromSetCookie(header) : Cookies.empty
524
+ }
525
+
526
+ get formData(): Effect.Effect<FormData, Error.HttpClientError> {
527
+ return Effect.tryPromise({
528
+ try: () => {
529
+ const init: {
530
+ headers: HeadersInit
531
+ status?: number
532
+ statusText?: string
533
+ } = {
534
+ headers: new globalThis.Headers(this.source.headers as any)
535
+ }
536
+
537
+ if (this.source.statusCode) {
538
+ init.status = this.source.statusCode
539
+ }
540
+
541
+ if (this.source.statusMessage) {
542
+ init.statusText = this.source.statusMessage
543
+ }
544
+
545
+ return new globalThis.Response(Readable.toWeb(this.source) as any, init).formData()
546
+ },
547
+ catch: this.onError
548
+ })
549
+ }
550
+
551
+ toJSON(): unknown {
552
+ return IncomingMessage.inspect(this, {
553
+ _id: "effect/http/HttpClientResponse",
554
+ request: this.request.toJSON(),
555
+ status: this.status
556
+ })
557
+ }
558
+ }
126
559
 
127
560
  /**
128
561
  * @since 1.0.0
129
- * @category layers
562
+ * @category node:http
130
563
  */
131
- export const layerUndici: Layer.Layer<Client.HttpClient> = internalUndici.layer
564
+ export const layerNodeHttpNoAgent: Layer.Layer<
565
+ Client.HttpClient,
566
+ never,
567
+ HttpAgent
568
+ > = Client.layerMergedServices(makeNodeHttp)
132
569
 
133
570
  /**
134
571
  * @since 1.0.0
135
- * @category layers
572
+ * @category node:http
136
573
  */
137
- export const layerUndiciWithoutDispatcher: Layer.Layer<Client.HttpClient, never, Dispatcher> =
138
- internalUndici.layerWithoutDispatcher
574
+ export const layerNodeHttp: Layer.Layer<Client.HttpClient> = Layer.provide(layerNodeHttpNoAgent, layerAgent)