@effect/platform-node 0.104.1 → 4.0.0-beta.1

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,140 +1,577 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import type * as Etag from "@effect/platform/Etag"
5
- import type * as App from "@effect/platform/HttpApp"
6
- import type * as HttpClient from "@effect/platform/HttpClient"
7
- import type * as Middleware from "@effect/platform/HttpMiddleware"
8
- import type * as Platform from "@effect/platform/HttpPlatform"
9
- import type * as Server from "@effect/platform/HttpServer"
10
- import type { ServeError } from "@effect/platform/HttpServerError"
11
- import type * as ServerRequest from "@effect/platform/HttpServerRequest"
12
- import type * as Config from "effect/Config"
13
- import type * as ConfigError from "effect/ConfigError"
14
- import type * as Effect from "effect/Effect"
15
- import type { LazyArg } from "effect/Function"
16
- import type * as Layer from "effect/Layer"
17
- import type * as Scope from "effect/Scope"
18
- import type * as Http from "node:http"
4
+ import * as Cause from "effect/Cause"
5
+ import * as Config from "effect/Config"
6
+ import * as Effect from "effect/Effect"
7
+ import * as Fiber from "effect/Fiber"
8
+ import type * as FileSystem from "effect/FileSystem"
9
+ import { flow, type LazyArg } from "effect/Function"
10
+ import * as Layer from "effect/Layer"
11
+ import type * as Path from "effect/Path"
12
+ import type * as Record from "effect/Record"
13
+ import * as Scope from "effect/Scope"
14
+ import * as ServiceMap from "effect/ServiceMap"
15
+ import * as Stream from "effect/Stream"
16
+ import * as Cookies from "effect/unstable/http/Cookies"
17
+ import * as Etag from "effect/unstable/http/Etag"
18
+ import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient"
19
+ import type * as Headers from "effect/unstable/http/Headers"
20
+ import type { HttpClient } from "effect/unstable/http/HttpClient"
21
+ import * as HttpEffect from "effect/unstable/http/HttpEffect"
22
+ import * as HttpIncomingMessage from "effect/unstable/http/HttpIncomingMessage"
23
+ import type { HttpMethod } from "effect/unstable/http/HttpMethod"
24
+ import type * as Middleware from "effect/unstable/http/HttpMiddleware"
25
+ import type * as HttpPlatform from "effect/unstable/http/HttpPlatform"
26
+ import * as HttpServer from "effect/unstable/http/HttpServer"
27
+ import {
28
+ causeResponse,
29
+ clientAbortFiberId,
30
+ HttpServerError,
31
+ RequestParseError,
32
+ ResponseError,
33
+ ServeError
34
+ } from "effect/unstable/http/HttpServerError"
35
+ import * as Request from "effect/unstable/http/HttpServerRequest"
36
+ import { HttpServerRequest } from "effect/unstable/http/HttpServerRequest"
37
+ import type { HttpServerResponse } from "effect/unstable/http/HttpServerResponse"
38
+ import type * as Multipart from "effect/unstable/http/Multipart"
39
+ import * as Socket from "effect/unstable/socket/Socket"
40
+ import * as Http from "node:http"
19
41
  import type * as Net from "node:net"
20
- import * as internal from "./internal/httpServer.js"
21
- import type * as NodeContext from "./NodeContext.js"
42
+ import type { Duplex } from "node:stream"
43
+ import { Readable } from "node:stream"
44
+ import { pipeline } from "node:stream/promises"
45
+ import { NodeHttpIncomingMessage } from "./NodeHttpIncomingMessage.ts"
46
+ import * as NodeHttpPlatform from "./NodeHttpPlatform.ts"
47
+ import * as NodeMultipart from "./NodeMultipart.ts"
48
+ import * as NodeServices from "./NodeServices.ts"
49
+ import { NodeWS } from "./NodeSocket.ts"
22
50
 
23
51
  /**
24
52
  * @since 1.0.0
25
53
  * @category constructors
26
54
  */
27
- export const make: (
28
- evaluate: LazyArg<Http.Server<typeof Http.IncomingMessage, typeof Http.ServerResponse>>,
55
+ export const make = Effect.fnUntraced(function*(
56
+ evaluate: LazyArg<Http.Server>,
29
57
  options: Net.ListenOptions
30
- ) => Effect.Effect<
31
- Server.HttpServer,
32
- ServeError,
33
- Scope.Scope
34
- > = internal.make
58
+ ) {
59
+ const scope = yield* Effect.scope
60
+ const server = evaluate()
61
+ yield* Scope.addFinalizer(
62
+ scope,
63
+ Effect.callback<void>((resume) => {
64
+ if (!server.listening) {
65
+ return resume(Effect.void)
66
+ }
67
+ server.close((error) => {
68
+ if (error) {
69
+ resume(Effect.die(error))
70
+ } else {
71
+ resume(Effect.void)
72
+ }
73
+ })
74
+ })
75
+ )
76
+
77
+ yield* Effect.callback<void, ServeError>((resume) => {
78
+ function onError(cause: Error) {
79
+ resume(Effect.fail(new ServeError({ cause })))
80
+ }
81
+ server.on("error", onError)
82
+ server.listen(options, () => {
83
+ server.off("error", onError)
84
+ resume(Effect.void)
85
+ })
86
+ })
87
+
88
+ const address = server.address()!
89
+
90
+ const wss = yield* Effect.acquireRelease(
91
+ Effect.sync(() => new NodeWS.WebSocketServer({ noServer: true })),
92
+ (wss) =>
93
+ Effect.callback<void>((resume) => {
94
+ wss.close(() => resume(Effect.void))
95
+ })
96
+ ).pipe(
97
+ Scope.provide(scope),
98
+ Effect.cached
99
+ )
100
+
101
+ return HttpServer.make({
102
+ address: typeof address === "string" ?
103
+ {
104
+ _tag: "UnixAddress",
105
+ path: address
106
+ } :
107
+ {
108
+ _tag: "TcpAddress",
109
+ hostname: address.address === "::" ? "0.0.0.0" : address.address,
110
+ port: address.port
111
+ },
112
+ serve: Effect.fnUntraced(function*(httpApp, middleware) {
113
+ const scope = yield* Effect.scope
114
+ const handler = yield* (makeHandler(httpApp, {
115
+ middleware: middleware as any,
116
+ scope
117
+ }) as Effect.Effect<(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void>)
118
+ const upgradeHandler = yield* makeUpgradeHandler(wss, httpApp, {
119
+ middleware: middleware as any,
120
+ scope
121
+ })
122
+ yield* Effect.addFinalizer(() =>
123
+ Effect.sync(() => {
124
+ server.off("request", handler)
125
+ server.off("upgrade", upgradeHandler)
126
+ })
127
+ )
128
+ server.on("request", handler)
129
+ server.on("upgrade", upgradeHandler)
130
+ })
131
+ })
132
+ })
35
133
 
36
134
  /**
37
135
  * @since 1.0.0
38
- * @category constructors
136
+ * @category Handlers
39
137
  */
40
- export const makeHandler: {
41
- /**
42
- * @since 1.0.0
43
- * @category constructors
44
- */
45
- <R, E>(httpApp: App.Default<E, R>): Effect.Effect<
46
- (nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void,
47
- never,
48
- Exclude<R, ServerRequest.HttpServerRequest | Scope.Scope>
49
- >
50
- /**
51
- * @since 1.0.0
52
- * @category constructors
53
- */
54
- <R, E, App extends App.Default<any, any>>(
55
- httpApp: App.Default<E, R>,
56
- middleware: Middleware.HttpMiddleware.Applied<App, E, R>
57
- ): Effect.Effect<
58
- (nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void,
59
- never,
60
- Exclude<Effect.Effect.Context<App>, ServerRequest.HttpServerRequest | Scope.Scope>
61
- >
62
- } = internal.makeHandler
138
+ export const makeHandler = <
139
+ R,
140
+ E,
141
+ App extends Effect.Effect<HttpServerResponse, any, any> = Effect.Effect<HttpServerResponse, E, R>
142
+ >(
143
+ httpEffect: Effect.Effect<HttpServerResponse, E, R>,
144
+ options: {
145
+ readonly scope: Scope.Scope
146
+ readonly middleware?: Middleware.HttpMiddleware.Applied<App, E, R> | undefined
147
+ }
148
+ ): Effect.Effect<
149
+ (nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void,
150
+ never,
151
+ Exclude<Effect.Services<App>, HttpServerRequest | Scope.Scope>
152
+ > => {
153
+ const handled = HttpEffect.toHandled(httpEffect, handleResponse, options.middleware as any)
154
+ return Effect.map(Effect.services<any>(), (services) => {
155
+ return function handler(
156
+ nodeRequest: Http.IncomingMessage,
157
+ nodeResponse: Http.ServerResponse
158
+ ) {
159
+ const map = new Map(services.mapUnsafe)
160
+ map.set(HttpServerRequest.key, new ServerRequestImpl(nodeRequest, nodeResponse))
161
+ const fiber = Fiber.runIn(Effect.runForkWith(ServiceMap.makeUnsafe<any>(map))(handled), options.scope)
162
+ nodeResponse.on("close", () => {
163
+ if (!nodeResponse.writableEnded) {
164
+ fiber.interruptUnsafe(clientAbortFiberId)
165
+ }
166
+ })
167
+ }
168
+ })
169
+ }
63
170
 
64
171
  /**
65
172
  * @since 1.0.0
66
- * @category layers
173
+ * @category Handlers
67
174
  */
68
- export const layerServer: (
69
- evaluate: LazyArg<Http.Server>,
70
- options: Net.ListenOptions
71
- ) => Layer.Layer<Server.HttpServer, ServeError> = internal.layerServer
175
+ export const makeUpgradeHandler = <
176
+ R,
177
+ E,
178
+ App extends Effect.Effect<HttpServerResponse, any, any> = Effect.Effect<HttpServerResponse, E, R>
179
+ >(
180
+ lazyWss: Effect.Effect<NodeWS.WebSocketServer>,
181
+ httpEffect: Effect.Effect<HttpServerResponse, E, R>,
182
+ options: {
183
+ readonly scope: Scope.Scope
184
+ readonly middleware?: Middleware.HttpMiddleware.Applied<App, E, R> | undefined
185
+ }
186
+ ): Effect.Effect<
187
+ (nodeRequest: Http.IncomingMessage, socket: Duplex, head: Buffer) => void,
188
+ never,
189
+ Exclude<Effect.Services<App>, HttpServerRequest | Scope.Scope>
190
+ > => {
191
+ const handledApp = HttpEffect.toHandled(httpEffect, handleResponse, options.middleware as any)
192
+ return Effect.map(Effect.services<any>(), (services) =>
193
+ (function handler(nodeRequest: Http.IncomingMessage, socket: Duplex, head: Buffer) {
194
+ let nodeResponse_: Http.ServerResponse | undefined = undefined
195
+ const nodeResponse = () => {
196
+ if (nodeResponse_ === undefined) {
197
+ nodeResponse_ = new Http.ServerResponse(nodeRequest)
198
+ nodeResponse_.assignSocket(socket as any)
199
+ nodeResponse_.on("finish", () => {
200
+ socket.end()
201
+ })
202
+ }
203
+ return nodeResponse_
204
+ }
205
+ const upgradeEffect = Socket.fromWebSocket(Effect.flatMap(
206
+ lazyWss,
207
+ (wss) =>
208
+ Effect.acquireRelease(
209
+ Effect.callback<globalThis.WebSocket>((resume) =>
210
+ wss.handleUpgrade(nodeRequest, socket, head, (ws) => {
211
+ resume(Effect.succeed(ws as any))
212
+ })
213
+ ),
214
+ (ws) => Effect.sync(() => ws.close())
215
+ )
216
+ ))
217
+ const map = new Map(services.mapUnsafe)
218
+ map.set(HttpServerRequest.key, new ServerRequestImpl(nodeRequest, nodeResponse, upgradeEffect))
219
+ const fiber = Fiber.runIn(Effect.runForkWith(ServiceMap.makeUnsafe<any>(map))(handledApp), options.scope)
220
+ socket.on("close", () => {
221
+ if (!socket.writableEnded) {
222
+ fiber.interruptUnsafe(clientAbortFiberId)
223
+ }
224
+ })
225
+ }));
226
+ }
227
+
228
+ class ServerRequestImpl extends NodeHttpIncomingMessage<HttpServerError> implements HttpServerRequest {
229
+ readonly [Request.TypeId]: typeof Request.TypeId
230
+ readonly response: Http.ServerResponse | LazyArg<Http.ServerResponse>
231
+ private upgradeEffect?: Effect.Effect<Socket.Socket, HttpServerError> | undefined
232
+ readonly url: string
233
+ private headersOverride?: Headers.Headers | undefined
234
+
235
+ constructor(
236
+ source: Http.IncomingMessage,
237
+ response: Http.ServerResponse | LazyArg<Http.ServerResponse>,
238
+ upgradeEffect?: Effect.Effect<Socket.Socket, HttpServerError>,
239
+ url = source.url!,
240
+ headersOverride?: Headers.Headers,
241
+ remoteAddressOverride?: string
242
+ ) {
243
+ super(source, (cause) =>
244
+ new HttpServerError({
245
+ reason: new RequestParseError({
246
+ request: this,
247
+ cause
248
+ })
249
+ }), remoteAddressOverride)
250
+ this[Request.TypeId] = Request.TypeId
251
+ this.response = response
252
+ this.upgradeEffect = upgradeEffect
253
+ this.url = url
254
+ this.headersOverride = headersOverride
255
+ }
256
+
257
+ private cachedCookies: Record.ReadonlyRecord<string, string> | undefined
258
+ get cookies() {
259
+ if (this.cachedCookies) {
260
+ return this.cachedCookies
261
+ }
262
+ return this.cachedCookies = Cookies.parseHeader(this.headers.cookie ?? "")
263
+ }
264
+
265
+ get resolvedResponse(): Http.ServerResponse {
266
+ return typeof this.response === "function" ? this.response() : this.response
267
+ }
268
+
269
+ modify(
270
+ options: {
271
+ readonly url?: string | undefined
272
+ readonly headers?: Headers.Headers | undefined
273
+ readonly remoteAddress?: string | undefined
274
+ }
275
+ ) {
276
+ return new ServerRequestImpl(
277
+ this.source,
278
+ this.response,
279
+ this.upgradeEffect,
280
+ options.url ?? this.url,
281
+ options.headers ?? this.headersOverride,
282
+ options.remoteAddress ?? this.remoteAddressOverride
283
+ )
284
+ }
285
+
286
+ get originalUrl(): string {
287
+ return this.source.url!
288
+ }
289
+
290
+ get method(): HttpMethod {
291
+ return this.source.method!.toUpperCase() as HttpMethod
292
+ }
293
+
294
+ override get headers(): Headers.Headers {
295
+ this.headersOverride ??= this.source.headers as Headers.Headers
296
+ return this.headersOverride
297
+ }
298
+
299
+ private multipartEffect:
300
+ | Effect.Effect<
301
+ Multipart.Persisted,
302
+ Multipart.MultipartError,
303
+ Scope.Scope | FileSystem.FileSystem | Path.Path
304
+ >
305
+ | undefined
306
+ get multipart(): Effect.Effect<
307
+ Multipart.Persisted,
308
+ Multipart.MultipartError,
309
+ Scope.Scope | FileSystem.FileSystem | Path.Path
310
+ > {
311
+ if (this.multipartEffect) {
312
+ return this.multipartEffect
313
+ }
314
+ this.multipartEffect = Effect.runSync(Effect.cached(
315
+ NodeMultipart.persisted(this.source, this.source.headers)
316
+ ))
317
+ return this.multipartEffect
318
+ }
319
+
320
+ get multipartStream(): Stream.Stream<Multipart.Part, Multipart.MultipartError> {
321
+ return NodeMultipart.stream(this.source, this.source.headers)
322
+ }
323
+
324
+ get upgrade(): Effect.Effect<Socket.Socket, HttpServerError> {
325
+ return this.upgradeEffect ?? Effect.fail(
326
+ new HttpServerError({
327
+ reason: new RequestParseError({
328
+ request: this,
329
+ description: "not an upgradeable ServerRequest"
330
+ })
331
+ })
332
+ )
333
+ }
334
+
335
+ override toString(): string {
336
+ return `ServerRequest(${this.method} ${this.url})`
337
+ }
338
+
339
+ toJSON(): unknown {
340
+ return HttpIncomingMessage.inspect(this, {
341
+ _id: "HttpServerRequest",
342
+ method: this.method,
343
+ url: this.originalUrl
344
+ })
345
+ }
346
+ }
72
347
 
73
348
  /**
74
349
  * @since 1.0.0
75
- * @category layers
350
+ * @category Layers
76
351
  */
77
- export const layer: (
352
+ export const layerServer: (
78
353
  evaluate: LazyArg<Http.Server<typeof Http.IncomingMessage, typeof Http.ServerResponse>>,
79
354
  options: Net.ListenOptions
80
- ) => Layer.Layer<Platform.HttpPlatform | Etag.Generator | NodeContext.NodeContext | Server.HttpServer, ServeError> =
81
- internal.layer
355
+ ) => Layer.Layer<HttpServer.HttpServer, ServeError> = flow(make, Layer.effect(HttpServer.HttpServer))
82
356
 
83
357
  /**
84
358
  * @since 1.0.0
85
- * @category layers
359
+ * @category Layers
86
360
  */
87
- export const layerConfig: (
88
- evaluate: LazyArg<Http.Server<typeof Http.IncomingMessage, typeof Http.ServerResponse>>,
89
- options: Config.Config.Wrap<Net.ListenOptions>
90
- ) => Layer.Layer<
91
- Platform.HttpPlatform | Etag.Generator | NodeContext.NodeContext | Server.HttpServer,
92
- ConfigError.ConfigError | ServeError
93
- > = internal.layerConfig
361
+ export const layerHttpServices: Layer.Layer<
362
+ NodeServices.NodeServices | HttpPlatform.HttpPlatform | Etag.Generator
363
+ > = Layer.mergeAll(
364
+ NodeHttpPlatform.layer,
365
+ Etag.layerWeak,
366
+ NodeServices.layer
367
+ )
94
368
 
95
369
  /**
96
- * Layer starting a server on a random port and producing an `HttpClient`
97
- * with prepended url of the running http server.
98
- *
99
- * **Example**
100
- *
101
- * ```ts
102
- * import * as assert from "node:assert"
103
- * import { HttpClient, HttpRouter, HttpServer } from "@effect/platform"
104
- * import { NodeHttpServer } from "@effect/platform-node"
105
- * import { Effect } from "effect"
106
- *
107
- * Effect.gen(function*() {
108
- * yield* HttpServer.serveEffect(HttpRouter.empty)
109
- * const response = yield* HttpClient.get("/")
110
- * assert.strictEqual(response.status, 404)
111
- * }).pipe(Effect.provide(NodeHttpServer.layerTest))
112
- * ```
113
- *
114
370
  * @since 1.0.0
115
- * @category layers
371
+ * @category Layers
116
372
  */
117
- export const layerTest: Layer.Layer<
118
- | HttpClient.HttpClient
119
- | Server.HttpServer
120
- | Platform.HttpPlatform
121
- | Etag.Generator
122
- | NodeContext.NodeContext,
373
+ export const layer = (
374
+ evaluate: LazyArg<Http.Server>,
375
+ options: Net.ListenOptions
376
+ ): Layer.Layer<
377
+ HttpServer.HttpServer | NodeServices.NodeServices | HttpPlatform.HttpPlatform | Etag.Generator,
123
378
  ServeError
124
- > = internal.layerTest
379
+ > =>
380
+ Layer.mergeAll(
381
+ layerServer(evaluate, options),
382
+ layerHttpServices
383
+ )
125
384
 
126
385
  /**
127
- * A Layer providing the `HttpPlatform`, `FileSystem`, `Etag.Generator`, and `Path`
128
- * services.
129
- *
130
- * The `FileSystem` service is a no-op implementation, so this layer is only
131
- * useful for platforms that have no file system.
132
- *
133
386
  * @since 1.0.0
134
- * @category layers
387
+ * @category Layers
135
388
  */
136
- export const layerContext: Layer.Layer<
137
- | Platform.HttpPlatform
389
+ export const layerConfig = (
390
+ evaluate: LazyArg<Http.Server>,
391
+ options: Config.Wrap<Net.ListenOptions>
392
+ ): Layer.Layer<
393
+ HttpServer.HttpServer | FileSystem.FileSystem | Path.Path | HttpPlatform.HttpPlatform | Etag.Generator,
394
+ ServeError | Config.ConfigError
395
+ > =>
396
+ Layer.mergeAll(
397
+ Layer.effect(HttpServer.HttpServer)(
398
+ Effect.flatMap(Config.unwrap(options).asEffect(), (options) => make(evaluate, options))
399
+ ),
400
+ layerHttpServices
401
+ )
402
+
403
+ /**
404
+ * @since 1.0.0
405
+ * @category Testing
406
+ */
407
+ export const layerTest: Layer.Layer<
408
+ | HttpServer.HttpServer
409
+ | FileSystem.FileSystem
410
+ | Path.Path
411
+ | HttpPlatform.HttpPlatform
138
412
  | Etag.Generator
139
- | NodeContext.NodeContext
140
- > = internal.layerContext
413
+ | HttpClient,
414
+ ServeError,
415
+ never
416
+ > = HttpServer.layerTestClient.pipe(
417
+ Layer.provide(
418
+ Layer.fresh(FetchHttpClient.layer).pipe(
419
+ Layer.provide(Layer.succeed(FetchHttpClient.RequestInit)({ keepalive: false }))
420
+ )
421
+ ),
422
+ Layer.provideMerge(layer(Http.createServer, { port: 0 }))
423
+ )
424
+
425
+ // -----------------------------------------------------------------------------
426
+ // Internal
427
+ // -----------------------------------------------------------------------------
428
+
429
+ const handleResponse = (
430
+ request: HttpServerRequest,
431
+ response: HttpServerResponse
432
+ ): Effect.Effect<void, HttpServerError> => {
433
+ const nodeResponse = (request as ServerRequestImpl).resolvedResponse
434
+ if (nodeResponse.writableEnded) {
435
+ return Effect.void
436
+ }
437
+
438
+ let headers: Record<string, string | Array<string>> = response.headers
439
+ if (!Cookies.isEmpty(response.cookies)) {
440
+ headers = { ...headers }
441
+ const toSet = Cookies.toSetCookieHeaders(response.cookies)
442
+ if (headers["set-cookie"] !== undefined) {
443
+ toSet.push(headers["set-cookie"] as string)
444
+ }
445
+ headers["set-cookie"] = toSet
446
+ }
447
+
448
+ if (request.method === "HEAD") {
449
+ nodeResponse.writeHead(response.status, headers)
450
+ return Effect.callback<void>((resume) => {
451
+ nodeResponse.end(() => resume(Effect.void))
452
+ })
453
+ }
454
+ const body = response.body
455
+ switch (body._tag) {
456
+ case "Empty": {
457
+ nodeResponse.writeHead(response.status, headers)
458
+ nodeResponse.end()
459
+ return Effect.void
460
+ }
461
+ case "Raw": {
462
+ nodeResponse.writeHead(response.status, headers)
463
+ if (
464
+ typeof body.body === "object" && body.body !== null && "pipe" in body.body &&
465
+ typeof body.body.pipe === "function"
466
+ ) {
467
+ return Effect.tryPromise({
468
+ try: (signal) => pipeline(body.body as any, nodeResponse, { signal, end: true }),
469
+ catch: (cause) =>
470
+ new HttpServerError({
471
+ reason: new ResponseError({
472
+ request,
473
+ response,
474
+ description: "Error writing raw response",
475
+ cause
476
+ })
477
+ })
478
+ }).pipe(
479
+ Effect.interruptible,
480
+ Effect.tapCause(handleCause(nodeResponse, response))
481
+ )
482
+ }
483
+ return Effect.callback<void>((resume) => {
484
+ nodeResponse.end(body.body, () => resume(Effect.void))
485
+ })
486
+ }
487
+ case "Uint8Array": {
488
+ nodeResponse.writeHead(response.status, headers)
489
+ // If the body is less than 1MB, we skip the callback
490
+ if (body.body.length < 1024 * 1024) {
491
+ nodeResponse.end(body.body)
492
+ return Effect.void
493
+ }
494
+ return Effect.callback<void>((resume) => {
495
+ nodeResponse.end(body.body, () => resume(Effect.void))
496
+ })
497
+ }
498
+ case "FormData": {
499
+ return Effect.suspend(() => {
500
+ const r = new globalThis.Response(body.formData)
501
+ nodeResponse.writeHead(response.status, {
502
+ ...headers,
503
+ ...Object.fromEntries(r.headers)
504
+ })
505
+ return Effect.callback<void, HttpServerError>((resume, signal) => {
506
+ Readable.fromWeb(r.body as any, { signal })
507
+ .pipe(nodeResponse)
508
+ .on("error", (cause) => {
509
+ resume(Effect.fail(
510
+ new HttpServerError({
511
+ reason: new ResponseError({
512
+ request,
513
+ response,
514
+ description: "Error writing FormData response",
515
+ cause
516
+ })
517
+ })
518
+ ))
519
+ })
520
+ .once("finish", () => {
521
+ resume(Effect.void)
522
+ })
523
+ }).pipe(
524
+ Effect.interruptible,
525
+ Effect.tapCause(handleCause(nodeResponse, response))
526
+ )
527
+ })
528
+ }
529
+ case "Stream": {
530
+ nodeResponse.writeHead(response.status, headers)
531
+ const drainLatch = Effect.makeLatchUnsafe()
532
+ nodeResponse.on("drain", () => drainLatch.openUnsafe())
533
+ return body.stream.pipe(
534
+ Stream.orDie,
535
+ Stream.runForEachArray((array) => {
536
+ let needDrain = false
537
+ for (let i = 0; i < array.length; i++) {
538
+ const written = nodeResponse.write(array[i])
539
+ if (!written && !needDrain) {
540
+ needDrain = true
541
+ drainLatch.closeUnsafe()
542
+ } else if (written && needDrain) {
543
+ needDrain = false
544
+ }
545
+ }
546
+ if (!needDrain) return Effect.void
547
+ return drainLatch.await
548
+ }),
549
+ Effect.interruptible,
550
+ Effect.matchCauseEffect({
551
+ onSuccess: () => Effect.sync(() => nodeResponse.end()),
552
+ onFailure: handleCause(nodeResponse, response)
553
+ })
554
+ )
555
+ }
556
+ }
557
+ }
558
+
559
+ const handleCause = (
560
+ nodeResponse: Http.ServerResponse,
561
+ originalResponse: HttpServerResponse
562
+ ) =>
563
+ <E>(originalCause: Cause.Cause<E>) =>
564
+ Effect.flatMap(causeResponse(originalCause), ([response, cause]) => {
565
+ const headersSent = nodeResponse.headersSent
566
+ if (!headersSent) {
567
+ nodeResponse.writeHead(response.status)
568
+ }
569
+ if (!nodeResponse.writableEnded) {
570
+ nodeResponse.end()
571
+ }
572
+ return Effect.failCause(
573
+ headersSent
574
+ ? Cause.combine(originalCause, Cause.die(originalResponse))
575
+ : cause
576
+ )
577
+ })