alchemy 2.0.0-beta.59 → 2.0.0-beta.60
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 +1 -1
- package/bin/exec.js +684 -758
- package/bin/exec.js.map +1 -1
- package/lib/AWS/AuthProvider.d.ts.map +1 -1
- package/lib/AWS/AuthProvider.js +22 -9
- package/lib/AWS/AuthProvider.js.map +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.js +1 -1
- package/lib/AWS/CloudWatch/Dashboard.d.ts.map +1 -1
- package/lib/AWS/CloudWatch/Dashboard.js +4 -1
- package/lib/AWS/CloudWatch/Dashboard.js.map +1 -1
- package/lib/AWS/Credentials.d.ts +58 -2
- package/lib/AWS/Credentials.d.ts.map +1 -1
- package/lib/AWS/Credentials.js +124 -2
- package/lib/AWS/Credentials.js.map +1 -1
- package/lib/AWS/EC2/Image.d.ts.map +1 -1
- package/lib/AWS/EC2/Image.js +4 -1
- package/lib/AWS/EC2/Image.js.map +1 -1
- package/lib/AWS/EC2/Instance.d.ts +4 -3
- package/lib/AWS/EC2/Instance.d.ts.map +1 -1
- package/lib/AWS/EC2/Instance.js +4 -2
- package/lib/AWS/EC2/Instance.js.map +1 -1
- package/lib/AWS/EC2/KeyPair.d.ts +87 -0
- package/lib/AWS/EC2/KeyPair.d.ts.map +1 -0
- package/lib/AWS/EC2/KeyPair.js +198 -0
- package/lib/AWS/EC2/KeyPair.js.map +1 -0
- package/lib/AWS/EC2/NetworkAcl.d.ts.map +1 -1
- package/lib/AWS/EC2/NetworkAcl.js +4 -1
- package/lib/AWS/EC2/NetworkAcl.js.map +1 -1
- package/lib/AWS/EC2/SecurityGroup.d.ts.map +1 -1
- package/lib/AWS/EC2/SecurityGroup.js +4 -1
- package/lib/AWS/EC2/SecurityGroup.js.map +1 -1
- package/lib/AWS/EC2/SecurityGroupRule.d.ts.map +1 -1
- package/lib/AWS/EC2/SecurityGroupRule.js +14 -7
- package/lib/AWS/EC2/SecurityGroupRule.js.map +1 -1
- package/lib/AWS/EC2/Subnet.d.ts.map +1 -1
- package/lib/AWS/EC2/Subnet.js +29 -5
- package/lib/AWS/EC2/Subnet.js.map +1 -1
- package/lib/AWS/EC2/hosted.d.ts +8 -10
- package/lib/AWS/EC2/hosted.d.ts.map +1 -1
- package/lib/AWS/EC2/hosted.js +81 -67
- package/lib/AWS/EC2/hosted.js.map +1 -1
- package/lib/AWS/EC2/index.d.ts +1 -0
- package/lib/AWS/EC2/index.d.ts.map +1 -1
- package/lib/AWS/EC2/index.js +1 -0
- package/lib/AWS/EC2/index.js.map +1 -1
- package/lib/AWS/ECS/Task.d.ts +8 -8
- package/lib/AWS/ECS/Task.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.js +82 -56
- package/lib/AWS/ECS/Task.js.map +1 -1
- package/lib/AWS/IAM/Role.d.ts +19 -4
- package/lib/AWS/IAM/Role.d.ts.map +1 -1
- package/lib/AWS/IAM/Role.js +81 -16
- package/lib/AWS/IAM/Role.js.map +1 -1
- package/lib/AWS/Lambda/CreateAuthToken.d.ts +28 -0
- package/lib/AWS/Lambda/CreateAuthToken.d.ts.map +1 -0
- package/lib/AWS/Lambda/CreateAuthToken.js +3 -0
- package/lib/AWS/Lambda/CreateAuthToken.js.map +1 -0
- package/lib/AWS/Lambda/CreateAuthTokenHttp.d.ts +3 -0
- package/lib/AWS/Lambda/CreateAuthTokenHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/CreateAuthTokenHttp.js +11 -0
- package/lib/AWS/Lambda/CreateAuthTokenHttp.js.map +1 -0
- package/lib/AWS/Lambda/CreateShellAuthToken.d.ts +27 -0
- package/lib/AWS/Lambda/CreateShellAuthToken.d.ts.map +1 -0
- package/lib/AWS/Lambda/CreateShellAuthToken.js +3 -0
- package/lib/AWS/Lambda/CreateShellAuthToken.js.map +1 -0
- package/lib/AWS/Lambda/CreateShellAuthTokenHttp.d.ts +3 -0
- package/lib/AWS/Lambda/CreateShellAuthTokenHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/CreateShellAuthTokenHttp.js +11 -0
- package/lib/AWS/Lambda/CreateShellAuthTokenHttp.js.map +1 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersion.d.ts +18 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersion.d.ts.map +1 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersion.js +3 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersion.js.map +1 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersionHttp.d.ts +3 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersionHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersionHttp.js +12 -0
- package/lib/AWS/Lambda/DeleteMicrovmImageVersionHttp.js.map +1 -0
- package/lib/AWS/Lambda/Function.d.ts +4 -2
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +10 -5
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/GetMicrovm.d.ts +23 -0
- package/lib/AWS/Lambda/GetMicrovm.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovm.js +3 -0
- package/lib/AWS/Lambda/GetMicrovm.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmHttp.d.ts +3 -0
- package/lib/AWS/Lambda/GetMicrovmHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmHttp.js +13 -0
- package/lib/AWS/Lambda/GetMicrovmHttp.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImage.d.ts +23 -0
- package/lib/AWS/Lambda/GetMicrovmImage.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImage.js +3 -0
- package/lib/AWS/Lambda/GetMicrovmImage.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuild.d.ts +18 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuild.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuild.js +3 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuild.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuildHttp.d.ts +3 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuildHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuildHttp.js +12 -0
- package/lib/AWS/Lambda/GetMicrovmImageBuildHttp.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageHttp.d.ts +3 -0
- package/lib/AWS/Lambda/GetMicrovmImageHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageHttp.js +12 -0
- package/lib/AWS/Lambda/GetMicrovmImageHttp.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersion.d.ts +18 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersion.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersion.js +3 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersion.js.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersionHttp.d.ts +3 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersionHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersionHttp.js +12 -0
- package/lib/AWS/Lambda/GetMicrovmImageVersionHttp.js.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersions.d.ts +17 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersions.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersions.js +3 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersions.js.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersionsHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersionsHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersionsHttp.js +10 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImageVersionsHttp.js.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImages.d.ts +17 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImages.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImages.js +3 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImages.js.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImagesHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImagesHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImagesHttp.js +10 -0
- package/lib/AWS/Lambda/ListManagedMicrovmImagesHttp.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuilds.d.ts +19 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuilds.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuilds.js +3 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuilds.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuildsHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuildsHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuildsHttp.js +12 -0
- package/lib/AWS/Lambda/ListMicrovmImageBuildsHttp.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersions.d.ts +18 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersions.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersions.js +3 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersions.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersionsHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersionsHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersionsHttp.js +12 -0
- package/lib/AWS/Lambda/ListMicrovmImageVersionsHttp.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovms.d.ts +23 -0
- package/lib/AWS/Lambda/ListMicrovms.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovms.js +3 -0
- package/lib/AWS/Lambda/ListMicrovms.js.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmsHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ListMicrovmsHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ListMicrovmsHttp.js +12 -0
- package/lib/AWS/Lambda/ListMicrovmsHttp.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmBinding.d.ts +61 -0
- package/lib/AWS/Lambda/MicrovmBinding.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmBinding.js +279 -0
- package/lib/AWS/Lambda/MicrovmBinding.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmBundle.d.ts +62 -0
- package/lib/AWS/Lambda/MicrovmBundle.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmBundle.js +197 -0
- package/lib/AWS/Lambda/MicrovmBundle.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmImage.d.ts +488 -0
- package/lib/AWS/Lambda/MicrovmImage.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmImage.js +381 -0
- package/lib/AWS/Lambda/MicrovmImage.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmProvider.d.ts +7 -0
- package/lib/AWS/Lambda/MicrovmProvider.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmProvider.js +384 -0
- package/lib/AWS/Lambda/MicrovmProvider.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmRpc.d.ts +50 -0
- package/lib/AWS/Lambda/MicrovmRpc.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmRpc.js +50 -0
- package/lib/AWS/Lambda/MicrovmRpc.js.map +1 -0
- package/lib/AWS/Lambda/MicrovmRuntimeContext.d.ts +9 -0
- package/lib/AWS/Lambda/MicrovmRuntimeContext.d.ts.map +1 -0
- package/lib/AWS/Lambda/MicrovmRuntimeContext.js +67 -0
- package/lib/AWS/Lambda/MicrovmRuntimeContext.js.map +1 -0
- package/lib/AWS/Lambda/NetworkConnector.d.ts +142 -0
- package/lib/AWS/Lambda/NetworkConnector.d.ts.map +1 -0
- package/lib/AWS/Lambda/NetworkConnector.js +283 -0
- package/lib/AWS/Lambda/NetworkConnector.js.map +1 -0
- package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/QueueEventSource.js +1 -0
- package/lib/AWS/Lambda/QueueEventSource.js.map +1 -1
- package/lib/AWS/Lambda/ResumeMicrovm.d.ts +23 -0
- package/lib/AWS/Lambda/ResumeMicrovm.d.ts.map +1 -0
- package/lib/AWS/Lambda/ResumeMicrovm.js +3 -0
- package/lib/AWS/Lambda/ResumeMicrovm.js.map +1 -0
- package/lib/AWS/Lambda/ResumeMicrovmHttp.d.ts +3 -0
- package/lib/AWS/Lambda/ResumeMicrovmHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/ResumeMicrovmHttp.js +11 -0
- package/lib/AWS/Lambda/ResumeMicrovmHttp.js.map +1 -0
- package/lib/AWS/Lambda/RunMicrovm.d.ts +33 -0
- package/lib/AWS/Lambda/RunMicrovm.d.ts.map +1 -0
- package/lib/AWS/Lambda/RunMicrovm.js +3 -0
- package/lib/AWS/Lambda/RunMicrovm.js.map +1 -0
- package/lib/AWS/Lambda/RunMicrovmHttp.d.ts +3 -0
- package/lib/AWS/Lambda/RunMicrovmHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/RunMicrovmHttp.js +13 -0
- package/lib/AWS/Lambda/RunMicrovmHttp.js.map +1 -0
- package/lib/AWS/Lambda/SuspendMicrovm.d.ts +23 -0
- package/lib/AWS/Lambda/SuspendMicrovm.d.ts.map +1 -0
- package/lib/AWS/Lambda/SuspendMicrovm.js +3 -0
- package/lib/AWS/Lambda/SuspendMicrovm.js.map +1 -0
- package/lib/AWS/Lambda/SuspendMicrovmHttp.d.ts +3 -0
- package/lib/AWS/Lambda/SuspendMicrovmHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/SuspendMicrovmHttp.js +11 -0
- package/lib/AWS/Lambda/SuspendMicrovmHttp.js.map +1 -0
- package/lib/AWS/Lambda/TerminateMicrovm.d.ts +23 -0
- package/lib/AWS/Lambda/TerminateMicrovm.d.ts.map +1 -0
- package/lib/AWS/Lambda/TerminateMicrovm.js +3 -0
- package/lib/AWS/Lambda/TerminateMicrovm.js.map +1 -0
- package/lib/AWS/Lambda/TerminateMicrovmHttp.d.ts +3 -0
- package/lib/AWS/Lambda/TerminateMicrovmHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/TerminateMicrovmHttp.js +11 -0
- package/lib/AWS/Lambda/TerminateMicrovmHttp.js.map +1 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersion.d.ts +18 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersion.d.ts.map +1 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersion.js +3 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersion.js.map +1 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersionHttp.d.ts +3 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersionHttp.d.ts.map +1 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersionHttp.js +12 -0
- package/lib/AWS/Lambda/UpdateMicrovmImageVersionHttp.js.map +1 -0
- package/lib/AWS/Lambda/index.d.ts +38 -0
- package/lib/AWS/Lambda/index.d.ts.map +1 -1
- package/lib/AWS/Lambda/index.js +38 -0
- package/lib/AWS/Lambda/index.js.map +1 -1
- package/lib/AWS/Providers.d.ts +1 -1
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +6 -2
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/AWS/RDS/DBClusterParameterGroup.d.ts.map +1 -1
- package/lib/AWS/RDS/DBClusterParameterGroup.js +4 -1
- package/lib/AWS/RDS/DBClusterParameterGroup.js.map +1 -1
- package/lib/AWS/RDS/DBParameterGroup.d.ts.map +1 -1
- package/lib/AWS/RDS/DBParameterGroup.js +4 -1
- package/lib/AWS/RDS/DBParameterGroup.js.map +1 -1
- package/lib/AWS/Region.d.ts.map +1 -1
- package/lib/AWS/Region.js +6 -1
- package/lib/AWS/Region.js.map +1 -1
- package/lib/AWS/S3/Bucket.d.ts.map +1 -1
- package/lib/AWS/S3/Bucket.js +46 -26
- package/lib/AWS/S3/Bucket.js.map +1 -1
- package/lib/AlchemyContext.d.ts +7 -0
- package/lib/AlchemyContext.d.ts.map +1 -1
- package/lib/AlchemyContext.js.map +1 -1
- package/lib/Apply.js +2 -2
- package/lib/Apply.js.map +1 -1
- package/lib/Axiom/Chart.d.ts +9 -1
- package/lib/Axiom/Chart.d.ts.map +1 -1
- package/lib/Bundle/Bundle.d.ts +1 -0
- package/lib/Bundle/Bundle.d.ts.map +1 -1
- package/lib/Bundle/Bundle.js +1 -1
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Bundle/TempRoot.d.ts +9 -0
- package/lib/Bundle/TempRoot.d.ts.map +1 -1
- package/lib/Bundle/TempRoot.js +22 -0
- package/lib/Bundle/TempRoot.js.map +1 -1
- package/lib/Bundle/Vite.d.ts +20 -0
- package/lib/Bundle/Vite.d.ts.map +1 -0
- package/lib/Bundle/Vite.js +130 -0
- package/lib/Bundle/Vite.js.map +1 -0
- package/lib/Bundle/index.d.ts +0 -1
- package/lib/Bundle/index.d.ts.map +1 -1
- package/lib/Bundle/index.js +0 -1
- package/lib/Bundle/index.js.map +1 -1
- package/lib/Cli/Event.d.ts +1 -1
- package/lib/Cli/Event.d.ts.map +1 -1
- package/lib/Cli/LoggingCli.d.ts.map +1 -1
- package/lib/Cli/LoggingCli.js +3 -0
- package/lib/Cli/LoggingCli.js.map +1 -1
- package/lib/Cli/commands/_shared.d.ts.map +1 -1
- package/lib/Cli/commands/_shared.js +7 -1
- package/lib/Cli/commands/_shared.js.map +1 -1
- package/lib/Cli/commands/cloudflare.d.ts +2 -2
- package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
- package/lib/Cli/commands/cloudflare.js +21 -2
- package/lib/Cli/commands/cloudflare.js.map +1 -1
- package/lib/Cli/commands/deploy.d.ts.map +1 -1
- package/lib/Cli/commands/deploy.js +4 -1
- package/lib/Cli/commands/deploy.js.map +1 -1
- package/lib/Cli/tui/components/PlanProgress.js +5 -3
- package/lib/Cli/tui/components/PlanProgress.js.map +1 -1
- package/lib/Cloudflare/AI/Gateway.d.ts +1 -1
- package/lib/Cloudflare/AI/Gateway.js +1 -1
- package/lib/Cloudflare/AI/Search.d.ts +1 -1
- package/lib/Cloudflare/AI/Search.js +1 -1
- package/lib/Cloudflare/AI/SearchInstance.d.ts +1 -1
- package/lib/Cloudflare/AI/SearchInstance.js +1 -1
- package/lib/Cloudflare/AI/SearchNamespace.d.ts +1 -1
- package/lib/Cloudflare/AI/SearchNamespace.js +1 -1
- package/lib/Cloudflare/AI/SearchToken.d.ts.map +1 -1
- package/lib/Cloudflare/AI/SearchToken.js +6 -1
- package/lib/Cloudflare/AI/SearchToken.js.map +1 -1
- package/lib/Cloudflare/Access/Application.d.ts.map +1 -1
- package/lib/Cloudflare/Access/Application.js +51 -11
- package/lib/Cloudflare/Access/Application.js.map +1 -1
- package/lib/Cloudflare/Alerting/Webhook.d.ts.map +1 -1
- package/lib/Cloudflare/Alerting/Webhook.js +9 -2
- package/lib/Cloudflare/Alerting/Webhook.js.map +1 -1
- package/lib/Cloudflare/AnalyticsEngine/WriteDataset.d.ts +2 -2
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js +5 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js +1 -1
- package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
- package/lib/Cloudflare/Containers/Container.d.ts +46 -4
- package/lib/Cloudflare/Containers/Container.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/Container.js +27 -3
- package/lib/Cloudflare/Containers/Container.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerApplication.d.ts +25 -19
- package/lib/Cloudflare/Containers/ContainerApplication.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/ContainerApplication.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerBundle.d.ts +1 -2
- package/lib/Cloudflare/Containers/ContainerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/ContainerBundle.js +2 -4
- package/lib/Cloudflare/Containers/ContainerBundle.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerPlatform.js +2 -2
- package/lib/Cloudflare/Containers/ContainerPlatform.js.map +1 -1
- package/lib/Cloudflare/Containers/ContainerProvider.d.ts +2 -1
- package/lib/Cloudflare/Containers/ContainerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/ContainerProvider.js +51 -35
- package/lib/Cloudflare/Containers/ContainerProvider.js.map +1 -1
- package/lib/Cloudflare/Containers/LocalContainerProvider.d.ts +3 -1
- package/lib/Cloudflare/Containers/LocalContainerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/LocalContainerProvider.js +11 -4
- package/lib/Cloudflare/Containers/LocalContainerProvider.js.map +1 -1
- package/lib/Cloudflare/Containers/StartContainer.d.ts.map +1 -1
- package/lib/Cloudflare/Containers/StartContainer.js +222 -15
- package/lib/Cloudflare/Containers/StartContainer.js.map +1 -1
- package/lib/Cloudflare/DNS/ReadDns.d.ts +1 -1
- package/lib/Cloudflare/DNS/ReadWriteDns.d.ts +1 -1
- package/lib/Cloudflare/DNS/WriteDns.d.ts +1 -1
- package/lib/Cloudflare/Flagship/App.d.ts +1 -1
- package/lib/Cloudflare/Flagship/App.js +1 -1
- package/lib/Cloudflare/Images/Images.d.ts +1 -1
- package/lib/Cloudflare/Local.js +2 -1
- package/lib/Cloudflare/Local.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +2 -1
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Queues/Consumer.d.ts +2 -2
- package/lib/Cloudflare/Queues/Consumer.d.ts.map +1 -1
- package/lib/Cloudflare/Queues/Consumer.js +21 -13
- package/lib/Cloudflare/Queues/Consumer.js.map +1 -1
- package/lib/Cloudflare/Queues/Queue.d.ts +1 -1
- package/lib/Cloudflare/Queues/Queue.js +1 -1
- package/lib/Cloudflare/R2/Bucket.d.ts +2 -2
- package/lib/Cloudflare/R2/Bucket.js +2 -2
- package/lib/Cloudflare/StateStore/Api.d.ts +4 -1
- package/lib/Cloudflare/StateStore/Api.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Api.js +6 -4
- package/lib/Cloudflare/StateStore/Api.js.map +1 -1
- package/lib/Cloudflare/StateStore/State.d.ts +28 -2
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/State.js +122 -19
- package/lib/Cloudflare/StateStore/State.js.map +1 -1
- package/lib/Cloudflare/Website/Vite.d.ts +26 -23
- package/lib/Cloudflare/Website/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Website/Vite.js +25 -7
- package/lib/Cloudflare/Website/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Binding.d.ts +1 -1
- package/lib/Cloudflare/Workers/Browser.d.ts +1 -1
- package/lib/Cloudflare/Workers/DurableObject.d.ts +54 -3
- package/lib/Cloudflare/Workers/DurableObject.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObject.js +54 -3
- package/lib/Cloudflare/Workers/DurableObject.js.map +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts +4 -2
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +55 -6
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/RpcDurableObject.d.ts +3 -3
- package/lib/Cloudflare/Workers/RpcDurableObject.js +3 -3
- package/lib/Cloudflare/Workers/RpcWorker.d.ts +4 -4
- package/lib/Cloudflare/Workers/RpcWorker.js +4 -4
- package/lib/Cloudflare/Workers/ScheduledEvents.js +1 -1
- package/lib/Cloudflare/Workers/ScheduledEvents.js.map +1 -1
- package/lib/Cloudflare/Workers/VersionMetadata.d.ts +1 -1
- package/lib/Cloudflare/Workers/Vite.d.ts +1 -4
- package/lib/Cloudflare/Workers/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Vite.js +19 -38
- package/lib/Cloudflare/Workers/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +73 -13
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +9 -9
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts +2 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +31 -0
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +7 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerLoader.d.ts +1 -1
- package/lib/Cloudflare/Workers/WorkerLoader.js +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts +10 -0
- package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerProvider.js +240 -60
- package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.js +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.js.map +1 -1
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.d.ts +44 -2
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js +44 -2
- package/lib/Cloudflare/WorkersForPlatforms/DispatchNamespace.js.map +1 -1
- package/lib/Cloudflare/WorkersForPlatforms/Get.d.ts +77 -0
- package/lib/Cloudflare/WorkersForPlatforms/Get.d.ts.map +1 -0
- package/lib/Cloudflare/WorkersForPlatforms/Get.js +9 -0
- package/lib/Cloudflare/WorkersForPlatforms/Get.js.map +1 -0
- package/lib/Cloudflare/WorkersForPlatforms/GetBinding.d.ts +9 -0
- package/lib/Cloudflare/WorkersForPlatforms/GetBinding.d.ts.map +1 -0
- package/lib/Cloudflare/WorkersForPlatforms/GetBinding.js +43 -0
- package/lib/Cloudflare/WorkersForPlatforms/GetBinding.js.map +1 -0
- package/lib/Cloudflare/WorkersForPlatforms/index.d.ts +2 -0
- package/lib/Cloudflare/WorkersForPlatforms/index.d.ts.map +1 -1
- package/lib/Cloudflare/WorkersForPlatforms/index.js +2 -0
- package/lib/Cloudflare/WorkersForPlatforms/index.js.map +1 -1
- package/lib/Cloudflare/Workflows/Workflow.d.ts +107 -1
- package/lib/Cloudflare/Workflows/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workflows/Workflow.js +93 -6
- package/lib/Cloudflare/Workflows/Workflow.js.map +1 -1
- package/lib/Command/Build.d.ts.map +1 -1
- package/lib/Command/Build.js +24 -1
- package/lib/Command/Build.js.map +1 -1
- package/lib/Docker/Container.d.ts +156 -0
- package/lib/Docker/Container.d.ts.map +1 -0
- package/lib/Docker/Container.js +221 -0
- package/lib/Docker/Container.js.map +1 -0
- package/lib/Docker/Docker.d.ts +199 -0
- package/lib/Docker/Docker.d.ts.map +1 -0
- package/lib/Docker/Docker.js +224 -0
- package/lib/Docker/Docker.js.map +1 -0
- package/lib/Docker/Image.d.ts +109 -0
- package/lib/Docker/Image.d.ts.map +1 -0
- package/lib/Docker/Image.js +150 -0
- package/lib/Docker/Image.js.map +1 -0
- package/lib/Docker/Network.d.ts +61 -0
- package/lib/Docker/Network.d.ts.map +1 -0
- package/lib/Docker/Network.js +99 -0
- package/lib/Docker/Network.js.map +1 -0
- package/lib/Docker/Providers.d.ts +15 -0
- package/lib/Docker/Providers.d.ts.map +1 -0
- package/lib/Docker/Providers.js +18 -0
- package/lib/Docker/Providers.js.map +1 -0
- package/lib/Docker/Registry.d.ts +30 -0
- package/lib/Docker/Registry.d.ts.map +1 -0
- package/lib/Docker/Registry.js +44 -0
- package/lib/Docker/Registry.js.map +1 -0
- package/lib/Docker/RemoteImage.d.ts +102 -0
- package/lib/Docker/RemoteImage.d.ts.map +1 -0
- package/lib/Docker/RemoteImage.js +123 -0
- package/lib/Docker/RemoteImage.js.map +1 -0
- package/lib/Docker/Volume.d.ts +81 -0
- package/lib/Docker/Volume.d.ts.map +1 -0
- package/lib/Docker/Volume.js +107 -0
- package/lib/Docker/Volume.js.map +1 -0
- package/lib/Docker/index.d.ts +9 -0
- package/lib/Docker/index.d.ts.map +1 -0
- package/lib/Docker/index.js +8 -0
- package/lib/Docker/index.js.map +1 -0
- package/lib/Local/ProviderLayer.d.ts +1 -0
- package/lib/Local/ProviderLayer.d.ts.map +1 -1
- package/lib/Local/ProviderLayer.js +1 -0
- package/lib/Local/ProviderLayer.js.map +1 -1
- package/lib/Neon/Branch.d.ts +5 -0
- package/lib/Neon/Branch.d.ts.map +1 -1
- package/lib/Neon/Branch.js +8 -1
- package/lib/Neon/Branch.js.map +1 -1
- package/lib/Neon/Project.d.ts +5 -0
- package/lib/Neon/Project.d.ts.map +1 -1
- package/lib/Neon/Project.js +6 -0
- package/lib/Neon/Project.js.map +1 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +3 -1
- package/lib/Plan.js.map +1 -1
- package/lib/Planetscale/Branch.d.ts +10 -0
- package/lib/Planetscale/Branch.d.ts.map +1 -1
- package/lib/Planetscale/Branch.js +43 -1
- package/lib/Planetscale/Branch.js.map +1 -1
- package/lib/Planetscale/Postgres/PostgresBranch.d.ts +5 -0
- package/lib/Planetscale/Postgres/PostgresBranch.d.ts.map +1 -1
- package/lib/Planetscale/Postgres/PostgresBranch.js.map +1 -1
- package/lib/Planetscale/Postgres/PostgresRole.d.ts +3 -1
- package/lib/Planetscale/Postgres/PostgresRole.d.ts.map +1 -1
- package/lib/Planetscale/Postgres/PostgresRole.js +8 -0
- package/lib/Planetscale/Postgres/PostgresRole.js.map +1 -1
- package/lib/Planetscale/Util.d.ts +3 -124
- package/lib/Planetscale/Util.d.ts.map +1 -1
- package/lib/Platform.d.ts +2 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +37 -10
- package/lib/Platform.js.map +1 -1
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js.map +1 -1
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +3 -1
- package/lib/Resource.js.map +1 -1
- package/lib/Rpc.d.ts +1 -1
- package/lib/Server/Process.d.ts +29 -1
- package/lib/Server/Process.d.ts.map +1 -1
- package/lib/Server/Process.js +48 -1
- package/lib/Server/Process.js.map +1 -1
- package/lib/Stack.d.ts +4 -1
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +1 -1
- package/lib/Stack.js.map +1 -1
- package/lib/State/HttpStateApi.d.ts +10 -10
- package/lib/Tags.d.ts +6 -0
- package/lib/Tags.d.ts.map +1 -1
- package/lib/Tags.js +6 -0
- package/lib/Tags.js.map +1 -1
- package/lib/Telemetry/Attributes.d.ts.map +1 -1
- package/lib/Telemetry/Attributes.js +6 -15
- package/lib/Telemetry/Attributes.js.map +1 -1
- package/lib/Test/Bun.d.ts +1 -0
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +1 -0
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/Core.d.ts +1 -0
- package/lib/Test/Core.d.ts.map +1 -1
- package/lib/Test/Core.js +3 -2
- package/lib/Test/Core.js.map +1 -1
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +1 -0
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Util/effect.js.map +1 -1
- package/lib/Util/proxy-chain.d.ts +1 -0
- package/lib/Util/proxy-chain.d.ts.map +1 -1
- package/lib/Util/proxy-chain.js +1 -0
- package/lib/Util/proxy-chain.js.map +1 -1
- package/package.json +26 -10
- package/src/AWS/AuthProvider.ts +32 -17
- package/src/AWS/AutoScaling/LaunchTemplate.ts +1 -1
- package/src/AWS/CloudWatch/Dashboard.ts +4 -1
- package/src/AWS/Credentials.ts +178 -2
- package/src/AWS/EC2/Image.ts +4 -1
- package/src/AWS/EC2/Instance.ts +9 -6
- package/src/AWS/EC2/KeyPair.ts +319 -0
- package/src/AWS/EC2/NetworkAcl.ts +4 -1
- package/src/AWS/EC2/SecurityGroup.ts +4 -1
- package/src/AWS/EC2/SecurityGroupRule.ts +14 -5
- package/src/AWS/EC2/Subnet.ts +49 -4
- package/src/AWS/EC2/hosted.ts +93 -93
- package/src/AWS/EC2/index.ts +1 -0
- package/src/AWS/ECS/Task.ts +96 -78
- package/src/AWS/IAM/Role.ts +132 -22
- package/src/AWS/Lambda/CreateAuthToken.ts +43 -0
- package/src/AWS/Lambda/CreateAuthTokenHttp.ts +11 -0
- package/src/AWS/Lambda/CreateShellAuthToken.ts +42 -0
- package/src/AWS/Lambda/CreateShellAuthTokenHttp.ts +11 -0
- package/src/AWS/Lambda/DeleteMicrovmImageVersion.ts +36 -0
- package/src/AWS/Lambda/DeleteMicrovmImageVersionHttp.ts +12 -0
- package/src/AWS/Lambda/Function.ts +36 -9
- package/src/AWS/Lambda/GetMicrovm.ts +32 -0
- package/src/AWS/Lambda/GetMicrovmHttp.ts +13 -0
- package/src/AWS/Lambda/GetMicrovmImage.ts +40 -0
- package/src/AWS/Lambda/GetMicrovmImageBuild.ts +35 -0
- package/src/AWS/Lambda/GetMicrovmImageBuildHttp.ts +12 -0
- package/src/AWS/Lambda/GetMicrovmImageHttp.ts +12 -0
- package/src/AWS/Lambda/GetMicrovmImageVersion.ts +35 -0
- package/src/AWS/Lambda/GetMicrovmImageVersionHttp.ts +12 -0
- package/src/AWS/Lambda/ListManagedMicrovmImageVersions.ts +31 -0
- package/src/AWS/Lambda/ListManagedMicrovmImageVersionsHttp.ts +10 -0
- package/src/AWS/Lambda/ListManagedMicrovmImages.ts +31 -0
- package/src/AWS/Lambda/ListManagedMicrovmImagesHttp.ts +10 -0
- package/src/AWS/Lambda/ListMicrovmImageBuilds.ts +36 -0
- package/src/AWS/Lambda/ListMicrovmImageBuildsHttp.ts +12 -0
- package/src/AWS/Lambda/ListMicrovmImageVersions.ts +36 -0
- package/src/AWS/Lambda/ListMicrovmImageVersionsHttp.ts +12 -0
- package/src/AWS/Lambda/ListMicrovms.ts +40 -0
- package/src/AWS/Lambda/ListMicrovmsHttp.ts +12 -0
- package/src/AWS/Lambda/MicrovmBinding.ts +442 -0
- package/src/AWS/Lambda/MicrovmBundle.ts +256 -0
- package/src/AWS/Lambda/MicrovmImage.ts +569 -0
- package/src/AWS/Lambda/MicrovmProvider.ts +597 -0
- package/src/AWS/Lambda/MicrovmRpc.ts +75 -0
- package/src/AWS/Lambda/MicrovmRuntimeContext.ts +110 -0
- package/src/AWS/Lambda/NetworkConnector.ts +529 -0
- package/src/AWS/Lambda/QueueEventSource.ts +1 -0
- package/src/AWS/Lambda/ResumeMicrovm.ts +37 -0
- package/src/AWS/Lambda/ResumeMicrovmHttp.ts +11 -0
- package/src/AWS/Lambda/RunMicrovm.ts +45 -0
- package/src/AWS/Lambda/RunMicrovmHttp.ts +13 -0
- package/src/AWS/Lambda/SuspendMicrovm.ts +37 -0
- package/src/AWS/Lambda/SuspendMicrovmHttp.ts +11 -0
- package/src/AWS/Lambda/TerminateMicrovm.ts +38 -0
- package/src/AWS/Lambda/TerminateMicrovmHttp.ts +11 -0
- package/src/AWS/Lambda/UpdateMicrovmImageVersion.ts +36 -0
- package/src/AWS/Lambda/UpdateMicrovmImageVersionHttp.ts +12 -0
- package/src/AWS/Lambda/index.ts +38 -0
- package/src/AWS/Providers.ts +147 -133
- package/src/AWS/RDS/DBClusterParameterGroup.ts +5 -1
- package/src/AWS/RDS/DBParameterGroup.ts +5 -1
- package/src/AWS/Region.ts +9 -2
- package/src/AWS/S3/Bucket.ts +71 -36
- package/src/AlchemyContext.ts +7 -0
- package/src/Apply.ts +4 -2
- package/src/Axiom/Chart.ts +9 -1
- package/src/Bundle/Bundle.ts +1 -1
- package/src/Bundle/TempRoot.ts +22 -0
- package/src/Bundle/Vite.ts +204 -0
- package/src/Bundle/index.ts +0 -1
- package/src/Cli/Event.ts +1 -0
- package/src/Cli/LoggingCli.ts +3 -0
- package/src/Cli/commands/_shared.ts +7 -1
- package/src/Cli/commands/cloudflare.ts +37 -2
- package/src/Cli/commands/deploy.ts +4 -1
- package/src/Cli/tui/components/PlanProgress.tsx +5 -3
- package/src/Cloudflare/AI/Gateway.ts +1 -1
- package/src/Cloudflare/AI/Search.ts +1 -1
- package/src/Cloudflare/AI/SearchInstance.ts +1 -1
- package/src/Cloudflare/AI/SearchNamespace.ts +1 -1
- package/src/Cloudflare/AI/SearchToken.ts +6 -1
- package/src/Cloudflare/Access/Application.ts +61 -10
- package/src/Cloudflare/Alerting/Webhook.ts +18 -7
- package/src/Cloudflare/AnalyticsEngine/WriteDataset.ts +2 -2
- package/src/Cloudflare/ApiToken/AccountApiToken.ts +4 -0
- package/src/Cloudflare/Auth/AuthProvider.ts +1 -1
- package/src/Cloudflare/Containers/Container.ts +43 -4
- package/src/Cloudflare/Containers/ContainerApplication.ts +24 -18
- package/src/Cloudflare/Containers/ContainerBundle.ts +2 -4
- package/src/Cloudflare/Containers/ContainerPlatform.ts +3 -3
- package/src/Cloudflare/Containers/ContainerProvider.ts +50 -42
- package/src/Cloudflare/Containers/LocalContainerProvider.ts +11 -4
- package/src/Cloudflare/Containers/StartContainer.ts +316 -32
- package/src/Cloudflare/DNS/ReadDns.ts +1 -1
- package/src/Cloudflare/DNS/ReadWriteDns.ts +1 -1
- package/src/Cloudflare/DNS/WriteDns.ts +1 -1
- package/src/Cloudflare/Flagship/App.ts +1 -1
- package/src/Cloudflare/Images/Images.ts +1 -1
- package/src/Cloudflare/Local.ts +2 -0
- package/src/Cloudflare/Providers.ts +2 -0
- package/src/Cloudflare/Queues/Consumer.ts +21 -12
- package/src/Cloudflare/Queues/Queue.ts +1 -1
- package/src/Cloudflare/R2/Bucket.ts +2 -2
- package/src/Cloudflare/StateStore/Api.ts +6 -4
- package/src/Cloudflare/StateStore/State.ts +192 -20
- package/src/Cloudflare/Website/Vite.ts +29 -24
- package/src/Cloudflare/Workers/Binding.ts +1 -1
- package/src/Cloudflare/Workers/Browser.ts +1 -1
- package/src/Cloudflare/Workers/DurableObject.ts +54 -3
- package/src/Cloudflare/Workers/InferEnv.ts +47 -36
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +54 -7
- package/src/Cloudflare/Workers/RpcDurableObject.ts +3 -3
- package/src/Cloudflare/Workers/RpcWorker.ts +4 -4
- package/src/Cloudflare/Workers/ScheduledEvents.ts +1 -1
- package/src/Cloudflare/Workers/VersionMetadata.ts +1 -1
- package/src/Cloudflare/Workers/Vite.ts +21 -40
- package/src/Cloudflare/Workers/Worker.ts +74 -13
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +30 -0
- package/src/Cloudflare/Workers/WorkerBinding.ts +5 -1
- package/src/Cloudflare/Workers/WorkerLoader.ts +1 -1
- package/src/Cloudflare/Workers/WorkerProvider.ts +470 -200
- package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +1 -1
- package/src/Cloudflare/WorkersForPlatforms/DispatchNamespace.ts +44 -2
- package/src/Cloudflare/WorkersForPlatforms/Get.ts +87 -0
- package/src/Cloudflare/WorkersForPlatforms/GetBinding.ts +63 -0
- package/src/Cloudflare/WorkersForPlatforms/index.ts +2 -0
- package/src/Cloudflare/Workflows/Workflow.ts +207 -78
- package/src/Command/Build.ts +32 -1
- package/src/Docker/Container.ts +413 -0
- package/src/Docker/Docker.ts +564 -0
- package/src/Docker/Image.ts +265 -0
- package/src/Docker/Network.ts +178 -0
- package/src/Docker/Providers.ts +37 -0
- package/src/Docker/Registry.ts +63 -0
- package/src/Docker/RemoteImage.ts +215 -0
- package/src/Docker/Volume.ts +187 -0
- package/src/Docker/index.ts +8 -0
- package/src/Local/ProviderLayer.ts +2 -0
- package/src/Neon/Branch.ts +15 -1
- package/src/Neon/Project.ts +13 -0
- package/src/Plan.ts +3 -1
- package/src/Planetscale/Branch.ts +70 -0
- package/src/Planetscale/Postgres/PostgresBranch.ts +6 -0
- package/src/Planetscale/Postgres/PostgresRole.ts +11 -1
- package/src/Platform.ts +50 -12
- package/src/Provider.ts +1 -1
- package/src/Resource.ts +9 -3
- package/src/Rpc.ts +1 -1
- package/src/Server/Process.ts +82 -1
- package/src/Stack.ts +11 -3
- package/src/Tags.ts +12 -0
- package/src/Telemetry/Attributes.ts +9 -12
- package/src/Test/Bun.ts +2 -0
- package/src/Test/Core.ts +13 -8
- package/src/Test/Vitest.ts +1 -0
- package/src/Util/effect.ts +1 -1
- package/src/Util/proxy-chain.ts +1 -0
- package/lib/Bundle/Docker.d.ts +0 -75
- package/lib/Bundle/Docker.d.ts.map +0 -1
- package/lib/Bundle/Docker.js +0 -148
- package/lib/Bundle/Docker.js.map +0 -1
- package/src/Bundle/Docker.ts +0 -229
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Path from "effect/Path";
|
|
2
3
|
import { AlchemyContext } from "../../AlchemyContext.ts";
|
|
3
4
|
import * as Artifacts from "../../Artifacts.ts";
|
|
4
|
-
import { materializeDockerfile } from "../../Bundle/Docker.ts";
|
|
5
5
|
import { getStableContextDir } from "../../Bundle/TempRoot.ts";
|
|
6
6
|
import { isResolved } from "../../Diff.ts";
|
|
7
|
+
import { Docker } from "../../Docker/Docker.ts";
|
|
7
8
|
import * as RpcProvider from "../../Local/RpcProvider.ts";
|
|
8
9
|
import { sha256Object } from "../../Util/sha256.ts";
|
|
9
10
|
import { normalizeNulls } from "../../Util/stable.ts";
|
|
@@ -41,6 +42,8 @@ export const LocalContainerProvider = () =>
|
|
|
41
42
|
LOCAL_ENTRY_URL,
|
|
42
43
|
Effect.gen(function* () {
|
|
43
44
|
const { dotAlchemy } = yield* AlchemyContext;
|
|
45
|
+
const docker = yield* Docker;
|
|
46
|
+
const path = yield* Path.Path;
|
|
44
47
|
|
|
45
48
|
// Bundle the container entrypoint and write it (plus the generated
|
|
46
49
|
// Dockerfile) into a stable build context directory. `Docker.build` in
|
|
@@ -68,7 +71,7 @@ export const LocalContainerProvider = () =>
|
|
|
68
71
|
news.external,
|
|
69
72
|
news.autoInstallExternals,
|
|
70
73
|
);
|
|
71
|
-
const [bundle
|
|
74
|
+
const [bundle] = yield* Effect.all(
|
|
72
75
|
[
|
|
73
76
|
bundleContainerProgram({
|
|
74
77
|
id,
|
|
@@ -79,13 +82,17 @@ export const LocalContainerProvider = () =>
|
|
|
79
82
|
external: news.external,
|
|
80
83
|
outdir: context,
|
|
81
84
|
}),
|
|
82
|
-
|
|
85
|
+
docker.materialize({
|
|
86
|
+
context: context,
|
|
87
|
+
dockerfile: dockerfileContent,
|
|
88
|
+
files: [],
|
|
89
|
+
}),
|
|
83
90
|
],
|
|
84
91
|
{ concurrency: "unbounded" },
|
|
85
92
|
);
|
|
86
93
|
return {
|
|
87
94
|
context,
|
|
88
|
-
dockerfile,
|
|
95
|
+
dockerfile: path.join(context, "Dockerfile"),
|
|
89
96
|
hash: yield* sha256Object({
|
|
90
97
|
bundle: bundle.hash,
|
|
91
98
|
dockerfileContent,
|
|
@@ -2,6 +2,7 @@ import * as Duration from "effect/Duration";
|
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
4
|
import * as Schedule from "effect/Schedule";
|
|
5
|
+
import * as Semaphore from "effect/Semaphore";
|
|
5
6
|
import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
|
|
6
7
|
import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
|
|
7
8
|
import * as HttpServerRequest from "effect/unstable/http/HttpServerRequest";
|
|
@@ -9,13 +10,62 @@ import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
|
|
|
9
10
|
import { ALCHEMY_PHASE } from "../../Phase.ts";
|
|
10
11
|
import { makeFetchRpcStub } from "../../Rpc.ts";
|
|
11
12
|
import { type Fetcher } from "../Fetcher.ts";
|
|
13
|
+
import { DurableObjectState } from "../Workers/DurableObjectState.ts";
|
|
12
14
|
import {
|
|
15
|
+
ContainerCrashedError,
|
|
13
16
|
ContainerError,
|
|
17
|
+
ContainerRateLimitedError,
|
|
14
18
|
ContainerTag,
|
|
19
|
+
NoContainerInstanceError,
|
|
15
20
|
type Container,
|
|
16
21
|
type ContainerStartupOptions,
|
|
17
22
|
} from "./Container.ts";
|
|
18
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Per-container-instance start coordination (start mutex + confirmed-ready
|
|
26
|
+
* port cache).
|
|
27
|
+
*
|
|
28
|
+
* `startContainer` can be invoked more than once for the same physical
|
|
29
|
+
* container: the {@link layer} helper calls it once per Durable Object, but a
|
|
30
|
+
* caller may also use `startContainer` directly from several places. If the
|
|
31
|
+
* mutex/ready-cache lived in each `startContainer` closure, those calls would
|
|
32
|
+
* not coordinate — two of them could both observe `running === false` and both
|
|
33
|
+
* call `container.start()`, with the second throwing "already running" (see
|
|
34
|
+
* cloudflare/containers#173).
|
|
35
|
+
*
|
|
36
|
+
* Keying off the Durable Object's `DurableObjectState` (stable for the life of
|
|
37
|
+
* a DO instance, and a distinct object per instance) makes the coordination
|
|
38
|
+
* per-container-instance regardless of how many `startContainer` calls share
|
|
39
|
+
* it. The map is module-scoped, but Workers isolates are per-isolate and each
|
|
40
|
+
* DO instance has its own `DurableObjectState`, so instances never collide; the
|
|
41
|
+
* `WeakMap` lets entries be collected with the instance. We deliberately do NOT
|
|
42
|
+
* key on the container's logical id — that is shared across every
|
|
43
|
+
* `getByName(...)` instance of the same class, which must each start
|
|
44
|
+
* independently.
|
|
45
|
+
*/
|
|
46
|
+
const startCoordination = new WeakMap<
|
|
47
|
+
object,
|
|
48
|
+
{
|
|
49
|
+
readonly startMutex: ReturnType<typeof Semaphore.makeUnsafe>;
|
|
50
|
+
readonly readyPorts: Set<number>;
|
|
51
|
+
}
|
|
52
|
+
>();
|
|
53
|
+
|
|
54
|
+
const getStartCoordination = (key: object) => {
|
|
55
|
+
let coordination = startCoordination.get(key);
|
|
56
|
+
if (!coordination) {
|
|
57
|
+
// `makeUnsafe` (rather than `Effect.makeSemaphore`) because this runs in a
|
|
58
|
+
// synchronous cache-miss branch; the semaphore is a plain mutable primitive
|
|
59
|
+
// shared across effects, created once per DO instance.
|
|
60
|
+
coordination = {
|
|
61
|
+
startMutex: Semaphore.makeUnsafe(1),
|
|
62
|
+
readyPorts: new Set<number>(),
|
|
63
|
+
};
|
|
64
|
+
startCoordination.set(key, coordination);
|
|
65
|
+
}
|
|
66
|
+
return coordination;
|
|
67
|
+
};
|
|
68
|
+
|
|
19
69
|
export const layer = <Image extends Container.Decl.Any>(
|
|
20
70
|
container: Image,
|
|
21
71
|
options?: ContainerStartupOptions,
|
|
@@ -45,38 +95,261 @@ export const startContainer = Effect.fn(function* <
|
|
|
45
95
|
? yield* bound as Effect.Effect<Container>
|
|
46
96
|
: (bound as Container);
|
|
47
97
|
|
|
98
|
+
// Every constant below is taken directly from Cloudflare's own
|
|
99
|
+
// `@cloudflare/containers` runtime (`dist/lib/container.js`) rather than
|
|
100
|
+
// guessed, so our readiness behaviour matches `startAndWaitForPorts`:
|
|
101
|
+
//
|
|
102
|
+
// INSTANCE_POLL_INTERVAL_MS = 300 → fixed poll interval
|
|
103
|
+
// PING_TIMEOUT_MS = 5_000 → per-probe cap (addTimeoutSignal)
|
|
104
|
+
// TIMEOUT_TO_GET_CONTAINER_MS = 8_000 → phase 1: find+start an instance
|
|
105
|
+
// TIMEOUT_TO_GET_PORTS_MS = 20_000 → phase 2: wait for the port to listen
|
|
106
|
+
//
|
|
107
|
+
// Native derives its retry COUNTS as ceil(timeout / pollInterval); we keep
|
|
108
|
+
// the two phases separate (as native does) on a 300ms cadence.
|
|
109
|
+
const READINESS_POLL_INTERVAL = Duration.millis(300); // INSTANCE_POLL_INTERVAL_MS
|
|
110
|
+
const READINESS_PROBE_TIMEOUT = Duration.seconds(5); // PING_TIMEOUT_MS
|
|
111
|
+
const TIMEOUT_TO_GET_CONTAINER_MS = 8_000;
|
|
112
|
+
const TIMEOUT_TO_GET_PORTS_MS = 20_000;
|
|
113
|
+
const GET_CONTAINER_RETRIES = Math.ceil(TIMEOUT_TO_GET_CONTAINER_MS / 300); // 27
|
|
114
|
+
const PORT_READY_RETRIES = Math.ceil(TIMEOUT_TO_GET_PORTS_MS / 300); // 67
|
|
115
|
+
// When rate limited, back off hard before retrying — hammering `start()`
|
|
116
|
+
// only prolongs the limit (native returns 429 immediately and does not loop).
|
|
117
|
+
const RATE_LIMIT_BACKOFF = Duration.seconds(2);
|
|
118
|
+
const RATE_LIMIT_RETRIES = 5;
|
|
119
|
+
// Light retry for the real request only — covers the transient
|
|
120
|
+
// "Network connection lost" window when a container instance is recycled.
|
|
121
|
+
const REQUEST_RETRIES = 3;
|
|
122
|
+
|
|
123
|
+
// Error classification, mirroring native's string matchers in
|
|
124
|
+
// `@cloudflare/containers` (`isErrorOfType` against these exact phrases).
|
|
125
|
+
const errString = (e: unknown) =>
|
|
126
|
+
(e instanceof Error ? e.message : String(e)).toLowerCase();
|
|
127
|
+
const isNoInstanceError = (e: unknown) =>
|
|
128
|
+
errString(e).includes(
|
|
129
|
+
"there is no container instance that can be provided to this durable object",
|
|
130
|
+
);
|
|
131
|
+
const isRateLimitedError = (e: unknown) =>
|
|
132
|
+
errString(e).includes("you are requesting too many containers per second");
|
|
133
|
+
|
|
134
|
+
type ReadinessError =
|
|
135
|
+
| ContainerError
|
|
136
|
+
| NoContainerInstanceError
|
|
137
|
+
| ContainerRateLimitedError
|
|
138
|
+
| ContainerCrashedError;
|
|
139
|
+
|
|
140
|
+
// Map a raw defect to a typed readiness error (native classifies the same
|
|
141
|
+
// message phrases via `isErrorOfType`).
|
|
142
|
+
const classifyDefect = (
|
|
143
|
+
defect: unknown,
|
|
144
|
+
portNumber: number,
|
|
145
|
+
): ContainerError | NoContainerInstanceError | ContainerRateLimitedError =>
|
|
146
|
+
isRateLimitedError(defect)
|
|
147
|
+
? new ContainerRateLimitedError({
|
|
148
|
+
message: "Rate limited starting container",
|
|
149
|
+
cause: defect,
|
|
150
|
+
})
|
|
151
|
+
: isNoInstanceError(defect)
|
|
152
|
+
? new NoContainerInstanceError({
|
|
153
|
+
message: "No container instance available",
|
|
154
|
+
cause: defect,
|
|
155
|
+
})
|
|
156
|
+
: new ContainerError({
|
|
157
|
+
message: `Container not ready on port ${portNumber}: ${defect}`,
|
|
158
|
+
cause: defect,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Coalesce concurrent starts and share the confirmed-ready port cache across
|
|
162
|
+
// every caller for THIS Durable Object instance (see `startCoordination`).
|
|
163
|
+
// Native uses a `startInFlight` promise so two racing callers never both
|
|
164
|
+
// invoke `container.start()` ("already running" — cloudflare/containers#173);
|
|
165
|
+
// the 1-permit mutex serialises the start path so the second entrant sees
|
|
166
|
+
// `running === true` and skips. `readyPorts` lets steady-state requests skip
|
|
167
|
+
// the readiness probe entirely (like native's `healthy` state).
|
|
168
|
+
//
|
|
169
|
+
// Key on `DurableObjectState` (stable + unique per DO instance). Requiring it
|
|
170
|
+
// is correct: a container only ever runs inside a Durable Object, so this is
|
|
171
|
+
// an honest dependency rather than a silent fallback.
|
|
172
|
+
const doState = yield* DurableObjectState;
|
|
173
|
+
const coordinationKey: object =
|
|
174
|
+
(doState.container as object | undefined) ?? doState;
|
|
175
|
+
const { startMutex, readyPorts } = getStartCoordination(coordinationKey);
|
|
176
|
+
|
|
177
|
+
const launchMonitor = Effect.forkDetach(
|
|
178
|
+
container.monitor().pipe(
|
|
179
|
+
Effect.flatMap(() => Effect.logInfo("Container monitor exited")),
|
|
180
|
+
Effect.catchTag("ContainerError", (error) =>
|
|
181
|
+
Effect.logError(`Container monitor error: ${error.message}`),
|
|
182
|
+
),
|
|
183
|
+
// When the container exits (stopped, crashed, or slept), its ports are no
|
|
184
|
+
// longer listening — drop the confirmed-ready marks so the next request
|
|
185
|
+
// re-probes the freshly (re)started instance instead of fetching a dead
|
|
186
|
+
// port. This is the analog of native's monitor clearing the `healthy`
|
|
187
|
+
// state on exit.
|
|
188
|
+
Effect.ensuring(Effect.sync(() => readyPorts.clear())),
|
|
189
|
+
),
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
// The actual (re)start, serialised through the mutex so racing callers never
|
|
193
|
+
// both invoke `container.start()` ("already running" — see
|
|
194
|
+
// cloudflare/containers#173). Re-checks `running` under the lock.
|
|
195
|
+
const startOnce = Semaphore.withPermits(
|
|
196
|
+
startMutex,
|
|
197
|
+
1,
|
|
198
|
+
)(
|
|
199
|
+
Effect.gen(function* () {
|
|
200
|
+
if (yield* container.running) return;
|
|
201
|
+
yield* Effect.logDebug("Container not running, starting...");
|
|
202
|
+
// A (re)start means nothing is listening yet — clear any stale ready
|
|
203
|
+
// marks from a previous run so the next request re-probes this instance.
|
|
204
|
+
yield* Effect.sync(() => readyPorts.clear());
|
|
205
|
+
yield* container.start(options).pipe(
|
|
206
|
+
Effect.catchDefect((defect) => Effect.fail(classifyDefect(defect, -1))),
|
|
207
|
+
// A rate limit is transient — back off well clear of the per-second
|
|
208
|
+
// window and try again a few times before surfacing it.
|
|
209
|
+
Effect.retry({
|
|
210
|
+
while: (
|
|
211
|
+
e:
|
|
212
|
+
| ContainerError
|
|
213
|
+
| NoContainerInstanceError
|
|
214
|
+
| ContainerRateLimitedError,
|
|
215
|
+
) => e._tag === "ContainerRateLimitedError",
|
|
216
|
+
schedule: Schedule.spaced(RATE_LIMIT_BACKOFF),
|
|
217
|
+
times: RATE_LIMIT_RETRIES,
|
|
218
|
+
}),
|
|
219
|
+
);
|
|
220
|
+
yield* launchMonitor;
|
|
221
|
+
}),
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
// Ensure the container is running. Fast path: when it's already running (the
|
|
225
|
+
// steady state) this is a single cheap `running` read and avoids contending
|
|
226
|
+
// on the start mutex. Only an actual (re)start acquires the lock — which is
|
|
227
|
+
// also what makes auto-restart work: a stopped/crashed container has
|
|
228
|
+
// `running === false`, so the next call transparently restarts it.
|
|
48
229
|
const ensureRunning = Effect.gen(function* () {
|
|
49
230
|
if (yield* container.running) return;
|
|
50
|
-
yield*
|
|
51
|
-
yield* container.start(options);
|
|
52
|
-
yield* Effect.logInfo("Container started, launching monitor");
|
|
53
|
-
yield* Effect.forkDetach(
|
|
54
|
-
container.monitor().pipe(
|
|
55
|
-
Effect.flatMap(() => Effect.logInfo("Container monitor exited")),
|
|
56
|
-
Effect.catchTag("ContainerError", (error) =>
|
|
57
|
-
Effect.logError(`Container monitor error: ${error.message}`),
|
|
58
|
-
),
|
|
59
|
-
),
|
|
60
|
-
);
|
|
231
|
+
yield* startOnce;
|
|
61
232
|
});
|
|
62
233
|
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Duration.max(delay, Duration.seconds(1)),
|
|
74
|
-
Duration.seconds(3),
|
|
234
|
+
// A single readiness probe: any response at all (even a non-2xx) proves the
|
|
235
|
+
// port is accepting connections. Each probe is hard-capped so a hung connect
|
|
236
|
+
// to a not-yet-bound port cannot stall the request. If the instance has gone
|
|
237
|
+
// away (`running === false`) after we started it, surface a crash rather than
|
|
238
|
+
// polling out the whole budget (native's `if (!this.container.running)`).
|
|
239
|
+
const probePort = (portNumber: number) =>
|
|
240
|
+
container.getTcpPort(portNumber).pipe(
|
|
241
|
+
Effect.andThen((port: Fetcher) =>
|
|
242
|
+
port.fetch(
|
|
243
|
+
HttpClientRequest.get("http://containerstarthealthcheck") as any,
|
|
75
244
|
),
|
|
76
245
|
),
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
246
|
+
Effect.timeout(READINESS_PROBE_TIMEOUT),
|
|
247
|
+
Effect.catchDefect((defect: unknown) =>
|
|
248
|
+
container.running.pipe(
|
|
249
|
+
Effect.andThen((running) =>
|
|
250
|
+
Effect.fail<ReadinessError>(
|
|
251
|
+
!running &&
|
|
252
|
+
!isRateLimitedError(defect) &&
|
|
253
|
+
!isNoInstanceError(defect)
|
|
254
|
+
? new ContainerCrashedError({
|
|
255
|
+
message: `Container exited while waiting for port ${portNumber}`,
|
|
256
|
+
cause: defect,
|
|
257
|
+
})
|
|
258
|
+
: classifyDefect(defect, portNumber),
|
|
259
|
+
),
|
|
260
|
+
),
|
|
261
|
+
),
|
|
262
|
+
),
|
|
263
|
+
// A probe that hangs past the per-attempt cap, or fails the HTTP fetch
|
|
264
|
+
// before the port is up, is just "not ready yet" — retry it like any
|
|
265
|
+
// other transient readiness failure.
|
|
266
|
+
Effect.catchTag(["TimeoutError", "HttpClientError"], (cause: unknown) =>
|
|
267
|
+
container.running.pipe(
|
|
268
|
+
Effect.andThen((running) =>
|
|
269
|
+
Effect.fail<ReadinessError>(
|
|
270
|
+
!running
|
|
271
|
+
? new ContainerCrashedError({
|
|
272
|
+
message: `Container exited while waiting for port ${portNumber}`,
|
|
273
|
+
cause,
|
|
274
|
+
})
|
|
275
|
+
: new ContainerError({
|
|
276
|
+
message: `Container probe not ready on port ${portNumber}`,
|
|
277
|
+
cause,
|
|
278
|
+
}),
|
|
279
|
+
),
|
|
280
|
+
),
|
|
281
|
+
),
|
|
282
|
+
),
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// Retry ONLY failures that can clear by waiting on the SAME instance:
|
|
286
|
+
// - `ContainerError` — the port isn't listening yet (the app is
|
|
287
|
+
// still booting; the container process is up)
|
|
288
|
+
// - `NoContainerInstanceError` — an instance is still being allocated
|
|
289
|
+
// Fail fast on the rest:
|
|
290
|
+
// - `ContainerCrashedError` — the container PROCESS has exited
|
|
291
|
+
// (`running === false`). `running` reflects
|
|
292
|
+
// the process, not the app, so this is never
|
|
293
|
+
// "still starting" — it's fatal for this
|
|
294
|
+
// instance. Spinning the budget on a
|
|
295
|
+
// crash-looping container just wastes ~20-60s
|
|
296
|
+
// per request; surface it in ~one poll.
|
|
297
|
+
// - `ContainerRateLimitedError`— back off in `ensureRunning`, don't spin.
|
|
298
|
+
// This matches `@cloudflare/containers`, whose `waitForPort` /
|
|
299
|
+
// `doStartContainer` throw immediately on `!running`.
|
|
300
|
+
const isTransientReadiness = (e: ReadinessError) =>
|
|
301
|
+
e._tag === "ContainerError" || e._tag === "NoContainerInstanceError";
|
|
302
|
+
|
|
303
|
+
// Phase 2 (native `waitForPort`): poll the port until it accepts connections.
|
|
304
|
+
// Crash detection is poll-based (`probePort` surfaces `ContainerCrashedError`
|
|
305
|
+
// on an observed `!running`, which `isTransientReadiness` does NOT retry).
|
|
306
|
+
//
|
|
307
|
+
// NB: we deliberately do NOT race `container.monitor()` for faster crash
|
|
308
|
+
// detection. The monitor wrapper settles immediately for a not-yet-allocated
|
|
309
|
+
// instance (and loses the exit code that native uses to tell "queued" from
|
|
310
|
+
// "exited"), so racing it mis-reports healthy, still-provisioning containers
|
|
311
|
+
// as crashed under concurrent startup — it dropped a 100-instance cold start
|
|
312
|
+
// to <10% success. Polling is correct under load; the price is that crash
|
|
313
|
+
// detection is bounded by the probe cadence rather than instant.
|
|
314
|
+
const waitForPort = (portNumber: number) =>
|
|
315
|
+
readyPorts.has(portNumber)
|
|
316
|
+
? Effect.void
|
|
317
|
+
: probePort(portNumber).pipe(
|
|
318
|
+
Effect.tapError((err) =>
|
|
319
|
+
Effect.logDebug(`Container not ready (will retry): ${err}`),
|
|
320
|
+
),
|
|
321
|
+
Effect.retry({
|
|
322
|
+
while: isTransientReadiness,
|
|
323
|
+
schedule: Schedule.spaced(READINESS_POLL_INTERVAL),
|
|
324
|
+
times: PORT_READY_RETRIES,
|
|
325
|
+
}),
|
|
326
|
+
Effect.andThen(() =>
|
|
327
|
+
Effect.sync(() => {
|
|
328
|
+
readyPorts.add(portNumber);
|
|
329
|
+
}),
|
|
330
|
+
),
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
// Phase 1 (native `doStartContainer`) + phase 2: ensure the instance is
|
|
334
|
+
// started (bounded, rate-limit aware), then wait for the port. `ensureRunning`
|
|
335
|
+
// is ALWAYS run (cheap when already running) rather than short-circuiting on
|
|
336
|
+
// `readyPorts` — otherwise a container that has since stopped/crashed would
|
|
337
|
+
// never be restarted. The port probe (`waitForPort`) is what `readyPorts`
|
|
338
|
+
// skips in steady state.
|
|
339
|
+
const ensureReady = (portNumber: number) =>
|
|
340
|
+
ensureRunning.pipe(
|
|
341
|
+
Effect.retry({
|
|
342
|
+
while: (
|
|
343
|
+
e:
|
|
344
|
+
| ContainerError
|
|
345
|
+
| NoContainerInstanceError
|
|
346
|
+
| ContainerRateLimitedError,
|
|
347
|
+
) => e._tag === "NoContainerInstanceError",
|
|
348
|
+
schedule: Schedule.spaced(READINESS_POLL_INTERVAL),
|
|
349
|
+
times: GET_CONTAINER_RETRIES,
|
|
350
|
+
}),
|
|
351
|
+
Effect.andThen(() => waitForPort(portNumber)),
|
|
352
|
+
);
|
|
80
353
|
|
|
81
354
|
const getTcpPort = (portNumber: number) =>
|
|
82
355
|
Effect.succeed({
|
|
@@ -85,20 +358,31 @@ export const startContainer = Effect.fn(function* <
|
|
|
85
358
|
| HttpClientRequest.HttpClientRequest
|
|
86
359
|
| HttpServerRequest.HttpServerRequest,
|
|
87
360
|
) =>
|
|
88
|
-
|
|
361
|
+
// Block until the port is ready (bounded), THEN forward the real
|
|
362
|
+
// request exactly once. Readiness is a cheap healthcheck, so the user
|
|
363
|
+
// request is never replayed against a cold container.
|
|
364
|
+
ensureReady(portNumber).pipe(
|
|
89
365
|
Effect.andThen(() => container.getTcpPort(portNumber)),
|
|
90
366
|
Effect.andThen((port: Fetcher) => port.fetch(request as any)),
|
|
91
367
|
Effect.catchDefect((defect: unknown) =>
|
|
92
368
|
Effect.fail(
|
|
93
369
|
new ContainerError({
|
|
94
|
-
message: `Container
|
|
370
|
+
message: `Container fetch failed on port ${portNumber}: ${defect}`,
|
|
371
|
+
cause: defect,
|
|
95
372
|
}),
|
|
96
373
|
),
|
|
97
374
|
),
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
),
|
|
101
|
-
|
|
375
|
+
// Only retry a generic transient blip: a not-yet-ready port
|
|
376
|
+
// (`ContainerError`) or a transport hiccup on the real request such
|
|
377
|
+
// as "Network connection lost" (`HttpClientError`). A crash, rate
|
|
378
|
+
// limit, or exhausted no-instance budget is surfaced immediately so a
|
|
379
|
+
// crash-looping container fails fast instead of re-starting 3× more.
|
|
380
|
+
Effect.retry({
|
|
381
|
+
while: (e) =>
|
|
382
|
+
e._tag === "ContainerError" || e._tag === "HttpClientError",
|
|
383
|
+
schedule: Schedule.spaced(READINESS_POLL_INTERVAL),
|
|
384
|
+
times: REQUEST_RETRIES,
|
|
385
|
+
}),
|
|
102
386
|
)) as {
|
|
103
387
|
(
|
|
104
388
|
request: HttpClientRequest.HttpClientRequest,
|
|
@@ -36,7 +36,7 @@ import type { Zone } from "../Zone/Zone.ts";
|
|
|
36
36
|
*
|
|
37
37
|
* export class ReadDnserWorker extends Cloudflare.Worker<ReadDnserWorker>()(
|
|
38
38
|
* "ReadDnserWorker",
|
|
39
|
-
* { main: import.meta.
|
|
39
|
+
* { main: import.meta.url },
|
|
40
40
|
* Effect.gen(function* () {
|
|
41
41
|
* // Init phase — bind the read client scoped to the zone.
|
|
42
42
|
* const dns = yield* Cloudflare.DNS.ReadDns(Zone);
|
|
@@ -32,7 +32,7 @@ import { type WriteDnsClient } from "./WriteDns.ts";
|
|
|
32
32
|
*
|
|
33
33
|
* export class Worker extends Cloudflare.Worker<Worker>()(
|
|
34
34
|
* "Worker",
|
|
35
|
-
* { main: import.meta.
|
|
35
|
+
* { main: import.meta.url },
|
|
36
36
|
* Effect.gen(function* () {
|
|
37
37
|
* // Init phase — bind the full CRUD client scoped to the zone.
|
|
38
38
|
* const dns = yield* Cloudflare.DNS.ReadWriteDns(Zone);
|
|
@@ -46,7 +46,7 @@ import type { Zone } from "../Zone/Zone.ts";
|
|
|
46
46
|
*
|
|
47
47
|
* export class WriteDnsrWorker extends Cloudflare.Worker<WriteDnsrWorker>()(
|
|
48
48
|
* "WriteDnsrWorker",
|
|
49
|
-
* { main: import.meta.
|
|
49
|
+
* { main: import.meta.url },
|
|
50
50
|
* Effect.gen(function* () {
|
|
51
51
|
* // Init phase — bind the write client scoped to the zone.
|
|
52
52
|
* const dns = yield* Cloudflare.DNS.WriteDns(Zone);
|
|
@@ -97,7 +97,7 @@ export type App = Resource<TypeId, AppProps, AppAttributes, never, Providers>;
|
|
|
97
97
|
*
|
|
98
98
|
* Cloudflare.Worker(
|
|
99
99
|
* "FlagsWorker",
|
|
100
|
-
* { main: import.meta.
|
|
100
|
+
* { main: import.meta.url },
|
|
101
101
|
* Effect.gen(function* () {
|
|
102
102
|
* const flags = yield* Cloudflare.Flagship.ReadFlags(App);
|
|
103
103
|
* return {
|
|
@@ -33,7 +33,7 @@ export class ImagesError extends Data.TaggedError("ImagesError")<{
|
|
|
33
33
|
* ```typescript
|
|
34
34
|
* import { HttpServerRequest } from "effect/unstable/http/HttpServerRequest";
|
|
35
35
|
*
|
|
36
|
-
* Cloudflare.Worker("ImageWorker", { main: import.meta.
|
|
36
|
+
* Cloudflare.Worker("ImageWorker", { main: import.meta.url },
|
|
37
37
|
* Effect.gen(function* () {
|
|
38
38
|
* const images = yield* Cloudflare.Images.Images("PIPELINE");
|
|
39
39
|
* return {
|
package/src/Cloudflare/Local.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Layer from "effect/Layer";
|
|
2
|
+
import { DockerLive } from "../Docker/Docker.ts";
|
|
2
3
|
import * as RpcServer from "../Local/RpcServer.ts";
|
|
3
4
|
import { CloudflareAuth } from "./Auth/AuthProvider.ts";
|
|
4
5
|
import * as CloudflareEnvironment from "./CloudflareEnvironment.ts";
|
|
@@ -25,5 +26,6 @@ Layer.mergeAll(
|
|
|
25
26
|
).pipe(
|
|
26
27
|
Layer.provide(localRuntimeServices()),
|
|
27
28
|
Layer.provide(cloudflareServices),
|
|
29
|
+
Layer.provide(DockerLive),
|
|
28
30
|
RpcServer.launch,
|
|
29
31
|
);
|
|
@@ -8,6 +8,7 @@ import * as Schedule from "effect/Schedule";
|
|
|
8
8
|
import { CredentialsStoreLive } from "../Auth/Credentials.ts";
|
|
9
9
|
import { ProfileLive } from "../Auth/Profile.ts";
|
|
10
10
|
import * as Command from "../Command/index.ts";
|
|
11
|
+
import { DockerLive } from "../Docker/Docker.ts";
|
|
11
12
|
import { KeyPair, KeyPairProvider } from "../KeyPair.ts";
|
|
12
13
|
import * as Provider from "../Provider.ts";
|
|
13
14
|
import { Random, RandomProvider } from "../Random.ts";
|
|
@@ -681,6 +682,7 @@ export const providers = () =>
|
|
|
681
682
|
RandomProvider(),
|
|
682
683
|
),
|
|
683
684
|
),
|
|
685
|
+
Layer.provide(DockerLive),
|
|
684
686
|
Layer.provideMerge(localRuntimeServices()),
|
|
685
687
|
Layer.provideMerge(Credentials.fromAuthProvider()),
|
|
686
688
|
Layer.provideMerge(CloudflareEnvironment.fromProfile()),
|
|
@@ -98,7 +98,7 @@ export type Consumer = Resource<
|
|
|
98
98
|
*
|
|
99
99
|
* yield* Cloudflare.Queues.Consumer("MyConsumer", {
|
|
100
100
|
* queueId: queue.queueId,
|
|
101
|
-
* scriptName:
|
|
101
|
+
* scriptName: worker.workerName,
|
|
102
102
|
* });
|
|
103
103
|
* ```
|
|
104
104
|
*
|
|
@@ -106,7 +106,7 @@ export type Consumer = Resource<
|
|
|
106
106
|
* ```typescript
|
|
107
107
|
* yield* Cloudflare.Queues.Consumer("MyConsumer", {
|
|
108
108
|
* queueId: queue.queueId,
|
|
109
|
-
* scriptName:
|
|
109
|
+
* scriptName: worker.workerName,
|
|
110
110
|
* settings: {
|
|
111
111
|
* batchSize: 50,
|
|
112
112
|
* maxRetries: 5,
|
|
@@ -127,6 +127,12 @@ const findWorkerConsumer = (acct: string, queueId: string) =>
|
|
|
127
127
|
Stream.filter((c): c is ObservedConsumer => c !== undefined),
|
|
128
128
|
Stream.runHead,
|
|
129
129
|
Effect.map(Option.getOrUndefined),
|
|
130
|
+
// A queue created earlier in the same plan is eventually consistent:
|
|
131
|
+
// listConsumers can transiently 404 (`QueueNotFound`, code 11000) before
|
|
132
|
+
// the fresh queue is visible to the consumers API. Treat that as "no
|
|
133
|
+
// consumer yet" — the caller falls through to createConsumer, which
|
|
134
|
+
// retries QueueNotFound until the queue propagates.
|
|
135
|
+
Effect.catchTag("QueueNotFound", () => Effect.succeed(undefined)),
|
|
130
136
|
);
|
|
131
137
|
|
|
132
138
|
export const ConsumerProviderLive = () =>
|
|
@@ -349,22 +355,25 @@ export const ConsumerProviderLive = () =>
|
|
|
349
355
|
settings: news.settings,
|
|
350
356
|
})
|
|
351
357
|
.pipe(
|
|
352
|
-
//
|
|
353
|
-
//
|
|
354
|
-
//
|
|
355
|
-
//
|
|
356
|
-
//
|
|
358
|
+
// Two eventual-consistency races on a fresh deploy, both
|
|
359
|
+
// retried on the same bounded schedule:
|
|
360
|
+
// - QueueHandlerMissing (11001): the sibling Worker resource
|
|
361
|
+
// pre-creates a placeholder script with no `queue` handler;
|
|
362
|
+
// Cloudflare returns 11001 until the real reconcile uploads
|
|
363
|
+
// the handler.
|
|
364
|
+
// - QueueNotFound (11000): the queue was created earlier in
|
|
365
|
+
// this same plan but isn't yet visible to the consumers API.
|
|
357
366
|
Effect.tapError((e) =>
|
|
358
|
-
e._tag === "QueueHandlerMissing"
|
|
367
|
+
e._tag === "QueueHandlerMissing" || e._tag === "QueueNotFound"
|
|
359
368
|
? Effect.logDebug(
|
|
360
|
-
`Consumer create: worker ` +
|
|
361
|
-
`"${news.scriptName}"
|
|
362
|
-
`yet (code 11001), retrying`,
|
|
369
|
+
`Consumer create: not ready for worker ` +
|
|
370
|
+
`"${news.scriptName}" (${e._tag}), retrying`,
|
|
363
371
|
)
|
|
364
372
|
: Effect.void,
|
|
365
373
|
),
|
|
366
374
|
Effect.retry({
|
|
367
|
-
while: (e) =>
|
|
375
|
+
while: (e) =>
|
|
376
|
+
e._tag === "QueueHandlerMissing" || e._tag === "QueueNotFound",
|
|
368
377
|
schedule: queueHandlerReadinessSchedule,
|
|
369
378
|
}),
|
|
370
379
|
Effect.catchTag("ConsumerAlreadyExists", (cause) =>
|
|
@@ -172,7 +172,7 @@ export type Bucket = Resource<
|
|
|
172
172
|
* @section Binding to a Worker
|
|
173
173
|
* @example Reading and writing objects
|
|
174
174
|
* ```typescript
|
|
175
|
-
* const bucket = yield* Cloudflare.R2.
|
|
175
|
+
* const bucket = yield* Cloudflare.R2.ReadWriteBucket(MyBucket);
|
|
176
176
|
*
|
|
177
177
|
* // Write an object
|
|
178
178
|
* yield* bucket.put("hello.txt", "Hello, World!");
|
|
@@ -186,7 +186,7 @@ export type Bucket = Resource<
|
|
|
186
186
|
*
|
|
187
187
|
* @example Streaming upload with content length
|
|
188
188
|
* ```typescript
|
|
189
|
-
* const bucket = yield* Cloudflare.R2.
|
|
189
|
+
* const bucket = yield* Cloudflare.R2.ReadWriteBucket(MyBucket);
|
|
190
190
|
*
|
|
191
191
|
* yield* bucket.put("upload.bin", request.stream, {
|
|
192
192
|
* contentLength: Number(request.headers["content-length"] ?? 0),
|
|
@@ -8,6 +8,7 @@ import * as HttpRouter from "effect/unstable/http/HttpRouter";
|
|
|
8
8
|
import * as HttpApiBuilder from "effect/unstable/httpapi/HttpApiBuilder";
|
|
9
9
|
import * as HttpApiError from "effect/unstable/httpapi/HttpApiError";
|
|
10
10
|
import crypto from "node:crypto";
|
|
11
|
+
import { RuntimeContext } from "../../RuntimeContext.ts";
|
|
11
12
|
import {
|
|
12
13
|
BearerTokenValidator,
|
|
13
14
|
StateApi,
|
|
@@ -101,7 +102,7 @@ export default Worker(
|
|
|
101
102
|
"Api",
|
|
102
103
|
{
|
|
103
104
|
name: STATE_STORE_SCRIPT_NAME,
|
|
104
|
-
main: import.meta.
|
|
105
|
+
main: import.meta.url,
|
|
105
106
|
url: true,
|
|
106
107
|
compatibility: {
|
|
107
108
|
flags: ["nodejs_compat"],
|
|
@@ -115,13 +116,14 @@ export default Worker(
|
|
|
115
116
|
const bearerTokenValidator = Layer.succeed(
|
|
116
117
|
BearerTokenValidator,
|
|
117
118
|
BearerTokenValidator.of({
|
|
118
|
-
// @ts-expect-error - TODO(sam): fix RuntimeContext color here
|
|
119
119
|
validate: Effect.fn(function* (token) {
|
|
120
|
-
const expected = yield* remoteSecret
|
|
120
|
+
const expected = yield* remoteSecret
|
|
121
|
+
.get()
|
|
122
|
+
.pipe(Effect.orDie, Effect.provide(RuntimeContext.phantom));
|
|
121
123
|
return !!expected &&
|
|
122
124
|
timingSafeEqual(token.trim(), Redacted.value(expected).trim())
|
|
123
125
|
? yield* Effect.void
|
|
124
|
-
: yield*
|
|
126
|
+
: yield* new HttpApiError.Unauthorized();
|
|
125
127
|
}),
|
|
126
128
|
}),
|
|
127
129
|
);
|