@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,230 @@
|
|
|
1
|
+
import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
|
|
2
|
+
import * as app from "@distilled.cloud/modal/app";
|
|
3
|
+
import * as mount from "@distilled.cloud/modal/mount";
|
|
4
|
+
import * as workspace from "@distilled.cloud/modal/workspace";
|
|
5
|
+
import { mountInstallLines } from "alchemy/Mount";
|
|
6
|
+
import { sha256, sha256Object } from "alchemy/Util/sha256";
|
|
7
|
+
import * as Data from "effect/Data";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Semaphore from "effect/Semaphore";
|
|
10
|
+
import { buildImage, ImageBuildOps } from "../ImageBuild.js";
|
|
11
|
+
import { checkCommands, lowerPlan, MODAL_CAPABILITIES } from "../ImagePlan.js";
|
|
12
|
+
import { checkModalMounts } from "../Mounts.js";
|
|
13
|
+
import { ENTRYPOINT_PATH, ENTRYPOINT_SOURCE } from "./Entrypoint.js";
|
|
14
|
+
/*
|
|
15
|
+
* Deploy-time plumbing shared by `Modal.Function` and `Modal.Server`: the
|
|
16
|
+
* Python layer and mounts every Modal Function container needs, and
|
|
17
|
+
* publishing a function into its App.
|
|
18
|
+
*/
|
|
19
|
+
/** Modal returned a response without a field the deploy needs. */
|
|
20
|
+
export class ModalDeployUnexpectedResponse extends Data.TaggedError("Modal.DeployUnexpectedResponse") {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The Modal Python client whose container entrypoint runs the function.
|
|
24
|
+
* Modal publishes it as the global mount `modal-client-mount-<version>`.
|
|
25
|
+
*/
|
|
26
|
+
export const MODAL_CLIENT_VERSION = "1.6.3";
|
|
27
|
+
/** Standalone Python builds Modal publishes as global mounts, by image builder version. */
|
|
28
|
+
const PYTHON_STANDALONE = {
|
|
29
|
+
"2026.10": {
|
|
30
|
+
"3.11": ["20261021", "3.11.17"],
|
|
31
|
+
"3.12": ["20261021", "3.12.15"],
|
|
32
|
+
"3.13": ["20261021", "3.13.17"],
|
|
33
|
+
"3.14": ["20261021", "3.14.9"],
|
|
34
|
+
},
|
|
35
|
+
"2025.06": {
|
|
36
|
+
"3.11": ["20230826", "3.11.5"],
|
|
37
|
+
"3.12": ["20240107", "3.12.1"],
|
|
38
|
+
"3.13": ["20241008", "3.13.0"],
|
|
39
|
+
"3.14": ["20251205", "3.14.2"],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
/** The Python version added to a base image without one. */
|
|
43
|
+
export const DEFAULT_PYTHON = "3.12";
|
|
44
|
+
/** Port the program listens on when the resource doesn't set one. */
|
|
45
|
+
export const DEFAULT_PORT = 8000;
|
|
46
|
+
const lookupMount = (deploymentName) => Effect.gen(function* () {
|
|
47
|
+
const { mountId } = yield* mount.mountGetOrCreate({
|
|
48
|
+
deploymentName,
|
|
49
|
+
namespace: "DEPLOYMENT_NAMESPACE_GLOBAL",
|
|
50
|
+
objectCreationType: "OBJECT_CREATION_TYPE_UNSPECIFIED",
|
|
51
|
+
});
|
|
52
|
+
if (!mountId) {
|
|
53
|
+
return yield* new ModalDeployUnexpectedResponse({
|
|
54
|
+
message: `Modal returned no id for mount ${deploymentName}`,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return mountId;
|
|
58
|
+
});
|
|
59
|
+
/** The mount holding Modal's Python client, which runs the container entrypoint. */
|
|
60
|
+
export const clientMount = /*@__PURE__*/ lookupMount(`modal-client-mount-${MODAL_CLIENT_VERSION}`);
|
|
61
|
+
/**
|
|
62
|
+
* The image builder version builds use: the resource's pin, else the
|
|
63
|
+
* workspace's setting.
|
|
64
|
+
*/
|
|
65
|
+
const builderVersionOf = Effect.fn(function* (pinned) {
|
|
66
|
+
if (pinned !== undefined)
|
|
67
|
+
return pinned;
|
|
68
|
+
const settings = yield* workspace.workspaceSettings({});
|
|
69
|
+
return settings.imageBuilderVersion ?? "2025.06";
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* Upload {@link ENTRYPOINT_SOURCE} as a mount owned by the app. Modal stores
|
|
73
|
+
* files by content hash, so redeploys reuse it.
|
|
74
|
+
*/
|
|
75
|
+
export const entrypointMount = Effect.fn(function* (appId) {
|
|
76
|
+
const bytes = new TextEncoder().encode(ENTRYPOINT_SOURCE);
|
|
77
|
+
const hash = yield* sha256(bytes);
|
|
78
|
+
const data = yield* Effect.sync(() => Buffer.from(bytes).toString("base64"));
|
|
79
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
80
|
+
const { exists } = yield* mount.mountPutFile({ sha256Hex: hash, data });
|
|
81
|
+
if (exists)
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
const { mountId } = yield* mount.mountGetOrCreate({
|
|
85
|
+
objectCreationType: "OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP",
|
|
86
|
+
appId,
|
|
87
|
+
files: [
|
|
88
|
+
{ filename: ENTRYPOINT_PATH, sha256Hex: hash, size: String(bytes.length), mode: 0o100644 },
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
if (!mountId) {
|
|
92
|
+
return yield* new ModalDeployUnexpectedResponse({
|
|
93
|
+
message: "Modal returned no id for the entrypoint mount",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return mountId;
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* Plan a runtime's image with the shared BuildPlan: the bundled program on
|
|
100
|
+
* its base image, without the image's `ENTRYPOINT`/`CMD` (Modal starts the
|
|
101
|
+
* container with its own Python entrypoint, which then runs the program).
|
|
102
|
+
*/
|
|
103
|
+
export const planRuntimeImage = Effect.fn(function* (target, input, port, bootstrap, capabilities = []) {
|
|
104
|
+
yield* checkModalMounts(target, capabilities);
|
|
105
|
+
const plan = yield* BuildPlan.plan({ main: input.main, image: input.image, handler: input.handler, build: input.build }, {
|
|
106
|
+
capabilities: { ...MODAL_CAPABILITIES, target },
|
|
107
|
+
port,
|
|
108
|
+
bootstrap,
|
|
109
|
+
install: mountInstallLines(capabilities),
|
|
110
|
+
});
|
|
111
|
+
const extra = yield* checkCommands(input.commands ?? []);
|
|
112
|
+
const lowered = yield* lowerPlan(plan, extra);
|
|
113
|
+
const command = [...(BuildPlan.startCommand(plan) ?? [])];
|
|
114
|
+
// Lines after `FROM`, minus the start instruction, run on top of the Python layer.
|
|
115
|
+
const commands = lowered.commands
|
|
116
|
+
.slice(1)
|
|
117
|
+
.filter((line) => !/^\s*(ENTRYPOINT|CMD)\b/i.test(line));
|
|
118
|
+
const python = input.python === undefined ? DEFAULT_PYTHON : input.python;
|
|
119
|
+
const hash = yield* sha256Object({
|
|
120
|
+
plan: plan.hash,
|
|
121
|
+
extra,
|
|
122
|
+
python,
|
|
123
|
+
builder: input.builderVersion,
|
|
124
|
+
gpu: input.gpu,
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
plan,
|
|
128
|
+
command,
|
|
129
|
+
hash,
|
|
130
|
+
warnings: plan.warnings,
|
|
131
|
+
spec: { ...lowered, commands: [...commands, "ENTRYPOINT []"] },
|
|
132
|
+
python,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
/**
|
|
136
|
+
* Build a runtime's image: the base, a layer adding standalone Python
|
|
137
|
+
* (unless `python: false`), then the program.
|
|
138
|
+
*/
|
|
139
|
+
export const buildRuntimeImage = Effect.fn(function* (appId, planned, options) {
|
|
140
|
+
const builderVersion = yield* builderVersionOf(options.builderVersion);
|
|
141
|
+
const buildOps = yield* ImageBuildOps;
|
|
142
|
+
let baseImageId;
|
|
143
|
+
if (planned.python !== false) {
|
|
144
|
+
const table = builderVersion >= "2026.10" || builderVersion === "PREVIEW"
|
|
145
|
+
? PYTHON_STANDALONE["2026.10"]
|
|
146
|
+
: PYTHON_STANDALONE["2025.06"];
|
|
147
|
+
const release = table[planned.python];
|
|
148
|
+
if (release === undefined) {
|
|
149
|
+
return yield* new ModalDeployUnexpectedResponse({
|
|
150
|
+
message: `Python ${planned.python} isn't available for image builder ${builderVersion}; use one of ${Object.keys(table).join(", ")}`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const contextMountId = yield* lookupMount(`python-build-standalone.${release[0]}.${release[1]}-gnu`);
|
|
154
|
+
baseImageId = yield* buildImage(buildOps, appId, {
|
|
155
|
+
dockerTag: planned.plan.base,
|
|
156
|
+
commands: [
|
|
157
|
+
"COPY /python/. /usr/local",
|
|
158
|
+
"ENV TERMINFO_DIRS=/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo",
|
|
159
|
+
],
|
|
160
|
+
contextMountId,
|
|
161
|
+
registry: undefined,
|
|
162
|
+
builderVersion,
|
|
163
|
+
}, { note: options.note });
|
|
164
|
+
}
|
|
165
|
+
return yield* buildImage(buildOps, appId, {
|
|
166
|
+
...planned.spec,
|
|
167
|
+
...(baseImageId !== undefined ? { baseImageId } : { dockerTag: planned.plan.base }),
|
|
168
|
+
gpu: options.gpu,
|
|
169
|
+
builderVersion,
|
|
170
|
+
}, { note: options.note });
|
|
171
|
+
});
|
|
172
|
+
/** Serializes publishes per App: each publish replaces the App's whole function map. */
|
|
173
|
+
const appLocks = /*@__PURE__*/ new Map();
|
|
174
|
+
const lockFor = (appId) => {
|
|
175
|
+
let lock = appLocks.get(appId);
|
|
176
|
+
if (lock === undefined) {
|
|
177
|
+
lock = Semaphore.makeUnsafe(1);
|
|
178
|
+
appLocks.set(appId, lock);
|
|
179
|
+
}
|
|
180
|
+
return lock;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Publish the App with `tag` pointing at `created` (or removed, when
|
|
184
|
+
* `created` is `undefined`), keeping every other function and class the
|
|
185
|
+
* App serves. Modal deploys an App as a whole, so a publish carries the full
|
|
186
|
+
* map read back from the App's current layout.
|
|
187
|
+
*
|
|
188
|
+
* A class function (one with a `classId`) is published as Modal's clients
|
|
189
|
+
* publish `@app.cls`: its service function under `<tag>.*` and its class
|
|
190
|
+
* under `<tag>`, where its containers look the class up.
|
|
191
|
+
*/
|
|
192
|
+
/** The service function name of the class `tag`, as Modal's clients name it. */
|
|
193
|
+
export const classTag = (tag) => `${tag}.*`;
|
|
194
|
+
export const publishFunction = (target, tag, created) => Semaphore.withPermits(lockFor(target.appId), 1)(Effect.gen(function* () {
|
|
195
|
+
const { appLayout } = yield* app.appGetLayout({ appId: target.appId });
|
|
196
|
+
const functionIds = {};
|
|
197
|
+
for (const [key, value] of Object.entries(appLayout?.functionIds ?? {})) {
|
|
198
|
+
if (value !== undefined && key !== tag && key !== classTag(tag))
|
|
199
|
+
functionIds[key] = value;
|
|
200
|
+
}
|
|
201
|
+
if (created !== undefined) {
|
|
202
|
+
functionIds[created.classId ? classTag(tag) : tag] = created.functionId;
|
|
203
|
+
}
|
|
204
|
+
const classIds = {};
|
|
205
|
+
for (const [key, value] of Object.entries(appLayout?.classIds ?? {})) {
|
|
206
|
+
if (value !== undefined && key !== tag)
|
|
207
|
+
classIds[key] = value;
|
|
208
|
+
}
|
|
209
|
+
if (created?.classId)
|
|
210
|
+
classIds[tag] = created.classId;
|
|
211
|
+
const published = new Set(Object.values(functionIds));
|
|
212
|
+
const definitionIds = {};
|
|
213
|
+
for (const object of appLayout?.objects ?? []) {
|
|
214
|
+
const definitionId = object.functionHandleMetadata?.definitionId;
|
|
215
|
+
if (object.objectId && definitionId && published.has(object.objectId)) {
|
|
216
|
+
definitionIds[object.objectId] = definitionId;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (created?.definitionId)
|
|
220
|
+
definitionIds[created.functionId] = created.definitionId;
|
|
221
|
+
return yield* app.publishApp({
|
|
222
|
+
appId: target.appId,
|
|
223
|
+
name: target.appName,
|
|
224
|
+
appState: "APP_STATE_DEPLOYED",
|
|
225
|
+
functionIds,
|
|
226
|
+
classIds,
|
|
227
|
+
definitionIds,
|
|
228
|
+
});
|
|
229
|
+
}));
|
|
230
|
+
//# sourceMappingURL=Deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Deploy.js","sources":["../../src/internal/Deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Python module a `Modal.Function` or `Modal.Server` container imports.
|
|
3
|
+
*
|
|
4
|
+
* Modal boots every Function container with its Python entrypoint, which
|
|
5
|
+
* imports the function's module and looks the function up by name. This
|
|
6
|
+
* module is that function: it starts the bundled program (`ALCHEMY_COMMAND`,
|
|
7
|
+
* from the function's env secret) once per container and hands it work as
|
|
8
|
+
* HTTP on `PORT`:
|
|
9
|
+
*
|
|
10
|
+
* - `Rpc` (a class function) has one method per RPC method of the program
|
|
11
|
+
* (`ALCHEMY_MODAL_RPC_METHODS`, from the function's env secret); a call is
|
|
12
|
+
* sent to the program's `POST /__rpc__/<method>` with the positional
|
|
13
|
+
* arguments as a JSON array and the caller's key (the
|
|
14
|
+
* `__alchemy_rpc_key__` keyword argument) as `x-alchemy-rpc-key`, and
|
|
15
|
+
* returns the JSON result (a value, or an
|
|
16
|
+
* error envelope the caller fails with). A streamed result is read to its
|
|
17
|
+
* end and returned as its list of values;
|
|
18
|
+
* - `call` and `schedule` forward each input as `POST /__modal/call` or
|
|
19
|
+
* `POST /__modal/schedule` with a JSON body `{ "args": [...], "kwargs":
|
|
20
|
+
* {...} }`, and return the JSON response (an async program's calls, and
|
|
21
|
+
* schedule ticks);
|
|
22
|
+
* - `web` (a `WEBHOOK_TYPE_WEB_SERVER` function) starts the program, then
|
|
23
|
+
* Modal proxies its `*.modal.run` URL to `PORT`;
|
|
24
|
+
* - `Server` (`is_server`) starts the program in `@modal.enter`, then Modal
|
|
25
|
+
* routes the Server's URL to `PORT`.
|
|
26
|
+
*
|
|
27
|
+
* It's uploaded as a Mount (`/root/alchemy_modal.py`); the module name and
|
|
28
|
+
* its function names are part of every function definition, so changing
|
|
29
|
+
* them redeploys every function.
|
|
30
|
+
*/
|
|
31
|
+
export declare const ENTRYPOINT_MODULE = "alchemy_modal";
|
|
32
|
+
export declare const ENTRYPOINT_PATH = "/root/alchemy_modal.py";
|
|
33
|
+
/** Function implementations in {@link ENTRYPOINT_SOURCE}. */
|
|
34
|
+
export declare const ENTRYPOINT: {
|
|
35
|
+
readonly call: "call";
|
|
36
|
+
readonly schedule: "schedule";
|
|
37
|
+
readonly web: "web";
|
|
38
|
+
readonly server: "Server";
|
|
39
|
+
readonly rpc: "Rpc";
|
|
40
|
+
};
|
|
41
|
+
/** Env var listing a program's RPC methods (a JSON array), set at plan. */
|
|
42
|
+
export declare const RPC_METHODS_ENV = "ALCHEMY_MODAL_RPC_METHODS";
|
|
43
|
+
/**
|
|
44
|
+
* Env var that turns on the program's `/__rpc__/*` routes. Set only where
|
|
45
|
+
* Modal authenticates every request: a class function's calls and a Server
|
|
46
|
+
* behind proxy auth. A public web endpoint never serves RPC.
|
|
47
|
+
*/
|
|
48
|
+
export declare const RPC_SERVE_ENV = "ALCHEMY_MODAL_SERVE_RPC";
|
|
49
|
+
/** A streamed RPC result, as {@link ENTRYPOINT_SOURCE} returns it: its values in order. */
|
|
50
|
+
export declare const RPC_STREAM_KEY = "~alchemy/modal/rpc-stream";
|
|
51
|
+
export declare const ENTRYPOINT_SOURCE = "\"\"\"Alchemy's entrypoint for a JavaScript program on Modal (generated, do not edit).\"\"\"\n\nimport base64\nimport http.client\nimport json\nimport os\nimport socket\nimport subprocess\nimport threading\nimport time\n\nimport modal\n\n_PORT = int(os.environ.get(\"PORT\", \"8000\"))\n_lock = threading.Lock()\n_process = None\n\n\ndef _start():\n global _process\n with _lock:\n if _process is None or _process.poll() is not None:\n _process = subprocess.Popen(json.loads(os.environ[\"ALCHEMY_COMMAND\"]))\n return _process\n\n\ndef _wait_until_listening(process, timeout=600.0):\n deadline = time.monotonic() + timeout\n while time.monotonic() < deadline:\n if process.poll() is not None:\n raise RuntimeError(f\"The program exited with code {process.returncode} before listening on port {_PORT}\")\n try:\n socket.create_connection((\"127.0.0.1\", _PORT), timeout=1).close()\n return\n except OSError:\n time.sleep(0.05)\n raise TimeoutError(f\"The program didn't listen on port {_PORT} within {timeout:.0f} seconds\")\n\n\ndef _json_default(value):\n if isinstance(value, (bytes, bytearray, memoryview)):\n return base64.b64encode(bytes(value)).decode(\"ascii\")\n raise TypeError(f\"{type(value).__name__} isn't JSON-serializable\")\n\n\ndef _forward(path, args, kwargs):\n _wait_until_listening(_start())\n body = json.dumps({\"args\": list(args), \"kwargs\": kwargs}, default=_json_default).encode()\n headers = {\"content-type\": \"application/json\"}\n try:\n call_id = modal.current_function_call_id()\n if call_id:\n headers[\"x-modal-function-call-id\"] = call_id\n except Exception:\n pass\n connection = http.client.HTTPConnection(\"127.0.0.1\", _PORT)\n try:\n connection.request(\"POST\", path, body=body, headers=headers)\n response = connection.getresponse()\n data = response.read()\n finally:\n connection.close()\n if response.status >= 400:\n raise RuntimeError(f\"{path} returned {response.status}: {data.decode(errors='replace')}\")\n if not data:\n return None\n if response.getheader(\"content-type\", \"\").startswith(\"application/json\"):\n return json.loads(data)\n return data.decode(errors=\"replace\")\n\n\ndef _post(path, body, headers=None):\n _wait_until_listening(_start())\n connection = http.client.HTTPConnection(\"127.0.0.1\", _PORT)\n try:\n connection.request(\"POST\", path, body=body, headers={\"content-type\": \"application/json\", **(headers or {})})\n response = connection.getresponse()\n return response, response.read()\n finally:\n connection.close()\n\n\ndef _rpc(name):\n def method(self, *args, **kwargs):\n key = kwargs.pop(\"__alchemy_rpc_key__\", None)\n if kwargs:\n raise TypeError(f\"RPC method {name} takes positional arguments only\")\n body = json.dumps(list(args), default=_json_default).encode()\n headers = {\"x-alchemy-rpc-key\": key} if isinstance(key, str) else {}\n response, data = _post(\"/__rpc__/\" + name, body, headers)\n if response.status >= 400:\n raise RuntimeError(f\"RPC method {name} returned {response.status}: {data.decode(errors='replace')}\")\n if response.getheader(\"x-alchemy-rpc-stream\") is not None:\n lines = [json.loads(line) for line in data.decode().splitlines() if line]\n return {\"~alchemy/modal/rpc-stream\": lines}\n return json.loads(data) if data else None\n\n method.__name__ = name\n return modal.method()(method)\n\n\ndef _rpc_enter(self):\n _wait_until_listening(_start())\n\n\nRpc = type(\n \"Rpc\",\n (),\n {\n \"start\": modal.enter()(_rpc_enter),\n **{name: _rpc(name) for name in json.loads(os.environ.get(\"ALCHEMY_MODAL_RPC_METHODS\") or \"[]\")},\n },\n)\n\n\ndef call(*args, **kwargs):\n return _forward(\"/__modal/call\", args, kwargs)\n\n\ndef schedule(*args, **kwargs):\n return _forward(\"/__modal/schedule\", args, kwargs)\n\n\ndef web():\n _start()\n\n\nclass Server:\n @modal.enter()\n def start(self):\n _wait_until_listening(_start())\n\n @modal.exit()\n def stop(self):\n process = _process\n if process is not None and process.poll() is None:\n process.terminate()\n try:\n process.wait(timeout=20)\n except subprocess.TimeoutExpired:\n process.kill()\n";
|
|
52
|
+
//# sourceMappingURL=Entrypoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Entrypoint.d.ts","sources":["../../src/internal/Entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,eAAO,MAAM,eAAe,2BAAkC,CAAC;AAE/D,6DAA6D;AAC7D,eAAO,MAAM,UAAU;aACrB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,UAAU;aACpB,GAAG,EAAE,KAAK;aACV,MAAM,EAAE,QAAQ;aAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD,2FAA2F;AAC3F,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAE1D,eAAO,MAAM,iBAAiB,ggJA6I7B,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Python module a `Modal.Function` or `Modal.Server` container imports.
|
|
3
|
+
*
|
|
4
|
+
* Modal boots every Function container with its Python entrypoint, which
|
|
5
|
+
* imports the function's module and looks the function up by name. This
|
|
6
|
+
* module is that function: it starts the bundled program (`ALCHEMY_COMMAND`,
|
|
7
|
+
* from the function's env secret) once per container and hands it work as
|
|
8
|
+
* HTTP on `PORT`:
|
|
9
|
+
*
|
|
10
|
+
* - `Rpc` (a class function) has one method per RPC method of the program
|
|
11
|
+
* (`ALCHEMY_MODAL_RPC_METHODS`, from the function's env secret); a call is
|
|
12
|
+
* sent to the program's `POST /__rpc__/<method>` with the positional
|
|
13
|
+
* arguments as a JSON array and the caller's key (the
|
|
14
|
+
* `__alchemy_rpc_key__` keyword argument) as `x-alchemy-rpc-key`, and
|
|
15
|
+
* returns the JSON result (a value, or an
|
|
16
|
+
* error envelope the caller fails with). A streamed result is read to its
|
|
17
|
+
* end and returned as its list of values;
|
|
18
|
+
* - `call` and `schedule` forward each input as `POST /__modal/call` or
|
|
19
|
+
* `POST /__modal/schedule` with a JSON body `{ "args": [...], "kwargs":
|
|
20
|
+
* {...} }`, and return the JSON response (an async program's calls, and
|
|
21
|
+
* schedule ticks);
|
|
22
|
+
* - `web` (a `WEBHOOK_TYPE_WEB_SERVER` function) starts the program, then
|
|
23
|
+
* Modal proxies its `*.modal.run` URL to `PORT`;
|
|
24
|
+
* - `Server` (`is_server`) starts the program in `@modal.enter`, then Modal
|
|
25
|
+
* routes the Server's URL to `PORT`.
|
|
26
|
+
*
|
|
27
|
+
* It's uploaded as a Mount (`/root/alchemy_modal.py`); the module name and
|
|
28
|
+
* its function names are part of every function definition, so changing
|
|
29
|
+
* them redeploys every function.
|
|
30
|
+
*/
|
|
31
|
+
export const ENTRYPOINT_MODULE = "alchemy_modal";
|
|
32
|
+
export const ENTRYPOINT_PATH = `/root/${ENTRYPOINT_MODULE}.py`;
|
|
33
|
+
/** Function implementations in {@link ENTRYPOINT_SOURCE}. */
|
|
34
|
+
export const ENTRYPOINT = {
|
|
35
|
+
call: "call",
|
|
36
|
+
schedule: "schedule",
|
|
37
|
+
web: "web",
|
|
38
|
+
server: "Server",
|
|
39
|
+
rpc: "Rpc",
|
|
40
|
+
};
|
|
41
|
+
/** Env var listing a program's RPC methods (a JSON array), set at plan. */
|
|
42
|
+
export const RPC_METHODS_ENV = "ALCHEMY_MODAL_RPC_METHODS";
|
|
43
|
+
/**
|
|
44
|
+
* Env var that turns on the program's `/__rpc__/*` routes. Set only where
|
|
45
|
+
* Modal authenticates every request: a class function's calls and a Server
|
|
46
|
+
* behind proxy auth. A public web endpoint never serves RPC.
|
|
47
|
+
*/
|
|
48
|
+
export const RPC_SERVE_ENV = "ALCHEMY_MODAL_SERVE_RPC";
|
|
49
|
+
/** A streamed RPC result, as {@link ENTRYPOINT_SOURCE} returns it: its values in order. */
|
|
50
|
+
export const RPC_STREAM_KEY = "~alchemy/modal/rpc-stream";
|
|
51
|
+
export const ENTRYPOINT_SOURCE = `"""Alchemy's entrypoint for a JavaScript program on Modal (generated, do not edit)."""
|
|
52
|
+
|
|
53
|
+
import base64
|
|
54
|
+
import http.client
|
|
55
|
+
import json
|
|
56
|
+
import os
|
|
57
|
+
import socket
|
|
58
|
+
import subprocess
|
|
59
|
+
import threading
|
|
60
|
+
import time
|
|
61
|
+
|
|
62
|
+
import modal
|
|
63
|
+
|
|
64
|
+
_PORT = int(os.environ.get("PORT", "8000"))
|
|
65
|
+
_lock = threading.Lock()
|
|
66
|
+
_process = None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _start():
|
|
70
|
+
global _process
|
|
71
|
+
with _lock:
|
|
72
|
+
if _process is None or _process.poll() is not None:
|
|
73
|
+
_process = subprocess.Popen(json.loads(os.environ["ALCHEMY_COMMAND"]))
|
|
74
|
+
return _process
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _wait_until_listening(process, timeout=600.0):
|
|
78
|
+
deadline = time.monotonic() + timeout
|
|
79
|
+
while time.monotonic() < deadline:
|
|
80
|
+
if process.poll() is not None:
|
|
81
|
+
raise RuntimeError(f"The program exited with code {process.returncode} before listening on port {_PORT}")
|
|
82
|
+
try:
|
|
83
|
+
socket.create_connection(("127.0.0.1", _PORT), timeout=1).close()
|
|
84
|
+
return
|
|
85
|
+
except OSError:
|
|
86
|
+
time.sleep(0.05)
|
|
87
|
+
raise TimeoutError(f"The program didn't listen on port {_PORT} within {timeout:.0f} seconds")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _json_default(value):
|
|
91
|
+
if isinstance(value, (bytes, bytearray, memoryview)):
|
|
92
|
+
return base64.b64encode(bytes(value)).decode("ascii")
|
|
93
|
+
raise TypeError(f"{type(value).__name__} isn't JSON-serializable")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _forward(path, args, kwargs):
|
|
97
|
+
_wait_until_listening(_start())
|
|
98
|
+
body = json.dumps({"args": list(args), "kwargs": kwargs}, default=_json_default).encode()
|
|
99
|
+
headers = {"content-type": "application/json"}
|
|
100
|
+
try:
|
|
101
|
+
call_id = modal.current_function_call_id()
|
|
102
|
+
if call_id:
|
|
103
|
+
headers["x-modal-function-call-id"] = call_id
|
|
104
|
+
except Exception:
|
|
105
|
+
pass
|
|
106
|
+
connection = http.client.HTTPConnection("127.0.0.1", _PORT)
|
|
107
|
+
try:
|
|
108
|
+
connection.request("POST", path, body=body, headers=headers)
|
|
109
|
+
response = connection.getresponse()
|
|
110
|
+
data = response.read()
|
|
111
|
+
finally:
|
|
112
|
+
connection.close()
|
|
113
|
+
if response.status >= 400:
|
|
114
|
+
raise RuntimeError(f"{path} returned {response.status}: {data.decode(errors='replace')}")
|
|
115
|
+
if not data:
|
|
116
|
+
return None
|
|
117
|
+
if response.getheader("content-type", "").startswith("application/json"):
|
|
118
|
+
return json.loads(data)
|
|
119
|
+
return data.decode(errors="replace")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _post(path, body, headers=None):
|
|
123
|
+
_wait_until_listening(_start())
|
|
124
|
+
connection = http.client.HTTPConnection("127.0.0.1", _PORT)
|
|
125
|
+
try:
|
|
126
|
+
connection.request("POST", path, body=body, headers={"content-type": "application/json", **(headers or {})})
|
|
127
|
+
response = connection.getresponse()
|
|
128
|
+
return response, response.read()
|
|
129
|
+
finally:
|
|
130
|
+
connection.close()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _rpc(name):
|
|
134
|
+
def method(self, *args, **kwargs):
|
|
135
|
+
key = kwargs.pop("__alchemy_rpc_key__", None)
|
|
136
|
+
if kwargs:
|
|
137
|
+
raise TypeError(f"RPC method {name} takes positional arguments only")
|
|
138
|
+
body = json.dumps(list(args), default=_json_default).encode()
|
|
139
|
+
headers = {"x-alchemy-rpc-key": key} if isinstance(key, str) else {}
|
|
140
|
+
response, data = _post("/__rpc__/" + name, body, headers)
|
|
141
|
+
if response.status >= 400:
|
|
142
|
+
raise RuntimeError(f"RPC method {name} returned {response.status}: {data.decode(errors='replace')}")
|
|
143
|
+
if response.getheader("x-alchemy-rpc-stream") is not None:
|
|
144
|
+
lines = [json.loads(line) for line in data.decode().splitlines() if line]
|
|
145
|
+
return {"~alchemy/modal/rpc-stream": lines}
|
|
146
|
+
return json.loads(data) if data else None
|
|
147
|
+
|
|
148
|
+
method.__name__ = name
|
|
149
|
+
return modal.method()(method)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _rpc_enter(self):
|
|
153
|
+
_wait_until_listening(_start())
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
Rpc = type(
|
|
157
|
+
"Rpc",
|
|
158
|
+
(),
|
|
159
|
+
{
|
|
160
|
+
"start": modal.enter()(_rpc_enter),
|
|
161
|
+
**{name: _rpc(name) for name in json.loads(os.environ.get("ALCHEMY_MODAL_RPC_METHODS") or "[]")},
|
|
162
|
+
},
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def call(*args, **kwargs):
|
|
167
|
+
return _forward("/__modal/call", args, kwargs)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def schedule(*args, **kwargs):
|
|
171
|
+
return _forward("/__modal/schedule", args, kwargs)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def web():
|
|
175
|
+
_start()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class Server:
|
|
179
|
+
@modal.enter()
|
|
180
|
+
def start(self):
|
|
181
|
+
_wait_until_listening(_start())
|
|
182
|
+
|
|
183
|
+
@modal.exit()
|
|
184
|
+
def stop(self):
|
|
185
|
+
process = _process
|
|
186
|
+
if process is not None and process.poll() is None:
|
|
187
|
+
process.terminate()
|
|
188
|
+
try:
|
|
189
|
+
process.wait(timeout=20)
|
|
190
|
+
except subprocess.TimeoutExpired:
|
|
191
|
+
process.kill()
|
|
192
|
+
`;
|
|
193
|
+
//# sourceMappingURL=Entrypoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Entrypoint.js","sources":["../../src/internal/Entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,iBAAiB,KAAK,CAAC;AAE/D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEvD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6IhC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type HostRuntimeContext } from "alchemy/Runtime/Process";
|
|
2
|
+
/** The RPC methods of a program's shape: every function besides `fetch` and `run`. */
|
|
3
|
+
export declare const rpcMethodsOf: (shape: Record<string, unknown> | undefined) => {
|
|
4
|
+
[k: string]: unknown;
|
|
5
|
+
};
|
|
6
|
+
/** The method names a function's env records (see {@link RPC_METHODS_ENV}). */
|
|
7
|
+
export declare const rpcMethodNamesOf: (env: Record<string, unknown> | undefined) => string[];
|
|
8
|
+
/**
|
|
9
|
+
* The runtime context of a `Modal.Function` or `Modal.Server` program. At
|
|
10
|
+
* plan it records the program's RPC methods in its env, so the Function's
|
|
11
|
+
* definition can name them. At run time it serves them on `/__rpc__/*`
|
|
12
|
+
* next to `fetch`, but only where the provider set {@link RPC_SERVE_ENV}
|
|
13
|
+
* (where Modal authenticates every request), and only to callers holding a
|
|
14
|
+
* key a binding issued (see `RpcAuth.ts`).
|
|
15
|
+
*/
|
|
16
|
+
export declare const createModalRuntimeContext: (type: string) => (id: string) => HostRuntimeContext;
|
|
17
|
+
//# sourceMappingURL=Rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rpc.d.ts","sources":["../../src/internal/Rpc.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK5F,sFAAsF;AACtF,eAAO,MAAM,YAAY,UAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;CAKpE,CAAC;AAEJ,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,QAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAG,MAAM,EASjF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,SAC7B,MAAM,UACR,MAAM,KAAG,kBAoBb,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { safeHttpEffect } from "alchemy/Http";
|
|
2
|
+
import * as Output from "alchemy/Output";
|
|
3
|
+
import { serveRpc } from "alchemy/Rpc";
|
|
4
|
+
import { createHostRuntimeContext } from "alchemy/Runtime/Process";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { RPC_METHODS_ENV, RPC_SERVE_ENV } from "./Entrypoint.js";
|
|
7
|
+
import { parseCallers, requireRpcCaller, RPC_CALLERS_ENV } from "./RpcAuth.js";
|
|
8
|
+
/** The RPC methods of a program's shape: every function besides `fetch` and `run`. */
|
|
9
|
+
export const rpcMethodsOf = (shape) => Object.fromEntries(Object.entries(shape ?? {}).filter(([key, value]) => key !== "fetch" && key !== "run" && typeof value === "function"));
|
|
10
|
+
/** The method names a function's env records (see {@link RPC_METHODS_ENV}). */
|
|
11
|
+
export const rpcMethodNamesOf = (env) => {
|
|
12
|
+
const value = env?.[RPC_METHODS_ENV];
|
|
13
|
+
if (typeof value !== "string")
|
|
14
|
+
return [];
|
|
15
|
+
try {
|
|
16
|
+
const names = JSON.parse(value);
|
|
17
|
+
return Array.isArray(names) ? names.filter((name) => typeof name === "string") : [];
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The runtime context of a `Modal.Function` or `Modal.Server` program. At
|
|
25
|
+
* plan it records the program's RPC methods in its env, so the Function's
|
|
26
|
+
* definition can name them. At run time it serves them on `/__rpc__/*`
|
|
27
|
+
* next to `fetch`, but only where the provider set {@link RPC_SERVE_ENV}
|
|
28
|
+
* (where Modal authenticates every request), and only to callers holding a
|
|
29
|
+
* key a binding issued (see `RpcAuth.ts`).
|
|
30
|
+
*/
|
|
31
|
+
export const createModalRuntimeContext = (type) => (id) => {
|
|
32
|
+
const base = createHostRuntimeContext(type)(id);
|
|
33
|
+
const serveBase = base.serve;
|
|
34
|
+
const serve = (handler, options) => Effect.gen(function* () {
|
|
35
|
+
const methods = rpcMethodsOf(options?.shape);
|
|
36
|
+
const names = Object.keys(methods).sort();
|
|
37
|
+
if (!globalThis.__ALCHEMY_RUNTIME__ && names.length > 0) {
|
|
38
|
+
yield* base.set(RPC_METHODS_ENV, Output.literal(names));
|
|
39
|
+
}
|
|
40
|
+
const enabled = (yield* base.get(RPC_SERVE_ENV)) !== undefined;
|
|
41
|
+
if (!enabled || names.length === 0)
|
|
42
|
+
return yield* serveBase(handler, options);
|
|
43
|
+
const fallback = safeHttpEffect(handler);
|
|
44
|
+
const callers = parseCallers(yield* base.get(RPC_CALLERS_ENV));
|
|
45
|
+
return yield* serveBase(requireRpcCaller(callers, serveRpc(methods, fallback), fallback), options);
|
|
46
|
+
});
|
|
47
|
+
return Object.assign(base, { serve });
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=Rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rpc.js","sources":["../../src/internal/Rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { HttpServerRequest } from "effect/http/HttpServerRequest";
|
|
3
|
+
import * as HttpServerResponse from "effect/http/HttpServerResponse";
|
|
4
|
+
/** Env var on the target: the SHA-256 (hex) of each caller's key, as a JSON array. */
|
|
5
|
+
export declare const RPC_CALLERS_ENV = "ALCHEMY_MODAL_RPC_CALLERS";
|
|
6
|
+
/** Request header a Server's RPC call carries its key in. */
|
|
7
|
+
export declare const RPC_KEY_HEADER = "x-alchemy-rpc-key";
|
|
8
|
+
/** Keyword argument a Function's RPC call carries its key in (the entrypoint forwards it as {@link RPC_KEY_HEADER}). */
|
|
9
|
+
export declare const RPC_KEY_KWARG = "__alchemy_rpc_key__";
|
|
10
|
+
/** Env var on the caller holding its key for the target `targetId`. */
|
|
11
|
+
export declare const rpcKeyEnv: (targetId: string) => string;
|
|
12
|
+
/** What a caller's binding attaches to the target. */
|
|
13
|
+
export interface RpcCallerBinding {
|
|
14
|
+
/** SHA-256 (hex) of the caller's key. */
|
|
15
|
+
readonly rpcCallers?: ReadonlyArray<string>;
|
|
16
|
+
}
|
|
17
|
+
/** SHA-256 of `text`, as hex. */
|
|
18
|
+
export declare const sha256Hex: (text: string) => Effect.Effect<string, never, never>;
|
|
19
|
+
/** The caller key hashes a target's bindings recorded, sorted. */
|
|
20
|
+
export declare const rpcCallersOf: (bindings: ReadonlyArray<{
|
|
21
|
+
readonly data: RpcCallerBinding;
|
|
22
|
+
}>) => string[];
|
|
23
|
+
/**
|
|
24
|
+
* The caller half of an RPC binding. Yield it while the binding's layer is
|
|
25
|
+
* built; call the result with the target in the binding. At deploy it mints
|
|
26
|
+
* the key for this caller and target (`<host><target>RpcKey`), binds it into
|
|
27
|
+
* the host's env, and records its hash on the target. At run time it reads
|
|
28
|
+
* the key back, or `undefined` when the caller has none (a script).
|
|
29
|
+
*/
|
|
30
|
+
export declare const RpcCaller: Effect.Effect<(target: {
|
|
31
|
+
readonly LogicalId: string;
|
|
32
|
+
}) => Effect.Effect<Effect.Effect<string | undefined, never, never>, never, never>, never, never>;
|
|
33
|
+
/**
|
|
34
|
+
* Serve `rpc` only to callers whose key's hash is in {@link RPC_CALLERS_ENV};
|
|
35
|
+
* every other request goes to `fallback`. A call without a key, or with one
|
|
36
|
+
* no binding issued, gets `401`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const requireRpcCaller: <A, E, R, A2, E2, R2>(callers: ReadonlySet<string>, rpc: Effect.Effect<A, E, R>, fallback: Effect.Effect<A2, E2, R2>) => Effect.Effect<A | A2 | HttpServerResponse.HttpServerResponse, E | E2, R | R2 | HttpServerRequest>;
|
|
39
|
+
/** The caller key hashes in a target's env (see {@link RPC_CALLERS_ENV}). */
|
|
40
|
+
export declare const parseCallers: (value: unknown) => ReadonlySet<string>;
|
|
41
|
+
//# sourceMappingURL=RpcAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcAuth.d.ts","sources":["../../src/internal/RpcAuth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,kBAAkB,MAAM,gCAAgC,CAAC;AAYrE,sFAAsF;AACtF,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,6DAA6D;AAC7D,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,wHAAwH;AACxH,eAAO,MAAM,aAAa,wBAAwB,CAAC;AAEnD,uEAAuE;AACvE,eAAO,MAAM,SAAS,aAAc,MAAM,WAAqD,CAAC;AAEhG,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,iCAAiC;AACjC,eAAO,MAAM,SAAS,SAAU,MAAM,wCAKnC,CAAC;AAEJ,kEAAkE;AAClE,eAAO,MAAM,YAAY,aACb,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,KAC3D,MAAM,EAAuF,CAAC;AAOjG;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;wBAGsC,MAAM;iGA8BhE,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WACzC,WAAW,CAAC,MAAM,CAAC,OACvB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YACjB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,sGAYjC,CAAC;AAEL,6EAA6E;AAC7E,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,WAAW,CAAC,MAAM,CAG/D,CAAC"}
|