@alchemy.run/modal 0.0.0-stage → 2.0.0-beta.86
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 +100 -2
- 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 +75 -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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import * as Binding from "alchemy/Binding";
|
|
2
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
3
|
+
import type * as Effect from "effect/Effect";
|
|
4
|
+
import type { App } from "./App.ts";
|
|
5
|
+
import type { Image } from "./Image.ts";
|
|
6
|
+
import type { ErrorOf } from "./internal.ts";
|
|
7
|
+
import type { Sandbox } from "./Sandbox.ts";
|
|
8
|
+
import type { createPersistentSandbox, createSandbox, listSandboxes, PersistentSandboxCreateOptions, PersistentSandboxHandle, restoreSandbox, SandboxCreateOptions, SandboxHandle, sandboxFromName, SandboxOpError } from "./SandboxClient.ts";
|
|
9
|
+
export type { ExecOptions, PersistentSandboxCreateOptions, PersistentSandboxHandle, ExecResult, HeaderReplacement, SandboxCreateOptions, SandboxFileEntry, SandboxHandle, SandboxTunnel, } from "./SandboxClient.ts";
|
|
10
|
+
/** A sandbox as `list` reports it. */
|
|
11
|
+
export interface SandboxSummary {
|
|
12
|
+
readonly sandboxId: string;
|
|
13
|
+
readonly name: string | undefined;
|
|
14
|
+
readonly createdAt: number | undefined;
|
|
15
|
+
readonly tags: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
/** Sandbox cost for one combination of tag values. */
|
|
18
|
+
export interface SandboxUsageGroup {
|
|
19
|
+
/** The grouped tags' values. */
|
|
20
|
+
readonly tags: Record<string, string>;
|
|
21
|
+
/** Total cost in USD. */
|
|
22
|
+
readonly cost: number;
|
|
23
|
+
/** Cost by resource (`cpu`, `memory`, `gpu`, ...). */
|
|
24
|
+
readonly costByResource: Record<string, number>;
|
|
25
|
+
}
|
|
26
|
+
/** Create and find sandboxes in one App. Every handle method calls Modal. */
|
|
27
|
+
export interface SandboxesClient {
|
|
28
|
+
/** The App sandboxes are created in. */
|
|
29
|
+
readonly appId: Effect.Effect<string>;
|
|
30
|
+
/** Create a sandbox. Modal's own sandbox parameters; the bound image is the default `image`. */
|
|
31
|
+
create(options?: SandboxCreateOptions): Effect.Effect<SandboxHandle, ErrorOf<typeof createSandbox>, RuntimeContext>;
|
|
32
|
+
/** A running sandbox by name, or `undefined`. */
|
|
33
|
+
fromName(name: string): Effect.Effect<SandboxHandle | undefined, ErrorOf<typeof sandboxFromName>, RuntimeContext>;
|
|
34
|
+
/** A sandbox by id. */
|
|
35
|
+
fromId(sandboxId: string): Effect.Effect<SandboxHandle>;
|
|
36
|
+
/** Running sandboxes of the App, optionally filtered by tags. */
|
|
37
|
+
list(options?: {
|
|
38
|
+
readonly tags?: Record<string, string>;
|
|
39
|
+
readonly includeFinished?: boolean;
|
|
40
|
+
}): Effect.Effect<ReadonlyArray<SandboxSummary>, ErrorOf<typeof listSandboxes>, RuntimeContext>;
|
|
41
|
+
/**
|
|
42
|
+
* Create a persistent sandbox: one box whose filesystem outlives its
|
|
43
|
+
* sessions. Each session runs up to an hour and pauses after five idle
|
|
44
|
+
* minutes; `session()` resumes it from where it stopped.
|
|
45
|
+
*/
|
|
46
|
+
createPersistent(options?: PersistentSandboxCreateOptions): Effect.Effect<PersistentSandboxHandle, ErrorOf<typeof createPersistentSandbox>, RuntimeContext>;
|
|
47
|
+
/** A persistent sandbox by id (a `Modal.PersistentSandbox`, or one `createPersistent` made). */
|
|
48
|
+
persistent(box: string | {
|
|
49
|
+
readonly persistentSandboxId: string;
|
|
50
|
+
}): Effect.Effect<PersistentSandboxHandle>;
|
|
51
|
+
/**
|
|
52
|
+
* What the App's sandboxes cost over a time range, grouped by tag values
|
|
53
|
+
* (`groupByTags: ["user"]` gives one group per user). Modal reports
|
|
54
|
+
* whole hours: `since` rounds down and `until` (default now) up to the
|
|
55
|
+
* hour.
|
|
56
|
+
*/
|
|
57
|
+
usage(query: {
|
|
58
|
+
readonly since: Date | string | number;
|
|
59
|
+
readonly until?: Date | string | number;
|
|
60
|
+
readonly groupByTags?: ReadonlyArray<string>;
|
|
61
|
+
readonly tags?: Record<string, string>;
|
|
62
|
+
}): Effect.Effect<ReadonlyArray<SandboxUsageGroup>, SandboxOpError<"usage">, RuntimeContext>;
|
|
63
|
+
/** Start a new sandbox from a memory snapshot (`handle.snapshotMemory()`). */
|
|
64
|
+
restore(snapshot: {
|
|
65
|
+
readonly snapshotId: string;
|
|
66
|
+
}, options?: {
|
|
67
|
+
readonly name?: string;
|
|
68
|
+
}): Effect.Effect<SandboxHandle, ErrorOf<typeof restoreSandbox> | SandboxOpError<"setTags">, RuntimeContext>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create and drive Modal Sandboxes from any runtime: a Worker, a Lambda, a
|
|
72
|
+
* Durable Object, or a script.
|
|
73
|
+
*
|
|
74
|
+
* Bind it to an App (sandboxes boot from the image you pass to `create`) or
|
|
75
|
+
* to an Image (it is the default image, and sandboxes go in the image's
|
|
76
|
+
* App). A sandbox lives at most 24 hours; to keep work across sandboxes, use
|
|
77
|
+
* a Volume, or snapshot it (`snapshotFilesystem`, `snapshotMemory`) and
|
|
78
|
+
* start the next one from the snapshot.
|
|
79
|
+
*
|
|
80
|
+
* Sandboxes are runtime objects: they aren't in Alchemy state. Stopping the
|
|
81
|
+
* App (destroying the `Modal.App` resource) terminates every sandbox in it.
|
|
82
|
+
*
|
|
83
|
+
* Objects created at run time are tagged with the stack, stage and binding
|
|
84
|
+
* (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
|
|
85
|
+
* the stack is destroyed. List them by those tags to clean them up:
|
|
86
|
+
* `sandboxes.list({ tags: { "alchemy::stack": "my-app" } })`, or Modal's
|
|
87
|
+
* `SandboxList` with `tags`. Your own `tags` merge under the three. A
|
|
88
|
+
* persistent sandbox takes neither tags nor a name, so it carries no owner;
|
|
89
|
+
* it lives in the App.
|
|
90
|
+
*
|
|
91
|
+
* ### Create a sandbox per request
|
|
92
|
+
* **Example:** Run a command and terminate
|
|
93
|
+
* ```typescript
|
|
94
|
+
* import * as Cloudflare from "@alchemy.run/cloudflare";
|
|
95
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
96
|
+
* import * as Effect from "effect/Effect";
|
|
97
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
98
|
+
* import { Warm } from "./Coder.ts";
|
|
99
|
+
*
|
|
100
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
101
|
+
* "Api",
|
|
102
|
+
* { main: import.meta.url },
|
|
103
|
+
* Effect.gen(function* () {
|
|
104
|
+
* const sandboxes = yield* Modal.CreateSandbox(Warm);
|
|
105
|
+
* return {
|
|
106
|
+
* fetch: Effect.gen(function* () {
|
|
107
|
+
* const sandbox = yield* Effect.acquireRelease(
|
|
108
|
+
* sandboxes.create({ timeout: "10 minutes" }),
|
|
109
|
+
* (sandbox) => Effect.ignore(sandbox.terminate()),
|
|
110
|
+
* );
|
|
111
|
+
* const test = yield* sandbox.exec(["pnpm", "test"], { cwd: "/work" });
|
|
112
|
+
* return yield* HttpServerResponse.json(test);
|
|
113
|
+
* }).pipe(Effect.scoped, Effect.orDie),
|
|
114
|
+
* };
|
|
115
|
+
* }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
|
|
116
|
+
* ) {}
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* ### One sandbox per session
|
|
120
|
+
* **Example:** Find it by name, else create it
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const sandbox =
|
|
123
|
+
* (yield* sandboxes.fromName(`session-${user}`)) ??
|
|
124
|
+
* (yield* sandboxes.create({ name: `session-${user}`, idleTimeout: "10 minutes" }));
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* ### Secrets the sandbox never sees
|
|
128
|
+
* **Example:** Inject an API key into outbound requests
|
|
129
|
+
* ```typescript
|
|
130
|
+
* // construction phase: read the Secret's id
|
|
131
|
+
* const openaiId = yield* (yield* OpenAI).secretId;
|
|
132
|
+
* // in a handler
|
|
133
|
+
* const openai = { secretId: yield* openaiId };
|
|
134
|
+
* const sandbox = yield* sandboxes.create({
|
|
135
|
+
* outboundPolicy: {
|
|
136
|
+
* routes: [
|
|
137
|
+
* {
|
|
138
|
+
* https: {
|
|
139
|
+
* domains: ["api.openai.com"],
|
|
140
|
+
* headerReplacements: [{ secret: openai, headers: { Authorization: "Bearer $OPENAI_API_KEY" } }],
|
|
141
|
+
* },
|
|
142
|
+
* },
|
|
143
|
+
* { any: { redirect: "block" } },
|
|
144
|
+
* ],
|
|
145
|
+
* },
|
|
146
|
+
* });
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* ### A cloud identity, not a key
|
|
150
|
+
* **Example:** Assume an AWS role with the token Modal signs
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const sandbox = yield* sandboxes.create({
|
|
153
|
+
* image: "amazon/aws-cli",
|
|
154
|
+
* includeOidcIdentityToken: true,
|
|
155
|
+
* });
|
|
156
|
+
* // MODAL_IDENTITY_TOKEN is an OIDC token from https://oidc.modal.com
|
|
157
|
+
* const role = yield* sandbox.exec(
|
|
158
|
+
* `aws sts assume-role-with-web-identity --role-arn ${roleArn} --role-session-name sandbox --web-identity-token "$MODAL_IDENTITY_TOKEN"`,
|
|
159
|
+
* );
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* ### Persistent sandboxes
|
|
163
|
+
* **Example:** A box per user that keeps its files between sessions
|
|
164
|
+
* ```typescript
|
|
165
|
+
* const box = yield* sandboxes.createPersistent({ image: "node:22-bookworm" });
|
|
166
|
+
* const session = yield* box.session();
|
|
167
|
+
* yield* session.exec("echo hi >> /root/notes.txt");
|
|
168
|
+
* // later, from any request: resumes the box if it paused
|
|
169
|
+
* const again = yield* (yield* sandboxes.persistent(box.persistentSandboxId)).session();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* ### Snapshots
|
|
173
|
+
* **Example:** Save a warmed sandbox and boot the next one from it
|
|
174
|
+
* ```typescript
|
|
175
|
+
* yield* sandbox.exec(["pnpm", "install"], { cwd: "/work" });
|
|
176
|
+
* const image = yield* sandbox.snapshotFilesystem();
|
|
177
|
+
* const next = yield* sandboxes.create({ image });
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
* @binding
|
|
181
|
+
* @product Sandbox
|
|
182
|
+
*/
|
|
183
|
+
export interface CreateSandbox extends Binding.Service<CreateSandbox, "Modal.CreateSandbox", (target: App | Image | Sandbox) => Effect.Effect<SandboxesClient>> {
|
|
184
|
+
}
|
|
185
|
+
export declare const CreateSandbox: CreateSandbox;
|
|
186
|
+
//# sourceMappingURL=CreateSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSandbox.d.ts","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSandbox.js","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAmO3C,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAgB,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import { CreateSandbox, type SandboxesClient } from "./CreateSandbox.ts";
|
|
4
|
+
import { type RuntimeOwner } from "./RuntimeOwner.ts";
|
|
5
|
+
import { SandboxOps, type SandboxTarget } from "./SandboxClient.ts";
|
|
6
|
+
/** A sandboxes client over a target resolved per call. */
|
|
7
|
+
export declare const makeSandboxesClient: (target: Effect.Effect<SandboxTarget>, ops: SandboxOps, owner?: Effect.Effect<RuntimeOwner | undefined>) => SandboxesClient;
|
|
8
|
+
/**
|
|
9
|
+
* {@link CreateSandbox} over Modal's API. Grants the host's identity (a scoped
|
|
10
|
+
* `Modal.ServiceUser`) the `contributor` role on the App's environment.
|
|
11
|
+
*
|
|
12
|
+
* @layer
|
|
13
|
+
* @product Sandbox
|
|
14
|
+
* @provides Modal.CreateSandbox
|
|
15
|
+
*/
|
|
16
|
+
export declare const CreateSandboxHttp: Layer.Layer<CreateSandbox, never, never>;
|
|
17
|
+
//# sourceMappingURL=CreateSandboxHttp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSandboxHttp.d.ts","sources":["../src/CreateSandboxHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAGjG,OAAO,EAAE,KAAK,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAEnF,OAAO,EAML,UAAU,EAGV,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAQ5B,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,WACtB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAC/B,UAAU,UACR,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,KAC7C,eAyDD,CAAC;AAMH;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,0CAwD7B,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import { makeModalBinding } from "./BindingHttp.js";
|
|
4
|
+
import { CreateSandbox } from "./CreateSandbox.js";
|
|
5
|
+
import { timestampOf } from "./internal.js";
|
|
6
|
+
import { RuntimeOwnerOf, runtimeTags } from "./RuntimeOwner.js";
|
|
7
|
+
import { createPersistentSandbox, createSandbox, listSandboxes, persistentSandboxHandle, restoreSandbox, SandboxOps, sandboxFromName, sandboxHandle, } from "./SandboxClient.js";
|
|
8
|
+
const HOUR_MS = 3_600_000;
|
|
9
|
+
/** A time rounded to an hour boundary, as Modal's usage query wants it. */
|
|
10
|
+
const hourOf = (value, round) => timestampOf(round(new Date(value).getTime() / HOUR_MS) * HOUR_MS);
|
|
11
|
+
/** A sandboxes client over a target resolved per call. */
|
|
12
|
+
export const makeSandboxesClient = (target, ops, owner = Effect.undefined) => ({
|
|
13
|
+
appId: Effect.map(target, (t) => t.appId),
|
|
14
|
+
create: (options) => Effect.flatMap(Effect.all([target, owner]), ([t, o]) => createSandbox(ops, t, {
|
|
15
|
+
...options,
|
|
16
|
+
// The owner's tags win over a user tag of the same key.
|
|
17
|
+
tags: o === undefined ? options?.tags : { ...options?.tags, ...runtimeTags(o) },
|
|
18
|
+
})),
|
|
19
|
+
fromName: (name) => Effect.flatMap(target, (t) => sandboxFromName(ops, t, name)),
|
|
20
|
+
fromId: (sandboxId) => Effect.map(target, (t) => sandboxHandle(ops, sandboxId, t)),
|
|
21
|
+
list: (options) => Effect.flatMap(target, (t) => listSandboxes(ops, t, options)),
|
|
22
|
+
usage: (query) => Effect.gen(function* () {
|
|
23
|
+
const t = yield* target;
|
|
24
|
+
const groups = [];
|
|
25
|
+
let pageToken;
|
|
26
|
+
for (let page = 0; page < 100; page++) {
|
|
27
|
+
const response = yield* ops.usage({
|
|
28
|
+
appId: t.appId,
|
|
29
|
+
// Modal reports usage by whole hours.
|
|
30
|
+
since: hourOf(query.since, Math.floor),
|
|
31
|
+
until: query.until === undefined ? undefined : hourOf(query.until, Math.ceil),
|
|
32
|
+
groupByTags: query.groupByTags ? [...query.groupByTags] : undefined,
|
|
33
|
+
tags: query.tags,
|
|
34
|
+
pageToken,
|
|
35
|
+
});
|
|
36
|
+
for (const group of response.groups ?? []) {
|
|
37
|
+
groups.push({
|
|
38
|
+
tags: Object.fromEntries(Object.entries(group.tags ?? {}).map(([key, value]) => [key, value?.value ?? ""])),
|
|
39
|
+
cost: group.cost ?? 0,
|
|
40
|
+
costByResource: Object.fromEntries(Object.entries(group.costByResource ?? {}).map(([key, value]) => [key, value ?? 0])),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
pageToken = response.nextPageToken || undefined;
|
|
44
|
+
if (pageToken === undefined)
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
return groups;
|
|
48
|
+
}),
|
|
49
|
+
createPersistent: (options) => Effect.flatMap(target, (t) => createPersistentSandbox(ops, t, options)),
|
|
50
|
+
persistent: (box) => Effect.map(target, (t) => persistentSandboxHandle(ops, typeof box === "string" ? box : box.persistentSandboxId, t)),
|
|
51
|
+
restore: (snapshot, options) => Effect.gen(function* () {
|
|
52
|
+
const restored = yield* restoreSandbox(ops, yield* target, snapshot, options);
|
|
53
|
+
const o = yield* owner;
|
|
54
|
+
if (o !== undefined)
|
|
55
|
+
yield* restored.setTags(runtimeTags(o));
|
|
56
|
+
return restored;
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
const isImage = (target) => target.Type === "Modal.Image";
|
|
60
|
+
const isProgram = (target) => target.Type === "Modal.Sandbox";
|
|
61
|
+
/**
|
|
62
|
+
* {@link CreateSandbox} over Modal's API. Grants the host's identity (a scoped
|
|
63
|
+
* `Modal.ServiceUser`) the `contributor` role on the App's environment.
|
|
64
|
+
*
|
|
65
|
+
* @layer
|
|
66
|
+
* @product Sandbox
|
|
67
|
+
* @provides Modal.CreateSandbox
|
|
68
|
+
*/
|
|
69
|
+
export const CreateSandboxHttp = Layer.effect(CreateSandbox, makeModalBinding({
|
|
70
|
+
tag: "Modal.CreateSandbox",
|
|
71
|
+
operations: SandboxOps,
|
|
72
|
+
role: "contributor",
|
|
73
|
+
make: Effect.fn(function* (resource, ops) {
|
|
74
|
+
const owner = yield* RuntimeOwnerOf();
|
|
75
|
+
if (isProgram(resource)) {
|
|
76
|
+
const imageId = yield* resource.imageId;
|
|
77
|
+
const appId = yield* resource.appId;
|
|
78
|
+
const appName = yield* resource.appName;
|
|
79
|
+
const environment = yield* resource.environment;
|
|
80
|
+
const secretId = yield* resource.secretId;
|
|
81
|
+
const command = yield* resource.command;
|
|
82
|
+
const port = yield* resource.port;
|
|
83
|
+
const mounts = yield* resource.mounts;
|
|
84
|
+
const target = Effect.all({
|
|
85
|
+
imageId,
|
|
86
|
+
appId,
|
|
87
|
+
appName,
|
|
88
|
+
environment,
|
|
89
|
+
secretId,
|
|
90
|
+
command,
|
|
91
|
+
port,
|
|
92
|
+
mounts,
|
|
93
|
+
}).pipe(Effect.map((t) => ({
|
|
94
|
+
imageId: t.imageId,
|
|
95
|
+
appId: t.appId,
|
|
96
|
+
appName: t.appName,
|
|
97
|
+
environment: t.environment,
|
|
98
|
+
program: { secretId: t.secretId, command: t.command, port: t.port, mounts: t.mounts },
|
|
99
|
+
})));
|
|
100
|
+
return makeSandboxesClient(target, ops, owner);
|
|
101
|
+
}
|
|
102
|
+
if (isImage(resource)) {
|
|
103
|
+
const imageId = yield* resource.imageId;
|
|
104
|
+
const appId = yield* resource.appId;
|
|
105
|
+
const appName = yield* resource.appName;
|
|
106
|
+
const environment = yield* resource.environment;
|
|
107
|
+
const target = Effect.all({ imageId, appId, appName, environment }).pipe(Effect.map((t) => t));
|
|
108
|
+
return makeSandboxesClient(target, ops, owner);
|
|
109
|
+
}
|
|
110
|
+
const appId = yield* resource.appId;
|
|
111
|
+
const appName = yield* resource.name;
|
|
112
|
+
const environment = yield* resource.environment;
|
|
113
|
+
const target = Effect.all({ appId, appName, environment }).pipe(Effect.map((t) => t));
|
|
114
|
+
return makeSandboxesClient(target, ops, owner);
|
|
115
|
+
}),
|
|
116
|
+
}));
|
|
117
|
+
//# sourceMappingURL=CreateSandboxHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSandboxHttp.js","sources":["../src/CreateSandboxHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as Binding from "alchemy/Binding";
|
|
2
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
3
|
+
import type * as Effect from "effect/Effect";
|
|
4
|
+
import type * as Redacted from "effect/Redacted";
|
|
5
|
+
import type { SecretsOps } from "./CreateSecretHttp.ts";
|
|
6
|
+
import type { Environment } from "./Environment.ts";
|
|
7
|
+
import type { ErrorOf, OpError } from "./internal.ts";
|
|
8
|
+
import type { lookupSecret, putSecret } from "./Secret.ts";
|
|
9
|
+
import type { SecretAttributes } from "./Secret.ts";
|
|
10
|
+
/** Write, find, list and delete secrets by name in one environment. */
|
|
11
|
+
export interface SecretsClientOf<R> {
|
|
12
|
+
/**
|
|
13
|
+
* Create or overwrite the secret named `name` with `env`. Returns its
|
|
14
|
+
* attributes, to pass as a sandbox `secrets` entry or in an outbound
|
|
15
|
+
* header replacement.
|
|
16
|
+
*/
|
|
17
|
+
put(name: string, env: Record<string, string | Redacted.Redacted<string>>): Effect.Effect<SecretAttributes, ErrorOf<typeof putSecret>, R>;
|
|
18
|
+
/** The secret named `name` (its variable names, never its values), or `undefined`. */
|
|
19
|
+
get(name: string): Effect.Effect<SecretAttributes | undefined, ErrorOf<typeof lookupSecret>, R>;
|
|
20
|
+
/** Delete the secret named `name` (no-op when missing). */
|
|
21
|
+
delete(name: string): Effect.Effect<void, ErrorOf<typeof lookupSecret> | Exclude<OpError<SecretsOps, "delete">, {
|
|
22
|
+
readonly _tag: "SecretNotFound";
|
|
23
|
+
}>, R>;
|
|
24
|
+
/** Names of every secret in the environment. */
|
|
25
|
+
list(): Effect.Effect<ReadonlyArray<string>, OpError<SecretsOps, "list">, R>;
|
|
26
|
+
}
|
|
27
|
+
/** A SecretsClient whose calls run inside a deployed runtime. */
|
|
28
|
+
export type SecretsClient = SecretsClientOf<RuntimeContext>;
|
|
29
|
+
/**
|
|
30
|
+
* Store secrets by name at runtime, such as one per user, and hand them to
|
|
31
|
+
* that user's sandboxes. With an outbound header replacement the sandbox
|
|
32
|
+
* never sees the value: Modal adds it to matching requests on the way out.
|
|
33
|
+
*
|
|
34
|
+
* Bind it to a `Modal.Environment` to keep these runtime secrets in their
|
|
35
|
+
* own namespace. They aren't in Alchemy state: deleting the environment
|
|
36
|
+
* removes them.
|
|
37
|
+
*
|
|
38
|
+
* Objects created at run time are tagged with the stack, stage and binding
|
|
39
|
+
* (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
|
|
40
|
+
* the stack is destroyed. A Modal secret has only a name, so the tags become
|
|
41
|
+
* its name prefix, `Modal.runtimePrefix({ stack, stage, id })`: list them
|
|
42
|
+
* with `modal secret list` and delete the ones whose name starts with it.
|
|
43
|
+
*
|
|
44
|
+
* ### A user's token, injected at egress
|
|
45
|
+
* **Example:** From a Cloudflare Worker
|
|
46
|
+
* ```typescript
|
|
47
|
+
* import * as Cloudflare from "@alchemy.run/cloudflare";
|
|
48
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
49
|
+
* import * as Effect from "effect/Effect";
|
|
50
|
+
* import * as Layer from "effect/Layer";
|
|
51
|
+
* import { HttpServerRequest } from "effect/http/HttpServerRequest";
|
|
52
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
53
|
+
* import { Agents, Coder } from "./Coder.ts";
|
|
54
|
+
*
|
|
55
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
56
|
+
* "Api",
|
|
57
|
+
* { main: import.meta.url },
|
|
58
|
+
* Effect.gen(function* () {
|
|
59
|
+
* const secrets = yield* Modal.CreateSecret(Agents);
|
|
60
|
+
* const sandboxes = yield* Modal.CreateSandbox(Coder);
|
|
61
|
+
* return {
|
|
62
|
+
* fetch: Effect.gen(function* () {
|
|
63
|
+
* const request = yield* HttpServerRequest;
|
|
64
|
+
* const user = request.headers["x-user"] ?? "anonymous";
|
|
65
|
+
* const github = yield* secrets.put(`github-${user}`, {
|
|
66
|
+
* GITHUB_TOKEN: request.headers["x-github-token"] ?? "",
|
|
67
|
+
* });
|
|
68
|
+
* const sandbox = yield* sandboxes.create({
|
|
69
|
+
* outboundPolicy: {
|
|
70
|
+
* routes: [
|
|
71
|
+
* {
|
|
72
|
+
* https: {
|
|
73
|
+
* domains: ["api.github.com"],
|
|
74
|
+
* headerReplacements: [{ secret: github, headers: { Authorization: "Bearer $GITHUB_TOKEN" } }],
|
|
75
|
+
* },
|
|
76
|
+
* },
|
|
77
|
+
* { tls: { domains: ["github.com"] } },
|
|
78
|
+
* { any: { redirect: "block" } },
|
|
79
|
+
* ],
|
|
80
|
+
* },
|
|
81
|
+
* });
|
|
82
|
+
* return HttpServerResponse.text(sandbox.sandboxId);
|
|
83
|
+
* }).pipe(Effect.orDie),
|
|
84
|
+
* };
|
|
85
|
+
* }).pipe(Effect.provide(Layer.mergeAll(Modal.CreateSecretHttp, Modal.CreateSandboxHttp))),
|
|
86
|
+
* ) {}
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @binding
|
|
90
|
+
* @product Secret
|
|
91
|
+
*/
|
|
92
|
+
export interface CreateSecret extends Binding.Service<CreateSecret, "Modal.CreateSecret", (environment?: Environment) => Effect.Effect<SecretsClient>> {
|
|
93
|
+
}
|
|
94
|
+
export declare const CreateSecret: CreateSecret;
|
|
95
|
+
//# sourceMappingURL=CreateSecret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSecret.d.ts","sources":["../src/CreateSecret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,uEAAuE;AACvE,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC;;;;OAIG;IACH,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GACtD,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,sFAAsF;IACtF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,2DAA2D;IAC3D,MAAM,CACJ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,CACd,IAAI,EACF,OAAO,CAAC,OAAO,YAAY,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAC7E,CAAC,CACF,CAAC;IACF,gDAAgD;IAChD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;CAC9E;AAED,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,OAAO,CACnD,YAAY,EACZ,oBAAoB,EACpB,CAAC,WAAW,CAAC,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAC5D;CAAG;AAEJ,eAAO,MAAM,YAAY,cAAsD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSecret.js","sources":["../src/CreateSecret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AA4G3C,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAe,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as secret from "@distilled.cloud/modal/secret";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import { CreateSecret, type SecretsClientOf } from "./CreateSecret.ts";
|
|
5
|
+
import { type RuntimeOwner } from "./RuntimeOwner.ts";
|
|
6
|
+
/** The operations the client calls, resolved by `ModalBindings.withCredentials`. */
|
|
7
|
+
export declare const SecretsOps: Effect.Effect<{
|
|
8
|
+
readonly getOrCreate: (input: secret.SecretGetOrCreateRequest) => Effect.Effect<secret.SecretGetOrCreateResponse, secret.SecretGetOrCreateError, never>;
|
|
9
|
+
readonly delete: (input: secret.DeleteSecretRequest) => Effect.Effect<secret.DeleteSecretResponse, secret.DeleteSecretError, never>;
|
|
10
|
+
readonly list: import("@distilled.cloud/core/api").PaginatedCall<secret.ListSecretRequest, secret.ListSecretResponse, secret.ListSecretError, never, secret.SecretListItem>;
|
|
11
|
+
}, never, import("./internal.ts").OperationServices>;
|
|
12
|
+
export type SecretsOps = Effect.Success<typeof SecretsOps>;
|
|
13
|
+
/** A secrets client over an environment name resolved per call. */
|
|
14
|
+
export declare const makeSecretsClient: (environment: Effect.Effect<string | undefined>, ops: SecretsOps, owner?: Effect.Effect<RuntimeOwner | undefined>) => SecretsClientOf<never>;
|
|
15
|
+
/**
|
|
16
|
+
* {@link CreateSecret} over Modal's API. Grants the host's identity (a scoped
|
|
17
|
+
* `Modal.ServiceUser`) the `contributor` role on the environment.
|
|
18
|
+
*
|
|
19
|
+
* @layer
|
|
20
|
+
* @product Secret
|
|
21
|
+
* @provides Modal.CreateSecret
|
|
22
|
+
*/
|
|
23
|
+
export declare const CreateSecretHttp: Layer.Layer<CreateSecret, never, never>;
|
|
24
|
+
//# sourceMappingURL=CreateSecretHttp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSecretHttp.d.ts","sources":["../src/CreateSecretHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAa,KAAK,YAAY,EAA+B,MAAM,mBAAmB,CAAC;AAG9F,oFAAoF;AACpF,eAAO,MAAM,UAAU;;;;oDAIrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC;AAE3D,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,gBACf,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,OACzC,UAAU,UACR,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,KAC7C,eAAe,CAAC,KAAK,CAmCtB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,yCAa5B,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as secret from "@distilled.cloud/modal/secret";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import { makeOpenModalBinding } from "./BindingHttp.js";
|
|
5
|
+
import { CreateSecret } from "./CreateSecret.js";
|
|
6
|
+
import { environmentOf, listAll, operations } from "./internal.js";
|
|
7
|
+
import { ownedName, RuntimeOwnerOf, unownedName } from "./RuntimeOwner.js";
|
|
8
|
+
import { lookupSecret, putSecret } from "./Secret.js";
|
|
9
|
+
/** The operations the client calls, resolved by `ModalBindings.withCredentials`. */
|
|
10
|
+
export const SecretsOps = operations({
|
|
11
|
+
getOrCreate: secret.secretGetOrCreate,
|
|
12
|
+
delete: secret.deleteSecret,
|
|
13
|
+
list: secret.listSecret,
|
|
14
|
+
});
|
|
15
|
+
/** A secrets client over an environment name resolved per call. */
|
|
16
|
+
export const makeSecretsClient = (environment, ops, owner = Effect.undefined) => ({
|
|
17
|
+
put: (name, env) => Effect.flatMap(Effect.all([environment, owner]), ([e, stamp]) => putSecret(ops.getOrCreate, ownedName(stamp, name), e, env)),
|
|
18
|
+
get: (name) => Effect.flatMap(Effect.all([environment, owner]), ([e, stamp]) => lookupSecret(ops.getOrCreate, ownedName(stamp, name), e)),
|
|
19
|
+
delete: (name) => Effect.gen(function* () {
|
|
20
|
+
const env = yield* environment;
|
|
21
|
+
const found = yield* lookupSecret(ops.getOrCreate, ownedName(yield* owner, name), env);
|
|
22
|
+
if (!found)
|
|
23
|
+
return;
|
|
24
|
+
yield* ops
|
|
25
|
+
.delete({ secretId: found.secretId })
|
|
26
|
+
.pipe(Effect.catchTag("SecretNotFound", () => Effect.void));
|
|
27
|
+
}),
|
|
28
|
+
list: () => Effect.gen(function* () {
|
|
29
|
+
const env = yield* environment;
|
|
30
|
+
const stamp = yield* owner;
|
|
31
|
+
const items = yield* listAll((pagination) => ops
|
|
32
|
+
.list({ environmentName: environmentOf(env), pagination })
|
|
33
|
+
.pipe(Effect.map((response) => response.items ?? [])), (item) => item.createdAt);
|
|
34
|
+
return items.flatMap((item) => {
|
|
35
|
+
const name = item.label ?? item.metadata?.name;
|
|
36
|
+
const own = name ? unownedName(stamp, name) : undefined;
|
|
37
|
+
return own ? [own] : [];
|
|
38
|
+
});
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* {@link CreateSecret} over Modal's API. Grants the host's identity (a scoped
|
|
43
|
+
* `Modal.ServiceUser`) the `contributor` role on the environment.
|
|
44
|
+
*
|
|
45
|
+
* @layer
|
|
46
|
+
* @product Secret
|
|
47
|
+
* @provides Modal.CreateSecret
|
|
48
|
+
*/
|
|
49
|
+
export const CreateSecretHttp = Layer.effect(CreateSecret, makeOpenModalBinding({
|
|
50
|
+
tag: "Modal.CreateSecret",
|
|
51
|
+
operations: SecretsOps,
|
|
52
|
+
role: "contributor",
|
|
53
|
+
environmentOf: (environment) => environment?.name,
|
|
54
|
+
make: Effect.fn(function* (ops, environment) {
|
|
55
|
+
const name = environment ? yield* environment.name : Effect.undefined;
|
|
56
|
+
const owner = yield* RuntimeOwnerOf();
|
|
57
|
+
return makeSecretsClient(name, ops, owner);
|
|
58
|
+
}),
|
|
59
|
+
}));
|
|
60
|
+
//# sourceMappingURL=CreateSecretHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateSecretHttp.js","sources":["../src/CreateSecretHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as Binding from "alchemy/Binding";
|
|
2
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
3
|
+
import type * as Effect from "effect/Effect";
|
|
4
|
+
import type { VolumesOps } from "./CreateVolumeHttp.ts";
|
|
5
|
+
import type { Environment } from "./Environment.ts";
|
|
6
|
+
import type { ErrorOf, OpError } from "./internal.ts";
|
|
7
|
+
import type { ensureVolume, lookupVolume } from "./Volume.ts";
|
|
8
|
+
import type { VolumeAttributes } from "./Volume.ts";
|
|
9
|
+
import type { ReadWriteVolumeClient } from "./VolumeClient.ts";
|
|
10
|
+
/** A volume created or found at runtime: its attributes plus a read-write client. */
|
|
11
|
+
export interface VolumeHandle extends ReadWriteVolumeClient {
|
|
12
|
+
readonly volumeId: Effect.Effect<string>;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** The attributes, to pass where a `Modal.Volume` is accepted (e.g. sandbox mounts). */
|
|
15
|
+
readonly attributes: VolumeAttributes;
|
|
16
|
+
}
|
|
17
|
+
/** Get, create, list and delete volumes by name in one environment. */
|
|
18
|
+
export interface VolumesClientOf<R> {
|
|
19
|
+
/** The volume named `name`, created when missing (Modal's own get-or-create). */
|
|
20
|
+
getOrCreate(name: string): Effect.Effect<VolumeHandle, ErrorOf<typeof ensureVolume>, R>;
|
|
21
|
+
/** The volume named `name`, or `undefined`. */
|
|
22
|
+
get(name: string): Effect.Effect<VolumeHandle | undefined, ErrorOf<typeof lookupVolume>, R>;
|
|
23
|
+
/** Delete the volume named `name` (no-op when missing). */
|
|
24
|
+
delete(name: string): Effect.Effect<void, ErrorOf<typeof lookupVolume> | Exclude<OpError<VolumesOps, "delete">, {
|
|
25
|
+
readonly _tag: "VolumeNotFound";
|
|
26
|
+
}>, R>;
|
|
27
|
+
/** Names of every volume in the environment. */
|
|
28
|
+
list(): Effect.Effect<ReadonlyArray<string>, OpError<VolumesOps, "list">, R>;
|
|
29
|
+
}
|
|
30
|
+
/** A VolumesClient whose calls run inside a deployed runtime. */
|
|
31
|
+
export type VolumesClient = VolumesClientOf<RuntimeContext>;
|
|
32
|
+
/**
|
|
33
|
+
* Create volumes by name at runtime: one per user, session or task.
|
|
34
|
+
* Modal's native shape is get-or-create by name, so `getOrCreate` is
|
|
35
|
+
* idempotent and safe to call on every request.
|
|
36
|
+
*
|
|
37
|
+
* Bind it to a `Modal.Environment` to keep these runtime objects in their
|
|
38
|
+
* own namespace (or to nothing, for the workspace's default environment).
|
|
39
|
+
* They aren't in Alchemy state: deleting the environment removes them.
|
|
40
|
+
*
|
|
41
|
+
* Objects created at run time are tagged with the stack, stage and binding
|
|
42
|
+
* (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted when
|
|
43
|
+
* the stack is destroyed. A Modal volume has only a name, so the tags become
|
|
44
|
+
* its name prefix, `Modal.runtimePrefix({ stack, stage, id })`: list them
|
|
45
|
+
* with `modal volume list` and delete the ones whose name starts with it.
|
|
46
|
+
*
|
|
47
|
+
* ### One volume per user
|
|
48
|
+
* **Example:** From a Cloudflare Worker
|
|
49
|
+
* ```typescript
|
|
50
|
+
* import * as Cloudflare from "@alchemy.run/cloudflare";
|
|
51
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
52
|
+
* import * as Effect from "effect/Effect";
|
|
53
|
+
* import * as Layer from "effect/Layer";
|
|
54
|
+
* import { HttpServerRequest } from "effect/http/HttpServerRequest";
|
|
55
|
+
* import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
56
|
+
* import { Agents, Coder } from "./Coder.ts";
|
|
57
|
+
*
|
|
58
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
59
|
+
* "Api",
|
|
60
|
+
* { main: import.meta.url },
|
|
61
|
+
* Effect.gen(function* () {
|
|
62
|
+
* const volumes = yield* Modal.CreateVolume(Agents);
|
|
63
|
+
* const sandboxes = yield* Modal.CreateSandbox(Coder);
|
|
64
|
+
* return {
|
|
65
|
+
* fetch: Effect.gen(function* () {
|
|
66
|
+
* const request = yield* HttpServerRequest;
|
|
67
|
+
* const user = request.headers["x-user"] ?? "anonymous";
|
|
68
|
+
* const home = yield* volumes.getOrCreate(`user-${user}`);
|
|
69
|
+
* yield* home.writeFile("/notes.md", "hello");
|
|
70
|
+
* const sandbox = yield* sandboxes.create({ mounts: [{ volume: home, path: "/home/user" }] });
|
|
71
|
+
* return HttpServerResponse.text("ok");
|
|
72
|
+
* }).pipe(Effect.orDie),
|
|
73
|
+
* };
|
|
74
|
+
* }).pipe(Effect.provide(Layer.mergeAll(Modal.CreateVolumeHttp, Modal.CreateSandboxHttp))),
|
|
75
|
+
* ) {}
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* @binding
|
|
79
|
+
* @product Volume
|
|
80
|
+
*/
|
|
81
|
+
export interface CreateVolume extends Binding.Service<CreateVolume, "Modal.CreateVolume", (environment?: Environment) => Effect.Effect<VolumesClient>> {
|
|
82
|
+
}
|
|
83
|
+
export declare const CreateVolume: CreateVolume;
|
|
84
|
+
//# sourceMappingURL=CreateVolume.d.ts.map
|