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
@@ -25,6 +25,7 @@ import * as Headers from "./Headers.ts"
25
25
  import * as Error from "./HttpClientError.ts"
26
26
  import * as HttpClientRequest from "./HttpClientRequest.ts"
27
27
  import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
28
+ import * as internalUrlParams from "./internal/urlParams.ts"
28
29
  import { getWebSource, WebSourceSymbol } from "./internal/webResponse.ts"
29
30
  import * as UrlParams from "./UrlParams.ts"
30
31
 
@@ -454,9 +455,9 @@ class WebHttpClientResponse extends Inspectable.Class implements HttpClientRespo
454
455
  }
455
456
 
456
457
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, Error.HttpClientError> {
457
- return Effect.flatMap(this.text, (_) =>
458
+ return Effect.flatMap(this.arrayBuffer, (bytes) =>
458
459
  Effect.try({
459
- try: () => UrlParams.fromInput(new URLSearchParams(_)),
460
+ try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
460
461
  catch: (cause) =>
461
462
  new Error.HttpClientError({
462
463
  reason: new Error.DecodeError({
@@ -57,12 +57,20 @@ export declare namespace HttpMethod {
57
57
  /**
58
58
  * Returns `true` when a method can carry a request body and narrows it to `HttpMethod.WithBody`.
59
59
  *
60
+ * **Details**
61
+ *
62
+ * Methods outside the known `HttpMethod` literals, such as a received
63
+ * `"PROPFIND"`, are treated as capable of carrying a body but are not narrowed.
64
+ *
60
65
  * @stability unstable
61
66
  * @category guards
62
67
  * @since 4.0.0
63
68
  */
64
- export const hasBody = (method: HttpMethod): method is HttpMethod.WithBody =>
65
- method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE"
69
+ export function hasBody(method: HttpMethod): method is HttpMethod.WithBody
70
+ export function hasBody(method: string): boolean
71
+ export function hasBody(method: string): boolean {
72
+ return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE"
73
+ }
66
74
 
67
75
  /**
68
76
  * Provides a readonly set containing every supported `HttpMethod` literal.
@@ -32,10 +32,11 @@ import * as Headers from "./Headers.ts"
32
32
  import * as HttpBody from "./HttpBody.ts"
33
33
  import * as HttpClientRequest from "./HttpClientRequest.ts"
34
34
  import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
35
- import { hasBody, type HttpMethod } from "./HttpMethod.ts"
35
+ import { hasBody } from "./HttpMethod.ts"
36
36
  import { HttpServerError, type RequestError, RequestParseError } from "./HttpServerError.ts"
37
37
  import * as bodyInternal from "./internal/httpBody.ts"
38
38
  import * as lazyStream from "./internal/lazyStream.ts"
39
+ import * as internalUrlParams from "./internal/urlParams.ts"
39
40
  import * as Multipart from "./Multipart.ts"
40
41
  import * as UrlParams from "./UrlParams.ts"
41
42
 
@@ -90,7 +91,11 @@ export interface HttpServerRequest extends HttpIncomingMessage.HttpIncomingMessa
90
91
  readonly source: object
91
92
  readonly url: string
92
93
  readonly originalUrl: string
93
- readonly method: HttpMethod
94
+ /**
95
+ * The uppercase request method as received, which may be a method outside
96
+ * the known `HttpMethod` literals (for example `"PROPFIND"`).
97
+ */
98
+ readonly method: string
94
99
  readonly cookies: ReadonlyRecord<string, string>
95
100
 
96
101
  readonly multipart: Effect.Effect<
@@ -563,8 +568,8 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
563
568
  options.protocol ?? this.protocol
564
569
  )
565
570
  }
566
- get method(): HttpMethod {
567
- return this.source.method.toUpperCase() as HttpMethod
571
+ get method(): string {
572
+ return this.source.method.toUpperCase()
568
573
  }
569
574
  get originalUrl() {
570
575
  return this.source.url
@@ -612,27 +617,7 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
612
617
 
613
618
  private textEffect: Effect.Effect<string, HttpServerError> | undefined
614
619
  get text(): Effect.Effect<string, HttpServerError> {
615
- if (this.textEffect) {
616
- return this.textEffect
617
- }
618
- this.textEffect = Effect.withFiber((fiber) =>
619
- fiber.getRef(HttpIncomingMessage.MaxBodySize) === undefined
620
- ? Effect.tryPromise({
621
- try: () => this.source.text(),
622
- catch: (cause) =>
623
- new HttpServerError({
624
- reason: new RequestParseError({
625
- request: this,
626
- cause
627
- })
628
- })
629
- })
630
- : Effect.map(this.arrayBuffer, (buffer) => textDecoder.decode(buffer))
631
- ).pipe(
632
- Effect.cached,
633
- Effect.runSync
634
- )
635
- return this.textEffect
620
+ return this.textEffect ??= Effect.map(this.arrayBuffer, (buffer) => textDecoder.decode(buffer))
636
621
  }
637
622
 
638
623
  get json(): Effect.Effect<Schema.Json, HttpServerError> {
@@ -650,9 +635,9 @@ class ServerRequestImpl extends Inspectable.Class implements HttpServerRequest {
650
635
  }
651
636
 
652
637
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
653
- return Effect.flatMap(this.text, (_) =>
638
+ return Effect.flatMap(this.arrayBuffer, (bytes) =>
654
639
  Effect.try({
655
- try: () => UrlParams.fromInput(new URLSearchParams(_)),
640
+ try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
656
641
  catch: (cause) =>
657
642
  new HttpServerError({
658
643
  reason: new RequestParseError({
@@ -797,7 +782,7 @@ class ClientRequestImpl extends Inspectable.Class implements HttpServerRequest {
797
782
  )
798
783
  }
799
784
 
800
- get method(): HttpMethod {
785
+ get method(): string {
801
786
  return this.source.method
802
787
  }
803
788
 
@@ -892,9 +877,9 @@ class ClientRequestImpl extends Inspectable.Class implements HttpServerRequest {
892
877
  }
893
878
 
894
879
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
895
- return Effect.flatMap(this.text, (_) =>
880
+ return Effect.flatMap(this.bytes, (bytes) =>
896
881
  Effect.try({
897
- try: () => UrlParams.fromInput(new URLSearchParams(_)),
882
+ try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
898
883
  catch: (cause) => requestParseError(this, undefined, cause)
899
884
  }))
900
885
  }
@@ -38,6 +38,7 @@ import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
38
38
  import type { HttpPlatform } from "./HttpPlatform.ts"
39
39
  import * as headersInternal from "./internal/headers.ts"
40
40
  import * as bodyInternal from "./internal/httpBody.ts"
41
+ import * as internalUrlParams from "./internal/urlParams.ts"
41
42
  import * as Template from "./Template.ts"
42
43
  import * as UrlParams from "./UrlParams.ts"
43
44
 
@@ -1653,9 +1654,9 @@ class ServerHttpClientResponse extends Inspectable.Class implements HttpClientRe
1653
1654
  }
1654
1655
 
1655
1656
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpClientError.HttpClientError> {
1656
- return Effect.flatMap(this.text, (_) =>
1657
+ return Effect.flatMap(this.bytes, (bytes) =>
1657
1658
  Effect.try({
1658
- try: () => UrlParams.fromInput(new URLSearchParams(_)),
1659
+ try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
1659
1660
  catch: (cause) =>
1660
1661
  new HttpClientError.HttpClientError({
1661
1662
  reason: new HttpClientError.DecodeError({
@@ -130,10 +130,11 @@ export const xb3: FromHeaders = (headers) => {
130
130
  }))
131
131
  }
132
132
 
133
- const w3cTraceId = /^[0-9a-f]{32}$/i
134
- const w3cSpanId = /^[0-9a-f]{16}$/i
133
+ const w3cTraceId = /^[0-9a-f]{32}$/
134
+ const w3cSpanId = /^[0-9a-f]{16}$/
135
+ const w3cTraceFlags = /^[0-9a-f]{2}$/
135
136
 
136
- const b3TraceId = /^(?:[0-9a-f]{16}|[0-9a-f]{32})$/i
137
+ const b3TraceId = /^(?:[0-9a-f]{16}|[0-9a-f]{32})$/
137
138
  const isB3Ids = (traceId: string, spanId: string): boolean => b3TraceId.test(traceId) && w3cSpanId.test(spanId)
138
139
 
139
140
  /**
@@ -141,7 +142,8 @@ const isB3Ids = (traceId: string, spanId: string): boolean => b3TraceId.test(tra
141
142
  *
142
143
  * **Details**
143
144
  *
144
- * Only version `00` headers with valid trace and span identifiers are accepted.
145
+ * Only version `00` headers with valid trace and span identifiers and trace
146
+ * flags are accepted.
145
147
  *
146
148
  * @stability unstable
147
149
  * @category decoding
@@ -160,6 +162,7 @@ export const w3c: FromHeaders = (headers) => {
160
162
  case "00": {
161
163
  if (
162
164
  w3cTraceId.test(traceId) === false || w3cSpanId.test(spanId) === false ||
165
+ w3cTraceFlags.test(flags) === false ||
163
166
  traceId === "00000000000000000000000000000000" || spanId === "0000000000000000"
164
167
  ) {
165
168
  return Option.none()
@@ -0,0 +1,149 @@
1
+ /**
2
+ * RFC 9457 Problem Details values for HTTP responses.
3
+ *
4
+ * A problem details object is the `application/problem+json` body a server
5
+ * sends to describe an error. This module provides the reusable value shape,
6
+ * a lenient codec that follows the parsing rules of RFC 9457, and a response
7
+ * constructor. The `effect/http-api` modules build typed problem declarations,
8
+ * built-in error rendering and OpenAPI output on top of it.
9
+ *
10
+ * @stability unstable
11
+ * @since 4.0.6
12
+ */
13
+ import * as Effect from "../Effect.ts"
14
+ import * as Schema_ from "../Schema.ts"
15
+ import * as HttpServerResponse from "./HttpServerResponse.ts"
16
+
17
+ /**
18
+ * The media type of a problem details response body.
19
+ *
20
+ * @stability unstable
21
+ * @category constants
22
+ * @since 4.0.6
23
+ */
24
+ export const contentType = "application/problem+json"
25
+
26
+ /**
27
+ * The problem type URI RFC 9457 assigns to problems that only carry an HTTP
28
+ * status.
29
+ *
30
+ * @stability unstable
31
+ * @category constants
32
+ * @since 4.0.6
33
+ */
34
+ export const blankType = "about:blank"
35
+
36
+ /**
37
+ * A decoded RFC 9457 problem details object.
38
+ *
39
+ * **Details**
40
+ *
41
+ * The standard members are `type`, `status`, `title`, `detail` and
42
+ * `instance`. Any other member is an extension and is kept as-is.
43
+ *
44
+ * @stability unstable
45
+ * @category models
46
+ * @since 4.0.6
47
+ */
48
+ export interface ProblemDetails {
49
+ readonly type: string
50
+ readonly status?: number
51
+ readonly title?: string
52
+ readonly detail?: string
53
+ readonly instance?: string
54
+ readonly [extension: string]: unknown
55
+ }
56
+
57
+ /**
58
+ * The encoded form of a problem details object, where `type` may be omitted.
59
+ *
60
+ * @stability unstable
61
+ * @category models
62
+ * @since 4.0.6
63
+ */
64
+ export interface ProblemDetailsEncoded {
65
+ readonly type?: string
66
+ readonly status?: number
67
+ readonly title?: string
68
+ readonly detail?: string
69
+ readonly instance?: string
70
+ readonly [extension: string]: unknown
71
+ }
72
+
73
+ /**
74
+ * A standard member that is dropped when it is missing or has the wrong JSON
75
+ * type, as RFC 9457 section 3.1 requires.
76
+ *
77
+ * @internal
78
+ */
79
+ export const optionalMember = <S extends Schema_.Constraint>(schema: S) =>
80
+ Schema_.optionalKey(schema).pipe(Schema_.catchDecoding(() => Effect.succeedNone))
81
+
82
+ const withFallback = <S extends Schema_.Constraint>(
83
+ schema: S,
84
+ value: S["Encoded"] & S["Type"]
85
+ ): Schema_.middlewareDecoding<Schema_.withDecodingDefaultKey<S>, S["DecodingServices"]> =>
86
+ Schema_.withDecodingDefaultKey<S>(Effect.succeed(value))(schema).pipe(
87
+ Schema_.catchDecoding(() => Effect.succeedSome(value))
88
+ )
89
+
90
+ /**
91
+ * A required member that decodes to a fixed value when it is missing or has
92
+ * the wrong JSON type. The value is also the constructor default.
93
+ *
94
+ * @internal
95
+ */
96
+ export const fixedMember = <const L extends string | number>(value: L) => withFallback(Schema_.tag(value), value)
97
+
98
+ /**
99
+ * The lenient codec for problem details objects.
100
+ *
101
+ * **Details**
102
+ *
103
+ * Decoding follows RFC 9457: a missing `type` defaults to `about:blank`,
104
+ * standard members with the wrong JSON type are ignored, and unknown members
105
+ * are kept as extensions. Encoding always emits `type`.
106
+ *
107
+ * **Example** (Decoding a problem with an extension)
108
+ *
109
+ * ```ts import.meta.vitest
110
+ * import { Schema } from "effect"
111
+ * import { ProblemDetails } from "effect/http"
112
+ *
113
+ * const problem = Schema.decodeUnknownSync(ProblemDetails.Schema)({
114
+ * status: 404,
115
+ * detail: "No such user",
116
+ * traceId: "abc-123"
117
+ * })
118
+ * problem // => { type: "about:blank", status: 404, detail: "No such user", traceId: "abc-123" }
119
+ * ```
120
+ *
121
+ * @stability unstable
122
+ * @category schemas
123
+ * @since 4.0.6
124
+ */
125
+ export const Schema: Schema_.Codec<ProblemDetails, ProblemDetailsEncoded> = Schema_.StructWithRest(
126
+ Schema_.Struct({
127
+ type: withFallback(Schema_.String, blankType),
128
+ status: optionalMember(Schema_.Number),
129
+ title: optionalMember(Schema_.String),
130
+ detail: optionalMember(Schema_.String),
131
+ instance: optionalMember(Schema_.String)
132
+ }),
133
+ [Schema_.Record(Schema_.String, Schema_.Unknown)]
134
+ )
135
+
136
+ /**
137
+ * Renders a problem details object as an `application/problem+json` response.
138
+ *
139
+ * **Details**
140
+ *
141
+ * The response status is the problem's `status` member, or `500` when it is
142
+ * absent.
143
+ *
144
+ * @stability unstable
145
+ * @category constructors
146
+ * @since 4.0.6
147
+ */
148
+ export const toResponse = (problem: ProblemDetails): HttpServerResponse.HttpServerResponse =>
149
+ HttpServerResponse.jsonUnsafe(problem, { status: problem.status ?? 500, contentType })
package/src/http/index.ts CHANGED
@@ -167,6 +167,12 @@ export * as Multipart from "./Multipart.ts"
167
167
  */
168
168
  export * as MultipartParser from "./MultipartParser.ts"
169
169
 
170
+ /**
171
+ * @stability unstable
172
+ * @since 4.0.6
173
+ */
174
+ export * as ProblemDetails from "./ProblemDetails.ts"
175
+
170
176
  /**
171
177
  * @stability unstable
172
178
  * @since 4.0.0
@@ -8,12 +8,12 @@ import type * as Socket from "../../socket/Socket.ts"
8
8
  import * as Stream from "../../Stream.ts"
9
9
  import * as Headers from "../Headers.ts"
10
10
  import * as HttpIncomingMessage from "../HttpIncomingMessage.ts"
11
- import type { HttpMethod } from "../HttpMethod.ts"
12
11
  import { HttpServerError, RequestParseError } from "../HttpServerError.ts"
13
12
  import * as HttpServerRequest from "../HttpServerRequest.ts"
14
13
  import * as Multipart from "../Multipart.ts"
15
14
  import * as UrlParams from "../UrlParams.ts"
16
15
  import * as lazyStream from "./lazyStream.ts"
16
+ import * as internalUrlParams from "./urlParams.ts"
17
17
 
18
18
  /**
19
19
  * @internal
@@ -100,7 +100,7 @@ export class DecompressedRequest extends Inspectable.Class implements HttpServer
100
100
  return this.inner.originalUrl
101
101
  }
102
102
 
103
- get method(): HttpMethod {
103
+ get method(): string {
104
104
  return this.inner.method
105
105
  }
106
106
 
@@ -188,9 +188,9 @@ export class DecompressedRequest extends Inspectable.Class implements HttpServer
188
188
  }
189
189
 
190
190
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, HttpServerError> {
191
- return Effect.flatMap(this.text, (text) =>
191
+ return Effect.flatMap(this.bytes, (bytes) =>
192
192
  Effect.try({
193
- try: () => UrlParams.fromInput(new URLSearchParams(text)),
193
+ try: () => UrlParams.fromInput(internalUrlParams.fromBody(bytes)),
194
194
  catch: (cause) => this.parseError(cause)
195
195
  }))
196
196
  }
@@ -18,6 +18,14 @@ export const stripSearchAndHash = (url: string): string => {
18
18
  return url.slice(0, Math.min(queryIndex, hashIndex))
19
19
  }
20
20
 
21
+ // URL-encoded bodies keep a leading U+FEFF as form data
22
+ const bodyDecoder = new TextDecoder("utf-8", { ignoreBOM: true })
23
+
24
+ /** @internal */
25
+ export const fromBody = (bytes: ArrayBuffer | Uint8Array): URLSearchParams =>
26
+ // A leading "?" is form data; URLSearchParams would drop it as a query prefix.
27
+ new URLSearchParams(bodyDecoder.decode(bytes).replace(/^\?/, "%3F"))
28
+
21
29
  const originForm = /^\/(?![/\\])/
22
30
 
23
31
  /** @internal */
@@ -957,6 +957,8 @@ function handlerToHttpEffect(
957
957
  const encodeStream = makeStreamEncoder(endpoint, options.success)
958
958
  const encodeWithHeaders = makeWithHeadersEncoder(endpoint, options.success, options.headers)
959
959
  const upgrade = getUpgradeSuccessSchema(endpoint)
960
+ // The handler of a mixed endpoint may decline the upgrade and return one of the other successes.
961
+ const upgradeOnly = upgrade !== undefined && endpoint.success.size === 1
960
962
  const encodeUpgradeHeaders = UndefinedOr.map(
961
963
  upgrade?.headers,
962
964
  (schema) => Schema.encodeUnknownEffect(schema, options.headers)
@@ -989,19 +991,23 @@ function handlerToHttpEffect(
989
991
  if (decodeQuery) {
990
992
  request.query = yield* HttpApiSchemaError.wrap("Query", decodeQuery(query))
991
993
  }
994
+ let upgraded = false
992
995
  if (upgrade !== undefined) {
993
996
  if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
994
997
  return upgradeRequired(upgrade.protocol)
995
998
  }
996
999
  request.upgrade = (options?: { readonly headers?: unknown }) =>
997
- Effect.orDie(
998
- encodeUpgradeHeaders === undefined
999
- ? httpRequest.upgrade
1000
- : Effect.flatMap(
1001
- HttpApiSchemaError.wrap("ResponseHeaders", encodeUpgradeHeaders(options?.headers)),
1002
- (headers) => httpRequest.upgradeWith({ headers: headers as Record<string, string> })
1003
- )
1004
- )
1000
+ Effect.suspend(() => {
1001
+ upgraded = true
1002
+ return Effect.orDie(
1003
+ encodeUpgradeHeaders === undefined
1004
+ ? httpRequest.upgrade
1005
+ : Effect.flatMap(
1006
+ HttpApiSchemaError.wrap("ResponseHeaders", encodeUpgradeHeaders(options?.headers)),
1007
+ (headers) => httpRequest.upgradeWith({ headers: headers as Record<string, string> })
1008
+ )
1009
+ )
1010
+ })
1005
1011
  }
1006
1012
  if (payloadBy) {
1007
1013
  const result = decodePayload(payloadBy, httpRequest, query)
@@ -1016,7 +1022,10 @@ function handlerToHttpEffect(
1016
1022
  if (Response.isHttpServerResponse(response)) {
1017
1023
  return response
1018
1024
  }
1019
- if (upgrade !== undefined) {
1025
+ if (upgradeOnly || upgraded) {
1026
+ if (response !== undefined && !upgradeOnly) {
1027
+ return yield* Effect.die(new Error("Cannot return a success value after calling upgrade()"))
1028
+ }
1020
1029
  // The server replaces this with the 101 once the connection is upgraded.
1021
1030
  return Response.empty()
1022
1031
  }
@@ -1367,9 +1376,12 @@ function makeSuccessSchema(
1367
1376
  endpoint: HttpApiEndpoint.Top,
1368
1377
  headersOptions: SchemaAST.ParseOptions | undefined
1369
1378
  ): Schema.ConstraintEncoder<HttpServerResponse, unknown> {
1370
- const schemas = HttpApiEndpoint.getSuccessSchemas(endpoint).map((schema) =>
1371
- toResponseSuccessSchema(schema, headersOptions)
1372
- )
1379
+ const schemas: Array<Schema.ConstraintEncoder<HttpServerResponse, unknown>> = []
1380
+ for (const schema of HttpApiEndpoint.getSuccessSchemas(endpoint)) {
1381
+ // The 101 is written by the transport, so the upgrade has no response encoder.
1382
+ if (HttpApiSchema.isUpgrade(schema)) continue
1383
+ schemas.push(toResponseSuccessSchema(schema, headersOptions))
1384
+ }
1373
1385
  return schemas.length === 1 ? schemas[0] : Schema.Union(schemas)
1374
1386
  }
1375
1387
 
@@ -106,6 +106,24 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
106
106
  : S extends Schema.Constraint ? S["Type"]
107
107
  : never
108
108
 
109
+ /**
110
+ * Runtime brand key used to mark `Upgraded` values.
111
+ *
112
+ * @stability unstable
113
+ * @category type IDs
114
+ * @since 4.1.0
115
+ */
116
+ export const UpgradedTypeId = "~effect/http-api/HttpApiClient/Upgraded"
117
+
118
+ /**
119
+ * Type-level brand identifier used by `Upgraded` values.
120
+ *
121
+ * @stability unstable
122
+ * @category type IDs
123
+ * @since 4.1.0
124
+ */
125
+ export type UpgradedTypeId = typeof UpgradedTypeId
126
+
109
127
  /**
110
128
  * The value a client method returns for an endpoint declared with
111
129
  * `HttpApiSchema.Upgrade`: the headers of the `101 Switching Protocols`
@@ -117,15 +135,63 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
117
135
  * one. See `HttpClientResponse.upgrade` for how the connection behaves and
118
136
  * when it closes.
119
137
  *
138
+ * When the endpoint also declares ordinary success responses, the method
139
+ * returns either an `Upgraded` value or the decoded ordinary success. Use
140
+ * {@link isUpgraded} to tell them apart.
141
+ *
120
142
  * @stability unstable
121
143
  * @category models
122
144
  * @since 4.0.6
123
145
  */
124
146
  export interface Upgraded<Headers = Headers.Headers> {
147
+ readonly [UpgradedTypeId]: UpgradedTypeId
125
148
  readonly headers: Headers
126
149
  readonly socket: Socket.Socket
127
150
  }
128
151
 
152
+ /**
153
+ * Returns `true` when a client method result is an upgraded connection.
154
+ *
155
+ * **Details**
156
+ *
157
+ * An endpoint may declare `HttpApiSchema.Upgrade` alongside ordinary success
158
+ * responses, because a server can decline an upgrade (RFC 9110 §7.8). The
159
+ * client method then returns either an `Upgraded` value or the decoded
160
+ * ordinary success, depending on the response status. This predicate narrows
161
+ * that union.
162
+ *
163
+ * **Example** (Handling a declined upgrade)
164
+ *
165
+ * ```ts
166
+ * import { Effect, Schema } from "effect"
167
+ * import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/http-api"
168
+ *
169
+ * const Api = HttpApi.make("docker").add(
170
+ * HttpApiGroup.make("exec").add(
171
+ * HttpApiEndpoint.post("start", "/exec/:id/start", {
172
+ * params: { id: Schema.String },
173
+ * payload: Schema.Struct({ Detach: Schema.Boolean }),
174
+ * success: [HttpApiSchema.Upgrade({ protocol: "tcp" }), HttpApiSchema.Empty(200)]
175
+ * })
176
+ * )
177
+ * )
178
+ *
179
+ * const program = Effect.gen(function*() {
180
+ * const client = yield* HttpApiClient.make(Api)
181
+ * const result = yield* client.exec.start({ params: { id: "abc" }, payload: { Detach: false } })
182
+ * if (HttpApiClient.isUpgraded(result)) {
183
+ * const writer = yield* result.socket.writer
184
+ * yield* writer.write("ls\n")
185
+ * }
186
+ * })
187
+ * ```
188
+ *
189
+ * @stability unstable
190
+ * @category guards
191
+ * @since 4.1.0
192
+ */
193
+ export const isUpgraded = (u: unknown): u is Upgraded<unknown> => Predicate.hasProperty(u, UpgradedTypeId)
194
+
129
195
  type SuccessDecodingServices<S> = S extends HttpApiSchema.StreamSse<
130
196
  infer _Events,
131
197
  infer _Error,
@@ -1041,7 +1107,7 @@ const makeEndpointDecoder = (options: {
1041
1107
  Effect.uninterruptibleMask((restore) =>
1042
1108
  Effect.flatMap(response.upgrade, (socket) =>
1043
1109
  restore(decodeHeaders(response.headers)).pipe(
1044
- Effect.map((headers): Upgraded<unknown> => ({ headers, socket })),
1110
+ Effect.map((headers): Upgraded<unknown> => ({ [UpgradedTypeId]: UpgradedTypeId, headers, socket })),
1045
1111
  // nothing takes the connection on failure, so close it: releasing
1046
1112
  // the reader's scope closes the connection
1047
1113
  Effect.onError(() => Effect.ignore(Effect.scoped(socket.reader)))
@@ -1440,10 +1440,12 @@ function getErrorResponse(
1440
1440
  }
1441
1441
 
1442
1442
  function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, method: HttpMethod, payload: PayloadMap) {
1443
- if (schemas.some(HttpApiSchema.isUpgrade)) {
1444
- if (schemas.length > 1) {
1445
- throw new Error("Cannot combine an upgrade with other success responses")
1446
- }
1443
+ const upgrades = schemas.filter(HttpApiSchema.isUpgrade)
1444
+ if (upgrades.length > 1) {
1445
+ throw new Error("Cannot declare more than one upgrade")
1446
+ }
1447
+ const hasUpgrade = upgrades.length === 1
1448
+ if (hasUpgrade) {
1447
1449
  if (method === "HEAD") {
1448
1450
  throw new Error("HEAD endpoints cannot declare an upgrade")
1449
1451
  }
@@ -1453,7 +1455,6 @@ function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, meth
1453
1455
  throw new Error("Upgrade endpoints cannot declare a streaming payload")
1454
1456
  }
1455
1457
  }
1456
- return
1457
1458
  }
1458
1459
  let hasStream = false
1459
1460
  const statuses = new Map<number, {
@@ -1463,9 +1464,17 @@ function validateSuccessResponse(schemas: ReadonlyArray<Schema.Constraint>, meth
1463
1464
  }>()
1464
1465
 
1465
1466
  for (const schema of schemas) {
1467
+ // The server may decline the upgrade (RFC 9110 §7.8) and answer with one of the other successes.
1468
+ if (HttpApiSchema.isUpgrade(schema)) continue
1466
1469
  const inner = HttpApiSchema.isWithHeaders(schema) ? schema.schema : schema
1467
1470
  const status = HttpApiSchema.getStatusSuccessSchema(schema)
1471
+ if (hasUpgrade && status === 101) {
1472
+ throw new Error("Cannot combine an upgrade with another success response for status: 101")
1473
+ }
1468
1474
  if (HttpApiSchema.isStreamSchema(inner)) {
1475
+ if (hasUpgrade) {
1476
+ throw new Error("Cannot combine an upgrade with a streaming success response")
1477
+ }
1469
1478
  validateStreamSuccess(inner, method)
1470
1479
  if (hasStream) {
1471
1480
  throw new Error("Multiple streaming success responses are not supported")