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,195 @@
1
+ import type * as CryptoError from "../../crypto/CryptoError.ts"
2
+ import * as Duration from "../../Duration.ts"
3
+ import * as Effect from "../../Effect.ts"
4
+ import * as Base64Url from "../../encoding/Base64Url.ts"
5
+ import * as Option from "../../Option.ts"
6
+ import * as Redacted from "../../Redacted.ts"
7
+ import * as Result from "../../Result.ts"
8
+ import * as Schema from "../../Schema.ts"
9
+ import * as JoseError from "../JoseError.ts"
10
+
11
+ /** @internal */
12
+ export const fail = (reason: JoseError.JoseErrorReason): Effect.Effect<never, JoseError.JoseError> =>
13
+ Effect.fail(new JoseError.JoseError({ reason }))
14
+
15
+ /** @internal */
16
+ export const invalidToken = (description: string) => fail(new JoseError.InvalidToken({ description }))
17
+
18
+ /** @internal */
19
+ export const invalidKey = (description: string, cause?: unknown) =>
20
+ fail(new JoseError.InvalidKey({ description, cause }))
21
+
22
+ /** @internal */
23
+ export const invalidArgument = (description: string, cause?: unknown) =>
24
+ fail(new JoseError.InvalidArgument({ description, cause }))
25
+
26
+ /**
27
+ * Maps a failure of an operation on secret material, such as signing or
28
+ * private-key import, to a fixed description. Backend messages and causes may
29
+ * describe the secret, so they are dropped.
30
+ *
31
+ * @internal
32
+ */
33
+ export const cryptoFailure = (description: string) => (_: CryptoError.CryptoError): JoseError.JoseError =>
34
+ new JoseError.JoseError({ reason: new JoseError.InvalidKey({ description }) })
35
+
36
+ /**
37
+ * Maps a public-key import failure, keeping the backend diagnostic.
38
+ *
39
+ * @internal
40
+ */
41
+ export const publicKeyFailure = (error: CryptoError.CryptoError): JoseError.JoseError =>
42
+ new JoseError.JoseError({ reason: new JoseError.InvalidKey({ description: error.message, cause: error }) })
43
+
44
+ /**
45
+ * Schema fields that keep private and symmetric key members out of a public
46
+ * JWK.
47
+ *
48
+ * @internal
49
+ */
50
+ export const noPrivateMembers = {
51
+ d: Schema.optionalKey(Schema.Never),
52
+ p: Schema.optionalKey(Schema.Never),
53
+ q: Schema.optionalKey(Schema.Never),
54
+ dp: Schema.optionalKey(Schema.Never),
55
+ dq: Schema.optionalKey(Schema.Never),
56
+ qi: Schema.optionalKey(Schema.Never),
57
+ oth: Schema.optionalKey(Schema.Never),
58
+ k: Schema.optionalKey(Schema.Never)
59
+ }
60
+
61
+ /** @internal */
62
+ export const hasPrivateMembers = (jwk: object): boolean =>
63
+ Object.keys(noPrivateMembers).some((name) => Object.hasOwn(jwk, name))
64
+
65
+ /** @internal */
66
+ export const utf8 = (text: string): Uint8Array => new TextEncoder().encode(text)
67
+
68
+ /** @internal */
69
+ export const reveal = (token: string | Redacted.Redacted<string>): string =>
70
+ Redacted.isRedacted(token) ? Redacted.value(token) : token
71
+
72
+ /**
73
+ * Checks unpadded base64url, including the unused bits in the final character.
74
+ *
75
+ * @internal
76
+ */
77
+ export const isCanonicalSegment = (segment: string): boolean => {
78
+ if (/[^A-Za-z0-9_-]/.test(segment)) return false
79
+ const remainder = segment.length % 4
80
+ const last = segment.charAt(segment.length - 1)
81
+ return remainder === 0 ||
82
+ (remainder === 2 ? "AQgw".includes(last) : remainder === 3 && "AEIMQUYcgkosw048".includes(last))
83
+ }
84
+
85
+ /**
86
+ * Decodes canonical unpadded base64url.
87
+ *
88
+ * @internal
89
+ */
90
+ export const decodeSegment = (segment: string): Uint8Array | undefined => {
91
+ if (!isCanonicalSegment(segment)) return undefined
92
+ const decoded = Base64Url.decode(segment)
93
+ return Result.isSuccess(decoded) ? decoded.success : undefined
94
+ }
95
+
96
+ /** @internal */
97
+ export const parseJsonObject = (bytes: Uint8Array): Readonly<Record<string, Schema.Json>> | undefined => {
98
+ try {
99
+ const value: unknown = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes))
100
+ return typeof value === "object" && value !== null && !Array.isArray(value)
101
+ ? value as Readonly<Record<string, Schema.Json>>
102
+ : undefined
103
+ } catch {
104
+ return undefined
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Splits a compact serialization into exactly `count` segments.
110
+ *
111
+ * @internal
112
+ */
113
+ export const split = (
114
+ token: string | Redacted.Redacted<string>,
115
+ count: number
116
+ ): Effect.Effect<ReadonlyArray<string>, JoseError.JoseError> => {
117
+ const parts = reveal(token).split(".")
118
+ return parts.length === count
119
+ ? Effect.succeed(parts)
120
+ : invalidToken(`A compact serialization must have ${count} segments`)
121
+ }
122
+
123
+ /**
124
+ * Decodes a protected header. Parameters in `unsupported` change how the
125
+ * token is processed, so they are rejected rather than ignored.
126
+ *
127
+ * @internal
128
+ */
129
+ export const decodeHeader = <A>(
130
+ segment: string,
131
+ decode: (input: unknown) => Option.Option<A>,
132
+ unsupported: ReadonlyArray<string>
133
+ ): Effect.Effect<A, JoseError.JoseError> => {
134
+ const bytes = decodeSegment(segment)
135
+ const json = bytes === undefined ? undefined : parseJsonObject(bytes)
136
+ if (json === undefined) return invalidToken("The protected header is not a base64url JSON object")
137
+ for (const name of unsupported) {
138
+ if (Object.hasOwn(json, name)) return invalidToken(`The ${name} header parameter is not supported`)
139
+ }
140
+ return Option.match(decode(json), {
141
+ onNone: () => invalidToken("The protected header has unsupported or malformed parameters"),
142
+ onSome: Effect.succeed
143
+ })
144
+ }
145
+
146
+ /**
147
+ * Base64url-encodes a protected header. Fixed parameters come first and
148
+ * cannot be overridden by additional parameters.
149
+ *
150
+ * @internal
151
+ */
152
+ export const encodeHeader = (
153
+ fixed: Readonly<Record<string, string>>,
154
+ kid: string | undefined,
155
+ header: { readonly kid?: string | undefined } | undefined,
156
+ unsupported: ReadonlyArray<string>
157
+ ): Effect.Effect<string, JoseError.JoseError> => {
158
+ for (const name of unsupported) {
159
+ if (header !== undefined && Object.hasOwn(header, name)) {
160
+ return invalidArgument(`The ${name} header parameter is not supported`)
161
+ }
162
+ }
163
+ const { kid: headerKid, ...rest } = header ?? {}
164
+ const value = { ...fixed, kid: headerKid ?? kid, ...rest, ...fixed }
165
+ try {
166
+ return Effect.succeed(Base64Url.encode(JSON.stringify(value)))
167
+ } catch {
168
+ return invalidArgument("The protected header is not JSON serializable")
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Reads a finite, non-negative duration in milliseconds.
174
+ *
175
+ * @internal
176
+ */
177
+ export const millis = (name: string, input: Duration.Input): Effect.Effect<number, JoseError.JoseError> => {
178
+ const value = hasInvalidComponent(input) ? Option.none() : Option.map(Duration.fromInput(input), Duration.toMillis)
179
+ return Option.isSome(value) && Number.isFinite(value.value) && value.value >= 0
180
+ ? Effect.succeed(value.value)
181
+ : invalidArgument(`${name} must be a finite, non-negative duration`)
182
+ }
183
+
184
+ // `Duration` reads NaN as zero in every input form, and components that are
185
+ // not finite or overflow on conversion add up to NaN. Either would silently
186
+ // disable a bound.
187
+ const hasInvalidComponent = (input: Duration.Input): boolean => {
188
+ if (typeof input === "number") return Number.isNaN(input)
189
+ if (typeof input !== "object" || Duration.isDuration(input)) return false
190
+ if (Array.isArray(input)) return input.some((component) => !Number.isFinite(component))
191
+ return Object.entries(input).some(([unit, component]) =>
192
+ typeof component === "number" &&
193
+ (!Number.isFinite(component) || !Number.isFinite(Duration.toMillis({ [unit]: component })))
194
+ )
195
+ }
package/src/net/Host.ts CHANGED
@@ -111,7 +111,8 @@ export type HostPortInput = HostPort | string | HostPortParts
111
111
  const hostError = (input: unknown, message: string): Result.Result<never, NetAddress.NetAddressError> =>
112
112
  Result.fail(new NetAddress.NetAddressError({ input, message }))
113
113
 
114
- const asciiNameCharacter = /^[a-z0-9_.-]$/i
114
+ const asciiName = /^[a-z0-9_.-]*$/i
115
+ const nonAscii = /[\u0080-\uffff]/g
115
116
  const labelPattern = /^[a-z0-9_](?:[a-z0-9_-]{0,61}[a-z0-9_])?$/
116
117
  const numericLabel = /^(?:\d+|0x[0-9a-f]*)$/
117
118
 
@@ -135,15 +136,9 @@ const validateDomainName = (name: string): string | undefined => {
135
136
  }
136
137
 
137
138
  const toAsciiDomainName = (input: string): string | undefined => {
138
- let ascii = true
139
- for (const character of input) {
140
- if (character.charCodeAt(0) < 0x80) {
141
- if (!asciiNameCharacter.test(character)) return undefined
142
- } else {
143
- ascii = false
144
- }
145
- }
146
- if (ascii) return input.toLowerCase()
139
+ if (asciiName.test(input)) return input.toLowerCase()
140
+ // Check the composed form, so that `=\u0338` is read as `≠`
141
+ if (!asciiName.test(input.normalize("NFC").replace(nonAscii, ""))) return undefined
147
142
  try {
148
143
  return new URL(`http://${input}`).hostname
149
144
  } catch {
@@ -9,6 +9,7 @@
9
9
  * @since 4.0.0
10
10
  */
11
11
  import * as Context from "../Context.ts"
12
+ import * as Base64 from "../encoding/Base64.ts"
12
13
  import * as HttpBody from "../http/HttpBody.ts"
13
14
  import * as Layer from "../Layer.ts"
14
15
  import * as otlpProtobuf from "./internal/otlpProtobuf.ts"
@@ -30,13 +31,20 @@ export class OtlpSerialization extends Context.Service<OtlpSerialization, {
30
31
  readonly logs: (data: LogsData) => HttpBody.HttpBody
31
32
  }>()("effect/observability/OtlpSerialization") {}
32
33
 
33
- // OTLP/JSON writes NaN and Infinity as strings, but JSON.stringify writes null
34
- const nonFiniteToString = (_key: string, value: unknown) =>
35
- typeof value === "number" && !Number.isFinite(value) ? String(value) : value
34
+ // OTLP/JSON writes non-finite numbers as strings and bytes as base64.
35
+ // The holder is read because Buffer#toJSON runs before the replacer.
36
+ function jsonReplacer(this: Record<string, unknown>, key: string, value: unknown) {
37
+ if (typeof value === "number" && !Number.isFinite(value)) return String(value)
38
+ if (key === "bytesValue" && this[key] instanceof Uint8Array) return Base64.encode(this[key])
39
+ return value
40
+ }
36
41
 
37
42
  const jsonBody = (data: unknown): HttpBody.HttpBody => {
38
43
  const json = JSON.stringify(data)
39
- return HttpBody.text(json.includes("null") ? JSON.stringify(data, nonFiniteToString) : json, "application/json")
44
+ return HttpBody.text(
45
+ json.includes("null") || json.includes("\"bytesValue\":") ? JSON.stringify(data, jsonReplacer) : json,
46
+ "application/json"
47
+ )
40
48
  }
41
49
 
42
50
  /**
@@ -45,7 +53,7 @@ const jsonBody = (data: unknown): HttpBody.HttpBody => {
45
53
  * **Details**
46
54
  *
47
55
  * `NaN`, `Infinity` and `-Infinity` are written as the strings OTLP/JSON
48
- * expects, not as `null`.
56
+ * expects, not as `null`. `bytesValue` data is written as a base64 string.
49
57
  *
50
58
  * @stability unstable
51
59
  * @category layers
@@ -368,14 +368,14 @@ export const encodeTracesData = (tracesData: TraceData): Uint8Array =>
368
368
  */
369
369
  export const encodeNumberDataPoint = (point: {
370
370
  readonly attributes: ReadonlyArray<KeyValue>
371
- readonly startTimeUnixNano: string
371
+ readonly startTimeUnixNano?: string | undefined
372
372
  readonly timeUnixNano: string
373
373
  readonly asDouble?: number | undefined
374
374
  readonly asInt?: string | number | bigint | undefined
375
375
  readonly flags?: number | undefined
376
376
  }): Uint8Array =>
377
377
  Proto.concat(
378
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
378
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
379
379
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
380
380
  point.asDouble !== undefined
381
381
  ? Proto.doubleField(4, point.asDouble)
@@ -407,7 +407,7 @@ export const encodeNumberDataPoint = (point: {
407
407
  */
408
408
  export const encodeHistogramDataPoint = (point: {
409
409
  readonly attributes: ReadonlyArray<KeyValue>
410
- readonly startTimeUnixNano: string
410
+ readonly startTimeUnixNano?: string | undefined
411
411
  readonly timeUnixNano: string
412
412
  readonly count: string | number | bigint
413
413
  readonly sum?: number | undefined
@@ -426,7 +426,7 @@ export const encodeHistogramDataPoint = (point: {
426
426
  ...point.explicitBounds.map((bound) => Proto.doubleField(7, bound))
427
427
  )
428
428
  return Proto.concat(
429
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
429
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
430
430
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
431
431
  Proto.fixed64Field(4, BigInt(point.count)),
432
432
  point.sum !== undefined ? Proto.doubleField(5, point.sum) : new Uint8Array(0),
@@ -515,7 +515,7 @@ export const encodeHistogram = (histogram: {
515
515
  */
516
516
  export const encodeSummaryDataPoint = (point: {
517
517
  readonly attributes: ReadonlyArray<KeyValue>
518
- readonly startTimeUnixNano: string
518
+ readonly startTimeUnixNano?: string | undefined
519
519
  readonly timeUnixNano: string
520
520
  readonly count: string | number | bigint
521
521
  readonly sum: number
@@ -523,7 +523,7 @@ export const encodeSummaryDataPoint = (point: {
523
523
  readonly flags?: number | undefined
524
524
  }): Uint8Array =>
525
525
  Proto.concat(
526
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
526
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
527
527
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
528
528
  Proto.fixed64Field(4, BigInt(point.count)),
529
529
  Proto.doubleField(5, point.sum),
@@ -213,3 +213,13 @@ export const optionalStringField = (
213
213
  fieldNumber: number,
214
214
  value: string | undefined
215
215
  ): Uint8Array => value !== undefined && value !== "" ? stringField(fieldNumber, value) : new Uint8Array(0)
216
+
217
+ /**
218
+ * Encodes a fixed64 field if the value is defined
219
+ *
220
+ * @internal
221
+ */
222
+ export const optionalFixed64Field = (
223
+ fieldNumber: number,
224
+ value: string | undefined
225
+ ): Uint8Array => value !== undefined ? fixed64Field(fieldNumber, BigInt(value)) : new Uint8Array(0)