effect 4.0.0-beta.103 → 4.0.0-beta.104

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 (523) hide show
  1. package/dist/Cache.js +1 -1
  2. package/dist/Cache.js.map +1 -1
  3. package/dist/Channel.d.ts +1 -1
  4. package/dist/Channel.d.ts.map +1 -1
  5. package/dist/Channel.js.map +1 -1
  6. package/dist/Config.d.ts.map +1 -1
  7. package/dist/Config.js +28 -7
  8. package/dist/Config.js.map +1 -1
  9. package/dist/ConfigProvider.d.ts.map +1 -1
  10. package/dist/ConfigProvider.js +2 -1
  11. package/dist/ConfigProvider.js.map +1 -1
  12. package/dist/Context.d.ts +2 -2
  13. package/dist/Context.d.ts.map +1 -1
  14. package/dist/Context.js.map +1 -1
  15. package/dist/Crypto.d.ts.map +1 -1
  16. package/dist/Crypto.js +13 -5
  17. package/dist/Crypto.js.map +1 -1
  18. package/dist/Duration.d.ts.map +1 -1
  19. package/dist/Duration.js +12 -1
  20. package/dist/Duration.js.map +1 -1
  21. package/dist/Effect.d.ts +132 -14
  22. package/dist/Effect.d.ts.map +1 -1
  23. package/dist/Effect.js +38 -0
  24. package/dist/Effect.js.map +1 -1
  25. package/dist/Equal.d.ts.map +1 -1
  26. package/dist/Equal.js +10 -2
  27. package/dist/Equal.js.map +1 -1
  28. package/dist/ExecutionPlan.d.ts +73 -0
  29. package/dist/ExecutionPlan.d.ts.map +1 -1
  30. package/dist/ExecutionPlan.js +1 -1
  31. package/dist/ExecutionPlan.js.map +1 -1
  32. package/dist/FiberSet.js +1 -1
  33. package/dist/FileSystem.d.ts +2 -2
  34. package/dist/Function.d.ts +4 -3
  35. package/dist/Function.d.ts.map +1 -1
  36. package/dist/Function.js +5 -5
  37. package/dist/Function.js.map +1 -1
  38. package/dist/Iterable.d.ts.map +1 -1
  39. package/dist/Iterable.js +11 -10
  40. package/dist/Iterable.js.map +1 -1
  41. package/dist/Layer.d.ts.map +1 -1
  42. package/dist/Layer.js +7 -5
  43. package/dist/Layer.js.map +1 -1
  44. package/dist/Schedule.d.ts +8 -8
  45. package/dist/Schedule.d.ts.map +1 -1
  46. package/dist/Schedule.js +4 -4
  47. package/dist/Schedule.js.map +1 -1
  48. package/dist/Schema.d.ts +32 -32
  49. package/dist/Schema.d.ts.map +1 -1
  50. package/dist/Schema.js +23 -18
  51. package/dist/Schema.js.map +1 -1
  52. package/dist/SchemaAST.d.ts +3 -3
  53. package/dist/SchemaAST.d.ts.map +1 -1
  54. package/dist/SchemaAST.js +47 -31
  55. package/dist/SchemaAST.js.map +1 -1
  56. package/dist/SchemaParser.d.ts.map +1 -1
  57. package/dist/SchemaParser.js +35 -53
  58. package/dist/SchemaParser.js.map +1 -1
  59. package/dist/ScopedCache.js +1 -1
  60. package/dist/ScopedCache.js.map +1 -1
  61. package/dist/Sink.d.ts +1 -1
  62. package/dist/Sink.d.ts.map +1 -1
  63. package/dist/Stream.d.ts +27 -4
  64. package/dist/Stream.d.ts.map +1 -1
  65. package/dist/Stream.js +27 -2
  66. package/dist/Stream.js.map +1 -1
  67. package/dist/SynchronizedRef.js +1 -1
  68. package/dist/SynchronizedRef.js.map +1 -1
  69. package/dist/Terminal.js +1 -1
  70. package/dist/Terminal.js.map +1 -1
  71. package/dist/Tuple.d.ts +6 -4
  72. package/dist/Tuple.d.ts.map +1 -1
  73. package/dist/Tuple.js.map +1 -1
  74. package/dist/TxReentrantLock.d.ts +0 -56
  75. package/dist/TxReentrantLock.d.ts.map +1 -1
  76. package/dist/TxReentrantLock.js +8 -8
  77. package/dist/TxReentrantLock.js.map +1 -1
  78. package/dist/internal/dateTime.js +1 -1
  79. package/dist/internal/dateTime.js.map +1 -1
  80. package/dist/internal/executionPlan.js +51 -3
  81. package/dist/internal/executionPlan.js.map +1 -1
  82. package/dist/internal/hashMap.js +12 -8
  83. package/dist/internal/hashMap.js.map +1 -1
  84. package/dist/internal/matcher.js +1 -1
  85. package/dist/internal/matcher.js.map +1 -1
  86. package/dist/internal/schedule.js.map +1 -1
  87. package/dist/internal/schema/annotations.js +2 -0
  88. package/dist/internal/schema/annotations.js.map +1 -1
  89. package/dist/internal/schema/toArbitrary.js +1 -1
  90. package/dist/internal/schema/toArbitrary.js.map +1 -1
  91. package/dist/internal/trie.js +13 -3
  92. package/dist/internal/trie.js.map +1 -1
  93. package/dist/testing/TestClock.d.ts.map +1 -1
  94. package/dist/testing/TestClock.js +11 -1
  95. package/dist/testing/TestClock.js.map +1 -1
  96. package/dist/testing/TestSchema.d.ts +1 -1
  97. package/dist/testing/TestSchema.d.ts.map +1 -1
  98. package/dist/unstable/ai/AiError.js +19 -19
  99. package/dist/unstable/ai/AiError.js.map +1 -1
  100. package/dist/unstable/ai/Chat.js +1 -1
  101. package/dist/unstable/ai/Chat.js.map +1 -1
  102. package/dist/unstable/ai/LanguageModel.js +4 -2
  103. package/dist/unstable/ai/LanguageModel.js.map +1 -1
  104. package/dist/unstable/ai/McpSchema.d.ts +132 -132
  105. package/dist/unstable/ai/McpSchema.d.ts.map +1 -1
  106. package/dist/unstable/ai/McpSchema.js +8 -8
  107. package/dist/unstable/ai/McpSchema.js.map +1 -1
  108. package/dist/unstable/ai/McpServer.js +1 -1
  109. package/dist/unstable/ai/McpServer.js.map +1 -1
  110. package/dist/unstable/ai/Prompt.d.ts +15 -3
  111. package/dist/unstable/ai/Prompt.d.ts.map +1 -1
  112. package/dist/unstable/ai/Prompt.js +6 -3
  113. package/dist/unstable/ai/Prompt.js.map +1 -1
  114. package/dist/unstable/cli/CliError.d.ts +3 -3
  115. package/dist/unstable/cli/CliError.js +11 -11
  116. package/dist/unstable/cli/CliError.js.map +1 -1
  117. package/dist/unstable/cli/Command.d.ts +9 -9
  118. package/dist/unstable/cli/Command.d.ts.map +1 -1
  119. package/dist/unstable/cli/Command.js +8 -6
  120. package/dist/unstable/cli/Command.js.map +1 -1
  121. package/dist/unstable/cli/Param.d.ts +7 -5
  122. package/dist/unstable/cli/Param.d.ts.map +1 -1
  123. package/dist/unstable/cli/Param.js +15 -11
  124. package/dist/unstable/cli/Param.js.map +1 -1
  125. package/dist/unstable/cli/Primitive.d.ts.map +1 -1
  126. package/dist/unstable/cli/Primitive.js +31 -24
  127. package/dist/unstable/cli/Primitive.js.map +1 -1
  128. package/dist/unstable/cli/Prompt.d.ts.map +1 -1
  129. package/dist/unstable/cli/Prompt.js +31 -17
  130. package/dist/unstable/cli/Prompt.js.map +1 -1
  131. package/dist/unstable/cli/internal/ansi.js +2 -2
  132. package/dist/unstable/cli/internal/ansi.js.map +1 -1
  133. package/dist/unstable/cli/internal/command.d.ts +2 -2
  134. package/dist/unstable/cli/internal/command.d.ts.map +1 -1
  135. package/dist/unstable/cli/internal/command.js +10 -9
  136. package/dist/unstable/cli/internal/command.js.map +1 -1
  137. package/dist/unstable/cli/internal/completions/bash.js +69 -9
  138. package/dist/unstable/cli/internal/completions/bash.js.map +1 -1
  139. package/dist/unstable/cli/internal/completions/descriptor.js +24 -18
  140. package/dist/unstable/cli/internal/completions/descriptor.js.map +1 -1
  141. package/dist/unstable/cli/internal/completions/fish.js +5 -5
  142. package/dist/unstable/cli/internal/completions/fish.js.map +1 -1
  143. package/dist/unstable/cli/internal/help.d.ts.map +1 -1
  144. package/dist/unstable/cli/internal/help.js +4 -2
  145. package/dist/unstable/cli/internal/help.js.map +1 -1
  146. package/dist/unstable/cli/internal/parser.js +3 -3
  147. package/dist/unstable/cli/internal/parser.js.map +1 -1
  148. package/dist/unstable/cli/internal/wizard.js +2 -2
  149. package/dist/unstable/cli/internal/wizard.js.map +1 -1
  150. package/dist/unstable/cluster/ClusterError.js +7 -7
  151. package/dist/unstable/cluster/ClusterError.js.map +1 -1
  152. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  153. package/dist/unstable/cluster/ClusterWorkflowEngine.js +1 -1
  154. package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
  155. package/dist/unstable/cluster/MessageStorage.d.ts.map +1 -1
  156. package/dist/unstable/cluster/MessageStorage.js +8 -1
  157. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  158. package/dist/unstable/cluster/Reply.d.ts +8 -0
  159. package/dist/unstable/cluster/Reply.d.ts.map +1 -1
  160. package/dist/unstable/cluster/Reply.js +12 -0
  161. package/dist/unstable/cluster/Reply.js.map +1 -1
  162. package/dist/unstable/cluster/RunnerServer.d.ts.map +1 -1
  163. package/dist/unstable/cluster/RunnerServer.js +4 -2
  164. package/dist/unstable/cluster/RunnerServer.js.map +1 -1
  165. package/dist/unstable/cluster/RunnerStorage.d.ts +1 -2
  166. package/dist/unstable/cluster/RunnerStorage.d.ts.map +1 -1
  167. package/dist/unstable/cluster/RunnerStorage.js +7 -6
  168. package/dist/unstable/cluster/RunnerStorage.js.map +1 -1
  169. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  170. package/dist/unstable/cluster/Sharding.js +22 -4
  171. package/dist/unstable/cluster/Sharding.js.map +1 -1
  172. package/dist/unstable/cluster/internal/entityManager.js +1 -1
  173. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  174. package/dist/unstable/cluster/internal/resourceMap.js +2 -2
  175. package/dist/unstable/cluster/internal/resourceMap.js.map +1 -1
  176. package/dist/unstable/cluster/internal/resourceRef.js +17 -0
  177. package/dist/unstable/cluster/internal/resourceRef.js.map +1 -1
  178. package/dist/unstable/devtools/DevToolsClient.d.ts.map +1 -1
  179. package/dist/unstable/devtools/DevToolsClient.js +7 -2
  180. package/dist/unstable/devtools/DevToolsClient.js.map +1 -1
  181. package/dist/unstable/encoding/Ini.d.ts +20 -0
  182. package/dist/unstable/encoding/Ini.d.ts.map +1 -0
  183. package/dist/unstable/encoding/Ini.js +153 -0
  184. package/dist/unstable/encoding/Ini.js.map +1 -0
  185. package/dist/unstable/encoding/Msgpack.d.ts +2 -1
  186. package/dist/unstable/encoding/Msgpack.d.ts.map +1 -1
  187. package/dist/unstable/encoding/Msgpack.js +21 -7
  188. package/dist/unstable/encoding/Msgpack.js.map +1 -1
  189. package/dist/unstable/encoding/Ndjson.d.ts.map +1 -1
  190. package/dist/unstable/encoding/Ndjson.js +7 -1
  191. package/dist/unstable/encoding/Ndjson.js.map +1 -1
  192. package/dist/unstable/encoding/Sse.d.ts.map +1 -1
  193. package/dist/unstable/encoding/Sse.js +14 -23
  194. package/dist/unstable/encoding/Sse.js.map +1 -1
  195. package/dist/unstable/encoding/Toml.d.ts +19 -0
  196. package/dist/unstable/encoding/Toml.d.ts.map +1 -0
  197. package/dist/unstable/encoding/Toml.js +434 -0
  198. package/dist/unstable/encoding/Toml.js.map +1 -0
  199. package/dist/unstable/encoding/Yaml.d.ts +19 -0
  200. package/dist/unstable/encoding/Yaml.d.ts.map +1 -0
  201. package/dist/unstable/encoding/Yaml.js +461 -0
  202. package/dist/unstable/encoding/Yaml.js.map +1 -0
  203. package/dist/unstable/encoding/index.d.ts +12 -0
  204. package/dist/unstable/encoding/index.d.ts.map +1 -1
  205. package/dist/unstable/encoding/index.js +12 -0
  206. package/dist/unstable/encoding/index.js.map +1 -1
  207. package/dist/unstable/eventlog/EventJournal.d.ts +1 -1
  208. package/dist/unstable/eventlog/EventJournal.d.ts.map +1 -1
  209. package/dist/unstable/eventlog/EventJournal.js +13 -5
  210. package/dist/unstable/eventlog/EventJournal.js.map +1 -1
  211. package/dist/unstable/eventlog/EventLogMessage.js +1 -1
  212. package/dist/unstable/eventlog/EventLogMessage.js.map +1 -1
  213. package/dist/unstable/eventlog/EventLogServerUnencrypted.js +1 -1
  214. package/dist/unstable/eventlog/EventLogServerUnencrypted.js.map +1 -1
  215. package/dist/unstable/eventlog/SqlEventJournal.d.ts.map +1 -1
  216. package/dist/unstable/eventlog/SqlEventJournal.js +1 -4
  217. package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -1
  218. package/dist/unstable/http/FindMyWay/internal/queryString.d.ts +11 -0
  219. package/dist/unstable/http/FindMyWay/internal/queryString.d.ts.map +1 -0
  220. package/dist/unstable/http/FindMyWay/internal/queryString.js +259 -0
  221. package/dist/unstable/http/FindMyWay/internal/queryString.js.map +1 -0
  222. package/dist/unstable/http/FindMyWay/internal/router.d.ts +2 -0
  223. package/dist/unstable/http/FindMyWay/internal/router.d.ts.map +1 -0
  224. package/dist/unstable/http/FindMyWay/internal/router.js +665 -0
  225. package/dist/unstable/http/FindMyWay/internal/router.js.map +1 -0
  226. package/dist/unstable/http/FindMyWay.d.ts +33 -8
  227. package/dist/unstable/http/FindMyWay.d.ts.map +1 -1
  228. package/dist/unstable/http/FindMyWay.js +4 -7
  229. package/dist/unstable/http/FindMyWay.js.map +1 -1
  230. package/dist/unstable/http/HttpClientError.js +1 -1
  231. package/dist/unstable/http/HttpClientError.js.map +1 -1
  232. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  233. package/dist/unstable/http/HttpClientRequest.js +2 -14
  234. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  235. package/dist/unstable/http/HttpClientResponse.js +1 -16
  236. package/dist/unstable/http/HttpClientResponse.js.map +1 -1
  237. package/dist/unstable/http/HttpPlatform.d.ts.map +1 -1
  238. package/dist/unstable/http/HttpPlatform.js +21 -3
  239. package/dist/unstable/http/HttpPlatform.js.map +1 -1
  240. package/dist/unstable/http/HttpServerRequest.d.ts.map +1 -1
  241. package/dist/unstable/http/HttpServerRequest.js +7 -6
  242. package/dist/unstable/http/HttpServerRequest.js.map +1 -1
  243. package/dist/unstable/http/HttpServerResponse.d.ts.map +1 -1
  244. package/dist/unstable/http/HttpServerResponse.js +8 -6
  245. package/dist/unstable/http/HttpServerResponse.js.map +1 -1
  246. package/dist/unstable/http/Multipart.d.ts +1 -1
  247. package/dist/unstable/http/Multipart.d.ts.map +1 -1
  248. package/dist/unstable/http/Multipart.js +9 -2
  249. package/dist/unstable/http/Multipart.js.map +1 -1
  250. package/dist/unstable/http/MultipartParser/HeadersParser.d.ts +53 -0
  251. package/dist/unstable/http/MultipartParser/HeadersParser.d.ts.map +1 -0
  252. package/dist/unstable/http/MultipartParser/HeadersParser.js +14 -0
  253. package/dist/unstable/http/MultipartParser/HeadersParser.js.map +1 -0
  254. package/dist/unstable/http/MultipartParser/Search.d.ts +11 -0
  255. package/dist/unstable/http/MultipartParser/Search.d.ts.map +1 -0
  256. package/dist/unstable/http/MultipartParser/Search.js +14 -0
  257. package/dist/unstable/http/MultipartParser/Search.js.map +1 -0
  258. package/dist/unstable/http/MultipartParser/internal/contentType.d.ts +5 -0
  259. package/dist/unstable/http/MultipartParser/internal/contentType.d.ts.map +1 -0
  260. package/dist/unstable/http/MultipartParser/internal/contentType.js +82 -0
  261. package/dist/unstable/http/MultipartParser/internal/contentType.js.map +1 -0
  262. package/dist/unstable/http/MultipartParser/internal/headers.d.ts +3 -0
  263. package/dist/unstable/http/MultipartParser/internal/headers.d.ts.map +1 -0
  264. package/dist/unstable/http/MultipartParser/internal/headers.js +194 -0
  265. package/dist/unstable/http/MultipartParser/internal/headers.js.map +1 -0
  266. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts +8 -0
  267. package/dist/unstable/http/MultipartParser/internal/multipart.d.ts.map +1 -0
  268. package/dist/unstable/http/MultipartParser/internal/multipart.js +226 -0
  269. package/dist/unstable/http/MultipartParser/internal/multipart.js.map +1 -0
  270. package/dist/unstable/http/MultipartParser/internal/search.d.ts +5 -0
  271. package/dist/unstable/http/MultipartParser/internal/search.d.ts.map +1 -0
  272. package/dist/unstable/http/MultipartParser/internal/search.js +120 -0
  273. package/dist/unstable/http/MultipartParser/internal/search.js.map +1 -0
  274. package/dist/unstable/http/MultipartParser.d.ts +98 -0
  275. package/dist/unstable/http/MultipartParser.d.ts.map +1 -0
  276. package/dist/unstable/http/MultipartParser.js +23 -0
  277. package/dist/unstable/http/MultipartParser.js.map +1 -0
  278. package/dist/unstable/http/Template.d.ts.map +1 -1
  279. package/dist/unstable/http/Template.js +2 -2
  280. package/dist/unstable/http/Template.js.map +1 -1
  281. package/dist/unstable/http/index.d.ts +1 -1
  282. package/dist/unstable/http/index.d.ts.map +1 -1
  283. package/dist/unstable/http/index.js +1 -1
  284. package/dist/unstable/http/index.js.map +1 -1
  285. package/dist/unstable/http/internal/httpBody.d.ts +2 -0
  286. package/dist/unstable/http/internal/httpBody.d.ts.map +1 -0
  287. package/dist/unstable/http/internal/httpBody.js +10 -0
  288. package/dist/unstable/http/internal/httpBody.js.map +1 -0
  289. package/dist/unstable/httpapi/HttpApi.d.ts.map +1 -1
  290. package/dist/unstable/httpapi/HttpApi.js +5 -5
  291. package/dist/unstable/httpapi/HttpApi.js.map +1 -1
  292. package/dist/unstable/httpapi/HttpApiBuilder.js +68 -15
  293. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  294. package/dist/unstable/httpapi/HttpApiClient.d.ts +1 -1
  295. package/dist/unstable/httpapi/HttpApiClient.d.ts.map +1 -1
  296. package/dist/unstable/httpapi/HttpApiClient.js +65 -25
  297. package/dist/unstable/httpapi/HttpApiClient.js.map +1 -1
  298. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts +6 -4
  299. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts.map +1 -1
  300. package/dist/unstable/httpapi/HttpApiEndpoint.js +73 -16
  301. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  302. package/dist/unstable/httpapi/HttpApiError.d.ts +5 -5
  303. package/dist/unstable/httpapi/HttpApiError.d.ts.map +1 -1
  304. package/dist/unstable/httpapi/HttpApiError.js +17 -17
  305. package/dist/unstable/httpapi/HttpApiError.js.map +1 -1
  306. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts +1 -1
  307. package/dist/unstable/httpapi/HttpApiMiddleware.js +1 -1
  308. package/dist/unstable/httpapi/HttpApiSchema.d.ts +219 -0
  309. package/dist/unstable/httpapi/HttpApiSchema.d.ts.map +1 -1
  310. package/dist/unstable/httpapi/HttpApiSchema.js +170 -0
  311. package/dist/unstable/httpapi/HttpApiSchema.js.map +1 -1
  312. package/dist/unstable/httpapi/OpenApi.d.ts +8 -0
  313. package/dist/unstable/httpapi/OpenApi.d.ts.map +1 -1
  314. package/dist/unstable/httpapi/OpenApi.js +45 -18
  315. package/dist/unstable/httpapi/OpenApi.js.map +1 -1
  316. package/dist/unstable/observability/OtlpExporter.d.ts +1 -1
  317. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  318. package/dist/unstable/observability/OtlpExporter.js +2 -1
  319. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  320. package/dist/unstable/observability/OtlpLogger.d.ts.map +1 -1
  321. package/dist/unstable/observability/OtlpLogger.js +2 -2
  322. package/dist/unstable/observability/OtlpLogger.js.map +1 -1
  323. package/dist/unstable/observability/OtlpMetrics.d.ts +2 -2
  324. package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
  325. package/dist/unstable/observability/OtlpMetrics.js +28 -15
  326. package/dist/unstable/observability/OtlpMetrics.js.map +1 -1
  327. package/dist/unstable/observability/OtlpTracer.js +1 -1
  328. package/dist/unstable/observability/OtlpTracer.js.map +1 -1
  329. package/dist/unstable/persistence/PersistedQueue.d.ts.map +1 -1
  330. package/dist/unstable/persistence/PersistedQueue.js +9 -9
  331. package/dist/unstable/persistence/PersistedQueue.js.map +1 -1
  332. package/dist/unstable/persistence/Persistence.d.ts.map +1 -1
  333. package/dist/unstable/persistence/Persistence.js +17 -7
  334. package/dist/unstable/persistence/Persistence.js.map +1 -1
  335. package/dist/unstable/persistence/RateLimiter.d.ts +22 -12
  336. package/dist/unstable/persistence/RateLimiter.d.ts.map +1 -1
  337. package/dist/unstable/persistence/RateLimiter.js +15 -42
  338. package/dist/unstable/persistence/RateLimiter.js.map +1 -1
  339. package/dist/unstable/persistence/Redis.js +1 -1
  340. package/dist/unstable/persistence/Redis.js.map +1 -1
  341. package/dist/unstable/rpc/RpcClient.d.ts +14 -0
  342. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  343. package/dist/unstable/rpc/RpcClient.js +18 -9
  344. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  345. package/dist/unstable/rpc/RpcClientError.js +2 -2
  346. package/dist/unstable/rpc/RpcClientError.js.map +1 -1
  347. package/dist/unstable/rpc/RpcSerialization.js +3 -1
  348. package/dist/unstable/rpc/RpcSerialization.js.map +1 -1
  349. package/dist/unstable/schema/Model.d.ts +1 -1
  350. package/dist/unstable/schema/Model.d.ts.map +1 -1
  351. package/dist/unstable/schema/VariantSchema.d.ts +5 -5
  352. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  353. package/dist/unstable/schema/VariantSchema.js +17 -9
  354. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  355. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  356. package/dist/unstable/socket/Socket.js +28 -12
  357. package/dist/unstable/socket/Socket.js.map +1 -1
  358. package/dist/unstable/sql/SqlClient.d.ts.map +1 -1
  359. package/dist/unstable/sql/SqlClient.js +7 -3
  360. package/dist/unstable/sql/SqlClient.js.map +1 -1
  361. package/dist/unstable/sql/SqlError.js +13 -13
  362. package/dist/unstable/sql/SqlError.js.map +1 -1
  363. package/dist/unstable/sql/SqlResolver.js +8 -6
  364. package/dist/unstable/sql/SqlResolver.js.map +1 -1
  365. package/dist/unstable/sql/Statement.d.ts.map +1 -1
  366. package/dist/unstable/sql/Statement.js +8 -6
  367. package/dist/unstable/sql/Statement.js.map +1 -1
  368. package/dist/unstable/workers/WorkerError.js +5 -5
  369. package/dist/unstable/workers/WorkerError.js.map +1 -1
  370. package/dist/unstable/workflow/WorkflowEngine.d.ts +1 -1
  371. package/dist/unstable/workflow/WorkflowEngine.d.ts.map +1 -1
  372. package/dist/unstable/workflow/WorkflowEngine.js +3 -3
  373. package/dist/unstable/workflow/WorkflowEngine.js.map +1 -1
  374. package/package.json +2 -8
  375. package/src/Cache.ts +1 -1
  376. package/src/Channel.ts +1 -1
  377. package/src/Config.ts +28 -7
  378. package/src/ConfigProvider.ts +4 -1
  379. package/src/Context.ts +5 -5
  380. package/src/Crypto.ts +17 -8
  381. package/src/Duration.ts +16 -2
  382. package/src/Effect.ts +141 -17
  383. package/src/Equal.ts +10 -2
  384. package/src/ExecutionPlan.ts +78 -1
  385. package/src/FiberSet.ts +1 -1
  386. package/src/FileSystem.ts +2 -2
  387. package/src/Function.ts +6 -6
  388. package/src/Iterable.ts +11 -10
  389. package/src/Layer.ts +7 -5
  390. package/src/Schedule.ts +13 -13
  391. package/src/Schema.ts +50 -41
  392. package/src/SchemaAST.ts +69 -37
  393. package/src/SchemaParser.ts +75 -69
  394. package/src/ScopedCache.ts +1 -1
  395. package/src/Sink.ts +1 -1
  396. package/src/Stream.ts +77 -10
  397. package/src/SynchronizedRef.ts +1 -1
  398. package/src/Terminal.ts +1 -1
  399. package/src/Tuple.ts +7 -4
  400. package/src/TxReentrantLock.ts +39 -35
  401. package/src/internal/dateTime.ts +1 -1
  402. package/src/internal/executionPlan.ts +105 -10
  403. package/src/internal/hashMap.ts +20 -14
  404. package/src/internal/matcher.ts +2 -2
  405. package/src/internal/schedule.ts +4 -4
  406. package/src/internal/schema/annotations.ts +3 -0
  407. package/src/internal/schema/toArbitrary.ts +3 -1
  408. package/src/internal/trie.ts +12 -2
  409. package/src/testing/TestClock.ts +13 -1
  410. package/src/testing/TestSchema.ts +1 -1
  411. package/src/unstable/ai/AiError.ts +19 -19
  412. package/src/unstable/ai/Chat.ts +1 -1
  413. package/src/unstable/ai/LanguageModel.ts +4 -2
  414. package/src/unstable/ai/McpSchema.ts +17 -16
  415. package/src/unstable/ai/McpServer.ts +1 -1
  416. package/src/unstable/ai/Prompt.ts +21 -6
  417. package/src/unstable/cli/CliError.ts +12 -12
  418. package/src/unstable/cli/Command.ts +12 -10
  419. package/src/unstable/cli/Param.ts +41 -19
  420. package/src/unstable/cli/Primitive.ts +11 -5
  421. package/src/unstable/cli/Prompt.ts +36 -20
  422. package/src/unstable/cli/internal/ansi.ts +2 -2
  423. package/src/unstable/cli/internal/command.ts +15 -10
  424. package/src/unstable/cli/internal/completions/bash.ts +59 -9
  425. package/src/unstable/cli/internal/completions/descriptor.ts +14 -20
  426. package/src/unstable/cli/internal/completions/fish.ts +5 -7
  427. package/src/unstable/cli/internal/help.ts +4 -2
  428. package/src/unstable/cli/internal/parser.ts +3 -3
  429. package/src/unstable/cli/internal/wizard.ts +2 -2
  430. package/src/unstable/cluster/ClusterError.ts +7 -7
  431. package/src/unstable/cluster/ClusterWorkflowEngine.ts +4 -1
  432. package/src/unstable/cluster/MessageStorage.ts +9 -5
  433. package/src/unstable/cluster/Reply.ts +21 -0
  434. package/src/unstable/cluster/RunnerServer.ts +4 -10
  435. package/src/unstable/cluster/RunnerStorage.ts +9 -7
  436. package/src/unstable/cluster/Sharding.ts +35 -7
  437. package/src/unstable/cluster/internal/entityManager.ts +1 -1
  438. package/src/unstable/cluster/internal/resourceMap.ts +5 -2
  439. package/src/unstable/cluster/internal/resourceRef.ts +27 -5
  440. package/src/unstable/devtools/DevToolsClient.ts +3 -2
  441. package/src/unstable/encoding/Ini.ts +174 -0
  442. package/src/unstable/encoding/Msgpack.ts +47 -28
  443. package/src/unstable/encoding/Ndjson.ts +9 -1
  444. package/src/unstable/encoding/Sse.ts +11 -21
  445. package/src/unstable/encoding/Toml.ts +504 -0
  446. package/src/unstable/encoding/Yaml.ts +541 -0
  447. package/src/unstable/encoding/index.ts +15 -0
  448. package/src/unstable/eventlog/EventJournal.ts +14 -6
  449. package/src/unstable/eventlog/EventLogMessage.ts +1 -1
  450. package/src/unstable/eventlog/EventLogServerUnencrypted.ts +1 -1
  451. package/src/unstable/eventlog/SqlEventJournal.ts +6 -4
  452. package/src/unstable/http/FindMyWay/internal/queryString.ts +420 -0
  453. package/src/unstable/http/FindMyWay/internal/router.ts +950 -0
  454. package/src/unstable/http/FindMyWay.ts +65 -6
  455. package/src/unstable/http/HttpClientError.ts +1 -1
  456. package/src/unstable/http/HttpClientRequest.ts +2 -14
  457. package/src/unstable/http/HttpClientResponse.ts +1 -17
  458. package/src/unstable/http/HttpPlatform.ts +34 -6
  459. package/src/unstable/http/HttpServerRequest.ts +14 -6
  460. package/src/unstable/http/HttpServerResponse.ts +9 -7
  461. package/src/unstable/http/Multipart.ts +9 -2
  462. package/src/unstable/http/MultipartParser/HeadersParser.ts +68 -0
  463. package/src/unstable/http/MultipartParser/Search.ts +17 -0
  464. package/src/unstable/http/MultipartParser/internal/contentType.ts +103 -0
  465. package/src/unstable/http/MultipartParser/internal/headers.ts +615 -0
  466. package/src/unstable/http/MultipartParser/internal/multipart.ts +262 -0
  467. package/src/unstable/http/MultipartParser/internal/search.ts +167 -0
  468. package/src/unstable/http/MultipartParser.ts +115 -0
  469. package/src/unstable/http/Template.ts +6 -5
  470. package/src/unstable/http/index.ts +1 -1
  471. package/src/unstable/http/internal/httpBody.ts +15 -0
  472. package/src/unstable/httpapi/HttpApi.ts +6 -7
  473. package/src/unstable/httpapi/HttpApiBuilder.ts +119 -21
  474. package/src/unstable/httpapi/HttpApiClient.ts +104 -41
  475. package/src/unstable/httpapi/HttpApiEndpoint.ts +117 -29
  476. package/src/unstable/httpapi/HttpApiError.ts +33 -39
  477. package/src/unstable/httpapi/HttpApiMiddleware.ts +1 -1
  478. package/src/unstable/httpapi/HttpApiSchema.ts +353 -0
  479. package/src/unstable/httpapi/OpenApi.ts +70 -20
  480. package/src/unstable/observability/OtlpExporter.ts +4 -2
  481. package/src/unstable/observability/OtlpLogger.ts +3 -1
  482. package/src/unstable/observability/OtlpMetrics.ts +32 -18
  483. package/src/unstable/observability/OtlpTracer.ts +1 -1
  484. package/src/unstable/persistence/PersistedQueue.ts +12 -9
  485. package/src/unstable/persistence/Persistence.ts +27 -7
  486. package/src/unstable/persistence/RateLimiter.ts +54 -31
  487. package/src/unstable/persistence/Redis.ts +1 -1
  488. package/src/unstable/rpc/RpcClient.ts +38 -12
  489. package/src/unstable/rpc/RpcClientError.ts +2 -2
  490. package/src/unstable/rpc/RpcSerialization.ts +1 -1
  491. package/src/unstable/schema/VariantSchema.ts +36 -18
  492. package/src/unstable/socket/Socket.ts +24 -14
  493. package/src/unstable/sql/SqlClient.ts +65 -56
  494. package/src/unstable/sql/SqlError.ts +13 -13
  495. package/src/unstable/sql/SqlResolver.ts +8 -6
  496. package/src/unstable/sql/Statement.ts +13 -8
  497. package/src/unstable/workers/WorkerError.ts +5 -5
  498. package/src/unstable/workflow/WorkflowEngine.ts +8 -3
  499. package/dist/unstable/http/Multipasta/HeadersParser.d.ts +0 -14
  500. package/dist/unstable/http/Multipasta/HeadersParser.d.ts.map +0 -1
  501. package/dist/unstable/http/Multipasta/HeadersParser.js +0 -14
  502. package/dist/unstable/http/Multipasta/HeadersParser.js.map +0 -1
  503. package/dist/unstable/http/Multipasta/Node.d.ts +0 -14
  504. package/dist/unstable/http/Multipasta/Node.d.ts.map +0 -1
  505. package/dist/unstable/http/Multipasta/Node.js +0 -14
  506. package/dist/unstable/http/Multipasta/Node.js.map +0 -1
  507. package/dist/unstable/http/Multipasta/Search.d.ts +0 -14
  508. package/dist/unstable/http/Multipasta/Search.d.ts.map +0 -1
  509. package/dist/unstable/http/Multipasta/Search.js +0 -14
  510. package/dist/unstable/http/Multipasta/Search.js.map +0 -1
  511. package/dist/unstable/http/Multipasta/Web.d.ts +0 -14
  512. package/dist/unstable/http/Multipasta/Web.d.ts.map +0 -1
  513. package/dist/unstable/http/Multipasta/Web.js +0 -14
  514. package/dist/unstable/http/Multipasta/Web.js.map +0 -1
  515. package/dist/unstable/http/Multipasta.d.ts +0 -15
  516. package/dist/unstable/http/Multipasta.d.ts.map +0 -1
  517. package/dist/unstable/http/Multipasta.js +0 -15
  518. package/dist/unstable/http/Multipasta.js.map +0 -1
  519. package/src/unstable/http/Multipasta/HeadersParser.ts +0 -14
  520. package/src/unstable/http/Multipasta/Node.ts +0 -14
  521. package/src/unstable/http/Multipasta/Search.ts +0 -14
  522. package/src/unstable/http/Multipasta/Web.ts +0 -14
  523. package/src/unstable/http/Multipasta.ts +0 -15
@@ -1,15 +1,74 @@
1
1
  /**
2
- * Re-exports the `find-my-way-ts` router package used by the unstable HTTP
3
- * routing modules.
2
+ * A radix-tree HTTP router used by the unstable HTTP routing modules.
4
3
  *
5
- * This module keeps the router types and helpers available from the Effect HTTP
6
- * namespace without wrapping or changing them.
4
+ * @since 4.0.0
5
+ */
6
+ import * as internal from "./FindMyWay/internal/router.ts"
7
+
8
+ /*
9
+ * MIT License
10
+ *
11
+ * Copyright (c) 2017-2019 Tomas Della Vedova
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ * of this software and associated documentation files (the "Software"), to deal
15
+ * in the Software without restriction, including without limitation the rights
16
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ * copies of the Software, and to permit persons to whom the Software is
18
+ * furnished to do so, subject to the following conditions:
19
+ *
20
+ * The above copyright notice and this permission notice shall be included in all
21
+ * copies or substantial portions of the Software.
7
22
  *
23
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ * SOFTWARE.
30
+ */
31
+
32
+ /**
33
+ * @since 4.0.0
34
+ * @category models
35
+ */
36
+ export interface RouterConfig {
37
+ readonly ignoreTrailingSlash: boolean
38
+ readonly ignoreDuplicateSlashes: boolean
39
+ readonly caseSensitive: boolean
40
+ readonly maxParamLength: number
41
+ }
42
+
43
+ /**
44
+ * @since 4.0.0
45
+ * @category models
46
+ */
47
+ export type PathInput = `/${string}` | "*"
48
+
49
+ /**
50
+ * @since 4.0.0
51
+ * @category models
52
+ */
53
+ export interface Router<A> {
54
+ readonly on: (method: string | Iterable<string>, path: PathInput, handler: A) => void
55
+ readonly all: (path: PathInput, handler: A) => void
56
+ readonly find: (method: string, url: string) => FindResult<A> | undefined
57
+ readonly has: (method: string, url: string) => boolean
58
+ }
59
+
60
+ /**
8
61
  * @since 4.0.0
62
+ * @category models
9
63
  */
64
+ export interface FindResult<A> {
65
+ readonly handler: A
66
+ readonly params: Record<string, string | undefined>
67
+ readonly searchParams: Record<string, string | Array<string>>
68
+ }
10
69
 
11
70
  /**
12
- * @category re-exports
13
71
  * @since 4.0.0
72
+ * @category constructors
14
73
  */
15
- export * from "find-my-way-ts"
74
+ export const make: <A>(options?: Partial<RouterConfig>) => Router<A> = internal.make
@@ -299,7 +299,7 @@ export type HttpClientErrorReason = RequestError | ResponseError
299
299
  * @category schemas
300
300
  * @since 4.0.0
301
301
  */
302
- export class HttpClientErrorSchema extends Schema.ErrorClass<HttpClientErrorSchema>(TypeId)({
302
+ export class HttpClientErrorSchema extends Schema.Error<HttpClientErrorSchema>(TypeId)({
303
303
  _tag: Schema.tag("HttpError"),
304
304
  kind: Schema.Literals(
305
305
  [
@@ -28,6 +28,7 @@ import * as Stream from "../../Stream.ts"
28
28
  import * as Headers from "./Headers.ts"
29
29
  import * as HttpBody from "./HttpBody.ts"
30
30
  import { hasBody, type HttpMethod } from "./HttpMethod.ts"
31
+ import * as bodyInternal from "./internal/httpBody.ts"
31
32
  import * as Url from "./Url.ts"
32
33
  import * as UrlParams from "./UrlParams.ts"
33
34
 
@@ -874,25 +875,12 @@ export const setBody: {
874
875
  */
875
876
  (self: HttpClientRequest, body: HttpBody.HttpBody): HttpClientRequest
876
877
  } = dual(2, (self: HttpClientRequest, body: HttpBody.HttpBody): HttpClientRequest => {
877
- let headers = self.headers
878
- if (body._tag === "Empty" || body._tag === "FormData") {
879
- headers = Headers.remove(Headers.remove(headers, "Content-Type"), "Content-length")
880
- } else {
881
- if (body.contentType) {
882
- headers = Headers.set(headers, "content-type", body.contentType)
883
- }
884
- if (body.contentLength !== undefined) {
885
- headers = Headers.set(headers, "content-length", body.contentLength.toString())
886
- } else {
887
- headers = Headers.remove(headers, "content-length")
888
- }
889
- }
890
878
  return makeWith(
891
879
  self.method,
892
880
  self.url,
893
881
  self.urlParams,
894
882
  self.hash,
895
- headers,
883
+ bodyInternal.updateHeaders(self.headers, body),
896
884
  body
897
885
  )
898
886
  })
@@ -355,22 +355,7 @@ class WebHttpClientResponse extends Inspectable.Class implements HttpClientRespo
355
355
 
356
356
  private textBody?: Effect.Effect<string, Error.HttpClientError>
357
357
  get text(): Effect.Effect<string, Error.HttpClientError> {
358
- if (this.textBody) {
359
- return this.textBody
360
- }
361
- this.textBody = Effect.tryPromise({
362
- try: () => this.source.text(),
363
- catch: (cause) =>
364
- new Error.HttpClientError({
365
- reason: new Error.DecodeError({
366
- request: this.request,
367
- response: this,
368
- cause
369
- })
370
- })
371
- }).pipe(Effect.cached, Effect.runSync)
372
- this.arrayBufferBody = Effect.map(this.textBody, (_) => new TextEncoder().encode(_).buffer)
373
- return this.textBody
358
+ return this.textBody ??= Effect.map(this.arrayBuffer, (_) => new TextDecoder().decode(_))
374
359
  }
375
360
 
376
361
  get urlParamsBody(): Effect.Effect<UrlParams.UrlParams, Error.HttpClientError> {
@@ -419,7 +404,6 @@ class WebHttpClientResponse extends Inspectable.Class implements HttpClientRespo
419
404
  })
420
405
  })
421
406
  }).pipe(Effect.cached, Effect.runSync)
422
- this.textBody = Effect.map(this.arrayBufferBody, (_) => new TextDecoder().decode(_))
423
407
  return this.arrayBufferBody
424
408
  }
425
409
 
@@ -161,14 +161,42 @@ export const layer = Layer.effect(HttpPlatform)(
161
161
  { contentLength, headers, status, statusText }
162
162
  )
163
163
  },
164
- fileWebResponse(file, status, statusText, headers, _options) {
165
- return Response.stream(
166
- Stream.fromReadableStream({
164
+ fileWebResponse(file, status, statusText, headers, options) {
165
+ const offset = Number(options?.offset ?? 0)
166
+ const bytesToRead = options?.bytesToRead !== undefined ? Number(options.bytesToRead) : undefined
167
+ const chunkSize = options?.chunkSize !== undefined ? Math.max(1, Number(options.chunkSize)) : Infinity
168
+ const end = offset + (bytesToRead ?? Infinity)
169
+ const stream = end <= offset
170
+ ? Stream.empty
171
+ : Stream.fromReadableStream({
167
172
  evaluate: () => file.stream() as ReadableStream<Uint8Array>,
168
173
  onError: identity
169
- }),
170
- { headers, status, statusText }
171
- )
174
+ }).pipe(
175
+ Stream.mapAccum(
176
+ () => 0,
177
+ (position, bytes) => {
178
+ const next = position + bytes.length
179
+ const start = Math.min(Math.max(offset - position, 0), bytes.length)
180
+ const stop = Math.min(Math.max(end - position, 0), bytes.length)
181
+ const chunks: Array<{ readonly bytes: Uint8Array; readonly done: boolean }> = []
182
+ for (let index = start; index < stop; index += chunkSize) {
183
+ chunks.push({
184
+ bytes: bytes.subarray(index, Math.min(index + chunkSize, stop)),
185
+ done: next >= end && index + chunkSize >= stop
186
+ })
187
+ }
188
+ return [next, chunks]
189
+ }
190
+ ),
191
+ Stream.takeUntil((chunk) => chunk.done),
192
+ Stream.map((chunk) => chunk.bytes)
193
+ )
194
+ return Response.stream(stream, {
195
+ contentLength: bytesToRead ?? file.size - offset,
196
+ headers,
197
+ status,
198
+ statusText
199
+ })
172
200
  }
173
201
  }))
174
202
  ).pipe(Layer.provide(Etag.layerWeak))
@@ -863,25 +863,25 @@ const rawBodyStream = (request: HttpServerRequest, body: unknown): Stream.Stream
863
863
  if (body instanceof Request) {
864
864
  return streamFromReadable(request, body.body)
865
865
  }
866
- if (isFormData(body)) {
867
- return streamFromReadable(request, new Response(body).body)
868
- }
869
866
  if (isReadableStream(body)) {
870
867
  return streamFromReadable(request, body)
871
868
  }
869
+ if (isBodyInit(body)) {
870
+ return streamFromReadable(request, new Response(body).body)
871
+ }
872
872
  return Stream.fail(requestParseError(request, "Unsupported body type"))
873
873
  }
874
874
 
875
875
  const rawBodyBytes = (request: HttpServerRequest, body: unknown): Effect.Effect<Uint8Array, HttpServerError> => {
876
- if (body instanceof Blob) {
877
- return bytesFromBodyInit(request, body)
878
- }
879
876
  if (body instanceof Request) {
880
877
  return Effect.tryPromise({
881
878
  try: () => body.arrayBuffer().then((buffer) => new Uint8Array(buffer)),
882
879
  catch: (cause) => requestParseError(request, undefined, cause)
883
880
  })
884
881
  }
882
+ if (isBodyInit(body)) {
883
+ return bytesFromBodyInit(request, body)
884
+ }
885
885
  return Effect.fail(requestParseError(request, "Unsupported body type"))
886
886
  }
887
887
 
@@ -995,6 +995,14 @@ const isReadableStream = (u: unknown): u is ReadableStream<Uint8Array> =>
995
995
 
996
996
  const isFormData = (u: unknown): u is FormData => typeof FormData !== "undefined" && u instanceof FormData
997
997
 
998
+ const isBodyInit = (u: unknown): u is BodyInit =>
999
+ typeof u === "string" ||
1000
+ (typeof ArrayBuffer !== "undefined" && (u instanceof ArrayBuffer || ArrayBuffer.isView(u))) ||
1001
+ (typeof Blob !== "undefined" && u instanceof Blob) ||
1002
+ isFormData(u) ||
1003
+ (typeof URLSearchParams !== "undefined" && u instanceof URLSearchParams) ||
1004
+ isReadableStream(u)
1005
+
998
1006
  const textDecoder = new TextDecoder()
999
1007
 
1000
1008
  /**
@@ -34,6 +34,7 @@ import * as HttpClientRequest from "./HttpClientRequest.ts"
34
34
  import * as HttpClientResponse from "./HttpClientResponse.ts"
35
35
  import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
36
36
  import type { HttpPlatform } from "./HttpPlatform.ts"
37
+ import * as bodyInternal from "./internal/httpBody.ts"
37
38
  import * as Template from "./Template.ts"
38
39
  import * as UrlParams from "./UrlParams.ts"
39
40
 
@@ -563,7 +564,7 @@ export const setHeader: {
563
564
  makeResponse({
564
565
  ...self,
565
566
  headers: Headers.set(self.headers, key, value)
566
- })
567
+ }, true)
567
568
  )
568
569
 
569
570
  /**
@@ -623,7 +624,7 @@ export const setHeaders: {
623
624
  makeResponse({
624
625
  ...self,
625
626
  headers: Headers.setAll(self.headers, input)
626
- })
627
+ }, true)
627
628
  )
628
629
 
629
630
  /**
@@ -1204,7 +1205,8 @@ export const setBody: {
1204
1205
  (self: HttpServerResponse, body: Body.HttpBody): HttpServerResponse
1205
1206
  } = dual(
1206
1207
  2,
1207
- (self: HttpServerResponse, body: Body.HttpBody): HttpServerResponse => makeResponse({ ...self, body })
1208
+ (self: HttpServerResponse, body: Body.HttpBody): HttpServerResponse =>
1209
+ makeResponse({ ...self, headers: bodyInternal.updateHeaders(self.headers, body), body })
1208
1210
  )
1209
1211
 
1210
1212
  /**
@@ -1623,7 +1625,7 @@ const makeResponse = (options: {
1623
1625
  readonly headers?: Headers.Headers | undefined
1624
1626
  readonly cookies?: Cookies.Cookies | undefined
1625
1627
  readonly body?: Body.HttpBody | undefined
1626
- }) => {
1628
+ }, preferHeaders = false) => {
1627
1629
  const self = Object.create(Proto) as Mutable<HttpServerResponse>
1628
1630
  self.status = options.status
1629
1631
  self.statusText = options.statusText
@@ -1631,13 +1633,13 @@ const makeResponse = (options: {
1631
1633
  self.body = options.body ?? Body.empty
1632
1634
  if (
1633
1635
  self.body._tag !== "Empty" &&
1634
- (self.body.contentType || self.body.contentLength)
1636
+ (self.body.contentType || self.body.contentLength !== undefined)
1635
1637
  ) {
1636
1638
  const newHeaders = Headers.fromRecordUnsafe({ ...options.headers }) as any
1637
- if (self.body.contentType) {
1639
+ if (self.body.contentType && (!preferHeaders || newHeaders["content-type"] === undefined)) {
1638
1640
  newHeaders["content-type"] = self.body.contentType
1639
1641
  }
1640
- if (self.body.contentLength) {
1642
+ if (self.body.contentLength !== undefined && (!preferHeaders || newHeaders["content-length"] === undefined)) {
1641
1643
  newHeaders["content-length"] = self.body.contentLength.toString()
1642
1644
  }
1643
1645
  self.headers = newHeaders
@@ -34,7 +34,7 @@ import * as UndefinedOr from "../../UndefinedOr.ts"
34
34
  import * as IncomingMessage from "./HttpIncomingMessage.ts"
35
35
  import * as HttpServerRespondable from "./HttpServerRespondable.ts"
36
36
  import * as HttpServerResponse from "./HttpServerResponse.ts"
37
- import * as MP from "./Multipasta.ts"
37
+ import * as MP from "./MultipartParser.ts"
38
38
 
39
39
  /**
40
40
  * Type identifier used to brand multipart part values.
@@ -678,6 +678,8 @@ export const toPersisted = (
678
678
  const path_ = yield* Path.Path
679
679
  const dir = yield* fs.makeTempDirectoryScoped()
680
680
  const persisted: Record<string, Array<PersistedFile> | Array<string> | string> = Object.create(null)
681
+ const usedPaths = new Set<string>()
682
+ let fileIndex = 0
681
683
  yield* Stream.runForEach(stream, (part) => {
682
684
  if (part._tag === "Field") {
683
685
  if (!(part.key in persisted)) {
@@ -692,7 +694,12 @@ export const toPersisted = (
692
694
  return Effect.void
693
695
  }
694
696
  const file = part
695
- const path = path_.join(dir, path_.basename(file.name).slice(-128))
697
+ const fileName = path_.basename(file.name).slice(-128)
698
+ let path = path_.join(dir, fileName)
699
+ while (usedPaths.has(path)) {
700
+ path = path_.join(dir, `${fileIndex++}-${fileName}`)
701
+ }
702
+ usedPaths.add(path)
696
703
  const filePart = new PersistedFileImpl(
697
704
  file.key,
698
705
  file.name,
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Low-level parser for multipart header blocks.
3
+ *
4
+ * @since 4.0.0
5
+ */
6
+ import * as internal from "./internal/headers.ts"
7
+
8
+ /**
9
+ * The reason a multipart header block could not be parsed.
10
+ *
11
+ * @category errors
12
+ * @since 4.0.0
13
+ */
14
+ export type FailureReason =
15
+ | "TooManyHeaders"
16
+ | "HeaderTooLarge"
17
+ | "InvalidHeaderName"
18
+ | "InvalidHeaderValue"
19
+
20
+ /**
21
+ * Indicates that the parser needs more input.
22
+ *
23
+ * @category models
24
+ * @since 4.0.0
25
+ */
26
+ export interface Continue {
27
+ readonly _tag: "Continue"
28
+ }
29
+
30
+ /**
31
+ * A multipart header parsing failure.
32
+ *
33
+ * @category errors
34
+ * @since 4.0.0
35
+ */
36
+ export interface Failure {
37
+ readonly _tag: "Failure"
38
+ readonly reason: FailureReason
39
+ readonly headers: Record<string, string | Array<string>>
40
+ }
41
+
42
+ /**
43
+ * A successfully parsed multipart header block.
44
+ *
45
+ * @category models
46
+ * @since 4.0.0
47
+ */
48
+ export interface Headers {
49
+ readonly _tag: "Headers"
50
+ readonly headers: Record<string, string | Array<string>>
51
+ readonly endPosition: number
52
+ }
53
+
54
+ /**
55
+ * The result of parsing a multipart header block.
56
+ *
57
+ * @category models
58
+ * @since 4.0.0
59
+ */
60
+ export type ReturnValue = Continue | Failure | Headers
61
+
62
+ /**
63
+ * Creates an incremental multipart header parser.
64
+ *
65
+ * @category constructors
66
+ * @since 4.0.0
67
+ */
68
+ export const make: () => (chunk: Uint8Array, start: number) => ReturnValue = internal.make
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Low-level byte search used by the multipart parser.
3
+ *
4
+ * @since 4.0.0
5
+ */
6
+ import * as internal from "./internal/search.ts"
7
+
8
+ /**
9
+ * Creates an incremental byte search for a string boundary.
10
+ *
11
+ * @category constructors
12
+ * @since 4.0.0
13
+ */
14
+ export const make: (
15
+ needle: string,
16
+ callback: (index: number, chunk: Uint8Array) => void
17
+ ) => { readonly write: (chunk: Uint8Array) => void; readonly end: () => void } = internal.make
@@ -0,0 +1,103 @@
1
+ // taken from https://github.com/fastify/fast-content-type-parse
2
+ // under the MIT license
3
+
4
+ /**
5
+ * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
6
+ *
7
+ * parameter = token "=" ( token / quoted-string )
8
+ * token = 1*tchar
9
+ * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
10
+ * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
11
+ * / DIGIT / ALPHA
12
+ * ; any VCHAR, except delimiters
13
+ * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
14
+ * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
15
+ * obs-text = %x80-FF
16
+ * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
17
+ */
18
+ const paramRE =
19
+ /; *([!#$%&'*+.^\w`|~-]+)=("(?:[\v\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u{10ffff}]|\\[\v\u0020-\u{10ffff}])*"|[!#$%&'*+.^\w`|~-]+) */gu
20
+
21
+ /**
22
+ * RegExp to match quoted-pair in RFC 7230 sec 3.2.6
23
+ *
24
+ * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
25
+ * obs-text = %x80-FF
26
+ */
27
+ const quotedPairRE = /\\([\v\u0020-\u{10ffff}])/gu
28
+
29
+ /**
30
+ * RegExp to match type in RFC 7231 sec 3.1.1.1
31
+ *
32
+ * media-type = type "/" subtype
33
+ * type = token
34
+ * subtype = token
35
+ */
36
+ const mediaTypeRE = /^[!#$%&'*+.^\w|~-]+\/[!#$%&'*+.^\w|~-]+$/u
37
+ const mediaTypeRENoSlash = /^[!#$%&'*+.^\w|~-]+$/u
38
+
39
+ // default ContentType to prevent repeated object creation
40
+ const defaultContentType = { value: "", parameters: Object.create(null) }
41
+
42
+ export function parse(
43
+ header: string | undefined,
44
+ withoutSlash = false
45
+ ): {
46
+ readonly value: string
47
+ readonly parameters: Record<string, string>
48
+ } {
49
+ if (typeof header !== "string") {
50
+ return defaultContentType
51
+ }
52
+
53
+ let index = header.indexOf(";")
54
+ const type = index !== -1 ? header.slice(0, index).trim() : header.trim()
55
+ const mediaRE = withoutSlash ? mediaTypeRENoSlash : mediaTypeRE
56
+
57
+ if (mediaRE.test(type) === false) {
58
+ return defaultContentType
59
+ }
60
+
61
+ const result = {
62
+ value: type.toLowerCase(),
63
+ parameters: Object.create(null)
64
+ }
65
+
66
+ // parse parameters
67
+ if (index === -1) {
68
+ return result
69
+ }
70
+
71
+ let key: string
72
+ let match: RegExpExecArray | null
73
+ let value: string
74
+
75
+ paramRE.lastIndex = index
76
+
77
+ while ((match = paramRE.exec(header))) {
78
+ if (match.index !== index) {
79
+ return defaultContentType
80
+ }
81
+
82
+ index += match[0].length
83
+ key = match[1].toLowerCase()
84
+ value = match[2]
85
+
86
+ if (value[0] === "\"") {
87
+ // remove quotes and escapes
88
+ value = value.slice(1, value.length - 1)
89
+
90
+ if (!withoutSlash && quotedPairRE.test(value)) {
91
+ value = value.replace(quotedPairRE, "$1")
92
+ }
93
+ }
94
+
95
+ result.parameters[key] = value
96
+ }
97
+
98
+ if (index !== header.length) {
99
+ return defaultContentType
100
+ }
101
+
102
+ return result
103
+ }