effect 4.0.0-beta.100 → 4.0.0-beta.102
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/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +81 -5
- package/dist/Array.js.map +1 -1
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +27 -9
- package/dist/Channel.js.map +1 -1
- package/dist/Config.d.ts +1 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js +6 -5
- package/dist/Config.js.map +1 -1
- package/dist/ConfigProvider.js +7 -7
- package/dist/ConfigProvider.js.map +1 -1
- package/dist/Data.d.ts.map +1 -1
- package/dist/Data.js +2 -1
- package/dist/Data.js.map +1 -1
- package/dist/Effect.d.ts +61 -100
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +66 -39
- package/dist/Effect.js.map +1 -1
- package/dist/FiberHandle.d.ts.map +1 -1
- package/dist/FiberHandle.js +3 -2
- package/dist/FiberHandle.js.map +1 -1
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +2 -1
- package/dist/Iterable.js.map +1 -1
- package/dist/JsonPatch.d.ts.map +1 -1
- package/dist/JsonPatch.js +4 -3
- package/dist/JsonPatch.js.map +1 -1
- package/dist/JsonSchema.d.ts.map +1 -1
- package/dist/JsonSchema.js +9 -11
- package/dist/JsonSchema.js.map +1 -1
- package/dist/Logger.d.ts.map +1 -1
- package/dist/Logger.js +3 -2
- package/dist/Logger.js.map +1 -1
- package/dist/ManagedRuntime.d.ts +9 -0
- package/dist/ManagedRuntime.d.ts.map +1 -1
- package/dist/ManagedRuntime.js +3 -0
- package/dist/ManagedRuntime.js.map +1 -1
- package/dist/Metric.d.ts.map +1 -1
- package/dist/Metric.js +4 -3
- package/dist/Metric.js.map +1 -1
- package/dist/MutableList.d.ts.map +1 -1
- package/dist/MutableList.js +4 -0
- package/dist/MutableList.js.map +1 -1
- package/dist/Optic.d.ts.map +1 -1
- package/dist/Optic.js +5 -4
- package/dist/Optic.js.map +1 -1
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +2 -1
- package/dist/Option.js.map +1 -1
- package/dist/PartitionedSemaphore.d.ts.map +1 -1
- package/dist/PartitionedSemaphore.js +1 -4
- package/dist/PartitionedSemaphore.js.map +1 -1
- package/dist/Record.d.ts +93 -1
- package/dist/Record.d.ts.map +1 -1
- package/dist/Record.js +57 -19
- package/dist/Record.js.map +1 -1
- package/dist/References.d.ts +0 -45
- package/dist/References.d.ts.map +1 -1
- package/dist/References.js +0 -45
- package/dist/References.js.map +1 -1
- package/dist/Request.d.ts.map +1 -1
- package/dist/Request.js +9 -6
- package/dist/Request.js.map +1 -1
- package/dist/Result.d.ts.map +1 -1
- package/dist/Result.js +2 -1
- package/dist/Result.js.map +1 -1
- package/dist/Schema.d.ts +1269 -496
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +2308 -614
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaAST.d.ts +2 -2
- package/dist/SchemaAST.d.ts.map +1 -1
- package/dist/SchemaAST.js +189 -130
- package/dist/SchemaAST.js.map +1 -1
- package/dist/SchemaError.js +1 -1
- package/dist/SchemaError.js.map +1 -1
- package/dist/SchemaGetter.d.ts +13 -11
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +34 -24
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaIssue.js +1 -1
- package/dist/SchemaIssue.js.map +1 -1
- package/dist/SchemaParser.d.ts.map +1 -1
- package/dist/SchemaParser.js +1 -12
- package/dist/SchemaParser.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +403 -1504
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +294 -2852
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +2 -2
- package/dist/SchemaTransformation.js +3 -3
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/Semaphore.d.ts +5 -3
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js.map +1 -1
- package/dist/Stream.d.ts +15 -9
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +46 -16
- package/dist/Stream.js.map +1 -1
- package/dist/Struct.d.ts.map +1 -1
- package/dist/Struct.js +5 -4
- package/dist/Struct.js.map +1 -1
- package/dist/Types.d.ts +1 -3
- package/dist/Types.d.ts.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/internal/core.js +3 -2
- package/dist/internal/core.js.map +1 -1
- package/dist/internal/effect.js +119 -53
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/matcher.js +1 -1
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/record.d.ts +0 -3
- package/dist/internal/record.d.ts.map +1 -1
- package/dist/internal/record.js +10 -5
- package/dist/internal/record.js.map +1 -1
- package/dist/internal/references.js +0 -4
- package/dist/internal/references.js.map +1 -1
- package/dist/internal/schema/annotations.js +12 -0
- package/dist/internal/schema/annotations.js.map +1 -1
- package/dist/internal/schema/fromJsonSchemaDocument.d.ts +2 -0
- package/dist/internal/schema/fromJsonSchemaDocument.d.ts.map +1 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js +743 -0
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -0
- package/dist/internal/schema/fromRepresentation.d.ts +2 -0
- package/dist/internal/schema/fromRepresentation.d.ts.map +1 -0
- package/dist/internal/schema/fromRepresentation.js +252 -0
- package/dist/internal/schema/fromRepresentation.js.map +1 -0
- package/dist/internal/schema/schema.js +28 -40
- package/dist/internal/schema/schema.js.map +1 -1
- package/dist/internal/schema/{arbitrary.d.ts → toArbitrary.d.ts} +1 -1
- package/dist/internal/schema/toArbitrary.d.ts.map +1 -0
- package/dist/internal/schema/{arbitrary.js → toArbitrary.js} +8 -9
- package/dist/internal/schema/toArbitrary.js.map +1 -0
- package/dist/internal/schema/toCodeDocument.d.ts +2 -0
- package/dist/internal/schema/toCodeDocument.d.ts.map +1 -0
- package/dist/internal/schema/toCodeDocument.js +438 -0
- package/dist/internal/schema/toCodeDocument.js.map +1 -0
- package/dist/internal/schema/toEquivalence.d.ts +2 -0
- package/dist/internal/schema/toEquivalence.d.ts.map +1 -0
- package/dist/internal/schema/{equivalence.js → toEquivalence.js} +15 -13
- package/dist/internal/schema/toEquivalence.js.map +1 -0
- package/dist/internal/schema/toJsonSchemaDocument.d.ts +2 -0
- package/dist/internal/schema/toJsonSchemaDocument.d.ts.map +1 -0
- package/dist/internal/schema/toJsonSchemaDocument.js +466 -0
- package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -0
- package/dist/internal/schema/toRepresentation.d.ts +2 -0
- package/dist/internal/schema/toRepresentation.d.ts.map +1 -0
- package/dist/internal/schema/toRepresentation.js +369 -0
- package/dist/internal/schema/toRepresentation.js.map +1 -0
- package/dist/internal/stackTraceLimit.js +3 -6
- package/dist/internal/stackTraceLimit.js.map +1 -1
- package/dist/testing/TestClock.js +4 -1
- package/dist/testing/TestClock.js.map +1 -1
- package/dist/unstable/ai/AiError.d.ts +26 -26
- package/dist/unstable/ai/AiError.d.ts.map +1 -1
- package/dist/unstable/ai/AiError.js +5 -4
- package/dist/unstable/ai/AiError.js.map +1 -1
- package/dist/unstable/ai/AnthropicStructuredOutput.d.ts +21 -6
- package/dist/unstable/ai/AnthropicStructuredOutput.d.ts.map +1 -1
- package/dist/unstable/ai/AnthropicStructuredOutput.js +86 -316
- package/dist/unstable/ai/AnthropicStructuredOutput.js.map +1 -1
- package/dist/unstable/ai/EmbeddingModel.d.ts +1 -1
- package/dist/unstable/ai/EmbeddingModel.js +1 -1
- package/dist/unstable/ai/EmbeddingModel.js.map +1 -1
- package/dist/unstable/ai/LanguageModel.d.ts +4 -1
- package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
- package/dist/unstable/ai/LanguageModel.js +19 -17
- package/dist/unstable/ai/LanguageModel.js.map +1 -1
- package/dist/unstable/ai/McpSchema.d.ts +197 -197
- package/dist/unstable/ai/McpSchema.d.ts.map +1 -1
- package/dist/unstable/ai/McpSchema.js +13 -13
- package/dist/unstable/ai/McpSchema.js.map +1 -1
- package/dist/unstable/ai/McpServer.d.ts +4 -4
- package/dist/unstable/ai/McpServer.d.ts.map +1 -1
- package/dist/unstable/ai/McpServer.js +116 -49
- package/dist/unstable/ai/McpServer.js.map +1 -1
- package/dist/unstable/ai/OpenAiStructuredOutput.d.ts +32 -10
- package/dist/unstable/ai/OpenAiStructuredOutput.d.ts.map +1 -1
- package/dist/unstable/ai/OpenAiStructuredOutput.js +193 -377
- package/dist/unstable/ai/OpenAiStructuredOutput.js.map +1 -1
- package/dist/unstable/ai/Response.d.ts +19 -19
- package/dist/unstable/ai/Response.d.ts.map +1 -1
- package/dist/unstable/ai/Response.js +14 -14
- package/dist/unstable/ai/Response.js.map +1 -1
- package/dist/unstable/ai/Tool.d.ts +4 -0
- package/dist/unstable/ai/Tool.d.ts.map +1 -1
- package/dist/unstable/ai/Tool.js +11 -3
- package/dist/unstable/ai/Tool.js.map +1 -1
- package/dist/unstable/ai/Toolkit.d.ts +9 -1
- package/dist/unstable/ai/Toolkit.d.ts.map +1 -1
- package/dist/unstable/ai/Toolkit.js +14 -10
- package/dist/unstable/ai/Toolkit.js.map +1 -1
- package/dist/unstable/ai/internal/codec-transformer.js +15 -12
- package/dist/unstable/ai/internal/codec-transformer.js.map +1 -1
- package/dist/unstable/ai/internal/structured-output.d.ts +2 -0
- package/dist/unstable/ai/internal/structured-output.d.ts.map +1 -0
- package/dist/unstable/ai/internal/structured-output.js +316 -0
- package/dist/unstable/ai/internal/structured-output.js.map +1 -0
- package/dist/unstable/cli/CliError.d.ts +40 -2
- package/dist/unstable/cli/CliError.d.ts.map +1 -1
- package/dist/unstable/cli/CliError.js +45 -6
- package/dist/unstable/cli/CliError.js.map +1 -1
- package/dist/unstable/cli/Command.js +14 -5
- package/dist/unstable/cli/Command.js.map +1 -1
- package/dist/unstable/cli/Param.js +3 -3
- package/dist/unstable/cli/Param.js.map +1 -1
- package/dist/unstable/cli/Primitive.js +1 -1
- package/dist/unstable/cli/Primitive.js.map +1 -1
- package/dist/unstable/cli/internal/command.d.ts +3 -1
- package/dist/unstable/cli/internal/command.d.ts.map +1 -1
- package/dist/unstable/cli/internal/command.js +11 -4
- package/dist/unstable/cli/internal/command.js.map +1 -1
- package/dist/unstable/cli/internal/config.d.ts +0 -48
- package/dist/unstable/cli/internal/config.d.ts.map +1 -1
- package/dist/unstable/cli/internal/config.js +8 -10
- package/dist/unstable/cli/internal/config.js.map +1 -1
- package/dist/unstable/cluster/ClusterWorkflowEngine.js +1 -1
- package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/unstable/cluster/Entity.js +1 -1
- package/dist/unstable/cluster/Entity.js.map +1 -1
- package/dist/unstable/cluster/Envelope.d.ts.map +1 -1
- package/dist/unstable/cluster/Envelope.js +2 -1
- package/dist/unstable/cluster/Envelope.js.map +1 -1
- package/dist/unstable/cluster/Reply.js +1 -1
- package/dist/unstable/cluster/Reply.js.map +1 -1
- package/dist/unstable/cluster/Runner.d.ts +1 -1
- package/dist/unstable/cluster/Runner.js +1 -1
- package/dist/unstable/cluster/Runner.js.map +1 -1
- package/dist/unstable/cluster/RunnerAddress.d.ts +1 -1
- package/dist/unstable/cluster/RunnerAddress.js +1 -1
- package/dist/unstable/cluster/RunnerAddress.js.map +1 -1
- package/dist/unstable/cluster/ShardId.js +1 -1
- package/dist/unstable/cluster/ShardId.js.map +1 -1
- package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
- package/dist/unstable/cluster/Sharding.js +125 -24
- package/dist/unstable/cluster/Sharding.js.map +1 -1
- package/dist/unstable/cluster/ShardingConfig.d.ts +10 -2
- package/dist/unstable/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
- package/dist/unstable/cluster/SingleRunner.d.ts +4 -2
- package/dist/unstable/cluster/SingleRunner.d.ts.map +1 -1
- package/dist/unstable/cluster/SingleRunner.js +2 -1
- package/dist/unstable/cluster/SingleRunner.js.map +1 -1
- package/dist/unstable/cluster/SqlMessageStorage.d.ts +7 -4
- package/dist/unstable/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/unstable/cluster/SqlMessageStorage.js +55 -24
- package/dist/unstable/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/unstable/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/unstable/cluster/SqlRunnerStorage.js +109 -62
- package/dist/unstable/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/unstable/cluster/internal/entityManager.js +19 -7
- package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
- package/dist/unstable/cluster/internal/shardLock.d.ts +2 -0
- package/dist/unstable/cluster/internal/shardLock.d.ts.map +1 -0
- package/dist/unstable/cluster/internal/shardLock.js +4 -0
- package/dist/unstable/cluster/internal/shardLock.js.map +1 -0
- package/dist/unstable/devtools/DevToolsSchema.d.ts +20 -20
- package/dist/unstable/devtools/DevToolsSchema.d.ts.map +1 -1
- package/dist/unstable/devtools/DevToolsSchema.js +8 -5
- package/dist/unstable/devtools/DevToolsSchema.js.map +1 -1
- package/dist/unstable/eventlog/EventJournal.d.ts +1 -1
- package/dist/unstable/eventlog/EventJournal.js +1 -1
- package/dist/unstable/eventlog/EventJournal.js.map +1 -1
- package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLog.js +15 -11
- package/dist/unstable/eventlog/EventLog.js.map +1 -1
- package/dist/unstable/eventlog/EventLogEncryption.d.ts +1 -1
- package/dist/unstable/eventlog/EventLogEncryption.js +1 -1
- package/dist/unstable/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/unstable/eventlog/EventLogMessage.d.ts +26 -26
- package/dist/unstable/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/unstable/eventlog/EventLogMessage.js +8 -3
- package/dist/unstable/eventlog/EventLogMessage.js.map +1 -1
- package/dist/unstable/eventlog/EventLogRemote.d.ts +1 -1
- package/dist/unstable/eventlog/SqlEventJournal.js +2 -2
- package/dist/unstable/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js +1 -1
- package/dist/unstable/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js +3 -3
- package/dist/unstable/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/unstable/http/Cookies.d.ts.map +1 -1
- package/dist/unstable/http/Cookies.js +24 -22
- package/dist/unstable/http/Cookies.js.map +1 -1
- package/dist/unstable/http/Headers.js +8 -8
- package/dist/unstable/http/Headers.js.map +1 -1
- package/dist/unstable/http/HttpClientRequest.d.ts +44 -0
- package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/unstable/http/HttpClientRequest.js +14 -0
- package/dist/unstable/http/HttpClientRequest.js.map +1 -1
- package/dist/unstable/http/HttpRouter.d.ts +2 -2
- package/dist/unstable/http/HttpRouter.d.ts.map +1 -1
- package/dist/unstable/http/HttpRouter.js.map +1 -1
- package/dist/unstable/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/unstable/http/HttpServerRequest.js +5 -4
- package/dist/unstable/http/HttpServerRequest.js.map +1 -1
- package/dist/unstable/http/Multipart.d.ts.map +1 -1
- package/dist/unstable/http/Multipart.js +17 -15
- package/dist/unstable/http/Multipart.js.map +1 -1
- package/dist/unstable/http/Template.js +1 -1
- package/dist/unstable/http/Template.js.map +1 -1
- package/dist/unstable/http/UrlParams.d.ts.map +1 -1
- package/dist/unstable/http/UrlParams.js +17 -14
- package/dist/unstable/http/UrlParams.js.map +1 -1
- package/dist/unstable/httpapi/HttpApi.js +3 -3
- package/dist/unstable/httpapi/HttpApi.js.map +1 -1
- package/dist/unstable/httpapi/HttpApiClient.js +5 -5
- package/dist/unstable/httpapi/HttpApiClient.js.map +1 -1
- package/dist/unstable/httpapi/HttpApiGroup.js +1 -1
- package/dist/unstable/httpapi/HttpApiGroup.js.map +1 -1
- package/dist/unstable/httpapi/OpenApi.d.ts.map +1 -1
- package/dist/unstable/httpapi/OpenApi.js +37 -24
- package/dist/unstable/httpapi/OpenApi.js.map +1 -1
- package/dist/unstable/observability/OtlpExporter.d.ts +72 -1
- package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
- package/dist/unstable/observability/OtlpExporter.js +69 -4
- package/dist/unstable/observability/OtlpExporter.js.map +1 -1
- package/dist/unstable/observability/OtlpLogger.d.ts +4 -3
- package/dist/unstable/observability/OtlpLogger.d.ts.map +1 -1
- package/dist/unstable/observability/OtlpLogger.js +2 -2
- package/dist/unstable/observability/OtlpLogger.js.map +1 -1
- package/dist/unstable/observability/OtlpMetrics.d.ts +7 -3
- package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
- package/dist/unstable/observability/OtlpMetrics.js +5 -2
- package/dist/unstable/observability/OtlpMetrics.js.map +1 -1
- package/dist/unstable/observability/OtlpTracer.d.ts +4 -3
- package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/unstable/observability/OtlpTracer.js +2 -2
- package/dist/unstable/observability/OtlpTracer.js.map +1 -1
- package/dist/unstable/persistence/Persistable.d.ts.map +1 -1
- package/dist/unstable/persistence/Persistable.js +2 -1
- package/dist/unstable/persistence/Persistable.js.map +1 -1
- package/dist/unstable/persistence/RateLimiter.d.ts +2 -2
- package/dist/unstable/persistence/RateLimiter.js +2 -2
- package/dist/unstable/persistence/RateLimiter.js.map +1 -1
- package/dist/unstable/persistence/Redis.d.ts.map +1 -1
- package/dist/unstable/persistence/Redis.js +2 -2
- package/dist/unstable/persistence/Redis.js.map +1 -1
- package/dist/unstable/process/ChildProcessSpawner.js +3 -1
- package/dist/unstable/process/ChildProcessSpawner.js.map +1 -1
- package/dist/unstable/reactivity/AsyncResult.d.ts.map +1 -1
- package/dist/unstable/reactivity/AsyncResult.js +4 -3
- package/dist/unstable/reactivity/AsyncResult.js.map +1 -1
- package/dist/unstable/reactivity/Atom.d.ts +83 -0
- package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
- package/dist/unstable/reactivity/Atom.js +31 -0
- package/dist/unstable/reactivity/Atom.js.map +1 -1
- package/dist/unstable/reactivity/AtomRegistry.js +1 -1
- package/dist/unstable/reactivity/AtomRegistry.js.map +1 -1
- package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
- package/dist/unstable/rpc/RpcClient.js +2 -1
- package/dist/unstable/rpc/RpcClient.js.map +1 -1
- package/dist/unstable/schema/VariantSchema.d.ts +1 -2
- package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
- package/dist/unstable/schema/VariantSchema.js +13 -10
- package/dist/unstable/schema/VariantSchema.js.map +1 -1
- package/dist/unstable/socket/Socket.d.ts +1 -1
- package/dist/unstable/socket/Socket.js +1 -1
- package/dist/unstable/socket/Socket.js.map +1 -1
- package/dist/unstable/sql/SqlError.d.ts +2 -2
- package/dist/unstable/sql/SqlError.js +2 -2
- package/dist/unstable/sql/SqlError.js.map +1 -1
- package/dist/unstable/sql/Statement.d.ts.map +1 -1
- package/dist/unstable/sql/Statement.js +7 -6
- package/dist/unstable/sql/Statement.js.map +1 -1
- package/package.json +1 -1
- package/src/Array.ts +86 -25
- package/src/Channel.ts +32 -14
- package/src/Config.ts +6 -5
- package/src/ConfigProvider.ts +7 -7
- package/src/Data.ts +3 -2
- package/src/Effect.ts +70 -116
- package/src/FiberHandle.ts +3 -2
- package/src/Iterable.ts +2 -1
- package/src/JsonPatch.ts +4 -3
- package/src/JsonSchema.ts +9 -11
- package/src/Logger.ts +3 -2
- package/src/ManagedRuntime.ts +13 -0
- package/src/Metric.ts +4 -3
- package/src/MutableList.ts +4 -0
- package/src/Optic.ts +5 -4
- package/src/Option.ts +2 -1
- package/src/PartitionedSemaphore.ts +1 -4
- package/src/Record.ts +119 -22
- package/src/References.ts +0 -46
- package/src/Request.ts +5 -7
- package/src/Result.ts +2 -1
- package/src/Schema.ts +2538 -987
- package/src/SchemaAST.ts +228 -149
- package/src/SchemaError.ts +1 -1
- package/src/SchemaGetter.ts +36 -29
- package/src/SchemaIssue.ts +1 -1
- package/src/SchemaParser.ts +1 -25
- package/src/SchemaRepresentation.ts +697 -3398
- package/src/SchemaTransformation.ts +3 -3
- package/src/Semaphore.ts +5 -3
- package/src/Stream.ts +63 -19
- package/src/Struct.ts +5 -4
- package/src/Types.ts +1 -3
- package/src/index.ts +0 -5
- package/src/internal/core.ts +4 -3
- package/src/internal/effect.ts +132 -70
- package/src/internal/matcher.ts +1 -1
- package/src/internal/record.ts +11 -7
- package/src/internal/references.ts +0 -5
- package/src/internal/schema/annotations.ts +44 -0
- package/src/internal/schema/fromJsonSchemaDocument.ts +957 -0
- package/src/internal/schema/fromRepresentation.ts +345 -0
- package/src/internal/schema/schema.ts +45 -46
- package/src/internal/schema/{arbitrary.ts → toArbitrary.ts} +8 -10
- package/src/internal/schema/toCodeDocument.ts +572 -0
- package/src/internal/schema/{equivalence.ts → toEquivalence.ts} +12 -7
- package/src/internal/schema/toJsonSchemaDocument.ts +475 -0
- package/src/internal/schema/toRepresentation.ts +401 -0
- package/src/internal/stackTraceLimit.ts +3 -7
- package/src/testing/TestClock.ts +1 -1
- package/src/unstable/ai/AiError.ts +5 -4
- package/src/unstable/ai/AnthropicStructuredOutput.ts +102 -333
- package/src/unstable/ai/EmbeddingModel.ts +1 -1
- package/src/unstable/ai/LanguageModel.ts +30 -28
- package/src/unstable/ai/McpSchema.ts +15 -15
- package/src/unstable/ai/McpServer.ts +172 -56
- package/src/unstable/ai/OpenAiStructuredOutput.ts +230 -395
- package/src/unstable/ai/Response.ts +24 -24
- package/src/unstable/ai/Tool.ts +22 -4
- package/src/unstable/ai/Toolkit.ts +19 -7
- package/src/unstable/ai/internal/codec-transformer.ts +13 -7
- package/src/unstable/ai/internal/structured-output.ts +458 -0
- package/src/unstable/cli/CliError.ts +51 -5
- package/src/unstable/cli/Command.ts +4 -4
- package/src/unstable/cli/Param.ts +3 -3
- package/src/unstable/cli/Primitive.ts +1 -1
- package/src/unstable/cli/internal/command.ts +13 -5
- package/src/unstable/cli/internal/config.ts +8 -10
- package/src/unstable/cluster/ClusterWorkflowEngine.ts +3 -3
- package/src/unstable/cluster/Entity.ts +1 -1
- package/src/unstable/cluster/Envelope.ts +2 -1
- package/src/unstable/cluster/Reply.ts +1 -1
- package/src/unstable/cluster/Runner.ts +1 -1
- package/src/unstable/cluster/RunnerAddress.ts +1 -1
- package/src/unstable/cluster/ShardId.ts +1 -1
- package/src/unstable/cluster/Sharding.ts +161 -34
- package/src/unstable/cluster/ShardingConfig.ts +5 -1
- package/src/unstable/cluster/SingleRunner.ts +4 -2
- package/src/unstable/cluster/SqlMessageStorage.ts +83 -35
- package/src/unstable/cluster/SqlRunnerStorage.ts +186 -116
- package/src/unstable/cluster/internal/entityManager.ts +31 -10
- package/src/unstable/cluster/internal/shardLock.ts +9 -0
- package/src/unstable/devtools/DevToolsSchema.ts +10 -5
- package/src/unstable/eventlog/EventJournal.ts +1 -1
- package/src/unstable/eventlog/EventLog.ts +21 -11
- package/src/unstable/eventlog/EventLogEncryption.ts +1 -1
- package/src/unstable/eventlog/EventLogMessage.ts +10 -3
- package/src/unstable/eventlog/SqlEventJournal.ts +2 -2
- package/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +1 -1
- package/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +6 -3
- package/src/unstable/http/Cookies.ts +29 -24
- package/src/unstable/http/Headers.ts +8 -8
- package/src/unstable/http/HttpClientRequest.ts +57 -0
- package/src/unstable/http/HttpRouter.ts +6 -3
- package/src/unstable/http/HttpServerRequest.ts +5 -4
- package/src/unstable/http/Multipart.ts +16 -13
- package/src/unstable/http/Template.ts +1 -1
- package/src/unstable/http/UrlParams.ts +17 -14
- package/src/unstable/httpapi/HttpApi.ts +3 -3
- package/src/unstable/httpapi/HttpApiClient.ts +5 -5
- package/src/unstable/httpapi/HttpApiGroup.ts +1 -1
- package/src/unstable/httpapi/OpenApi.ts +52 -28
- package/src/unstable/observability/OtlpExporter.ts +109 -5
- package/src/unstable/observability/OtlpLogger.ts +5 -5
- package/src/unstable/observability/OtlpMetrics.ts +8 -4
- package/src/unstable/observability/OtlpTracer.ts +8 -4
- package/src/unstable/persistence/Persistable.ts +3 -2
- package/src/unstable/persistence/RateLimiter.ts +2 -2
- package/src/unstable/persistence/Redis.ts +2 -2
- package/src/unstable/process/ChildProcessSpawner.ts +1 -1
- package/src/unstable/reactivity/AsyncResult.ts +4 -3
- package/src/unstable/reactivity/Atom.ts +92 -0
- package/src/unstable/reactivity/AtomRegistry.ts +1 -1
- package/src/unstable/rpc/RpcClient.ts +2 -1
- package/src/unstable/schema/VariantSchema.ts +14 -24
- package/src/unstable/socket/Socket.ts +1 -1
- package/src/unstable/sql/SqlError.ts +2 -2
- package/src/unstable/sql/Statement.ts +7 -6
- package/dist/SchemaUtils.d.ts +0 -28
- package/dist/SchemaUtils.d.ts.map +0 -1
- package/dist/SchemaUtils.js +0 -45
- package/dist/SchemaUtils.js.map +0 -1
- package/dist/internal/schema/arbitrary.d.ts.map +0 -1
- package/dist/internal/schema/arbitrary.js.map +0 -1
- package/dist/internal/schema/equivalence.d.ts +0 -2
- package/dist/internal/schema/equivalence.d.ts.map +0 -1
- package/dist/internal/schema/equivalence.js.map +0 -1
- package/dist/internal/schema/representation.d.ts +0 -2
- package/dist/internal/schema/representation.d.ts.map +0 -1
- package/dist/internal/schema/representation.js +0 -865
- package/dist/internal/schema/representation.js.map +0 -1
- package/src/SchemaUtils.ts +0 -51
- package/src/internal/schema/representation.ts +0 -795
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
* 1. Flat iteration over all params for parsing/validation
|
|
47
47
|
* 2. Reconstruction of original nested shape for handler input
|
|
48
48
|
*/
|
|
49
|
+
import * as InternalRecord from "../../../internal/record.ts"
|
|
49
50
|
import * as Param from "../Param.ts"
|
|
50
51
|
|
|
51
52
|
/* ========================================================================== */
|
|
@@ -135,8 +136,8 @@ export const parseConfig = (config: Config): ConfigInternal => {
|
|
|
135
136
|
const args: Array<Param.AnyArgument> = []
|
|
136
137
|
|
|
137
138
|
function parse(config: Config): ConfigInternal.Tree {
|
|
138
|
-
const tree: ConfigInternal.Tree =
|
|
139
|
-
for (const key
|
|
139
|
+
const tree: ConfigInternal.Tree = Object.create(null)
|
|
140
|
+
for (const key of Object.keys(config)) {
|
|
140
141
|
tree[key] = parseValue(config[key])
|
|
141
142
|
}
|
|
142
143
|
return tree
|
|
@@ -202,8 +203,8 @@ const shiftNodeIndexes = (node: ConfigInternal.Node, offset: number): ConfigInte
|
|
|
202
203
|
}
|
|
203
204
|
|
|
204
205
|
const shiftTreeIndexes = (tree: ConfigInternal.Tree, offset: number): ConfigInternal.Tree => {
|
|
205
|
-
const output: ConfigInternal.Tree =
|
|
206
|
-
for (const key
|
|
206
|
+
const output: ConfigInternal.Tree = Object.create(null)
|
|
207
|
+
for (const key of Object.keys(tree)) {
|
|
207
208
|
output[key] = shiftNodeIndexes(tree[key], offset)
|
|
208
209
|
}
|
|
209
210
|
return output
|
|
@@ -220,10 +221,7 @@ export const mergeConfig = (
|
|
|
220
221
|
flags: [...left.flags, ...right.flags],
|
|
221
222
|
arguments: [...left.arguments, ...right.arguments],
|
|
222
223
|
orderedParams: [...left.orderedParams, ...right.orderedParams],
|
|
223
|
-
tree:
|
|
224
|
-
...left.tree,
|
|
225
|
-
...shiftTreeIndexes(right.tree, offset)
|
|
226
|
-
}
|
|
224
|
+
tree: Object.assign(Object.create(null), left.tree, shiftTreeIndexes(right.tree, offset))
|
|
227
225
|
}
|
|
228
226
|
}
|
|
229
227
|
|
|
@@ -245,8 +243,8 @@ export const reconstructTree = (
|
|
|
245
243
|
): Record<string, any> => {
|
|
246
244
|
const output: Record<string, any> = {}
|
|
247
245
|
|
|
248
|
-
for (const key
|
|
249
|
-
output
|
|
246
|
+
for (const key of Object.keys(tree)) {
|
|
247
|
+
InternalRecord.assignProperty(output, key, nodeValue(tree[key]))
|
|
250
248
|
}
|
|
251
249
|
|
|
252
250
|
return output
|
|
@@ -83,7 +83,7 @@ export const make = Effect.gen(function*() {
|
|
|
83
83
|
| Rpc.Rpc<
|
|
84
84
|
"activity",
|
|
85
85
|
Schema.Struct<
|
|
86
|
-
{ name: typeof Schema.String; attempt: typeof Schema.
|
|
86
|
+
{ name: typeof Schema.String; attempt: typeof Schema.Int; withTransaction: typeof Schema.Boolean }
|
|
87
87
|
>,
|
|
88
88
|
Schema.declare<Workflow.Result<any, any>>
|
|
89
89
|
>
|
|
@@ -97,7 +97,7 @@ export const make = Effect.gen(function*() {
|
|
|
97
97
|
| Rpc.Rpc<"deferred", Schema.Struct<{ name: typeof Schema.String; exit: typeof ExitUnknown }>, typeof ExitUnknown>
|
|
98
98
|
| Rpc.Rpc<
|
|
99
99
|
"activity",
|
|
100
|
-
Schema.Struct<{ name: typeof Schema.String; attempt: typeof Schema.
|
|
100
|
+
Schema.Struct<{ name: typeof Schema.String; attempt: typeof Schema.Int }>,
|
|
101
101
|
Schema.declare<Workflow.Result<any, any>>
|
|
102
102
|
>
|
|
103
103
|
| Rpc.Rpc<"resume">
|
|
@@ -644,7 +644,7 @@ const ExitUnknown = Schema.Exit(AnyOrVoid, AnyOrVoid, Schema.Any)
|
|
|
644
644
|
const ActivityRpc = Rpc.make("activity", {
|
|
645
645
|
payload: {
|
|
646
646
|
name: Schema.String,
|
|
647
|
-
attempt: Schema.
|
|
647
|
+
attempt: Schema.Int,
|
|
648
648
|
withTransaction: Schema.Boolean.pipe(
|
|
649
649
|
Schema.withDecodingDefault(Effect.succeed(false))
|
|
650
650
|
)
|
|
@@ -349,7 +349,7 @@ const Proto = {
|
|
|
349
349
|
),
|
|
350
350
|
Stream.unwrap
|
|
351
351
|
)
|
|
352
|
-
const handlers: Record<string, any> =
|
|
352
|
+
const handlers: Record<string, any> = Object.create(null)
|
|
353
353
|
for (const rpc_ of this.protocol.requests.values()) {
|
|
354
354
|
const rpc = rpc_ as any as Rpc.AnyWithProps
|
|
355
355
|
handlers[rpc._tag] = RpcSchema.isStreamSchema(rpc.successSchema) ? streamHandler : handler
|
|
@@ -429,5 +429,6 @@ export const primaryKeyByAddress = (options: {
|
|
|
429
429
|
readonly tag: string
|
|
430
430
|
readonly id: string
|
|
431
431
|
}): string =>
|
|
432
|
-
//
|
|
432
|
+
// storage drivers with fixed-width key columns (e.g. SqlMessageStorage)
|
|
433
|
+
// hash this composed key at their own boundary
|
|
433
434
|
`${options.address.entityType}/${options.address.entityId}/${options.tag}/${options.id}`
|
|
@@ -258,7 +258,7 @@ export class Chunk<R extends Rpc.Any> extends Data.TaggedClass("Chunk")<{
|
|
|
258
258
|
_tag: Schema.Literal("Chunk"),
|
|
259
259
|
requestId: SnowflakeFromBigInt,
|
|
260
260
|
id: SnowflakeFromBigInt,
|
|
261
|
-
sequence: Schema.
|
|
261
|
+
sequence: Schema.Int,
|
|
262
262
|
values: Schema.NonEmptyArray(success)
|
|
263
263
|
}),
|
|
264
264
|
SchemaTransformation.transform({
|
|
@@ -29,7 +29,7 @@ const TypeId = "~effect/cluster/Runner"
|
|
|
29
29
|
export class Runner extends Schema.Class<Runner>(TypeId)({
|
|
30
30
|
address: RunnerAddress,
|
|
31
31
|
groups: Schema.Array(Schema.String),
|
|
32
|
-
weight: Schema.
|
|
32
|
+
weight: Schema.Finite
|
|
33
33
|
}) {
|
|
34
34
|
/**
|
|
35
35
|
* Formatter for rendering runner values consistently.
|
|
@@ -28,7 +28,7 @@ const TypeId = "~effect/cluster/RunnerAddress"
|
|
|
28
28
|
*/
|
|
29
29
|
export class RunnerAddress extends Schema.Class<RunnerAddress>(TypeId)({
|
|
30
30
|
host: Schema.String,
|
|
31
|
-
port: Schema.
|
|
31
|
+
port: Schema.Int
|
|
32
32
|
}) {
|
|
33
33
|
/**
|
|
34
34
|
* Marks this value as a cluster runner address for runtime guards.
|
|
@@ -23,6 +23,7 @@ import * as Fiber from "../../Fiber.ts"
|
|
|
23
23
|
import * as FiberMap from "../../FiberMap.ts"
|
|
24
24
|
import { constant, flow } from "../../Function.ts"
|
|
25
25
|
import * as HashRing from "../../HashRing.ts"
|
|
26
|
+
import * as InternalRecord from "../../internal/record.ts"
|
|
26
27
|
import * as Latch from "../../Latch.ts"
|
|
27
28
|
import * as Layer from "../../Layer.ts"
|
|
28
29
|
import * as MutableHashMap from "../../MutableHashMap.ts"
|
|
@@ -55,6 +56,7 @@ import { EntityReaper } from "./internal/entityReaper.ts"
|
|
|
55
56
|
import { hashString } from "./internal/hash.ts"
|
|
56
57
|
import { internalInterruptors } from "./internal/interruptors.ts"
|
|
57
58
|
import { ResourceMap } from "./internal/resourceMap.ts"
|
|
59
|
+
import { effectiveInterval } from "./internal/shardLock.ts"
|
|
58
60
|
import * as Message from "./Message.ts"
|
|
59
61
|
import * as MessageStorage from "./MessageStorage.ts"
|
|
60
62
|
import * as Reply from "./Reply.ts"
|
|
@@ -217,6 +219,7 @@ interface EntityManagerState {
|
|
|
217
219
|
|
|
218
220
|
const make = Effect.gen(function*() {
|
|
219
221
|
const config = yield* ShardingConfig
|
|
222
|
+
const shardLockInterval = effectiveInterval(config)
|
|
220
223
|
const shardGroups = shardGroupConfig(config)
|
|
221
224
|
const getRunnerAddress = () => Option.getOrUndefined(config.runnerAddress)
|
|
222
225
|
const clock = yield* Clock
|
|
@@ -240,6 +243,8 @@ const make = Effect.gen(function*() {
|
|
|
240
243
|
|
|
241
244
|
const shardAssignments = MutableHashMap.empty<ShardId, RunnerAddress>()
|
|
242
245
|
const selfShards = MutableHashSet.empty<ShardId>()
|
|
246
|
+
// open while shard lock storage is healthy
|
|
247
|
+
const shardLocksHealthyLatch = Latch.makeUnsafe(true)
|
|
243
248
|
|
|
244
249
|
// the active shards are the ones that we have acquired the lock for
|
|
245
250
|
const acquiredShards = MutableHashSet.empty<ShardId>()
|
|
@@ -277,6 +282,9 @@ const make = Effect.gen(function*() {
|
|
|
277
282
|
// allow them to move to another runner.
|
|
278
283
|
|
|
279
284
|
const releasingShards = MutableHashSet.empty<ShardId>()
|
|
285
|
+
// Shards whose entities must be force interrupted and locks fully released
|
|
286
|
+
// before normal reacquisition.
|
|
287
|
+
const forceReleasingShards = MutableHashSet.empty<ShardId>()
|
|
280
288
|
const initialRunnerAddress = getRunnerAddress()
|
|
281
289
|
if (initialRunnerAddress) {
|
|
282
290
|
const selfAddress = initialRunnerAddress
|
|
@@ -286,37 +294,88 @@ const make = Effect.gen(function*() {
|
|
|
286
294
|
})
|
|
287
295
|
|
|
288
296
|
const releaseShardsMap = yield* FiberMap.make<ShardId>()
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
297
|
+
let forcedShardReleaseRunning = false
|
|
298
|
+
// Interrupt the shards' entities, wait for lock health, run the storage
|
|
299
|
+
// release, then clear the shards' bookkeeping.
|
|
300
|
+
const runShardRelease = Effect.fnUntraced(function*<E>(
|
|
301
|
+
shardIds: ReadonlyArray<ShardId>,
|
|
302
|
+
force: boolean,
|
|
303
|
+
release: Effect.Effect<void, E>
|
|
304
|
+
) {
|
|
305
|
+
const fibers = Arr.empty<Fiber.Fiber<void>>()
|
|
306
|
+
for (const shardId of shardIds) {
|
|
292
307
|
for (const state of entityManagers.values()) {
|
|
293
308
|
if (state.status === "closed") continue
|
|
294
|
-
fibers.push(yield* Effect.forkScoped(state.manager.interruptShard(shardId)))
|
|
309
|
+
fibers.push(yield* Effect.forkScoped(state.manager.interruptShard(shardId, { force })))
|
|
295
310
|
}
|
|
296
|
-
|
|
297
|
-
|
|
311
|
+
}
|
|
312
|
+
yield* Fiber.joinAll(fibers)
|
|
313
|
+
yield* shardLocksHealthyLatch.await
|
|
314
|
+
yield* release
|
|
315
|
+
for (const shardId of shardIds) {
|
|
298
316
|
MutableHashSet.remove(releasingShards, shardId)
|
|
317
|
+
MutableHashSet.remove(forceReleasingShards, shardId)
|
|
299
318
|
yield* storage.unregisterShardReplyHandlers(shardId)
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
|
|
319
|
+
}
|
|
320
|
+
})
|
|
321
|
+
const retryShardRelease =
|
|
322
|
+
(annotations: { readonly fiber: string; readonly shardId?: ShardId }) =>
|
|
323
|
+
<A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
303
324
|
effect.pipe(
|
|
325
|
+
Effect.sandbox,
|
|
304
326
|
Effect.tapError((cause) =>
|
|
305
|
-
Effect.logDebug(`Could not release
|
|
327
|
+
Effect.logDebug(`Could not release shards, retrying`, cause).pipe(
|
|
306
328
|
Effect.annotateLogs({
|
|
307
329
|
module: "effect/cluster/Sharding",
|
|
308
|
-
fiber: "releaseShard",
|
|
309
330
|
runner: selfAddress,
|
|
310
|
-
|
|
311
|
-
})
|
|
331
|
+
...annotations
|
|
332
|
+
}),
|
|
333
|
+
// Effect.eventually retries immediately, so space failures to
|
|
334
|
+
// avoid hot-looping while storage is unavailable.
|
|
335
|
+
Effect.andThen(Effect.sleep(50))
|
|
312
336
|
)
|
|
313
337
|
),
|
|
314
|
-
Effect.eventually
|
|
338
|
+
Effect.eventually
|
|
339
|
+
)
|
|
340
|
+
const releaseShard = Effect.fnUntraced(
|
|
341
|
+
function*(shardId: ShardId) {
|
|
342
|
+
yield* runShardRelease(
|
|
343
|
+
[shardId],
|
|
344
|
+
MutableHashSet.has(forceReleasingShards, shardId),
|
|
345
|
+
runnerStorage.release(selfAddress, shardId)
|
|
346
|
+
)
|
|
347
|
+
},
|
|
348
|
+
(effect, shardId) =>
|
|
349
|
+
effect.pipe(
|
|
350
|
+
retryShardRelease({ fiber: "releaseShard", shardId }),
|
|
315
351
|
FiberMap.run(releaseShardsMap, shardId, { onlyIfMissing: true })
|
|
316
352
|
)
|
|
317
353
|
)
|
|
354
|
+
// The forced release ends with `runnerStorage.releaseAll`, which drops
|
|
355
|
+
// every lock held by this runner. Shards must not be reacquired through the
|
|
356
|
+
// normal path while it is pending, otherwise the bulk release wipes a lock
|
|
357
|
+
// the runner already considers acquired.
|
|
358
|
+
const forcedShardReleasePending = () => forcedShardReleaseRunning || MutableHashSet.size(forceReleasingShards) > 0
|
|
359
|
+
const releaseForcedShards = Effect.suspend(() => {
|
|
360
|
+
if (forcedShardReleaseRunning || MutableHashSet.size(forceReleasingShards) === 0) {
|
|
361
|
+
return Effect.void
|
|
362
|
+
}
|
|
363
|
+
forcedShardReleaseRunning = true
|
|
364
|
+
const shardIds = [...forceReleasingShards]
|
|
365
|
+
return runShardRelease(shardIds, true, runnerStorage.releaseAll(selfAddress)).pipe(
|
|
366
|
+
retryShardRelease({ fiber: "releaseForcedShards" }),
|
|
367
|
+
Effect.ensuring(Effect.sync(() => {
|
|
368
|
+
forcedShardReleaseRunning = false
|
|
369
|
+
activeShardsLatch.openUnsafe()
|
|
370
|
+
})),
|
|
371
|
+
Effect.forkIn(shardingScope),
|
|
372
|
+
Effect.asVoid
|
|
373
|
+
)
|
|
374
|
+
})
|
|
318
375
|
const releaseShards = Effect.gen(function*() {
|
|
376
|
+
yield* releaseForcedShards
|
|
319
377
|
for (const shardId of releasingShards) {
|
|
378
|
+
if (MutableHashSet.has(forceReleasingShards, shardId)) continue
|
|
320
379
|
if (FiberMap.hasUnsafe(releaseShardsMap, shardId)) continue
|
|
321
380
|
yield* releaseShard(shardId)
|
|
322
381
|
}
|
|
@@ -336,11 +395,21 @@ const make = Effect.gen(function*() {
|
|
|
336
395
|
MutableHashSet.add(releasingShards, shardId)
|
|
337
396
|
}
|
|
338
397
|
|
|
339
|
-
if (MutableHashSet.size(releasingShards) > 0) {
|
|
398
|
+
if (MutableHashSet.size(releasingShards) > 0 || MutableHashSet.size(forceReleasingShards) > 0) {
|
|
340
399
|
yield* Effect.forkIn(syncSingletons, shardingScope)
|
|
341
400
|
yield* releaseShards
|
|
342
401
|
}
|
|
343
402
|
|
|
403
|
+
if (!shardLocksHealthyLatch.isOpen()) {
|
|
404
|
+
continue
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Wait for the pending bulk release before reacquiring, so it cannot
|
|
408
|
+
// drop a lock acquired here. `releaseForcedShards` reopens the latch.
|
|
409
|
+
if (forcedShardReleasePending()) {
|
|
410
|
+
continue
|
|
411
|
+
}
|
|
412
|
+
|
|
344
413
|
// if a shard has been assigned to this runner, we acquire it
|
|
345
414
|
const unacquiredShards = MutableHashSet.empty<ShardId>()
|
|
346
415
|
for (const shardId of selfShards) {
|
|
@@ -353,7 +422,7 @@ const make = Effect.gen(function*() {
|
|
|
353
422
|
}
|
|
354
423
|
|
|
355
424
|
const oacquired = yield* runnerStorage.acquire(selfAddress, unacquiredShards).pipe(
|
|
356
|
-
Effect.timeoutOption(
|
|
425
|
+
Effect.timeoutOption(shardLockInterval)
|
|
357
426
|
)
|
|
358
427
|
if (Option.isNone(oacquired)) {
|
|
359
428
|
activeShardsLatch.openUnsafe()
|
|
@@ -363,10 +432,19 @@ const make = Effect.gen(function*() {
|
|
|
363
432
|
const acquired = oacquired.value
|
|
364
433
|
yield* storage.resetShards(acquired).pipe(
|
|
365
434
|
Effect.ignore,
|
|
366
|
-
Effect.timeoutOption(
|
|
435
|
+
Effect.timeoutOption(shardLockInterval)
|
|
367
436
|
)
|
|
437
|
+
// A forced release can start while `acquire` is in flight, so re-check
|
|
438
|
+
// it here as well as before acquiring.
|
|
439
|
+
const forcedReleasePending = forcedShardReleasePending()
|
|
368
440
|
for (const shardId of acquired) {
|
|
369
|
-
if (
|
|
441
|
+
if (
|
|
442
|
+
!shardLocksHealthyLatch.isOpen() ||
|
|
443
|
+
forcedReleasePending ||
|
|
444
|
+
MutableHashSet.has(releasingShards, shardId) ||
|
|
445
|
+
!MutableHashSet.has(selfShards, shardId)
|
|
446
|
+
) {
|
|
447
|
+
MutableHashSet.add(releasingShards, shardId)
|
|
370
448
|
continue
|
|
371
449
|
}
|
|
372
450
|
MutableHashSet.add(acquiredShards, shardId)
|
|
@@ -392,8 +470,52 @@ const make = Effect.gen(function*() {
|
|
|
392
470
|
Effect.forkIn(shardingScope)
|
|
393
471
|
)
|
|
394
472
|
|
|
395
|
-
|
|
396
|
-
|
|
473
|
+
const markShardLocksUnhealthy = (cause: Cause.Cause<unknown>) =>
|
|
474
|
+
Effect.suspend(() => {
|
|
475
|
+
if (!shardLocksHealthyLatch.closeUnsafe()) return Effect.void
|
|
476
|
+
|
|
477
|
+
const affectedShards = MutableHashSet.fromIterable([...acquiredShards, ...releasingShards])
|
|
478
|
+
MutableHashSet.clear(selfShards)
|
|
479
|
+
MutableHashSet.clear(acquiredShards)
|
|
480
|
+
for (const shardId of affectedShards) {
|
|
481
|
+
MutableHashSet.add(releasingShards, shardId)
|
|
482
|
+
MutableHashSet.add(forceReleasingShards, shardId)
|
|
483
|
+
}
|
|
484
|
+
ClusterMetrics.shards.updateUnsafe(BigInt(0), Context.empty())
|
|
485
|
+
activeShardsLatch.openUnsafe()
|
|
486
|
+
|
|
487
|
+
return Effect.gen(function*() {
|
|
488
|
+
yield* Effect.logError("Shard lock storage is unhealthy", cause)
|
|
489
|
+
yield* Effect.forkIn(syncSingletons, shardingScope, { startImmediately: true })
|
|
490
|
+
|
|
491
|
+
for (const shardId of affectedShards) {
|
|
492
|
+
for (const state of entityManagers.values()) {
|
|
493
|
+
if (state.status === "closed") continue
|
|
494
|
+
yield* Effect.forkIn(
|
|
495
|
+
state.manager.interruptShard(shardId, { force: true }),
|
|
496
|
+
shardingScope,
|
|
497
|
+
{ startImmediately: true }
|
|
498
|
+
)
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
activeShardsLatch.openUnsafe()
|
|
502
|
+
})
|
|
503
|
+
})
|
|
504
|
+
|
|
505
|
+
const markShardLocksHealthy = Effect.suspend(() => {
|
|
506
|
+
if (!shardLocksHealthyLatch.openUnsafe()) return Effect.void
|
|
507
|
+
|
|
508
|
+
MutableHashSet.clear(selfShards)
|
|
509
|
+
MutableHashMap.forEach(shardAssignments, (runner, shardId) => {
|
|
510
|
+
if (isLocalRunner(runner)) {
|
|
511
|
+
MutableHashSet.add(selfShards, shardId)
|
|
512
|
+
}
|
|
513
|
+
})
|
|
514
|
+
activeShardsLatch.openUnsafe()
|
|
515
|
+
return Effect.logInfo("Shard lock storage has recovered")
|
|
516
|
+
})
|
|
517
|
+
|
|
518
|
+
const refreshShardLocks = Effect.suspend(() =>
|
|
397
519
|
runnerStorage.refresh(selfAddress, [
|
|
398
520
|
...acquiredShards,
|
|
399
521
|
...releasingShards
|
|
@@ -421,12 +543,20 @@ const make = Effect.gen(function*() {
|
|
|
421
543
|
times: 5,
|
|
422
544
|
schedule: Schedule.spaced(50)
|
|
423
545
|
}),
|
|
424
|
-
Effect.
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
Effect.
|
|
546
|
+
Effect.timeout(shardLockInterval),
|
|
547
|
+
Effect.catchCause(markShardLocksUnhealthy)
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
const probeShardLocks = runnerStorage.refresh(selfAddress, []).pipe(
|
|
551
|
+
Effect.timeout(shardLockInterval),
|
|
552
|
+
Effect.andThen(markShardLocksHealthy),
|
|
553
|
+
Effect.catchCause(() => Effect.void)
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
// Refresh shard locks at the lease-safe interval, or probe storage while
|
|
557
|
+
// lock ownership is uncertain.
|
|
558
|
+
yield* Effect.suspend(() => shardLocksHealthyLatch.isOpen() ? refreshShardLocks : probeShardLocks).pipe(
|
|
559
|
+
Effect.repeat(Schedule.fixed(shardLockInterval)),
|
|
430
560
|
Effect.forever,
|
|
431
561
|
Effect.forkIn(shardingScope)
|
|
432
562
|
)
|
|
@@ -439,11 +569,6 @@ const make = Effect.gen(function*() {
|
|
|
439
569
|
)
|
|
440
570
|
}
|
|
441
571
|
|
|
442
|
-
const clearSelfShards = Effect.sync(() => {
|
|
443
|
-
MutableHashSet.clear(selfShards)
|
|
444
|
-
activeShardsLatch.openUnsafe()
|
|
445
|
-
})
|
|
446
|
-
|
|
447
572
|
// --- Storage inbox ---
|
|
448
573
|
//
|
|
449
574
|
// Responsible for reading unprocessed messages from storage and sending them
|
|
@@ -977,7 +1102,7 @@ const make = Effect.gen(function*() {
|
|
|
977
1102
|
if (newAssignments) {
|
|
978
1103
|
const runner = newAssignments[i]
|
|
979
1104
|
MutableHashMap.set(shardAssignments, shard, runner)
|
|
980
|
-
if (isLocalRunner(runner)) {
|
|
1105
|
+
if (shardLocksHealthyLatch.isOpen() && isLocalRunner(runner)) {
|
|
981
1106
|
MutableHashSet.add(selfShards, shard)
|
|
982
1107
|
}
|
|
983
1108
|
} else {
|
|
@@ -1167,12 +1292,14 @@ const make = Effect.gen(function*() {
|
|
|
1167
1292
|
return entity.protocol.requests.has(p as string)
|
|
1168
1293
|
},
|
|
1169
1294
|
get(target, p) {
|
|
1170
|
-
if (p
|
|
1295
|
+
if (Object.hasOwn(target, p)) {
|
|
1171
1296
|
return target[p]
|
|
1172
1297
|
} else if (!entity.protocol.requests.has(p as string)) {
|
|
1173
1298
|
return undefined
|
|
1174
1299
|
}
|
|
1175
|
-
|
|
1300
|
+
const method = (payload: any, options?: {}) => clientFn(p as string, payload, options)
|
|
1301
|
+
InternalRecord.assignProperty(target, p, method)
|
|
1302
|
+
return method
|
|
1176
1303
|
}
|
|
1177
1304
|
})
|
|
1178
1305
|
}
|
|
@@ -70,7 +70,11 @@ export class ShardingConfig extends Context.Service<ShardingConfig, {
|
|
|
70
70
|
*/
|
|
71
71
|
readonly shardsPerGroup: number
|
|
72
72
|
/**
|
|
73
|
-
*
|
|
73
|
+
* The maximum interval between shard lock refreshes.
|
|
74
|
+
*
|
|
75
|
+
* The runner may shorten this interval to one third of
|
|
76
|
+
* `shardLockExpiration` to preserve enough time to stop entities safely if
|
|
77
|
+
* lock storage becomes unavailable.
|
|
74
78
|
*/
|
|
75
79
|
readonly shardLockRefreshInterval: Duration.Input
|
|
76
80
|
/**
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import * as Layer from "effect/Layer"
|
|
14
14
|
import type { ConfigError } from "../../Config.ts"
|
|
15
|
+
import type * as Crypto from "../../Crypto.ts"
|
|
15
16
|
import type * as SqlClient from "../sql/SqlClient.ts"
|
|
16
17
|
import type * as MessageStorage from "./MessageStorage.ts"
|
|
17
18
|
import * as RunnerHealth from "./RunnerHealth.ts"
|
|
@@ -42,7 +43,8 @@ import * as SqlRunnerStorage from "./SqlRunnerStorage.ts"
|
|
|
42
43
|
* **Gotchas**
|
|
43
44
|
*
|
|
44
45
|
* - Even when `runnerStorage` is `"memory"`, message storage remains
|
|
45
|
-
* SQL-backed, so callers must still provide `SqlClient
|
|
46
|
+
* SQL-backed, so callers must still provide `SqlClient` and `Crypto.Crypto`
|
|
47
|
+
* (used to hash over-length message deduplication keys).
|
|
46
48
|
* - Runner communication and runner health are no-op services, so this layer is
|
|
47
49
|
* for single-process use rather than multi-runner coordination.
|
|
48
50
|
*
|
|
@@ -62,7 +64,7 @@ export const layer = (options?: {
|
|
|
62
64
|
| Runners.Runners
|
|
63
65
|
| MessageStorage.MessageStorage,
|
|
64
66
|
ConfigError,
|
|
65
|
-
SqlClient.SqlClient
|
|
67
|
+
SqlClient.SqlClient | Crypto.Crypto
|
|
66
68
|
> =>
|
|
67
69
|
Sharding.layer.pipe(
|
|
68
70
|
Layer.provideMerge(Runners.layerNoop),
|