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
package/src/sql/SqlClient.ts
CHANGED
|
@@ -10,12 +10,11 @@
|
|
|
10
10
|
* @since 4.0.0
|
|
11
11
|
*/
|
|
12
12
|
import * as Cause from "../Cause.ts"
|
|
13
|
-
import { Clock } from "../Clock.ts"
|
|
14
13
|
import * as Context from "../Context.ts"
|
|
15
14
|
import * as Effect from "../Effect.ts"
|
|
16
15
|
import * as Exit from "../Exit.ts"
|
|
17
16
|
import { identity } from "../Function.ts"
|
|
18
|
-
import { CurrentTransactionService } from "../internal/sql.ts"
|
|
17
|
+
import { CurrentTransactionService, recordConnectionWait, waitClock } from "../internal/sql.ts"
|
|
19
18
|
import * as Option from "../Option.ts"
|
|
20
19
|
import { hasProperty } from "../Predicate.ts"
|
|
21
20
|
import type * as Queue from "../Queue.ts"
|
|
@@ -81,6 +80,10 @@ export interface SqlClient extends Constructor {
|
|
|
81
80
|
* client's, such as one that sets its isolation level, provide
|
|
82
81
|
* `BeginTransaction`.
|
|
83
82
|
*
|
|
83
|
+
* To retry serialization failures or deadlocks, wrap the outermost
|
|
84
|
+
* `withTransaction` in `Effect.retry`. Each attempt starts a fresh
|
|
85
|
+
* transaction and re-runs the whole effect, including `COMMIT`.
|
|
86
|
+
*
|
|
84
87
|
* **Gotchas**
|
|
85
88
|
*
|
|
86
89
|
* Deferred invalidations run individually after the commit and don't join an
|
|
@@ -88,6 +91,35 @@ export interface SqlClient extends Constructor {
|
|
|
88
91
|
* the transaction's context defers, and a fiber that outlives the
|
|
89
92
|
* transaction can't defer through it, as with `afterCommit`. Transactions
|
|
90
93
|
* that don't go through `makeWithTransaction` invalidate immediately.
|
|
94
|
+
*
|
|
95
|
+
* Retrying a nested transaction only retries its savepoint, which can't
|
|
96
|
+
* recover an outer transaction the database has aborted. Since a retried
|
|
97
|
+
* effect runs more than once, keep non-transactional side effects in
|
|
98
|
+
* `afterCommit`, which discards the callbacks of a failed attempt but
|
|
99
|
+
* doesn't guarantee they run exactly once. Don't retry `ConnectionError`: a
|
|
100
|
+
* `COMMIT` that lost its connection may have committed, and retrying would
|
|
101
|
+
* apply its writes twice.
|
|
102
|
+
*
|
|
103
|
+
* **Example** (Retrying serialization failures and deadlocks)
|
|
104
|
+
*
|
|
105
|
+
* ```ts
|
|
106
|
+
* import { Effect, Schedule } from "effect"
|
|
107
|
+
* import { SqlClient } from "effect/sql"
|
|
108
|
+
*
|
|
109
|
+
* const program = Effect.gen(function*() {
|
|
110
|
+
* const sql = yield* SqlClient.SqlClient
|
|
111
|
+
* return yield* sql.withTransaction(
|
|
112
|
+
* sql`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
|
|
113
|
+
* ).pipe(
|
|
114
|
+
* Effect.provideService(SqlClient.BeginTransaction, "BEGIN ISOLATION LEVEL SERIALIZABLE"),
|
|
115
|
+
* Effect.retry({
|
|
116
|
+
* while: (error) => error.reason._tag === "SerializationError" || error.reason._tag === "DeadlockError",
|
|
117
|
+
* times: 5,
|
|
118
|
+
* schedule: Schedule.exponential("10 millis").pipe(Schedule.jittered)
|
|
119
|
+
* })
|
|
120
|
+
* )
|
|
121
|
+
* })
|
|
122
|
+
* ```
|
|
91
123
|
*/
|
|
92
124
|
readonly withTransaction: <R, E, A>(
|
|
93
125
|
self: Effect.Effect<A, E, R>
|
|
@@ -206,9 +238,8 @@ export declare namespace SqlClient {
|
|
|
206
238
|
readonly spanAttributes: ReadonlyArray<readonly [string, unknown]>
|
|
207
239
|
readonly transactionService?: Context.Service<TransactionConnection, TransactionConnection.Service>
|
|
208
240
|
/**
|
|
209
|
-
* Whether the transaction control statements - `BEGIN`, `COMMIT
|
|
210
|
-
* `
|
|
211
|
-
* statement.
|
|
241
|
+
* Whether the transaction control statements - `BEGIN`, `COMMIT` and
|
|
242
|
+
* `SAVEPOINT` - can be prepared like any other statement.
|
|
212
243
|
*
|
|
213
244
|
* **Details**
|
|
214
245
|
*
|
|
@@ -216,6 +247,9 @@ export declare namespace SqlClient {
|
|
|
216
247
|
* prepare them stops parsing them again each time. Off by default,
|
|
217
248
|
* because several databases refuse to prepare transaction control at all;
|
|
218
249
|
* a driver has to say that its own does not.
|
|
250
|
+
*
|
|
251
|
+
* Rollbacks and savepoint releases always run unprepared, so a prepared
|
|
252
|
+
* statement the backend has dropped cannot stop cleanup.
|
|
219
253
|
*/
|
|
220
254
|
readonly prepareTransactionControls?: boolean | undefined
|
|
221
255
|
readonly beginTransaction?: string | undefined
|
|
@@ -248,6 +282,8 @@ export declare namespace SqlClient {
|
|
|
248
282
|
let clientIdCounter = 0
|
|
249
283
|
let transactionSemaphoreIdCounter = 0
|
|
250
284
|
|
|
285
|
+
const ATTR_DB_OPERATION_NAME = "db.operation.name"
|
|
286
|
+
|
|
251
287
|
/**
|
|
252
288
|
* Constructs a `SqlClient` from connection acquirers, a compiler, transaction
|
|
253
289
|
* commands, tracing attributes, optional row transforms, and reactive query
|
|
@@ -274,20 +310,20 @@ export const make = Effect.fnUntraced(function*(options: SqlClient.MakeOptions)
|
|
|
274
310
|
const rollback = options.rollback ?? "ROLLBACK"
|
|
275
311
|
const rollbackSavepoint = options.rollbackSavepoint ?? ((name: string) => `ROLLBACK TO SAVEPOINT ${name}`)
|
|
276
312
|
const transactionAcquirer = options.transactionAcquirer ?? options.acquirer
|
|
313
|
+
const unprepared = (conn: Connection.Connection, sql: string) => conn.executeUnprepared(sql, [], undefined)
|
|
277
314
|
const control = options.prepareTransactionControls === true
|
|
278
315
|
? (conn: Connection.Connection, sql: string) => conn.execute(sql, [], undefined)
|
|
279
|
-
:
|
|
316
|
+
: unprepared
|
|
280
317
|
const isTransaction = options.isTransaction
|
|
281
318
|
const cleanup = isTransaction
|
|
282
|
-
? (conn: Connection.Connection, sql: string) => isTransaction(conn) ?
|
|
283
|
-
:
|
|
319
|
+
? (conn: Connection.Connection, sql: string) => isTransaction(conn) ? unprepared(conn, sql) : Effect.void
|
|
320
|
+
: unprepared
|
|
284
321
|
const withTransaction = makeWithTransaction({
|
|
285
322
|
transactionService,
|
|
286
323
|
spanAttributes: options.spanAttributes,
|
|
287
324
|
acquireConnection: (restore) => restore(transactionAcquirer!),
|
|
288
325
|
// Unlike the client's own, a provided statement isn't fixed, so it isn't prepared.
|
|
289
|
-
begin: (conn, statement) =>
|
|
290
|
-
statement === undefined ? control(conn, beginTransaction) : conn.executeUnprepared(statement, [], undefined),
|
|
326
|
+
begin: (conn, statement) => statement === undefined ? control(conn, beginTransaction) : unprepared(conn, statement),
|
|
291
327
|
savepoint: (conn, id) => control(conn, savepoint(`effect_sql_${id}`)),
|
|
292
328
|
releaseSavepoint: releaseSavepoint
|
|
293
329
|
? (conn, id) => cleanup(conn, releaseSavepoint(`effect_sql_${id}`))
|
|
@@ -517,6 +553,14 @@ const makeAfterCommit =
|
|
|
517
553
|
* caller's context has no `SqlClient`, so their requests don't share a batch
|
|
518
554
|
* with requests outside the transaction.
|
|
519
555
|
*
|
|
556
|
+
* Each callback below except `acquireConnection` is traced like a statement,
|
|
557
|
+
* in its own client span under the `sql.transaction` span, named after the
|
|
558
|
+
* operation and the target derived from `spanAttributes`, such as
|
|
559
|
+
* `COMMIT mydb`. With `Statement.SpanPropagationEnabled`, a top-level
|
|
560
|
+
* transaction also records how long `acquireConnection` took as
|
|
561
|
+
* `db.client.connection.wait_time_ms`, so work a driver does there, such as
|
|
562
|
+
* starting the transaction, counts as waiting for the connection.
|
|
563
|
+
*
|
|
520
564
|
* @stability unstable
|
|
521
565
|
* @category transactions
|
|
522
566
|
* @since 4.0.0
|
|
@@ -557,6 +601,7 @@ export const makeWithTransaction = <I, S>(options: {
|
|
|
557
601
|
`effect/sql/SqlClient/TransactionSemaphore/${transactionSemaphoreIdCounter++}`
|
|
558
602
|
)
|
|
559
603
|
const afterCommit = makeAfterCommit(options.transactionService)
|
|
604
|
+
const target = Statement.spanTarget(options.spanAttributes)
|
|
560
605
|
const deferInvalidations = (reactivity: Reactivity): Reactivity => {
|
|
561
606
|
const invalidate = (keys: Parameters<Reactivity["invalidate"]>[0]) =>
|
|
562
607
|
afterCommit(Effect.sync(() => reactivity.invalidateUnsafe(keys)))
|
|
@@ -574,13 +619,32 @@ export const makeWithTransaction = <I, S>(options: {
|
|
|
574
619
|
}
|
|
575
620
|
const services = fiber.context
|
|
576
621
|
const reactivity = Context.getOrUndefined(services, Reactivity)
|
|
577
|
-
const
|
|
622
|
+
const propagate = fiber.cache.tracerEnabled && fiber.getRef(Statement.SpanPropagationEnabled)
|
|
623
|
+
const waitedClock = propagate ? waitClock(fiber) : undefined
|
|
624
|
+
// Runs a transaction control in a span of its own, so a failure ends
|
|
625
|
+
// that span with the control's own exit.
|
|
626
|
+
const control = (operation: string, effect: Effect.Effect<void, SqlError>) =>
|
|
627
|
+
Effect.useSpan(
|
|
628
|
+
target === undefined ? operation : `${operation} ${target}`,
|
|
629
|
+
{ kind: "client", parent: span },
|
|
630
|
+
(controlSpan) => {
|
|
631
|
+
for (const [key, value] of options.spanAttributes) {
|
|
632
|
+
controlSpan.attribute(key, value)
|
|
633
|
+
}
|
|
634
|
+
controlSpan.attribute(ATTR_DB_OPERATION_NAME, operation)
|
|
635
|
+
return effect
|
|
636
|
+
}
|
|
637
|
+
)
|
|
578
638
|
const connOption = Context.getOption(services, options.transactionService)
|
|
579
639
|
const conn: Effect.Effect<readonly [Scope.Closeable | undefined, S], SqlError> = connOption._tag === "Some"
|
|
580
640
|
? Effect.succeed([undefined, connOption.value[0]] as const)
|
|
581
641
|
: Effect.flatMap(Scope.make(), (scope) =>
|
|
582
642
|
Scope.provide(options.acquireConnection(restore), scope).pipe(
|
|
583
|
-
Effect.
|
|
643
|
+
Effect.provideService(Tracer.ParentSpan, span),
|
|
644
|
+
Effect.map((conn) => {
|
|
645
|
+
if (waitedClock !== undefined) recordConnectionWait(span, waitedClock)
|
|
646
|
+
return [scope, conn] as const
|
|
647
|
+
}),
|
|
584
648
|
Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause)))
|
|
585
649
|
))
|
|
586
650
|
const id = connOption._tag === "Some" ? connOption.value[1] + 1 : 0
|
|
@@ -590,12 +654,16 @@ export const makeWithTransaction = <I, S>(options: {
|
|
|
590
654
|
open: true
|
|
591
655
|
}
|
|
592
656
|
let committed = false
|
|
657
|
+
const start = (conn: S) =>
|
|
658
|
+
id === 0
|
|
659
|
+
? control("BEGIN", options.begin(conn, fiber.getRef(BeginTransaction)))
|
|
660
|
+
: control("SAVEPOINT", options.savepoint(conn, id))
|
|
593
661
|
const transaction = Effect.flatMap(
|
|
594
662
|
conn,
|
|
595
663
|
(
|
|
596
664
|
[scope, conn]
|
|
597
665
|
) =>
|
|
598
|
-
(
|
|
666
|
+
start(conn).pipe(
|
|
599
667
|
Effect.flatMap(() => {
|
|
600
668
|
const level = [conn, id] as const
|
|
601
669
|
afterCommitBuffers.set(level, buffer)
|
|
@@ -614,30 +682,31 @@ export const makeWithTransaction = <I, S>(options: {
|
|
|
614
682
|
let effect: Effect.Effect<void, SqlError>
|
|
615
683
|
if (Exit.isSuccess(exit)) {
|
|
616
684
|
if (id === 0) {
|
|
617
|
-
span.event("effect.sql.transaction.commit", clock.currentTimeNanosUnsafe())
|
|
618
685
|
const onCommitFailure = options.onCommitFailure
|
|
686
|
+
const commit = control("COMMIT", options.commit(conn))
|
|
619
687
|
effect = onCommitFailure
|
|
620
|
-
? Effect.catchCause(
|
|
621
|
-
Effect.matchCauseEffect(onCommitFailure(conn), {
|
|
688
|
+
? Effect.catchCause(commit, (commitCause) =>
|
|
689
|
+
Effect.matchCauseEffect(control("ROLLBACK", onCommitFailure(conn)), {
|
|
622
690
|
onFailure: (cleanupCause) =>
|
|
623
691
|
Effect.failCause(failuresToDefects(Cause.combine(commitCause, cleanupCause))),
|
|
624
692
|
onSuccess: () => Effect.failCause(commitCause)
|
|
625
693
|
}))
|
|
626
|
-
:
|
|
694
|
+
: commit
|
|
627
695
|
} else {
|
|
628
|
-
span.event("effect.sql.transaction.savepoint", clock.currentTimeNanosUnsafe())
|
|
629
696
|
effect = Effect.void
|
|
630
697
|
}
|
|
631
698
|
} else {
|
|
632
|
-
span.event("effect.sql.transaction.rollback", clock.currentTimeNanosUnsafe())
|
|
633
699
|
effect = Effect.orDie(
|
|
634
700
|
id > 0
|
|
635
|
-
? options.rollbackSavepoint(conn, id)
|
|
636
|
-
: options.rollback(conn)
|
|
701
|
+
? control("ROLLBACK TO SAVEPOINT", options.rollbackSavepoint(conn, id))
|
|
702
|
+
: control("ROLLBACK", options.rollback(conn))
|
|
637
703
|
)
|
|
638
704
|
}
|
|
639
705
|
if (id > 0 && options.releaseSavepoint) {
|
|
640
|
-
effect = Effect.andThen(
|
|
706
|
+
effect = Effect.andThen(
|
|
707
|
+
effect,
|
|
708
|
+
Effect.orDie(control("RELEASE SAVEPOINT", options.releaseSavepoint(conn, id)))
|
|
709
|
+
)
|
|
641
710
|
}
|
|
642
711
|
return Effect.flatMap(effect, () => {
|
|
643
712
|
committed = Exit.isSuccess(exit)
|
package/src/sql/Statement.ts
CHANGED
|
@@ -20,6 +20,7 @@ import type * as Fiber from "../Fiber.ts"
|
|
|
20
20
|
import { constUndefined } from "../Function.ts"
|
|
21
21
|
import * as internalEffect from "../internal/effect.ts"
|
|
22
22
|
import * as InternalRecord from "../internal/record.ts"
|
|
23
|
+
import { recordConnectionWait, waitClock } from "../internal/sql.ts"
|
|
23
24
|
import { hasProperty } from "../Predicate.ts"
|
|
24
25
|
import { TracerTimingEnabled } from "../References.ts"
|
|
25
26
|
import * as Stream from "../Stream.ts"
|
|
@@ -27,7 +28,41 @@ import * as Tracer from "../Tracer.ts"
|
|
|
27
28
|
import type { Acquirer, Borrower, Connection, Row } from "./SqlConnection.ts"
|
|
28
29
|
import type { SqlError } from "./SqlError.ts"
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Runtime type identifier for SQL `Fragment` values.
|
|
33
|
+
*
|
|
34
|
+
* @stability unstable
|
|
35
|
+
* @category Type ID
|
|
36
|
+
* @since 4.1.1
|
|
37
|
+
*/
|
|
38
|
+
export const FragmentTypeId: unique symbol = Symbol.for("~effect/sql/Statement/Fragment")
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Type of the unique symbol used to brand SQL `Fragment` values.
|
|
42
|
+
*
|
|
43
|
+
* @stability unstable
|
|
44
|
+
* @category Type ID
|
|
45
|
+
* @since 4.1.1
|
|
46
|
+
*/
|
|
47
|
+
export type FragmentTypeId = typeof FragmentTypeId
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Runtime type identifier for SQL `Segment` values.
|
|
51
|
+
*
|
|
52
|
+
* @stability unstable
|
|
53
|
+
* @category Type ID
|
|
54
|
+
* @since 4.1.1
|
|
55
|
+
*/
|
|
56
|
+
export const SegmentTypeId: unique symbol = Symbol.for("~effect/sql/Statement/Segment")
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Type of the unique symbol used to brand SQL `Segment` values.
|
|
60
|
+
*
|
|
61
|
+
* @stability unstable
|
|
62
|
+
* @category Type ID
|
|
63
|
+
* @since 4.1.1
|
|
64
|
+
*/
|
|
65
|
+
export type SegmentTypeId = typeof SegmentTypeId
|
|
31
66
|
|
|
32
67
|
/**
|
|
33
68
|
* Composable SQL fragment represented as low-level segments that can be
|
|
@@ -38,7 +73,7 @@ const FragmentTypeId = "~effect/sql/Statement/Fragment"
|
|
|
38
73
|
* @since 4.0.0
|
|
39
74
|
*/
|
|
40
75
|
export interface Fragment {
|
|
41
|
-
readonly [FragmentTypeId]:
|
|
76
|
+
readonly [FragmentTypeId]: FragmentTypeId
|
|
42
77
|
readonly segments: ReadonlyArray<Segment>
|
|
43
78
|
}
|
|
44
79
|
|
|
@@ -120,6 +155,11 @@ export const CurrentTransformer = Context.Reference<Transformer | undefined>("ef
|
|
|
120
155
|
* waited for a connection as `db.client.connection.wait_time_ms`. Defaults to
|
|
121
156
|
* `false`; ignored when tracing is disabled.
|
|
122
157
|
*
|
|
158
|
+
* **Details**
|
|
159
|
+
*
|
|
160
|
+
* A top-level transaction also records how long it waited for its
|
|
161
|
+
* connection on its `sql.transaction` span.
|
|
162
|
+
*
|
|
123
163
|
* @stability unstable
|
|
124
164
|
* @category services
|
|
125
165
|
* @since 4.0.0
|
|
@@ -147,7 +187,7 @@ export const isFragment = (u: unknown): u is Fragment => hasProperty(u, Fragment
|
|
|
147
187
|
export const isCustom = <A extends Custom<any, any, any, any>>(
|
|
148
188
|
kind: A["kind"]
|
|
149
189
|
) =>
|
|
150
|
-
(u: unknown): u is A =>
|
|
190
|
+
(u: unknown): u is A => isSegment(u) && u._tag === "Custom" && u.kind === kind
|
|
151
191
|
|
|
152
192
|
/**
|
|
153
193
|
* Union of low-level segment types that make up a SQL `Fragment`.
|
|
@@ -175,6 +215,7 @@ export type Segment =
|
|
|
175
215
|
* @since 4.0.0
|
|
176
216
|
*/
|
|
177
217
|
export interface Literal {
|
|
218
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
178
219
|
readonly _tag: "Literal"
|
|
179
220
|
readonly value: string
|
|
180
221
|
readonly params?: ReadonlyArray<unknown> | undefined
|
|
@@ -189,6 +230,7 @@ export interface Literal {
|
|
|
189
230
|
* @since 4.0.0
|
|
190
231
|
*/
|
|
191
232
|
export const literal = (value: string, params?: ReadonlyArray<unknown> | undefined): Literal => ({
|
|
233
|
+
[SegmentTypeId]: SegmentTypeId,
|
|
192
234
|
_tag: "Literal",
|
|
193
235
|
value,
|
|
194
236
|
params
|
|
@@ -202,6 +244,7 @@ export const literal = (value: string, params?: ReadonlyArray<unknown> | undefin
|
|
|
202
244
|
* @since 4.0.0
|
|
203
245
|
*/
|
|
204
246
|
export interface Identifier {
|
|
247
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
205
248
|
readonly _tag: "Identifier"
|
|
206
249
|
readonly value: string
|
|
207
250
|
}
|
|
@@ -215,6 +258,7 @@ export interface Identifier {
|
|
|
215
258
|
* @since 4.0.0
|
|
216
259
|
*/
|
|
217
260
|
export const identifier = (value: string): Identifier => ({
|
|
261
|
+
[SegmentTypeId]: SegmentTypeId,
|
|
218
262
|
_tag: "Identifier",
|
|
219
263
|
value
|
|
220
264
|
})
|
|
@@ -228,6 +272,7 @@ export const identifier = (value: string): Identifier => ({
|
|
|
228
272
|
* @since 4.0.0
|
|
229
273
|
*/
|
|
230
274
|
export interface Parameter {
|
|
275
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
231
276
|
readonly _tag: "Parameter"
|
|
232
277
|
readonly value: unknown
|
|
233
278
|
}
|
|
@@ -240,6 +285,7 @@ export interface Parameter {
|
|
|
240
285
|
* @since 4.0.0
|
|
241
286
|
*/
|
|
242
287
|
export const parameter = (value: unknown): Parameter => ({
|
|
288
|
+
[SegmentTypeId]: SegmentTypeId,
|
|
243
289
|
_tag: "Parameter",
|
|
244
290
|
value
|
|
245
291
|
})
|
|
@@ -253,6 +299,7 @@ export const parameter = (value: unknown): Parameter => ({
|
|
|
253
299
|
* @since 4.0.0
|
|
254
300
|
*/
|
|
255
301
|
export interface ArrayHelper {
|
|
302
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
256
303
|
readonly _tag: "ArrayHelper"
|
|
257
304
|
readonly value: ReadonlyArray<unknown | Fragment>
|
|
258
305
|
}
|
|
@@ -265,6 +312,7 @@ export interface ArrayHelper {
|
|
|
265
312
|
* @since 4.0.0
|
|
266
313
|
*/
|
|
267
314
|
export const arrayHelper = (value: ReadonlyArray<unknown | Fragment>): ArrayHelper => ({
|
|
315
|
+
[SegmentTypeId]: SegmentTypeId,
|
|
268
316
|
_tag: "ArrayHelper",
|
|
269
317
|
value
|
|
270
318
|
})
|
|
@@ -278,6 +326,7 @@ export const arrayHelper = (value: ReadonlyArray<unknown | Fragment>): ArrayHelp
|
|
|
278
326
|
* @since 4.0.0
|
|
279
327
|
*/
|
|
280
328
|
export interface RecordInsertHelper {
|
|
329
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
281
330
|
readonly _tag: "RecordInsertHelper"
|
|
282
331
|
readonly value: Arr.NonEmptyReadonlyArray<Record<string, unknown>>
|
|
283
332
|
/**
|
|
@@ -288,6 +337,7 @@ export interface RecordInsertHelper {
|
|
|
288
337
|
}
|
|
289
338
|
|
|
290
339
|
const RecordInsertHelperProto = {
|
|
340
|
+
[SegmentTypeId]: SegmentTypeId,
|
|
291
341
|
_tag: "RecordInsertHelper" as const,
|
|
292
342
|
returning(this: RecordInsertHelper, sql: string | Identifier | Fragment) {
|
|
293
343
|
const self = Object.create(Object.getPrototypeOf(this))
|
|
@@ -322,6 +372,7 @@ export const recordInsertHelper = (
|
|
|
322
372
|
* @since 4.0.0
|
|
323
373
|
*/
|
|
324
374
|
export interface RecordUpdateHelper {
|
|
375
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
325
376
|
readonly _tag: "RecordUpdateHelper"
|
|
326
377
|
readonly value: Arr.NonEmptyReadonlyArray<Record<string, unknown>>
|
|
327
378
|
readonly alias: string
|
|
@@ -364,6 +415,7 @@ export const recordUpdateHelper = (
|
|
|
364
415
|
* @since 4.0.0
|
|
365
416
|
*/
|
|
366
417
|
export interface RecordUpdateHelperSingle {
|
|
418
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
367
419
|
readonly _tag: "RecordUpdateHelperSingle"
|
|
368
420
|
readonly value: Record<string, unknown>
|
|
369
421
|
readonly omit: ReadonlyArray<string>
|
|
@@ -411,6 +463,7 @@ export interface Custom<
|
|
|
411
463
|
B = void,
|
|
412
464
|
C = void
|
|
413
465
|
> {
|
|
466
|
+
readonly [SegmentTypeId]: SegmentTypeId
|
|
414
467
|
readonly _tag: "Custom"
|
|
415
468
|
readonly kind: T
|
|
416
469
|
readonly paramA: A
|
|
@@ -433,7 +486,7 @@ export const custom = <C extends Custom<any, any, any, any>>(
|
|
|
433
486
|
paramA: C["paramA"],
|
|
434
487
|
paramB: C["paramB"],
|
|
435
488
|
paramC: C["paramC"]
|
|
436
|
-
): C => ({ _tag: "Custom", kind, paramA, paramB, paramC } as C)
|
|
489
|
+
): C => ({ [SegmentTypeId]: SegmentTypeId, _tag: "Custom", kind, paramA, paramB, paramC } as C)
|
|
437
490
|
|
|
438
491
|
/**
|
|
439
492
|
* Names the primitive value categories recognized by SQL statement helpers and
|
|
@@ -1355,7 +1408,6 @@ export const spanName = (spanAttributes: ReadonlyArray<readonly [string, unknown
|
|
|
1355
1408
|
// internal
|
|
1356
1409
|
|
|
1357
1410
|
const ATTR_DB_QUERY_TEXT = "db.query.text"
|
|
1358
|
-
const ATTR_DB_CLIENT_CONNECTION_WAIT_TIME = "db.client.connection.wait_time_ms"
|
|
1359
1411
|
const ATTR_SQL_METHOD = "effect.sql.method"
|
|
1360
1412
|
|
|
1361
1413
|
// the last value wins, matching the order the attributes are applied to spans
|
|
@@ -1464,6 +1516,8 @@ const StatementProto: Omit<
|
|
|
1464
1516
|
span.attribute(ATTR_SQL_METHOD, operation)
|
|
1465
1517
|
span.attribute(ATTR_DB_QUERY_TEXT, sql)
|
|
1466
1518
|
const propagate = fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled)
|
|
1519
|
+
// Measured from the span's start, so the wait also covers compiling the
|
|
1520
|
+
// statement and any `CurrentTransformer` run first.
|
|
1467
1521
|
const clock = propagate ? waitClock(fiber) : undefined
|
|
1468
1522
|
const run = clock === undefined
|
|
1469
1523
|
? (connection: Connection) => f(connection, sql, params)
|
|
@@ -1580,18 +1634,6 @@ const StatementProto: Omit<
|
|
|
1580
1634
|
}
|
|
1581
1635
|
}
|
|
1582
1636
|
|
|
1583
|
-
// Without span timing, the span has no start time to measure from.
|
|
1584
|
-
const waitClock = (fiber: Fiber.Fiber<unknown, unknown>): Clock | undefined =>
|
|
1585
|
-
fiber.getRef(TracerTimingEnabled) ? fiber.getRef(Clock) : undefined
|
|
1586
|
-
|
|
1587
|
-
// Measured from the statement span's start to the connection hand-off, so it
|
|
1588
|
-
// also covers compiling the statement and any `CurrentTransformer` run first.
|
|
1589
|
-
const recordConnectionWait = (span: Tracer.Span, clock: Clock): void =>
|
|
1590
|
-
span.attribute(
|
|
1591
|
-
ATTR_DB_CLIENT_CONNECTION_WAIT_TIME,
|
|
1592
|
-
Number(clock.currentTimeNanosUnsafe() - span.status.startTime) / 1e6
|
|
1593
|
-
)
|
|
1594
|
-
|
|
1595
1637
|
const withStatement = <A, X, E, R>(
|
|
1596
1638
|
self: StatementImpl<A>,
|
|
1597
1639
|
span: Tracer.Span,
|
|
@@ -1613,24 +1655,7 @@ const withStatement = <A, X, E, R>(
|
|
|
1613
1655
|
)
|
|
1614
1656
|
})
|
|
1615
1657
|
|
|
1616
|
-
const isSegment = (u: unknown): u is Segment =>
|
|
1617
|
-
if (!hasProperty(u, "_tag")) {
|
|
1618
|
-
return false
|
|
1619
|
-
}
|
|
1620
|
-
switch (u._tag) {
|
|
1621
|
-
case "Literal":
|
|
1622
|
-
case "Parameter":
|
|
1623
|
-
case "ArrayHelper":
|
|
1624
|
-
case "RecordInsertHelper":
|
|
1625
|
-
case "RecordUpdateHelper":
|
|
1626
|
-
case "RecordUpdateHelperSingle":
|
|
1627
|
-
case "Identifier":
|
|
1628
|
-
case "Custom":
|
|
1629
|
-
return true
|
|
1630
|
-
default:
|
|
1631
|
-
return false
|
|
1632
|
-
}
|
|
1633
|
-
}
|
|
1658
|
+
const isSegment = (u: unknown): u is Segment => hasProperty(u, SegmentTypeId)
|
|
1634
1659
|
|
|
1635
1660
|
function convertLiteralOrFragment(clause: string | Fragment): Array<Segment> {
|
|
1636
1661
|
if (typeof clause === "string") {
|
package/src/workflow/Workflow.ts
CHANGED
|
@@ -88,6 +88,10 @@ export interface Workflow<
|
|
|
88
88
|
* nor gets interrupted with it. The cluster engine retains the parent for
|
|
89
89
|
* observability.
|
|
90
90
|
*
|
|
91
|
+
* Inside a workflow, an awaited child that is interrupted fails the parent
|
|
92
|
+
* with a defect rather than an interrupt, so the parent can recover with
|
|
93
|
+
* `Effect.catchDefect` or `Effect.exit`.
|
|
94
|
+
*
|
|
91
95
|
* **Gotchas**
|
|
92
96
|
*
|
|
93
97
|
* Do not await a detached execution later. Executing the same payload joins
|
|
@@ -583,6 +583,11 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
|
|
|
583
583
|
if (wrapped._tag === "Suspended") {
|
|
584
584
|
return yield* Workflow.suspend(parentInstance.value)
|
|
585
585
|
}
|
|
586
|
+
// A child's interrupt is an outcome for the parent, not an interrupt of
|
|
587
|
+
// the parent's run, so surface it as a defect the parent can observe.
|
|
588
|
+
if (Exit.isFailure(wrapped.exit) && Cause.hasInterruptsOnly(wrapped.exit.cause)) {
|
|
589
|
+
return yield* Effect.die(`${self._tag}.execute: execution "${executionId}" was interrupted`)
|
|
590
|
+
}
|
|
586
591
|
return yield* wrapped.exit
|
|
587
592
|
}
|
|
588
593
|
|