effect 4.0.6 → 4.0.7

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 (480) hide show
  1. package/dist/Arbitrary.d.ts +10 -2
  2. package/dist/Arbitrary.d.ts.map +1 -1
  3. package/dist/Arbitrary.js +2 -1
  4. package/dist/Arbitrary.js.map +1 -1
  5. package/dist/Channel.d.ts.map +1 -1
  6. package/dist/Channel.js +21 -6
  7. package/dist/Channel.js.map +1 -1
  8. package/dist/Data.d.ts +54 -235
  9. package/dist/Data.d.ts.map +1 -1
  10. package/dist/Data.js.map +1 -1
  11. package/dist/Effect.d.ts +1 -1
  12. package/dist/Effect.js +1 -1
  13. package/dist/Equal.d.ts.map +1 -1
  14. package/dist/Equal.js +8 -1
  15. package/dist/Equal.js.map +1 -1
  16. package/dist/Exit.d.ts +3 -3
  17. package/dist/Exit.d.ts.map +1 -1
  18. package/dist/Exit.js.map +1 -1
  19. package/dist/Formatter.d.ts.map +1 -1
  20. package/dist/Formatter.js +27 -13
  21. package/dist/Formatter.js.map +1 -1
  22. package/dist/Hash.d.ts.map +1 -1
  23. package/dist/Hash.js +4 -1
  24. package/dist/Hash.js.map +1 -1
  25. package/dist/JsonPatch.js +4 -0
  26. package/dist/JsonPatch.js.map +1 -1
  27. package/dist/JsonSchema.d.ts.map +1 -1
  28. package/dist/JsonSchema.js +13 -40
  29. package/dist/JsonSchema.js.map +1 -1
  30. package/dist/Metric.d.ts +3 -3
  31. package/dist/MutableList.d.ts +5 -2
  32. package/dist/MutableList.d.ts.map +1 -1
  33. package/dist/MutableList.js +7 -5
  34. package/dist/MutableList.js.map +1 -1
  35. package/dist/MutableRef.d.ts.map +1 -1
  36. package/dist/MutableRef.js +7 -0
  37. package/dist/MutableRef.js.map +1 -1
  38. package/dist/PartitionedSemaphore.d.ts +2 -1
  39. package/dist/PartitionedSemaphore.d.ts.map +1 -1
  40. package/dist/PartitionedSemaphore.js +22 -12
  41. package/dist/PartitionedSemaphore.js.map +1 -1
  42. package/dist/Pool.d.ts.map +1 -1
  43. package/dist/Pool.js +77 -27
  44. package/dist/Pool.js.map +1 -1
  45. package/dist/PubSub.d.ts.map +1 -1
  46. package/dist/PubSub.js +5 -6
  47. package/dist/PubSub.js.map +1 -1
  48. package/dist/Ref.d.ts.map +1 -1
  49. package/dist/Ref.js +8 -0
  50. package/dist/Ref.js.map +1 -1
  51. package/dist/Schedule.js +1 -1
  52. package/dist/Schedule.js.map +1 -1
  53. package/dist/Schema.d.ts +24 -8
  54. package/dist/Schema.d.ts.map +1 -1
  55. package/dist/Schema.js +37 -28
  56. package/dist/Schema.js.map +1 -1
  57. package/dist/SchemaAST.d.ts +4 -2
  58. package/dist/SchemaAST.d.ts.map +1 -1
  59. package/dist/SchemaAST.js +14 -17
  60. package/dist/SchemaAST.js.map +1 -1
  61. package/dist/SchemaParser.d.ts.map +1 -1
  62. package/dist/SchemaParser.js +48 -22
  63. package/dist/SchemaParser.js.map +1 -1
  64. package/dist/SchemaRepresentation.d.ts +19 -10
  65. package/dist/SchemaRepresentation.d.ts.map +1 -1
  66. package/dist/SchemaRepresentation.js +23 -13
  67. package/dist/SchemaRepresentation.js.map +1 -1
  68. package/dist/SchemaTransformation.d.ts +4 -1
  69. package/dist/SchemaTransformation.d.ts.map +1 -1
  70. package/dist/SchemaTransformation.js +9 -2
  71. package/dist/SchemaTransformation.js.map +1 -1
  72. package/dist/Semaphore.d.ts.map +1 -1
  73. package/dist/Semaphore.js +54 -35
  74. package/dist/Semaphore.js.map +1 -1
  75. package/dist/Sink.d.ts.map +1 -1
  76. package/dist/Sink.js +7 -2
  77. package/dist/Sink.js.map +1 -1
  78. package/dist/Stream.d.ts.map +1 -1
  79. package/dist/Stream.js +22 -10
  80. package/dist/Stream.js.map +1 -1
  81. package/dist/String.d.ts +3 -0
  82. package/dist/String.d.ts.map +1 -1
  83. package/dist/String.js +3 -0
  84. package/dist/String.js.map +1 -1
  85. package/dist/Tracer.d.ts +11 -1
  86. package/dist/Tracer.d.ts.map +1 -1
  87. package/dist/Tracer.js +6 -1
  88. package/dist/Tracer.js.map +1 -1
  89. package/dist/ai/LanguageModel.d.ts.map +1 -1
  90. package/dist/ai/LanguageModel.js +9 -0
  91. package/dist/ai/LanguageModel.js.map +1 -1
  92. package/dist/ai/McpSchema.d.ts +110 -110
  93. package/dist/ai/McpSchema.d.ts.map +1 -1
  94. package/dist/ai/McpServer.d.ts.map +1 -1
  95. package/dist/ai/McpServer.js +21 -15
  96. package/dist/ai/McpServer.js.map +1 -1
  97. package/dist/ai/Prompt.d.ts +52 -0
  98. package/dist/ai/Prompt.d.ts.map +1 -1
  99. package/dist/ai/Prompt.js +38 -0
  100. package/dist/ai/Prompt.js.map +1 -1
  101. package/dist/ai/Response.d.ts +16 -3
  102. package/dist/ai/Response.d.ts.map +1 -1
  103. package/dist/ai/Response.js +4 -0
  104. package/dist/ai/Response.js.map +1 -1
  105. package/dist/ai/Tool.d.ts +24 -0
  106. package/dist/ai/Tool.d.ts.map +1 -1
  107. package/dist/ai/Tool.js +5 -2
  108. package/dist/ai/Tool.js.map +1 -1
  109. package/dist/ai/Toolkit.d.ts.map +1 -1
  110. package/dist/ai/Toolkit.js +8 -1
  111. package/dist/ai/Toolkit.js.map +1 -1
  112. package/dist/cli/Argument.d.ts +15 -0
  113. package/dist/cli/Argument.d.ts.map +1 -1
  114. package/dist/cli/Argument.js +5 -0
  115. package/dist/cli/Argument.js.map +1 -1
  116. package/dist/cli/CliError.d.ts +78 -0
  117. package/dist/cli/CliError.d.ts.map +1 -1
  118. package/dist/cli/CliError.js +65 -3
  119. package/dist/cli/CliError.js.map +1 -1
  120. package/dist/cli/CliOutput.d.ts +155 -6
  121. package/dist/cli/CliOutput.d.ts.map +1 -1
  122. package/dist/cli/CliOutput.js +62 -6
  123. package/dist/cli/CliOutput.js.map +1 -1
  124. package/dist/cli/Command.d.ts +24 -16
  125. package/dist/cli/Command.d.ts.map +1 -1
  126. package/dist/cli/Command.js +59 -29
  127. package/dist/cli/Command.js.map +1 -1
  128. package/dist/cli/Completions.d.ts +58 -0
  129. package/dist/cli/Completions.d.ts.map +1 -1
  130. package/dist/cli/Completions.js +49 -9
  131. package/dist/cli/Completions.js.map +1 -1
  132. package/dist/cli/Flag.d.ts +15 -0
  133. package/dist/cli/Flag.d.ts.map +1 -1
  134. package/dist/cli/Flag.js +5 -0
  135. package/dist/cli/Flag.js.map +1 -1
  136. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  137. package/dist/cli/GlobalFlag.js +15 -7
  138. package/dist/cli/GlobalFlag.js.map +1 -1
  139. package/dist/cli/Param.d.ts +9 -0
  140. package/dist/cli/Param.d.ts.map +1 -1
  141. package/dist/cli/Param.js +21 -2
  142. package/dist/cli/Param.js.map +1 -1
  143. package/dist/cli/TerminalCapabilities.d.ts +3 -2
  144. package/dist/cli/TerminalCapabilities.d.ts.map +1 -1
  145. package/dist/cli/TerminalCapabilities.js +3 -1
  146. package/dist/cli/TerminalCapabilities.js.map +1 -1
  147. package/dist/cli/internal/completions/bash.js +73 -27
  148. package/dist/cli/internal/completions/bash.js.map +1 -1
  149. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  150. package/dist/cluster/ClusterWorkflowEngine.js +45 -10
  151. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  152. package/dist/cluster/MessageStorage.d.ts +23 -45
  153. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  154. package/dist/cluster/MessageStorage.js +6 -7
  155. package/dist/cluster/MessageStorage.js.map +1 -1
  156. package/dist/cluster/Sharding.d.ts.map +1 -1
  157. package/dist/cluster/Sharding.js +61 -21
  158. package/dist/cluster/Sharding.js.map +1 -1
  159. package/dist/cluster/ShardingConfig.d.ts +10 -0
  160. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  161. package/dist/cluster/ShardingConfig.js.map +1 -1
  162. package/dist/cluster/Snowflake.d.ts.map +1 -1
  163. package/dist/cluster/Snowflake.js +3 -7
  164. package/dist/cluster/Snowflake.js.map +1 -1
  165. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  166. package/dist/cluster/SqlRunnerStorage.js +87 -39
  167. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  168. package/dist/cluster/internal/entityManager.js +54 -20
  169. package/dist/cluster/internal/entityManager.js.map +1 -1
  170. package/dist/devtools/DevToolsClient.d.ts.map +1 -1
  171. package/dist/devtools/DevToolsClient.js +2 -0
  172. package/dist/devtools/DevToolsClient.js.map +1 -1
  173. package/dist/encoding/Base64.js +36 -0
  174. package/dist/encoding/Base64.js.map +1 -1
  175. package/dist/encoding/Sse.d.ts.map +1 -1
  176. package/dist/encoding/Sse.js +3 -3
  177. package/dist/encoding/Sse.js.map +1 -1
  178. package/dist/encoding/Toml.d.ts.map +1 -1
  179. package/dist/encoding/Toml.js +21 -16
  180. package/dist/encoding/Toml.js.map +1 -1
  181. package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
  182. package/dist/eventlog/SqlEventJournal.js +47 -27
  183. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  184. package/dist/eventlog/internal/conflicts.d.ts +0 -1
  185. package/dist/eventlog/internal/conflicts.d.ts.map +1 -1
  186. package/dist/eventlog/internal/conflicts.js +0 -3
  187. package/dist/eventlog/internal/conflicts.js.map +1 -1
  188. package/dist/http/Cookies.d.ts.map +1 -1
  189. package/dist/http/Cookies.js +10 -9
  190. package/dist/http/Cookies.js.map +1 -1
  191. package/dist/http/HttpClient.d.ts +423 -0
  192. package/dist/http/HttpClient.d.ts.map +1 -1
  193. package/dist/http/HttpClient.js +231 -7
  194. package/dist/http/HttpClient.js.map +1 -1
  195. package/dist/http/HttpClientError.d.ts +8 -1
  196. package/dist/http/HttpClientError.d.ts.map +1 -1
  197. package/dist/http/HttpClientError.js +37 -1
  198. package/dist/http/HttpClientError.js.map +1 -1
  199. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  200. package/dist/http/HttpClientRequest.js +1 -1
  201. package/dist/http/HttpClientRequest.js.map +1 -1
  202. package/dist/http/HttpMiddleware.d.ts +1 -1
  203. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  204. package/dist/http/HttpMiddleware.js +14 -16
  205. package/dist/http/HttpMiddleware.js.map +1 -1
  206. package/dist/http/HttpRouter.d.ts.map +1 -1
  207. package/dist/http/HttpRouter.js +2 -1
  208. package/dist/http/HttpRouter.js.map +1 -1
  209. package/dist/http/HttpServerError.js +2 -2
  210. package/dist/http/HttpServerError.js.map +1 -1
  211. package/dist/http/HttpServerRequest.d.ts +6 -1
  212. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  213. package/dist/http/HttpServerRequest.js +73 -10
  214. package/dist/http/HttpServerRequest.js.map +1 -1
  215. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  216. package/dist/http/HttpStaticServer.js +48 -21
  217. package/dist/http/HttpStaticServer.js.map +1 -1
  218. package/dist/http/MultipartParser/internal/contentType.js +3 -3
  219. package/dist/http/UrlParams.d.ts +3 -1
  220. package/dist/http/UrlParams.d.ts.map +1 -1
  221. package/dist/http/UrlParams.js +4 -2
  222. package/dist/http/UrlParams.js.map +1 -1
  223. package/dist/http/internal/compression.js +4 -5
  224. package/dist/http/internal/compression.js.map +1 -1
  225. package/dist/http/internal/decompression.js +3 -0
  226. package/dist/http/internal/decompression.js.map +1 -1
  227. package/dist/http/internal/httpBody.js +8 -1
  228. package/dist/http/internal/httpBody.js.map +1 -1
  229. package/dist/http/internal/urlParams.js +25 -0
  230. package/dist/http/internal/urlParams.js.map +1 -1
  231. package/dist/http-api/HttpApi.d.ts +3 -6
  232. package/dist/http-api/HttpApi.d.ts.map +1 -1
  233. package/dist/http-api/HttpApi.js +3 -6
  234. package/dist/http-api/HttpApi.js.map +1 -1
  235. package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
  236. package/dist/http-api/HttpApiBuilder.js +27 -11
  237. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  238. package/dist/http-api/HttpApiClient.d.ts +77 -7
  239. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  240. package/dist/http-api/HttpApiClient.js +142 -44
  241. package/dist/http-api/HttpApiClient.js.map +1 -1
  242. package/dist/http-api/HttpApiEndpoint.d.ts +24 -7
  243. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  244. package/dist/http-api/HttpApiEndpoint.js +109 -27
  245. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  246. package/dist/http-api/HttpApiSchema.d.ts +76 -29
  247. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  248. package/dist/http-api/HttpApiSchema.js +70 -59
  249. package/dist/http-api/HttpApiSchema.js.map +1 -1
  250. package/dist/http-api/HttpApiTest.d.ts.map +1 -1
  251. package/dist/http-api/HttpApiTest.js +3 -2
  252. package/dist/http-api/HttpApiTest.js.map +1 -1
  253. package/dist/http-api/OpenApi.d.ts.map +1 -1
  254. package/dist/http-api/OpenApi.js +25 -16
  255. package/dist/http-api/OpenApi.js.map +1 -1
  256. package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
  257. package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
  258. package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
  259. package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
  260. package/dist/internal/arbitrary/runner.d.ts.map +1 -1
  261. package/dist/internal/arbitrary/runner.js +120 -44
  262. package/dist/internal/arbitrary/runner.js.map +1 -1
  263. package/dist/internal/core.js +2 -0
  264. package/dist/internal/core.js.map +1 -1
  265. package/dist/internal/effect.js +21 -13
  266. package/dist/internal/effect.js.map +1 -1
  267. package/dist/internal/equal.js +14 -0
  268. package/dist/internal/equal.js.map +1 -1
  269. package/dist/internal/jsonSchema.d.ts +2 -0
  270. package/dist/internal/jsonSchema.d.ts.map +1 -0
  271. package/dist/internal/jsonSchema.js +28 -0
  272. package/dist/internal/jsonSchema.js.map +1 -0
  273. package/dist/internal/matcher.js +1 -1
  274. package/dist/internal/matcher.js.map +1 -1
  275. package/dist/internal/schema/compilerRegistry.js +4 -1
  276. package/dist/internal/schema/compilerRegistry.js.map +1 -1
  277. package/dist/internal/schema/content.d.ts +2 -0
  278. package/dist/internal/schema/content.d.ts.map +1 -0
  279. package/dist/internal/schema/content.js +13 -0
  280. package/dist/internal/schema/content.js.map +1 -0
  281. package/dist/internal/schema/fromJsonSchemaDocument.js +173 -185
  282. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  283. package/dist/internal/schema/fromRepresentation.js +2 -1
  284. package/dist/internal/schema/fromRepresentation.js.map +1 -1
  285. package/dist/internal/schema/standardSchema.js +8 -2
  286. package/dist/internal/schema/standardSchema.js.map +1 -1
  287. package/dist/internal/schema/toCodeDocument.js +3 -3
  288. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  289. package/dist/internal/schema/toCodec.js +21 -24
  290. package/dist/internal/schema/toCodec.js.map +1 -1
  291. package/dist/internal/schema/toJsonSchemaDocument.js +205 -140
  292. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  293. package/dist/internal/schema/toRepresentation.js +107 -129
  294. package/dist/internal/schema/toRepresentation.js.map +1 -1
  295. package/dist/internal/sql.d.ts +2 -0
  296. package/dist/internal/sql.d.ts.map +1 -0
  297. package/dist/internal/sql.js +13 -0
  298. package/dist/internal/sql.js.map +1 -0
  299. package/dist/internal/version.js +1 -1
  300. package/dist/observability/OtlpProxy.d.ts +154 -0
  301. package/dist/observability/OtlpProxy.d.ts.map +1 -0
  302. package/dist/observability/OtlpProxy.js +235 -0
  303. package/dist/observability/OtlpProxy.js.map +1 -0
  304. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  305. package/dist/observability/OtlpTracer.js +4 -0
  306. package/dist/observability/OtlpTracer.js.map +1 -1
  307. package/dist/observability/index.d.ts +5 -0
  308. package/dist/observability/index.d.ts.map +1 -1
  309. package/dist/observability/index.js +5 -0
  310. package/dist/observability/index.js.map +1 -1
  311. package/dist/persistence/CircuitBreaker.d.ts +897 -0
  312. package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
  313. package/dist/persistence/CircuitBreaker.js +1165 -0
  314. package/dist/persistence/CircuitBreaker.js.map +1 -0
  315. package/dist/persistence/Redis.d.ts +78 -2
  316. package/dist/persistence/Redis.d.ts.map +1 -1
  317. package/dist/persistence/Redis.js +62 -7
  318. package/dist/persistence/Redis.js.map +1 -1
  319. package/dist/persistence/index.d.ts +5 -0
  320. package/dist/persistence/index.d.ts.map +1 -1
  321. package/dist/persistence/index.js +5 -0
  322. package/dist/persistence/index.js.map +1 -1
  323. package/dist/process/ChildProcess.d.ts +30 -4
  324. package/dist/process/ChildProcess.d.ts.map +1 -1
  325. package/dist/process/ChildProcess.js.map +1 -1
  326. package/dist/process/ChildProcessSpawner.d.ts +30 -0
  327. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  328. package/dist/process/ChildProcessSpawner.js +5 -2
  329. package/dist/process/ChildProcessSpawner.js.map +1 -1
  330. package/dist/reactivity/AsyncResult.d.ts +1 -1
  331. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  332. package/dist/rpc/RpcClient.d.ts.map +1 -1
  333. package/dist/rpc/RpcClient.js +9 -8
  334. package/dist/rpc/RpcClient.js.map +1 -1
  335. package/dist/rpc/RpcSerialization.d.ts +14 -0
  336. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  337. package/dist/rpc/RpcSerialization.js +20 -8
  338. package/dist/rpc/RpcSerialization.js.map +1 -1
  339. package/dist/rpc/RpcServer.d.ts.map +1 -1
  340. package/dist/rpc/RpcServer.js +11 -1
  341. package/dist/rpc/RpcServer.js.map +1 -1
  342. package/dist/rpc/RpcTest.d.ts +1 -0
  343. package/dist/rpc/RpcTest.d.ts.map +1 -1
  344. package/dist/rpc/RpcTest.js +1 -0
  345. package/dist/rpc/RpcTest.js.map +1 -1
  346. package/dist/sql/Migrator.d.ts +2 -1
  347. package/dist/sql/Migrator.d.ts.map +1 -1
  348. package/dist/sql/Migrator.js +11 -8
  349. package/dist/sql/Migrator.js.map +1 -1
  350. package/dist/sql/SqlClient.d.ts +9 -4
  351. package/dist/sql/SqlClient.d.ts.map +1 -1
  352. package/dist/sql/SqlClient.js +8 -1
  353. package/dist/sql/SqlClient.js.map +1 -1
  354. package/dist/sql/SqlResolver.d.ts +4 -0
  355. package/dist/sql/SqlResolver.d.ts.map +1 -1
  356. package/dist/sql/SqlResolver.js +18 -4
  357. package/dist/sql/SqlResolver.js.map +1 -1
  358. package/dist/sql/Statement.d.ts +7 -0
  359. package/dist/sql/Statement.d.ts.map +1 -1
  360. package/dist/sql/Statement.js +21 -2
  361. package/dist/sql/Statement.js.map +1 -1
  362. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  363. package/dist/workflow/DurableDeferred.js +21 -2
  364. package/dist/workflow/DurableDeferred.js.map +1 -1
  365. package/package.json +1 -1
  366. package/src/Arbitrary.ts +10 -2
  367. package/src/Channel.ts +47 -18
  368. package/src/Data.ts +60 -265
  369. package/src/Effect.ts +1 -1
  370. package/src/Equal.ts +8 -1
  371. package/src/Exit.ts +3 -3
  372. package/src/Formatter.ts +28 -13
  373. package/src/Hash.ts +4 -1
  374. package/src/JsonPatch.ts +4 -0
  375. package/src/JsonSchema.ts +12 -40
  376. package/src/Metric.ts +3 -3
  377. package/src/MutableList.ts +7 -5
  378. package/src/MutableRef.ts +8 -1
  379. package/src/PartitionedSemaphore.ts +24 -13
  380. package/src/Pool.ts +109 -37
  381. package/src/PubSub.ts +5 -6
  382. package/src/Ref.ts +8 -0
  383. package/src/Schedule.ts +1 -1
  384. package/src/Schema.ts +48 -25
  385. package/src/SchemaAST.ts +20 -20
  386. package/src/SchemaParser.ts +51 -18
  387. package/src/SchemaRepresentation.ts +31 -34
  388. package/src/SchemaTransformation.ts +9 -2
  389. package/src/Semaphore.ts +67 -40
  390. package/src/Sink.ts +15 -2
  391. package/src/Stream.ts +33 -16
  392. package/src/String.ts +3 -0
  393. package/src/Tracer.ts +15 -1
  394. package/src/ai/LanguageModel.ts +9 -0
  395. package/src/ai/McpServer.ts +14 -13
  396. package/src/ai/Prompt.ts +65 -0
  397. package/src/ai/Response.ts +34 -9
  398. package/src/ai/Tool.ts +38 -2
  399. package/src/ai/Toolkit.ts +4 -1
  400. package/src/cli/Argument.ts +15 -0
  401. package/src/cli/CliError.ts +90 -3
  402. package/src/cli/CliOutput.ts +183 -6
  403. package/src/cli/Command.ts +53 -41
  404. package/src/cli/Completions.ts +51 -0
  405. package/src/cli/Flag.ts +15 -0
  406. package/src/cli/GlobalFlag.ts +6 -7
  407. package/src/cli/Param.ts +29 -6
  408. package/src/cli/TerminalCapabilities.ts +6 -3
  409. package/src/cli/internal/completions/bash.ts +79 -29
  410. package/src/cluster/ClusterWorkflowEngine.ts +46 -16
  411. package/src/cluster/MessageStorage.ts +19 -14
  412. package/src/cluster/Sharding.ts +83 -21
  413. package/src/cluster/ShardingConfig.ts +5 -0
  414. package/src/cluster/Snowflake.ts +3 -7
  415. package/src/cluster/SqlRunnerStorage.ts +110 -47
  416. package/src/cluster/internal/entityManager.ts +75 -22
  417. package/src/devtools/DevToolsClient.ts +2 -0
  418. package/src/encoding/Base64.ts +38 -0
  419. package/src/encoding/Sse.ts +4 -3
  420. package/src/encoding/Toml.ts +33 -16
  421. package/src/eventlog/SqlEventJournal.ts +68 -45
  422. package/src/eventlog/internal/conflicts.ts +0 -4
  423. package/src/http/Cookies.ts +10 -11
  424. package/src/http/HttpClient.ts +547 -7
  425. package/src/http/HttpClientError.ts +35 -1
  426. package/src/http/HttpClientRequest.ts +9 -1
  427. package/src/http/HttpMiddleware.ts +15 -18
  428. package/src/http/HttpRouter.ts +2 -1
  429. package/src/http/HttpServerError.ts +2 -2
  430. package/src/http/HttpServerRequest.ts +102 -16
  431. package/src/http/HttpStaticServer.ts +51 -22
  432. package/src/http/MultipartParser/internal/contentType.ts +3 -3
  433. package/src/http/UrlParams.ts +6 -1
  434. package/src/http/internal/compression.ts +4 -5
  435. package/src/http/internal/decompression.ts +6 -0
  436. package/src/http/internal/httpBody.ts +10 -2
  437. package/src/http/internal/urlParams.ts +29 -0
  438. package/src/http-api/HttpApi.ts +3 -6
  439. package/src/http-api/HttpApiBuilder.ts +45 -15
  440. package/src/http-api/HttpApiClient.ts +218 -72
  441. package/src/http-api/HttpApiEndpoint.ts +121 -30
  442. package/src/http-api/HttpApiSchema.ts +141 -48
  443. package/src/http-api/HttpApiTest.ts +3 -2
  444. package/src/http-api/OpenApi.ts +20 -17
  445. package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
  446. package/src/internal/arbitrary/runner.ts +133 -36
  447. package/src/internal/core.ts +2 -0
  448. package/src/internal/effect.ts +24 -16
  449. package/src/internal/equal.ts +17 -0
  450. package/src/internal/jsonSchema.ts +27 -0
  451. package/src/internal/matcher.ts +1 -1
  452. package/src/internal/schema/compilerRegistry.ts +6 -1
  453. package/src/internal/schema/content.ts +18 -0
  454. package/src/internal/schema/fromJsonSchemaDocument.ts +228 -190
  455. package/src/internal/schema/fromRepresentation.ts +2 -1
  456. package/src/internal/schema/standardSchema.ts +2 -2
  457. package/src/internal/schema/toCodeDocument.ts +4 -4
  458. package/src/internal/schema/toCodec.ts +26 -22
  459. package/src/internal/schema/toJsonSchemaDocument.ts +189 -167
  460. package/src/internal/schema/toRepresentation.ts +122 -140
  461. package/src/internal/sql.ts +14 -0
  462. package/src/internal/version.ts +1 -1
  463. package/src/observability/OtlpProxy.ts +314 -0
  464. package/src/observability/OtlpTracer.ts +4 -0
  465. package/src/observability/index.ts +6 -0
  466. package/src/persistence/CircuitBreaker.ts +1678 -0
  467. package/src/persistence/Redis.ts +129 -8
  468. package/src/persistence/index.ts +6 -0
  469. package/src/process/ChildProcess.ts +30 -4
  470. package/src/process/ChildProcessSpawner.ts +41 -2
  471. package/src/reactivity/AsyncResult.ts +1 -1
  472. package/src/rpc/RpcClient.ts +13 -10
  473. package/src/rpc/RpcSerialization.ts +32 -9
  474. package/src/rpc/RpcServer.ts +16 -1
  475. package/src/rpc/RpcTest.ts +3 -0
  476. package/src/sql/Migrator.ts +12 -7
  477. package/src/sql/SqlClient.ts +11 -4
  478. package/src/sql/SqlResolver.ts +23 -9
  479. package/src/sql/Statement.ts +30 -2
  480. package/src/workflow/DurableDeferred.ts +23 -6
@@ -90,19 +90,33 @@ export const layer = <Id extends string, Groups extends HttpApiGroup.Constraint>
90
90
  | Path
91
91
  >()
92
92
  const routes: Array<HttpRouter.Route<any, any>> = []
93
+ const routeOwners = new Map<string, string>()
93
94
  const availableGroups = Array.from(services.mapUnsafe.keys()).filter((key) =>
94
95
  key.startsWith("effect/http-api/HttpApiGroup/")
95
96
  )
96
97
  const groups = Object.values(api.groups) as ReadonlyArray<HttpApiGroup.Top>
97
98
  for (const group of groups) {
98
- const groupRoutes = services.mapUnsafe.get(group.key)?.routes as Array<HttpRouter.Route<any, any>>
99
- if (groupRoutes === undefined) {
99
+ const service = services.mapUnsafe.get(group.key) as GroupService | undefined
100
+ if (service === undefined) {
100
101
  const available = availableGroups.length === 0 ? "none" : availableGroups.join(", ")
101
102
  return yield* Effect.die(
102
103
  `HttpApiGroup "${group.identifier}" not found (key: "${group.key}"). Did you forget to provide HttpApiBuilder.group(api, "${group.identifier}", ...)? Available groups: ${available}`
103
104
  )
104
105
  }
105
- routes.push(...groupRoutes)
106
+ for (const { endpoint } of service.handlers.values()) {
107
+ const owner = `${group.identifier}.${endpoint.identifier}`
108
+ const key = `${endpoint.method} ${HttpApiPath.toRouterPath(endpoint.path, endpoint.params)}`
109
+ const existing = routeOwners.get(key)
110
+ if (existing !== undefined) {
111
+ return yield* Effect.die(
112
+ new Error(
113
+ `HttpApiEndpoint "${owner}" (${endpoint.method} ${endpoint.path}) has the same method and path as "${existing}". Declare one endpoint whose query, headers, payload or success schemas cover each variant instead.`
114
+ )
115
+ )
116
+ }
117
+ routeOwners.set(key, owner)
118
+ }
119
+ routes.push(...service.routes)
106
120
  }
107
121
  yield* (router.addAll(routes) as Effect.Effect<void>)
108
122
  if (options?.openapiPath) {
@@ -159,12 +173,8 @@ export const group = <
159
173
  for (const item of handlers.handlers.values()) {
160
174
  routes.push(handlerToRoute(api, group as any, item, services))
161
175
  }
162
- return Context.makeUnsafe(
163
- new Map([[group.key, {
164
- routes,
165
- handlers: handlers.handlers
166
- }]])
167
- )
176
+ const service: GroupService = { routes, handlers: handlers.handlers }
177
+ return Context.makeUnsafe(new Map([[group.key, service]]))
168
178
  })) as any
169
179
 
170
180
  /**
@@ -245,6 +255,14 @@ export interface HandlerRuntime {
245
255
  readonly uninterruptible: boolean
246
256
  }
247
257
 
258
+ /**
259
+ * @internal
260
+ */
261
+ export interface GroupService {
262
+ readonly routes: Array<HttpRouter.Route<any, any>>
263
+ readonly handlers: Map<string, HandlerRuntime>
264
+ }
265
+
248
266
  type HandleAllEntry<Endpoint extends HttpApiEndpoint.Constraint> =
249
267
  | HttpApiEndpoint.Handler<
250
268
  Endpoint,
@@ -939,6 +957,10 @@ function handlerToHttpEffect(
939
957
  const encodeStream = makeStreamEncoder(endpoint, options.success)
940
958
  const encodeWithHeaders = makeWithHeadersEncoder(endpoint, options.success, options.headers)
941
959
  const upgrade = getUpgradeSuccessSchema(endpoint)
960
+ const encodeUpgradeHeaders = UndefinedOr.map(
961
+ upgrade?.headers,
962
+ (schema) => Schema.encodeUnknownEffect(schema, options.headers)
963
+ )
942
964
 
943
965
  const shouldParsePayload = endpoint.payload.size > 0 && !isRaw
944
966
  const payloadBy = shouldParsePayload ? buildPayloadDecoders(endpoint.payload, options.payload) : undefined
@@ -967,6 +989,20 @@ function handlerToHttpEffect(
967
989
  if (decodeQuery) {
968
990
  request.query = yield* HttpApiSchemaError.wrap("Query", decodeQuery(query))
969
991
  }
992
+ if (upgrade !== undefined) {
993
+ if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
994
+ return upgradeRequired(upgrade.protocol)
995
+ }
996
+ 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
+ )
1005
+ }
970
1006
  if (payloadBy) {
971
1007
  const result = decodePayload(payloadBy, httpRequest, query)
972
1008
  if (Response.isHttpServerResponse(result)) {
@@ -976,12 +1012,6 @@ function handlerToHttpEffect(
976
1012
  request.payload = yield* HttpApiSchemaError.wrap("Payload", result)
977
1013
  }
978
1014
  }
979
- if (upgrade !== undefined) {
980
- if (!isUpgradeRequest(httpRequest, upgrade.protocol)) {
981
- return upgradeRequired(upgrade.protocol)
982
- }
983
- request.socket = yield* Effect.orDie(httpRequest.upgrade)
984
- }
985
1015
  let response = yield* handler(request)
986
1016
  if (Response.isHttpServerResponse(response)) {
987
1017
  return response
@@ -102,7 +102,7 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
102
102
  : S extends HttpApiSchema.StreamUint8Array ? Stream.Stream<Uint8Array, HttpClientError.HttpClientError, never>
103
103
  : S extends HttpApiSchema.StreamNdjson<infer _S> ?
104
104
  Stream.Stream<_S["Type"], HttpClientError.HttpClientError | Schema.SchemaError, never>
105
- : S extends HttpApiSchema.Upgrade ? Upgraded
105
+ : S extends HttpApiSchema.Upgrade<infer _Headers> ? [_Headers] extends [never] ? Upgraded : Upgraded<_Headers["Type"]>
106
106
  : S extends Schema.Constraint ? S["Type"]
107
107
  : never
108
108
 
@@ -113,15 +113,16 @@ export type SuccessType<S> = S extends HttpApiSchema.WithHeaders<
113
113
  *
114
114
  * **Details**
115
115
  *
116
- * See `HttpClientResponse.upgrade` for how the connection behaves and when it
117
- * closes.
116
+ * `headers` is decoded with the upgrade's `headers` schema when it declares
117
+ * one. See `HttpClientResponse.upgrade` for how the connection behaves and
118
+ * when it closes.
118
119
  *
119
120
  * @stability unstable
120
121
  * @category models
121
122
  * @since 4.0.6
122
123
  */
123
- export interface Upgraded {
124
- readonly headers: Headers.Headers
124
+ export interface Upgraded<Headers = Headers.Headers> {
125
+ readonly headers: Headers
125
126
  readonly socket: Socket.Socket
126
127
  }
127
128
 
@@ -134,9 +135,16 @@ type SuccessDecodingServices<S> = S extends HttpApiSchema.StreamSse<
134
135
  | _Error["DecodingServices"]
135
136
  : S extends HttpApiSchema.StreamUint8Array ? never
136
137
  : S extends HttpApiSchema.StreamNdjson<infer _S> ? _S["DecodingServices"]
138
+ : S extends HttpApiSchema.Upgrade<infer _Headers> ? _Headers["DecodingServices"]
137
139
  : S extends Schema.Constraint ? S["DecodingServices"]
138
140
  : never
139
141
 
142
+ // An uninferred type parameter is instantiated with its constraint, so methods
143
+ // without a streaming payload must constrain `PayloadR` to `never`. `StreamNdjson<any>`
144
+ // also matches item schemas that are only a `Schema.Constraint` (`disableCodecs`)
145
+ type PayloadServicesConstraint<Payload> =
146
+ [Extract<Payload, HttpApiSchema.StreamUint8Array | HttpApiSchema.StreamNdjson<any>>] extends [never] ? never : unknown
147
+
140
148
  /**
141
149
  * Helper types used to describe generated HTTP API clients, including endpoint
142
150
  * methods, response modes, and grouped client shapes.
@@ -228,7 +236,10 @@ export declare namespace Client {
228
236
  Endpoint extends HttpApiEndpoint.ConstraintRequest,
229
237
  E,
230
238
  R
231
- > = <Mode extends ResponseMode = "decoded-only", PayloadR = never>(
239
+ > = <
240
+ Mode extends ResponseMode = "decoded-only",
241
+ PayloadR extends PayloadServicesConstraint<Endpoint["~Payload"]> = never
242
+ >(
232
243
  request: Simplify<
233
244
  HttpApiEndpoint.ClientRequest<
234
245
  Endpoint["~Params"],
@@ -239,7 +250,7 @@ export declare namespace Client {
239
250
  PayloadR
240
251
  >
241
252
  >
242
- ) => MethodReturn<Endpoint, E, R, Mode, PayloadR>
253
+ ) => MethodReturn<Endpoint, E, R, Mode, NoInfer<PayloadR>>
243
254
 
244
255
  /**
245
256
  * Extracts client methods for endpoints in top-level groups so they can be exposed
@@ -387,71 +398,11 @@ export const makeClient = <ApiId extends string, Groups extends HttpApiGroup.Con
387
398
  options.onGroup?.(onGroupOptions)
388
399
  },
389
400
  onEndpoint(onEndpointOptions) {
390
- const { group, endpoint, errors, successes, mergedAnnotations } = onEndpointOptions
401
+ const { group, endpoint, mergedAnnotations } = onEndpointOptions
391
402
  const parseOptions = HttpApi.getSlotParseOptions(mergedAnnotations)
392
403
  const makeUrl = compilePath(endpoint.path, endpoint.params)
393
- const decodeMap: Record<number | "orElse", ResponseDecoder> = { orElse: statusOrElse }
394
- const errorAlternatives = new Map<number, Array<ResponseAlternative>>()
395
- for (const [status, schemas] of errors.entries()) {
396
- const grouped = groupSchemasByContentType(schemas)
397
- for (const [contentType, schemas] of grouped.entries()) {
398
- addResponseAlternative(
399
- errorAlternatives,
400
- status,
401
- contentType,
402
- schemasToResponse(schemas, parseOptions.error, parseOptions.headers)
403
- )
404
- }
405
- }
406
- for (const [status, alternatives] of errorAlternatives.entries()) {
407
- const decode = makeResponseDecoder(alternatives)
408
- decodeMap[status] = (response) =>
409
- Effect.flatMap(
410
- Effect.catchCause(decode(response), (cause) =>
411
- Effect.failCause(Cause.combine(
412
- Cause.fail(
413
- new HttpClientError.HttpClientError({
414
- reason: new HttpClientError.StatusCodeError({
415
- request: response.request,
416
- response
417
- })
418
- })
419
- ),
420
- cause
421
- ))),
422
- Effect.fail
423
- )
424
- }
425
-
426
- const successAlternatives = new Map<number, Array<ResponseAlternative>>()
427
- for (const [status, schemas] of successes.entries()) {
428
- const grouped = groupSchemasByContentType(schemas)
429
- for (const [contentType, schemas] of grouped.entries()) {
430
- addResponseAlternative(
431
- successAlternatives,
432
- status,
433
- contentType,
434
- schemasToResponse(schemas, parseOptions.success, parseOptions.headers)
435
- )
436
- }
437
- }
438
- for (const streamSuccess of getStreamSuccessSchemas(endpoint)) {
439
- const streamSchema = isWithHeadersStreamSuccess(streamSuccess) ? streamSuccess.schema : streamSuccess
440
- addResponseAlternative(
441
- successAlternatives,
442
- HttpApiSchema.getStatusSuccessSchema(streamSuccess),
443
- streamSchema.contentType,
444
- streamToResponse(streamSuccess, parseOptions.success, parseOptions.headers)
445
- )
446
- }
447
- for (const [status, alternatives] of successAlternatives.entries()) {
448
- decodeMap[status] = makeResponseDecoder(alternatives)
449
- }
450
404
  const upgrade = getUpgradeSuccessSchema(endpoint)
451
- if (upgrade !== undefined) {
452
- decodeMap[101] = (response) =>
453
- Effect.map(response.upgrade, (socket): Upgraded => ({ headers: response.headers, socket }))
454
- }
405
+ const decodeEndpointResponse = makeEndpointDecoder(onEndpointOptions)
455
406
 
456
407
  const encodeParams = UndefinedOr.map(
457
408
  endpoint.params,
@@ -570,7 +521,7 @@ export const makeClient = <ApiId extends string, Groups extends HttpApiGroup.Con
570
521
  return response
571
522
  }
572
523
 
573
- const decoded = (decodeMap[response.status] ?? decodeMap.orElse)(response, request?.sseOptions)
524
+ const decoded = decodeEndpointResponse(response, request?.sseOptions)
574
525
  const value = yield* (options.transformResponse === undefined
575
526
  ? decoded
576
527
  : options.transformResponse(decoded))
@@ -748,6 +699,111 @@ export const endpoint = <
748
699
  }).pipe(Effect.map(() => client)) as any
749
700
  }
750
701
 
702
+ type DecodeResponse<
703
+ Groups extends HttpApiGroup.Constraint,
704
+ GroupIdentifier extends HttpApiGroup.Identifier<Groups>,
705
+ EndpointIdentifier extends HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>["identifier"],
706
+ Endpoint extends HttpApiEndpoint.ConstraintRequest = Extract<
707
+ HttpApiEndpoint.WithIdentifier<HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>, EndpointIdentifier>,
708
+ HttpApiEndpoint.ConstraintRequest
709
+ >
710
+ > = (
711
+ response: HttpClientResponse.HttpClientResponse,
712
+ options?: {
713
+ readonly sseOptions?: Sse.DecodeOptions | undefined
714
+ }
715
+ ) => Effect.Effect<
716
+ SuccessType<Endpoint["~Success"]>,
717
+ HttpApiEndpoint.Errors<Endpoint> | HttpClientError.HttpClientError | Schema.SchemaError,
718
+ SuccessDecodingServices<Endpoint["~Success"]> | HttpApiEndpoint.ErrorServicesDecode<Endpoint>
719
+ >
720
+
721
+ /**
722
+ * Builds a decoder for raw responses of one endpoint in one API group, using
723
+ * the same success and error decoding as a generated client method in
724
+ * `"decoded-only"` mode.
725
+ *
726
+ * **When to use**
727
+ *
728
+ * Use with `responseMode: "response-only"` when the response head and body
729
+ * arrive at different times, such as long polling, and the body should be
730
+ * decoded later.
731
+ *
732
+ * **Details**
733
+ *
734
+ * The response does not need to come from a generated client. Declared error
735
+ * responses fail with the decoded error, and undeclared statuses fail with an
736
+ * `HttpClientError` whose reason is a `DecodeError`. Parse options are resolved
737
+ * from the API, group and endpoint annotations. The body is only read when the
738
+ * returned effect runs, so it must run inside the scope that owns the response.
739
+ * Middleware and `transformResponse` are not applied.
740
+ *
741
+ * Building the decoder walks the API declaration, so build it once per
742
+ * endpoint and reuse it.
743
+ *
744
+ * **Example** (Decoding a response body after the head arrives)
745
+ *
746
+ * ```ts import.meta.vitest
747
+ * import { Effect, Schema } from "effect"
748
+ * import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup } from "effect/http-api"
749
+ *
750
+ * const Api = HttpApi.make("Api").add(
751
+ * HttpApiGroup.make("containers").add(
752
+ * HttpApiEndpoint.post("wait", "/containers/:id/wait", {
753
+ * params: { id: Schema.String },
754
+ * success: Schema.Struct({ StatusCode: Schema.Number })
755
+ * })
756
+ * )
757
+ * )
758
+ *
759
+ * const decodeWait = HttpApiClient.decodeResponse(Api, {
760
+ * group: "containers",
761
+ * endpoint: "wait"
762
+ * })
763
+ *
764
+ * const program = Effect.gen(function*() {
765
+ * const client = yield* HttpApiClient.make(Api)
766
+ * // Succeeds as soon as the response head arrives
767
+ * const response = yield* client.containers.wait({
768
+ * params: { id: "my-container" },
769
+ * responseMode: "response-only"
770
+ * })
771
+ * // Waits for the body, then decodes it with the endpoint schemas
772
+ * return yield* decodeWait(response)
773
+ * })
774
+ * ```
775
+ *
776
+ * @stability unstable
777
+ * @category constructors
778
+ * @since 4.0.7
779
+ */
780
+ export const decodeResponse = <
781
+ ApiId extends string,
782
+ Groups extends HttpApiGroup.Constraint,
783
+ const GroupIdentifier extends HttpApiGroup.Identifier<Groups>,
784
+ const EndpointIdentifier extends HttpApiGroup.EndpointsWithIdentifier<Groups, GroupIdentifier>["identifier"]
785
+ >(
786
+ api: HttpApi.HttpApi<ApiId, Groups>,
787
+ options: {
788
+ readonly group: GroupIdentifier
789
+ readonly endpoint: EndpointIdentifier
790
+ }
791
+ ): DecodeResponse<Groups, GroupIdentifier, EndpointIdentifier> => {
792
+ let decode: ResponseDecoder | undefined
793
+ HttpApi.reflect(api, {
794
+ predicate: ({ endpoint, group }) => group.identifier === options.group && endpoint.identifier === options.endpoint,
795
+ onGroup() {},
796
+ onEndpoint(endpointOptions) {
797
+ decode = makeEndpointDecoder(endpointOptions)
798
+ }
799
+ })
800
+ return ((response, decodeOptions) => decode!(response, decodeOptions?.sseOptions)) as DecodeResponse<
801
+ Groups,
802
+ GroupIdentifier,
803
+ EndpointIdentifier
804
+ >
805
+ }
806
+
751
807
  /**
752
808
  * Creates a type-safe URL builder that mirrors `HttpApiClient.make`.
753
809
  *
@@ -845,6 +901,10 @@ const compilePath = (path: string, schema: Schema.Top | undefined) => {
845
901
  return (params: Record<string, string | undefined>) =>
846
902
  HttpApiPath.replaceParams(path, paramNames, (key, optional) => {
847
903
  const value = params[key]
904
+ if (value === "." || value === "..") {
905
+ // dot segments survive encoding and would be resolved by URL normalization
906
+ throw new Error(`Invalid path parameter: ${key}`)
907
+ }
848
908
  if (value !== undefined) return encodeURIComponent(value)
849
909
  if (optional) return undefined
850
910
  throw new Error(`Missing path parameter: ${key}`)
@@ -907,6 +967,91 @@ function toCodecArrayBufferWithHeaders(
907
967
  ))
908
968
  }
909
969
 
970
+ const makeEndpointDecoder = (options: {
971
+ readonly endpoint: HttpApiEndpoint.Top
972
+ readonly mergedAnnotations: Context.Context<never>
973
+ readonly successes: ReadonlyMap<number, readonly [Schema.Top, ...Array<Schema.Top>]>
974
+ readonly errors: ReadonlyMap<number, readonly [Schema.Top, ...Array<Schema.Top>]>
975
+ }): ResponseDecoder => {
976
+ const { endpoint, errors, successes, mergedAnnotations } = options
977
+ const parseOptions = HttpApi.getSlotParseOptions(mergedAnnotations)
978
+ const decodeMap: Record<number | "orElse", ResponseDecoder> = { orElse: statusOrElse }
979
+ const errorAlternatives = new Map<number, Array<ResponseAlternative>>()
980
+ for (const [status, schemas] of errors.entries()) {
981
+ const grouped = groupSchemasByContentType(schemas)
982
+ for (const [contentType, schemas] of grouped.entries()) {
983
+ addResponseAlternative(
984
+ errorAlternatives,
985
+ status,
986
+ contentType,
987
+ schemasToResponse(schemas, parseOptions.error, parseOptions.headers)
988
+ )
989
+ }
990
+ }
991
+ for (const [status, alternatives] of errorAlternatives.entries()) {
992
+ const decode = makeResponseDecoder(alternatives)
993
+ decodeMap[status] = (response) =>
994
+ Effect.flatMap(
995
+ Effect.catchCause(decode(response), (cause) =>
996
+ Effect.failCause(Cause.combine(
997
+ Cause.fail(
998
+ new HttpClientError.HttpClientError({
999
+ reason: new HttpClientError.StatusCodeError({
1000
+ request: response.request,
1001
+ response
1002
+ })
1003
+ })
1004
+ ),
1005
+ cause
1006
+ ))),
1007
+ Effect.fail
1008
+ )
1009
+ }
1010
+
1011
+ const successAlternatives = new Map<number, Array<ResponseAlternative>>()
1012
+ for (const [status, schemas] of successes.entries()) {
1013
+ const grouped = groupSchemasByContentType(schemas)
1014
+ for (const [contentType, schemas] of grouped.entries()) {
1015
+ addResponseAlternative(
1016
+ successAlternatives,
1017
+ status,
1018
+ contentType,
1019
+ schemasToResponse(schemas, parseOptions.success, parseOptions.headers)
1020
+ )
1021
+ }
1022
+ }
1023
+ for (const streamSuccess of getStreamSuccessSchemas(endpoint)) {
1024
+ const streamSchema = isWithHeadersStreamSuccess(streamSuccess) ? streamSuccess.schema : streamSuccess
1025
+ const status = HttpApiSchema.getStatusSuccessSchema(streamSuccess)
1026
+ const decode = streamToResponse(streamSuccess, parseOptions.success, parseOptions.headers)
1027
+ for (const contentType of streamSchema.contentTypes) {
1028
+ addResponseAlternative(successAlternatives, status, contentType, decode)
1029
+ }
1030
+ }
1031
+ for (const [status, alternatives] of successAlternatives.entries()) {
1032
+ decodeMap[status] = makeResponseDecoder(alternatives)
1033
+ }
1034
+ const upgrade = getUpgradeSuccessSchema(endpoint)
1035
+ if (upgrade !== undefined) {
1036
+ const decodeHeaders = upgrade.headers === undefined
1037
+ ? Effect.succeed
1038
+ : Schema.decodeUnknownEffect(upgrade.headers, parseOptions.headers)
1039
+ decodeMap[101] = (response) =>
1040
+ // the cleanup must be in place before an interruption can be observed
1041
+ Effect.uninterruptibleMask((restore) =>
1042
+ Effect.flatMap(response.upgrade, (socket) =>
1043
+ restore(decodeHeaders(response.headers)).pipe(
1044
+ Effect.map((headers): Upgraded<unknown> => ({ headers, socket })),
1045
+ // nothing takes the connection on failure, so close it: releasing
1046
+ // the reader's scope closes the connection
1047
+ Effect.onError(() => Effect.ignore(Effect.scoped(socket.reader)))
1048
+ ))
1049
+ )
1050
+ }
1051
+
1052
+ return (response, sseOptions) => (decodeMap[response.status] ?? decodeMap.orElse)(response, sseOptions)
1053
+ }
1054
+
910
1055
  type ResponseDecoder = (
911
1056
  response: HttpClientResponse.HttpClientResponse,
912
1057
  sseOptions?: Sse.DecodeOptions
@@ -934,7 +1079,7 @@ function addResponseAlternative(
934
1079
 
935
1080
  function makeResponseDecoder(alternatives: ReadonlyArray<ResponseAlternative>): ResponseDecoder {
936
1081
  const first = alternatives[0]
937
- if (alternatives.length === 1 && first !== undefined) {
1082
+ if (first !== undefined && alternatives.every((alternative) => alternative.decode === first.decode)) {
938
1083
  return first.decode
939
1084
  }
940
1085
  return (response, sseOptions) => {
@@ -1241,7 +1386,8 @@ const statusOrElse = (response: HttpClientResponse.HttpClientResponse) =>
1241
1386
  new HttpClientError.HttpClientError({
1242
1387
  reason: new HttpClientError.DecodeError({
1243
1388
  request: response.request,
1244
- response
1389
+ response,
1390
+ description: "undeclared status code"
1245
1391
  })
1246
1392
  })
1247
1393
  )