@alchemy.run/modal 0.0.0 → 2.0.0-beta.87
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/LICENSE +201 -0
- package/README.md +96 -4
- package/lib/App.d.ts +143 -0
- package/lib/App.d.ts.map +1 -0
- package/lib/App.js +198 -0
- package/lib/App.js.map +1 -0
- package/lib/AuthProvider.d.ts +53 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +209 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/BindingHttp.d.ts +56 -0
- package/lib/BindingHttp.d.ts.map +1 -0
- package/lib/BindingHttp.js +50 -0
- package/lib/BindingHttp.js.map +1 -0
- package/lib/Blob.d.ts +34 -0
- package/lib/Blob.d.ts.map +1 -0
- package/lib/Blob.js +59 -0
- package/lib/Blob.js.map +1 -0
- package/lib/Bootstrap.d.ts +8 -0
- package/lib/Bootstrap.d.ts.map +1 -0
- package/lib/Bootstrap.js +26 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/Cbor.d.ts +10 -0
- package/lib/Cbor.d.ts.map +1 -0
- package/lib/Cbor.js +177 -0
- package/lib/Cbor.js.map +1 -0
- package/lib/ConnectSandbox.d.ts +64 -0
- package/lib/ConnectSandbox.d.ts.map +1 -0
- package/lib/ConnectSandbox.js +33 -0
- package/lib/ConnectSandbox.js.map +1 -0
- package/lib/Container.d.ts +124 -0
- package/lib/Container.d.ts.map +1 -0
- package/lib/Container.js +1 -0
- package/lib/Container.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/CreateDict.d.ts +83 -0
- package/lib/CreateDict.d.ts.map +1 -0
- package/lib/CreateDict.js +3 -0
- package/lib/CreateDict.js.map +1 -0
- package/lib/CreateDictHttp.d.ts +33 -0
- package/lib/CreateDictHttp.d.ts.map +1 -0
- package/lib/CreateDictHttp.js +67 -0
- package/lib/CreateDictHttp.js.map +1 -0
- package/lib/CreateImage.d.ts +98 -0
- package/lib/CreateImage.d.ts.map +1 -0
- package/lib/CreateImage.js +3 -0
- package/lib/CreateImage.js.map +1 -0
- package/lib/CreateImageHttp.d.ts +51 -0
- package/lib/CreateImageHttp.d.ts.map +1 -0
- package/lib/CreateImageHttp.js +87 -0
- package/lib/CreateImageHttp.js.map +1 -0
- package/lib/CreateQueue.d.ts +83 -0
- package/lib/CreateQueue.d.ts.map +1 -0
- package/lib/CreateQueue.js +3 -0
- package/lib/CreateQueue.js.map +1 -0
- package/lib/CreateQueueHttp.d.ts +31 -0
- package/lib/CreateQueueHttp.d.ts.map +1 -0
- package/lib/CreateQueueHttp.js +67 -0
- package/lib/CreateQueueHttp.js.map +1 -0
- package/lib/CreateSandbox.d.ts +186 -0
- package/lib/CreateSandbox.d.ts.map +1 -0
- package/lib/CreateSandbox.js +3 -0
- package/lib/CreateSandbox.js.map +1 -0
- package/lib/CreateSandboxHttp.d.ts +17 -0
- package/lib/CreateSandboxHttp.d.ts.map +1 -0
- package/lib/CreateSandboxHttp.js +117 -0
- package/lib/CreateSandboxHttp.js.map +1 -0
- package/lib/CreateSecret.d.ts +95 -0
- package/lib/CreateSecret.d.ts.map +1 -0
- package/lib/CreateSecret.js +3 -0
- package/lib/CreateSecret.js.map +1 -0
- package/lib/CreateSecretHttp.d.ts +24 -0
- package/lib/CreateSecretHttp.d.ts.map +1 -0
- package/lib/CreateSecretHttp.js +60 -0
- package/lib/CreateSecretHttp.js.map +1 -0
- package/lib/CreateVolume.d.ts +84 -0
- package/lib/CreateVolume.d.ts.map +1 -0
- package/lib/CreateVolume.js +3 -0
- package/lib/CreateVolume.js.map +1 -0
- package/lib/CreateVolumeHttp.d.ts +32 -0
- package/lib/CreateVolumeHttp.d.ts.map +1 -0
- package/lib/CreateVolumeHttp.js +69 -0
- package/lib/CreateVolumeHttp.js.map +1 -0
- package/lib/Credentials.d.ts +32 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +44 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/Dict.d.ts +147 -0
- package/lib/Dict.d.ts.map +1 -0
- package/lib/Dict.js +175 -0
- package/lib/Dict.js.map +1 -0
- package/lib/DictClient.d.ts +55 -0
- package/lib/DictClient.d.ts.map +1 -0
- package/lib/DictClient.js +89 -0
- package/lib/DictClient.js.map +1 -0
- package/lib/Domain.d.ts +86 -0
- package/lib/Domain.d.ts.map +1 -0
- package/lib/Domain.js +113 -0
- package/lib/Domain.js.map +1 -0
- package/lib/Endpoint.d.ts +181 -0
- package/lib/Endpoint.d.ts.map +1 -0
- package/lib/Endpoint.js +283 -0
- package/lib/Endpoint.js.map +1 -0
- package/lib/Environment.d.ts +174 -0
- package/lib/Environment.d.ts.map +1 -0
- package/lib/Environment.js +244 -0
- package/lib/Environment.js.map +1 -0
- package/lib/FetchServer.d.ts +105 -0
- package/lib/FetchServer.d.ts.map +1 -0
- package/lib/FetchServer.js +3 -0
- package/lib/FetchServer.js.map +1 -0
- package/lib/FetchServerHttp.d.ts +21 -0
- package/lib/FetchServerHttp.d.ts.map +1 -0
- package/lib/FetchServerHttp.js +84 -0
- package/lib/FetchServerHttp.js.map +1 -0
- package/lib/Function.d.ts +236 -0
- package/lib/Function.d.ts.map +1 -0
- package/lib/Function.js +273 -0
- package/lib/Function.js.map +1 -0
- package/lib/FunctionAutoscaler.d.ts +99 -0
- package/lib/FunctionAutoscaler.d.ts.map +1 -0
- package/lib/FunctionAutoscaler.js +136 -0
- package/lib/FunctionAutoscaler.js.map +1 -0
- package/lib/FunctionTarget.d.ts +61 -0
- package/lib/FunctionTarget.d.ts.map +1 -0
- package/lib/FunctionTarget.js +136 -0
- package/lib/FunctionTarget.js.map +1 -0
- package/lib/Image.d.ts +159 -0
- package/lib/Image.d.ts.map +1 -0
- package/lib/Image.js +203 -0
- package/lib/Image.js.map +1 -0
- package/lib/ImageBuild.d.ts +108 -0
- package/lib/ImageBuild.d.ts.map +1 -0
- package/lib/ImageBuild.js +157 -0
- package/lib/ImageBuild.js.map +1 -0
- package/lib/ImagePlan.d.ts +31 -0
- package/lib/ImagePlan.d.ts.map +1 -0
- package/lib/ImagePlan.js +70 -0
- package/lib/ImagePlan.js.map +1 -0
- package/lib/InferEnv.d.ts +26 -0
- package/lib/InferEnv.d.ts.map +1 -0
- package/lib/InferEnv.js +1 -0
- package/lib/InferEnv.js.map +1 -0
- package/lib/InvokeFunction.d.ts +186 -0
- package/lib/InvokeFunction.d.ts.map +1 -0
- package/lib/InvokeFunction.js +10 -0
- package/lib/InvokeFunction.js.map +1 -0
- package/lib/InvokeFunctionHttp.d.ts +39 -0
- package/lib/InvokeFunctionHttp.d.ts.map +1 -0
- package/lib/InvokeFunctionHttp.js +210 -0
- package/lib/InvokeFunctionHttp.js.map +1 -0
- package/lib/ModalBindings.d.ts +138 -0
- package/lib/ModalBindings.d.ts.map +1 -0
- package/lib/ModalBindings.js +223 -0
- package/lib/ModalBindings.js.map +1 -0
- package/lib/MountBucket.d.ts +80 -0
- package/lib/MountBucket.d.ts.map +1 -0
- package/lib/MountBucket.js +44 -0
- package/lib/MountBucket.js.map +1 -0
- package/lib/MountVolume.d.ts +77 -0
- package/lib/MountVolume.d.ts.map +1 -0
- package/lib/MountVolume.js +41 -0
- package/lib/MountVolume.js.map +1 -0
- package/lib/Mounts.d.ts +134 -0
- package/lib/Mounts.d.ts.map +1 -0
- package/lib/Mounts.js +87 -0
- package/lib/Mounts.js.map +1 -0
- package/lib/PersistentSandbox.d.ts +75 -0
- package/lib/PersistentSandbox.d.ts.map +1 -0
- package/lib/PersistentSandbox.js +93 -0
- package/lib/PersistentSandbox.js.map +1 -0
- package/lib/Providers.d.ts +23 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +64 -0
- package/lib/Providers.js.map +1 -0
- package/lib/Proxy.d.ts +94 -0
- package/lib/Proxy.d.ts.map +1 -0
- package/lib/Proxy.js +132 -0
- package/lib/Proxy.js.map +1 -0
- package/lib/Queue.d.ts +147 -0
- package/lib/Queue.d.ts.map +1 -0
- package/lib/Queue.js +177 -0
- package/lib/Queue.js.map +1 -0
- package/lib/QueueClient.d.ts +64 -0
- package/lib/QueueClient.d.ts.map +1 -0
- package/lib/QueueClient.js +73 -0
- package/lib/QueueClient.js.map +1 -0
- package/lib/ReadApp.d.ts +85 -0
- package/lib/ReadApp.d.ts.map +1 -0
- package/lib/ReadApp.js +3 -0
- package/lib/ReadApp.js.map +1 -0
- package/lib/ReadAppHttp.d.ts +26 -0
- package/lib/ReadAppHttp.d.ts.map +1 -0
- package/lib/ReadAppHttp.js +106 -0
- package/lib/ReadAppHttp.js.map +1 -0
- package/lib/ReadDict.d.ts +39 -0
- package/lib/ReadDict.d.ts.map +1 -0
- package/lib/ReadDict.js +3 -0
- package/lib/ReadDict.js.map +1 -0
- package/lib/ReadDictHttp.d.ts +12 -0
- package/lib/ReadDictHttp.d.ts.map +1 -0
- package/lib/ReadDictHttp.js +23 -0
- package/lib/ReadDictHttp.js.map +1 -0
- package/lib/ReadFunction.d.ts +73 -0
- package/lib/ReadFunction.d.ts.map +1 -0
- package/lib/ReadFunction.js +3 -0
- package/lib/ReadFunction.js.map +1 -0
- package/lib/ReadFunctionHttp.d.ts +25 -0
- package/lib/ReadFunctionHttp.d.ts.map +1 -0
- package/lib/ReadFunctionHttp.js +63 -0
- package/lib/ReadFunctionHttp.js.map +1 -0
- package/lib/ReadQueue.d.ts +39 -0
- package/lib/ReadQueue.d.ts.map +1 -0
- package/lib/ReadQueue.js +3 -0
- package/lib/ReadQueue.js.map +1 -0
- package/lib/ReadQueueHttp.d.ts +12 -0
- package/lib/ReadQueueHttp.d.ts.map +1 -0
- package/lib/ReadQueueHttp.js +23 -0
- package/lib/ReadQueueHttp.js.map +1 -0
- package/lib/ReadServer.d.ts +72 -0
- package/lib/ReadServer.d.ts.map +1 -0
- package/lib/ReadServer.js +3 -0
- package/lib/ReadServer.js.map +1 -0
- package/lib/ReadServerHttp.d.ts +25 -0
- package/lib/ReadServerHttp.d.ts.map +1 -0
- package/lib/ReadServerHttp.js +70 -0
- package/lib/ReadServerHttp.js.map +1 -0
- package/lib/ReadVolume.d.ts +40 -0
- package/lib/ReadVolume.d.ts.map +1 -0
- package/lib/ReadVolume.js +3 -0
- package/lib/ReadVolume.js.map +1 -0
- package/lib/ReadVolumeHttp.d.ts +12 -0
- package/lib/ReadVolumeHttp.d.ts.map +1 -0
- package/lib/ReadVolumeHttp.js +24 -0
- package/lib/ReadVolumeHttp.js.map +1 -0
- package/lib/ReadWriteDict.d.ts +39 -0
- package/lib/ReadWriteDict.d.ts.map +1 -0
- package/lib/ReadWriteDict.js +3 -0
- package/lib/ReadWriteDict.js.map +1 -0
- package/lib/ReadWriteDictHttp.d.ts +12 -0
- package/lib/ReadWriteDictHttp.d.ts.map +1 -0
- package/lib/ReadWriteDictHttp.js +23 -0
- package/lib/ReadWriteDictHttp.js.map +1 -0
- package/lib/ReadWriteQueue.d.ts +40 -0
- package/lib/ReadWriteQueue.d.ts.map +1 -0
- package/lib/ReadWriteQueue.js +3 -0
- package/lib/ReadWriteQueue.js.map +1 -0
- package/lib/ReadWriteQueueHttp.d.ts +12 -0
- package/lib/ReadWriteQueueHttp.d.ts.map +1 -0
- package/lib/ReadWriteQueueHttp.js +23 -0
- package/lib/ReadWriteQueueHttp.js.map +1 -0
- package/lib/ReadWriteVolume.d.ts +40 -0
- package/lib/ReadWriteVolume.d.ts.map +1 -0
- package/lib/ReadWriteVolume.js +3 -0
- package/lib/ReadWriteVolume.js.map +1 -0
- package/lib/ReadWriteVolumeHttp.d.ts +12 -0
- package/lib/ReadWriteVolumeHttp.d.ts.map +1 -0
- package/lib/ReadWriteVolumeHttp.js +24 -0
- package/lib/ReadWriteVolumeHttp.js.map +1 -0
- package/lib/RuntimeOwner.d.ts +39 -0
- package/lib/RuntimeOwner.d.ts.map +1 -0
- package/lib/RuntimeOwner.js +85 -0
- package/lib/RuntimeOwner.js.map +1 -0
- package/lib/Sandbox.d.ts +215 -0
- package/lib/Sandbox.d.ts.map +1 -0
- package/lib/Sandbox.js +278 -0
- package/lib/Sandbox.js.map +1 -0
- package/lib/SandboxClient.d.ts +748 -0
- package/lib/SandboxClient.d.ts.map +1 -0
- package/lib/SandboxClient.js +710 -0
- package/lib/SandboxClient.js.map +1 -0
- package/lib/ScaleFunction.d.ts +54 -0
- package/lib/ScaleFunction.d.ts.map +1 -0
- package/lib/ScaleFunction.js +3 -0
- package/lib/ScaleFunction.js.map +1 -0
- package/lib/ScaleFunctionHttp.d.ts +21 -0
- package/lib/ScaleFunctionHttp.d.ts.map +1 -0
- package/lib/ScaleFunctionHttp.js +39 -0
- package/lib/ScaleFunctionHttp.js.map +1 -0
- package/lib/Secret.d.ts +170 -0
- package/lib/Secret.d.ts.map +1 -0
- package/lib/Secret.js +196 -0
- package/lib/Secret.js.map +1 -0
- package/lib/Server.d.ts +155 -0
- package/lib/Server.d.ts.map +1 -0
- package/lib/Server.js +184 -0
- package/lib/Server.js.map +1 -0
- package/lib/ServiceUser.d.ts +139 -0
- package/lib/ServiceUser.d.ts.map +1 -0
- package/lib/ServiceUser.js +210 -0
- package/lib/ServiceUser.js.map +1 -0
- package/lib/Volume.d.ts +170 -0
- package/lib/Volume.d.ts.map +1 -0
- package/lib/Volume.js +220 -0
- package/lib/Volume.js.map +1 -0
- package/lib/VolumeClient.d.ts +53 -0
- package/lib/VolumeClient.d.ts.map +1 -0
- package/lib/VolumeClient.js +22 -0
- package/lib/VolumeClient.js.map +1 -0
- package/lib/VolumeFiles.d.ts +94 -0
- package/lib/VolumeFiles.d.ts.map +1 -0
- package/lib/VolumeFiles.js +139 -0
- package/lib/VolumeFiles.js.map +1 -0
- package/lib/WebhookToken.d.ts +102 -0
- package/lib/WebhookToken.d.ts.map +1 -0
- package/lib/WebhookToken.js +176 -0
- package/lib/WebhookToken.js.map +1 -0
- package/lib/WorkspaceSettings.d.ts +70 -0
- package/lib/WorkspaceSettings.d.ts.map +1 -0
- package/lib/WorkspaceSettings.js +105 -0
- package/lib/WorkspaceSettings.js.map +1 -0
- package/lib/WriteApp.d.ts +38 -0
- package/lib/WriteApp.d.ts.map +1 -0
- package/lib/WriteApp.js +3 -0
- package/lib/WriteApp.js.map +1 -0
- package/lib/WriteAppHttp.d.ts +23 -0
- package/lib/WriteAppHttp.d.ts.map +1 -0
- package/lib/WriteAppHttp.js +36 -0
- package/lib/WriteAppHttp.js.map +1 -0
- package/lib/WriteDict.d.ts +39 -0
- package/lib/WriteDict.d.ts.map +1 -0
- package/lib/WriteDict.js +3 -0
- package/lib/WriteDict.js.map +1 -0
- package/lib/WriteDictHttp.d.ts +12 -0
- package/lib/WriteDictHttp.d.ts.map +1 -0
- package/lib/WriteDictHttp.js +23 -0
- package/lib/WriteDictHttp.js.map +1 -0
- package/lib/WriteQueue.d.ts +39 -0
- package/lib/WriteQueue.d.ts.map +1 -0
- package/lib/WriteQueue.js +3 -0
- package/lib/WriteQueue.js.map +1 -0
- package/lib/WriteQueueHttp.d.ts +12 -0
- package/lib/WriteQueueHttp.d.ts.map +1 -0
- package/lib/WriteQueueHttp.js +23 -0
- package/lib/WriteQueueHttp.js.map +1 -0
- package/lib/WriteSecret.d.ts +53 -0
- package/lib/WriteSecret.d.ts.map +1 -0
- package/lib/WriteSecret.js +3 -0
- package/lib/WriteSecret.js.map +1 -0
- package/lib/WriteSecretHttp.d.ts +23 -0
- package/lib/WriteSecretHttp.d.ts.map +1 -0
- package/lib/WriteSecretHttp.js +44 -0
- package/lib/WriteSecretHttp.js.map +1 -0
- package/lib/WriteVolume.d.ts +39 -0
- package/lib/WriteVolume.d.ts.map +1 -0
- package/lib/WriteVolume.js +3 -0
- package/lib/WriteVolume.js.map +1 -0
- package/lib/WriteVolumeHttp.d.ts +12 -0
- package/lib/WriteVolumeHttp.d.ts.map +1 -0
- package/lib/WriteVolumeHttp.js +24 -0
- package/lib/WriteVolumeHttp.js.map +1 -0
- package/lib/index.d.ts +80 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +78 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/Declared.d.ts +29 -0
- package/lib/internal/Declared.d.ts.map +1 -0
- package/lib/internal/Declared.js +31 -0
- package/lib/internal/Declared.js.map +1 -0
- package/lib/internal/Deploy.d.ts +110 -0
- package/lib/internal/Deploy.d.ts.map +1 -0
- package/lib/internal/Deploy.js +230 -0
- package/lib/internal/Deploy.js.map +1 -0
- package/lib/internal/Entrypoint.d.ts +52 -0
- package/lib/internal/Entrypoint.d.ts.map +1 -0
- package/lib/internal/Entrypoint.js +193 -0
- package/lib/internal/Entrypoint.js.map +1 -0
- package/lib/internal/Rpc.d.ts +17 -0
- package/lib/internal/Rpc.d.ts.map +1 -0
- package/lib/internal/Rpc.js +49 -0
- package/lib/internal/Rpc.js.map +1 -0
- package/lib/internal/RpcAuth.d.ts +41 -0
- package/lib/internal/RpcAuth.d.ts.map +1 -0
- package/lib/internal/RpcAuth.js +100 -0
- package/lib/internal/RpcAuth.js.map +1 -0
- package/lib/internal/Runtime.d.ts +127 -0
- package/lib/internal/Runtime.d.ts.map +1 -0
- package/lib/internal/Runtime.js +246 -0
- package/lib/internal/Runtime.js.map +1 -0
- package/lib/internal/Tags.d.ts +19 -0
- package/lib/internal/Tags.d.ts.map +1 -0
- package/lib/internal/Tags.js +33 -0
- package/lib/internal/Tags.js.map +1 -0
- package/lib/internal/TcpConnect.d.ts +12 -0
- package/lib/internal/TcpConnect.d.ts.map +1 -0
- package/lib/internal/TcpConnect.js +46 -0
- package/lib/internal/TcpConnect.js.map +1 -0
- package/lib/internal/Transport.d.ts +13 -0
- package/lib/internal/Transport.d.ts.map +1 -0
- package/lib/internal/Transport.js +16 -0
- package/lib/internal/Transport.js.map +1 -0
- package/lib/internal.d.ts +71 -0
- package/lib/internal.d.ts.map +1 -0
- package/lib/internal.js +102 -0
- package/lib/internal.js.map +1 -0
- package/package.json +59 -3
- package/src/App.ts +262 -0
- package/src/AuthProvider.ts +295 -0
- package/src/BindingHttp.ts +112 -0
- package/src/Blob.ts +71 -0
- package/src/Bootstrap.ts +52 -0
- package/src/Cbor.ts +158 -0
- package/src/ConnectSandbox.ts +99 -0
- package/src/Container.ts +121 -0
- package/src/Contributions.ts +9 -0
- package/src/CreateDict.ts +95 -0
- package/src/CreateDictHttp.ts +91 -0
- package/src/CreateImage.ts +105 -0
- package/src/CreateImageHttp.ts +117 -0
- package/src/CreateQueue.ts +95 -0
- package/src/CreateQueueHttp.ts +91 -0
- package/src/CreateSandbox.ts +228 -0
- package/src/CreateSandboxHttp.ts +160 -0
- package/src/CreateSecret.ts +109 -0
- package/src/CreateSecretHttp.ts +83 -0
- package/src/CreateVolume.ts +96 -0
- package/src/CreateVolumeHttp.ts +93 -0
- package/src/Credentials.ts +74 -0
- package/src/Dict.ts +245 -0
- package/src/DictClient.ts +166 -0
- package/src/Domain.ts +147 -0
- package/src/Endpoint.ts +406 -0
- package/src/Environment.ts +373 -0
- package/src/FetchServer.ts +126 -0
- package/src/FetchServerHttp.ts +110 -0
- package/src/Function.ts +397 -0
- package/src/FunctionAutoscaler.ts +210 -0
- package/src/FunctionTarget.ts +181 -0
- package/src/Image.ts +281 -0
- package/src/ImageBuild.ts +228 -0
- package/src/ImagePlan.ts +78 -0
- package/src/InferEnv.ts +27 -0
- package/src/InvokeFunction.ts +211 -0
- package/src/InvokeFunctionHttp.ts +316 -0
- package/src/ModalBindings.ts +310 -0
- package/src/MountBucket.ts +137 -0
- package/src/MountVolume.ts +113 -0
- package/src/Mounts.ts +230 -0
- package/src/PersistentSandbox.ts +142 -0
- package/src/Providers.ts +100 -0
- package/src/Proxy.ts +191 -0
- package/src/Queue.ts +258 -0
- package/src/QueueClient.ts +149 -0
- package/src/ReadApp.ts +101 -0
- package/src/ReadAppHttp.ts +142 -0
- package/src/ReadDict.ts +44 -0
- package/src/ReadDictHttp.ts +27 -0
- package/src/ReadFunction.ts +107 -0
- package/src/ReadFunctionHttp.ts +91 -0
- package/src/ReadQueue.ts +44 -0
- package/src/ReadQueueHttp.ts +27 -0
- package/src/ReadServer.ts +98 -0
- package/src/ReadServerHttp.ts +101 -0
- package/src/ReadVolume.ts +45 -0
- package/src/ReadVolumeHttp.ts +28 -0
- package/src/ReadWriteDict.ts +44 -0
- package/src/ReadWriteDictHttp.ts +27 -0
- package/src/ReadWriteQueue.ts +45 -0
- package/src/ReadWriteQueueHttp.ts +27 -0
- package/src/ReadWriteVolume.ts +45 -0
- package/src/ReadWriteVolumeHttp.ts +28 -0
- package/src/RuntimeOwner.ts +111 -0
- package/src/Sandbox.ts +402 -0
- package/src/SandboxClient.ts +1404 -0
- package/src/ScaleFunction.ts +70 -0
- package/src/ScaleFunctionHttp.ts +54 -0
- package/src/Secret.ts +296 -0
- package/src/Server.ts +285 -0
- package/src/ServiceUser.ts +295 -0
- package/src/Volume.ts +320 -0
- package/src/VolumeClient.ts +108 -0
- package/src/VolumeFiles.ts +194 -0
- package/src/WebhookToken.ts +230 -0
- package/src/WorkspaceSettings.ts +160 -0
- package/src/WriteApp.ts +43 -0
- package/src/WriteAppHttp.ts +51 -0
- package/src/WriteDict.ts +44 -0
- package/src/WriteDictHttp.ts +27 -0
- package/src/WriteQueue.ts +44 -0
- package/src/WriteQueueHttp.ts +27 -0
- package/src/WriteSecret.ts +60 -0
- package/src/WriteSecretHttp.ts +56 -0
- package/src/WriteVolume.ts +44 -0
- package/src/WriteVolumeHttp.ts +28 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +85 -0
- package/src/internal/Declared.ts +80 -0
- package/src/internal/Deploy.ts +309 -0
- package/src/internal/Entrypoint.ts +198 -0
- package/src/internal/Rpc.ts +59 -0
- package/src/internal/RpcAuth.ts +132 -0
- package/src/internal/Runtime.ts +386 -0
- package/src/internal/Tags.ts +44 -0
- package/src/internal/TcpConnect.ts +78 -0
- package/src/internal/Transport.ts +25 -0
- package/src/internal.ts +147 -0
package/lib/Sandbox.d.ts
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import * as image from "@distilled.cloud/modal/image";
|
|
2
|
+
import type * as Bundle from "alchemy/Bundle/Bundle";
|
|
3
|
+
import { Platform, type Main, type PlatformProps } from "alchemy/Platform";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import type { Resource } from "alchemy/Resource";
|
|
6
|
+
import { type HostRuntimeContext, type ServerHost } from "alchemy/Runtime/Process";
|
|
7
|
+
import { Stack } from "alchemy/Stack";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import type { App } from "./App.ts";
|
|
10
|
+
import { type ModalMounts, type Mount, type MountContract } from "./Mounts.ts";
|
|
11
|
+
import type { Providers } from "./Providers.ts";
|
|
12
|
+
type Ref<T> = T | Effect.Effect<T, never, Providers>;
|
|
13
|
+
export interface SandboxProps extends PlatformProps {
|
|
14
|
+
/**
|
|
15
|
+
* Module entrypoint, bundled and baked into the sandbox image. Typically
|
|
16
|
+
* `import.meta.url`. A change to the bundle builds a new image.
|
|
17
|
+
*/
|
|
18
|
+
main: string;
|
|
19
|
+
/** The App sandboxes run in. */
|
|
20
|
+
app: Ref<App>;
|
|
21
|
+
/**
|
|
22
|
+
* Base image the bundle runs on. It needs Bun on the `PATH`.
|
|
23
|
+
* @default "oven/bun:1"
|
|
24
|
+
*/
|
|
25
|
+
image?: string;
|
|
26
|
+
/** Dockerfile lines run on the base before the bundle is added. */
|
|
27
|
+
commands?: string[];
|
|
28
|
+
/**
|
|
29
|
+
* Port the program's `fetch` handler listens on, opened as an encrypted
|
|
30
|
+
* tunnel on every sandbox.
|
|
31
|
+
* @default 8080
|
|
32
|
+
*/
|
|
33
|
+
port?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Named export to load from `main`.
|
|
36
|
+
* @default "default"
|
|
37
|
+
*/
|
|
38
|
+
handler?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Extra environment variables for the program. Stored, with the
|
|
41
|
+
* bindings' env, in a Modal Secret attached to every sandbox.
|
|
42
|
+
*/
|
|
43
|
+
env?: Record<string, any>;
|
|
44
|
+
/** Bundler options. */
|
|
45
|
+
build?: Bundle.BundleConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Volumes and cloud buckets mounted into every sandbox:
|
|
48
|
+
* `[{ volume: Data, path: "/data" }]`. `Modal.MountVolume` and
|
|
49
|
+
* `Modal.MountBucket` in the program add more.
|
|
50
|
+
*/
|
|
51
|
+
mounts?: Mount[];
|
|
52
|
+
}
|
|
53
|
+
export interface SandboxAttributes {
|
|
54
|
+
/** The image with the bundled program (`im-…`). */
|
|
55
|
+
imageId: string;
|
|
56
|
+
/** The App sandboxes run in. */
|
|
57
|
+
appId: string;
|
|
58
|
+
/** Name of the App. */
|
|
59
|
+
appName: string | undefined;
|
|
60
|
+
/** Environment of the App. */
|
|
61
|
+
environment: string | undefined;
|
|
62
|
+
/** The Modal Secret holding the program's env (bindings' credentials included). */
|
|
63
|
+
secretId: string;
|
|
64
|
+
/** Name of that secret. */
|
|
65
|
+
secretName: string;
|
|
66
|
+
/** Port the program listens on. */
|
|
67
|
+
port: number;
|
|
68
|
+
/** The command each sandbox runs. */
|
|
69
|
+
command: string[];
|
|
70
|
+
/** Modal's volume and bucket mounts every sandbox gets (props and bindings). */
|
|
71
|
+
mounts: ModalMounts;
|
|
72
|
+
/** Content hash of the bundle and image inputs. */
|
|
73
|
+
hash: string;
|
|
74
|
+
}
|
|
75
|
+
export type Sandbox = Resource<"Modal.Sandbox", SandboxProps, SandboxAttributes, {
|
|
76
|
+
env?: Record<string, any>;
|
|
77
|
+
mounts?: MountContract;
|
|
78
|
+
}, Providers>;
|
|
79
|
+
export type SandboxServices = ServerHost;
|
|
80
|
+
export type SandboxShape = Main<SandboxServices>;
|
|
81
|
+
export type SandboxRuntimeContext = HostRuntimeContext;
|
|
82
|
+
/**
|
|
83
|
+
* An Effect program that runs in Modal sandboxes. Alchemy bundles `main`,
|
|
84
|
+
* builds it into an image on Modal's builder (no Docker), and stores its
|
|
85
|
+
* env, including the credentials its bindings need, in a Modal Secret.
|
|
86
|
+
* `Modal.CreateSandbox(Agent)` then boots sandboxes that run the program and
|
|
87
|
+
* serve its `fetch` handler; `sandbox.getTcpPort()` reaches it.
|
|
88
|
+
*
|
|
89
|
+
* Each sandbox is an isolated instance: give one to every user, session or
|
|
90
|
+
* task, and terminate it when the work is done. A sandbox lives at most 24
|
|
91
|
+
* hours. Bindings work inside it like on any host, so the program can read a
|
|
92
|
+
* Modal Volume or a Cloudflare R2 bucket.
|
|
93
|
+
*
|
|
94
|
+
* ### Effect program
|
|
95
|
+
* **Example:** An agent that answers over HTTP
|
|
96
|
+
* ```typescript
|
|
97
|
+
* // src/Agent.ts
|
|
98
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
99
|
+
* import * as Effect from "effect/Effect";
|
|
100
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
101
|
+
* import { Coder } from "./Coder.ts";
|
|
102
|
+
*
|
|
103
|
+
* export default class Agent extends Modal.Sandbox<Agent>()(
|
|
104
|
+
* "Agent",
|
|
105
|
+
* { main: import.meta.url, app: Coder },
|
|
106
|
+
* Effect.gen(function* () {
|
|
107
|
+
* return {
|
|
108
|
+
* fetch: Effect.succeed(HttpServerResponse.text("ready")),
|
|
109
|
+
* };
|
|
110
|
+
* }),
|
|
111
|
+
* ) {}
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* ### Async program
|
|
115
|
+
* **Example:** A plain HTTP server, no Effect (it runs on Bun)
|
|
116
|
+
* ```typescript
|
|
117
|
+
* // src/Agent.ts
|
|
118
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
119
|
+
* import { Coder } from "./Coder.ts";
|
|
120
|
+
*
|
|
121
|
+
* export const Agent = Modal.Sandbox("Agent", {
|
|
122
|
+
* main: "./src/agent-server.ts",
|
|
123
|
+
* app: Coder,
|
|
124
|
+
* env: { GREETING: "hello" },
|
|
125
|
+
* });
|
|
126
|
+
* export type AgentEnv = Modal.InferEnv<typeof Agent>;
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* ```typescript
|
|
130
|
+
* // src/agent-server.ts
|
|
131
|
+
* import { createServer } from "node:http";
|
|
132
|
+
* import type { AgentEnv } from "./Agent.ts";
|
|
133
|
+
*
|
|
134
|
+
* const env = process.env as unknown as AgentEnv;
|
|
135
|
+
*
|
|
136
|
+
* createServer((_request, response) => response.end(env.GREETING)).listen(Number(process.env.PORT));
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* ### Starting instances
|
|
140
|
+
* **Example:** One sandbox per request from a Worker
|
|
141
|
+
* ```typescript
|
|
142
|
+
* // src/Api.ts
|
|
143
|
+
* import * as Cloudflare from "@alchemy.run/cloudflare";
|
|
144
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
145
|
+
* import * as Effect from "effect/Effect";
|
|
146
|
+
* import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
147
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
148
|
+
* import Agent from "./Agent.ts";
|
|
149
|
+
*
|
|
150
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
151
|
+
* "Api",
|
|
152
|
+
* { main: import.meta.url, compatibility: { flags: ["nodejs_compat"] } },
|
|
153
|
+
* Effect.gen(function* () {
|
|
154
|
+
* const agents = yield* Modal.CreateSandbox(Agent);
|
|
155
|
+
* return {
|
|
156
|
+
* fetch: Effect.gen(function* () {
|
|
157
|
+
* const agent = yield* agents.create({ timeout: "10 minutes" });
|
|
158
|
+
* const port = yield* agent.getTcpPort();
|
|
159
|
+
* const response = yield* port.fetch(HttpClientRequest.get("/"));
|
|
160
|
+
* const text = yield* response.text;
|
|
161
|
+
* yield* agent.terminate();
|
|
162
|
+
* return HttpServerResponse.text(text);
|
|
163
|
+
* }).pipe(Effect.orDie),
|
|
164
|
+
* };
|
|
165
|
+
* }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
|
|
166
|
+
* ) {}
|
|
167
|
+
* ```
|
|
168
|
+
*
|
|
169
|
+
* ### Bindings inside the sandbox
|
|
170
|
+
* **Example:** Read a Modal Volume from the program
|
|
171
|
+
* ```typescript
|
|
172
|
+
* // src/Agent.ts
|
|
173
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
174
|
+
* import * as Effect from "effect/Effect";
|
|
175
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
176
|
+
* import { Coder, Models } from "./Coder.ts";
|
|
177
|
+
*
|
|
178
|
+
* export default class Agent extends Modal.Sandbox<Agent>()(
|
|
179
|
+
* "Agent",
|
|
180
|
+
* { main: import.meta.url, app: Coder },
|
|
181
|
+
* Effect.gen(function* () {
|
|
182
|
+
* const models = yield* Modal.ReadVolume(Models);
|
|
183
|
+
* return {
|
|
184
|
+
* fetch: Effect.gen(function* () {
|
|
185
|
+
* const files = yield* models.listFiles("/");
|
|
186
|
+
* return yield* HttpServerResponse.json(files);
|
|
187
|
+
* }).pipe(Effect.orDie),
|
|
188
|
+
* };
|
|
189
|
+
* }).pipe(Effect.provide(Modal.ReadVolumeHttp)),
|
|
190
|
+
* ) {}
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
193
|
+
* ### Configuration
|
|
194
|
+
* **Example:** A GPU-ready base and a custom port
|
|
195
|
+
* ```typescript
|
|
196
|
+
* export default class Trainer extends Modal.Sandbox<Trainer>()(
|
|
197
|
+
* "Trainer",
|
|
198
|
+
* {
|
|
199
|
+
* main: import.meta.url,
|
|
200
|
+
* app: Coder,
|
|
201
|
+
* image: "nvidia/cuda:12.4.1-runtime-ubuntu22.04",
|
|
202
|
+
* commands: ["RUN apt-get update && apt-get install -y curl unzip && curl -fsSL https://bun.sh/install | bash && ln -s /root/.bun/bin/bun /usr/local/bin/bun"],
|
|
203
|
+
* port: 3000,
|
|
204
|
+
* },
|
|
205
|
+
* program,
|
|
206
|
+
* ) {}
|
|
207
|
+
* ```
|
|
208
|
+
*
|
|
209
|
+
* @resource
|
|
210
|
+
* @product Sandbox
|
|
211
|
+
*/
|
|
212
|
+
export declare const Sandbox: Platform<Sandbox, SandboxServices, SandboxShape, SandboxRuntimeContext>;
|
|
213
|
+
export declare const SandboxProvider: () => import("effect/Layer").Layer<Provider.Provider<Sandbox>, never, import("effect/FileSystem").FileSystem | import("effect/Path").Path | Stack | import("alchemy/Stage").Stage | image.ModalOpContext>;
|
|
214
|
+
export {};
|
|
215
|
+
//# sourceMappingURL=Sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sandbox.d.ts","sources":["../src/Sandbox.ts"],"names":[],"mappings":"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"}
|
package/lib/Sandbox.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
|
|
2
|
+
import * as image from "@distilled.cloud/modal/image";
|
|
3
|
+
import * as secret from "@distilled.cloud/modal/secret";
|
|
4
|
+
import { deepEqual, isResolved } from "alchemy/Diff";
|
|
5
|
+
import { mountInstallLines } from "alchemy/Mount";
|
|
6
|
+
import { Platform } from "alchemy/Platform";
|
|
7
|
+
import * as Provider from "alchemy/Provider";
|
|
8
|
+
import { createHostRuntimeContext, } from "alchemy/Runtime/Process";
|
|
9
|
+
import { Stack } from "alchemy/Stack";
|
|
10
|
+
import { sha256Object } from "alchemy/Util/sha256";
|
|
11
|
+
import * as Effect from "effect/Effect";
|
|
12
|
+
import * as Redacted from "effect/Redacted";
|
|
13
|
+
import { buildImage, ImageBuildOps } from "./ImageBuild.js";
|
|
14
|
+
import { checkCommands, lowerPlan, MODAL_CAPABILITIES } from "./ImagePlan.js";
|
|
15
|
+
import { envNameOf, objectName } from "./internal.js";
|
|
16
|
+
import { resolveDeclarations } from "./internal/Declared.js";
|
|
17
|
+
import { boundCapabilities, boundMounts, checkModalMounts, modalMountsOf, } from "./Mounts.js";
|
|
18
|
+
import { putSecret } from "./Secret.js";
|
|
19
|
+
const DEFAULT_PORT = 8080;
|
|
20
|
+
/**
|
|
21
|
+
* An Effect program that runs in Modal sandboxes. Alchemy bundles `main`,
|
|
22
|
+
* builds it into an image on Modal's builder (no Docker), and stores its
|
|
23
|
+
* env, including the credentials its bindings need, in a Modal Secret.
|
|
24
|
+
* `Modal.CreateSandbox(Agent)` then boots sandboxes that run the program and
|
|
25
|
+
* serve its `fetch` handler; `sandbox.getTcpPort()` reaches it.
|
|
26
|
+
*
|
|
27
|
+
* Each sandbox is an isolated instance: give one to every user, session or
|
|
28
|
+
* task, and terminate it when the work is done. A sandbox lives at most 24
|
|
29
|
+
* hours. Bindings work inside it like on any host, so the program can read a
|
|
30
|
+
* Modal Volume or a Cloudflare R2 bucket.
|
|
31
|
+
*
|
|
32
|
+
* ### Effect program
|
|
33
|
+
* **Example:** An agent that answers over HTTP
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // src/Agent.ts
|
|
36
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
37
|
+
* import * as Effect from "effect/Effect";
|
|
38
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
39
|
+
* import { Coder } from "./Coder.ts";
|
|
40
|
+
*
|
|
41
|
+
* export default class Agent extends Modal.Sandbox<Agent>()(
|
|
42
|
+
* "Agent",
|
|
43
|
+
* { main: import.meta.url, app: Coder },
|
|
44
|
+
* Effect.gen(function* () {
|
|
45
|
+
* return {
|
|
46
|
+
* fetch: Effect.succeed(HttpServerResponse.text("ready")),
|
|
47
|
+
* };
|
|
48
|
+
* }),
|
|
49
|
+
* ) {}
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* ### Async program
|
|
53
|
+
* **Example:** A plain HTTP server, no Effect (it runs on Bun)
|
|
54
|
+
* ```typescript
|
|
55
|
+
* // src/Agent.ts
|
|
56
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
57
|
+
* import { Coder } from "./Coder.ts";
|
|
58
|
+
*
|
|
59
|
+
* export const Agent = Modal.Sandbox("Agent", {
|
|
60
|
+
* main: "./src/agent-server.ts",
|
|
61
|
+
* app: Coder,
|
|
62
|
+
* env: { GREETING: "hello" },
|
|
63
|
+
* });
|
|
64
|
+
* export type AgentEnv = Modal.InferEnv<typeof Agent>;
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* ```typescript
|
|
68
|
+
* // src/agent-server.ts
|
|
69
|
+
* import { createServer } from "node:http";
|
|
70
|
+
* import type { AgentEnv } from "./Agent.ts";
|
|
71
|
+
*
|
|
72
|
+
* const env = process.env as unknown as AgentEnv;
|
|
73
|
+
*
|
|
74
|
+
* createServer((_request, response) => response.end(env.GREETING)).listen(Number(process.env.PORT));
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* ### Starting instances
|
|
78
|
+
* **Example:** One sandbox per request from a Worker
|
|
79
|
+
* ```typescript
|
|
80
|
+
* // src/Api.ts
|
|
81
|
+
* import * as Cloudflare from "@alchemy.run/cloudflare";
|
|
82
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
83
|
+
* import * as Effect from "effect/Effect";
|
|
84
|
+
* import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
85
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
86
|
+
* import Agent from "./Agent.ts";
|
|
87
|
+
*
|
|
88
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
89
|
+
* "Api",
|
|
90
|
+
* { main: import.meta.url, compatibility: { flags: ["nodejs_compat"] } },
|
|
91
|
+
* Effect.gen(function* () {
|
|
92
|
+
* const agents = yield* Modal.CreateSandbox(Agent);
|
|
93
|
+
* return {
|
|
94
|
+
* fetch: Effect.gen(function* () {
|
|
95
|
+
* const agent = yield* agents.create({ timeout: "10 minutes" });
|
|
96
|
+
* const port = yield* agent.getTcpPort();
|
|
97
|
+
* const response = yield* port.fetch(HttpClientRequest.get("/"));
|
|
98
|
+
* const text = yield* response.text;
|
|
99
|
+
* yield* agent.terminate();
|
|
100
|
+
* return HttpServerResponse.text(text);
|
|
101
|
+
* }).pipe(Effect.orDie),
|
|
102
|
+
* };
|
|
103
|
+
* }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
|
|
104
|
+
* ) {}
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* ### Bindings inside the sandbox
|
|
108
|
+
* **Example:** Read a Modal Volume from the program
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // src/Agent.ts
|
|
111
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
112
|
+
* import * as Effect from "effect/Effect";
|
|
113
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
114
|
+
* import { Coder, Models } from "./Coder.ts";
|
|
115
|
+
*
|
|
116
|
+
* export default class Agent extends Modal.Sandbox<Agent>()(
|
|
117
|
+
* "Agent",
|
|
118
|
+
* { main: import.meta.url, app: Coder },
|
|
119
|
+
* Effect.gen(function* () {
|
|
120
|
+
* const models = yield* Modal.ReadVolume(Models);
|
|
121
|
+
* return {
|
|
122
|
+
* fetch: Effect.gen(function* () {
|
|
123
|
+
* const files = yield* models.listFiles("/");
|
|
124
|
+
* return yield* HttpServerResponse.json(files);
|
|
125
|
+
* }).pipe(Effect.orDie),
|
|
126
|
+
* };
|
|
127
|
+
* }).pipe(Effect.provide(Modal.ReadVolumeHttp)),
|
|
128
|
+
* ) {}
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* ### Configuration
|
|
132
|
+
* **Example:** A GPU-ready base and a custom port
|
|
133
|
+
* ```typescript
|
|
134
|
+
* export default class Trainer extends Modal.Sandbox<Trainer>()(
|
|
135
|
+
* "Trainer",
|
|
136
|
+
* {
|
|
137
|
+
* main: import.meta.url,
|
|
138
|
+
* app: Coder,
|
|
139
|
+
* image: "nvidia/cuda:12.4.1-runtime-ubuntu22.04",
|
|
140
|
+
* commands: ["RUN apt-get update && apt-get install -y curl unzip && curl -fsSL https://bun.sh/install | bash && ln -s /root/.bun/bin/bun /usr/local/bin/bun"],
|
|
141
|
+
* port: 3000,
|
|
142
|
+
* },
|
|
143
|
+
* program,
|
|
144
|
+
* ) {}
|
|
145
|
+
* ```
|
|
146
|
+
*
|
|
147
|
+
* @resource
|
|
148
|
+
* @product Sandbox
|
|
149
|
+
*/
|
|
150
|
+
export const Sandbox = Platform("Modal.Sandbox", {
|
|
151
|
+
createRuntimeContext: createHostRuntimeContext("Modal.Sandbox"),
|
|
152
|
+
// `{ app: Coder }` at module scope is an Effect: yield it so the App is
|
|
153
|
+
// registered and `news.app` is resolved attributes at reconcile.
|
|
154
|
+
transformProps: (_id, props) => Effect.gen(function* () {
|
|
155
|
+
if (globalThis.__ALCHEMY_RUNTIME__)
|
|
156
|
+
return props;
|
|
157
|
+
const app = Effect.isEffect(props.app)
|
|
158
|
+
? yield* props.app
|
|
159
|
+
: props.app;
|
|
160
|
+
const mounts = props.mounts === undefined
|
|
161
|
+
? undefined
|
|
162
|
+
: (yield* resolveDeclarations(props.mounts));
|
|
163
|
+
return { ...props, app, mounts };
|
|
164
|
+
}),
|
|
165
|
+
});
|
|
166
|
+
const bootstrapEntry = (handler) => (importPath) => `
|
|
167
|
+
import { bootstrap } from "@alchemy.run/modal/Bootstrap";
|
|
168
|
+
import { ${handler} as entrypoint } from ${JSON.stringify(importPath)};
|
|
169
|
+
|
|
170
|
+
await bootstrap(entrypoint);
|
|
171
|
+
`;
|
|
172
|
+
const appOf = (value) => {
|
|
173
|
+
const rec = (value ?? {});
|
|
174
|
+
return { appId: rec.appId ?? "", appName: rec.name, environment: envNameOf(rec.environment) };
|
|
175
|
+
};
|
|
176
|
+
/** An env value as a string, as the program's `process.env` sees it. */
|
|
177
|
+
const envText = (value) => typeof value === "string"
|
|
178
|
+
? value
|
|
179
|
+
: Redacted.isRedacted(value)
|
|
180
|
+
? String(Redacted.value(value))
|
|
181
|
+
: JSON.stringify(value ?? null);
|
|
182
|
+
export const SandboxProvider = () => Provider.effect(Sandbox, Effect.gen(function* () {
|
|
183
|
+
const stack = yield* Stack;
|
|
184
|
+
/** Plan the program's image (bundle + bootstrap) with the shared BuildPlan. */
|
|
185
|
+
const prepare = Effect.fn(function* (news, port, bindings) {
|
|
186
|
+
// Other providers' mount clients go into the image; Modal can't
|
|
187
|
+
// provide FUSE or NFS, so those that need it fail here.
|
|
188
|
+
const capabilities = boundCapabilities(bindings);
|
|
189
|
+
yield* checkModalMounts("Modal.Sandbox", capabilities);
|
|
190
|
+
const plan = yield* BuildPlan.plan({
|
|
191
|
+
main: news.main,
|
|
192
|
+
image: news.image,
|
|
193
|
+
handler: news.handler,
|
|
194
|
+
build: news.build,
|
|
195
|
+
}, {
|
|
196
|
+
capabilities: { ...MODAL_CAPABILITIES, target: "Modal.Sandbox" },
|
|
197
|
+
port,
|
|
198
|
+
bootstrap: news.isExternal ? undefined : bootstrapEntry(news.handler ?? "default"),
|
|
199
|
+
install: mountInstallLines(capabilities),
|
|
200
|
+
});
|
|
201
|
+
const extra = yield* checkCommands(news.commands ?? []);
|
|
202
|
+
const spec = yield* lowerPlan(plan, extra);
|
|
203
|
+
const hash = yield* sha256Object({ plan: plan.hash, extra });
|
|
204
|
+
const command = BuildPlan.startCommand(plan) ?? [];
|
|
205
|
+
return { spec, hash, command: [...command] };
|
|
206
|
+
});
|
|
207
|
+
return {
|
|
208
|
+
stables: ["appId", "secretName"],
|
|
209
|
+
diff: Effect.fn(function* ({ news, output, newBindings }) {
|
|
210
|
+
if (!isResolved(news) || !isResolved(newBindings) || output === undefined) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
if (appOf(news.app).appId !== output.appId)
|
|
214
|
+
return { action: "replace" };
|
|
215
|
+
const { hash } = yield* prepare(news, news.port ?? DEFAULT_PORT, newBindings);
|
|
216
|
+
if (hash !== output.hash)
|
|
217
|
+
return { action: "update" };
|
|
218
|
+
const mounts = yield* modalMountsOf([
|
|
219
|
+
...(news.mounts ?? []),
|
|
220
|
+
...boundMounts(newBindings),
|
|
221
|
+
]);
|
|
222
|
+
return deepEqual(mounts, output.mounts) ? undefined : { action: "update" };
|
|
223
|
+
}),
|
|
224
|
+
read: Effect.fn(function* ({ output }) {
|
|
225
|
+
if (output === undefined)
|
|
226
|
+
return undefined;
|
|
227
|
+
const found = yield* image
|
|
228
|
+
.imageFromId({ imageId: output.imageId })
|
|
229
|
+
.pipe(Effect.catchTag("ImageNotFound", () => Effect.undefined));
|
|
230
|
+
return found?.imageId ? output : undefined;
|
|
231
|
+
}),
|
|
232
|
+
reconcile: Effect.fn(function* ({ id, news, output, session, bindings }) {
|
|
233
|
+
const app = appOf(news.app);
|
|
234
|
+
// The props' mounts, then the ones `Modal.MountVolume` / `MountBucket` bound.
|
|
235
|
+
const mounts = yield* modalMountsOf([...(news.mounts ?? []), ...boundMounts(bindings)]);
|
|
236
|
+
const port = news.port ?? DEFAULT_PORT;
|
|
237
|
+
const secretName = output?.secretName ?? `${yield* objectName(id, undefined, 58)}-env`;
|
|
238
|
+
// Sync the program's env (bindings' credentials included) into a
|
|
239
|
+
// secret every sandbox attaches; values never enter the image.
|
|
240
|
+
const env = {
|
|
241
|
+
ALCHEMY_STACK_NAME: stack.name,
|
|
242
|
+
ALCHEMY_STAGE: stack.stage,
|
|
243
|
+
ALCHEMY_PHASE: "runtime",
|
|
244
|
+
HOST: "0.0.0.0",
|
|
245
|
+
PORT: String(port),
|
|
246
|
+
};
|
|
247
|
+
for (const [key, value] of Object.entries(news.env ?? {}))
|
|
248
|
+
env[key] = envText(value);
|
|
249
|
+
const stored = yield* putSecret(yield* secret.secretGetOrCreate, secretName, app.environment, env);
|
|
250
|
+
// Ensure the image: Modal reuses a cached build for the same inputs.
|
|
251
|
+
const { spec, hash, command } = yield* prepare(news, port, bindings);
|
|
252
|
+
const imageId = output !== undefined && output.hash === hash && output.appId === app.appId
|
|
253
|
+
? output.imageId
|
|
254
|
+
: yield* buildImage(yield* ImageBuildOps, app.appId, spec, { note: session.note });
|
|
255
|
+
return {
|
|
256
|
+
imageId,
|
|
257
|
+
appId: app.appId,
|
|
258
|
+
appName: app.appName,
|
|
259
|
+
environment: app.environment,
|
|
260
|
+
secretId: stored.secretId,
|
|
261
|
+
secretName,
|
|
262
|
+
port,
|
|
263
|
+
command,
|
|
264
|
+
mounts,
|
|
265
|
+
hash,
|
|
266
|
+
};
|
|
267
|
+
}),
|
|
268
|
+
delete: Effect.fn(function* ({ output }) {
|
|
269
|
+
yield* secret
|
|
270
|
+
.deleteSecret({ secretId: output.secretId })
|
|
271
|
+
.pipe(Effect.catchTag("SecretNotFound", () => Effect.void));
|
|
272
|
+
yield* image
|
|
273
|
+
.deleteImage({ imageId: output.imageId })
|
|
274
|
+
.pipe(Effect.catchTag("ImageNotFound", () => Effect.void));
|
|
275
|
+
}),
|
|
276
|
+
};
|
|
277
|
+
}));
|
|
278
|
+
//# sourceMappingURL=Sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sandbox.js","sources":["../src/Sandbox.ts"],"names":[],"mappings":"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"}
|