effect 4.0.7 → 4.1.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 (679) hide show
  1. package/README.md +1 -1
  2. package/dist/BigDecimal.d.ts.map +1 -1
  3. package/dist/BigDecimal.js +3 -0
  4. package/dist/BigDecimal.js.map +1 -1
  5. package/dist/Channel.d.ts +12 -6
  6. package/dist/Channel.d.ts.map +1 -1
  7. package/dist/Channel.js +9 -3
  8. package/dist/Channel.js.map +1 -1
  9. package/dist/Config.d.ts +7 -1
  10. package/dist/Config.d.ts.map +1 -1
  11. package/dist/Config.js.map +1 -1
  12. package/dist/Context.d.ts +18 -1
  13. package/dist/Context.d.ts.map +1 -1
  14. package/dist/Context.js +27 -8
  15. package/dist/Context.js.map +1 -1
  16. package/dist/Cron.d.ts +81 -11
  17. package/dist/Cron.d.ts.map +1 -1
  18. package/dist/Cron.js +101 -26
  19. package/dist/Cron.js.map +1 -1
  20. package/dist/Duration.d.ts +78 -0
  21. package/dist/Duration.d.ts.map +1 -1
  22. package/dist/Duration.js +123 -0
  23. package/dist/Duration.js.map +1 -1
  24. package/dist/Effect.d.ts +164 -7
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +11 -1
  27. package/dist/Effect.js.map +1 -1
  28. package/dist/FileSystem.d.ts +59 -4
  29. package/dist/FileSystem.d.ts.map +1 -1
  30. package/dist/FileSystem.js +9 -2
  31. package/dist/FileSystem.js.map +1 -1
  32. package/dist/Glob.d.ts +165 -0
  33. package/dist/Glob.d.ts.map +1 -0
  34. package/dist/Glob.js +127 -0
  35. package/dist/Glob.js.map +1 -0
  36. package/dist/Match.d.ts +86 -0
  37. package/dist/Match.d.ts.map +1 -1
  38. package/dist/Match.js +72 -0
  39. package/dist/Match.js.map +1 -1
  40. package/dist/Pool.d.ts +51 -0
  41. package/dist/Pool.d.ts.map +1 -1
  42. package/dist/Pool.js +59 -9
  43. package/dist/Pool.js.map +1 -1
  44. package/dist/Random.d.ts.map +1 -1
  45. package/dist/Random.js +3 -3
  46. package/dist/Random.js.map +1 -1
  47. package/dist/RcMap.d.ts.map +1 -1
  48. package/dist/RcMap.js +8 -2
  49. package/dist/RcMap.js.map +1 -1
  50. package/dist/Schedule.d.ts +18 -1
  51. package/dist/Schedule.d.ts.map +1 -1
  52. package/dist/Schedule.js +7 -2
  53. package/dist/Schedule.js.map +1 -1
  54. package/dist/Schema.d.ts +666 -41
  55. package/dist/Schema.d.ts.map +1 -1
  56. package/dist/Schema.js +650 -0
  57. package/dist/Schema.js.map +1 -1
  58. package/dist/SchemaGetter.d.ts +6 -1
  59. package/dist/SchemaGetter.d.ts.map +1 -1
  60. package/dist/SchemaGetter.js +22 -11
  61. package/dist/SchemaGetter.js.map +1 -1
  62. package/dist/SchemaRepresentation.d.ts +14 -0
  63. package/dist/SchemaRepresentation.d.ts.map +1 -1
  64. package/dist/SchemaRepresentation.js +16 -0
  65. package/dist/SchemaRepresentation.js.map +1 -1
  66. package/dist/SchemaTransformation.d.ts +8 -3
  67. package/dist/SchemaTransformation.d.ts.map +1 -1
  68. package/dist/SchemaTransformation.js +6 -3
  69. package/dist/SchemaTransformation.js.map +1 -1
  70. package/dist/ScopedCache.d.ts.map +1 -1
  71. package/dist/ScopedCache.js +5 -7
  72. package/dist/ScopedCache.js.map +1 -1
  73. package/dist/Semaphore.d.ts +130 -0
  74. package/dist/Semaphore.d.ts.map +1 -1
  75. package/dist/Semaphore.js +40 -0
  76. package/dist/Semaphore.js.map +1 -1
  77. package/dist/Stream.d.ts +13 -4
  78. package/dist/Stream.d.ts.map +1 -1
  79. package/dist/Stream.js +9 -0
  80. package/dist/Stream.js.map +1 -1
  81. package/dist/Terminal.d.ts +18 -1
  82. package/dist/Terminal.d.ts.map +1 -1
  83. package/dist/Terminal.js +1 -1
  84. package/dist/Terminal.js.map +1 -1
  85. package/dist/ai/AiError.d.ts +43 -116
  86. package/dist/ai/AiError.d.ts.map +1 -1
  87. package/dist/ai/AiError.js +53 -72
  88. package/dist/ai/AiError.js.map +1 -1
  89. package/dist/ai/Decision.d.ts +196 -15
  90. package/dist/ai/Decision.d.ts.map +1 -1
  91. package/dist/ai/Decision.js +130 -0
  92. package/dist/ai/Decision.js.map +1 -1
  93. package/dist/ai/DecisionModel.d.ts +54 -13
  94. package/dist/ai/DecisionModel.d.ts.map +1 -1
  95. package/dist/ai/DecisionModel.js +123 -12
  96. package/dist/ai/DecisionModel.js.map +1 -1
  97. package/dist/ai/McpServer.d.ts +630 -29
  98. package/dist/ai/McpServer.d.ts.map +1 -1
  99. package/dist/ai/McpServer.js +562 -116
  100. package/dist/ai/McpServer.js.map +1 -1
  101. package/dist/ai/McpTest.d.ts +130 -0
  102. package/dist/ai/McpTest.d.ts.map +1 -0
  103. package/dist/ai/McpTest.js +237 -0
  104. package/dist/ai/McpTest.js.map +1 -0
  105. package/dist/ai/Response.d.ts +1 -25
  106. package/dist/ai/Response.d.ts.map +1 -1
  107. package/dist/ai/Response.js +1 -10
  108. package/dist/ai/Response.js.map +1 -1
  109. package/dist/ai/Tool.d.ts +19 -1
  110. package/dist/ai/Tool.d.ts.map +1 -1
  111. package/dist/ai/Tool.js.map +1 -1
  112. package/dist/ai/index.d.ts +5 -0
  113. package/dist/ai/index.d.ts.map +1 -1
  114. package/dist/ai/index.js +5 -0
  115. package/dist/ai/index.js.map +1 -1
  116. package/dist/ai/internal/mcpCore.js +17 -12
  117. package/dist/ai/internal/mcpCore.js.map +1 -1
  118. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
  119. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  120. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
  121. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  122. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
  123. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  124. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
  125. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  126. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
  127. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  128. package/dist/ai/internal/mcpProtocol.js +13 -0
  129. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  130. package/dist/ai/internal/mcpRuntime.js +5 -3
  131. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  132. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  133. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  134. package/dist/cli/Argument.d.ts +6 -0
  135. package/dist/cli/Argument.d.ts.map +1 -1
  136. package/dist/cli/Argument.js +2 -0
  137. package/dist/cli/Argument.js.map +1 -1
  138. package/dist/cli/CliOutput.d.ts +65 -1
  139. package/dist/cli/CliOutput.d.ts.map +1 -1
  140. package/dist/cli/CliOutput.js +94 -37
  141. package/dist/cli/CliOutput.js.map +1 -1
  142. package/dist/cli/Command.d.ts +23 -0
  143. package/dist/cli/Command.d.ts.map +1 -1
  144. package/dist/cli/Command.js +8 -0
  145. package/dist/cli/Command.js.map +1 -1
  146. package/dist/cli/Flag.d.ts +107 -0
  147. package/dist/cli/Flag.d.ts.map +1 -1
  148. package/dist/cli/Flag.js +37 -0
  149. package/dist/cli/Flag.js.map +1 -1
  150. package/dist/cli/HelpDoc.d.ts +15 -1
  151. package/dist/cli/HelpDoc.d.ts.map +1 -1
  152. package/dist/cli/Param.d.ts +6 -0
  153. package/dist/cli/Param.d.ts.map +1 -1
  154. package/dist/cli/Param.js +2 -0
  155. package/dist/cli/Param.js.map +1 -1
  156. package/dist/cli/Primitive.d.ts +14 -0
  157. package/dist/cli/Primitive.d.ts.map +1 -1
  158. package/dist/cli/Primitive.js +15 -1
  159. package/dist/cli/Primitive.js.map +1 -1
  160. package/dist/cli/Prompt.d.ts +1 -0
  161. package/dist/cli/Prompt.d.ts.map +1 -1
  162. package/dist/cli/Prompt.js +1 -0
  163. package/dist/cli/Prompt.js.map +1 -1
  164. package/dist/cli/internal/help.d.ts.map +1 -1
  165. package/dist/cli/internal/help.js +17 -10
  166. package/dist/cli/internal/help.js.map +1 -1
  167. package/dist/cluster/Sharding.d.ts.map +1 -1
  168. package/dist/cluster/Sharding.js +90 -28
  169. package/dist/cluster/Sharding.js.map +1 -1
  170. package/dist/cluster/ShardingConfig.d.ts +72 -6
  171. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  172. package/dist/cluster/ShardingConfig.js +4 -0
  173. package/dist/cluster/ShardingConfig.js.map +1 -1
  174. package/dist/cluster/SingleRunner.d.ts +3 -3
  175. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  176. package/dist/cluster/SingleRunner.js +1 -1
  177. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  178. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  179. package/dist/cluster/SqlMessageStorage.js +34 -7
  180. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  181. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  182. package/dist/cluster/SqlRunnerStorage.js +23 -8
  183. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  184. package/dist/crypto/Aead.d.ts +322 -0
  185. package/dist/crypto/Aead.d.ts.map +1 -0
  186. package/dist/crypto/Aead.js +331 -0
  187. package/dist/crypto/Aead.js.map +1 -0
  188. package/dist/crypto/Cipher.d.ts +235 -0
  189. package/dist/crypto/Cipher.d.ts.map +1 -0
  190. package/dist/crypto/Cipher.js +233 -0
  191. package/dist/crypto/Cipher.js.map +1 -0
  192. package/dist/crypto/CryptoError.d.ts +212 -0
  193. package/dist/crypto/CryptoError.d.ts.map +1 -0
  194. package/dist/crypto/CryptoError.js +202 -0
  195. package/dist/crypto/CryptoError.js.map +1 -0
  196. package/dist/crypto/Digest.d.ts +143 -0
  197. package/dist/crypto/Digest.d.ts.map +1 -0
  198. package/dist/crypto/Digest.js +146 -0
  199. package/dist/crypto/Digest.js.map +1 -0
  200. package/dist/crypto/Kdf.d.ts +220 -0
  201. package/dist/crypto/Kdf.d.ts.map +1 -0
  202. package/dist/crypto/Kdf.js +212 -0
  203. package/dist/crypto/Kdf.js.map +1 -0
  204. package/dist/crypto/KeyAgreement.d.ts +323 -0
  205. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  206. package/dist/crypto/KeyAgreement.js +303 -0
  207. package/dist/crypto/KeyAgreement.js.map +1 -0
  208. package/dist/crypto/KeyFormat.d.ts +309 -0
  209. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  210. package/dist/crypto/KeyFormat.js +556 -0
  211. package/dist/crypto/KeyFormat.js.map +1 -0
  212. package/dist/crypto/KeyWrap.d.ts +389 -0
  213. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  214. package/dist/crypto/KeyWrap.js +381 -0
  215. package/dist/crypto/KeyWrap.js.map +1 -0
  216. package/dist/crypto/Mac.d.ts +277 -0
  217. package/dist/crypto/Mac.d.ts.map +1 -0
  218. package/dist/crypto/Mac.js +288 -0
  219. package/dist/crypto/Mac.js.map +1 -0
  220. package/dist/crypto/SecureRandom.d.ts +340 -0
  221. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  222. package/dist/crypto/SecureRandom.js +257 -0
  223. package/dist/crypto/SecureRandom.js.map +1 -0
  224. package/dist/crypto/Signature.d.ts +448 -0
  225. package/dist/crypto/Signature.d.ts.map +1 -0
  226. package/dist/crypto/Signature.js +484 -0
  227. package/dist/crypto/Signature.js.map +1 -0
  228. package/dist/crypto/WebCrypto.d.ts +61 -0
  229. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  230. package/dist/crypto/WebCrypto.js +63 -0
  231. package/dist/crypto/WebCrypto.js.map +1 -0
  232. package/dist/crypto/index.d.ts +65 -0
  233. package/dist/crypto/index.d.ts.map +1 -0
  234. package/dist/crypto/index.js +66 -0
  235. package/dist/crypto/index.js.map +1 -0
  236. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  237. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  238. package/dist/crypto/internal/asymmetric.js +210 -0
  239. package/dist/crypto/internal/asymmetric.js.map +1 -0
  240. package/dist/crypto/internal/chacha.d.ts +46 -0
  241. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  242. package/dist/crypto/internal/chacha.js +885 -0
  243. package/dist/crypto/internal/chacha.js.map +1 -0
  244. package/dist/crypto/internal/der.d.ts +6 -0
  245. package/dist/crypto/internal/der.d.ts.map +1 -0
  246. package/dist/crypto/internal/der.js +86 -0
  247. package/dist/crypto/internal/der.js.map +1 -0
  248. package/dist/crypto/internal/digest.d.ts +2 -0
  249. package/dist/crypto/internal/digest.d.ts.map +1 -0
  250. package/dist/crypto/internal/digest.js +15 -0
  251. package/dist/crypto/internal/digest.js.map +1 -0
  252. package/dist/crypto/internal/key.d.ts +2 -0
  253. package/dist/crypto/internal/key.d.ts.map +1 -0
  254. package/dist/crypto/internal/key.js +170 -0
  255. package/dist/crypto/internal/key.js.map +1 -0
  256. package/dist/crypto/internal/md5.d.ts +39 -0
  257. package/dist/crypto/internal/md5.d.ts.map +1 -0
  258. package/dist/crypto/internal/md5.js +179 -0
  259. package/dist/crypto/internal/md5.js.map +1 -0
  260. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  261. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  262. package/dist/crypto/internal/webCrypto.js +111 -0
  263. package/dist/crypto/internal/webCrypto.js.map +1 -0
  264. package/dist/encoding/Base64Url.d.ts.map +1 -1
  265. package/dist/encoding/Base64Url.js +3 -2
  266. package/dist/encoding/Base64Url.js.map +1 -1
  267. package/dist/encoding/Csv.d.ts +608 -0
  268. package/dist/encoding/Csv.d.ts.map +1 -0
  269. package/dist/encoding/Csv.js +718 -0
  270. package/dist/encoding/Csv.js.map +1 -0
  271. package/dist/encoding/Hex.d.ts +3 -2
  272. package/dist/encoding/Hex.d.ts.map +1 -1
  273. package/dist/encoding/Hex.js +3 -2
  274. package/dist/encoding/Hex.js.map +1 -1
  275. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  276. package/dist/encoding/SchemaBinary.js +42 -4
  277. package/dist/encoding/SchemaBinary.js.map +1 -1
  278. package/dist/encoding/Toml.d.ts +17 -3
  279. package/dist/encoding/Toml.d.ts.map +1 -1
  280. package/dist/encoding/Toml.js +104 -16
  281. package/dist/encoding/Toml.js.map +1 -1
  282. package/dist/encoding/Yaml.d.ts +8 -1
  283. package/dist/encoding/Yaml.d.ts.map +1 -1
  284. package/dist/encoding/Yaml.js +54 -18
  285. package/dist/encoding/Yaml.js.map +1 -1
  286. package/dist/encoding/index.d.ts +5 -0
  287. package/dist/encoding/index.d.ts.map +1 -1
  288. package/dist/encoding/index.js +5 -0
  289. package/dist/encoding/index.js.map +1 -1
  290. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  291. package/dist/eventlog/EventJournal.js +6 -3
  292. package/dist/eventlog/EventJournal.js.map +1 -1
  293. package/dist/eventlog/EventLog.d.ts +119 -4
  294. package/dist/eventlog/EventLog.d.ts.map +1 -1
  295. package/dist/eventlog/EventLog.js +200 -12
  296. package/dist/eventlog/EventLog.js.map +1 -1
  297. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  298. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  299. package/dist/eventlog/EventLogEncryption.js +83 -64
  300. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  301. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  302. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  303. package/dist/eventlog/EventLogMessage.js +217 -1
  304. package/dist/eventlog/EventLogMessage.js.map +1 -1
  305. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  306. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  307. package/dist/eventlog/EventLogRemote.js +186 -16
  308. package/dist/eventlog/EventLogRemote.js.map +1 -1
  309. package/dist/eventlog/EventLogServer.d.ts +3 -0
  310. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  311. package/dist/eventlog/EventLogServer.js +18 -10
  312. package/dist/eventlog/EventLogServer.js.map +1 -1
  313. package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
  314. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  315. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  316. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  317. package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
  318. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  319. package/dist/eventlog/EventLogSessionAuth.js +41 -64
  320. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  321. package/dist/eventlog/EventRow.d.ts +4 -0
  322. package/dist/eventlog/EventRow.d.ts.map +1 -1
  323. package/dist/eventlog/EventRow.js +12 -2
  324. package/dist/eventlog/EventRow.js.map +1 -1
  325. package/dist/eventlog/SqlEventJournal.js +2 -2
  326. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  327. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  328. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  329. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  330. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  331. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  332. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  333. package/dist/eventlog/internal/batches.d.ts +12 -0
  334. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  335. package/dist/eventlog/internal/batches.js +26 -0
  336. package/dist/eventlog/internal/batches.js.map +1 -0
  337. package/dist/eventlog/internal/compaction.d.ts +38 -0
  338. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  339. package/dist/eventlog/internal/compaction.js +33 -0
  340. package/dist/eventlog/internal/compaction.js.map +1 -0
  341. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  342. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  343. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  344. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  345. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  346. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  347. package/dist/http/Cookies.d.ts +172 -0
  348. package/dist/http/Cookies.d.ts.map +1 -1
  349. package/dist/http/Cookies.js +143 -1
  350. package/dist/http/Cookies.js.map +1 -1
  351. package/dist/http/FetchHttpClient.d.ts +26 -2
  352. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  353. package/dist/http/FetchHttpClient.js +78 -15
  354. package/dist/http/FetchHttpClient.js.map +1 -1
  355. package/dist/http/HttpClient.d.ts +79 -8
  356. package/dist/http/HttpClient.d.ts.map +1 -1
  357. package/dist/http/HttpClient.js +65 -5
  358. package/dist/http/HttpClient.js.map +1 -1
  359. package/dist/http/HttpClientRequest.d.ts +9 -5
  360. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  361. package/dist/http/HttpClientRequest.js +2 -3
  362. package/dist/http/HttpClientRequest.js.map +1 -1
  363. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  364. package/dist/http/HttpClientResponse.js +3 -2
  365. package/dist/http/HttpClientResponse.js.map +1 -1
  366. package/dist/http/HttpMethod.d.ts +7 -1
  367. package/dist/http/HttpMethod.d.ts.map +1 -1
  368. package/dist/http/HttpMethod.js +3 -8
  369. package/dist/http/HttpMethod.js.map +1 -1
  370. package/dist/http/HttpServerRequest.d.ts +5 -2
  371. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  372. package/dist/http/HttpServerRequest.js +6 -17
  373. package/dist/http/HttpServerRequest.js.map +1 -1
  374. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  375. package/dist/http/HttpServerResponse.js +3 -2
  376. package/dist/http/HttpServerResponse.js.map +1 -1
  377. package/dist/http/HttpTraceContext.d.ts +2 -1
  378. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  379. package/dist/http/HttpTraceContext.js +7 -5
  380. package/dist/http/HttpTraceContext.js.map +1 -1
  381. package/dist/http/ProblemDetails.d.ts +96 -0
  382. package/dist/http/ProblemDetails.d.ts.map +1 -0
  383. package/dist/http/ProblemDetails.js +98 -0
  384. package/dist/http/ProblemDetails.js.map +1 -0
  385. package/dist/http/index.d.ts +5 -0
  386. package/dist/http/index.d.ts.map +1 -1
  387. package/dist/http/index.js +5 -0
  388. package/dist/http/index.js.map +1 -1
  389. package/dist/http/internal/decompression.js +3 -2
  390. package/dist/http/internal/decompression.js.map +1 -1
  391. package/dist/http/internal/urlParams.js +8 -0
  392. package/dist/http/internal/urlParams.js.map +1 -1
  393. package/dist/http-api/HttpApiBuilder.js +19 -5
  394. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  395. package/dist/http-api/HttpApiClient.d.ts +63 -0
  396. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  397. package/dist/http-api/HttpApiClient.js +51 -0
  398. package/dist/http-api/HttpApiClient.js.map +1 -1
  399. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  400. package/dist/http-api/HttpApiEndpoint.js +14 -5
  401. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  402. package/dist/http-api/HttpApiError.d.ts +185 -13
  403. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  404. package/dist/http-api/HttpApiError.js +128 -0
  405. package/dist/http-api/HttpApiError.js.map +1 -1
  406. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  407. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  408. package/dist/http-api/HttpApiMiddleware.js +85 -1
  409. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  410. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  411. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  412. package/dist/http-api/HttpApiSchema.js +53 -0
  413. package/dist/http-api/HttpApiSchema.js.map +1 -1
  414. package/dist/index.d.ts +5 -5
  415. package/dist/index.d.ts.map +1 -1
  416. package/dist/index.js +5 -5
  417. package/dist/index.js.map +1 -1
  418. package/dist/internal/effect.js +25 -14
  419. package/dist/internal/effect.js.map +1 -1
  420. package/dist/internal/glob.d.ts +2 -0
  421. package/dist/internal/glob.d.ts.map +1 -0
  422. package/dist/internal/glob.js +630 -0
  423. package/dist/internal/glob.js.map +1 -0
  424. package/dist/internal/matcher.js +10 -0
  425. package/dist/internal/matcher.js.map +1 -1
  426. package/dist/internal/persistence.js +9 -0
  427. package/dist/internal/persistence.js.map +1 -1
  428. package/dist/internal/rcRef.js +4 -1
  429. package/dist/internal/rcRef.js.map +1 -1
  430. package/dist/internal/schema/toCodeDocument.js +6 -3
  431. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  432. package/dist/internal/trie.js +42 -13
  433. package/dist/internal/trie.js.map +1 -1
  434. package/dist/internal/ulid.js +41 -0
  435. package/dist/internal/ulid.js.map +1 -1
  436. package/dist/internal/uuid.js +52 -8
  437. package/dist/internal/uuid.js.map +1 -1
  438. package/dist/internal/version.js +1 -1
  439. package/dist/observability/Otlp.d.ts +15 -4
  440. package/dist/observability/Otlp.d.ts.map +1 -1
  441. package/dist/observability/Otlp.js +10 -0
  442. package/dist/observability/Otlp.js.map +1 -1
  443. package/dist/observability/OtlpResource.d.ts +7 -0
  444. package/dist/observability/OtlpResource.d.ts.map +1 -1
  445. package/dist/observability/OtlpResource.js +11 -1
  446. package/dist/observability/OtlpResource.js.map +1 -1
  447. package/dist/persistence/KeyValueStore.d.ts +47 -2
  448. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  449. package/dist/persistence/KeyValueStore.js +129 -18
  450. package/dist/persistence/KeyValueStore.js.map +1 -1
  451. package/dist/persistence/PersistedQueue.d.ts +9 -0
  452. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  453. package/dist/persistence/PersistedQueue.js +94 -52
  454. package/dist/persistence/PersistedQueue.js.map +1 -1
  455. package/dist/persistence/Persistence.d.ts +10 -4
  456. package/dist/persistence/Persistence.d.ts.map +1 -1
  457. package/dist/persistence/Persistence.js +18 -11
  458. package/dist/persistence/Persistence.js.map +1 -1
  459. package/dist/process/ChildProcess.d.ts +207 -67
  460. package/dist/process/ChildProcess.d.ts.map +1 -1
  461. package/dist/process/ChildProcess.js +56 -158
  462. package/dist/process/ChildProcess.js.map +1 -1
  463. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  464. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  465. package/dist/process/ChildProcessSpawner.js.map +1 -1
  466. package/dist/process/CommandLine.d.ts +294 -0
  467. package/dist/process/CommandLine.d.ts.map +1 -0
  468. package/dist/process/CommandLine.js +481 -0
  469. package/dist/process/CommandLine.js.map +1 -0
  470. package/dist/process/index.d.ts +5 -0
  471. package/dist/process/index.d.ts.map +1 -1
  472. package/dist/process/index.js +5 -0
  473. package/dist/process/index.js.map +1 -1
  474. package/dist/reactivity/Atom.d.ts +2 -1
  475. package/dist/reactivity/Atom.d.ts.map +1 -1
  476. package/dist/reactivity/Atom.js +3 -4
  477. package/dist/reactivity/Atom.js.map +1 -1
  478. package/dist/reactivity/AtomRegistry.js.map +1 -1
  479. package/dist/rpc/RpcClient.d.ts +16 -1
  480. package/dist/rpc/RpcClient.d.ts.map +1 -1
  481. package/dist/rpc/RpcClient.js +50 -16
  482. package/dist/rpc/RpcClient.js.map +1 -1
  483. package/dist/rpc/RpcMessage.d.ts +10 -1
  484. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  485. package/dist/rpc/RpcMessage.js +1 -0
  486. package/dist/rpc/RpcMessage.js.map +1 -1
  487. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  488. package/dist/rpc/RpcSerialization.js +6 -0
  489. package/dist/rpc/RpcSerialization.js.map +1 -1
  490. package/dist/rpc/RpcServer.d.ts +31 -0
  491. package/dist/rpc/RpcServer.d.ts.map +1 -1
  492. package/dist/rpc/RpcServer.js +139 -66
  493. package/dist/rpc/RpcServer.js.map +1 -1
  494. package/dist/schema/Model.d.ts +14 -0
  495. package/dist/schema/Model.d.ts.map +1 -1
  496. package/dist/schema/Model.js +18 -3
  497. package/dist/schema/Model.js.map +1 -1
  498. package/dist/sql/Migrator.d.ts +0 -19
  499. package/dist/sql/Migrator.d.ts.map +1 -1
  500. package/dist/sql/Migrator.js +3 -48
  501. package/dist/sql/Migrator.js.map +1 -1
  502. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  503. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  504. package/dist/sql/MigratorFileSystem.js +57 -0
  505. package/dist/sql/MigratorFileSystem.js.map +1 -0
  506. package/dist/sql/SqlClient.d.ts.map +1 -1
  507. package/dist/sql/SqlClient.js +5 -9
  508. package/dist/sql/SqlClient.js.map +1 -1
  509. package/dist/sql/Statement.d.ts +20 -6
  510. package/dist/sql/Statement.d.ts.map +1 -1
  511. package/dist/sql/Statement.js +0 -13
  512. package/dist/sql/Statement.js.map +1 -1
  513. package/dist/sql/index.js +1 -1
  514. package/dist/testing/index.d.ts +0 -5
  515. package/dist/testing/index.d.ts.map +1 -1
  516. package/dist/testing/index.js +0 -5
  517. package/dist/testing/index.js.map +1 -1
  518. package/dist/workflow/internal/crypto.js +9 -8
  519. package/dist/workflow/internal/crypto.js.map +1 -1
  520. package/package.json +3 -1
  521. package/src/BigDecimal.ts +3 -0
  522. package/src/Channel.ts +17 -11
  523. package/src/Config.ts +7 -1
  524. package/src/Context.ts +34 -10
  525. package/src/Cron.ts +178 -29
  526. package/src/Duration.ts +140 -0
  527. package/src/Effect.ts +914 -85
  528. package/src/FileSystem.ts +65 -4
  529. package/src/Glob.ts +205 -0
  530. package/src/Match.ts +127 -0
  531. package/src/Pool.ts +73 -15
  532. package/src/Random.ts +3 -3
  533. package/src/RcMap.ts +5 -1
  534. package/src/Schedule.ts +26 -3
  535. package/src/Schema.ts +1189 -62
  536. package/src/SchemaGetter.ts +27 -11
  537. package/src/SchemaRepresentation.ts +19 -0
  538. package/src/SchemaTransformation.ts +8 -3
  539. package/src/ScopedCache.ts +5 -9
  540. package/src/Semaphore.ts +141 -0
  541. package/src/Stream.ts +15 -6
  542. package/src/Terminal.ts +19 -1
  543. package/src/ai/AiError.ts +56 -80
  544. package/src/ai/Decision.ts +257 -6
  545. package/src/ai/DecisionModel.ts +171 -28
  546. package/src/ai/McpServer.ts +1269 -286
  547. package/src/ai/McpTest.ts +380 -0
  548. package/src/ai/Response.ts +2 -22
  549. package/src/ai/Tool.ts +27 -8
  550. package/src/ai/index.ts +6 -0
  551. package/src/ai/internal/mcpCore.ts +78 -44
  552. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
  553. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
  554. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
  555. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
  556. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
  557. package/src/ai/internal/mcpProtocol.ts +29 -0
  558. package/src/ai/internal/mcpRuntime.ts +9 -5
  559. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  560. package/src/cli/Argument.ts +6 -0
  561. package/src/cli/CliOutput.ts +117 -49
  562. package/src/cli/Command.ts +23 -0
  563. package/src/cli/Flag.ts +107 -0
  564. package/src/cli/HelpDoc.ts +18 -1
  565. package/src/cli/Param.ts +6 -0
  566. package/src/cli/Primitive.ts +16 -1
  567. package/src/cli/Prompt.ts +1 -0
  568. package/src/cli/internal/help.ts +21 -9
  569. package/src/cluster/Sharding.ts +93 -26
  570. package/src/cluster/ShardingConfig.ts +41 -3
  571. package/src/cluster/SingleRunner.ts +3 -3
  572. package/src/cluster/SqlMessageStorage.ts +49 -17
  573. package/src/cluster/SqlRunnerStorage.ts +37 -27
  574. package/src/crypto/Aead.ts +517 -0
  575. package/src/crypto/Cipher.ts +326 -0
  576. package/src/crypto/CryptoError.ts +242 -0
  577. package/src/crypto/Digest.ts +167 -0
  578. package/src/crypto/Kdf.ts +315 -0
  579. package/src/crypto/KeyAgreement.ts +489 -0
  580. package/src/crypto/KeyFormat.ts +712 -0
  581. package/src/crypto/KeyWrap.ts +639 -0
  582. package/src/crypto/Mac.ts +386 -0
  583. package/src/crypto/SecureRandom.ts +459 -0
  584. package/src/crypto/Signature.ts +673 -0
  585. package/src/crypto/WebCrypto.ts +64 -0
  586. package/src/crypto/index.ts +78 -0
  587. package/src/crypto/internal/asymmetric.ts +329 -0
  588. package/src/crypto/internal/chacha.ts +1088 -0
  589. package/src/crypto/internal/der.ts +110 -0
  590. package/src/crypto/internal/digest.ts +16 -0
  591. package/src/crypto/internal/key.ts +235 -0
  592. package/src/crypto/internal/md5.ts +170 -0
  593. package/src/crypto/internal/webCrypto.ts +150 -0
  594. package/src/encoding/Base64Url.ts +5 -2
  595. package/src/encoding/Csv.ts +1298 -0
  596. package/src/encoding/Hex.ts +3 -2
  597. package/src/encoding/SchemaBinary.ts +40 -4
  598. package/src/encoding/Toml.ts +85 -20
  599. package/src/encoding/Yaml.ts +61 -18
  600. package/src/encoding/index.ts +6 -0
  601. package/src/eventlog/EventJournal.ts +4 -3
  602. package/src/eventlog/EventLog.ts +340 -15
  603. package/src/eventlog/EventLogEncryption.ts +118 -110
  604. package/src/eventlog/EventLogMessage.ts +273 -1
  605. package/src/eventlog/EventLogRemote.ts +367 -23
  606. package/src/eventlog/EventLogServer.ts +23 -8
  607. package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
  608. package/src/eventlog/EventLogSessionAuth.ts +56 -70
  609. package/src/eventlog/EventRow.ts +12 -3
  610. package/src/eventlog/SqlEventJournal.ts +2 -2
  611. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  612. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  613. package/src/eventlog/internal/batches.ts +30 -0
  614. package/src/eventlog/internal/compaction.ts +64 -0
  615. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  616. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  617. package/src/http/Cookies.ts +281 -1
  618. package/src/http/FetchHttpClient.ts +88 -16
  619. package/src/http/HttpClient.ts +89 -22
  620. package/src/http/HttpClientRequest.ts +12 -9
  621. package/src/http/HttpClientResponse.ts +3 -2
  622. package/src/http/HttpMethod.ts +10 -2
  623. package/src/http/HttpServerRequest.ts +15 -30
  624. package/src/http/HttpServerResponse.ts +3 -2
  625. package/src/http/HttpTraceContext.ts +7 -4
  626. package/src/http/ProblemDetails.ts +149 -0
  627. package/src/http/index.ts +6 -0
  628. package/src/http/internal/decompression.ts +4 -4
  629. package/src/http/internal/urlParams.ts +8 -0
  630. package/src/http-api/HttpApiBuilder.ts +24 -12
  631. package/src/http-api/HttpApiClient.ts +67 -1
  632. package/src/http-api/HttpApiEndpoint.ts +14 -5
  633. package/src/http-api/HttpApiError.ts +250 -0
  634. package/src/http-api/HttpApiMiddleware.ts +95 -1
  635. package/src/http-api/HttpApiSchema.ts +105 -14
  636. package/src/index.ts +6 -6
  637. package/src/internal/effect.ts +34 -18
  638. package/src/internal/glob.ts +736 -0
  639. package/src/internal/matcher.ts +17 -0
  640. package/src/internal/persistence.ts +11 -0
  641. package/src/internal/rcRef.ts +4 -1
  642. package/src/internal/schema/toCodeDocument.ts +7 -3
  643. package/src/internal/trie.ts +43 -14
  644. package/src/internal/ulid.ts +44 -0
  645. package/src/internal/uuid.ts +57 -16
  646. package/src/internal/version.ts +1 -1
  647. package/src/observability/Otlp.ts +21 -4
  648. package/src/observability/OtlpResource.ts +9 -1
  649. package/src/persistence/KeyValueStore.ts +219 -22
  650. package/src/persistence/PersistedQueue.ts +128 -59
  651. package/src/persistence/Persistence.ts +20 -13
  652. package/src/process/ChildProcess.ts +255 -260
  653. package/src/process/ChildProcessSpawner.ts +5 -0
  654. package/src/process/CommandLine.ts +630 -0
  655. package/src/process/index.ts +6 -0
  656. package/src/reactivity/Atom.ts +5 -5
  657. package/src/reactivity/AtomRegistry.ts +1 -1
  658. package/src/rpc/RpcClient.ts +62 -26
  659. package/src/rpc/RpcMessage.ts +10 -1
  660. package/src/rpc/RpcSerialization.ts +3 -0
  661. package/src/rpc/RpcServer.ts +176 -78
  662. package/src/schema/Model.ts +26 -3
  663. package/src/sql/Migrator.ts +4 -63
  664. package/src/sql/MigratorFileSystem.ts +71 -0
  665. package/src/sql/SqlClient.ts +2 -16
  666. package/src/sql/Statement.ts +8 -7
  667. package/src/sql/index.ts +1 -1
  668. package/src/testing/index.ts +0 -6
  669. package/src/workflow/internal/crypto.ts +15 -11
  670. package/dist/Crypto.d.ts +0 -244
  671. package/dist/Crypto.d.ts.map +0 -1
  672. package/dist/Crypto.js +0 -139
  673. package/dist/Crypto.js.map +0 -1
  674. package/dist/testing/TestCrypto.d.ts +0 -73
  675. package/dist/testing/TestCrypto.d.ts.map +0 -1
  676. package/dist/testing/TestCrypto.js +0 -87
  677. package/dist/testing/TestCrypto.js.map +0 -1
  678. package/src/Crypto.ts +0 -347
  679. package/src/testing/TestCrypto.ts +0 -94
@@ -7,6 +7,10 @@
7
7
  * `Set-Cookie` headers, and provides helpers for adding, removing, merging, and
8
8
  * expiring cookies.
9
9
  *
10
+ * For client-side storage, `mergeIntoArray` and `toRequestCookieHeader`
11
+ * work on a plain array of cookies scoped by domain, path and scheme, following
12
+ * RFC 6265.
13
+ *
10
14
  * @stability unstable
11
15
  * @since 4.0.0
12
16
  */
@@ -51,6 +55,12 @@ const CookieTypeId = "~effect/http/Cookies/Cookie"
51
55
  * HTTP cookie value with its decoded value, encoded value, and optional cookie
52
56
  * attributes such as domain, path, expiration, security, and same-site settings.
53
57
  *
58
+ * **Details**
59
+ *
60
+ * `hostOnly` marks a stored client cookie that is sent only to the exact
61
+ * `domain`, not its subdomains. It is not serialized, and `serializeCookie`
62
+ * omits `Domain` when it is set.
63
+ *
54
64
  * @stability unstable
55
65
  * @category cookies
56
66
  * @since 4.0.0
@@ -70,6 +80,7 @@ export interface Cookie extends Inspectable.Inspectable {
70
80
  readonly secure?: boolean | undefined
71
81
  readonly partitioned?: boolean | undefined
72
82
  readonly sameSite?: "lax" | "strict" | "none" | undefined
83
+ readonly hostOnly?: boolean | undefined
73
84
  } | undefined
74
85
  }
75
86
 
@@ -948,7 +959,7 @@ export function serializeCookie(self: Cookie): string {
948
959
  str += "; Max-Age=" + Math.trunc(maxAge)
949
960
  }
950
961
 
951
- if (options.domain !== undefined) {
962
+ if (options.domain !== undefined && !options.hostOnly) {
952
963
  str += "; Domain=" + options.domain
953
964
  }
954
965
 
@@ -1041,6 +1052,275 @@ export const toRecord = (self: Cookies): Record<string, string> => {
1041
1052
  */
1042
1053
  export const toSetCookieHeaders = (self: Cookies): Array<string> => Object.values(self.cookies).map(serializeCookie)
1043
1054
 
1055
+ /**
1056
+ * Merges cookies set by `url` into an array of client cookies, returning a new
1057
+ * array.
1058
+ *
1059
+ * **When to use**
1060
+ *
1061
+ * Use to record the cookies of a response, or to seed an array of client
1062
+ * cookies from `Set-Cookie` values for a base URL.
1063
+ *
1064
+ * **Details**
1065
+ *
1066
+ * A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
1067
+ * host of `url`. A `Domain` attribute is accepted only when the host of `url`
1068
+ * domain-matches it. Without a `Path` attribute the cookie uses the default
1069
+ * path of `url`. `Max-Age` takes precedence over `Expires`, and both are
1070
+ * converted to an absolute `expires` computed from `now` (epoch milliseconds).
1071
+ *
1072
+ * A cookie replaces the existing cookie with the same name, domain and path,
1073
+ * keeping its position. A cookie that is already expired removes that existing
1074
+ * cookie instead. The array is returned unchanged when `url` is not a valid
1075
+ * absolute URL.
1076
+ *
1077
+ * **Gotchas**
1078
+ *
1079
+ * - There is no public suffix list. A `Domain` attribute is accepted whenever
1080
+ * the request host domain-matches it, unless the host is an IP address or the
1081
+ * domain is a single label such as `com`, so `foo.co.uk` can set
1082
+ * `Domain=co.uk`.
1083
+ *
1084
+ * @stability unstable
1085
+ * @category client storage
1086
+ * @since 4.0.0
1087
+ */
1088
+ export const mergeIntoArray: {
1089
+ /**
1090
+ * Merges cookies set by `url` into an array of client cookies, returning a new
1091
+ * array.
1092
+ *
1093
+ * **When to use**
1094
+ *
1095
+ * Use to record the cookies of a response, or to seed an array of client
1096
+ * cookies from `Set-Cookie` values for a base URL.
1097
+ *
1098
+ * **Details**
1099
+ *
1100
+ * A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
1101
+ * host of `url`. A `Domain` attribute is accepted only when the host of `url`
1102
+ * domain-matches it. Without a `Path` attribute the cookie uses the default
1103
+ * path of `url`. `Max-Age` takes precedence over `Expires`, and both are
1104
+ * converted to an absolute `expires` computed from `now` (epoch milliseconds).
1105
+ *
1106
+ * A cookie replaces the existing cookie with the same name, domain and path,
1107
+ * keeping its position. A cookie that is already expired removes that existing
1108
+ * cookie instead. The array is returned unchanged when `url` is not a valid
1109
+ * absolute URL.
1110
+ *
1111
+ * **Gotchas**
1112
+ *
1113
+ * - There is no public suffix list. A `Domain` attribute is accepted whenever
1114
+ * the request host domain-matches it, unless the host is an IP address or the
1115
+ * domain is a single label such as `com`, so `foo.co.uk` can set
1116
+ * `Domain=co.uk`.
1117
+ *
1118
+ * @stability unstable
1119
+ * @category client storage
1120
+ * @since 4.0.0
1121
+ */
1122
+ (url: string, cookies: Cookies, now: number): (self: ReadonlyArray<Cookie>) => ReadonlyArray<Cookie>
1123
+ /**
1124
+ * Merges cookies set by `url` into an array of client cookies, returning a new
1125
+ * array.
1126
+ *
1127
+ * **When to use**
1128
+ *
1129
+ * Use to record the cookies of a response, or to seed an array of client
1130
+ * cookies from `Set-Cookie` values for a base URL.
1131
+ *
1132
+ * **Details**
1133
+ *
1134
+ * A cookie without a `Domain` attribute is scoped as `hostOnly` to the exact
1135
+ * host of `url`. A `Domain` attribute is accepted only when the host of `url`
1136
+ * domain-matches it. Without a `Path` attribute the cookie uses the default
1137
+ * path of `url`. `Max-Age` takes precedence over `Expires`, and both are
1138
+ * converted to an absolute `expires` computed from `now` (epoch milliseconds).
1139
+ *
1140
+ * A cookie replaces the existing cookie with the same name, domain and path,
1141
+ * keeping its position. A cookie that is already expired removes that existing
1142
+ * cookie instead. The array is returned unchanged when `url` is not a valid
1143
+ * absolute URL.
1144
+ *
1145
+ * **Gotchas**
1146
+ *
1147
+ * - There is no public suffix list. A `Domain` attribute is accepted whenever
1148
+ * the request host domain-matches it, unless the host is an IP address or the
1149
+ * domain is a single label such as `com`, so `foo.co.uk` can set
1150
+ * `Domain=co.uk`.
1151
+ *
1152
+ * @stability unstable
1153
+ * @category client storage
1154
+ * @since 4.0.0
1155
+ */
1156
+ (self: ReadonlyArray<Cookie>, url: string, cookies: Cookies, now: number): ReadonlyArray<Cookie>
1157
+ } = dual(4, (self: ReadonlyArray<Cookie>, url: string, cookies: Cookies, now: number): ReadonlyArray<Cookie> => {
1158
+ const parsed = parseUrl(url)
1159
+ if (parsed === undefined) {
1160
+ return self
1161
+ }
1162
+ const stored = self.slice()
1163
+ for (const cookie of Object.values(cookies.cookies)) {
1164
+ const scoped = scopeCookie(parsed, cookie, now)
1165
+ if (scoped === undefined) {
1166
+ continue
1167
+ }
1168
+ const domain = cookieDomain(scoped)
1169
+ const path = cookiePath(scoped)
1170
+ const index = stored.findIndex((existing) =>
1171
+ existing.name === scoped.name && cookieDomain(existing) === domain && cookiePath(existing) === path
1172
+ )
1173
+ if (scoped.options!.expires !== undefined && scoped.options!.expires.getTime() <= now) {
1174
+ if (index !== -1) stored.splice(index, 1)
1175
+ } else if (index === -1) {
1176
+ stored.push(scoped)
1177
+ } else {
1178
+ stored[index] = scoped
1179
+ }
1180
+ }
1181
+ return stored
1182
+ })
1183
+
1184
+ /**
1185
+ * Serializes the client cookies to send with a request to `url` into a
1186
+ * `Cookie` header value.
1187
+ *
1188
+ * **Details**
1189
+ *
1190
+ * Selects cookies that have not expired at `now` (epoch milliseconds) and whose
1191
+ * domain and path match `url`, skipping `Secure` cookies unless `url` uses
1192
+ * `https`. Every matching cookie is kept, including cookies with the same name,
1193
+ * ordered by longest path first. Returns `undefined` when no cookie matches.
1194
+ *
1195
+ * A leading dot and letter case in `domain` are ignored. A cookie without a
1196
+ * `domain` is never sent, and a cookie without a `path` matches every path.
1197
+ *
1198
+ * @stability unstable
1199
+ * @category client storage
1200
+ * @since 4.0.0
1201
+ */
1202
+ export const toRequestCookieHeader: {
1203
+ /**
1204
+ * Serializes the client cookies to send with a request to `url` into a
1205
+ * `Cookie` header value.
1206
+ *
1207
+ * **Details**
1208
+ *
1209
+ * Selects cookies that have not expired at `now` (epoch milliseconds) and whose
1210
+ * domain and path match `url`, skipping `Secure` cookies unless `url` uses
1211
+ * `https`. Every matching cookie is kept, including cookies with the same name,
1212
+ * ordered by longest path first. Returns `undefined` when no cookie matches.
1213
+ *
1214
+ * A leading dot and letter case in `domain` are ignored. A cookie without a
1215
+ * `domain` is never sent, and a cookie without a `path` matches every path.
1216
+ *
1217
+ * @stability unstable
1218
+ * @category client storage
1219
+ * @since 4.0.0
1220
+ */
1221
+ (url: string, now: number): (self: ReadonlyArray<Cookie>) => string | undefined
1222
+ /**
1223
+ * Serializes the client cookies to send with a request to `url` into a
1224
+ * `Cookie` header value.
1225
+ *
1226
+ * **Details**
1227
+ *
1228
+ * Selects cookies that have not expired at `now` (epoch milliseconds) and whose
1229
+ * domain and path match `url`, skipping `Secure` cookies unless `url` uses
1230
+ * `https`. Every matching cookie is kept, including cookies with the same name,
1231
+ * ordered by longest path first. Returns `undefined` when no cookie matches.
1232
+ *
1233
+ * A leading dot and letter case in `domain` are ignored. A cookie without a
1234
+ * `domain` is never sent, and a cookie without a `path` matches every path.
1235
+ *
1236
+ * @stability unstable
1237
+ * @category client storage
1238
+ * @since 4.0.0
1239
+ */
1240
+ (self: ReadonlyArray<Cookie>, url: string, now: number): string | undefined
1241
+ } = dual(3, (self: ReadonlyArray<Cookie>, url: string, now: number): string | undefined => {
1242
+ const parsed = parseUrl(url)
1243
+ if (parsed === undefined) {
1244
+ return undefined
1245
+ }
1246
+ const host = parsed.hostname
1247
+ const secure = parsed.protocol === "https:"
1248
+ const matching = self.filter((cookie) => {
1249
+ const domain = cookieDomain(cookie)
1250
+ return domain !== undefined &&
1251
+ (cookie.options?.hostOnly ? host === domain : domainMatches(host, domain)) &&
1252
+ pathMatches(parsed.pathname, cookiePath(cookie)) &&
1253
+ (cookie.options?.expires === undefined || cookie.options.expires.getTime() > now) &&
1254
+ (secure || !cookie.options?.secure)
1255
+ })
1256
+ return matching.length === 0
1257
+ ? undefined
1258
+ : matching
1259
+ .sort((a, b) => cookiePath(b).length - cookiePath(a).length)
1260
+ .map((cookie) => `${cookie.name}=${cookie.valueEncoded}`)
1261
+ .join("; ")
1262
+ })
1263
+
1264
+ const parseUrl = (url: string): URL | undefined => {
1265
+ try {
1266
+ return new URL(url)
1267
+ } catch {
1268
+ return undefined
1269
+ }
1270
+ }
1271
+
1272
+ const cookieDomain = (cookie: Cookie): string | undefined =>
1273
+ cookie.options?.domain?.replace(/^\./, "").toLowerCase() || undefined
1274
+
1275
+ const cookiePath = (cookie: Cookie): string => cookie.options?.path?.startsWith("/") ? cookie.options.path : "/"
1276
+
1277
+ const isIpAddress = (host: string): boolean => host.startsWith("[") || /^\d+\.\d+\.\d+\.\d+$/.test(host)
1278
+
1279
+ const domainMatches = (host: string, domain: string): boolean =>
1280
+ host === domain || (host.endsWith("." + domain) && !isIpAddress(host))
1281
+
1282
+ const pathMatches = (requestPath: string, cookiePath: string): boolean =>
1283
+ requestPath === cookiePath ||
1284
+ (requestPath.startsWith(cookiePath) &&
1285
+ (cookiePath.endsWith("/") || requestPath[cookiePath.length] === "/"))
1286
+
1287
+ const defaultPath = (pathname: string): string => {
1288
+ const index = pathname.lastIndexOf("/")
1289
+ return index <= 0 ? "/" : pathname.slice(0, index)
1290
+ }
1291
+
1292
+ const scopeCookie = (url: URL, cookie: Cookie, now: number): Cookie | undefined => {
1293
+ const host = url.hostname
1294
+ let domain = host
1295
+ let hostOnly = true
1296
+ const attribute = cookieDomain(cookie)
1297
+ if (attribute !== undefined) {
1298
+ if (isIpAddress(host) || !domainMatches(host, attribute)) {
1299
+ return undefined
1300
+ }
1301
+ if (attribute.includes(".")) {
1302
+ domain = attribute
1303
+ hostOnly = false
1304
+ } else if (attribute !== host) {
1305
+ // a single-label domain such as "com" is treated like a public suffix
1306
+ return undefined
1307
+ }
1308
+ }
1309
+ const { maxAge, ...options } = cookie.options ?? {}
1310
+ return Object.assign(Object.create(CookieProto), {
1311
+ name: cookie.name,
1312
+ value: cookie.value,
1313
+ valueEncoded: cookie.valueEncoded,
1314
+ options: {
1315
+ ...options,
1316
+ domain,
1317
+ hostOnly: hostOnly || undefined,
1318
+ path: options.path?.startsWith("/") ? options.path : defaultPath(url.pathname),
1319
+ expires: maxAge !== undefined ? new Date(now + Duration.toMillis(maxAge)) : options.expires
1320
+ }
1321
+ })
1322
+ }
1323
+
1044
1324
  /**
1045
1325
  * Parses a cookie header into a record of key-value pairs
1046
1326
  *
@@ -36,6 +36,32 @@ export const Fetch = Context.Reference<typeof globalThis.fetch>("effect/http/Fet
36
36
  defaultValue: () => globalThis.fetch
37
37
  })
38
38
 
39
+ /**
40
+ * Context reference controlling stream bodies when the runtime does not support streaming requests.
41
+ *
42
+ * **Details**
43
+ *
44
+ * Defaults to `"error"`, which fails with an `EncodeError` without sending the
45
+ * request. Set to `"buffer"` to collect the entire stream in memory and send it
46
+ * as a single body instead. Runtimes with streaming support always send the stream.
47
+ *
48
+ * **Gotchas**
49
+ *
50
+ * Buffering keeps the entire upload in memory and can exhaust memory for large
51
+ * or unbounded uploads. Support is detected once, on the first stream body sent,
52
+ * using the global `Request` implementation even when a custom `Fetch` is provided.
53
+ *
54
+ * @stability unstable
55
+ * @category services
56
+ * @since 4.0.0
57
+ */
58
+ export const StreamBodyFallback = Context.Reference<"error" | "buffer">(
59
+ "effect/http/FetchHttpClient/StreamBodyFallback",
60
+ {
61
+ defaultValue: () => "error"
62
+ }
63
+ )
64
+
39
65
  /**
40
66
  * Service that contains default fetch options for the fetch-based HTTP client.
41
67
  *
@@ -58,6 +84,27 @@ export class RequestInit extends Context.Service<RequestInit, globalThis.Request
58
84
  "effect/http/FetchHttpClient/RequestInit"
59
85
  ) {}
60
86
 
87
+ // https://developer.chrome.com/docs/capabilities/web-apis/fetch-streaming-requests
88
+ let supportsStreamBody: boolean | undefined
89
+ const detectStreamBodySupport = () => {
90
+ try {
91
+ let duplexAccessed = false
92
+ const body = new ReadableStream()
93
+ const request = new Request("https://example.com", {
94
+ method: "POST",
95
+ body,
96
+ get duplex() {
97
+ duplexAccessed = true
98
+ return "half"
99
+ }
100
+ } as globalThis.RequestInit)
101
+ // Bun and Deno preserve the stream without reading the duplex option.
102
+ return (duplexAccessed || request.body === body) && !request.headers.has("Content-Type")
103
+ } catch {
104
+ return false
105
+ }
106
+ }
107
+
61
108
  const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fiber) => {
62
109
  if (request.headers.upgrade !== undefined) {
63
110
  return Effect.fail(
@@ -124,20 +171,41 @@ const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fibe
124
171
  case "FormData":
125
172
  return send(request.body.formData)
126
173
  case "Stream": {
127
- uploadController = new AbortController()
128
- const uploadSignal = AbortSignal.any([signal, uploadController.signal])
129
- const stopped = Effect.callback<void>((resume) => {
130
- const onAbort = () => resume(Effect.interrupt)
131
- if (uploadSignal.aborted) {
132
- onAbort()
133
- return
134
- }
135
- uploadSignal.addEventListener("abort", onAbort, { once: true })
136
- return Effect.sync(() => uploadSignal.removeEventListener("abort", onAbort))
137
- })
138
- return Effect.flatMap(
139
- Stream.toReadableStreamEffect(Stream.interruptWhen(request.body.stream, stopped)),
140
- send
174
+ supportsStreamBody ??= detectStreamBodySupport()
175
+ if (supportsStreamBody) {
176
+ uploadController = new AbortController()
177
+ const uploadSignal = AbortSignal.any([signal, uploadController.signal])
178
+ const stopped = Effect.callback<void>((resume) => {
179
+ const onAbort = () => resume(Effect.interrupt)
180
+ if (uploadSignal.aborted) {
181
+ onAbort()
182
+ return
183
+ }
184
+ uploadSignal.addEventListener("abort", onAbort, { once: true })
185
+ return Effect.sync(() => uploadSignal.removeEventListener("abort", onAbort))
186
+ })
187
+ return Effect.flatMap(
188
+ Stream.toReadableStreamEffect(Stream.interruptWhen(request.body.stream, stopped)),
189
+ send
190
+ )
191
+ }
192
+ if (fiber.getRef(StreamBodyFallback) === "error") {
193
+ return Effect.fail(
194
+ new HttpClientError.HttpClientError({
195
+ reason: new HttpClientError.EncodeError({
196
+ request,
197
+ description: "Streaming request bodies are not supported in this runtime"
198
+ })
199
+ })
200
+ )
201
+ }
202
+ return Stream.mkArrayBuffer(request.body.stream).pipe(
203
+ Effect.mapError((cause) =>
204
+ new HttpClientError.HttpClientError({
205
+ reason: new HttpClientError.EncodeError({ request, cause })
206
+ })
207
+ ),
208
+ Effect.flatMap(send)
141
209
  )
142
210
  }
143
211
  }
@@ -168,11 +236,15 @@ const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fibe
168
236
  * has no effect unless `RequestInit` sets `redirect: "manual"`. Trace
169
237
  * propagation is on by default, and a browser preflight fails unless the
170
238
  * target allows `b3` and `traceparent`. Stream request bodies are sent as Web
171
- * streams with `duplex: "half"`, and any `content-length` header is removed
172
- * before calling `fetch`.
239
+ * streams with `duplex: "half"` when the runtime supports it; see
240
+ * `StreamBodyFallback` for the unsupported case. Any `content-length` header is
241
+ * removed before calling `fetch`. Chrome passes the support check but rejects
242
+ * streaming uploads over HTTP/1.1, which surfaces as a `TransportError`, and
243
+ * browsers only deliver the response after the entire request body has been sent.
173
244
  *
174
245
  * @see {@link Fetch} for supplying the fetch implementation used by this layer
175
246
  * @see {@link RequestInit} for default `RequestInit` options applied before request-specific fields
247
+ * @see {@link StreamBodyFallback} for opting into buffering on unsupported runtimes
176
248
  * @see {@link HttpClient.TracerPropagationEnabled} for leaving `b3` and `traceparent` off a browser request
177
249
  *
178
250
  * @stability unstable
@@ -2456,12 +2456,20 @@ export const tapRequest: {
2456
2456
  )
2457
2457
 
2458
2458
  /**
2459
- * Adds a `Ref` of cookies to the client for handling cookies across requests.
2459
+ * Adds a `Ref` of stored cookies to the client for handling cookies across
2460
+ * requests.
2460
2461
  *
2461
2462
  * **When to use**
2462
2463
  *
2463
2464
  * Use to add shared cookie storage to a client so response cookies are retained
2464
- * and sent by later requests.
2465
+ * and sent by later requests to a matching host, path, and scheme.
2466
+ *
2467
+ * **Details**
2468
+ *
2469
+ * Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
2470
+ * the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
2471
+ * the cookies for the request URL and sets them as the `cookie` header. Expiry
2472
+ * uses the current `Clock`.
2465
2473
  *
2466
2474
  * @stability unstable
2467
2475
  * @category cookies
@@ -2469,52 +2477,66 @@ export const tapRequest: {
2469
2477
  */
2470
2478
  export const withCookiesRef: {
2471
2479
  /**
2472
- * Adds a `Ref` of cookies to the client for handling cookies across requests.
2480
+ * Adds a `Ref` of stored cookies to the client for handling cookies across
2481
+ * requests.
2473
2482
  *
2474
2483
  * **When to use**
2475
2484
  *
2476
2485
  * Use to add shared cookie storage to a client so response cookies are retained
2477
- * and sent by later requests.
2486
+ * and sent by later requests to a matching host, path, and scheme.
2487
+ *
2488
+ * **Details**
2489
+ *
2490
+ * Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
2491
+ * the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
2492
+ * the cookies for the request URL and sets them as the `cookie` header. Expiry
2493
+ * uses the current `Clock`.
2478
2494
  *
2479
2495
  * @stability unstable
2480
2496
  * @category cookies
2481
2497
  * @since 4.0.0
2482
2498
  */
2483
- (ref: Ref.Ref<Cookies.Cookies>): <E, R>(self: HttpClient.With<E, R>) => HttpClient.With<E, R>
2499
+ (ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>): <E, R>(self: HttpClient.With<E, R>) => HttpClient.With<E, R>
2484
2500
  /**
2485
- * Adds a `Ref` of cookies to the client for handling cookies across requests.
2501
+ * Adds a `Ref` of stored cookies to the client for handling cookies across
2502
+ * requests.
2486
2503
  *
2487
2504
  * **When to use**
2488
2505
  *
2489
2506
  * Use to add shared cookie storage to a client so response cookies are retained
2490
- * and sent by later requests.
2507
+ * and sent by later requests to a matching host, path, and scheme.
2508
+ *
2509
+ * **Details**
2510
+ *
2511
+ * Response cookies are merged into the ref with `Cookies.mergeIntoArray` for
2512
+ * the response URL. Before each request, `Cookies.toRequestCookieHeader` selects
2513
+ * the cookies for the request URL and sets them as the `cookie` header. Expiry
2514
+ * uses the current `Clock`.
2491
2515
  *
2492
2516
  * @stability unstable
2493
2517
  * @category cookies
2494
2518
  * @since 4.0.0
2495
2519
  */
2496
- <E, R>(self: HttpClient.With<E, R>, ref: Ref.Ref<Cookies.Cookies>): HttpClient.With<E, R>
2520
+ <E, R>(self: HttpClient.With<E, R>, ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>): HttpClient.With<E, R>
2497
2521
  } = dual(
2498
2522
  2,
2499
2523
  <E, R>(
2500
2524
  self: HttpClient.With<E, R>,
2501
- ref: Ref.Ref<Cookies.Cookies>
2525
+ ref: Ref.Ref<ReadonlyArray<Cookies.Cookie>>
2502
2526
  ): HttpClient.With<E, R> =>
2503
2527
  makeWith(
2504
2528
  (request: Effect.Effect<HttpClientRequest.HttpClientRequest, E, R>) =>
2505
- Effect.tap(
2506
- self.postprocess(request),
2507
- (response) => Ref.update(ref, (cookies) => Cookies.merge(cookies, response.cookies))
2508
- ),
2529
+ Effect.tap(self.postprocess(request), (response) => {
2530
+ const now = Fiber.getCurrent()!.getRef(Clock).currentTimeMillisUnsafe()
2531
+ return Ref.update(ref, Cookies.mergeIntoArray(response.url, response.cookies, now))
2532
+ }),
2509
2533
  (request) =>
2510
2534
  Effect.flatMap(self.preprocess(request), (request) =>
2511
- Effect.map(
2512
- Ref.get(ref),
2513
- (cookies) =>
2514
- Cookies.isEmpty(cookies)
2515
- ? request
2516
- : HttpClientRequest.setHeader(request, "cookie", Cookies.toCookieHeader(cookies))
2517
- ))
2535
+ Effect.map(Ref.get(ref), (cookies) => {
2536
+ const now = Fiber.getCurrent()!.getRef(Clock).currentTimeMillisUnsafe()
2537
+ const header = Cookies.toRequestCookieHeader(cookies, request.url, now)
2538
+ return header === undefined ? request : HttpClientRequest.setHeader(request, "cookie", header)
2539
+ }))
2518
2540
  )
2519
2541
  )
2520
2542
 
@@ -2980,7 +3002,38 @@ class InterruptibleResponse implements HttpClientResponse.HttpClientResponse, Pi
2980
3002
  }
2981
3003
  }
2982
3004
 
2983
- const isTransientError = (error: unknown) => Cause.isTimeoutError(error) || isTransientHttpError(error)
3005
+ /**
3006
+ * Returns `true` for an error that `retryTransient` retries by default: a
3007
+ * timeout, a transport error, or a status code error with a transient response.
3008
+ *
3009
+ * **When to use**
3010
+ *
3011
+ * Use to classify failures the same way `retryTransient` does, for example in a
3012
+ * custom retry policy or a circuit breaker.
3013
+ *
3014
+ * **Example** (Classifying client errors)
3015
+ *
3016
+ * ```ts import.meta.vitest
3017
+ * import { Cause } from "effect"
3018
+ * import { HttpClient, HttpClientError, HttpClientRequest } from "effect/http"
3019
+ *
3020
+ * const request = HttpClientRequest.get("https://example.com")
3021
+ * const transportError = new HttpClientError.HttpClientError({
3022
+ * reason: new HttpClientError.TransportError({ request })
3023
+ * })
3024
+ *
3025
+ * HttpClient.isTransientError(transportError) // => true
3026
+ * HttpClient.isTransientError(new Cause.TimeoutError()) // => true
3027
+ * HttpClient.isTransientError(new Error("boom")) // => false
3028
+ * ```
3029
+ *
3030
+ * @see {@link isTransientResponse} for the response statuses it accepts
3031
+ * @see {@link retryTransient} for the retry policy that uses it
3032
+ * @stability unstable
3033
+ * @category predicates
3034
+ * @since 4.1.0
3035
+ */
3036
+ export const isTransientError = (error: unknown): boolean => Cause.isTimeoutError(error) || isTransientHttpError(error)
2984
3037
 
2985
3038
  const isTransientHttpError = (error: unknown) =>
2986
3039
  Error.isHttpClientError(error) &&
@@ -3014,7 +3067,21 @@ const isTooManyRequestsHttpClientError = (
3014
3067
  ): error is Error.HttpClientError & { readonly reason: Error.StatusCodeError } =>
3015
3068
  Error.isHttpClientError(error) && error.reason._tag === "StatusCodeError" && error.reason.response.status === 429
3016
3069
 
3017
- const isTransientResponse = (response: HttpClientResponse.HttpClientResponse) =>
3070
+ /**
3071
+ * Returns `true` for a response whose status `retryTransient` retries by
3072
+ * default: 408, 429, 500, 502, 503 or 504.
3073
+ *
3074
+ * **When to use**
3075
+ *
3076
+ * Use to retry the same responses as `retryTransient` in a custom retry policy.
3077
+ *
3078
+ * @see {@link isTransientError} for the matching error predicate
3079
+ * @see {@link retryTransient} for the retry policy that uses it
3080
+ * @stability unstable
3081
+ * @category predicates
3082
+ * @since 4.1.0
3083
+ */
3084
+ export const isTransientResponse = (response: HttpClientResponse.HttpClientResponse): boolean =>
3018
3085
  response.status === 408 ||
3019
3086
  response.status === 429 ||
3020
3087
  response.status === 500 ||
@@ -56,7 +56,11 @@ export const isHttpClientRequest = (u: unknown): u is HttpClientRequest => hasPr
56
56
  */
57
57
  export interface HttpClientRequest extends Inspectable.Inspectable, Pipeable {
58
58
  readonly [TypeId]: typeof TypeId
59
- readonly method: HttpMethod
59
+ /**
60
+ * The request method, which may be a method outside the known `HttpMethod`
61
+ * literals when the request was converted from a Web or server request.
62
+ */
63
+ readonly method: string
60
64
  readonly url: string
61
65
  readonly urlParams: UrlParams.UrlParams
62
66
  readonly hash: Option.Option<string>
@@ -126,7 +130,7 @@ const Proto = {
126
130
  * @since 4.0.0
127
131
  */
128
132
  export function makeWith(
129
- method: HttpMethod,
133
+ method: string,
130
134
  url: string,
131
135
  urlParams: UrlParams.Input,
132
136
  hash: Option.Option<string>,
@@ -1171,7 +1175,7 @@ export interface CompressionOptions {
1171
1175
  * `Content-Length`. The compressed body does not retain the original lazy text.
1172
1176
  * Stream bodies are compressed lazily and have their content length removed.
1173
1177
  * They still require a client runtime that supports streaming request bodies
1174
- * (Fetch requires `duplex: "half"`, which Safari and Firefox do not support).
1178
+ * (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
1175
1179
  *
1176
1180
  * Returns the original request unchanged for empty, FormData, and raw bodies,
1177
1181
  * bodies with a known length below `options.minSize`, or requests with any
@@ -1203,7 +1207,7 @@ export const compressBody: {
1203
1207
  * `Content-Length`. The compressed body does not retain the original lazy text.
1204
1208
  * Stream bodies are compressed lazily and have their content length removed.
1205
1209
  * They still require a client runtime that supports streaming request bodies
1206
- * (Fetch requires `duplex: "half"`, which Safari and Firefox do not support).
1210
+ * (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
1207
1211
  *
1208
1212
  * Returns the original request unchanged for empty, FormData, and raw bodies,
1209
1213
  * bodies with a known length below `options.minSize`, or requests with any
@@ -1235,7 +1239,7 @@ export const compressBody: {
1235
1239
  * `Content-Length`. The compressed body does not retain the original lazy text.
1236
1240
  * Stream bodies are compressed lazily and have their content length removed.
1237
1241
  * They still require a client runtime that supports streaming request bodies
1238
- * (Fetch requires `duplex: "half"`, which Safari and Firefox do not support).
1242
+ * (stable Safari and Firefox do not; see `FetchHttpClient.StreamBodyFallback`).
1239
1243
  *
1240
1244
  * Returns the original request unchanged for empty, FormData, and raw bodies,
1241
1245
  * bodies with a known length below `options.minSize`, or requests with any
@@ -1694,16 +1698,15 @@ export function toUrl(self: HttpClientRequest): Option.Option<URL> {
1694
1698
  * @since 4.0.0
1695
1699
  */
1696
1700
  export const fromWeb = (request: globalThis.Request): HttpClientRequest => {
1697
- const method = request.method.toUpperCase() as HttpMethod
1698
- return modify(empty, {
1699
- method,
1701
+ const method = request.method.toUpperCase()
1702
+ return modify(makeWith(method, "", UrlParams.empty, Option.none(), Headers.empty, HttpBody.empty), {
1700
1703
  url: new URL(request.url),
1701
1704
  headers: request.headers,
1702
1705
  body: fromWebBody(request, method)
1703
1706
  })
1704
1707
  }
1705
1708
 
1706
- const fromWebBody = (request: globalThis.Request, method: HttpMethod): HttpBody.HttpBody => {
1709
+ const fromWebBody = (request: globalThis.Request, method: string): HttpBody.HttpBody => {
1707
1710
  if (!hasBody(method) || request.body === null) {
1708
1711
  return HttpBody.empty
1709
1712
  }