@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/Mounts.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { checkMountSupport, collectMountCapabilities } from "alchemy/Mount";
|
|
2
|
+
import * as Output from "alchemy/Output";
|
|
3
|
+
import * as Data from "effect/Data";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
/** A mount entry referenced a resource that isn't bound into this runtime. */
|
|
6
|
+
export class MountNotBound extends Data.TaggedError("Modal.MountNotBound") {
|
|
7
|
+
}
|
|
8
|
+
const BUCKET_TYPE = { s3: "S3", r2: "R2", gcp: "GCP" };
|
|
9
|
+
/** Cloudflare R2's S3 endpoint for an account (and jurisdiction). */
|
|
10
|
+
export const r2Endpoint = (accountId, jurisdiction) => `https://${accountId}${jurisdiction && jurisdiction !== "default" ? `.${jurisdiction}` : ""}.r2.cloudflarestorage.com`;
|
|
11
|
+
const value = (input, path) => Output.isOutput(input)
|
|
12
|
+
? Effect.fail(new MountNotBound({
|
|
13
|
+
path,
|
|
14
|
+
message: `The mount at ${path} references a declared resource; bind it with Modal.MountVolume or Modal.MountBucket`,
|
|
15
|
+
}))
|
|
16
|
+
: Effect.isEffect(input)
|
|
17
|
+
? input
|
|
18
|
+
: Effect.succeed(input);
|
|
19
|
+
const field = (record, key) => typeof record === "object" && record !== null
|
|
20
|
+
? record[key]
|
|
21
|
+
: undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Modal's `volumeMounts` and `cloudBucketMounts` for mount entries whose
|
|
24
|
+
* resources are resolved: attributes at reconcile, handles or `Mount<Noun>`
|
|
25
|
+
* references at runtime.
|
|
26
|
+
*/
|
|
27
|
+
export const modalMountsOf = (mounts) => Effect.gen(function* () {
|
|
28
|
+
const volumeMounts = [];
|
|
29
|
+
const cloudBucketMounts = [];
|
|
30
|
+
for (const mount of mounts ?? []) {
|
|
31
|
+
if ("volume" in mount) {
|
|
32
|
+
const volumeId = yield* value(field(mount.volume, "volumeId"), mount.path);
|
|
33
|
+
volumeMounts.push({
|
|
34
|
+
mountPath: mount.path,
|
|
35
|
+
volumeId,
|
|
36
|
+
readOnly: mount.readOnly,
|
|
37
|
+
subPath: mount.subPath,
|
|
38
|
+
allowBackgroundCommits: true,
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const bucket = mount.bucket;
|
|
43
|
+
const bucketName = typeof bucket === "string"
|
|
44
|
+
? bucket
|
|
45
|
+
: yield* value(field(bucket, "bucketName"), mount.path);
|
|
46
|
+
const accountId = field(bucket, "accountId");
|
|
47
|
+
const isR2 = typeof accountId === "string";
|
|
48
|
+
const endpointUrl = mount.endpointUrl ??
|
|
49
|
+
(isR2
|
|
50
|
+
? r2Endpoint(accountId, field(bucket, "jurisdiction"))
|
|
51
|
+
: yield* value(field(bucket, "endpointUrl"), mount.path));
|
|
52
|
+
const type = mount.type ?? field(bucket, "type") ?? (isR2 ? "r2" : undefined);
|
|
53
|
+
const secretId = mount.secret
|
|
54
|
+
? yield* value(field(mount.secret, "secretId"), mount.path)
|
|
55
|
+
: undefined;
|
|
56
|
+
cloudBucketMounts.push({
|
|
57
|
+
mountPath: mount.path,
|
|
58
|
+
bucketName,
|
|
59
|
+
bucketType: type ? BUCKET_TYPE[type] : undefined,
|
|
60
|
+
bucketEndpointUrl: endpointUrl,
|
|
61
|
+
credentialsSecretId: secretId,
|
|
62
|
+
keyPrefix: mount.keyPrefix,
|
|
63
|
+
readOnly: mount.readOnly,
|
|
64
|
+
oidcAuthRoleArn: mount.oidcAuthRoleArn,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return { volumeMounts, cloudBucketMounts };
|
|
68
|
+
});
|
|
69
|
+
const isCapability = (entry) => "install" in entry && "id" in entry;
|
|
70
|
+
/** The volume and bucket entries a host's bindings contributed, in binding order. */
|
|
71
|
+
export const boundMounts = (bindings) => bindings.flatMap((binding) => (binding.data.mounts ?? []).filter((entry) => !isCapability(entry)));
|
|
72
|
+
/** The mount clients other providers' bindings asked the host's image to install. */
|
|
73
|
+
export const boundCapabilities = (bindings) => collectMountCapabilities(bindings.map((binding) => ({
|
|
74
|
+
data: { mounts: (binding.data.mounts ?? []).filter(isCapability) },
|
|
75
|
+
})));
|
|
76
|
+
/**
|
|
77
|
+
* What a Modal container provides to mount clients. Modal runs containers
|
|
78
|
+
* under gVisor without `CAP_SYS_ADMIN`: `/dev/fuse` exists, but `mount`
|
|
79
|
+
* fails with permission denied, for FUSE and NFS alike.
|
|
80
|
+
*/
|
|
81
|
+
export const MODAL_MOUNT_SUPPORT = { fuse: false, nfs: false };
|
|
82
|
+
/** Fail when a mount client needs what a Modal container can't provide. */
|
|
83
|
+
export const checkModalMounts = (host, capabilities) => {
|
|
84
|
+
const unsupported = checkMountSupport(host, capabilities, MODAL_MOUNT_SUPPORT, "Mount Modal volumes and cloud buckets with Modal.MountVolume and Modal.MountBucket instead.");
|
|
85
|
+
return unsupported === undefined ? Effect.void : Effect.fail(unsupported);
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=Mounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mounts.js","sources":["../src/Mounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import { Resource } from "alchemy/Resource";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import type { Mount } from "./Mounts.ts";
|
|
5
|
+
import type { Providers } from "./Providers.ts";
|
|
6
|
+
import { type PersistentSandboxCreateOptions } from "./SandboxClient.ts";
|
|
7
|
+
export interface PersistentSandboxProps extends Omit<PersistentSandboxCreateOptions, "mounts"> {
|
|
8
|
+
/**
|
|
9
|
+
* Volumes and cloud buckets mounted into every session:
|
|
10
|
+
* `[{ volume: Home, path: "/home/user" }]`. Changing them replaces the box.
|
|
11
|
+
*/
|
|
12
|
+
mounts?: Mount[];
|
|
13
|
+
/** The App the box runs in (`Modal.App`). Changing it replaces the box. */
|
|
14
|
+
app: {
|
|
15
|
+
readonly appId: string;
|
|
16
|
+
readonly name?: string;
|
|
17
|
+
readonly environment?: unknown;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface PersistentSandboxAttributes {
|
|
21
|
+
/** Persistent sandbox ID; pass it (or this resource) to `sandboxes.persistent(...)`. */
|
|
22
|
+
persistentSandboxId: string;
|
|
23
|
+
/** The App the box runs in. */
|
|
24
|
+
appId: string;
|
|
25
|
+
/** Name of that App. */
|
|
26
|
+
appName: string | undefined;
|
|
27
|
+
/** Environment of that App. */
|
|
28
|
+
environment: string | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A Modal persistent sandbox: one box whose filesystem outlives its
|
|
32
|
+
* sessions. Each session is a regular sandbox that runs up to an hour and
|
|
33
|
+
* pauses after five idle minutes; the next `session()` resumes it from the
|
|
34
|
+
* last session's filesystem. Use it for a long-lived workspace, such as a
|
|
35
|
+
* shared dev box or an agent's home, that the Stack owns.
|
|
36
|
+
*
|
|
37
|
+
* Modal's persistent sandboxes are experimental: they don't take a name,
|
|
38
|
+
* GPUs, `env`, tags or memory snapshots yet. Changing any prop replaces the
|
|
39
|
+
* box (and its files).
|
|
40
|
+
*
|
|
41
|
+
* ### Creating a box
|
|
42
|
+
* **Example:** A dev box on a warm base image
|
|
43
|
+
* ```typescript
|
|
44
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
45
|
+
* import { Coder, Warm } from "./Coder.ts";
|
|
46
|
+
*
|
|
47
|
+
* export const DevBox = Modal.PersistentSandbox("DevBox", { app: Coder, image: Warm, workdir: "/work" });
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* ### Using it at runtime
|
|
51
|
+
* **Example:** Resume it from a Worker
|
|
52
|
+
* ```typescript
|
|
53
|
+
* // construction phase
|
|
54
|
+
* const sandboxes = yield* Modal.CreateSandbox(Coder);
|
|
55
|
+
* const devBoxId = yield* (yield* DevBox).persistentSandboxId;
|
|
56
|
+
* // in fetch:
|
|
57
|
+
* const session = yield* (yield* sandboxes.persistent(yield* devBoxId)).session();
|
|
58
|
+
* const result = yield* session.exec(["git", "status"]);
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @resource
|
|
62
|
+
* @product Sandbox
|
|
63
|
+
*/
|
|
64
|
+
export declare const PersistentSandbox: import("alchemy/Resource").ResourceConstructor<PersistentSandbox, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<PersistentSandbox, never>, never, never> & {
|
|
65
|
+
Self: import("alchemy/Self").Self<PersistentSandbox>;
|
|
66
|
+
Provider: Provider.Provider<PersistentSandbox>;
|
|
67
|
+
Aliases: readonly string[] | undefined;
|
|
68
|
+
ref(id: string, options?: {
|
|
69
|
+
stage?: string;
|
|
70
|
+
stack?: string;
|
|
71
|
+
}): Effect.Effect<PersistentSandbox, never, never>;
|
|
72
|
+
} & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<PersistentSandboxProps>) => Effect.Effect<PersistentSandbox, never, Providers>);
|
|
73
|
+
export type PersistentSandbox = Resource<"Modal.PersistentSandbox", PersistentSandboxProps, PersistentSandboxAttributes, never, Providers>;
|
|
74
|
+
export declare const PersistentSandboxProvider: () => import("effect/Layer").Layer<Provider.Provider<PersistentSandbox>, never, import("@distilled.cloud/modal/Credentials").Credentials | import("effect/http/HttpClient").HttpClient>;
|
|
75
|
+
//# sourceMappingURL=PersistentSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersistentSandbox.d.ts","sources":["../src/PersistentSandbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAIL,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,8BAA8B,EAAE,QAAQ,CAAC;IAC5F;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,2EAA2E;IAC3E,GAAG,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACzF;AAED,MAAM,WAAW,2BAA2B;IAC1C,wFAAwF;IACxF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+BAA+B;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;uJAE7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CACtC,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,EACL,SAAS,CACV,CAAC;AAQF,eAAO,MAAM,yBAAyB,yLAoDnC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as persistent from "@distilled.cloud/modal/persistent";
|
|
2
|
+
import { deepEqual, isResolved } from "alchemy/Diff";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import { Resource } from "alchemy/Resource";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { envNameOf } from "./internal.js";
|
|
7
|
+
import { declarable } from "./internal/Declared.js";
|
|
8
|
+
import { createPersistentSandbox, persistentSandboxHandle, SandboxOps, } from "./SandboxClient.js";
|
|
9
|
+
/**
|
|
10
|
+
* A Modal persistent sandbox: one box whose filesystem outlives its
|
|
11
|
+
* sessions. Each session is a regular sandbox that runs up to an hour and
|
|
12
|
+
* pauses after five idle minutes; the next `session()` resumes it from the
|
|
13
|
+
* last session's filesystem. Use it for a long-lived workspace, such as a
|
|
14
|
+
* shared dev box or an agent's home, that the Stack owns.
|
|
15
|
+
*
|
|
16
|
+
* Modal's persistent sandboxes are experimental: they don't take a name,
|
|
17
|
+
* GPUs, `env`, tags or memory snapshots yet. Changing any prop replaces the
|
|
18
|
+
* box (and its files).
|
|
19
|
+
*
|
|
20
|
+
* ### Creating a box
|
|
21
|
+
* **Example:** A dev box on a warm base image
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
24
|
+
* import { Coder, Warm } from "./Coder.ts";
|
|
25
|
+
*
|
|
26
|
+
* export const DevBox = Modal.PersistentSandbox("DevBox", { app: Coder, image: Warm, workdir: "/work" });
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* ### Using it at runtime
|
|
30
|
+
* **Example:** Resume it from a Worker
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // construction phase
|
|
33
|
+
* const sandboxes = yield* Modal.CreateSandbox(Coder);
|
|
34
|
+
* const devBoxId = yield* (yield* DevBox).persistentSandboxId;
|
|
35
|
+
* // in fetch:
|
|
36
|
+
* const session = yield* (yield* sandboxes.persistent(yield* devBoxId)).session();
|
|
37
|
+
* const result = yield* session.exec(["git", "status"]);
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @resource
|
|
41
|
+
* @product Sandbox
|
|
42
|
+
*/
|
|
43
|
+
export const PersistentSandbox = declarable()(Resource("Modal.PersistentSandbox"));
|
|
44
|
+
const appOf = (value) => ({
|
|
45
|
+
appId: value.appId,
|
|
46
|
+
appName: value.name,
|
|
47
|
+
environment: envNameOf(value.environment),
|
|
48
|
+
});
|
|
49
|
+
export const PersistentSandboxProvider = () => Provider.effect(PersistentSandbox, Effect.gen(function* () {
|
|
50
|
+
return {
|
|
51
|
+
stables: ["persistentSandboxId", "appId"],
|
|
52
|
+
diff: Effect.fn(function* ({ news, olds }) {
|
|
53
|
+
if (!isResolved(news) || olds === undefined)
|
|
54
|
+
return undefined;
|
|
55
|
+
// Modal can't change a persistent sandbox's definition.
|
|
56
|
+
return deepEqual(news, olds) ? undefined : { action: "replace" };
|
|
57
|
+
}),
|
|
58
|
+
read: Effect.fn(function* ({ output }) {
|
|
59
|
+
if (output === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
const found = yield* persistent
|
|
62
|
+
.getPersistentSandbox({ persistentSandboxId: output.persistentSandboxId })
|
|
63
|
+
.pipe(Effect.catchTag("PersistentSandboxNotFound", () => Effect.undefined));
|
|
64
|
+
return found?.persistentSandboxId ? output : undefined;
|
|
65
|
+
}),
|
|
66
|
+
reconcile: Effect.fn(function* ({ news, output, session }) {
|
|
67
|
+
const app = appOf(news.app);
|
|
68
|
+
// Observe: the box still exists.
|
|
69
|
+
if (output !== undefined) {
|
|
70
|
+
const found = yield* persistent
|
|
71
|
+
.getPersistentSandbox({ persistentSandboxId: output.persistentSandboxId })
|
|
72
|
+
.pipe(Effect.catchTag("PersistentSandboxNotFound", () => Effect.undefined));
|
|
73
|
+
if (found?.persistentSandboxId)
|
|
74
|
+
return output;
|
|
75
|
+
}
|
|
76
|
+
// Ensure.
|
|
77
|
+
yield* session.note("Creating persistent sandbox...");
|
|
78
|
+
const { app: _app, ...options } = news;
|
|
79
|
+
// Resolved by the engine: every mount's resource is attributes by now.
|
|
80
|
+
const handle = yield* createPersistentSandbox(yield* SandboxOps, app, options);
|
|
81
|
+
return {
|
|
82
|
+
persistentSandboxId: handle.persistentSandboxId,
|
|
83
|
+
appId: app.appId,
|
|
84
|
+
appName: app.appName,
|
|
85
|
+
environment: app.environment,
|
|
86
|
+
};
|
|
87
|
+
}),
|
|
88
|
+
delete: Effect.fn(function* ({ output }) {
|
|
89
|
+
yield* persistentSandboxHandle(yield* SandboxOps, output.persistentSandboxId, output).terminate();
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}));
|
|
93
|
+
//# sourceMappingURL=PersistentSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersistentSandbox.js","sources":["../src/PersistentSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as Credentials from "./Credentials.ts";
|
|
4
|
+
declare const Providers_base: Provider.ProviderCollection<Providers, "Modal">;
|
|
5
|
+
/**
|
|
6
|
+
* Service tag bundling every Modal provider + auth + credentials. Use
|
|
7
|
+
* `Modal.providers()` to materialize the full layer.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Providers extends Providers_base {
|
|
10
|
+
}
|
|
11
|
+
export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
|
|
12
|
+
/**
|
|
13
|
+
* Every Modal resource provider, the Modal AuthProvider registration (so
|
|
14
|
+
* `alchemy profile edit` can configure it), and credential resolution.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* Alchemy.Stack("App", { providers: Modal.providers() }, ...)
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare const providers: () => Layer.Layer<Credentials.Credentials | import("alchemy/Auth/Credentials").CredentialsStore | import("effect/http/HttpClient").HttpClient | import("alchemy/Auth/Profile").ProfileStore | Providers, never, import("alchemy/Auth/Registry").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=Providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.d.ts","sources":["../src/Providers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;;AAmBhD;;;GAGG;AACH,qBAAa,SAAU,SAAQ,cAAiD;CAAG;AAEnF,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,6fAuDnB,CAAC"}
|
package/lib/Providers.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { CredentialsStoreLive } from "alchemy/Auth/Credentials";
|
|
2
|
+
import { ProfileStoreLive } from "alchemy/Auth/Profile";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import { Random, RandomProvider } from "alchemy/Random";
|
|
5
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import { App, AppProvider } from "./App.js";
|
|
8
|
+
import { ModalAuth } from "./AuthProvider.js";
|
|
9
|
+
import * as Credentials from "./Credentials.js";
|
|
10
|
+
import { Dict, DictProvider } from "./Dict.js";
|
|
11
|
+
import { Domain, DomainProvider } from "./Domain.js";
|
|
12
|
+
import { Endpoint, EndpointProvider } from "./Endpoint.js";
|
|
13
|
+
import { Environment, EnvironmentProvider } from "./Environment.js";
|
|
14
|
+
import { Function, FunctionProvider } from "./Function.js";
|
|
15
|
+
import { FunctionAutoscaler, FunctionAutoscalerProvider } from "./FunctionAutoscaler.js";
|
|
16
|
+
import { Image, ImageProvider } from "./Image.js";
|
|
17
|
+
import { PersistentSandbox, PersistentSandboxProvider } from "./PersistentSandbox.js";
|
|
18
|
+
import { Proxy, ProxyProvider } from "./Proxy.js";
|
|
19
|
+
import { Queue, QueueProvider } from "./Queue.js";
|
|
20
|
+
import { Sandbox, SandboxProvider } from "./Sandbox.js";
|
|
21
|
+
import { Secret, SecretProvider } from "./Secret.js";
|
|
22
|
+
import { Server, ServerProvider } from "./Server.js";
|
|
23
|
+
import { ServiceUser, ServiceUserProvider } from "./ServiceUser.js";
|
|
24
|
+
import { Volume, VolumeProvider } from "./Volume.js";
|
|
25
|
+
import { WebhookToken, WebhookTokenProvider } from "./WebhookToken.js";
|
|
26
|
+
import { WorkspaceSettings, WorkspaceSettingsProvider } from "./WorkspaceSettings.js";
|
|
27
|
+
/**
|
|
28
|
+
* Service tag bundling every Modal provider + auth + credentials. Use
|
|
29
|
+
* `Modal.providers()` to materialize the full layer.
|
|
30
|
+
*/
|
|
31
|
+
export class Providers extends Provider.ProviderCollection()("Modal") {
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Every Modal resource provider, the Modal AuthProvider registration (so
|
|
35
|
+
* `alchemy profile edit` can configure it), and credential resolution.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* Alchemy.Stack("App", { providers: Modal.providers() }, ...)
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export const providers = () => Layer.effect(Providers, Provider.collection([
|
|
43
|
+
App,
|
|
44
|
+
Dict,
|
|
45
|
+
Domain,
|
|
46
|
+
Endpoint,
|
|
47
|
+
Environment,
|
|
48
|
+
Function,
|
|
49
|
+
FunctionAutoscaler,
|
|
50
|
+
Image,
|
|
51
|
+
PersistentSandbox,
|
|
52
|
+
Proxy,
|
|
53
|
+
Queue,
|
|
54
|
+
// Each RPC binding mints its caller's key (`Modal.InvokeFunction`, `Modal.FetchServer`).
|
|
55
|
+
Random,
|
|
56
|
+
Sandbox,
|
|
57
|
+
Secret,
|
|
58
|
+
Server,
|
|
59
|
+
ServiceUser,
|
|
60
|
+
Volume,
|
|
61
|
+
WebhookToken,
|
|
62
|
+
WorkspaceSettings,
|
|
63
|
+
])).pipe(Layer.provide(Layer.mergeAll(AppProvider(), DictProvider(), DomainProvider(), EndpointProvider(), EnvironmentProvider(), FunctionProvider(), FunctionAutoscalerProvider(), ImageProvider(), PersistentSandboxProvider(), ProxyProvider(), QueueProvider(), RandomProvider(), SandboxProvider(), SecretProvider(), ServerProvider(), ServiceUserProvider(), VolumeProvider(), WebhookTokenProvider(), WorkspaceSettingsProvider())), Layer.provideMerge(Credentials.fromAuthProvider()), Layer.provideMerge(FetchHttpClient.layer), Layer.provideMerge(ModalAuth), Layer.provideMerge(ProfileStoreLive), Layer.provideMerge(CredentialsStoreLive), Layer.orDie);
|
|
64
|
+
//# sourceMappingURL=Providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.js","sources":["../src/Providers.ts"],"names":[],"mappings":"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"}
|
package/lib/Proxy.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as proxy from "@distilled.cloud/modal/proxy";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { type EnvironmentInput } from "./internal.ts";
|
|
6
|
+
import type { Providers } from "./Providers.ts";
|
|
7
|
+
declare const ProxyUnexpectedResponse_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
8
|
+
readonly _tag: "Modal.ProxyUnexpectedResponse";
|
|
9
|
+
} & Readonly<A>;
|
|
10
|
+
export declare class ProxyUnexpectedResponse extends ProxyUnexpectedResponse_base<{
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}> {
|
|
13
|
+
}
|
|
14
|
+
export interface ProxyProps {
|
|
15
|
+
/**
|
|
16
|
+
* Proxy name, unique per environment. If omitted, a unique name is
|
|
17
|
+
* generated from the stack, stage and logical ID. Changing it replaces the
|
|
18
|
+
* proxy.
|
|
19
|
+
*/
|
|
20
|
+
name?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Environment the proxy lives in. Changing it replaces the proxy.
|
|
23
|
+
* @default the workspace's default environment
|
|
24
|
+
*/
|
|
25
|
+
environment?: EnvironmentInput;
|
|
26
|
+
/**
|
|
27
|
+
* Region the proxy's IPs come from (e.g. `us-east-1`). Changing it
|
|
28
|
+
* replaces the proxy.
|
|
29
|
+
*/
|
|
30
|
+
region?: string;
|
|
31
|
+
/**
|
|
32
|
+
* Number of static egress IPs. Traffic through the proxy leaves from one
|
|
33
|
+
* of them.
|
|
34
|
+
* @default 1
|
|
35
|
+
*/
|
|
36
|
+
ips?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ProxyAttributes {
|
|
39
|
+
/** Proxy ID (`pr-…`). */
|
|
40
|
+
proxyId: string;
|
|
41
|
+
/** Proxy name. */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Environment name, or `undefined` for the workspace default. */
|
|
44
|
+
environment: string | undefined;
|
|
45
|
+
/** Region of the proxy's IPs. */
|
|
46
|
+
region: string | undefined;
|
|
47
|
+
/** The static egress IPs, for allowlists on the systems a sandbox calls. */
|
|
48
|
+
ips: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A Modal Proxy: static egress IPs for Sandboxes and Functions. Traffic from
|
|
52
|
+
* a sandbox created with `proxy` leaves from these IPs, so a database or API
|
|
53
|
+
* can allowlist them.
|
|
54
|
+
*
|
|
55
|
+
* Proxies are a Modal Team plan feature. Modal proxies have no tags;
|
|
56
|
+
* ownership is inferred from Alchemy state.
|
|
57
|
+
*
|
|
58
|
+
* ### Creating a Proxy
|
|
59
|
+
* **Example:** One static IP
|
|
60
|
+
* ```typescript
|
|
61
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
62
|
+
*
|
|
63
|
+
* export const Egress = Modal.Proxy("Egress", {});
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* **Example:** Two IPs in a region
|
|
67
|
+
* ```typescript
|
|
68
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
69
|
+
*
|
|
70
|
+
* export const Egress = Modal.Proxy("Egress", { region: "us-east-1", ips: 2 });
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* ### Routing a Sandbox through it
|
|
74
|
+
* **Example:** Pass the proxy when creating a sandbox
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const sandbox = yield* sandboxes.create({ proxy: egress });
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @resource
|
|
80
|
+
* @product Proxy
|
|
81
|
+
*/
|
|
82
|
+
export declare const Proxy: import("alchemy/Resource").ResourceConstructor<Proxy, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<Proxy, never>, never, never> & {
|
|
83
|
+
Self: import("alchemy/Self").Self<Proxy>;
|
|
84
|
+
Provider: Provider.Provider<Proxy>;
|
|
85
|
+
Aliases: readonly string[] | undefined;
|
|
86
|
+
ref(id: string, options?: {
|
|
87
|
+
stage?: string;
|
|
88
|
+
stack?: string;
|
|
89
|
+
}): Effect.Effect<Proxy, never, never>;
|
|
90
|
+
} & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<ProxyProps>) => Effect.Effect<Proxy, never, Providers>);
|
|
91
|
+
export type Proxy = Resource<"Modal.Proxy", ProxyProps, ProxyAttributes, never, Providers>;
|
|
92
|
+
export declare const ProxyProvider: () => import("effect/Layer").Layer<Provider.Provider<Proxy>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | proxy.ModalOpContext>;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=Proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.d.ts","sources":["../src/Proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AAGtD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,uBAAwB,SAAQ,6BAAkD;IAC7F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,4EAA4E;IAC5E,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,KAAK;;;;;;;;+HAAsD,CAAC;AAEzE,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAU3F,eAAO,MAAM,aAAa,2JAuFvB,CAAC"}
|
package/lib/Proxy.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as proxy from "@distilled.cloud/modal/proxy";
|
|
2
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
3
|
+
import { isResolved } from "alchemy/Diff";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import { Resource } from "alchemy/Resource";
|
|
6
|
+
import * as Data from "effect/Data";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import { envNameOf, environmentOf, isGeneratedName, objectName, } from "./internal.js";
|
|
9
|
+
import { declarable } from "./internal/Declared.js";
|
|
10
|
+
export class ProxyUnexpectedResponse extends Data.TaggedError("Modal.ProxyUnexpectedResponse") {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A Modal Proxy: static egress IPs for Sandboxes and Functions. Traffic from
|
|
14
|
+
* a sandbox created with `proxy` leaves from these IPs, so a database or API
|
|
15
|
+
* can allowlist them.
|
|
16
|
+
*
|
|
17
|
+
* Proxies are a Modal Team plan feature. Modal proxies have no tags;
|
|
18
|
+
* ownership is inferred from Alchemy state.
|
|
19
|
+
*
|
|
20
|
+
* ### Creating a Proxy
|
|
21
|
+
* **Example:** One static IP
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
24
|
+
*
|
|
25
|
+
* export const Egress = Modal.Proxy("Egress", {});
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* **Example:** Two IPs in a region
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
31
|
+
*
|
|
32
|
+
* export const Egress = Modal.Proxy("Egress", { region: "us-east-1", ips: 2 });
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* ### Routing a Sandbox through it
|
|
36
|
+
* **Example:** Pass the proxy when creating a sandbox
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const sandbox = yield* sandboxes.create({ proxy: egress });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @resource
|
|
42
|
+
* @product Proxy
|
|
43
|
+
*/
|
|
44
|
+
export const Proxy = declarable()(Resource("Modal.Proxy"));
|
|
45
|
+
const toAttrs = (p, env) => ({
|
|
46
|
+
proxyId: p.proxyId ?? "",
|
|
47
|
+
name: p.name ?? "",
|
|
48
|
+
environment: env,
|
|
49
|
+
region: p.region || undefined,
|
|
50
|
+
ips: (p.proxyIps ?? []).flatMap((ip) => (ip.proxyIp ? [ip.proxyIp] : [])),
|
|
51
|
+
});
|
|
52
|
+
export const ProxyProvider = () => Provider.effect(Proxy, Effect.gen(function* () {
|
|
53
|
+
const observe = Effect.fn(function* (name, env) {
|
|
54
|
+
const found = yield* proxy
|
|
55
|
+
.getProxy({ name, environmentName: environmentOf(env) })
|
|
56
|
+
.pipe(Effect.catchTag("ProxyNotFound", () => Effect.undefined));
|
|
57
|
+
return found?.proxy?.proxyId ? found.proxy : undefined;
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
stables: ["proxyId", "name", "environment", "region"],
|
|
61
|
+
diff: Effect.fn(function* ({ id, news, olds, output }) {
|
|
62
|
+
if (!isResolved(news))
|
|
63
|
+
return undefined;
|
|
64
|
+
if (envNameOf(news.environment) !== envNameOf(olds?.environment))
|
|
65
|
+
return { action: "replace" };
|
|
66
|
+
if (news.region !== olds?.region)
|
|
67
|
+
return { action: "replace" };
|
|
68
|
+
const name = yield* objectName(id, news.name);
|
|
69
|
+
if (output !== undefined && name !== output.name)
|
|
70
|
+
return { action: "replace" };
|
|
71
|
+
return undefined;
|
|
72
|
+
}),
|
|
73
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
74
|
+
const name = output?.name ?? (yield* objectName(id, olds?.name));
|
|
75
|
+
const env = output?.environment ?? envNameOf(olds?.environment);
|
|
76
|
+
const found = yield* observe(name, env);
|
|
77
|
+
if (!found)
|
|
78
|
+
return undefined;
|
|
79
|
+
const attrs = toAttrs(found, env);
|
|
80
|
+
return output !== undefined || olds?.name === undefined ? attrs : Unowned(attrs);
|
|
81
|
+
}),
|
|
82
|
+
reconcile: Effect.fn(function* ({ id, news, output, session }) {
|
|
83
|
+
const name = output?.name ?? (yield* objectName(id, news.name));
|
|
84
|
+
// Observe
|
|
85
|
+
let current = yield* observe(name, envNameOf(news.environment));
|
|
86
|
+
// Ensure
|
|
87
|
+
if (!current) {
|
|
88
|
+
yield* session.note(`Creating proxy ${name}...`);
|
|
89
|
+
const created = yield* proxy
|
|
90
|
+
.createProxy({
|
|
91
|
+
name,
|
|
92
|
+
environmentName: environmentOf(envNameOf(news.environment)),
|
|
93
|
+
region: news.region,
|
|
94
|
+
})
|
|
95
|
+
.pipe(Effect.map((response) => response.proxy), Effect.catchTag("ProxyAlreadyExists", () => observe(name, envNameOf(news.environment))));
|
|
96
|
+
if (!created?.proxyId) {
|
|
97
|
+
return yield* new ProxyUnexpectedResponse({
|
|
98
|
+
message: `Modal returned no proxy for ${name}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
current = created;
|
|
102
|
+
}
|
|
103
|
+
// Sync the IP count against the observed IPs.
|
|
104
|
+
const desired = news.ips ?? 1;
|
|
105
|
+
const observed = (current.proxyIps ?? []).flatMap((ip) => ip.proxyIp ? [ip.proxyIp] : []);
|
|
106
|
+
for (let i = observed.length; i < desired; i++) {
|
|
107
|
+
yield* session.note(`Adding an IP to proxy ${name}...`);
|
|
108
|
+
yield* proxy.proxyAddIp({ proxyId: current.proxyId });
|
|
109
|
+
}
|
|
110
|
+
for (const ip of observed.slice(desired)) {
|
|
111
|
+
yield* session.note(`Removing IP ${ip} from proxy ${name}...`);
|
|
112
|
+
yield* proxy
|
|
113
|
+
.proxyRemoveIp({ proxyIp: ip })
|
|
114
|
+
.pipe(Effect.catchTag("ProxyNotFound", () => Effect.void));
|
|
115
|
+
}
|
|
116
|
+
const final = (yield* observe(name, envNameOf(news.environment))) ?? current;
|
|
117
|
+
return toAttrs(final, envNameOf(news.environment));
|
|
118
|
+
}),
|
|
119
|
+
delete: Effect.fn(function* ({ output }) {
|
|
120
|
+
yield* proxy
|
|
121
|
+
.deleteProxy({ proxyId: output.proxyId })
|
|
122
|
+
.pipe(Effect.catchTag("ProxyNotFound", () => Effect.void));
|
|
123
|
+
}),
|
|
124
|
+
list: Effect.fn(function* () {
|
|
125
|
+
const { proxies } = yield* proxy.listProxy({});
|
|
126
|
+
return (proxies ?? [])
|
|
127
|
+
.filter((p) => p.proxyId && isGeneratedName(p.name))
|
|
128
|
+
.map((p) => toAttrs(p, p.environmentName || undefined));
|
|
129
|
+
}),
|
|
130
|
+
};
|
|
131
|
+
}));
|
|
132
|
+
//# sourceMappingURL=Proxy.js.map
|
package/lib/Proxy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.js","sources":["../src/Proxy.ts"],"names":[],"mappings":"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"}
|