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.
- package/README.md +30 -0
- package/THIRD_PARTY_NOTICES.md +62 -0
- package/dist/BigDecimal.d.ts +139 -7
- package/dist/BigDecimal.d.ts.map +1 -1
- package/dist/BigDecimal.js +83 -14
- package/dist/BigDecimal.js.map +1 -1
- package/dist/Equal.d.ts +2 -2
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +3 -3
- package/dist/Equal.js.map +1 -1
- package/dist/Hash.d.ts +3 -2
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +5 -4
- package/dist/Hash.js.map +1 -1
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +11 -8
- package/dist/Iterable.js.map +1 -1
- package/dist/Path.d.ts.map +1 -1
- package/dist/Path.js +5 -1
- package/dist/Path.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +2 -1
- package/dist/Pool.js.map +1 -1
- package/dist/Schema.d.ts +2 -1
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +2 -1
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +4 -2
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +4 -2
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +2 -2
- package/dist/SchemaTransformation.js +2 -2
- package/dist/ai/McpClient.d.ts +171 -19
- package/dist/ai/McpClient.d.ts.map +1 -1
- package/dist/ai/McpClient.js +277 -66
- package/dist/ai/McpClient.js.map +1 -1
- package/dist/ai/McpSchema.d.ts +108 -0
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpSchema.js +99 -0
- package/dist/ai/McpSchema.js.map +1 -1
- package/dist/ai/McpServer.d.ts +120 -6
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +215 -34
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +20 -11
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -7
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/internal/mcpCore.js +72 -3
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +42 -7
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +12 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +3 -3
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpSkills.d.ts +2 -0
- package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
- package/dist/ai/internal/mcpSkills.js +428 -0
- package/dist/ai/internal/mcpSkills.js.map +1 -0
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +15 -5
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/Reply.d.ts +1 -1
- package/dist/cluster/Reply.d.ts.map +1 -1
- package/dist/cluster/Reply.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +4 -1
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +15 -7
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/crypto/Aead.d.ts +2 -1
- package/dist/crypto/Aead.d.ts.map +1 -1
- package/dist/crypto/Aead.js +2 -2
- package/dist/crypto/Aead.js.map +1 -1
- package/dist/crypto/Cipher.d.ts +2 -1
- package/dist/crypto/Cipher.d.ts.map +1 -1
- package/dist/crypto/Cipher.js +2 -2
- package/dist/crypto/Cipher.js.map +1 -1
- package/dist/crypto/KeyAgreement.d.ts +3 -2
- package/dist/crypto/KeyAgreement.d.ts.map +1 -1
- package/dist/crypto/KeyAgreement.js +2 -2
- package/dist/crypto/KeyAgreement.js.map +1 -1
- package/dist/crypto/KeyFormat.d.ts +33 -1
- package/dist/crypto/KeyFormat.d.ts.map +1 -1
- package/dist/crypto/KeyFormat.js.map +1 -1
- package/dist/crypto/KeyWrap.d.ts +4 -3
- package/dist/crypto/KeyWrap.d.ts.map +1 -1
- package/dist/crypto/KeyWrap.js +2 -2
- package/dist/crypto/KeyWrap.js.map +1 -1
- package/dist/crypto/Mac.d.ts +2 -1
- package/dist/crypto/Mac.d.ts.map +1 -1
- package/dist/crypto/Mac.js +2 -2
- package/dist/crypto/Mac.js.map +1 -1
- package/dist/crypto/Signature.d.ts +3 -2
- package/dist/crypto/Signature.d.ts.map +1 -1
- package/dist/crypto/Signature.js +2 -2
- package/dist/crypto/Signature.js.map +1 -1
- package/dist/crypto/WebCrypto.d.ts +19 -0
- package/dist/crypto/WebCrypto.d.ts.map +1 -1
- package/dist/crypto/WebCrypto.js.map +1 -1
- package/dist/crypto/internal/asymmetric.js.map +1 -1
- package/dist/crypto/internal/key.js +3 -2
- package/dist/crypto/internal/key.js.map +1 -1
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +26 -3
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Ndjson.d.ts +5 -4
- package/dist/encoding/Ndjson.d.ts.map +1 -1
- package/dist/encoding/Ndjson.js +6 -5
- package/dist/encoding/Ndjson.js.map +1 -1
- package/dist/encoding/Sse.d.ts +3 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +5 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +7 -0
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +7 -0
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +7 -1
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +27 -12
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +10 -0
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
- package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
- package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.d.ts +21 -0
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +22 -0
- package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
- package/dist/graphql/GraphQLClient.d.ts +3 -1
- package/dist/graphql/GraphQLClient.d.ts.map +1 -1
- package/dist/graphql/GraphQLClient.js.map +1 -1
- package/dist/graphql/GraphQLClientError.d.ts +14 -9
- package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
- package/dist/graphql/GraphQLClientError.js +14 -21
- package/dist/graphql/GraphQLClientError.js.map +1 -1
- package/dist/graphql/GraphQLProtocol.d.ts +12 -3
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
- package/dist/graphql/GraphQLProtocol.js +4 -1
- package/dist/graphql/GraphQLProtocol.js.map +1 -1
- package/dist/http/HttpClient.d.ts +189 -7
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +75 -2
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +38 -22
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/internal/mimeTypes.d.ts +4 -1
- package/dist/http/internal/mimeTypes.d.ts.map +1 -1
- package/dist/http/internal/mimeTypes.js +4 -1
- package/dist/http/internal/mimeTypes.js.map +1 -1
- package/dist/http-api/HttpApiSchema.js +1 -1
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/internal/dateTime.js +49 -24
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +10 -0
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/glob.js +234 -56
- package/dist/internal/glob.js.map +1 -1
- package/dist/internal/graphql.js +21 -7
- package/dist/internal/graphql.js.map +1 -1
- package/dist/internal/graphqlHeaders.d.ts +7 -0
- package/dist/internal/graphqlHeaders.d.ts.map +1 -1
- package/dist/internal/graphqlHeaders.js +11 -0
- package/dist/internal/graphqlHeaders.js.map +1 -1
- package/dist/internal/request.js +29 -42
- package/dist/internal/request.js.map +1 -1
- package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/jose/JoseError.d.ts +285 -0
- package/dist/jose/JoseError.d.ts.map +1 -0
- package/dist/jose/JoseError.js +269 -0
- package/dist/jose/JoseError.js.map +1 -0
- package/dist/jose/Jwe.d.ts +128 -0
- package/dist/jose/Jwe.d.ts.map +1 -0
- package/dist/jose/Jwe.js +134 -0
- package/dist/jose/Jwe.js.map +1 -0
- package/dist/jose/Jwk.d.ts +597 -0
- package/dist/jose/Jwk.d.ts.map +1 -0
- package/dist/jose/Jwk.js +503 -0
- package/dist/jose/Jwk.js.map +1 -0
- package/dist/jose/Jwks.d.ts +236 -0
- package/dist/jose/Jwks.d.ts.map +1 -0
- package/dist/jose/Jwks.js +306 -0
- package/dist/jose/Jwks.js.map +1 -0
- package/dist/jose/Jws.d.ts +177 -0
- package/dist/jose/Jws.d.ts.map +1 -0
- package/dist/jose/Jws.js +183 -0
- package/dist/jose/Jws.js.map +1 -0
- package/dist/jose/Jwt.d.ts +270 -0
- package/dist/jose/Jwt.d.ts.map +1 -0
- package/dist/jose/Jwt.js +293 -0
- package/dist/jose/Jwt.js.map +1 -0
- package/dist/jose/index.d.ts +51 -0
- package/dist/jose/index.d.ts.map +1 -0
- package/dist/jose/index.js +52 -0
- package/dist/jose/index.js.map +1 -0
- package/dist/jose/internal/compact.d.ts +2 -0
- package/dist/jose/internal/compact.d.ts.map +1 -0
- package/dist/jose/internal/compact.js +179 -0
- package/dist/jose/internal/compact.js.map +1 -0
- package/dist/net/Host.d.ts.map +1 -1
- package/dist/net/Host.js +5 -10
- package/dist/net/Host.js.map +1 -1
- package/dist/observability/OtlpSerialization.d.ts +1 -1
- package/dist/observability/OtlpSerialization.d.ts.map +1 -1
- package/dist/observability/OtlpSerialization.js +10 -4
- package/dist/observability/OtlpSerialization.js.map +1 -1
- package/dist/observability/internal/otlpProtobuf.js +3 -3
- package/dist/observability/internal/otlpProtobuf.js.map +1 -1
- package/dist/observability/internal/protobuf.js +6 -0
- package/dist/observability/internal/protobuf.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +98 -38
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
- package/dist/persistence/CircuitBreaker.js +67 -29
- package/dist/persistence/CircuitBreaker.js.map +1 -1
- package/dist/persistence/RateLimiter.d.ts +8 -0
- package/dist/persistence/RateLimiter.d.ts.map +1 -1
- package/dist/persistence/RateLimiter.js +63 -12
- package/dist/persistence/RateLimiter.js.map +1 -1
- package/dist/persistence/index.d.ts +1 -1
- package/dist/persistence/index.js +1 -1
- package/dist/reactivity/AtomRegistry.js +17 -7
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/rpc/Rpc.d.ts +1 -1
- package/dist/rpc/Rpc.d.ts.map +1 -1
- package/dist/rpc/Rpc.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +14 -2
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +38 -21
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +3 -2
- package/dist/rpc/RpcMessage.d.ts.map +1 -1
- package/dist/rpc/RpcMessage.js.map +1 -1
- package/dist/sql/Migrator.d.ts +9 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +18 -6
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +38 -3
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +4 -3
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +41 -3
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +24 -20
- package/dist/sql/Statement.js.map +1 -1
- package/dist/workflow/Workflow.d.ts +4 -0
- package/dist/workflow/Workflow.d.ts.map +1 -1
- package/dist/workflow/Workflow.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +5 -0
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +5 -1
- package/src/BigDecimal.ts +170 -16
- package/src/Equal.ts +3 -3
- package/src/Hash.ts +5 -4
- package/src/Iterable.ts +8 -5
- package/src/Path.ts +6 -1
- package/src/Pool.ts +2 -1
- package/src/Schema.ts +3 -2
- package/src/SchemaRepresentation.ts +4 -2
- package/src/SchemaTransformation.ts +2 -2
- package/src/ai/McpClient.ts +488 -91
- package/src/ai/McpSchema.ts +119 -0
- package/src/ai/McpServer.ts +261 -38
- package/src/ai/Prompt.ts +16 -11
- package/src/ai/Tool.ts +5 -10
- package/src/ai/internal/mcpCore.ts +165 -12
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +41 -7
- package/src/ai/internal/mcpProtocol.ts +15 -0
- package/src/ai/internal/mcpRuntime.ts +6 -3
- package/src/ai/internal/mcpSkills.ts +480 -0
- package/src/cluster/ClusterWorkflowEngine.ts +22 -8
- package/src/cluster/Reply.ts +1 -1
- package/src/cluster/Sharding.ts +4 -1
- package/src/cluster/internal/entityManager.ts +24 -10
- package/src/crypto/Aead.ts +3 -3
- package/src/crypto/Cipher.ts +3 -3
- package/src/crypto/KeyAgreement.ts +4 -4
- package/src/crypto/KeyFormat.ts +30 -1
- package/src/crypto/KeyWrap.ts +6 -6
- package/src/crypto/Mac.ts +3 -3
- package/src/crypto/Signature.ts +4 -4
- package/src/crypto/WebCrypto.ts +20 -0
- package/src/crypto/internal/asymmetric.ts +2 -1
- package/src/crypto/internal/key.ts +12 -5
- package/src/encoding/Base64Url.ts +27 -3
- package/src/encoding/Ndjson.ts +6 -5
- package/src/encoding/Sse.ts +5 -3
- package/src/eventlog/EventLog.ts +7 -0
- package/src/eventlog/EventLogServer.ts +31 -12
- package/src/eventlog/EventLogServerEncrypted.ts +5 -0
- package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
- package/src/eventlog/EventLogSessionAuth.ts +26 -0
- package/src/graphql/GraphQLClient.ts +3 -1
- package/src/graphql/GraphQLClientError.ts +15 -22
- package/src/graphql/GraphQLProtocol.ts +12 -3
- package/src/http/HttpClient.ts +210 -11
- package/src/http/HttpServerRequest.ts +61 -23
- package/src/http/internal/mimeTypes.ts +4 -1
- package/src/http-api/HttpApiSchema.ts +1 -1
- package/src/internal/dateTime.ts +54 -24
- package/src/internal/effect.ts +6 -0
- package/src/internal/glob.ts +279 -63
- package/src/internal/graphql.ts +27 -9
- package/src/internal/graphqlHeaders.ts +13 -0
- package/src/internal/request.ts +51 -58
- package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
- package/src/internal/version.ts +1 -1
- package/src/jose/JoseError.ts +329 -0
- package/src/jose/Jwe.ts +196 -0
- package/src/jose/Jwk.ts +777 -0
- package/src/jose/Jwks.ts +418 -0
- package/src/jose/Jws.ts +312 -0
- package/src/jose/Jwt.ts +493 -0
- package/src/jose/index.ts +58 -0
- package/src/jose/internal/compact.ts +195 -0
- package/src/net/Host.ts +5 -10
- package/src/observability/OtlpSerialization.ts +13 -5
- package/src/observability/internal/otlpProtobuf.ts +6 -6
- package/src/observability/internal/protobuf.ts +10 -0
- package/src/persistence/CircuitBreaker.ts +113 -48
- package/src/persistence/RateLimiter.ts +84 -15
- package/src/persistence/index.ts +1 -1
- package/src/reactivity/AtomRegistry.ts +19 -8
- package/src/rpc/Rpc.ts +3 -1
- package/src/rpc/RpcClient.ts +44 -24
- package/src/rpc/RpcMessage.ts +3 -2
- package/src/sql/Migrator.ts +35 -18
- package/src/sql/SqlClient.ts +43 -8
- package/src/sql/Statement.ts +52 -22
- package/src/workflow/Workflow.ts +4 -0
- 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
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
34
|
-
|
|
35
|
-
|
|
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(
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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)
|