effect 4.1.0 → 4.1.2

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 (445) hide show
  1. package/README.md +30 -0
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/ai-docs/package.json +2 -2
  4. package/dist/BigDecimal.d.ts +139 -7
  5. package/dist/BigDecimal.d.ts.map +1 -1
  6. package/dist/BigDecimal.js +83 -14
  7. package/dist/BigDecimal.js.map +1 -1
  8. package/dist/ByteSize.d.ts.map +1 -1
  9. package/dist/ByteSize.js +27 -14
  10. package/dist/ByteSize.js.map +1 -1
  11. package/dist/Equal.d.ts +2 -2
  12. package/dist/Equal.d.ts.map +1 -1
  13. package/dist/Equal.js +3 -3
  14. package/dist/Equal.js.map +1 -1
  15. package/dist/Hash.d.ts +3 -2
  16. package/dist/Hash.d.ts.map +1 -1
  17. package/dist/Hash.js +5 -4
  18. package/dist/Hash.js.map +1 -1
  19. package/dist/Iterable.d.ts.map +1 -1
  20. package/dist/Iterable.js +38 -32
  21. package/dist/Iterable.js.map +1 -1
  22. package/dist/JsonSchema.d.ts.map +1 -1
  23. package/dist/JsonSchema.js +27 -6
  24. package/dist/JsonSchema.js.map +1 -1
  25. package/dist/MutableRef.d.ts.map +1 -1
  26. package/dist/MutableRef.js +0 -7
  27. package/dist/MutableRef.js.map +1 -1
  28. package/dist/Path.d.ts.map +1 -1
  29. package/dist/Path.js +5 -1
  30. package/dist/Path.js.map +1 -1
  31. package/dist/Pool.d.ts.map +1 -1
  32. package/dist/Pool.js +2 -1
  33. package/dist/Pool.js.map +1 -1
  34. package/dist/Ref.d.ts.map +1 -1
  35. package/dist/Ref.js +0 -8
  36. package/dist/Ref.js.map +1 -1
  37. package/dist/Schedule.d.ts.map +1 -1
  38. package/dist/Schedule.js +8 -3
  39. package/dist/Schedule.js.map +1 -1
  40. package/dist/Schema.d.ts +2 -1
  41. package/dist/Schema.d.ts.map +1 -1
  42. package/dist/Schema.js +2 -1
  43. package/dist/Schema.js.map +1 -1
  44. package/dist/SchemaRepresentation.d.ts +4 -2
  45. package/dist/SchemaRepresentation.d.ts.map +1 -1
  46. package/dist/SchemaRepresentation.js +4 -2
  47. package/dist/SchemaRepresentation.js.map +1 -1
  48. package/dist/SchemaTransformation.d.ts +2 -2
  49. package/dist/SchemaTransformation.js +2 -2
  50. package/dist/Stream.d.ts.map +1 -1
  51. package/dist/Stream.js +6 -5
  52. package/dist/Stream.js.map +1 -1
  53. package/dist/ai/McpClient.d.ts +171 -19
  54. package/dist/ai/McpClient.d.ts.map +1 -1
  55. package/dist/ai/McpClient.js +277 -66
  56. package/dist/ai/McpClient.js.map +1 -1
  57. package/dist/ai/McpSchema.d.ts +108 -0
  58. package/dist/ai/McpSchema.d.ts.map +1 -1
  59. package/dist/ai/McpSchema.js +99 -0
  60. package/dist/ai/McpSchema.js.map +1 -1
  61. package/dist/ai/McpServer.d.ts +120 -6
  62. package/dist/ai/McpServer.d.ts.map +1 -1
  63. package/dist/ai/McpServer.js +258 -49
  64. package/dist/ai/McpServer.js.map +1 -1
  65. package/dist/ai/Prompt.d.ts.map +1 -1
  66. package/dist/ai/Prompt.js +20 -11
  67. package/dist/ai/Prompt.js.map +1 -1
  68. package/dist/ai/Tool.d.ts.map +1 -1
  69. package/dist/ai/Tool.js +5 -7
  70. package/dist/ai/Tool.js.map +1 -1
  71. package/dist/ai/internal/mcpCore.js +72 -3
  72. package/dist/ai/internal/mcpCore.js.map +1 -1
  73. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +3 -1
  74. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  75. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +3 -1
  76. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  77. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +3 -1
  78. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  79. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +3 -1
  80. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  81. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +44 -8
  82. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  83. package/dist/ai/internal/mcpProtocol.js +12 -0
  84. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  85. package/dist/ai/internal/mcpRuntime.js +3 -3
  86. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  87. package/dist/ai/internal/mcpSkills.d.ts +2 -0
  88. package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
  89. package/dist/ai/internal/mcpSkills.js +428 -0
  90. package/dist/ai/internal/mcpSkills.js.map +1 -0
  91. package/dist/ai/internal/structured-output.js +11 -2
  92. package/dist/ai/internal/structured-output.js.map +1 -1
  93. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  94. package/dist/cluster/ClusterWorkflowEngine.js +30 -11
  95. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  96. package/dist/cluster/Entity.d.ts +26 -0
  97. package/dist/cluster/Entity.d.ts.map +1 -1
  98. package/dist/cluster/Entity.js.map +1 -1
  99. package/dist/cluster/MessageStorage.d.ts +6 -6
  100. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  101. package/dist/cluster/MessageStorage.js +1 -3
  102. package/dist/cluster/MessageStorage.js.map +1 -1
  103. package/dist/cluster/Reply.d.ts +1 -1
  104. package/dist/cluster/Reply.d.ts.map +1 -1
  105. package/dist/cluster/Reply.js.map +1 -1
  106. package/dist/cluster/Runners.d.ts.map +1 -1
  107. package/dist/cluster/Runners.js +13 -2
  108. package/dist/cluster/Runners.js.map +1 -1
  109. package/dist/cluster/Sharding.d.ts +13 -0
  110. package/dist/cluster/Sharding.d.ts.map +1 -1
  111. package/dist/cluster/Sharding.js +4 -1
  112. package/dist/cluster/Sharding.js.map +1 -1
  113. package/dist/cluster/internal/clusterAbandon.d.ts.map +1 -1
  114. package/dist/cluster/internal/clusterAbandon.js +6 -4
  115. package/dist/cluster/internal/clusterAbandon.js.map +1 -1
  116. package/dist/cluster/internal/entityManager.js +63 -11
  117. package/dist/cluster/internal/entityManager.js.map +1 -1
  118. package/dist/cluster/internal/transactionNotifications.d.ts +5 -0
  119. package/dist/cluster/internal/transactionNotifications.d.ts.map +1 -0
  120. package/dist/cluster/internal/transactionNotifications.js +5 -0
  121. package/dist/cluster/internal/transactionNotifications.js.map +1 -0
  122. package/dist/crypto/Aead.d.ts +2 -1
  123. package/dist/crypto/Aead.d.ts.map +1 -1
  124. package/dist/crypto/Aead.js +2 -2
  125. package/dist/crypto/Aead.js.map +1 -1
  126. package/dist/crypto/Cipher.d.ts +2 -1
  127. package/dist/crypto/Cipher.d.ts.map +1 -1
  128. package/dist/crypto/Cipher.js +2 -2
  129. package/dist/crypto/Cipher.js.map +1 -1
  130. package/dist/crypto/KeyAgreement.d.ts +3 -2
  131. package/dist/crypto/KeyAgreement.d.ts.map +1 -1
  132. package/dist/crypto/KeyAgreement.js +2 -2
  133. package/dist/crypto/KeyAgreement.js.map +1 -1
  134. package/dist/crypto/KeyFormat.d.ts +33 -1
  135. package/dist/crypto/KeyFormat.d.ts.map +1 -1
  136. package/dist/crypto/KeyFormat.js.map +1 -1
  137. package/dist/crypto/KeyWrap.d.ts +4 -3
  138. package/dist/crypto/KeyWrap.d.ts.map +1 -1
  139. package/dist/crypto/KeyWrap.js +2 -2
  140. package/dist/crypto/KeyWrap.js.map +1 -1
  141. package/dist/crypto/Mac.d.ts +2 -1
  142. package/dist/crypto/Mac.d.ts.map +1 -1
  143. package/dist/crypto/Mac.js +2 -2
  144. package/dist/crypto/Mac.js.map +1 -1
  145. package/dist/crypto/Signature.d.ts +3 -2
  146. package/dist/crypto/Signature.d.ts.map +1 -1
  147. package/dist/crypto/Signature.js +2 -2
  148. package/dist/crypto/Signature.js.map +1 -1
  149. package/dist/crypto/WebCrypto.d.ts +19 -0
  150. package/dist/crypto/WebCrypto.d.ts.map +1 -1
  151. package/dist/crypto/WebCrypto.js.map +1 -1
  152. package/dist/crypto/internal/asymmetric.js.map +1 -1
  153. package/dist/crypto/internal/key.js +3 -2
  154. package/dist/crypto/internal/key.js.map +1 -1
  155. package/dist/encoding/Base64Url.d.ts.map +1 -1
  156. package/dist/encoding/Base64Url.js +26 -3
  157. package/dist/encoding/Base64Url.js.map +1 -1
  158. package/dist/encoding/Json5.d.ts +44 -0
  159. package/dist/encoding/Json5.d.ts.map +1 -0
  160. package/dist/encoding/Json5.js +56 -0
  161. package/dist/encoding/Json5.js.map +1 -0
  162. package/dist/encoding/Jsonc.d.ts +47 -0
  163. package/dist/encoding/Jsonc.d.ts.map +1 -0
  164. package/dist/encoding/Jsonc.js +120 -0
  165. package/dist/encoding/Jsonc.js.map +1 -0
  166. package/dist/encoding/Ndjson.d.ts +5 -4
  167. package/dist/encoding/Ndjson.d.ts.map +1 -1
  168. package/dist/encoding/Ndjson.js +6 -5
  169. package/dist/encoding/Ndjson.js.map +1 -1
  170. package/dist/encoding/SchemaBinary.d.ts +94 -0
  171. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  172. package/dist/encoding/SchemaBinary.js +219 -6
  173. package/dist/encoding/SchemaBinary.js.map +1 -1
  174. package/dist/encoding/Sse.d.ts +3 -1
  175. package/dist/encoding/Sse.d.ts.map +1 -1
  176. package/dist/encoding/Sse.js +5 -3
  177. package/dist/encoding/Sse.js.map +1 -1
  178. package/dist/encoding/index.d.ts +10 -0
  179. package/dist/encoding/index.d.ts.map +1 -1
  180. package/dist/encoding/index.js +10 -0
  181. package/dist/encoding/index.js.map +1 -1
  182. package/dist/eventlog/EventLog.d.ts +7 -0
  183. package/dist/eventlog/EventLog.d.ts.map +1 -1
  184. package/dist/eventlog/EventLog.js +7 -0
  185. package/dist/eventlog/EventLog.js.map +1 -1
  186. package/dist/eventlog/EventLogServer.d.ts +7 -1
  187. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  188. package/dist/eventlog/EventLogServer.js +55 -24
  189. package/dist/eventlog/EventLogServer.js.map +1 -1
  190. package/dist/eventlog/EventLogServerEncrypted.d.ts +10 -0
  191. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  192. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  193. package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
  194. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  195. package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
  196. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  197. package/dist/eventlog/EventLogSessionAuth.d.ts +21 -0
  198. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  199. package/dist/eventlog/EventLogSessionAuth.js +22 -0
  200. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  201. package/dist/graphql/GraphQLClient.d.ts +3 -1
  202. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  203. package/dist/graphql/GraphQLClient.js.map +1 -1
  204. package/dist/graphql/GraphQLClientError.d.ts +14 -9
  205. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  206. package/dist/graphql/GraphQLClientError.js +14 -21
  207. package/dist/graphql/GraphQLClientError.js.map +1 -1
  208. package/dist/graphql/GraphQLProtocol.d.ts +12 -3
  209. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  210. package/dist/graphql/GraphQLProtocol.js +4 -1
  211. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  212. package/dist/http/HttpClient.d.ts +204 -16
  213. package/dist/http/HttpClient.d.ts.map +1 -1
  214. package/dist/http/HttpClient.js +93 -13
  215. package/dist/http/HttpClient.js.map +1 -1
  216. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  217. package/dist/http/HttpServerRequest.js +38 -22
  218. package/dist/http/HttpServerRequest.js.map +1 -1
  219. package/dist/http/internal/mimeTypes.d.ts +4 -1
  220. package/dist/http/internal/mimeTypes.d.ts.map +1 -1
  221. package/dist/http/internal/mimeTypes.js +4 -1
  222. package/dist/http/internal/mimeTypes.js.map +1 -1
  223. package/dist/http-api/HttpApiSchema.js +1 -1
  224. package/dist/http-api/HttpApiSchema.js.map +1 -1
  225. package/dist/internal/dateTime.js +66 -27
  226. package/dist/internal/dateTime.js.map +1 -1
  227. package/dist/internal/effect.js +10 -0
  228. package/dist/internal/effect.js.map +1 -1
  229. package/dist/internal/glob.js +234 -56
  230. package/dist/internal/glob.js.map +1 -1
  231. package/dist/internal/graphql.js +21 -7
  232. package/dist/internal/graphql.js.map +1 -1
  233. package/dist/internal/graphqlHeaders.d.ts +7 -0
  234. package/dist/internal/graphqlHeaders.d.ts.map +1 -1
  235. package/dist/internal/graphqlHeaders.js +11 -0
  236. package/dist/internal/graphqlHeaders.js.map +1 -1
  237. package/dist/internal/jsonParser.d.ts +5 -0
  238. package/dist/internal/jsonParser.d.ts.map +1 -0
  239. package/dist/internal/jsonParser.js +280 -0
  240. package/dist/internal/jsonParser.js.map +1 -0
  241. package/dist/internal/persistence.js +8 -1
  242. package/dist/internal/persistence.js.map +1 -1
  243. package/dist/internal/request.js +29 -42
  244. package/dist/internal/request.js.map +1 -1
  245. package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
  246. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  247. package/dist/internal/sql.js +16 -0
  248. package/dist/internal/sql.js.map +1 -1
  249. package/dist/internal/version.js +1 -1
  250. package/dist/jose/JoseError.d.ts +285 -0
  251. package/dist/jose/JoseError.d.ts.map +1 -0
  252. package/dist/jose/JoseError.js +269 -0
  253. package/dist/jose/JoseError.js.map +1 -0
  254. package/dist/jose/Jwe.d.ts +128 -0
  255. package/dist/jose/Jwe.d.ts.map +1 -0
  256. package/dist/jose/Jwe.js +134 -0
  257. package/dist/jose/Jwe.js.map +1 -0
  258. package/dist/jose/Jwk.d.ts +597 -0
  259. package/dist/jose/Jwk.d.ts.map +1 -0
  260. package/dist/jose/Jwk.js +503 -0
  261. package/dist/jose/Jwk.js.map +1 -0
  262. package/dist/jose/Jwks.d.ts +236 -0
  263. package/dist/jose/Jwks.d.ts.map +1 -0
  264. package/dist/jose/Jwks.js +306 -0
  265. package/dist/jose/Jwks.js.map +1 -0
  266. package/dist/jose/Jws.d.ts +177 -0
  267. package/dist/jose/Jws.d.ts.map +1 -0
  268. package/dist/jose/Jws.js +183 -0
  269. package/dist/jose/Jws.js.map +1 -0
  270. package/dist/jose/Jwt.d.ts +270 -0
  271. package/dist/jose/Jwt.d.ts.map +1 -0
  272. package/dist/jose/Jwt.js +293 -0
  273. package/dist/jose/Jwt.js.map +1 -0
  274. package/dist/jose/index.d.ts +51 -0
  275. package/dist/jose/index.d.ts.map +1 -0
  276. package/dist/jose/index.js +52 -0
  277. package/dist/jose/index.js.map +1 -0
  278. package/dist/jose/internal/compact.d.ts +2 -0
  279. package/dist/jose/internal/compact.d.ts.map +1 -0
  280. package/dist/jose/internal/compact.js +179 -0
  281. package/dist/jose/internal/compact.js.map +1 -0
  282. package/dist/net/Host.d.ts.map +1 -1
  283. package/dist/net/Host.js +5 -10
  284. package/dist/net/Host.js.map +1 -1
  285. package/dist/observability/OtlpExporter.d.ts +4 -0
  286. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  287. package/dist/observability/OtlpExporter.js +40 -12
  288. package/dist/observability/OtlpExporter.js.map +1 -1
  289. package/dist/observability/OtlpSerialization.d.ts +1 -1
  290. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  291. package/dist/observability/OtlpSerialization.js +10 -4
  292. package/dist/observability/OtlpSerialization.js.map +1 -1
  293. package/dist/observability/internal/otlpProtobuf.js +3 -3
  294. package/dist/observability/internal/otlpProtobuf.js.map +1 -1
  295. package/dist/observability/internal/protobuf.js +6 -0
  296. package/dist/observability/internal/protobuf.js.map +1 -1
  297. package/dist/persistence/CircuitBreaker.d.ts +98 -38
  298. package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
  299. package/dist/persistence/CircuitBreaker.js +67 -29
  300. package/dist/persistence/CircuitBreaker.js.map +1 -1
  301. package/dist/persistence/RateLimiter.d.ts +15 -0
  302. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  303. package/dist/persistence/RateLimiter.js +76 -16
  304. package/dist/persistence/RateLimiter.js.map +1 -1
  305. package/dist/persistence/index.d.ts +1 -1
  306. package/dist/persistence/index.js +1 -1
  307. package/dist/reactivity/AtomRegistry.js +17 -7
  308. package/dist/reactivity/AtomRegistry.js.map +1 -1
  309. package/dist/rpc/Rpc.d.ts +1 -1
  310. package/dist/rpc/Rpc.d.ts.map +1 -1
  311. package/dist/rpc/Rpc.js.map +1 -1
  312. package/dist/rpc/RpcClient.d.ts +14 -2
  313. package/dist/rpc/RpcClient.d.ts.map +1 -1
  314. package/dist/rpc/RpcClient.js +38 -21
  315. package/dist/rpc/RpcClient.js.map +1 -1
  316. package/dist/rpc/RpcMessage.d.ts +3 -2
  317. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  318. package/dist/rpc/RpcMessage.js.map +1 -1
  319. package/dist/rpc/RpcServer.d.ts.map +1 -1
  320. package/dist/rpc/RpcServer.js +10 -1
  321. package/dist/rpc/RpcServer.js.map +1 -1
  322. package/dist/sql/Migrator.d.ts +9 -1
  323. package/dist/sql/Migrator.d.ts.map +1 -1
  324. package/dist/sql/Migrator.js +18 -6
  325. package/dist/sql/Migrator.js.map +1 -1
  326. package/dist/sql/SqlClient.d.ts +46 -3
  327. package/dist/sql/SqlClient.d.ts.map +1 -1
  328. package/dist/sql/SqlClient.js +40 -15
  329. package/dist/sql/SqlClient.js.map +1 -1
  330. package/dist/sql/Statement.d.ts +46 -3
  331. package/dist/sql/Statement.d.ts.map +1 -1
  332. package/dist/sql/Statement.js +32 -26
  333. package/dist/sql/Statement.js.map +1 -1
  334. package/dist/workflow/Workflow.d.ts +4 -0
  335. package/dist/workflow/Workflow.d.ts.map +1 -1
  336. package/dist/workflow/Workflow.js.map +1 -1
  337. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  338. package/dist/workflow/WorkflowEngine.js +5 -0
  339. package/dist/workflow/WorkflowEngine.js.map +1 -1
  340. package/package.json +7 -3
  341. package/src/BigDecimal.ts +170 -16
  342. package/src/ByteSize.ts +29 -14
  343. package/src/Equal.ts +3 -3
  344. package/src/Hash.ts +5 -4
  345. package/src/Iterable.ts +28 -19
  346. package/src/JsonSchema.ts +45 -7
  347. package/src/MutableRef.ts +1 -8
  348. package/src/Path.ts +6 -1
  349. package/src/Pool.ts +2 -1
  350. package/src/Ref.ts +0 -8
  351. package/src/Schedule.ts +8 -6
  352. package/src/Schema.ts +3 -2
  353. package/src/SchemaRepresentation.ts +4 -2
  354. package/src/SchemaTransformation.ts +2 -2
  355. package/src/Stream.ts +6 -5
  356. package/src/ai/McpClient.ts +488 -91
  357. package/src/ai/McpSchema.ts +119 -0
  358. package/src/ai/McpServer.ts +302 -56
  359. package/src/ai/Prompt.ts +16 -11
  360. package/src/ai/Tool.ts +5 -10
  361. package/src/ai/internal/mcpCore.ts +165 -12
  362. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +3 -1
  363. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +3 -1
  364. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -1
  365. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -1
  366. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +42 -9
  367. package/src/ai/internal/mcpProtocol.ts +15 -0
  368. package/src/ai/internal/mcpRuntime.ts +6 -3
  369. package/src/ai/internal/mcpSkills.ts +480 -0
  370. package/src/ai/internal/structured-output.ts +10 -4
  371. package/src/cluster/ClusterWorkflowEngine.ts +48 -33
  372. package/src/cluster/Entity.ts +52 -0
  373. package/src/cluster/MessageStorage.ts +3 -6
  374. package/src/cluster/Reply.ts +1 -1
  375. package/src/cluster/Runners.ts +16 -2
  376. package/src/cluster/Sharding.ts +17 -1
  377. package/src/cluster/internal/clusterAbandon.ts +7 -7
  378. package/src/cluster/internal/entityManager.ts +89 -15
  379. package/src/cluster/internal/transactionNotifications.ts +7 -0
  380. package/src/crypto/Aead.ts +3 -3
  381. package/src/crypto/Cipher.ts +3 -3
  382. package/src/crypto/KeyAgreement.ts +4 -4
  383. package/src/crypto/KeyFormat.ts +30 -1
  384. package/src/crypto/KeyWrap.ts +6 -6
  385. package/src/crypto/Mac.ts +3 -3
  386. package/src/crypto/Signature.ts +4 -4
  387. package/src/crypto/WebCrypto.ts +20 -0
  388. package/src/crypto/internal/asymmetric.ts +2 -1
  389. package/src/crypto/internal/key.ts +12 -5
  390. package/src/encoding/Base64Url.ts +27 -3
  391. package/src/encoding/Json5.ts +59 -0
  392. package/src/encoding/Jsonc.ts +126 -0
  393. package/src/encoding/Ndjson.ts +6 -5
  394. package/src/encoding/SchemaBinary.ts +228 -7
  395. package/src/encoding/Sse.ts +5 -3
  396. package/src/encoding/index.ts +12 -0
  397. package/src/eventlog/EventLog.ts +7 -0
  398. package/src/eventlog/EventLogServer.ts +67 -24
  399. package/src/eventlog/EventLogServerEncrypted.ts +5 -0
  400. package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
  401. package/src/eventlog/EventLogSessionAuth.ts +26 -0
  402. package/src/graphql/GraphQLClient.ts +3 -1
  403. package/src/graphql/GraphQLClientError.ts +15 -22
  404. package/src/graphql/GraphQLProtocol.ts +12 -3
  405. package/src/http/HttpClient.ts +244 -33
  406. package/src/http/HttpServerRequest.ts +61 -23
  407. package/src/http/internal/mimeTypes.ts +4 -1
  408. package/src/http-api/HttpApiSchema.ts +1 -1
  409. package/src/internal/dateTime.ts +80 -27
  410. package/src/internal/effect.ts +6 -0
  411. package/src/internal/glob.ts +279 -63
  412. package/src/internal/graphql.ts +27 -9
  413. package/src/internal/graphqlHeaders.ts +13 -0
  414. package/src/internal/jsonParser.ts +307 -0
  415. package/src/internal/persistence.ts +9 -1
  416. package/src/internal/request.ts +51 -58
  417. package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
  418. package/src/internal/sql.ts +25 -0
  419. package/src/internal/version.ts +1 -1
  420. package/src/jose/JoseError.ts +329 -0
  421. package/src/jose/Jwe.ts +196 -0
  422. package/src/jose/Jwk.ts +777 -0
  423. package/src/jose/Jwks.ts +418 -0
  424. package/src/jose/Jws.ts +312 -0
  425. package/src/jose/Jwt.ts +493 -0
  426. package/src/jose/index.ts +58 -0
  427. package/src/jose/internal/compact.ts +195 -0
  428. package/src/net/Host.ts +5 -10
  429. package/src/observability/OtlpExporter.ts +42 -18
  430. package/src/observability/OtlpSerialization.ts +13 -5
  431. package/src/observability/internal/otlpProtobuf.ts +6 -6
  432. package/src/observability/internal/protobuf.ts +10 -0
  433. package/src/persistence/CircuitBreaker.ts +113 -48
  434. package/src/persistence/RateLimiter.ts +97 -19
  435. package/src/persistence/index.ts +1 -1
  436. package/src/reactivity/AtomRegistry.ts +19 -8
  437. package/src/rpc/Rpc.ts +3 -1
  438. package/src/rpc/RpcClient.ts +44 -24
  439. package/src/rpc/RpcMessage.ts +3 -2
  440. package/src/rpc/RpcServer.ts +12 -1
  441. package/src/sql/Migrator.ts +35 -18
  442. package/src/sql/SqlClient.ts +91 -22
  443. package/src/sql/Statement.ts +60 -35
  444. package/src/workflow/Workflow.ts +4 -0
  445. package/src/workflow/WorkflowEngine.ts +5 -0
@@ -0,0 +1,418 @@
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.ts"
17
+ import * as Clock from "../Clock.ts"
18
+ import * as Context from "../Context.ts"
19
+ import * as Deferred from "../Deferred.ts"
20
+ import type * as Duration from "../Duration.ts"
21
+ import * as Effect from "../Effect.ts"
22
+ import * as Exit from "../Exit.ts"
23
+ import * as HttpClient from "../http/HttpClient.ts"
24
+ import * as Layer from "../Layer.ts"
25
+ import * as Schema from "../Schema.ts"
26
+ import type * as Scope from "../Scope.ts"
27
+ import * as Stream from "../Stream.ts"
28
+ import { fail, invalidArgument, millis, noPrivateMembers, parseJsonObject } from "./internal/compact.ts"
29
+ import * as JoseError from "./JoseError.ts"
30
+ import { type AsymmetricAlgorithm, importPublic, PublicJwk, type PublicKey } from "./Jwk.ts"
31
+ import type * as Jws from "./Jws.ts"
32
+
33
+ // Any other key family or curve, with any other members. Private and
34
+ // symmetric members, including RSA factors, are still rejected.
35
+ const UnsupportedJwk = Schema.StructWithRest(
36
+ Schema.Struct({
37
+ kty: Schema.String,
38
+ crv: Schema.optionalKey(Schema.String),
39
+ ...noPrivateMembers
40
+ }),
41
+ [Schema.Record(Schema.String, Schema.Unknown)]
42
+ ).check(Schema.makeFilter((jwk) =>
43
+ jwk.kty !== "oct" && jwk.kty !== "RSA" &&
44
+ (jwk.kty !== "EC" ||
45
+ (jwk.crv !== undefined && jwk.crv !== "P-256" && jwk.crv !== "P-384" && jwk.crv !== "P-521")) &&
46
+ (jwk.kty !== "OKP" || (jwk.crv !== undefined && jwk.crv !== "Ed25519"))
47
+ ))
48
+
49
+ /**
50
+ * Schema for a set of public JWKs.
51
+ *
52
+ * **Details**
53
+ *
54
+ * Keys of other families or curves are kept but never selected. Private or
55
+ * symmetric members anywhere in the set fail decoding.
56
+ *
57
+ * @stability unstable
58
+ * @category schemas
59
+ * @since 4.1.1
60
+ */
61
+ export const KeySet = Schema.Struct({
62
+ keys: Schema.Array(Schema.Union([PublicJwk, UnsupportedJwk]))
63
+ })
64
+
65
+ /**
66
+ * A set of public JWKs.
67
+ *
68
+ * @stability unstable
69
+ * @category models
70
+ * @since 4.1.1
71
+ */
72
+ export type KeySet = typeof KeySet.Type
73
+
74
+ /**
75
+ * The algorithm, and optionally the key id, of the key to resolve.
76
+ *
77
+ * @stability unstable
78
+ * @category models
79
+ * @since 4.1.1
80
+ */
81
+ export interface Selection {
82
+ readonly algorithm: AsymmetricAlgorithm
83
+ readonly kid?: string | undefined
84
+ /**
85
+ * The unauthenticated header when resolving a token's key. Use it only for
86
+ * key selection; it is authenticated only after verification succeeds.
87
+ */
88
+ readonly protectedHeader?: Jws.ProtectedHeader | undefined
89
+ }
90
+
91
+ /**
92
+ * Service that resolves the verification key for a selection.
93
+ *
94
+ * @stability unstable
95
+ * @category services
96
+ * @since 4.1.1
97
+ */
98
+ export class Jwks extends Context.Service<Jwks, {
99
+ readonly resolve: (selection: Selection) => Effect.Effect<PublicKey, JoseError.JoseError>
100
+ }>()("effect/jose/Jwks") {}
101
+
102
+ const isPublicJwk = Schema.is(PublicJwk)
103
+
104
+ const keyTypes: Record<AsymmetricAlgorithm, { readonly kty: string; readonly crv?: string }> = {
105
+ RS256: { kty: "RSA" },
106
+ RS384: { kty: "RSA" },
107
+ RS512: { kty: "RSA" },
108
+ PS256: { kty: "RSA" },
109
+ PS384: { kty: "RSA" },
110
+ PS512: { kty: "RSA" },
111
+ ES256: { kty: "EC", crv: "P-256" },
112
+ ES384: { kty: "EC", crv: "P-384" },
113
+ ES512: { kty: "EC", crv: "P-521" },
114
+ EdDSA: { kty: "OKP", crv: "Ed25519" }
115
+ }
116
+
117
+ // The keys that can ever be selected, computed once per key set rather than
118
+ // on every lookup.
119
+ const supportedKeys = (keySet: KeySet): ReadonlyArray<PublicJwk> => keySet.keys.filter(isPublicJwk)
120
+
121
+ const candidates = (keys: ReadonlyArray<PublicJwk>, selection: Selection): ReadonlyArray<PublicJwk> => {
122
+ const { crv, kty } = keyTypes[selection.algorithm]
123
+ return keys.filter((key) =>
124
+ key.kty === kty &&
125
+ ("crv" in key ? key.crv : undefined) === crv &&
126
+ (selection.kid === undefined || key.kid === selection.kid) &&
127
+ (key.alg === undefined || key.alg === selection.algorithm) &&
128
+ (key.use === undefined || key.use === "sig") &&
129
+ (key.key_ops === undefined || key.key_ops.includes("verify"))
130
+ )
131
+ }
132
+
133
+ // Imports each JWK once per algorithm. Keyed weakly so replaced key sets can be collected.
134
+ const makeImporter = () => {
135
+ const imported = new WeakMap<PublicJwk, Map<AsymmetricAlgorithm, PublicKey>>()
136
+ return (
137
+ found: ReadonlyArray<PublicJwk>,
138
+ algorithm: AsymmetricAlgorithm
139
+ ): Effect.Effect<PublicKey, JoseError.JoseError> => {
140
+ if (found.length === 0) return fail(new JoseError.KeyNotFound())
141
+ if (found.length > 1) return fail(new JoseError.AmbiguousKey())
142
+ const jwk = found[0]
143
+ const cached = imported.get(jwk)?.get(algorithm)
144
+ if (cached !== undefined) return Effect.succeed(cached)
145
+ return Effect.tap(importPublic(jwk, algorithm), (key) =>
146
+ Effect.sync(() => {
147
+ let byAlgorithm = imported.get(jwk)
148
+ if (byAlgorithm === undefined) imported.set(jwk, byAlgorithm = new Map())
149
+ byAlgorithm.set(algorithm, key)
150
+ }))
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Builds a `Jwks` service for a fixed key set.
156
+ *
157
+ * **Example** (Resolving a key by `kid`)
158
+ *
159
+ * ```ts import.meta.vitest
160
+ * import { Effect, Layer } from "effect"
161
+ * import { SecureRandom, Signature } from "effect/crypto"
162
+ * import { Jwk, Jwks } from "effect/jose"
163
+ *
164
+ * const layer = Signature.layerWebCrypto.pipe(Layer.provide(SecureRandom.layerWebCrypto))
165
+ *
166
+ * const kid = await Effect.runPromise(Effect.gen(function*() {
167
+ * const pair = yield* Jwk.generateKeyPair({ algorithm: "ES256", kid: "signing-1" })
168
+ * const jwks = yield* Jwks.makeLocal({ keys: [pair.publicKey] })
169
+ * const key = yield* jwks.resolve({ algorithm: "ES256", kid: "signing-1" })
170
+ * return key.kid
171
+ * }).pipe(Effect.provide(layer)))
172
+ * kid // => "signing-1"
173
+ * ```
174
+ *
175
+ * @stability unstable
176
+ * @category constructors
177
+ * @since 4.1.1
178
+ */
179
+ export const makeLocal = (keySet: KeySet): Effect.Effect<Jwks["Service"]> =>
180
+ Effect.sync(() => {
181
+ const keys = supportedKeys(keySet)
182
+ const importKey = makeImporter()
183
+ return Jwks.of({
184
+ resolve: (selection) => importKey(candidates(keys, selection), selection.algorithm)
185
+ })
186
+ })
187
+
188
+ /**
189
+ * Layer that provides `Jwks` for a fixed key set.
190
+ *
191
+ * @stability unstable
192
+ * @category layers
193
+ * @since 4.1.1
194
+ */
195
+ export const layerLocal = (keySet: KeySet): Layer.Layer<Jwks> => Layer.effect(Jwks, makeLocal(keySet))
196
+
197
+ /**
198
+ * Options for {@link makeRemote} and {@link layerRemote}.
199
+ *
200
+ * @stability unstable
201
+ * @category models
202
+ * @since 4.1.1
203
+ */
204
+ export interface RemoteOptions {
205
+ /**
206
+ * The HTTPS key-set URL, without credentials or a fragment. Take it from
207
+ * configuration, never from a token.
208
+ */
209
+ readonly url: string
210
+ /**
211
+ * How long a fetched key set is used. Defaults to 10 minutes.
212
+ */
213
+ readonly timeToLive?: Duration.Input | undefined
214
+ /**
215
+ * Minimum time before retrying after a failed fetch, or refetching for an
216
+ * unknown key. Defaults to 30 seconds.
217
+ */
218
+ readonly cooldown?: Duration.Input | undefined
219
+ /**
220
+ * Timeout for the request and reading its body. Defaults to 5 seconds.
221
+ */
222
+ readonly timeout?: Duration.Input | undefined
223
+ /**
224
+ * Maximum response body size. Defaults to 131072 bytes.
225
+ */
226
+ readonly maxResponseBytes?: number | undefined
227
+ /**
228
+ * Maximum number of keys in the set. Defaults to 64.
229
+ */
230
+ readonly maxKeys?: number | undefined
231
+ }
232
+
233
+ interface Snapshot {
234
+ readonly keys: ReadonlyArray<PublicJwk>
235
+ readonly expiresAt: number
236
+ }
237
+
238
+ const unavailable = (description: string, cause?: unknown) =>
239
+ new JoseError.JoseError({ reason: new JoseError.KeySetUnavailable({ description, cause }) })
240
+
241
+ const positiveInteger = (name: string, value: number) =>
242
+ Number.isSafeInteger(value) && value > 0
243
+ ? Effect.succeed(value)
244
+ : invalidArgument(`${name} must be a positive integer`)
245
+
246
+ const positiveMillis = (name: string, input: Duration.Input) =>
247
+ Effect.flatMap(
248
+ millis(name, input),
249
+ (value) => value > 0 ? Effect.succeed(value) : invalidArgument(`${name} must be positive`)
250
+ )
251
+
252
+ const readUrl = (input: string) => {
253
+ let url: URL | undefined
254
+ try {
255
+ url = new URL(input)
256
+ } catch {
257
+ url = undefined
258
+ }
259
+ return url !== undefined && url.protocol === "https:" && url.username === "" && url.password === "" && url.hash === ""
260
+ ? Effect.succeed(url)
261
+ : invalidArgument("url must be an HTTPS URL without credentials or a fragment")
262
+ }
263
+
264
+ /**
265
+ * Builds a `Jwks` service for a remote key set, using the `HttpClient`
266
+ * service. Use it when the URL is only known at runtime, for example from
267
+ * OpenID Connect discovery.
268
+ *
269
+ * **Details**
270
+ *
271
+ * The key set is fetched on first use and reused until `timeToLive` passes.
272
+ * Concurrent callers share one request. A selection that finds no key fetches
273
+ * the set again, at most once per `cooldown`, so rotated keys are picked up
274
+ * without letting unknown `kid`s drive a request per token. A failed fetch
275
+ * fails every caller until `cooldown` passes; there is no fallback to an
276
+ * expired set.
277
+ *
278
+ * Only a 200 response from the configured URL is accepted, so a redirected
279
+ * key set is rejected. The check runs on the response, so it cannot stop a
280
+ * client from sending the redirected request.
281
+ *
282
+ * **Gotchas**
283
+ *
284
+ * Supply a client that does not follow redirects. `FetchHttpClient` follows
285
+ * them by default: provide `FetchHttpClient.RequestInit` with
286
+ * `{ redirect: "manual" }` on its layer so a redirect fails before any further
287
+ * request. Clients wrapped with `HttpClient.followRedirects` also follow them.
288
+ *
289
+ * Closing the scope interrupts any request in flight, and later resolutions
290
+ * fail with `KeySetUnavailable`.
291
+ *
292
+ * @stability unstable
293
+ * @category constructors
294
+ * @since 4.1.1
295
+ */
296
+ export const makeRemote = Effect.fnUntraced(function*(
297
+ options: RemoteOptions
298
+ ): Effect.fn.Return<Jwks["Service"], JoseError.JoseError, HttpClient.HttpClient | Scope.Scope> {
299
+ const url = yield* readUrl(options.url)
300
+ const timeToLive = yield* positiveMillis("timeToLive", options.timeToLive ?? "10 minutes")
301
+ const cooldown = yield* millis("cooldown", options.cooldown ?? "30 seconds")
302
+ const timeout = yield* positiveMillis("timeout", options.timeout ?? "5 seconds")
303
+ const maxResponseBytes = yield* positiveInteger("maxResponseBytes", options.maxResponseBytes ?? 131072)
304
+ const maxKeys = yield* positiveInteger("maxKeys", options.maxKeys ?? 64)
305
+
306
+ const client = HttpClient.withScope(yield* HttpClient.HttpClient)
307
+ const scope = yield* Effect.scope
308
+ const importKey = makeImporter()
309
+
310
+ let cache: Snapshot | undefined
311
+ let pending: Deferred.Deferred<Snapshot, JoseError.JoseError> | undefined
312
+ let lastAttempt = -Infinity
313
+ let lastFailed = false
314
+ let closed = false
315
+
316
+ const closedExit = Exit.fail(unavailable("The key set scope is closed"))
317
+ yield* Effect.addFinalizer(() =>
318
+ Effect.sync(() => {
319
+ closed = true
320
+ if (pending !== undefined) Deferred.doneUnsafe(pending, closedExit)
321
+ })
322
+ )
323
+
324
+ const fetch = Effect.gen(function*() {
325
+ const response = yield* client.get(url.href, { headers: { accept: "application/json" } })
326
+ if (response.status !== 200) {
327
+ return yield* unavailable(`The key set endpoint responded with status ${response.status}`)
328
+ }
329
+ if (response.url !== url.href) {
330
+ return yield* unavailable("The key set response came from another URL")
331
+ }
332
+ const body = new Uint8Array(maxResponseBytes)
333
+ const length = yield* Stream.runFoldEffect(response.stream, () => 0, (length, chunk) => {
334
+ if (chunk.length > body.length - length) {
335
+ return Effect.fail(unavailable(`The key set response exceeds ${maxResponseBytes} bytes`))
336
+ }
337
+ body.set(chunk, length)
338
+ return Effect.succeed(length + chunk.length)
339
+ })
340
+ const keySet = yield* Schema.decodeUnknownEffect(KeySet)(parseJsonObject(body.subarray(0, length))).pipe(
341
+ Effect.mapError((cause) => unavailable("The key set document is invalid", cause))
342
+ )
343
+ if (keySet.keys.length > maxKeys) {
344
+ return yield* unavailable(`The key set has more than ${maxKeys} keys`)
345
+ }
346
+ return { keys: supportedKeys(keySet), expiresAt: (yield* Clock.currentTimeMillis) + timeToLive }
347
+ }).pipe(
348
+ Effect.scoped,
349
+ Effect.catchTag("HttpClientError", (cause) => Effect.fail(unavailable("The key set request failed", cause))),
350
+ Effect.timeoutOrElse({
351
+ duration: timeout,
352
+ orElse: () => Effect.fail(unavailable("The key set request timed out"))
353
+ })
354
+ )
355
+
356
+ // Returns `undefined` while cooling down, which applies only to unknown-key
357
+ // refetches (`stale` lacked the key) and retries after a failure.
358
+ const refresh = (now: number, stale?: Snapshot) =>
359
+ Effect.uninterruptibleMask((restore) =>
360
+ Effect.suspend((): Effect.Effect<Snapshot | undefined, JoseError.JoseError> => {
361
+ if (closed) return closedExit
362
+ if (cache !== undefined && cache !== stale && cache.expiresAt > now) return Effect.succeed(cache)
363
+ if (pending !== undefined) return restore(Deferred.await(pending))
364
+ if ((stale !== undefined || lastFailed) && now - lastAttempt < cooldown) return Effect.succeed(undefined)
365
+ lastAttempt = now
366
+ const result = pending = Deferred.makeUnsafe<Snapshot, JoseError.JoseError>()
367
+ return fetch.pipe(
368
+ Effect.onExit((exit) =>
369
+ Effect.sync(() => {
370
+ pending = undefined
371
+ lastFailed = Exit.isFailure(exit)
372
+ if (Exit.isSuccess(exit)) cache = exit.value
373
+ Deferred.doneUnsafe(
374
+ result,
375
+ Exit.isFailure(exit) && Cause.hasInterruptsOnly(exit.cause) ? closedExit : exit
376
+ )
377
+ })
378
+ ),
379
+ Effect.forkIn(scope, { uninterruptible: false }),
380
+ Effect.andThen(restore(Deferred.await(result)))
381
+ )
382
+ })
383
+ )
384
+
385
+ const resolve = (selection: Selection) =>
386
+ Effect.flatMap(Clock.currentTimeMillis, (now): Effect.Effect<PublicKey, JoseError.JoseError> => {
387
+ if (closed) return closedExit
388
+ const lookup = (snapshot: Snapshot) => importKey(candidates(snapshot.keys, selection), selection.algorithm)
389
+ const current = cache
390
+ if (current !== undefined && current.expiresAt > now) {
391
+ const found = candidates(current.keys, selection)
392
+ if (found.length > 0) return importKey(found, selection.algorithm)
393
+ // An unknown key may have been rotated in. Refetch, unless cooling down.
394
+ return Effect.flatMap(
395
+ refresh(now, current),
396
+ (snapshot) => snapshot === undefined ? fail(new JoseError.KeyNotFound()) : lookup(snapshot)
397
+ )
398
+ }
399
+ return Effect.flatMap(refresh(now), (snapshot) =>
400
+ snapshot === undefined
401
+ ? Effect.fail(unavailable("The key set is cooling down after a failed fetch"))
402
+ : lookup(snapshot))
403
+ })
404
+
405
+ return Jwks.of({ resolve })
406
+ })
407
+
408
+ /**
409
+ * Layer that provides `Jwks` from a remote key set built by {@link makeRemote}.
410
+ * Closing the layer interrupts any request in flight.
411
+ *
412
+ * @stability unstable
413
+ * @category layers
414
+ * @since 4.1.1
415
+ */
416
+ export const layerRemote = (
417
+ options: RemoteOptions
418
+ ): Layer.Layer<Jwks, JoseError.JoseError, HttpClient.HttpClient> => Layer.effect(Jwks, makeRemote(options))