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.
- package/README.md +30 -0
- package/THIRD_PARTY_NOTICES.md +62 -0
- package/ai-docs/package.json +2 -2
- 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/ByteSize.d.ts.map +1 -1
- package/dist/ByteSize.js +27 -14
- package/dist/ByteSize.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 +38 -32
- package/dist/Iterable.js.map +1 -1
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +27 -6
- package/dist/JsonSchema.js.map +1 -1
- package/dist/MutableRef.d.ts.map +1 -1
- package/dist/MutableRef.js +0 -7
- package/dist/MutableRef.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/Ref.d.ts.map +1 -1
- package/dist/Ref.js +0 -8
- package/dist/Ref.js.map +1 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +8 -3
- package/dist/Schedule.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/Stream.d.ts.map +1 -1
- package/dist/Stream.js +6 -5
- package/dist/Stream.js.map +1 -1
- 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 +258 -49
- 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 +44 -8
- 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/ai/internal/structured-output.js +11 -2
- package/dist/ai/internal/structured-output.js.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +30 -11
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/Entity.d.ts +26 -0
- package/dist/cluster/Entity.d.ts.map +1 -1
- package/dist/cluster/Entity.js.map +1 -1
- package/dist/cluster/MessageStorage.d.ts +6 -6
- package/dist/cluster/MessageStorage.d.ts.map +1 -1
- package/dist/cluster/MessageStorage.js +1 -3
- package/dist/cluster/MessageStorage.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/Runners.d.ts.map +1 -1
- package/dist/cluster/Runners.js +13 -2
- package/dist/cluster/Runners.js.map +1 -1
- package/dist/cluster/Sharding.d.ts +13 -0
- 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/clusterAbandon.d.ts.map +1 -1
- package/dist/cluster/internal/clusterAbandon.js +6 -4
- package/dist/cluster/internal/clusterAbandon.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +63 -11
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/cluster/internal/transactionNotifications.d.ts +5 -0
- package/dist/cluster/internal/transactionNotifications.d.ts.map +1 -0
- package/dist/cluster/internal/transactionNotifications.js +5 -0
- package/dist/cluster/internal/transactionNotifications.js.map +1 -0
- 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/Json5.d.ts +44 -0
- package/dist/encoding/Json5.d.ts.map +1 -0
- package/dist/encoding/Json5.js +56 -0
- package/dist/encoding/Json5.js.map +1 -0
- package/dist/encoding/Jsonc.d.ts +47 -0
- package/dist/encoding/Jsonc.d.ts.map +1 -0
- package/dist/encoding/Jsonc.js +120 -0
- package/dist/encoding/Jsonc.js.map +1 -0
- 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/SchemaBinary.d.ts +94 -0
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +219 -6
- package/dist/encoding/SchemaBinary.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/encoding/index.d.ts +10 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +10 -0
- package/dist/encoding/index.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 +55 -24
- 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 +204 -16
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +93 -13
- 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 +66 -27
- 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/jsonParser.d.ts +5 -0
- package/dist/internal/jsonParser.d.ts.map +1 -0
- package/dist/internal/jsonParser.js +280 -0
- package/dist/internal/jsonParser.js.map +1 -0
- package/dist/internal/persistence.js +8 -1
- package/dist/internal/persistence.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/sql.js +16 -0
- package/dist/internal/sql.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/OtlpExporter.d.ts +4 -0
- package/dist/observability/OtlpExporter.d.ts.map +1 -1
- package/dist/observability/OtlpExporter.js +40 -12
- package/dist/observability/OtlpExporter.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 +15 -0
- package/dist/persistence/RateLimiter.d.ts.map +1 -1
- package/dist/persistence/RateLimiter.js +76 -16
- 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/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +10 -1
- package/dist/rpc/RpcServer.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 +46 -3
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +40 -15
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +46 -3
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +32 -26
- 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 +7 -3
- package/src/BigDecimal.ts +170 -16
- package/src/ByteSize.ts +29 -14
- package/src/Equal.ts +3 -3
- package/src/Hash.ts +5 -4
- package/src/Iterable.ts +28 -19
- package/src/JsonSchema.ts +45 -7
- package/src/MutableRef.ts +1 -8
- package/src/Path.ts +6 -1
- package/src/Pool.ts +2 -1
- package/src/Ref.ts +0 -8
- package/src/Schedule.ts +8 -6
- package/src/Schema.ts +3 -2
- package/src/SchemaRepresentation.ts +4 -2
- package/src/SchemaTransformation.ts +2 -2
- package/src/Stream.ts +6 -5
- package/src/ai/McpClient.ts +488 -91
- package/src/ai/McpSchema.ts +119 -0
- package/src/ai/McpServer.ts +302 -56
- 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 +42 -9
- 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/ai/internal/structured-output.ts +10 -4
- package/src/cluster/ClusterWorkflowEngine.ts +48 -33
- package/src/cluster/Entity.ts +52 -0
- package/src/cluster/MessageStorage.ts +3 -6
- package/src/cluster/Reply.ts +1 -1
- package/src/cluster/Runners.ts +16 -2
- package/src/cluster/Sharding.ts +17 -1
- package/src/cluster/internal/clusterAbandon.ts +7 -7
- package/src/cluster/internal/entityManager.ts +89 -15
- package/src/cluster/internal/transactionNotifications.ts +7 -0
- 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/Json5.ts +59 -0
- package/src/encoding/Jsonc.ts +126 -0
- package/src/encoding/Ndjson.ts +6 -5
- package/src/encoding/SchemaBinary.ts +228 -7
- package/src/encoding/Sse.ts +5 -3
- package/src/encoding/index.ts +12 -0
- package/src/eventlog/EventLog.ts +7 -0
- package/src/eventlog/EventLogServer.ts +67 -24
- 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 +244 -33
- 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 +80 -27
- 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/jsonParser.ts +307 -0
- package/src/internal/persistence.ts +9 -1
- package/src/internal/request.ts +51 -58
- package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
- package/src/internal/sql.ts +25 -0
- 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/OtlpExporter.ts +42 -18
- 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 +97 -19
- 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/rpc/RpcServer.ts +12 -1
- package/src/sql/Migrator.ts +35 -18
- package/src/sql/SqlClient.ts +91 -22
- package/src/sql/Statement.ts +60 -35
- 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 {
|
|
@@ -21,6 +21,7 @@ import type { HttpBody } from "../http/HttpBody.ts"
|
|
|
21
21
|
import * as HttpClient from "../http/HttpClient.ts"
|
|
22
22
|
import * as HttpClientError from "../http/HttpClientError.ts"
|
|
23
23
|
import * as HttpClientRequest from "../http/HttpClientRequest.ts"
|
|
24
|
+
import * as Latch from "../Latch.ts"
|
|
24
25
|
import * as Layer from "../Layer.ts"
|
|
25
26
|
import * as Result from "../Result.ts"
|
|
26
27
|
import * as Schedule from "../Schedule.ts"
|
|
@@ -154,6 +155,10 @@ export const layerFlusher: Layer.Layer<Flusher> = Layer.sync(Flusher, () => {
|
|
|
154
155
|
* after unhandled failures, and flushes during scope finalization up to
|
|
155
156
|
* `shutdownTimeout`.
|
|
156
157
|
*
|
|
158
|
+
* The export interval starts with the first push and stops once an export
|
|
159
|
+
* empties the buffer, so an idle exporter keeps no timer pending. With
|
|
160
|
+
* `exportEmpty` and batching disabled, it exports on every interval instead.
|
|
161
|
+
*
|
|
157
162
|
* Optional gzip compression uses `HttpClientRequest.compressBody` before the
|
|
158
163
|
* retry loop, so retries reuse the compressed bytes. Bodies smaller than 1KB
|
|
159
164
|
* remain uncompressed. Compression requires runtime `CompressionStream` support;
|
|
@@ -186,7 +191,6 @@ export const make: (
|
|
|
186
191
|
const clock = Context.get(services, Clock)
|
|
187
192
|
const scope = Context.get(services, Scope.Scope)
|
|
188
193
|
const exportInterval = Duration.max(Duration.fromInputUnsafe(options.exportInterval), Duration.zero)
|
|
189
|
-
let disabledUntil: number | undefined = undefined
|
|
190
194
|
|
|
191
195
|
const client = Context.get(services, HttpClient.HttpClient).pipe(
|
|
192
196
|
HttpClient.tap((response) => Effect.ignore(response.arrayBuffer)),
|
|
@@ -206,14 +210,18 @@ export const make: (
|
|
|
206
210
|
)
|
|
207
211
|
|
|
208
212
|
const request = HttpClientRequest.post(options.url, { headers })
|
|
213
|
+
const exportsEmpty = options.maxBatchSize === "disabled" && options.exportEmpty === true
|
|
209
214
|
let buffer: Array<any> = []
|
|
215
|
+
let disabledUntil: number | undefined = undefined
|
|
216
|
+
const isDisabled = () => {
|
|
217
|
+
if (disabledUntil === undefined) return false
|
|
218
|
+
if (clock.currentTimeMillisUnsafe() < disabledUntil) return true
|
|
219
|
+
disabledUntil = undefined
|
|
220
|
+
return false
|
|
221
|
+
}
|
|
222
|
+
|
|
210
223
|
const runExport = Effect.suspend(() => {
|
|
211
|
-
if (
|
|
212
|
-
return Effect.void
|
|
213
|
-
} else if (disabledUntil !== undefined) {
|
|
214
|
-
disabledUntil = undefined
|
|
215
|
-
}
|
|
216
|
-
if (buffer.length === 0 && (options.maxBatchSize !== "disabled" || options.exportEmpty !== true)) {
|
|
224
|
+
if (isDisabled() || (buffer.length === 0 && !exportsEmpty)) {
|
|
217
225
|
return Effect.void
|
|
218
226
|
}
|
|
219
227
|
const items = buffer
|
|
@@ -245,9 +253,6 @@ export const make: (
|
|
|
245
253
|
const exportFibers = yield* FiberSet.make<void, never>()
|
|
246
254
|
const runExportFork = yield* FiberSet.runtime(exportFibers)<never>()
|
|
247
255
|
|
|
248
|
-
const flusher = yield* Flusher
|
|
249
|
-
yield* flusher.register(runExport)
|
|
250
|
-
|
|
251
256
|
yield* Scope.addFinalizer(
|
|
252
257
|
scope,
|
|
253
258
|
Effect.suspend(() => {
|
|
@@ -261,19 +266,38 @@ export const make: (
|
|
|
261
266
|
)
|
|
262
267
|
)
|
|
263
268
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
269
|
+
// `armed` is open while there is something to export. It changes in the
|
|
270
|
+
// same synchronous step as the buffer check, so a push is never stranded.
|
|
271
|
+
const armed = yield* Latch.make(exportsEmpty)
|
|
272
|
+
const wake = yield* Latch.make()
|
|
273
|
+
const disarmIfEmpty = Effect.sync(() => {
|
|
274
|
+
if (exportsEmpty || buffer.length > 0 || !armed.closeUnsafe()) return
|
|
275
|
+
wake.openUnsafe()
|
|
276
|
+
})
|
|
277
|
+
// Forked after the shutdown finalizer, so the loop stops before the shutdown flush.
|
|
278
|
+
yield* Effect.gen(function*() {
|
|
279
|
+
while (true) {
|
|
280
|
+
wake.closeUnsafe()
|
|
281
|
+
yield* armed.await
|
|
282
|
+
yield* Effect.race(Effect.sleep(exportInterval), wake.await)
|
|
283
|
+
yield* Fiber.await(yield* FiberSet.run(exportFibers, runExport))
|
|
284
|
+
yield* disarmIfEmpty
|
|
285
|
+
}
|
|
286
|
+
}).pipe(Effect.forkIn(scope))
|
|
287
|
+
const exportNow = Effect.andThen(runExport, disarmIfEmpty)
|
|
288
|
+
|
|
289
|
+
const flusher = yield* Flusher
|
|
290
|
+
yield* flusher.register(exportNow)
|
|
270
291
|
|
|
271
292
|
return {
|
|
272
293
|
push(data) {
|
|
273
|
-
|
|
294
|
+
// With no idle timer, the next push ends the disabled window.
|
|
295
|
+
if (isDisabled()) return
|
|
274
296
|
buffer.push(data)
|
|
275
297
|
if (options.maxBatchSize !== "disabled" && buffer.length >= options.maxBatchSize) {
|
|
276
|
-
runExportFork(
|
|
298
|
+
runExportFork(exportNow)
|
|
299
|
+
} else {
|
|
300
|
+
armed.openUnsafe()
|
|
277
301
|
}
|
|
278
302
|
}
|
|
279
303
|
}
|
|
@@ -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)
|