effect 4.1.0 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +30 -0
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/dist/BigDecimal.d.ts +139 -7
  4. package/dist/BigDecimal.d.ts.map +1 -1
  5. package/dist/BigDecimal.js +83 -14
  6. package/dist/BigDecimal.js.map +1 -1
  7. package/dist/Equal.d.ts +2 -2
  8. package/dist/Equal.d.ts.map +1 -1
  9. package/dist/Equal.js +3 -3
  10. package/dist/Equal.js.map +1 -1
  11. package/dist/Hash.d.ts +3 -2
  12. package/dist/Hash.d.ts.map +1 -1
  13. package/dist/Hash.js +5 -4
  14. package/dist/Hash.js.map +1 -1
  15. package/dist/Iterable.d.ts.map +1 -1
  16. package/dist/Iterable.js +11 -8
  17. package/dist/Iterable.js.map +1 -1
  18. package/dist/Path.d.ts.map +1 -1
  19. package/dist/Path.js +5 -1
  20. package/dist/Path.js.map +1 -1
  21. package/dist/Pool.d.ts.map +1 -1
  22. package/dist/Pool.js +2 -1
  23. package/dist/Pool.js.map +1 -1
  24. package/dist/Schema.d.ts +2 -1
  25. package/dist/Schema.d.ts.map +1 -1
  26. package/dist/Schema.js +2 -1
  27. package/dist/Schema.js.map +1 -1
  28. package/dist/SchemaRepresentation.d.ts +4 -2
  29. package/dist/SchemaRepresentation.d.ts.map +1 -1
  30. package/dist/SchemaRepresentation.js +4 -2
  31. package/dist/SchemaRepresentation.js.map +1 -1
  32. package/dist/SchemaTransformation.d.ts +2 -2
  33. package/dist/SchemaTransformation.js +2 -2
  34. package/dist/ai/McpClient.d.ts +171 -19
  35. package/dist/ai/McpClient.d.ts.map +1 -1
  36. package/dist/ai/McpClient.js +277 -66
  37. package/dist/ai/McpClient.js.map +1 -1
  38. package/dist/ai/McpSchema.d.ts +108 -0
  39. package/dist/ai/McpSchema.d.ts.map +1 -1
  40. package/dist/ai/McpSchema.js +99 -0
  41. package/dist/ai/McpSchema.js.map +1 -1
  42. package/dist/ai/McpServer.d.ts +120 -6
  43. package/dist/ai/McpServer.d.ts.map +1 -1
  44. package/dist/ai/McpServer.js +215 -34
  45. package/dist/ai/McpServer.js.map +1 -1
  46. package/dist/ai/Prompt.d.ts.map +1 -1
  47. package/dist/ai/Prompt.js +20 -11
  48. package/dist/ai/Prompt.js.map +1 -1
  49. package/dist/ai/Tool.d.ts.map +1 -1
  50. package/dist/ai/Tool.js +5 -7
  51. package/dist/ai/Tool.js.map +1 -1
  52. package/dist/ai/internal/mcpCore.js +72 -3
  53. package/dist/ai/internal/mcpCore.js.map +1 -1
  54. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +3 -1
  55. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  56. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +3 -1
  57. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  58. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +3 -1
  59. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  60. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +3 -1
  61. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  62. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +42 -7
  63. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  64. package/dist/ai/internal/mcpProtocol.js +12 -0
  65. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  66. package/dist/ai/internal/mcpRuntime.js +3 -3
  67. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  68. package/dist/ai/internal/mcpSkills.d.ts +2 -0
  69. package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
  70. package/dist/ai/internal/mcpSkills.js +428 -0
  71. package/dist/ai/internal/mcpSkills.js.map +1 -0
  72. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  73. package/dist/cluster/ClusterWorkflowEngine.js +15 -5
  74. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  75. package/dist/cluster/Reply.d.ts +1 -1
  76. package/dist/cluster/Reply.d.ts.map +1 -1
  77. package/dist/cluster/Reply.js.map +1 -1
  78. package/dist/cluster/Sharding.d.ts.map +1 -1
  79. package/dist/cluster/Sharding.js +4 -1
  80. package/dist/cluster/Sharding.js.map +1 -1
  81. package/dist/cluster/internal/entityManager.js +15 -7
  82. package/dist/cluster/internal/entityManager.js.map +1 -1
  83. package/dist/crypto/Aead.d.ts +2 -1
  84. package/dist/crypto/Aead.d.ts.map +1 -1
  85. package/dist/crypto/Aead.js +2 -2
  86. package/dist/crypto/Aead.js.map +1 -1
  87. package/dist/crypto/Cipher.d.ts +2 -1
  88. package/dist/crypto/Cipher.d.ts.map +1 -1
  89. package/dist/crypto/Cipher.js +2 -2
  90. package/dist/crypto/Cipher.js.map +1 -1
  91. package/dist/crypto/KeyAgreement.d.ts +3 -2
  92. package/dist/crypto/KeyAgreement.d.ts.map +1 -1
  93. package/dist/crypto/KeyAgreement.js +2 -2
  94. package/dist/crypto/KeyAgreement.js.map +1 -1
  95. package/dist/crypto/KeyFormat.d.ts +33 -1
  96. package/dist/crypto/KeyFormat.d.ts.map +1 -1
  97. package/dist/crypto/KeyFormat.js.map +1 -1
  98. package/dist/crypto/KeyWrap.d.ts +4 -3
  99. package/dist/crypto/KeyWrap.d.ts.map +1 -1
  100. package/dist/crypto/KeyWrap.js +2 -2
  101. package/dist/crypto/KeyWrap.js.map +1 -1
  102. package/dist/crypto/Mac.d.ts +2 -1
  103. package/dist/crypto/Mac.d.ts.map +1 -1
  104. package/dist/crypto/Mac.js +2 -2
  105. package/dist/crypto/Mac.js.map +1 -1
  106. package/dist/crypto/Signature.d.ts +3 -2
  107. package/dist/crypto/Signature.d.ts.map +1 -1
  108. package/dist/crypto/Signature.js +2 -2
  109. package/dist/crypto/Signature.js.map +1 -1
  110. package/dist/crypto/WebCrypto.d.ts +19 -0
  111. package/dist/crypto/WebCrypto.d.ts.map +1 -1
  112. package/dist/crypto/WebCrypto.js.map +1 -1
  113. package/dist/crypto/internal/asymmetric.js.map +1 -1
  114. package/dist/crypto/internal/key.js +3 -2
  115. package/dist/crypto/internal/key.js.map +1 -1
  116. package/dist/encoding/Base64Url.d.ts.map +1 -1
  117. package/dist/encoding/Base64Url.js +26 -3
  118. package/dist/encoding/Base64Url.js.map +1 -1
  119. package/dist/encoding/Ndjson.d.ts +5 -4
  120. package/dist/encoding/Ndjson.d.ts.map +1 -1
  121. package/dist/encoding/Ndjson.js +6 -5
  122. package/dist/encoding/Ndjson.js.map +1 -1
  123. package/dist/encoding/Sse.d.ts +3 -1
  124. package/dist/encoding/Sse.d.ts.map +1 -1
  125. package/dist/encoding/Sse.js +5 -3
  126. package/dist/encoding/Sse.js.map +1 -1
  127. package/dist/eventlog/EventLog.d.ts +7 -0
  128. package/dist/eventlog/EventLog.d.ts.map +1 -1
  129. package/dist/eventlog/EventLog.js +7 -0
  130. package/dist/eventlog/EventLog.js.map +1 -1
  131. package/dist/eventlog/EventLogServer.d.ts +7 -1
  132. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  133. package/dist/eventlog/EventLogServer.js +27 -12
  134. package/dist/eventlog/EventLogServer.js.map +1 -1
  135. package/dist/eventlog/EventLogServerEncrypted.d.ts +10 -0
  136. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  137. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  138. package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
  139. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  140. package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
  141. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  142. package/dist/eventlog/EventLogSessionAuth.d.ts +21 -0
  143. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  144. package/dist/eventlog/EventLogSessionAuth.js +22 -0
  145. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  146. package/dist/graphql/GraphQLClient.d.ts +3 -1
  147. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  148. package/dist/graphql/GraphQLClient.js.map +1 -1
  149. package/dist/graphql/GraphQLClientError.d.ts +14 -9
  150. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  151. package/dist/graphql/GraphQLClientError.js +14 -21
  152. package/dist/graphql/GraphQLClientError.js.map +1 -1
  153. package/dist/graphql/GraphQLProtocol.d.ts +12 -3
  154. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  155. package/dist/graphql/GraphQLProtocol.js +4 -1
  156. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  157. package/dist/http/HttpClient.d.ts +189 -7
  158. package/dist/http/HttpClient.d.ts.map +1 -1
  159. package/dist/http/HttpClient.js +75 -2
  160. package/dist/http/HttpClient.js.map +1 -1
  161. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  162. package/dist/http/HttpServerRequest.js +38 -22
  163. package/dist/http/HttpServerRequest.js.map +1 -1
  164. package/dist/http/internal/mimeTypes.d.ts +4 -1
  165. package/dist/http/internal/mimeTypes.d.ts.map +1 -1
  166. package/dist/http/internal/mimeTypes.js +4 -1
  167. package/dist/http/internal/mimeTypes.js.map +1 -1
  168. package/dist/http-api/HttpApiSchema.js +1 -1
  169. package/dist/http-api/HttpApiSchema.js.map +1 -1
  170. package/dist/internal/dateTime.js +49 -24
  171. package/dist/internal/dateTime.js.map +1 -1
  172. package/dist/internal/effect.js +10 -0
  173. package/dist/internal/effect.js.map +1 -1
  174. package/dist/internal/glob.js +234 -56
  175. package/dist/internal/glob.js.map +1 -1
  176. package/dist/internal/graphql.js +21 -7
  177. package/dist/internal/graphql.js.map +1 -1
  178. package/dist/internal/graphqlHeaders.d.ts +7 -0
  179. package/dist/internal/graphqlHeaders.d.ts.map +1 -1
  180. package/dist/internal/graphqlHeaders.js +11 -0
  181. package/dist/internal/graphqlHeaders.js.map +1 -1
  182. package/dist/internal/request.js +29 -42
  183. package/dist/internal/request.js.map +1 -1
  184. package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
  185. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  186. package/dist/internal/version.js +1 -1
  187. package/dist/jose/JoseError.d.ts +285 -0
  188. package/dist/jose/JoseError.d.ts.map +1 -0
  189. package/dist/jose/JoseError.js +269 -0
  190. package/dist/jose/JoseError.js.map +1 -0
  191. package/dist/jose/Jwe.d.ts +128 -0
  192. package/dist/jose/Jwe.d.ts.map +1 -0
  193. package/dist/jose/Jwe.js +134 -0
  194. package/dist/jose/Jwe.js.map +1 -0
  195. package/dist/jose/Jwk.d.ts +597 -0
  196. package/dist/jose/Jwk.d.ts.map +1 -0
  197. package/dist/jose/Jwk.js +503 -0
  198. package/dist/jose/Jwk.js.map +1 -0
  199. package/dist/jose/Jwks.d.ts +236 -0
  200. package/dist/jose/Jwks.d.ts.map +1 -0
  201. package/dist/jose/Jwks.js +306 -0
  202. package/dist/jose/Jwks.js.map +1 -0
  203. package/dist/jose/Jws.d.ts +177 -0
  204. package/dist/jose/Jws.d.ts.map +1 -0
  205. package/dist/jose/Jws.js +183 -0
  206. package/dist/jose/Jws.js.map +1 -0
  207. package/dist/jose/Jwt.d.ts +270 -0
  208. package/dist/jose/Jwt.d.ts.map +1 -0
  209. package/dist/jose/Jwt.js +293 -0
  210. package/dist/jose/Jwt.js.map +1 -0
  211. package/dist/jose/index.d.ts +51 -0
  212. package/dist/jose/index.d.ts.map +1 -0
  213. package/dist/jose/index.js +52 -0
  214. package/dist/jose/index.js.map +1 -0
  215. package/dist/jose/internal/compact.d.ts +2 -0
  216. package/dist/jose/internal/compact.d.ts.map +1 -0
  217. package/dist/jose/internal/compact.js +179 -0
  218. package/dist/jose/internal/compact.js.map +1 -0
  219. package/dist/net/Host.d.ts.map +1 -1
  220. package/dist/net/Host.js +5 -10
  221. package/dist/net/Host.js.map +1 -1
  222. package/dist/observability/OtlpSerialization.d.ts +1 -1
  223. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  224. package/dist/observability/OtlpSerialization.js +10 -4
  225. package/dist/observability/OtlpSerialization.js.map +1 -1
  226. package/dist/observability/internal/otlpProtobuf.js +3 -3
  227. package/dist/observability/internal/otlpProtobuf.js.map +1 -1
  228. package/dist/observability/internal/protobuf.js +6 -0
  229. package/dist/observability/internal/protobuf.js.map +1 -1
  230. package/dist/persistence/CircuitBreaker.d.ts +98 -38
  231. package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
  232. package/dist/persistence/CircuitBreaker.js +67 -29
  233. package/dist/persistence/CircuitBreaker.js.map +1 -1
  234. package/dist/persistence/RateLimiter.d.ts +8 -0
  235. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  236. package/dist/persistence/RateLimiter.js +63 -12
  237. package/dist/persistence/RateLimiter.js.map +1 -1
  238. package/dist/persistence/index.d.ts +1 -1
  239. package/dist/persistence/index.js +1 -1
  240. package/dist/reactivity/AtomRegistry.js +17 -7
  241. package/dist/reactivity/AtomRegistry.js.map +1 -1
  242. package/dist/rpc/Rpc.d.ts +1 -1
  243. package/dist/rpc/Rpc.d.ts.map +1 -1
  244. package/dist/rpc/Rpc.js.map +1 -1
  245. package/dist/rpc/RpcClient.d.ts +14 -2
  246. package/dist/rpc/RpcClient.d.ts.map +1 -1
  247. package/dist/rpc/RpcClient.js +38 -21
  248. package/dist/rpc/RpcClient.js.map +1 -1
  249. package/dist/rpc/RpcMessage.d.ts +3 -2
  250. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  251. package/dist/rpc/RpcMessage.js.map +1 -1
  252. package/dist/sql/Migrator.d.ts +9 -1
  253. package/dist/sql/Migrator.d.ts.map +1 -1
  254. package/dist/sql/Migrator.js +18 -6
  255. package/dist/sql/Migrator.js.map +1 -1
  256. package/dist/sql/SqlClient.d.ts +38 -3
  257. package/dist/sql/SqlClient.d.ts.map +1 -1
  258. package/dist/sql/SqlClient.js +4 -3
  259. package/dist/sql/SqlClient.js.map +1 -1
  260. package/dist/sql/Statement.d.ts +41 -3
  261. package/dist/sql/Statement.d.ts.map +1 -1
  262. package/dist/sql/Statement.js +24 -20
  263. package/dist/sql/Statement.js.map +1 -1
  264. package/dist/workflow/Workflow.d.ts +4 -0
  265. package/dist/workflow/Workflow.d.ts.map +1 -1
  266. package/dist/workflow/Workflow.js.map +1 -1
  267. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  268. package/dist/workflow/WorkflowEngine.js +5 -0
  269. package/dist/workflow/WorkflowEngine.js.map +1 -1
  270. package/package.json +5 -1
  271. package/src/BigDecimal.ts +170 -16
  272. package/src/Equal.ts +3 -3
  273. package/src/Hash.ts +5 -4
  274. package/src/Iterable.ts +8 -5
  275. package/src/Path.ts +6 -1
  276. package/src/Pool.ts +2 -1
  277. package/src/Schema.ts +3 -2
  278. package/src/SchemaRepresentation.ts +4 -2
  279. package/src/SchemaTransformation.ts +2 -2
  280. package/src/ai/McpClient.ts +488 -91
  281. package/src/ai/McpSchema.ts +119 -0
  282. package/src/ai/McpServer.ts +261 -38
  283. package/src/ai/Prompt.ts +16 -11
  284. package/src/ai/Tool.ts +5 -10
  285. package/src/ai/internal/mcpCore.ts +165 -12
  286. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +3 -1
  287. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +3 -1
  288. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -1
  289. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -1
  290. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +41 -7
  291. package/src/ai/internal/mcpProtocol.ts +15 -0
  292. package/src/ai/internal/mcpRuntime.ts +6 -3
  293. package/src/ai/internal/mcpSkills.ts +480 -0
  294. package/src/cluster/ClusterWorkflowEngine.ts +22 -8
  295. package/src/cluster/Reply.ts +1 -1
  296. package/src/cluster/Sharding.ts +4 -1
  297. package/src/cluster/internal/entityManager.ts +24 -10
  298. package/src/crypto/Aead.ts +3 -3
  299. package/src/crypto/Cipher.ts +3 -3
  300. package/src/crypto/KeyAgreement.ts +4 -4
  301. package/src/crypto/KeyFormat.ts +30 -1
  302. package/src/crypto/KeyWrap.ts +6 -6
  303. package/src/crypto/Mac.ts +3 -3
  304. package/src/crypto/Signature.ts +4 -4
  305. package/src/crypto/WebCrypto.ts +20 -0
  306. package/src/crypto/internal/asymmetric.ts +2 -1
  307. package/src/crypto/internal/key.ts +12 -5
  308. package/src/encoding/Base64Url.ts +27 -3
  309. package/src/encoding/Ndjson.ts +6 -5
  310. package/src/encoding/Sse.ts +5 -3
  311. package/src/eventlog/EventLog.ts +7 -0
  312. package/src/eventlog/EventLogServer.ts +31 -12
  313. package/src/eventlog/EventLogServerEncrypted.ts +5 -0
  314. package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
  315. package/src/eventlog/EventLogSessionAuth.ts +26 -0
  316. package/src/graphql/GraphQLClient.ts +3 -1
  317. package/src/graphql/GraphQLClientError.ts +15 -22
  318. package/src/graphql/GraphQLProtocol.ts +12 -3
  319. package/src/http/HttpClient.ts +210 -11
  320. package/src/http/HttpServerRequest.ts +61 -23
  321. package/src/http/internal/mimeTypes.ts +4 -1
  322. package/src/http-api/HttpApiSchema.ts +1 -1
  323. package/src/internal/dateTime.ts +54 -24
  324. package/src/internal/effect.ts +6 -0
  325. package/src/internal/glob.ts +279 -63
  326. package/src/internal/graphql.ts +27 -9
  327. package/src/internal/graphqlHeaders.ts +13 -0
  328. package/src/internal/request.ts +51 -58
  329. package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
  330. package/src/internal/version.ts +1 -1
  331. package/src/jose/JoseError.ts +329 -0
  332. package/src/jose/Jwe.ts +196 -0
  333. package/src/jose/Jwk.ts +777 -0
  334. package/src/jose/Jwks.ts +418 -0
  335. package/src/jose/Jws.ts +312 -0
  336. package/src/jose/Jwt.ts +493 -0
  337. package/src/jose/index.ts +58 -0
  338. package/src/jose/internal/compact.ts +195 -0
  339. package/src/net/Host.ts +5 -10
  340. package/src/observability/OtlpSerialization.ts +13 -5
  341. package/src/observability/internal/otlpProtobuf.ts +6 -6
  342. package/src/observability/internal/protobuf.ts +10 -0
  343. package/src/persistence/CircuitBreaker.ts +113 -48
  344. package/src/persistence/RateLimiter.ts +84 -15
  345. package/src/persistence/index.ts +1 -1
  346. package/src/reactivity/AtomRegistry.ts +19 -8
  347. package/src/rpc/Rpc.ts +3 -1
  348. package/src/rpc/RpcClient.ts +44 -24
  349. package/src/rpc/RpcMessage.ts +3 -2
  350. package/src/sql/Migrator.ts +35 -18
  351. package/src/sql/SqlClient.ts +43 -8
  352. package/src/sql/Statement.ts +52 -22
  353. package/src/workflow/Workflow.ts +4 -0
  354. package/src/workflow/WorkflowEngine.ts +5 -0
@@ -96,10 +96,10 @@ const makeBatchMap = (resolver: RequestResolver<any>): BatchMap => {
96
96
  }
97
97
 
98
98
  interface Batch {
99
- key: unknown
100
- context: Context.Context<never>
101
- resolver: RequestResolver<any>
102
- map: BatchMap
99
+ readonly key: unknown
100
+ readonly context: Context.Context<never>
101
+ readonly resolver: RequestResolver<any>
102
+ readonly map: BatchMap
103
103
  readonly entrySet: Set<Request.Entry<any>>
104
104
  readonly entries: Set<Request.Entry<any>>
105
105
  readonly delayEffect: Effect<void>
@@ -107,9 +107,53 @@ interface Batch {
107
107
  fiber?: Fiber<unknown, unknown> | undefined
108
108
  }
109
109
 
110
- const batchPool: Array<Batch> = []
111
110
  const pendingBatches = new WeakMap<RequestResolver<any>, BatchMap>()
112
111
 
112
+ // Batches are built outside `addEntry` so their callbacks do not share a closure
113
+ // context with per-request entries, which would keep completed requests alive.
114
+ const makeBatch = (
115
+ key: unknown,
116
+ context: Context.Context<never>,
117
+ resolver: RequestResolver<any>,
118
+ map: BatchMap
119
+ ): Batch => {
120
+ const batch: Batch = {
121
+ key,
122
+ context,
123
+ resolver,
124
+ map,
125
+ entrySet: new Set(),
126
+ entries: new Set(),
127
+ delayEffect: effect.flatMap(
128
+ withFiber((delayFiber) => {
129
+ // Reentrant delay callbacks may fill the batch and interrupt this fiber.
130
+ batch.fiber = delayFiber
131
+ return batch.resolver.delay
132
+ }),
133
+ (_) => runBatch(batch)
134
+ ) as Effect<void>,
135
+ run: effect.onExit(
136
+ effect.suspend(() =>
137
+ batch.resolver.runAll(Array.from(batch.entries) as NonEmptyArray<Request.Entry<any>>, batch.key)
138
+ ),
139
+ (exit) => {
140
+ for (const entry of batch.entrySet) {
141
+ entry.completeUnsafe(
142
+ exit._tag === "Success"
143
+ ? exitDie(
144
+ new Error("Effect.request: RequestResolver did not complete request", { cause: entry.request })
145
+ )
146
+ : exit
147
+ )
148
+ }
149
+ batch.entries.clear()
150
+ return effect.void
151
+ }
152
+ )
153
+ }
154
+ return batch
155
+ }
156
+
113
157
  const addEntry = <A extends Request.Any>(
114
158
  resolver: RequestResolver<A>,
115
159
  request: A,
@@ -146,58 +190,7 @@ const addEntry = <A extends Request.Any>(
146
190
  batch = batchMap.get(key)
147
191
  const isNewBatch = batch === undefined
148
192
  if (!batch) {
149
- if (batchPool.length > 0) {
150
- batch = batchPool.pop()!
151
- batch.key = key
152
- batch.context = fiber.context
153
- batch.resolver = resolver
154
- batch.map = batchMap
155
- } else {
156
- const newBatch: Batch = {
157
- key,
158
- context: fiber.context,
159
- resolver,
160
- map: batchMap,
161
- entrySet: new Set(),
162
- entries: new Set(),
163
- delayEffect: effect.flatMap(
164
- withFiber((delayFiber) => {
165
- // Reentrant delay callbacks may fill the batch and interrupt this fiber.
166
- newBatch.fiber = delayFiber
167
- return newBatch.resolver.delay
168
- }),
169
- (_) => runBatch(newBatch)
170
- ) as Effect<void>,
171
- run: effect.onExit(
172
- effect.suspend(() =>
173
- newBatch.resolver.runAll(Array.from(newBatch.entries) as NonEmptyArray<Request.Entry<any>>, newBatch.key)
174
- ),
175
- (exit) => {
176
- for (const entry of newBatch.entrySet) {
177
- entry.completeUnsafe(
178
- exit._tag === "Success"
179
- ? exitDie(
180
- new Error("Effect.request: RequestResolver did not complete request", { cause: entry.request })
181
- )
182
- : exit
183
- )
184
- }
185
- newBatch.entries.clear()
186
- if (batchPool.length < 128) {
187
- newBatch.entrySet.clear()
188
- newBatch.key = undefined
189
- newBatch.context = undefined as any
190
- newBatch.fiber = undefined
191
- newBatch.resolver = undefined as any
192
- newBatch.map = undefined as any
193
- batchPool.push(newBatch)
194
- }
195
- return effect.void
196
- }
197
- )
198
- }
199
- batch = newBatch
200
- }
193
+ batch = makeBatch(key, fiber.context, resolver, batchMap)
201
194
  batchMap.set(key, batch)
202
195
  }
203
196
 
@@ -205,7 +198,7 @@ const addEntry = <A extends Request.Any>(
205
198
  batch.entries.add(entry)
206
199
  if (isNewBatch) {
207
200
  const delayFiber = effect.runForkWith(fiber.context)(batch.delayEffect, { scheduler: fiber.cache.scheduler })
208
- // A synchronous delay may have already run and recycled this batch.
201
+ // A synchronous delay may have already run this batch.
209
202
  if (completed || batchMap.get(key) !== batch) return entry
210
203
  batch.fiber = delayFiber
211
204
  }
@@ -755,8 +755,9 @@ export function fromJsonSchemaMultiDocument(
755
755
  return out
756
756
  }
757
757
  case "Union":
758
- return representation.types.length > 1 ||
759
- representation.types.some(hasChoices)
758
+ // Finite primitive literal sets intersect without expansion, so they can be duplicated across branches.
759
+ return !isLiteralSet(representation) &&
760
+ (representation.types.length > 1 || representation.types.some(hasChoices))
760
761
  case "Arrays":
761
762
  return representation.elements.some((element) => hasChoices(element.type)) ||
762
763
  representation.rest.some(hasChoices)
@@ -796,18 +797,20 @@ export function fromJsonSchemaMultiDocument(
796
797
  return representation.literal
797
798
  }
798
799
 
800
+ function isLiteralSet(union: ImportedUnion): boolean {
801
+ return (union.options?.mode ?? "anyOf") === "anyOf" &&
802
+ union.types.every((type) => literalValue(type) !== undefined)
803
+ }
804
+
799
805
  function intersectLiteralUnions(
800
806
  left: ImportedUnion,
801
807
  right: ImportedUnion,
802
808
  path: Path
803
809
  ): ImportedJsonSchemaRepresentation | undefined {
804
- if ((left.options?.mode ?? "anyOf") !== "anyOf" || (right.options?.mode ?? "anyOf") !== "anyOf") {
805
- return undefined
806
- }
807
- const rightByValue = new Map<string | number | boolean | null, ImportedJsonSchemaRepresentation>()
810
+ if (!isLiteralSet(left) || !isLiteralSet(right)) return undefined
811
+ const rightByValue = new Map<ReturnType<typeof literalValue>, ImportedJsonSchemaRepresentation>()
808
812
  for (const representation of right.types) {
809
813
  const value = literalValue(representation)
810
- if (value === undefined) return undefined
811
814
  const previous = rightByValue.get(value)
812
815
  rightByValue.set(value, {
813
816
  ...representation,
@@ -816,9 +819,7 @@ export function fromJsonSchemaMultiDocument(
816
819
  }
817
820
  const types: Array<ImportedJsonSchemaRepresentation> = []
818
821
  for (const representation of left.types) {
819
- const value = literalValue(representation)
820
- if (value === undefined) return undefined
821
- const match = rightByValue.get(value)
822
+ const match = rightByValue.get(literalValue(representation))
822
823
  if (match !== undefined) types.push(intersect(representation, annotate(match, right), path))
823
824
  }
824
825
  return makeUnion(left, types)
@@ -1,2 +1,2 @@
1
1
  /** @internal */
2
- export const version = "4.1.0"
2
+ export const version = "4.1.1"
@@ -0,0 +1,329 @@
1
+ /**
2
+ * The `JoseError` returned by the `effect/jose` modules, and the reasons it
3
+ * carries.
4
+ *
5
+ * Every failure is one `JoseError` whose `reason` says what went wrong. Reasons
6
+ * for configuration, transport, and key-import problems carry a `description`
7
+ * and, when there is one, a `cause`. Reasons for failed authentication carry
8
+ * nothing: they never describe tokens, claims, plaintext, or key material.
9
+ *
10
+ * **Gotchas**
11
+ *
12
+ * Map the error before it reaches a client, for example
13
+ * `SignatureVerificationFailed` to a 401. Sending verification detail to
14
+ * clients is how oracles leak.
15
+ *
16
+ * @stability unstable
17
+ * @since 4.1.1
18
+ */
19
+ import * as Data from "../Data.ts"
20
+ import * as Predicate from "../Predicate.ts"
21
+
22
+ const TypeId = "~effect/jose/JoseError" as const
23
+ const ReasonTypeId = "~effect/jose/JoseError/Reason" as const
24
+
25
+ /**
26
+ * Reason for a malformed compact serialization, protected header, or payload,
27
+ * or for header parameters that are not supported, such as `crit`.
28
+ *
29
+ * @stability unstable
30
+ * @category errors
31
+ * @since 4.1.1
32
+ */
33
+ export class InvalidToken extends Data.TaggedError("InvalidToken")<{
34
+ readonly description: string
35
+ }> {
36
+ /**
37
+ * Marks this value as a `JoseError` reason for runtime guards.
38
+ *
39
+ * @since 4.1.1
40
+ */
41
+ readonly [ReasonTypeId] = ReasonTypeId
42
+
43
+ override get message(): string {
44
+ return this.description
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Reason for key material that cannot be imported, or that does not fit the
50
+ * selected algorithm or operation.
51
+ *
52
+ * @stability unstable
53
+ * @category errors
54
+ * @since 4.1.1
55
+ */
56
+ export class InvalidKey extends Data.TaggedError("InvalidKey")<{
57
+ readonly description: string
58
+ readonly cause?: unknown
59
+ }> {
60
+ /**
61
+ * Marks this value as a `JoseError` reason for runtime guards.
62
+ *
63
+ * @since 4.1.1
64
+ */
65
+ readonly [ReasonTypeId] = ReasonTypeId
66
+
67
+ override get message(): string {
68
+ return this.description
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Reason for an option or configuration value that the operation rejects
74
+ * before doing any work, such as a non-HTTPS key-set URL.
75
+ *
76
+ * @stability unstable
77
+ * @category errors
78
+ * @since 4.1.1
79
+ */
80
+ export class InvalidArgument extends Data.TaggedError("InvalidArgument")<{
81
+ readonly description: string
82
+ readonly cause?: unknown
83
+ }> {
84
+ /**
85
+ * Marks this value as a `JoseError` reason for runtime guards.
86
+ *
87
+ * @since 4.1.1
88
+ */
89
+ readonly [ReasonTypeId] = ReasonTypeId
90
+
91
+ override get message(): string {
92
+ return this.description
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Reason for a token whose protected `alg` is not the key's algorithm or is
98
+ * outside the allowlist.
99
+ *
100
+ * @stability unstable
101
+ * @category errors
102
+ * @since 4.1.1
103
+ */
104
+ export class AlgorithmNotAllowed extends Data.TaggedError("AlgorithmNotAllowed")<{}> {
105
+ /**
106
+ * Marks this value as a `JoseError` reason for runtime guards.
107
+ *
108
+ * @since 4.1.1
109
+ */
110
+ readonly [ReasonTypeId] = ReasonTypeId
111
+
112
+ override get message(): string {
113
+ return "The token algorithm is not allowed"
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Reason for a signature that does not authenticate the token.
119
+ *
120
+ * @stability unstable
121
+ * @category errors
122
+ * @since 4.1.1
123
+ */
124
+ export class SignatureVerificationFailed extends Data.TaggedError("SignatureVerificationFailed")<{}> {
125
+ /**
126
+ * Marks this value as a `JoseError` reason for runtime guards.
127
+ *
128
+ * @since 4.1.1
129
+ */
130
+ readonly [ReasonTypeId] = ReasonTypeId
131
+
132
+ override get message(): string {
133
+ return "Could not verify the signature"
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Reason for ciphertext that fails authenticated decryption.
139
+ *
140
+ * @stability unstable
141
+ * @category errors
142
+ * @since 4.1.1
143
+ */
144
+ export class DecryptionFailed extends Data.TaggedError("DecryptionFailed")<{}> {
145
+ /**
146
+ * Marks this value as a `JoseError` reason for runtime guards.
147
+ *
148
+ * @since 4.1.1
149
+ */
150
+ readonly [ReasonTypeId] = ReasonTypeId
151
+
152
+ override get message(): string {
153
+ return "Could not decrypt the token"
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Reason for a key set with no key matching the algorithm and key id.
159
+ *
160
+ * @stability unstable
161
+ * @category errors
162
+ * @since 4.1.1
163
+ */
164
+ export class KeyNotFound extends Data.TaggedError("KeyNotFound")<{}> {
165
+ /**
166
+ * Marks this value as a `JoseError` reason for runtime guards.
167
+ *
168
+ * @since 4.1.1
169
+ */
170
+ readonly [ReasonTypeId] = ReasonTypeId
171
+
172
+ override get message(): string {
173
+ return "No key matches the algorithm and key id"
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Reason for a key set with more than one key matching the algorithm and key
179
+ * id.
180
+ *
181
+ * @stability unstable
182
+ * @category errors
183
+ * @since 4.1.1
184
+ */
185
+ export class AmbiguousKey extends Data.TaggedError("AmbiguousKey")<{}> {
186
+ /**
187
+ * Marks this value as a `JoseError` reason for runtime guards.
188
+ *
189
+ * @since 4.1.1
190
+ */
191
+ readonly [ReasonTypeId] = ReasonTypeId
192
+
193
+ override get message(): string {
194
+ return "More than one key matches the algorithm and key id"
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Reason for a remote key set that cannot be fetched or read, is cooling down
200
+ * after a failed refresh, or belongs to a closed layer.
201
+ *
202
+ * @stability unstable
203
+ * @category errors
204
+ * @since 4.1.1
205
+ */
206
+ export class KeySetUnavailable extends Data.TaggedError("KeySetUnavailable")<{
207
+ readonly description: string
208
+ readonly cause?: unknown
209
+ }> {
210
+ /**
211
+ * Marks this value as a `JoseError` reason for runtime guards.
212
+ *
213
+ * @since 4.1.1
214
+ */
215
+ readonly [ReasonTypeId] = ReasonTypeId
216
+
217
+ override get message(): string {
218
+ return this.description
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Reason for a registered claim or `typ` header that is missing, malformed,
224
+ * different from the expected value, or outside its validity window.
225
+ *
226
+ * @stability unstable
227
+ * @category errors
228
+ * @since 4.1.1
229
+ */
230
+ export class ClaimValidationFailed extends Data.TaggedError("ClaimValidationFailed")<{
231
+ readonly claim: "iss" | "sub" | "aud" | "exp" | "nbf" | "iat" | "jti" | "typ"
232
+ readonly reason: "invalid" | "missing" | "mismatch" | "expired" | "notYetValid" | "tooOld" | "future"
233
+ }> {
234
+ /**
235
+ * Marks this value as a `JoseError` reason for runtime guards.
236
+ *
237
+ * @since 4.1.1
238
+ */
239
+ readonly [ReasonTypeId] = ReasonTypeId
240
+
241
+ override get message(): string {
242
+ return `The ${this.claim} claim failed validation: ${this.reason}`
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Union of the reasons carried by `JoseError`.
248
+ *
249
+ * @stability unstable
250
+ * @category errors
251
+ * @since 4.1.1
252
+ */
253
+ export type JoseErrorReason =
254
+ | InvalidToken
255
+ | InvalidKey
256
+ | InvalidArgument
257
+ | AlgorithmNotAllowed
258
+ | SignatureVerificationFailed
259
+ | DecryptionFailed
260
+ | KeyNotFound
261
+ | AmbiguousKey
262
+ | KeySetUnavailable
263
+ | ClaimValidationFailed
264
+
265
+ /**
266
+ * Error returned by the `effect/jose` modules.
267
+ *
268
+ * **Example** (Rejecting a token with a bad signature)
269
+ *
270
+ * ```ts import.meta.vitest
271
+ * import { Effect } from "effect"
272
+ * import { JoseError } from "effect/jose"
273
+ *
274
+ * const verify = Effect.fail(
275
+ * new JoseError.JoseError({ reason: new JoseError.SignatureVerificationFailed() })
276
+ * )
277
+ *
278
+ * const program = verify.pipe(
279
+ * Effect.catchReason("JoseError", "SignatureVerificationFailed", () => Effect.succeed("rejected"))
280
+ * )
281
+ *
282
+ * await Effect.runPromise(program) // => "rejected"
283
+ * ```
284
+ *
285
+ * @see {@link isJoseError} for narrowing unknown values
286
+ *
287
+ * @stability unstable
288
+ * @category errors
289
+ * @since 4.1.1
290
+ */
291
+ export class JoseError extends Data.TaggedError("JoseError")<{
292
+ readonly reason: JoseErrorReason
293
+ }> {
294
+ /**
295
+ * Marks this value as a `JoseError` for runtime guards.
296
+ *
297
+ * @since 4.1.1
298
+ */
299
+ readonly [TypeId] = TypeId
300
+
301
+ /**
302
+ * The reason's cause, when it has one.
303
+ *
304
+ * @since 4.1.1
305
+ */
306
+ override readonly cause: unknown = "cause" in this.reason ? this.reason.cause : undefined
307
+
308
+ override get message(): string {
309
+ return this.reason.message
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Checks whether a value is a `JoseError`.
315
+ *
316
+ * @stability unstable
317
+ * @category guards
318
+ * @since 4.1.1
319
+ */
320
+ export const isJoseError = (u: unknown): u is JoseError => Predicate.hasProperty(u, TypeId)
321
+
322
+ /**
323
+ * Checks whether a value is one of the reasons carried by `JoseError`.
324
+ *
325
+ * @stability unstable
326
+ * @category guards
327
+ * @since 4.1.1
328
+ */
329
+ export const isJoseErrorReason = (u: unknown): u is JoseErrorReason => Predicate.hasProperty(u, ReasonTypeId)