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
@@ -0,0 +1,236 @@
1
+ import * as Context from "../Context.ts";
2
+ import type * as Duration from "../Duration.ts";
3
+ import * as Effect from "../Effect.ts";
4
+ import * as HttpClient from "../http/HttpClient.ts";
5
+ import * as Layer from "../Layer.ts";
6
+ import * as Schema from "../Schema.ts";
7
+ import type * as Scope from "../Scope.ts";
8
+ import * as JoseError from "./JoseError.ts";
9
+ import { type AsymmetricAlgorithm, type PublicKey } from "./Jwk.ts";
10
+ import type * as Jws from "./Jws.ts";
11
+ /**
12
+ * Schema for a set of public JWKs.
13
+ *
14
+ * **Details**
15
+ *
16
+ * Keys of other families or curves are kept but never selected. Private or
17
+ * symmetric members anywhere in the set fail decoding.
18
+ *
19
+ * @stability unstable
20
+ * @category schemas
21
+ * @since 4.1.1
22
+ */
23
+ export declare const KeySet: Schema.Struct<{
24
+ readonly keys: Schema.$Array<Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
25
+ readonly d: Schema.optionalKey<Schema.Never>;
26
+ readonly p: Schema.optionalKey<Schema.Never>;
27
+ readonly q: Schema.optionalKey<Schema.Never>;
28
+ readonly dp: Schema.optionalKey<Schema.Never>;
29
+ readonly dq: Schema.optionalKey<Schema.Never>;
30
+ readonly qi: Schema.optionalKey<Schema.Never>;
31
+ readonly oth: Schema.optionalKey<Schema.Never>;
32
+ readonly k: Schema.optionalKey<Schema.Never>;
33
+ readonly kid: Schema.optionalKey<Schema.String>;
34
+ readonly alg: Schema.optionalKey<Schema.String>;
35
+ readonly use: Schema.optionalKey<Schema.String>;
36
+ readonly key_ops: Schema.optionalKey<Schema.$Array<Schema.String>>;
37
+ readonly kty: Schema.Literal<"RSA">;
38
+ readonly n: Schema.String;
39
+ readonly e: Schema.String;
40
+ }>, Schema.Struct<{
41
+ readonly d: Schema.optionalKey<Schema.Never>;
42
+ readonly p: Schema.optionalKey<Schema.Never>;
43
+ readonly q: Schema.optionalKey<Schema.Never>;
44
+ readonly dp: Schema.optionalKey<Schema.Never>;
45
+ readonly dq: Schema.optionalKey<Schema.Never>;
46
+ readonly qi: Schema.optionalKey<Schema.Never>;
47
+ readonly oth: Schema.optionalKey<Schema.Never>;
48
+ readonly k: Schema.optionalKey<Schema.Never>;
49
+ readonly kid: Schema.optionalKey<Schema.String>;
50
+ readonly alg: Schema.optionalKey<Schema.String>;
51
+ readonly use: Schema.optionalKey<Schema.String>;
52
+ readonly key_ops: Schema.optionalKey<Schema.$Array<Schema.String>>;
53
+ readonly kty: Schema.Literal<"EC">;
54
+ readonly crv: Schema.Literals<readonly ["P-256", "P-384", "P-521"]>;
55
+ readonly x: Schema.String;
56
+ readonly y: Schema.String;
57
+ }>, Schema.Struct<{
58
+ readonly d: Schema.optionalKey<Schema.Never>;
59
+ readonly p: Schema.optionalKey<Schema.Never>;
60
+ readonly q: Schema.optionalKey<Schema.Never>;
61
+ readonly dp: Schema.optionalKey<Schema.Never>;
62
+ readonly dq: Schema.optionalKey<Schema.Never>;
63
+ readonly qi: Schema.optionalKey<Schema.Never>;
64
+ readonly oth: Schema.optionalKey<Schema.Never>;
65
+ readonly k: Schema.optionalKey<Schema.Never>;
66
+ readonly kid: Schema.optionalKey<Schema.String>;
67
+ readonly alg: Schema.optionalKey<Schema.String>;
68
+ readonly use: Schema.optionalKey<Schema.String>;
69
+ readonly key_ops: Schema.optionalKey<Schema.$Array<Schema.String>>;
70
+ readonly kty: Schema.Literal<"OKP">;
71
+ readonly crv: Schema.Literal<"Ed25519">;
72
+ readonly x: Schema.String;
73
+ }>]>, Schema.StructWithRest<Schema.Struct<{
74
+ readonly d: Schema.optionalKey<Schema.Never>;
75
+ readonly p: Schema.optionalKey<Schema.Never>;
76
+ readonly q: Schema.optionalKey<Schema.Never>;
77
+ readonly dp: Schema.optionalKey<Schema.Never>;
78
+ readonly dq: Schema.optionalKey<Schema.Never>;
79
+ readonly qi: Schema.optionalKey<Schema.Never>;
80
+ readonly oth: Schema.optionalKey<Schema.Never>;
81
+ readonly k: Schema.optionalKey<Schema.Never>;
82
+ readonly kty: Schema.String;
83
+ readonly crv: Schema.optionalKey<Schema.String>;
84
+ }>, readonly [Schema.$Record<Schema.String, Schema.Unknown>]>]>>;
85
+ }>;
86
+ /**
87
+ * A set of public JWKs.
88
+ *
89
+ * @stability unstable
90
+ * @category models
91
+ * @since 4.1.1
92
+ */
93
+ export type KeySet = typeof KeySet.Type;
94
+ /**
95
+ * The algorithm, and optionally the key id, of the key to resolve.
96
+ *
97
+ * @stability unstable
98
+ * @category models
99
+ * @since 4.1.1
100
+ */
101
+ export interface Selection {
102
+ readonly algorithm: AsymmetricAlgorithm;
103
+ readonly kid?: string | undefined;
104
+ /**
105
+ * The unauthenticated header when resolving a token's key. Use it only for
106
+ * key selection; it is authenticated only after verification succeeds.
107
+ */
108
+ readonly protectedHeader?: Jws.ProtectedHeader | undefined;
109
+ }
110
+ declare const Jwks_base: Context.ServiceClass<Jwks, "effect/jose/Jwks", {
111
+ readonly resolve: (selection: Selection) => Effect.Effect<PublicKey, JoseError.JoseError>;
112
+ }>;
113
+ /**
114
+ * Service that resolves the verification key for a selection.
115
+ *
116
+ * @stability unstable
117
+ * @category services
118
+ * @since 4.1.1
119
+ */
120
+ export declare class Jwks extends Jwks_base {
121
+ }
122
+ /**
123
+ * Builds a `Jwks` service for a fixed key set.
124
+ *
125
+ * **Example** (Resolving a key by `kid`)
126
+ *
127
+ * ```ts import.meta.vitest
128
+ * import { Effect, Layer } from "effect"
129
+ * import { SecureRandom, Signature } from "effect/crypto"
130
+ * import { Jwk, Jwks } from "effect/jose"
131
+ *
132
+ * const layer = Signature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto))
133
+ *
134
+ * const kid = await Effect.runPromise(Effect.gen(function*() {
135
+ * const pair = yield* Jwk.generateKeyPair({ algorithm: "ES256", kid: "signing-1" })
136
+ * const jwks = yield* Jwks.makeLocal({ keys: [pair.publicKey] })
137
+ * const key = yield* jwks.resolve({ algorithm: "ES256", kid: "signing-1" })
138
+ * return key.kid
139
+ * }).pipe(Effect.provide(layer)))
140
+ * kid // => "signing-1"
141
+ * ```
142
+ *
143
+ * @stability unstable
144
+ * @category constructors
145
+ * @since 4.1.1
146
+ */
147
+ export declare const makeLocal: (keySet: KeySet) => Effect.Effect<Jwks["Service"]>;
148
+ /**
149
+ * Layer that provides `Jwks` for a fixed key set.
150
+ *
151
+ * @stability unstable
152
+ * @category layers
153
+ * @since 4.1.1
154
+ */
155
+ export declare const layerLocal: (keySet: KeySet) => Layer.Layer<Jwks>;
156
+ /**
157
+ * Options for {@link makeRemote} and {@link layerRemote}.
158
+ *
159
+ * @stability unstable
160
+ * @category models
161
+ * @since 4.1.1
162
+ */
163
+ export interface RemoteOptions {
164
+ /**
165
+ * The HTTPS key-set URL, without credentials or a fragment. Take it from
166
+ * configuration, never from a token.
167
+ */
168
+ readonly url: string;
169
+ /**
170
+ * How long a fetched key set is used. Defaults to 10 minutes.
171
+ */
172
+ readonly timeToLive?: Duration.Input | undefined;
173
+ /**
174
+ * Minimum time before retrying after a failed fetch, or refetching for an
175
+ * unknown key. Defaults to 30 seconds.
176
+ */
177
+ readonly cooldown?: Duration.Input | undefined;
178
+ /**
179
+ * Timeout for the request and reading its body. Defaults to 5 seconds.
180
+ */
181
+ readonly timeout?: Duration.Input | undefined;
182
+ /**
183
+ * Maximum response body size. Defaults to 131072 bytes.
184
+ */
185
+ readonly maxResponseBytes?: number | undefined;
186
+ /**
187
+ * Maximum number of keys in the set. Defaults to 64.
188
+ */
189
+ readonly maxKeys?: number | undefined;
190
+ }
191
+ /**
192
+ * Builds a `Jwks` service for a remote key set, using the `HttpClient`
193
+ * service. Use it when the URL is only known at runtime, for example from
194
+ * OpenID Connect discovery.
195
+ *
196
+ * **Details**
197
+ *
198
+ * The key set is fetched on first use and reused until `timeToLive` passes.
199
+ * Concurrent callers share one request. A selection that finds no key fetches
200
+ * the set again, at most once per `cooldown`, so rotated keys are picked up
201
+ * without letting unknown `kid`s drive a request per token. A failed fetch
202
+ * fails every caller until `cooldown` passes; there is no fallback to an
203
+ * expired set.
204
+ *
205
+ * Only a 200 response from the configured URL is accepted, so a redirected
206
+ * key set is rejected. The check runs on the response, so it cannot stop a
207
+ * client from sending the redirected request.
208
+ *
209
+ * **Gotchas**
210
+ *
211
+ * Supply a client that does not follow redirects. `FetchHttpClient` follows
212
+ * them by default: provide `FetchHttpClient.RequestInit` with
213
+ * `{ redirect: "manual" }` on its layer so a redirect fails before any further
214
+ * request. Clients wrapped with `HttpClient.followRedirects` also follow them.
215
+ *
216
+ * Closing the scope interrupts any request in flight, and later resolutions
217
+ * fail with `KeySetUnavailable`.
218
+ *
219
+ * @stability unstable
220
+ * @category constructors
221
+ * @since 4.1.1
222
+ */
223
+ export declare const makeRemote: (options: RemoteOptions) => Effect.Effect<{
224
+ readonly resolve: (selection: Selection) => Effect.Effect<PublicKey, JoseError.JoseError>;
225
+ }, JoseError.JoseError, HttpClient.HttpClient | Scope.Scope>;
226
+ /**
227
+ * Layer that provides `Jwks` from a remote key set built by {@link makeRemote}.
228
+ * Closing the layer interrupts any request in flight.
229
+ *
230
+ * @stability unstable
231
+ * @category layers
232
+ * @since 4.1.1
233
+ */
234
+ export declare const layerRemote: (options: RemoteOptions) => Layer.Layer<Jwks, JoseError.JoseError, HttpClient.HttpClient>;
235
+ export {};
236
+ //# sourceMappingURL=Jwks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jwks.d.ts","sourceRoot":"","sources":["../../src/jose/Jwks.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AAEtC,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAA;AAGzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,KAAK,mBAAmB,EAA2B,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAA;AAkBpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjB,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAA;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,eAAe,GAAG,SAAS,CAAA;CAC3D;;sBAUmB,CAAC,SAAS,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC;;AAR3F;;;;;;GAMG;AACH,qBAAa,IAAK,SAAQ,SAEF;CAAG;AAsD3B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAOpE,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,WAAY,MAAM,KAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAA0C,CAAA;AAEtG;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAChD;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC9C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC7C;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9C;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAiCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU;sBArMH,CAAC,SAAS,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC;4DAmTzF,CAAA;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,YACb,aAAa,KACrB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,CAA4C,CAAA"}
@@ -0,0 +1,306 @@
1
+ /**
2
+ * JSON Web Key Sets and the `Jwks` service that resolves verification keys
3
+ * from them.
4
+ *
5
+ * A key is selected by algorithm and optional `kid`. It must fit the
6
+ * algorithm's key family and curve, and its `alg`, `use`, and `key_ops`
7
+ * members must allow verification with that algorithm. No match fails with
8
+ * `KeyNotFound` and several matches with `AmbiguousKey`.
9
+ *
10
+ * {@link layerLocal} serves a fixed key set. {@link makeRemote} and
11
+ * {@link layerRemote} fetch one from an HTTPS endpoint and cache it.
12
+ *
13
+ * @stability unstable
14
+ * @since 4.1.1
15
+ */
16
+ import * as Cause from "../Cause.js";
17
+ import * as Clock from "../Clock.js";
18
+ import * as Context from "../Context.js";
19
+ import * as Deferred from "../Deferred.js";
20
+ import * as Effect from "../Effect.js";
21
+ import * as Exit from "../Exit.js";
22
+ import * as HttpClient from "../http/HttpClient.js";
23
+ import * as Layer from "../Layer.js";
24
+ import * as Schema from "../Schema.js";
25
+ import * as Stream from "../Stream.js";
26
+ import { fail, invalidArgument, millis, noPrivateMembers, parseJsonObject } from "./internal/compact.js";
27
+ import * as JoseError from "./JoseError.js";
28
+ import { importPublic, PublicJwk } from "./Jwk.js";
29
+ // Any other key family or curve, with any other members. Private and
30
+ // symmetric members, including RSA factors, are still rejected.
31
+ const UnsupportedJwk = /*#__PURE__*/Schema.StructWithRest(Schema.Struct({
32
+ kty: Schema.String,
33
+ crv: Schema.optionalKey(Schema.String),
34
+ ...noPrivateMembers
35
+ }), [Schema.Record(Schema.String, Schema.Unknown)]).check(/*#__PURE__*/Schema.makeFilter(jwk => jwk.kty !== "oct" && jwk.kty !== "RSA" && (jwk.kty !== "EC" || jwk.crv !== undefined && jwk.crv !== "P-256" && jwk.crv !== "P-384" && jwk.crv !== "P-521") && (jwk.kty !== "OKP" || jwk.crv !== undefined && jwk.crv !== "Ed25519")));
36
+ /**
37
+ * Schema for a set of public JWKs.
38
+ *
39
+ * **Details**
40
+ *
41
+ * Keys of other families or curves are kept but never selected. Private or
42
+ * symmetric members anywhere in the set fail decoding.
43
+ *
44
+ * @stability unstable
45
+ * @category schemas
46
+ * @since 4.1.1
47
+ */
48
+ export const KeySet = /*#__PURE__*/Schema.Struct({
49
+ keys: /*#__PURE__*/Schema.Array(/*#__PURE__*/Schema.Union([PublicJwk, UnsupportedJwk]))
50
+ });
51
+ /**
52
+ * Service that resolves the verification key for a selection.
53
+ *
54
+ * @stability unstable
55
+ * @category services
56
+ * @since 4.1.1
57
+ */
58
+ export class Jwks extends /*#__PURE__*/Context.Service()("effect/jose/Jwks") {}
59
+ const isPublicJwk = /*#__PURE__*/Schema.is(PublicJwk);
60
+ const keyTypes = {
61
+ RS256: {
62
+ kty: "RSA"
63
+ },
64
+ RS384: {
65
+ kty: "RSA"
66
+ },
67
+ RS512: {
68
+ kty: "RSA"
69
+ },
70
+ PS256: {
71
+ kty: "RSA"
72
+ },
73
+ PS384: {
74
+ kty: "RSA"
75
+ },
76
+ PS512: {
77
+ kty: "RSA"
78
+ },
79
+ ES256: {
80
+ kty: "EC",
81
+ crv: "P-256"
82
+ },
83
+ ES384: {
84
+ kty: "EC",
85
+ crv: "P-384"
86
+ },
87
+ ES512: {
88
+ kty: "EC",
89
+ crv: "P-521"
90
+ },
91
+ EdDSA: {
92
+ kty: "OKP",
93
+ crv: "Ed25519"
94
+ }
95
+ };
96
+ // The keys that can ever be selected, computed once per key set rather than
97
+ // on every lookup.
98
+ const supportedKeys = keySet => keySet.keys.filter(isPublicJwk);
99
+ const candidates = (keys, selection) => {
100
+ const {
101
+ crv,
102
+ kty
103
+ } = keyTypes[selection.algorithm];
104
+ return keys.filter(key => key.kty === kty && ("crv" in key ? key.crv : undefined) === crv && (selection.kid === undefined || key.kid === selection.kid) && (key.alg === undefined || key.alg === selection.algorithm) && (key.use === undefined || key.use === "sig") && (key.key_ops === undefined || key.key_ops.includes("verify")));
105
+ };
106
+ // Imports each JWK once per algorithm. Keyed weakly so replaced key sets can be collected.
107
+ const makeImporter = () => {
108
+ const imported = new WeakMap();
109
+ return (found, algorithm) => {
110
+ if (found.length === 0) return fail(new JoseError.KeyNotFound());
111
+ if (found.length > 1) return fail(new JoseError.AmbiguousKey());
112
+ const jwk = found[0];
113
+ const cached = imported.get(jwk)?.get(algorithm);
114
+ if (cached !== undefined) return Effect.succeed(cached);
115
+ return Effect.tap(importPublic(jwk, algorithm), key => Effect.sync(() => {
116
+ let byAlgorithm = imported.get(jwk);
117
+ if (byAlgorithm === undefined) imported.set(jwk, byAlgorithm = new Map());
118
+ byAlgorithm.set(algorithm, key);
119
+ }));
120
+ };
121
+ };
122
+ /**
123
+ * Builds a `Jwks` service for a fixed key set.
124
+ *
125
+ * **Example** (Resolving a key by `kid`)
126
+ *
127
+ * ```ts import.meta.vitest
128
+ * import { Effect, Layer } from "effect"
129
+ * import { SecureRandom, Signature } from "effect/crypto"
130
+ * import { Jwk, Jwks } from "effect/jose"
131
+ *
132
+ * const layer = Signature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto))
133
+ *
134
+ * const kid = await Effect.runPromise(Effect.gen(function*() {
135
+ * const pair = yield* Jwk.generateKeyPair({ algorithm: "ES256", kid: "signing-1" })
136
+ * const jwks = yield* Jwks.makeLocal({ keys: [pair.publicKey] })
137
+ * const key = yield* jwks.resolve({ algorithm: "ES256", kid: "signing-1" })
138
+ * return key.kid
139
+ * }).pipe(Effect.provide(layer)))
140
+ * kid // => "signing-1"
141
+ * ```
142
+ *
143
+ * @stability unstable
144
+ * @category constructors
145
+ * @since 4.1.1
146
+ */
147
+ export const makeLocal = keySet => Effect.sync(() => {
148
+ const keys = supportedKeys(keySet);
149
+ const importKey = makeImporter();
150
+ return Jwks.of({
151
+ resolve: selection => importKey(candidates(keys, selection), selection.algorithm)
152
+ });
153
+ });
154
+ /**
155
+ * Layer that provides `Jwks` for a fixed key set.
156
+ *
157
+ * @stability unstable
158
+ * @category layers
159
+ * @since 4.1.1
160
+ */
161
+ export const layerLocal = keySet => Layer.effect(Jwks, makeLocal(keySet));
162
+ const unavailable = (description, cause) => new JoseError.JoseError({
163
+ reason: new JoseError.KeySetUnavailable({
164
+ description,
165
+ cause
166
+ })
167
+ });
168
+ const positiveInteger = (name, value) => Number.isSafeInteger(value) && value > 0 ? Effect.succeed(value) : invalidArgument(`${name} must be a positive integer`);
169
+ const positiveMillis = (name, input) => Effect.flatMap(millis(name, input), value => value > 0 ? Effect.succeed(value) : invalidArgument(`${name} must be positive`));
170
+ const readUrl = input => {
171
+ let url;
172
+ try {
173
+ url = new URL(input);
174
+ } catch {
175
+ url = undefined;
176
+ }
177
+ return url !== undefined && url.protocol === "https:" && url.username === "" && url.password === "" && url.hash === "" ? Effect.succeed(url) : invalidArgument("url must be an HTTPS URL without credentials or a fragment");
178
+ };
179
+ /**
180
+ * Builds a `Jwks` service for a remote key set, using the `HttpClient`
181
+ * service. Use it when the URL is only known at runtime, for example from
182
+ * OpenID Connect discovery.
183
+ *
184
+ * **Details**
185
+ *
186
+ * The key set is fetched on first use and reused until `timeToLive` passes.
187
+ * Concurrent callers share one request. A selection that finds no key fetches
188
+ * the set again, at most once per `cooldown`, so rotated keys are picked up
189
+ * without letting unknown `kid`s drive a request per token. A failed fetch
190
+ * fails every caller until `cooldown` passes; there is no fallback to an
191
+ * expired set.
192
+ *
193
+ * Only a 200 response from the configured URL is accepted, so a redirected
194
+ * key set is rejected. The check runs on the response, so it cannot stop a
195
+ * client from sending the redirected request.
196
+ *
197
+ * **Gotchas**
198
+ *
199
+ * Supply a client that does not follow redirects. `FetchHttpClient` follows
200
+ * them by default: provide `FetchHttpClient.RequestInit` with
201
+ * `{ redirect: "manual" }` on its layer so a redirect fails before any further
202
+ * request. Clients wrapped with `HttpClient.followRedirects` also follow them.
203
+ *
204
+ * Closing the scope interrupts any request in flight, and later resolutions
205
+ * fail with `KeySetUnavailable`.
206
+ *
207
+ * @stability unstable
208
+ * @category constructors
209
+ * @since 4.1.1
210
+ */
211
+ export const makeRemote = /*#__PURE__*/Effect.fnUntraced(function* (options) {
212
+ const url = yield* readUrl(options.url);
213
+ const timeToLive = yield* positiveMillis("timeToLive", options.timeToLive ?? "10 minutes");
214
+ const cooldown = yield* millis("cooldown", options.cooldown ?? "30 seconds");
215
+ const timeout = yield* positiveMillis("timeout", options.timeout ?? "5 seconds");
216
+ const maxResponseBytes = yield* positiveInteger("maxResponseBytes", options.maxResponseBytes ?? 131072);
217
+ const maxKeys = yield* positiveInteger("maxKeys", options.maxKeys ?? 64);
218
+ const client = HttpClient.withScope(yield* HttpClient.HttpClient);
219
+ const scope = yield* Effect.scope;
220
+ const importKey = makeImporter();
221
+ let cache;
222
+ let pending;
223
+ let lastAttempt = -Infinity;
224
+ let lastFailed = false;
225
+ let closed = false;
226
+ const closedExit = Exit.fail(unavailable("The key set scope is closed"));
227
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
228
+ closed = true;
229
+ if (pending !== undefined) Deferred.doneUnsafe(pending, closedExit);
230
+ }));
231
+ const fetch = Effect.gen(function* () {
232
+ const response = yield* client.get(url.href, {
233
+ headers: {
234
+ accept: "application/json"
235
+ }
236
+ });
237
+ if (response.status !== 200) {
238
+ return yield* unavailable(`The key set endpoint responded with status ${response.status}`);
239
+ }
240
+ if (response.url !== url.href) {
241
+ return yield* unavailable("The key set response came from another URL");
242
+ }
243
+ const body = new Uint8Array(maxResponseBytes);
244
+ const length = yield* Stream.runFoldEffect(response.stream, () => 0, (length, chunk) => {
245
+ if (chunk.length > body.length - length) {
246
+ return Effect.fail(unavailable(`The key set response exceeds ${maxResponseBytes} bytes`));
247
+ }
248
+ body.set(chunk, length);
249
+ return Effect.succeed(length + chunk.length);
250
+ });
251
+ const keySet = yield* Schema.decodeUnknownEffect(KeySet)(parseJsonObject(body.subarray(0, length))).pipe(Effect.mapError(cause => unavailable("The key set document is invalid", cause)));
252
+ if (keySet.keys.length > maxKeys) {
253
+ return yield* unavailable(`The key set has more than ${maxKeys} keys`);
254
+ }
255
+ return {
256
+ keys: supportedKeys(keySet),
257
+ expiresAt: (yield* Clock.currentTimeMillis) + timeToLive
258
+ };
259
+ }).pipe(Effect.scoped, Effect.catchTag("HttpClientError", cause => Effect.fail(unavailable("The key set request failed", cause))), Effect.timeoutOrElse({
260
+ duration: timeout,
261
+ orElse: () => Effect.fail(unavailable("The key set request timed out"))
262
+ }));
263
+ // Returns `undefined` while cooling down, which applies only to unknown-key
264
+ // refetches (`stale` lacked the key) and retries after a failure.
265
+ const refresh = (now, stale) => Effect.uninterruptibleMask(restore => Effect.suspend(() => {
266
+ if (closed) return closedExit;
267
+ if (cache !== undefined && cache !== stale && cache.expiresAt > now) return Effect.succeed(cache);
268
+ if (pending !== undefined) return restore(Deferred.await(pending));
269
+ if ((stale !== undefined || lastFailed) && now - lastAttempt < cooldown) return Effect.succeed(undefined);
270
+ lastAttempt = now;
271
+ const result = pending = Deferred.makeUnsafe();
272
+ return fetch.pipe(Effect.onExit(exit => Effect.sync(() => {
273
+ pending = undefined;
274
+ lastFailed = Exit.isFailure(exit);
275
+ if (Exit.isSuccess(exit)) cache = exit.value;
276
+ Deferred.doneUnsafe(result, Exit.isFailure(exit) && Cause.hasInterruptsOnly(exit.cause) ? closedExit : exit);
277
+ })), Effect.forkIn(scope, {
278
+ uninterruptible: false
279
+ }), Effect.andThen(restore(Deferred.await(result))));
280
+ }));
281
+ const resolve = selection => Effect.flatMap(Clock.currentTimeMillis, now => {
282
+ if (closed) return closedExit;
283
+ const lookup = snapshot => importKey(candidates(snapshot.keys, selection), selection.algorithm);
284
+ const current = cache;
285
+ if (current !== undefined && current.expiresAt > now) {
286
+ const found = candidates(current.keys, selection);
287
+ if (found.length > 0) return importKey(found, selection.algorithm);
288
+ // An unknown key may have been rotated in. Refetch, unless cooling down.
289
+ return Effect.flatMap(refresh(now, current), snapshot => snapshot === undefined ? fail(new JoseError.KeyNotFound()) : lookup(snapshot));
290
+ }
291
+ return Effect.flatMap(refresh(now), snapshot => snapshot === undefined ? Effect.fail(unavailable("The key set is cooling down after a failed fetch")) : lookup(snapshot));
292
+ });
293
+ return Jwks.of({
294
+ resolve
295
+ });
296
+ });
297
+ /**
298
+ * Layer that provides `Jwks` from a remote key set built by {@link makeRemote}.
299
+ * Closing the layer interrupts any request in flight.
300
+ *
301
+ * @stability unstable
302
+ * @category layers
303
+ * @since 4.1.1
304
+ */
305
+ export const layerRemote = options => Layer.effect(Jwks, makeRemote(options));
306
+ //# sourceMappingURL=Jwks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jwks.js","names":[],"sources":["../../src/jose/Jwks.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}