@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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { VolumeGetFile2Error, VolumeListFiles2Error, VolumeRemoveFile2Error, VolumeCopyFiles2Error, VolumePutFiles2Error } from "@distilled.cloud/modal/volume";
|
|
2
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import type { HttpClientError } from "effect/http/HttpClientError";
|
|
5
|
+
import { type VolumeFileEntry, type VolumeFileOps, type VolumeTransferError } from "./VolumeFiles.ts";
|
|
6
|
+
/** Errors reading a volume file: `VolumeFileNotFound` when the path is missing. */
|
|
7
|
+
export type ReadVolumeFileError = VolumeGetFile2Error | VolumeTransferError | HttpClientError;
|
|
8
|
+
/** Errors listing a volume directory. */
|
|
9
|
+
export type ListVolumeFilesError = VolumeListFiles2Error;
|
|
10
|
+
/** Errors removing or copying volume files. */
|
|
11
|
+
export type ChangeVolumeFilesError = VolumeRemoveFile2Error | VolumeCopyFiles2Error;
|
|
12
|
+
/** Errors writing a volume file. */
|
|
13
|
+
export type WriteVolumeFileError = VolumePutFiles2Error | VolumeTransferError | HttpClientError;
|
|
14
|
+
/** Read access to one volume's files. */
|
|
15
|
+
export interface ReadVolumeClient {
|
|
16
|
+
/** The volume's id. */
|
|
17
|
+
readonly volumeId: Effect.Effect<string>;
|
|
18
|
+
/** Read a file. */
|
|
19
|
+
readFile(path: string): Effect.Effect<Uint8Array, ReadVolumeFileError, RuntimeContext>;
|
|
20
|
+
/** Read a UTF-8 file. */
|
|
21
|
+
readFileString(path: string): Effect.Effect<string, ReadVolumeFileError, RuntimeContext>;
|
|
22
|
+
/** List a directory (`recursive` walks it). */
|
|
23
|
+
listFiles(path: string, options?: {
|
|
24
|
+
readonly recursive?: boolean;
|
|
25
|
+
}): Effect.Effect<ReadonlyArray<VolumeFileEntry>, ListVolumeFilesError, RuntimeContext>;
|
|
26
|
+
}
|
|
27
|
+
/** Write access to one volume's files. */
|
|
28
|
+
export interface WriteVolumeClient {
|
|
29
|
+
/** The volume's id. */
|
|
30
|
+
readonly volumeId: Effect.Effect<string>;
|
|
31
|
+
/** Write (create or replace) a file. */
|
|
32
|
+
writeFile(path: string, data: string | Uint8Array, options?: {
|
|
33
|
+
readonly mode?: number;
|
|
34
|
+
}): Effect.Effect<void, WriteVolumeFileError, RuntimeContext>;
|
|
35
|
+
/** Remove a file, or a directory with `recursive`. */
|
|
36
|
+
removeFile(path: string, options?: {
|
|
37
|
+
readonly recursive?: boolean;
|
|
38
|
+
}): Effect.Effect<void, ChangeVolumeFilesError, RuntimeContext>;
|
|
39
|
+
/** Copy files to `destination` inside the volume. */
|
|
40
|
+
copyFiles(sources: ReadonlyArray<string>, destination: string, options?: {
|
|
41
|
+
readonly recursive?: boolean;
|
|
42
|
+
}): Effect.Effect<void, ChangeVolumeFilesError, RuntimeContext>;
|
|
43
|
+
}
|
|
44
|
+
/** Read and write access to one volume's files. */
|
|
45
|
+
export interface ReadWriteVolumeClient extends ReadVolumeClient, WriteVolumeClient {
|
|
46
|
+
}
|
|
47
|
+
/** The read half of a volume client over `volumeId`. */
|
|
48
|
+
export declare const makeReadVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => ReadVolumeClient;
|
|
49
|
+
/** The write half of a volume client over `volumeId`. */
|
|
50
|
+
export declare const makeWriteVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => WriteVolumeClient;
|
|
51
|
+
/** A read-write volume client over `volumeId`. */
|
|
52
|
+
export declare const makeReadWriteVolumeClient: (volumeId: Effect.Effect<string>, ops: VolumeFileOps) => ReadWriteVolumeClient;
|
|
53
|
+
//# sourceMappingURL=VolumeClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeClient.d.ts","sources":["../src/VolumeClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { copyVolumeFiles, listVolumeFiles, readVolumeFile, removeVolumeFile, writeVolumeFile, } from "./VolumeFiles.js";
|
|
3
|
+
/** The read half of a volume client over `volumeId`. */
|
|
4
|
+
export const makeReadVolumeClient = (volumeId, ops) => ({
|
|
5
|
+
volumeId,
|
|
6
|
+
readFile: (path) => Effect.flatMap(volumeId, (id) => readVolumeFile(ops, id, path)),
|
|
7
|
+
readFileString: (path) => Effect.flatMap(volumeId, (id) => readVolumeFile(ops, id, path)).pipe(Effect.map((bytes) => new TextDecoder().decode(bytes))),
|
|
8
|
+
listFiles: (path, options) => Effect.flatMap(volumeId, (id) => listVolumeFiles(ops, id, path, options)),
|
|
9
|
+
});
|
|
10
|
+
/** The write half of a volume client over `volumeId`. */
|
|
11
|
+
export const makeWriteVolumeClient = (volumeId, ops) => ({
|
|
12
|
+
volumeId,
|
|
13
|
+
writeFile: (path, data, options) => Effect.flatMap(volumeId, (id) => writeVolumeFile(ops, id, path, data, options)),
|
|
14
|
+
removeFile: (path, options) => Effect.flatMap(volumeId, (id) => removeVolumeFile(ops, id, path, options)),
|
|
15
|
+
copyFiles: (sources, destination, options) => Effect.flatMap(volumeId, (id) => copyVolumeFiles(ops, id, sources, destination, options)),
|
|
16
|
+
});
|
|
17
|
+
/** A read-write volume client over `volumeId`. */
|
|
18
|
+
export const makeReadWriteVolumeClient = (volumeId, ops) => ({
|
|
19
|
+
...makeReadVolumeClient(volumeId, ops),
|
|
20
|
+
...makeWriteVolumeClient(volumeId, ops),
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=VolumeClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeClient.js","sources":["../src/VolumeClient.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAoD1B,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAA+B,EAC/B,GAAkB,EACA,EAAE,CAAC,CAAC;IACtB,QAAQ;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACnF,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACvD;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;CAC5E,CAAC,CAAC;AAEH,yDAAyD;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA+B,EAC/B,GAAkB,EACC,EAAE,CAAC,CAAC;IACvB,QAAQ;IACR,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CACjC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACjF,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC5B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5F,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAA+B,EAC/B,GAAkB,EACK,EAAE,CAAC,CAAC;IAC3B,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC;IACtC,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,CAAC;CACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as volume from "@distilled.cloud/modal/volume";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as HttpClient from "effect/http/HttpClient";
|
|
4
|
+
declare const VolumeTransferError_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 & {
|
|
5
|
+
readonly _tag: "Modal.VolumeTransferError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
/** A block upload or download to a URL Modal handed out failed. */
|
|
8
|
+
export declare class VolumeTransferError extends VolumeTransferError_base<{
|
|
9
|
+
readonly path: string;
|
|
10
|
+
readonly message: string;
|
|
11
|
+
}> {
|
|
12
|
+
}
|
|
13
|
+
/** One entry of a volume directory listing. */
|
|
14
|
+
export interface VolumeFileEntry {
|
|
15
|
+
/** Path relative to the volume root. */
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly type: "file" | "directory" | "symlink" | "other";
|
|
18
|
+
/** Size in bytes (files). */
|
|
19
|
+
readonly size: number;
|
|
20
|
+
/** Modification time, seconds since the epoch. */
|
|
21
|
+
readonly mtime: number;
|
|
22
|
+
}
|
|
23
|
+
/** The operations a volume's files need, resolved by `ModalBindings.withCredentials`. */
|
|
24
|
+
export declare const VolumeFileOps: Effect.Effect<{
|
|
25
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
26
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
27
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
28
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
29
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
30
|
+
readonly http: HttpClient.HttpClient;
|
|
31
|
+
}, never, import("./internal.ts").OperationServices>;
|
|
32
|
+
export type VolumeFileOps = Effect.Success<typeof VolumeFileOps>;
|
|
33
|
+
/**
|
|
34
|
+
* Read a file from a (v2) volume: Modal returns presigned URLs for the
|
|
35
|
+
* file's blocks, which are fetched and concatenated.
|
|
36
|
+
*/
|
|
37
|
+
export declare const readVolumeFile: (ops: {
|
|
38
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
39
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
40
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
41
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
42
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
43
|
+
readonly http: HttpClient.HttpClient;
|
|
44
|
+
}, volumeId: string, path: string) => Effect.Effect<Uint8Array<ArrayBuffer>, VolumeTransferError | volume.VolumeGetFile2Error, never>;
|
|
45
|
+
/** List a directory of a (v2) volume. */
|
|
46
|
+
export declare const listVolumeFiles: (ops: {
|
|
47
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
48
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
49
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
50
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
51
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
52
|
+
readonly http: HttpClient.HttpClient;
|
|
53
|
+
}, volumeId: string, path: string, options?: {
|
|
54
|
+
readonly recursive?: boolean;
|
|
55
|
+
} | undefined) => Effect.Effect<VolumeFileEntry[], volume.VolumeListFiles2Error, never>;
|
|
56
|
+
/**
|
|
57
|
+
* Write a file to a (v2) volume: send each 8 MiB block's SHA-256, upload
|
|
58
|
+
* the blocks Modal reports missing to the URLs it returns, then commit with
|
|
59
|
+
* the upload responses.
|
|
60
|
+
*/
|
|
61
|
+
export declare const writeVolumeFile: (ops: {
|
|
62
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
63
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
64
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
65
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
66
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
67
|
+
readonly http: HttpClient.HttpClient;
|
|
68
|
+
}, volumeId: string, path: string, data: string | Uint8Array<ArrayBufferLike>, options?: {
|
|
69
|
+
readonly mode?: number;
|
|
70
|
+
} | undefined) => Effect.Effect<undefined, VolumeTransferError | volume.VolumePutFiles2Error, never>;
|
|
71
|
+
/** Remove a file (or, with `recursive`, a directory) from a (v2) volume. */
|
|
72
|
+
export declare const removeVolumeFile: (ops: {
|
|
73
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
74
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
75
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
76
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
77
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
78
|
+
readonly http: HttpClient.HttpClient;
|
|
79
|
+
}, volumeId: string, path: string, options?: {
|
|
80
|
+
readonly recursive?: boolean;
|
|
81
|
+
} | undefined) => Effect.Effect<void, volume.VolumeRemoveFile2Error, never>;
|
|
82
|
+
/** Copy files inside a (v2) volume. */
|
|
83
|
+
export declare const copyVolumeFiles: (ops: {
|
|
84
|
+
readonly getFile: (input: volume.VolumeGetFile2Request) => Effect.Effect<volume.VolumeGetFile2Response, volume.VolumeGetFile2Error, never>;
|
|
85
|
+
readonly listFiles: import("@distilled.cloud/core/api").StreamingCall<volume.VolumeListFiles2Request, volume.VolumeListFiles2Stream, volume.VolumeListFiles2Error, never, volume.VolumeListFilesResponse>;
|
|
86
|
+
readonly putFiles: (input: volume.VolumePutFiles2Request) => Effect.Effect<volume.VolumePutFiles2Response, volume.VolumePutFiles2Error, never>;
|
|
87
|
+
readonly removeFile: (input: volume.VolumeRemoveFile2Request) => Effect.Effect<volume.VolumeRemoveFile2Response, volume.VolumeRemoveFile2Error, never>;
|
|
88
|
+
readonly copyFiles: (input: volume.VolumeCopyFiles2Request) => Effect.Effect<volume.VolumeCopyFiles2Response, volume.VolumeCopyFiles2Error, never>;
|
|
89
|
+
readonly http: HttpClient.HttpClient;
|
|
90
|
+
}, volumeId: string, sources: readonly string[], destination: string, options?: {
|
|
91
|
+
readonly recursive?: boolean;
|
|
92
|
+
} | undefined) => Effect.Effect<void, volume.VolumeCopyFiles2Error, never>;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=VolumeFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeFiles.d.ts","sources":["../src/VolumeFiles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AAExD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;;;;AAIrD,mEAAmE;AACnE,qBAAa,mBAAoB,SAAQ,yBAA8C;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1D,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAID,yFAAyF;AACzF,eAAO,MAAM,aAAa;;;;;;;oDAOxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,aAAa,CAAC,CAAC;AAcjE;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;qIAwBzB,CAAC;AAEH,yCAAyC;AACzC,eAAO,MAAM,eAAe;;;;;;;;yBAIM,OAAO;uFAevC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;oBAKC,MAAM;oGAsDjC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB;;;;;;;;yBAIK,OAAO;2EAGvC,CAAC;AAEH,uCAAuC;AACvC,eAAO,MAAM,eAAe;;;;;;;;yBAKM,OAAO;0EAQvC,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import * as volume from "@distilled.cloud/modal/volume";
|
|
3
|
+
import * as Data from "effect/Data";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as HttpClient from "effect/http/HttpClient";
|
|
6
|
+
import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
7
|
+
import { operations } from "./internal.js";
|
|
8
|
+
/** A block upload or download to a URL Modal handed out failed. */
|
|
9
|
+
export class VolumeTransferError extends Data.TaggedError("Modal.VolumeTransferError") {
|
|
10
|
+
}
|
|
11
|
+
const BLOCK_SIZE = 8 * 1024 * 1024;
|
|
12
|
+
/** The operations a volume's files need, resolved by `ModalBindings.withCredentials`. */
|
|
13
|
+
export const VolumeFileOps = operations({
|
|
14
|
+
getFile: volume.volumeGetFile2,
|
|
15
|
+
listFiles: volume.volumeListFiles2,
|
|
16
|
+
putFiles: volume.volumePutFiles2,
|
|
17
|
+
removeFile: volume.volumeRemoveFile2,
|
|
18
|
+
copyFiles: volume.volumeCopyFiles2,
|
|
19
|
+
http: HttpClient.HttpClient,
|
|
20
|
+
});
|
|
21
|
+
const typeOf = (type) => type === "FILE"
|
|
22
|
+
? "file"
|
|
23
|
+
: type === "DIRECTORY"
|
|
24
|
+
? "directory"
|
|
25
|
+
: type === "SYMLINK"
|
|
26
|
+
? "symlink"
|
|
27
|
+
: "other";
|
|
28
|
+
const toBytes = (data) => Effect.sync(() => (typeof data === "string" ? new TextEncoder().encode(data) : data));
|
|
29
|
+
/**
|
|
30
|
+
* Read a file from a (v2) volume: Modal returns presigned URLs for the
|
|
31
|
+
* file's blocks, which are fetched and concatenated.
|
|
32
|
+
*/
|
|
33
|
+
export const readVolumeFile = Effect.fn(function* (ops, volumeId, path) {
|
|
34
|
+
const { getUrls, size } = yield* ops.getFile({ volumeId, path });
|
|
35
|
+
const total = Number(size ?? 0);
|
|
36
|
+
const out = new Uint8Array(total);
|
|
37
|
+
let offset = 0;
|
|
38
|
+
for (const url of getUrls ?? []) {
|
|
39
|
+
// A presigned block URL returned by VolumeGetFile2 (allowed raw HTTP).
|
|
40
|
+
const response = yield* ops.http.execute(HttpClientRequest.get(url));
|
|
41
|
+
if (response.status >= 300) {
|
|
42
|
+
return yield* new VolumeTransferError({
|
|
43
|
+
path,
|
|
44
|
+
message: `Downloading a block of ${path} failed with HTTP ${response.status}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const buffer = yield* response.arrayBuffer;
|
|
48
|
+
const block = new Uint8Array(buffer);
|
|
49
|
+
out.set(block.subarray(0, Math.max(0, total - offset)), offset);
|
|
50
|
+
offset += Math.min(block.length, BLOCK_SIZE);
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
});
|
|
54
|
+
/** List a directory of a (v2) volume. */
|
|
55
|
+
export const listVolumeFiles = Effect.fn(function* (ops, volumeId, path, options = {}) {
|
|
56
|
+
const { items } = yield* ops.listFiles({
|
|
57
|
+
volumeId,
|
|
58
|
+
path,
|
|
59
|
+
recursive: options.recursive ?? false,
|
|
60
|
+
});
|
|
61
|
+
return items.flatMap((batch) => (batch.entries ?? []).map((entry) => ({
|
|
62
|
+
path: entry.path ?? "",
|
|
63
|
+
type: typeOf(entry.type),
|
|
64
|
+
size: Number(entry.size ?? 0),
|
|
65
|
+
mtime: Number(entry.mtime ?? 0),
|
|
66
|
+
})));
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Write a file to a (v2) volume: send each 8 MiB block's SHA-256, upload
|
|
70
|
+
* the blocks Modal reports missing to the URLs it returns, then commit with
|
|
71
|
+
* the upload responses.
|
|
72
|
+
*/
|
|
73
|
+
export const writeVolumeFile = Effect.fn(function* (ops, volumeId, path, data, options = {}) {
|
|
74
|
+
const bytes = yield* toBytes(data);
|
|
75
|
+
const blocks = yield* Effect.sync(() => {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (let offset = 0; offset === 0 || offset < bytes.length; offset += BLOCK_SIZE) {
|
|
78
|
+
const block = bytes.subarray(offset, offset + BLOCK_SIZE);
|
|
79
|
+
out.push({ data: block, sha256: createHash("sha256").update(block).digest("base64") });
|
|
80
|
+
if (bytes.length === 0)
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
});
|
|
85
|
+
const putResponses = new Map();
|
|
86
|
+
for (let round = 0; round < 3; round++) {
|
|
87
|
+
const { missingBlocks } = yield* ops.putFiles({
|
|
88
|
+
volumeId,
|
|
89
|
+
files: [
|
|
90
|
+
{
|
|
91
|
+
path,
|
|
92
|
+
size: String(bytes.length),
|
|
93
|
+
mode: options.mode ?? 0o644,
|
|
94
|
+
blocks: blocks.map((block, index) => ({
|
|
95
|
+
contentsSha256: block.sha256,
|
|
96
|
+
putResponse: putResponses.get(index),
|
|
97
|
+
})),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
if (!missingBlocks || missingBlocks.length === 0)
|
|
102
|
+
return;
|
|
103
|
+
for (const missing of missingBlocks) {
|
|
104
|
+
const index = Number(missing.blockIndex ?? 0);
|
|
105
|
+
const block = blocks[index];
|
|
106
|
+
if (!block || !missing.putUrl)
|
|
107
|
+
continue;
|
|
108
|
+
// A presigned block URL returned by VolumePutFiles2 (allowed raw HTTP).
|
|
109
|
+
const response = yield* ops.http.execute(HttpClientRequest.put(missing.putUrl).pipe(HttpClientRequest.bodyUint8Array(block.data, "application/octet-stream")));
|
|
110
|
+
if (response.status >= 300) {
|
|
111
|
+
return yield* new VolumeTransferError({
|
|
112
|
+
path,
|
|
113
|
+
message: `Uploading block ${index} of ${path} failed with HTTP ${response.status}`,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const body = yield* response.arrayBuffer;
|
|
117
|
+
const encoded = yield* Effect.sync(() => Buffer.from(body).toString("base64"));
|
|
118
|
+
putResponses.set(index, encoded);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return yield* new VolumeTransferError({
|
|
122
|
+
path,
|
|
123
|
+
message: `Modal kept reporting blocks of ${path} missing after upload`,
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
/** Remove a file (or, with `recursive`, a directory) from a (v2) volume. */
|
|
127
|
+
export const removeVolumeFile = Effect.fn(function* (ops, volumeId, path, options = {}) {
|
|
128
|
+
yield* ops.removeFile({ volumeId, path, recursive: options.recursive ?? false });
|
|
129
|
+
});
|
|
130
|
+
/** Copy files inside a (v2) volume. */
|
|
131
|
+
export const copyVolumeFiles = Effect.fn(function* (ops, volumeId, sources, destination, options = {}) {
|
|
132
|
+
yield* ops.copyFiles({
|
|
133
|
+
volumeId,
|
|
134
|
+
srcPaths: [...sources],
|
|
135
|
+
dstPath: destination,
|
|
136
|
+
recursive: options.recursive ?? false,
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=VolumeFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeFiles.js","sources":["../src/VolumeFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AACxD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,mEAAmE;AACnE,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAGnF;CAAG;AAaL,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC,gBAAgB;IAClC,QAAQ,EAAE,MAAM,CAAC,eAAe;IAChC,UAAU,EAAE,MAAM,CAAC,iBAAiB;IACpC,SAAS,EAAE,MAAM,CAAC,gBAAgB;IAClC,IAAI,EAAE,UAAU,CAAC,UAAU;CAC5B,CAAC,CAAC;AAIH,MAAM,MAAM,GAAG,CAAC,IAAwB,EAA2B,EAAE,CACnE,IAAI,KAAK,MAAM;IACb,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,IAAI,KAAK,WAAW;QACpB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC;AAElB,MAAM,OAAO,GAAG,CAAC,IAAyB,EAAE,EAAE,CAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAExF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAC/C,GAAkB,EAClB,QAAgB,EAChB,IAAY;IAEZ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,uEAAuE;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC;gBACpC,IAAI;gBACJ,OAAO,EAAE,0BAA0B,IAAI,qBAAqB,QAAQ,CAAC,MAAM,EAAE;aAC9E,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAChD,GAAkB,EAClB,QAAgB,EAChB,IAAY,EACZ,OAAO,GAAqC,EAAE;IAE9C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;QACrC,QAAQ;QACR,IAAI;QACJ,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;KACtC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;KAChC,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAChD,GAAkB,EAClB,QAAgB,EAChB,IAAY,EACZ,IAAyB,EACzB,OAAO,GAA+B,EAAE;IAExC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACrC,MAAM,GAAG,GAA6D,EAAE,CAAC;QACzE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,CAAC;YACjF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC5C,QAAQ;YACR,KAAK,EAAE;gBACL;oBACE,IAAI;oBACJ,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;oBAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;wBACpC,cAAc,EAAE,KAAK,CAAC,MAAM;wBAC5B,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;qBACrC,CAAC,CAAC;iBACJ;aACF;SACF,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACzD,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,SAAS;YACxC,wEAAwE;YACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CACtC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CACxC,iBAAiB,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CACzE,CACF,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC;oBACpC,IAAI;oBACJ,OAAO,EAAE,mBAAmB,KAAK,OAAO,IAAI,qBAAqB,QAAQ,CAAC,MAAM,EAAE;iBACnF,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC;QACpC,IAAI;QACJ,OAAO,EAAE,kCAAkC,IAAI,uBAAuB;KACvE,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EACjD,GAAkB,EAClB,QAAgB,EAChB,IAAY,EACZ,OAAO,GAAqC,EAAE;IAE9C,KAAK,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,uCAAuC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAChD,GAAkB,EAClB,QAAgB,EAChB,OAA8B,EAC9B,WAAmB,EACnB,OAAO,GAAqC,EAAE;IAE9C,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;QACnB,QAAQ;QACR,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC;QACtB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;KACtC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as environment from "@distilled.cloud/modal/environment";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Redacted from "effect/Redacted";
|
|
6
|
+
import type { Providers } from "./Providers.ts";
|
|
7
|
+
declare const WebhookTokenUnexpectedResponse_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.WebhookTokenUnexpectedResponse";
|
|
9
|
+
} & Readonly<A>;
|
|
10
|
+
export declare class WebhookTokenUnexpectedResponse extends WebhookTokenUnexpectedResponse_base<{
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}> {
|
|
13
|
+
}
|
|
14
|
+
export interface WebhookTokenProps {
|
|
15
|
+
/**
|
|
16
|
+
* Display name of the token. If omitted, one is generated from the stack,
|
|
17
|
+
* stage and logical ID. Changing it renames the token in place.
|
|
18
|
+
*/
|
|
19
|
+
name?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Limit the token to the environments in {@link environments}. Changing it
|
|
22
|
+
* replaces the token (and its secret).
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
scoped?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Environments a scoped token works in: environment IDs, or yielded
|
|
28
|
+
* `Modal.Environment`s. Ignored unless {@link scoped} is set.
|
|
29
|
+
*/
|
|
30
|
+
environments?: Array<string | {
|
|
31
|
+
readonly environmentId: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export interface WebhookTokenAttributes {
|
|
35
|
+
/** Token ID (`wk-…`), sent as the `Modal-Key` header. */
|
|
36
|
+
tokenId: string;
|
|
37
|
+
/** Token secret (`ws-…`), sent as the `Modal-Secret` header. */
|
|
38
|
+
tokenSecret: Redacted.Redacted<string>;
|
|
39
|
+
/** Display name. */
|
|
40
|
+
name: string;
|
|
41
|
+
/** Whether the token is limited to {@link WebhookTokenProps.environments}. */
|
|
42
|
+
scoped: boolean;
|
|
43
|
+
/** Environment IDs a scoped token works in. */
|
|
44
|
+
environments: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A Modal proxy auth token: the `Modal-Key` / `Modal-Secret` header pair
|
|
48
|
+
* that web endpoints and sandbox tunnels created with proxy authentication
|
|
49
|
+
* require. A scoped token works only in the environments it lists.
|
|
50
|
+
*
|
|
51
|
+
* Modal shows a token's secret once, at creation, so a token deleted outside
|
|
52
|
+
* Alchemy is recreated with a new secret on the next deploy. Tokens have no
|
|
53
|
+
* unique names, so they can't be adopted and aren't listed for
|
|
54
|
+
* `alchemy nuke`.
|
|
55
|
+
*
|
|
56
|
+
* ### Creating a token
|
|
57
|
+
* **Example:** A workspace-wide token
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
60
|
+
*
|
|
61
|
+
* export const Caller = Modal.WebhookToken("Caller", {});
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* **Example:** A token scoped to one environment
|
|
65
|
+
* ```typescript
|
|
66
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
67
|
+
*
|
|
68
|
+
* export const Agents = Modal.Environment("Agents", {});
|
|
69
|
+
* export const AgentsCaller = Modal.WebhookToken("AgentsCaller", {
|
|
70
|
+
* scoped: true,
|
|
71
|
+
* environments: [Agents],
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* ### Calling a protected endpoint
|
|
76
|
+
* **Example:** Send the header pair
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const token = yield* AgentsCaller;
|
|
79
|
+
* const response = yield* HttpClient.get(url, {
|
|
80
|
+
* headers: {
|
|
81
|
+
* "Modal-Key": token.tokenId,
|
|
82
|
+
* "Modal-Secret": Redacted.value(token.tokenSecret),
|
|
83
|
+
* },
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @resource
|
|
88
|
+
* @product WebhookToken
|
|
89
|
+
*/
|
|
90
|
+
export declare const WebhookToken: import("alchemy/Resource").ResourceConstructor<WebhookToken, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<WebhookToken, never>, never, never> & {
|
|
91
|
+
Self: import("alchemy/Self").Self<WebhookToken>;
|
|
92
|
+
Provider: Provider.Provider<WebhookToken>;
|
|
93
|
+
Aliases: readonly string[] | undefined;
|
|
94
|
+
ref(id: string, options?: {
|
|
95
|
+
stage?: string;
|
|
96
|
+
stack?: string;
|
|
97
|
+
}): Effect.Effect<WebhookToken, never, never>;
|
|
98
|
+
} & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<WebhookTokenProps>) => Effect.Effect<WebhookToken, never, Providers>);
|
|
99
|
+
export type WebhookToken = Resource<"Modal.WebhookToken", WebhookTokenProps, WebhookTokenAttributes, never, Providers>;
|
|
100
|
+
export declare const WebhookTokenProvider: () => import("effect/Layer").Layer<Provider.Provider<WebhookToken>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | environment.ModalOpContext>;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=WebhookToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookToken.d.ts","sources":["../src/WebhookToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,oCAAoC,CAAC;AAGlE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,8BAA+B,SAAQ,oCAElD;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAC;IAChB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,YAAY;;;;;;;;6IAExB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,EACL,SAAS,CACV,CAAC;AAEF,eAAO,MAAM,oBAAoB,wKA2H9B,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import * as environment from "@distilled.cloud/modal/environment";
|
|
2
|
+
import * as webhook from "@distilled.cloud/modal/webhook";
|
|
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 * as Redacted from "effect/Redacted";
|
|
9
|
+
import { objectName } from "./internal.js";
|
|
10
|
+
import { declarable } from "./internal/Declared.js";
|
|
11
|
+
export class WebhookTokenUnexpectedResponse extends Data.TaggedError("Modal.WebhookTokenUnexpectedResponse") {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A Modal proxy auth token: the `Modal-Key` / `Modal-Secret` header pair
|
|
15
|
+
* that web endpoints and sandbox tunnels created with proxy authentication
|
|
16
|
+
* require. A scoped token works only in the environments it lists.
|
|
17
|
+
*
|
|
18
|
+
* Modal shows a token's secret once, at creation, so a token deleted outside
|
|
19
|
+
* Alchemy is recreated with a new secret on the next deploy. Tokens have no
|
|
20
|
+
* unique names, so they can't be adopted and aren't listed for
|
|
21
|
+
* `alchemy nuke`.
|
|
22
|
+
*
|
|
23
|
+
* ### Creating a token
|
|
24
|
+
* **Example:** A workspace-wide token
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
27
|
+
*
|
|
28
|
+
* export const Caller = Modal.WebhookToken("Caller", {});
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* **Example:** A token scoped to one environment
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import * as Modal from "@alchemy.run/modal";
|
|
34
|
+
*
|
|
35
|
+
* export const Agents = Modal.Environment("Agents", {});
|
|
36
|
+
* export const AgentsCaller = Modal.WebhookToken("AgentsCaller", {
|
|
37
|
+
* scoped: true,
|
|
38
|
+
* environments: [Agents],
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* ### Calling a protected endpoint
|
|
43
|
+
* **Example:** Send the header pair
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const token = yield* AgentsCaller;
|
|
46
|
+
* const response = yield* HttpClient.get(url, {
|
|
47
|
+
* headers: {
|
|
48
|
+
* "Modal-Key": token.tokenId,
|
|
49
|
+
* "Modal-Secret": Redacted.value(token.tokenSecret),
|
|
50
|
+
* },
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @resource
|
|
55
|
+
* @product WebhookToken
|
|
56
|
+
*/
|
|
57
|
+
export const WebhookToken = declarable()(Resource("Modal.WebhookToken"));
|
|
58
|
+
export const WebhookTokenProvider = () => Provider.effect(WebhookToken, Effect.gen(function* () {
|
|
59
|
+
const observe = Effect.fn(function* (tokenId) {
|
|
60
|
+
const { tokens } = yield* webhook.listWebhookToken({});
|
|
61
|
+
return (tokens ?? []).find((token) => token.tokenId === tokenId);
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
stables: ["tokenId", "tokenSecret", "scoped"],
|
|
65
|
+
diff: Effect.fn(function* ({ news, olds }) {
|
|
66
|
+
if (!isResolved(news))
|
|
67
|
+
return undefined;
|
|
68
|
+
if ((news.scoped ?? false) !== (olds?.scoped ?? false)) {
|
|
69
|
+
return { action: "replace" };
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}),
|
|
73
|
+
read: Effect.fn(function* ({ output }) {
|
|
74
|
+
if (output === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
const found = yield* observe(output.tokenId);
|
|
77
|
+
if (!found)
|
|
78
|
+
return undefined;
|
|
79
|
+
return { ...output, name: found.name ?? output.name, scoped: found.scoped ?? false };
|
|
80
|
+
}),
|
|
81
|
+
reconcile: Effect.fn(function* ({ id, news, output, session }) {
|
|
82
|
+
const name = yield* objectName(id, news.name);
|
|
83
|
+
const scoped = news.scoped ?? false;
|
|
84
|
+
// Observe: only a token we created (its secret is in state) can be kept.
|
|
85
|
+
const found = output !== undefined ? yield* observe(output.tokenId) : undefined;
|
|
86
|
+
let current;
|
|
87
|
+
if (found && output) {
|
|
88
|
+
current = { ...output, name: found.name ?? output.name };
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// A token under our generated name that state doesn't hold is
|
|
92
|
+
// left from a create that failed before state was saved; its
|
|
93
|
+
// secret is lost, so replace it.
|
|
94
|
+
if (news.name === undefined) {
|
|
95
|
+
const { tokens } = yield* webhook.listWebhookToken({});
|
|
96
|
+
for (const stale of (tokens ?? []).filter((t) => t.name === name)) {
|
|
97
|
+
if (!stale.tokenId)
|
|
98
|
+
continue;
|
|
99
|
+
yield* webhook
|
|
100
|
+
.deleteWebhookToken({ tokenId: stale.tokenId })
|
|
101
|
+
.pipe(Effect.catchTag("WebhookTokenNotFound", () => Effect.void));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Ensure
|
|
105
|
+
yield* session.note(`Creating webhook token ${name}...`);
|
|
106
|
+
const created = yield* webhook.createWebhookToken({ name, scoped });
|
|
107
|
+
if (!created.tokenId || created.tokenSecret === undefined) {
|
|
108
|
+
return yield* new WebhookTokenUnexpectedResponse({
|
|
109
|
+
message: `Modal returned no token for ${name}`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
current = {
|
|
113
|
+
tokenId: created.tokenId,
|
|
114
|
+
tokenSecret: Redacted.isRedacted(created.tokenSecret)
|
|
115
|
+
? created.tokenSecret
|
|
116
|
+
: Redacted.make(created.tokenSecret),
|
|
117
|
+
name,
|
|
118
|
+
scoped,
|
|
119
|
+
environments: [],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Sync the name.
|
|
123
|
+
if (current.name !== name) {
|
|
124
|
+
yield* webhook.updateWebhookToken({ tokenId: current.tokenId, name });
|
|
125
|
+
current = { ...current, name };
|
|
126
|
+
}
|
|
127
|
+
// Sync environments against the observed set.
|
|
128
|
+
if (scoped) {
|
|
129
|
+
// Modal doesn't serve `WebhookTokenEnvironmentList`, so read the
|
|
130
|
+
// token's environments from each environment's token list.
|
|
131
|
+
const { items } = yield* environment.listEnvironment({});
|
|
132
|
+
const observed = new Set();
|
|
133
|
+
for (const env of items ?? []) {
|
|
134
|
+
if (!env.environmentId || !env.name)
|
|
135
|
+
continue;
|
|
136
|
+
// An environment deleted since the list holds no tokens.
|
|
137
|
+
const { tokens } = yield* webhook
|
|
138
|
+
.webhookTokenListForEnvironment({ environmentName: env.name })
|
|
139
|
+
.pipe(Effect.catchTag("EnvironmentNotFound", () => Effect.succeed({ tokens: [] })));
|
|
140
|
+
if ((tokens ?? []).some((token) => token.tokenId === current.tokenId)) {
|
|
141
|
+
observed.add(env.environmentId);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const desired = new Set((news.environments ?? []).flatMap((env) => typeof env === "string"
|
|
145
|
+
? [env]
|
|
146
|
+
: typeof env === "object" && env !== null && "environmentId" in env
|
|
147
|
+
? [env.environmentId]
|
|
148
|
+
: []));
|
|
149
|
+
for (const environmentId of desired) {
|
|
150
|
+
if (!observed.has(environmentId)) {
|
|
151
|
+
yield* webhook.addWebhookTokenEnvironment({
|
|
152
|
+
tokenId: current.tokenId,
|
|
153
|
+
environmentId,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const environmentId of observed) {
|
|
158
|
+
if (!desired.has(environmentId)) {
|
|
159
|
+
yield* webhook.removeWebhookTokenEnvironment({
|
|
160
|
+
tokenId: current.tokenId,
|
|
161
|
+
environmentId,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
current = { ...current, environments: [...desired] };
|
|
166
|
+
}
|
|
167
|
+
return current;
|
|
168
|
+
}),
|
|
169
|
+
delete: Effect.fn(function* ({ output }) {
|
|
170
|
+
yield* webhook
|
|
171
|
+
.deleteWebhookToken({ tokenId: output.tokenId })
|
|
172
|
+
.pipe(Effect.catchTag("WebhookTokenNotFound", () => Effect.void));
|
|
173
|
+
}),
|
|
174
|
+
};
|
|
175
|
+
}));
|
|
176
|
+
//# sourceMappingURL=WebhookToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookToken.js","sources":["../src/WebhookToken.ts"],"names":[],"mappings":"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"}
|