alchemy 2.0.0-beta.44 → 2.0.0-beta.46
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/bin/exec.js +67 -8
- package/bin/exec.js.map +1 -1
- package/lib/AWS/Lambda/Function.d.ts +17 -0
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +61 -16
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Providers.d.ts +2 -1
- package/lib/AWS/Providers.d.ts.map +1 -1
- package/lib/AWS/Providers.js +3 -1
- package/lib/AWS/Providers.js.map +1 -1
- package/lib/AlchemyContext.d.ts +0 -1
- package/lib/AlchemyContext.d.ts.map +1 -1
- package/lib/AlchemyContext.js.map +1 -1
- package/lib/Apply.js +17 -1
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Auth/AuthProvider.js +24 -6
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/Credentials.d.ts.map +1 -1
- package/lib/Auth/Credentials.js +3 -3
- package/lib/Auth/Credentials.js.map +1 -1
- package/lib/Cli/commands/_shared.d.ts +13 -1
- package/lib/Cli/commands/_shared.d.ts.map +1 -1
- package/lib/Cli/commands/_shared.js +33 -2
- package/lib/Cli/commands/_shared.js.map +1 -1
- package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
- package/lib/Cli/commands/cloudflare.js +5 -1
- package/lib/Cli/commands/cloudflare.js.map +1 -1
- package/lib/Cli/commands/dev.d.ts.map +1 -1
- package/lib/Cli/commands/dev.js +10 -1
- package/lib/Cli/commands/dev.js.map +1 -1
- package/lib/Cli/commands/login.d.ts.map +1 -1
- package/lib/Cli/commands/login.js +19 -5
- package/lib/Cli/commands/login.js.map +1 -1
- package/lib/Cli/commands/profile.d.ts.map +1 -1
- package/lib/Cli/commands/profile.js +7 -27
- package/lib/Cli/commands/profile.js.map +1 -1
- package/lib/Cli/main.d.ts.map +1 -1
- package/lib/Cli/main.js +0 -2
- package/lib/Cli/main.js.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts +0 -2
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.js +2 -4
- package/lib/Cloudflare/AiGateway/AiGateway.js.map +1 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts +116 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts.map +1 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.js +92 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.js.map +1 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts +55 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts.map +1 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js +55 -0
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js.map +1 -0
- package/lib/Cloudflare/BrowserRendering/index.d.ts +3 -0
- package/lib/Cloudflare/BrowserRendering/index.d.ts.map +1 -0
- package/lib/Cloudflare/BrowserRendering/index.js +3 -0
- package/lib/Cloudflare/BrowserRendering/index.js.map +1 -0
- package/lib/Cloudflare/Container/Container.d.ts +3 -3
- package/lib/Cloudflare/Container/Container.js +3 -3
- package/lib/Cloudflare/Container/StartContainer.d.ts.map +1 -1
- package/lib/Cloudflare/Container/StartContainer.js.map +1 -1
- package/lib/Cloudflare/D1/D1Database.d.ts +1 -0
- package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.js +2 -1
- package/lib/Cloudflare/D1/D1Database.js.map +1 -1
- package/lib/Cloudflare/D1/D1DatabaseBinding.js +1 -1
- package/lib/Cloudflare/D1/D1DatabaseBinding.js.map +1 -1
- package/lib/Cloudflare/Fetcher.d.ts.map +1 -1
- package/lib/Cloudflare/Fetcher.js +0 -2
- package/lib/Cloudflare/Fetcher.js.map +1 -1
- package/lib/Cloudflare/Hyperdrive/Hyperdrive.d.ts +1 -0
- package/lib/Cloudflare/Hyperdrive/Hyperdrive.d.ts.map +1 -1
- package/lib/Cloudflare/Hyperdrive/Hyperdrive.js +3 -0
- package/lib/Cloudflare/Hyperdrive/Hyperdrive.js.map +1 -1
- package/lib/Cloudflare/Hyperdrive/HyperdriveBinding.d.ts +3 -2
- package/lib/Cloudflare/Hyperdrive/HyperdriveBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Hyperdrive/HyperdriveBinding.js +32 -33
- package/lib/Cloudflare/Hyperdrive/HyperdriveBinding.js.map +1 -1
- package/lib/Cloudflare/KV/KVNamespace.d.ts +1 -0
- package/lib/Cloudflare/KV/KVNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/KV/KVNamespace.js +2 -0
- package/lib/Cloudflare/KV/KVNamespace.js.map +1 -1
- package/lib/Cloudflare/Local.js +1 -1
- package/lib/Cloudflare/Local.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts +2 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +25 -17
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/Queue/Queue.d.ts +1 -0
- package/lib/Cloudflare/Queue/Queue.d.ts.map +1 -1
- package/lib/Cloudflare/Queue/Queue.js +1 -0
- package/lib/Cloudflare/Queue/Queue.js.map +1 -1
- package/lib/Cloudflare/Queue/QueueConsumer.d.ts +2 -1
- package/lib/Cloudflare/Queue/QueueConsumer.d.ts.map +1 -1
- package/lib/Cloudflare/Queue/QueueConsumer.js +10 -3
- package/lib/Cloudflare/Queue/QueueConsumer.js.map +1 -1
- package/lib/Cloudflare/Queue/QueueEventSource.d.ts +30 -4
- package/lib/Cloudflare/Queue/QueueEventSource.d.ts.map +1 -1
- package/lib/Cloudflare/Queue/QueueEventSource.js +22 -1
- package/lib/Cloudflare/Queue/QueueEventSource.js.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts +1 -0
- package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.js +18 -0
- package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.js +13 -34
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts +3 -2
- package/lib/Cloudflare/SecretsStore/SecretBinding.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/SecretBinding.js +3 -2
- package/lib/Cloudflare/SecretsStore/SecretBinding.js.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +5 -13
- package/lib/Cloudflare/StateStore/Api.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Api.js +14 -8
- package/lib/Cloudflare/StateStore/Api.js.map +1 -1
- package/lib/Cloudflare/StateStore/State.d.ts +11 -65
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/State.js +320 -343
- package/lib/Cloudflare/StateStore/State.js.map +1 -1
- package/lib/Cloudflare/StateStore/Store.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Store.js +21 -31
- package/lib/Cloudflare/StateStore/Store.js.map +1 -1
- package/lib/Cloudflare/Vectorize/VectorizeIndex.d.ts +114 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndex.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js +157 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndexBinding.d.ts +38 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndexBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndexBinding.js +44 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndexBinding.js.map +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeMetadataIndex.d.ts +72 -0
- package/lib/Cloudflare/Vectorize/VectorizeMetadataIndex.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeMetadataIndex.js +131 -0
- package/lib/Cloudflare/Vectorize/VectorizeMetadataIndex.js.map +1 -0
- package/lib/Cloudflare/Vectorize/index.d.ts +4 -0
- package/lib/Cloudflare/Vectorize/index.d.ts.map +1 -0
- package/lib/Cloudflare/Vectorize/index.js +4 -0
- package/lib/Cloudflare/Vectorize/index.js.map +1 -0
- package/lib/Cloudflare/VpcService/VpcService.d.ts +2 -2
- package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
- package/lib/Cloudflare/Website/StaticSite.d.ts +5 -5
- package/lib/Cloudflare/Website/StaticSite.d.ts.map +1 -1
- package/lib/Cloudflare/Website/StaticSite.js +3 -0
- package/lib/Cloudflare/Website/StaticSite.js.map +1 -1
- package/lib/Cloudflare/Website/Vite.d.ts +5 -5
- package/lib/Cloudflare/Website/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Website/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Assets.js +1 -1
- package/lib/Cloudflare/Workers/Assets.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.js +4 -2
- package/lib/Cloudflare/Workers/DurableObjectBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts +183 -6
- package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectNamespace.js +279 -76
- package/lib/Cloudflare/Workers/DurableObjectNamespace.js.map +1 -1
- package/lib/Cloudflare/Workers/HttpServer.d.ts +6 -4
- package/lib/Cloudflare/Workers/HttpServer.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/HttpServer.js +20 -15
- package/lib/Cloudflare/Workers/HttpServer.js.map +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts +3 -2
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +4 -7
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +111 -66
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.d.ts +16 -0
- package/lib/Cloudflare/Workers/Rpc.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.js +22 -0
- package/lib/Cloudflare/Workers/Rpc.js.map +1 -1
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.d.ts +285 -0
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.js +288 -0
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.js.map +1 -0
- package/lib/Cloudflare/Workers/RpcWorker.d.ts +305 -0
- package/lib/Cloudflare/Workers/RpcWorker.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/RpcWorker.js +350 -0
- package/lib/Cloudflare/Workers/RpcWorker.js.map +1 -0
- package/lib/Cloudflare/Workers/Vite.d.ts +1 -1
- package/lib/Cloudflare/Workers/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Vite.js +2 -1
- package/lib/Cloudflare/Workers/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +69 -24
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +168 -47
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +166 -97
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +12 -23
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js +3 -0
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.js +5 -2
- package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.js +4 -1
- package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.js +9 -10
- package/lib/Cloudflare/Workers/WorkerRuntimeContext.js.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.d.ts +5 -3
- package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.js +19 -1
- package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
- package/lib/Cloudflare/Workers/index.d.ts +2 -0
- package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/index.js +2 -0
- package/lib/Cloudflare/Workers/index.js.map +1 -1
- package/lib/Cloudflare/index.d.ts +2 -0
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +2 -0
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Dependencies.d.ts +10 -0
- package/lib/Dependencies.d.ts.map +1 -0
- package/lib/Dependencies.js +1 -0
- package/lib/Dependencies.js.map +1 -0
- package/lib/Deploy.d.ts +2 -1
- package/lib/Deploy.d.ts.map +1 -1
- package/lib/Deploy.js +2 -2
- package/lib/Deploy.js.map +1 -1
- package/lib/Diff.d.ts +11 -0
- package/lib/Diff.d.ts.map +1 -1
- package/lib/Diff.js +11 -0
- package/lib/Diff.js.map +1 -1
- package/lib/Input.d.ts +2 -1
- package/lib/Input.d.ts.map +1 -1
- package/lib/KeyPair.d.ts +77 -0
- package/lib/KeyPair.d.ts.map +1 -0
- package/lib/KeyPair.js +102 -0
- package/lib/KeyPair.js.map +1 -0
- package/lib/Local/RpcProvider.d.ts +3 -1
- package/lib/Local/RpcProvider.d.ts.map +1 -1
- package/lib/Local/RpcProvider.js +28 -2
- package/lib/Local/RpcProvider.js.map +1 -1
- package/lib/Local/RpcServerEnvironment.js +1 -1
- package/lib/Local/RpcServerEnvironment.js.map +1 -1
- package/lib/Neon/Project.d.ts.map +1 -1
- package/lib/Neon/Project.js +14 -3
- package/lib/Neon/Project.js.map +1 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +9 -2
- package/lib/Output.js.map +1 -1
- package/lib/Phase.d.ts +2 -1
- package/lib/Phase.d.ts.map +1 -1
- package/lib/Phase.js +6 -1
- package/lib/Phase.js.map +1 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +14 -3
- package/lib/Plan.js.map +1 -1
- package/lib/Platform.d.ts +8 -6
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +33 -3
- package/lib/Platform.js.map +1 -1
- package/lib/Random.d.ts.map +1 -1
- package/lib/Random.js +9 -14
- package/lib/Random.js.map +1 -1
- package/lib/RuntimeContext.d.ts +21 -1
- package/lib/RuntimeContext.d.ts.map +1 -1
- package/lib/RuntimeContext.js +12 -0
- package/lib/RuntimeContext.js.map +1 -1
- package/lib/Stack.d.ts +3 -3
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js.map +1 -1
- package/lib/State/HttpStateApi.d.ts +2 -2
- package/lib/State/HttpStateStore.d.ts +4 -0
- package/lib/State/HttpStateStore.d.ts.map +1 -1
- package/lib/State/HttpStateStore.js +13 -0
- package/lib/State/HttpStateStore.js.map +1 -1
- package/lib/State/StateEncoding.d.ts +8 -0
- package/lib/State/StateEncoding.d.ts.map +1 -1
- package/lib/State/StateEncoding.js +55 -5
- package/lib/State/StateEncoding.js.map +1 -1
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +0 -2
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +0 -2
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Util/Duration.d.ts +14 -0
- package/lib/Util/Duration.d.ts.map +1 -0
- package/lib/Util/Duration.js +18 -0
- package/lib/Util/Duration.js.map +1 -0
- package/lib/Util/index.d.ts +0 -6
- package/lib/Util/index.d.ts.map +1 -1
- package/lib/Util/index.js +0 -6
- package/lib/Util/index.js.map +1 -1
- package/lib/Util/poll.d.ts +30 -0
- package/lib/Util/poll.d.ts.map +1 -0
- package/lib/Util/poll.js +26 -0
- package/lib/Util/poll.js.map +1 -0
- package/lib/Util/types.d.ts +3 -1
- package/lib/Util/types.d.ts.map +1 -1
- package/lib/Util/types.js +5 -1
- package/lib/Util/types.js.map +1 -1
- package/lib/index.d.ts +2 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -3
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +20 -19
- package/src/AWS/Lambda/Function.ts +87 -34
- package/src/AWS/Providers.ts +3 -0
- package/src/AlchemyContext.ts +0 -1
- package/src/Apply.ts +18 -1
- package/src/Auth/AuthProvider.ts +25 -5
- package/src/Auth/Credentials.ts +8 -7
- package/src/Cli/commands/_shared.ts +47 -4
- package/src/Cli/commands/cloudflare.ts +5 -3
- package/src/Cli/commands/dev.ts +13 -1
- package/src/Cli/commands/login.ts +20 -4
- package/src/Cli/commands/profile.ts +24 -34
- package/src/Cli/main.ts +0 -3
- package/src/Cloudflare/AiGateway/AiGateway.ts +2 -6
- package/src/Cloudflare/BrowserRendering/BrowserRendering.ts +132 -0
- package/src/Cloudflare/BrowserRendering/BrowserRenderingBinding.ts +137 -0
- package/src/Cloudflare/BrowserRendering/index.ts +11 -0
- package/src/Cloudflare/Container/Container.ts +3 -3
- package/src/Cloudflare/Container/StartContainer.ts +1 -2
- package/src/Cloudflare/D1/D1Database.ts +4 -1
- package/src/Cloudflare/D1/D1DatabaseBinding.ts +1 -1
- package/src/Cloudflare/Fetcher.ts +0 -2
- package/src/Cloudflare/Hyperdrive/Hyperdrive.ts +5 -0
- package/src/Cloudflare/Hyperdrive/HyperdriveBinding.ts +41 -43
- package/src/Cloudflare/KV/KVNamespace.ts +4 -0
- package/src/Cloudflare/Local.ts +1 -1
- package/src/Cloudflare/Providers.ts +32 -16
- package/src/Cloudflare/Queue/Queue.ts +3 -0
- package/src/Cloudflare/Queue/QueueConsumer.ts +21 -8
- package/src/Cloudflare/Queue/QueueEventSource.ts +33 -5
- package/src/Cloudflare/R2/R2Bucket.ts +26 -0
- package/src/Cloudflare/SecretsStore/Secret.ts +14 -41
- package/src/Cloudflare/SecretsStore/SecretBinding.ts +11 -11
- package/src/Cloudflare/StateStore/Api.ts +15 -15
- package/src/Cloudflare/StateStore/State.ts +468 -468
- package/src/Cloudflare/StateStore/Store.ts +27 -37
- package/src/Cloudflare/Vectorize/VectorizeIndex.ts +261 -0
- package/src/Cloudflare/Vectorize/VectorizeIndexBinding.ts +103 -0
- package/src/Cloudflare/Vectorize/VectorizeMetadataIndex.ts +208 -0
- package/src/Cloudflare/Vectorize/index.ts +3 -0
- package/src/Cloudflare/VpcService/VpcService.ts +2 -2
- package/src/Cloudflare/Website/StaticSite.ts +8 -10
- package/src/Cloudflare/Website/Vite.ts +4 -7
- package/src/Cloudflare/Workers/Assets.ts +1 -1
- package/src/Cloudflare/Workers/DurableObjectBridge.ts +7 -4
- package/src/Cloudflare/Workers/DurableObjectNamespace.ts +380 -121
- package/src/Cloudflare/Workers/HttpServer.ts +31 -25
- package/src/Cloudflare/Workers/InferEnv.ts +15 -8
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +139 -78
- package/src/Cloudflare/Workers/Rpc.ts +50 -0
- package/src/Cloudflare/Workers/RpcDurableObjectNamespace.ts +502 -0
- package/src/Cloudflare/Workers/RpcWorker.ts +562 -0
- package/src/Cloudflare/Workers/Vite.ts +2 -0
- package/src/Cloudflare/Workers/Worker.ts +274 -93
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +165 -103
- package/src/Cloudflare/Workers/WorkerBinding.ts +12 -0
- package/src/Cloudflare/Workers/WorkerBridge.ts +7 -4
- package/src/Cloudflare/Workers/WorkerBundle.ts +4 -1
- package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +8 -15
- package/src/Cloudflare/Workers/Workflow.ts +22 -3
- package/src/Cloudflare/Workers/index.ts +2 -0
- package/src/Cloudflare/index.ts +2 -0
- package/src/Dependencies.ts +10 -0
- package/src/Deploy.ts +3 -1
- package/src/Diff.ts +13 -0
- package/src/Input.ts +2 -0
- package/src/KeyPair.ts +146 -0
- package/src/Local/RpcProvider.ts +45 -1
- package/src/Local/RpcServerEnvironment.ts +1 -1
- package/src/Neon/Project.ts +16 -3
- package/src/Output.ts +8 -2
- package/src/Phase.ts +8 -0
- package/src/Plan.ts +16 -3
- package/src/Platform.ts +74 -27
- package/src/Random.ts +22 -27
- package/src/RuntimeContext.ts +23 -1
- package/src/Stack.ts +3 -3
- package/src/State/HttpStateStore.ts +28 -0
- package/src/State/StateEncoding.ts +58 -7
- package/src/Test/Bun.ts +0 -3
- package/src/Test/Vitest.ts +0 -3
- package/src/Util/Duration.ts +21 -0
- package/src/Util/index.ts +0 -6
- package/src/Util/poll.ts +47 -0
- package/src/Util/types.ts +9 -2
- package/src/index.ts +2 -3
- package/lib/Secret.d.ts +0 -50
- package/lib/Secret.d.ts.map +0 -1
- package/lib/Secret.js +0 -23
- package/lib/Secret.js.map +0 -1
- package/lib/Trait.d.ts +0 -43
- package/lib/Trait.d.ts.map +0 -1
- package/lib/Trait.js +0 -17
- package/lib/Trait.js.map +0 -1
- package/lib/Util/LocalhostDns.d.ts +0 -23
- package/lib/Util/LocalhostDns.d.ts.map +0 -1
- package/lib/Util/LocalhostDns.js +0 -46
- package/lib/Util/LocalhostDns.js.map +0 -1
- package/lib/Util/assert-never.d.ts +0 -12
- package/lib/Util/assert-never.d.ts.map +0 -1
- package/lib/Util/assert-never.js +0 -11
- package/lib/Util/assert-never.js.map +0 -1
- package/lib/Util/class.d.ts +0 -3
- package/lib/Util/class.d.ts.map +0 -1
- package/lib/Util/class.js +0 -1
- package/lib/Util/class.js.map +0 -1
- package/lib/Util/ignore.d.ts +0 -40
- package/lib/Util/ignore.d.ts.map +0 -1
- package/lib/Util/ignore.js +0 -591
- package/lib/Util/ignore.js.map +0 -1
- package/lib/Util/instance.d.ts +0 -4
- package/lib/Util/instance.d.ts.map +0 -1
- package/lib/Util/instance.js +0 -1
- package/lib/Util/instance.js.map +0 -1
- package/lib/Util/pointer.d.ts +0 -5
- package/lib/Util/pointer.d.ts.map +0 -1
- package/lib/Util/pointer.js +0 -1
- package/lib/Util/pointer.js.map +0 -1
- package/lib/Util/schema-to-type.d.ts +0 -42
- package/lib/Util/schema-to-type.d.ts.map +0 -1
- package/lib/Util/schema-to-type.js +0 -364
- package/lib/Util/schema-to-type.js.map +0 -1
- package/lib/Util/todo.d.ts +0 -3
- package/lib/Util/todo.d.ts.map +0 -1
- package/lib/Util/todo.js +0 -3
- package/lib/Util/todo.js.map +0 -1
- package/lib/Variable.d.ts +0 -29
- package/lib/Variable.d.ts.map +0 -1
- package/lib/Variable.js +0 -9
- package/lib/Variable.js.map +0 -1
- package/src/Secret.ts +0 -87
- package/src/Trait.ts +0 -105
- package/src/Util/LocalhostDns.ts +0 -52
- package/src/Util/assert-never.ts +0 -18
- package/src/Util/class.ts +0 -7
- package/src/Util/ignore.ts +0 -815
- package/src/Util/instance.ts +0 -9
- package/src/Util/pointer.ts +0 -5
- package/src/Util/schema-to-type.ts +0 -456
- package/src/Util/todo.ts +0 -4
- package/src/Variable.ts +0 -44
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import type * as Layer from "effect/Layer";
|
|
4
|
+
import type { Rpc, RpcGroup } from "effect/unstable/rpc";
|
|
5
|
+
import * as RpcClient from "effect/unstable/rpc/RpcClient";
|
|
6
|
+
import * as RpcClientError from "effect/unstable/rpc/RpcClientError";
|
|
7
|
+
import type { Dependencies } from "../../Dependencies.ts";
|
|
8
|
+
import type { HttpEffect } from "../../Http.ts";
|
|
9
|
+
import type { Input } from "../../Input.ts";
|
|
10
|
+
import { effectClass, taggedFunction } from "../../Util/effect.ts";
|
|
11
|
+
import {
|
|
12
|
+
DurableObjectNamespace,
|
|
13
|
+
type DurableObjectNamespaceLike,
|
|
14
|
+
type DurableObjectNamespaceProps,
|
|
15
|
+
type DurableObjectNamespace as DurableObjectNamespaceType,
|
|
16
|
+
type DurableObjectServices,
|
|
17
|
+
} from "./DurableObjectNamespace.ts";
|
|
18
|
+
import type { DurableObjectState } from "./DurableObjectState.ts";
|
|
19
|
+
import { bindEffectRpc } from "./Rpc.ts";
|
|
20
|
+
import type { Worker as WorkerService } from "./Worker.ts";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The runtime value bound to a typed rpc Durable Object namespace.
|
|
24
|
+
* Same shape as the underlying {@link DurableObjectNamespaceType} for
|
|
25
|
+
* binding metadata (name, namespaceId, kind), but `getByName(id)`
|
|
26
|
+
* returns a typed Effect `RpcClient` over the rpc server living on
|
|
27
|
+
* the DO's `fetch` handler.
|
|
28
|
+
*/
|
|
29
|
+
export interface RpcDurableObjectNamespace<
|
|
30
|
+
Self,
|
|
31
|
+
Rpcs extends Rpc.Any = Rpc.Any,
|
|
32
|
+
> extends Omit<
|
|
33
|
+
DurableObjectNamespaceType<{ fetch: HttpEffect<DurableObjectState> }>,
|
|
34
|
+
"getByName" | "get" | "Shape"
|
|
35
|
+
> {
|
|
36
|
+
/** @internal phantom — keeps `Self` reachable through the inferred type */
|
|
37
|
+
Self?: Self;
|
|
38
|
+
readonly getByName: (
|
|
39
|
+
id: string,
|
|
40
|
+
) => Effect.Effect<
|
|
41
|
+
RpcClient.RpcClient<Rpcs, RpcClientError.RpcClientError>,
|
|
42
|
+
never,
|
|
43
|
+
Rpc.MiddlewareClient<Rpcs>
|
|
44
|
+
>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Context tag carrying the surrounding `RpcDurableObjectNamespace`
|
|
48
|
+
// inside an rpc DO impl. Yield it from within a DO handler to refer
|
|
49
|
+
// back to the surrounding namespace (e.g. to fan a call out to
|
|
50
|
+
// sibling instances). Documented as part of the main
|
|
51
|
+
// `RpcDurableObjectNamespace` JSDoc below.
|
|
52
|
+
export class RpcDurableObjectNamespaceScope extends Context.Service<
|
|
53
|
+
RpcDurableObjectNamespaceScope,
|
|
54
|
+
RpcDurableObjectNamespace<unknown>
|
|
55
|
+
>()("Cloudflare.RpcDurableObjectNamespace") {}
|
|
56
|
+
|
|
57
|
+
export interface RpcDurableObjectNamespaceClass extends Effect.Effect<
|
|
58
|
+
RpcDurableObjectNamespace<unknown>,
|
|
59
|
+
never,
|
|
60
|
+
RpcDurableObjectNamespaceScope
|
|
61
|
+
> {
|
|
62
|
+
/**
|
|
63
|
+
* Class-based forms: `class Counter extends RpcDurableObjectNamespace<Counter>()(...)`.
|
|
64
|
+
*
|
|
65
|
+
* Modular (no impl):
|
|
66
|
+
* ```ts
|
|
67
|
+
* class Counter extends RpcDurableObjectNamespace<Counter>()(
|
|
68
|
+
* "Counter",
|
|
69
|
+
* { schema: CounterRpcs },
|
|
70
|
+
* ) {}
|
|
71
|
+
* export const CounterLive = Counter.make(/* impl *\/);
|
|
72
|
+
* ```
|
|
73
|
+
* Inline impl:
|
|
74
|
+
* ```ts
|
|
75
|
+
* class Counter extends RpcDurableObjectNamespace<Counter>()(
|
|
76
|
+
* "Counter",
|
|
77
|
+
* { schema: CounterRpcs },
|
|
78
|
+
* Effect.gen(function* () { ... }),
|
|
79
|
+
* ) {}
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
<Self>(): {
|
|
83
|
+
/** Modular form: separate `static make(impl)` + `static from(scriptName | Worker)`. */
|
|
84
|
+
<Rpcs extends Rpc.Any>(
|
|
85
|
+
name: string,
|
|
86
|
+
props: { readonly schema: RpcGroup.RpcGroup<Rpcs> },
|
|
87
|
+
): Effect.Effect<
|
|
88
|
+
RpcDurableObjectNamespace<Self, Rpcs>,
|
|
89
|
+
never,
|
|
90
|
+
WorkerService | Self
|
|
91
|
+
> & {
|
|
92
|
+
new (_: never): {};
|
|
93
|
+
from(
|
|
94
|
+
scriptName: Input<string>,
|
|
95
|
+
): Effect.Effect<
|
|
96
|
+
RpcDurableObjectNamespace<Self, Rpcs>,
|
|
97
|
+
never,
|
|
98
|
+
WorkerService
|
|
99
|
+
>;
|
|
100
|
+
from<Req = never>(
|
|
101
|
+
worker:
|
|
102
|
+
| Dependencies<Self>
|
|
103
|
+
| Effect.Effect<Dependencies<Self>, never, Req>,
|
|
104
|
+
): Effect.Effect<
|
|
105
|
+
RpcDurableObjectNamespace<Self, Rpcs>,
|
|
106
|
+
never,
|
|
107
|
+
WorkerService | Req
|
|
108
|
+
>;
|
|
109
|
+
make<InnerR = never, InitReq = never>(
|
|
110
|
+
impl: Effect.Effect<
|
|
111
|
+
Effect.Effect<
|
|
112
|
+
Effect.Effect<HttpEffect<InnerR>, never, InnerR>,
|
|
113
|
+
never,
|
|
114
|
+
DurableObjectServices
|
|
115
|
+
>,
|
|
116
|
+
never,
|
|
117
|
+
InitReq
|
|
118
|
+
>,
|
|
119
|
+
): Layer.Layer<
|
|
120
|
+
Self,
|
|
121
|
+
never,
|
|
122
|
+
WorkerService | Exclude<InitReq | InnerR, DurableObjectServices>
|
|
123
|
+
>;
|
|
124
|
+
};
|
|
125
|
+
/** Inline-impl form. */
|
|
126
|
+
<Rpcs extends Rpc.Any, InnerR = never, InitReq = never>(
|
|
127
|
+
name: string,
|
|
128
|
+
props: { readonly schema: RpcGroup.RpcGroup<Rpcs> },
|
|
129
|
+
impl: Effect.Effect<
|
|
130
|
+
Effect.Effect<
|
|
131
|
+
Effect.Effect<HttpEffect<InnerR>, never, InnerR>,
|
|
132
|
+
never,
|
|
133
|
+
DurableObjectServices
|
|
134
|
+
>,
|
|
135
|
+
never,
|
|
136
|
+
InitReq
|
|
137
|
+
>,
|
|
138
|
+
): Effect.Effect<
|
|
139
|
+
RpcDurableObjectNamespace<Self, Rpcs>,
|
|
140
|
+
never,
|
|
141
|
+
WorkerService | Exclude<InitReq | InnerR, DurableObjectServices>
|
|
142
|
+
> & {
|
|
143
|
+
new (_: never): {};
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
/** Descriptor-only form, for `worker.bind` declarations */
|
|
147
|
+
<Rpcs extends Rpc.Any>(
|
|
148
|
+
name: string,
|
|
149
|
+
props: {
|
|
150
|
+
readonly schema: RpcGroup.RpcGroup<Rpcs>;
|
|
151
|
+
} & Partial<DurableObjectNamespaceProps>,
|
|
152
|
+
): DurableObjectNamespaceLike<{ fetch: HttpEffect<DurableObjectState> }>;
|
|
153
|
+
/** Bare form: `(name, { schema }, impl)` */
|
|
154
|
+
<Rpcs extends Rpc.Any, InnerR = never, InitReq = never>(
|
|
155
|
+
name: string,
|
|
156
|
+
props: { readonly schema: RpcGroup.RpcGroup<Rpcs> },
|
|
157
|
+
impl: Effect.Effect<
|
|
158
|
+
Effect.Effect<
|
|
159
|
+
Effect.Effect<HttpEffect<InnerR>, never, InnerR>,
|
|
160
|
+
never,
|
|
161
|
+
DurableObjectServices
|
|
162
|
+
>,
|
|
163
|
+
never,
|
|
164
|
+
InitReq
|
|
165
|
+
>,
|
|
166
|
+
): Effect.Effect<
|
|
167
|
+
RpcDurableObjectNamespace<unknown, Rpcs>,
|
|
168
|
+
never,
|
|
169
|
+
WorkerService | Exclude<InitReq | InnerR, DurableObjectServices>
|
|
170
|
+
>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* `RpcDurableObjectNamespace` is sugar over {@link DurableObjectNamespace}
|
|
175
|
+
* for Durable Objects whose surface is a typed Effect `RpcGroup`. The
|
|
176
|
+
* DO serves an `RpcServer.toHttpEffect(group)` on its own `fetch`, and
|
|
177
|
+
* consumers see `namespace.getByName(id)` as a typed `RpcClient`
|
|
178
|
+
* directly — no manual client wiring.
|
|
179
|
+
*
|
|
180
|
+
* Use this over alchemy's built-in DO method bridge whenever values
|
|
181
|
+
* crossing the DO boundary contain `Schema.Class` instances. The
|
|
182
|
+
* built-in bridge `JSON.stringify`s every method return value, which
|
|
183
|
+
* strips class identity (e.g. an `effect/ai` `Response.Usage` instance
|
|
184
|
+
* becomes a plain struct on the consumer side). With
|
|
185
|
+
* `RpcDurableObjectNamespace`, both ends go through the same
|
|
186
|
+
* `RpcSerialization` codec, so `Schema.decode` reconstructs class
|
|
187
|
+
* instances correctly.
|
|
188
|
+
*
|
|
189
|
+
* @resource
|
|
190
|
+
*
|
|
191
|
+
* @section Defining the rpc group
|
|
192
|
+
* @example DO-scoped rpc schemas
|
|
193
|
+
* The DO instance *is* the session, so the group payloads typically
|
|
194
|
+
* don't include any per-session identifier — only the per-call inputs.
|
|
195
|
+
* ```typescript
|
|
196
|
+
* import * as Schema from "effect/Schema";
|
|
197
|
+
* import { Rpc, RpcGroup } from "effect/unstable/rpc";
|
|
198
|
+
*
|
|
199
|
+
* const setTitle = Rpc.make("setTitle", {
|
|
200
|
+
* success: Schema.Void,
|
|
201
|
+
* payload: { title: Schema.String },
|
|
202
|
+
* });
|
|
203
|
+
*
|
|
204
|
+
* const getTitle = Rpc.make("getTitle", {
|
|
205
|
+
* success: Schema.String,
|
|
206
|
+
* payload: {},
|
|
207
|
+
* });
|
|
208
|
+
*
|
|
209
|
+
* export class CounterRpcs extends RpcGroup.make(setTitle, getTitle) {}
|
|
210
|
+
* ```
|
|
211
|
+
*
|
|
212
|
+
* @section Implementing the Durable Object
|
|
213
|
+
* @example Class form (recommended)
|
|
214
|
+
* Mirrors `Cloudflare.DurableObjectNamespace<Self>()(...)` — same
|
|
215
|
+
* outer/inner Effect pattern. The outer Effect resolves shared deps;
|
|
216
|
+
* the per-instance inner Effect returns the
|
|
217
|
+
* `RpcServer.toHttpEffect(schema)`-piped Effect directly.
|
|
218
|
+
* ```typescript
|
|
219
|
+
* import * as Cloudflare from "alchemy/Cloudflare";
|
|
220
|
+
* import * as Effect from "effect/Effect";
|
|
221
|
+
* import * as Layer from "effect/Layer";
|
|
222
|
+
* import { RpcSerialization, RpcServer } from "effect/unstable/rpc";
|
|
223
|
+
* import { CounterRpcs } from "./rpcs.ts";
|
|
224
|
+
*
|
|
225
|
+
* export default class Counter extends Cloudflare.RpcDurableObjectNamespace<Counter>()(
|
|
226
|
+
* "Counter",
|
|
227
|
+
* { schema: CounterRpcs },
|
|
228
|
+
* Effect.gen(function* () {
|
|
229
|
+
* // outer init: shared deps for all instances
|
|
230
|
+
* return Effect.gen(function* () {
|
|
231
|
+
* // per-instance init: state + handlers
|
|
232
|
+
* const state = yield* Cloudflare.DurableObjectState;
|
|
233
|
+
* const handlers = CounterRpcs.toLayer({
|
|
234
|
+
* setTitle: ({ title }) => state.storage.put("title", title),
|
|
235
|
+
* getTitle: () =>
|
|
236
|
+
* Effect.map(state.storage.get<string>("title"), (t) => t ?? ""),
|
|
237
|
+
* });
|
|
238
|
+
* return RpcServer.toHttpEffect(CounterRpcs).pipe(
|
|
239
|
+
* Effect.provide(Layer.mergeAll(handlers, RpcSerialization.layerNdjson)),
|
|
240
|
+
* );
|
|
241
|
+
* });
|
|
242
|
+
* }),
|
|
243
|
+
* ) {}
|
|
244
|
+
* ```
|
|
245
|
+
*
|
|
246
|
+
* @section Calling the DO from a Worker
|
|
247
|
+
* @example Typed rpc client at the call site
|
|
248
|
+
* `yield* Counter` resolves to a value whose `getByName(id)` returns
|
|
249
|
+
* an `Effect<RpcClient<CounterRpcs>>`. Each rpc method is a typed
|
|
250
|
+
* Effect/Stream factory — no `RpcClient.make` setup needed. Yield
|
|
251
|
+
* the client inside a per-request `Effect.scoped` handler so it's
|
|
252
|
+
* freed with the request.
|
|
253
|
+
* ```typescript
|
|
254
|
+
* import Counter from "./counter.ts";
|
|
255
|
+
*
|
|
256
|
+
* Effect.gen(function* () {
|
|
257
|
+
* const counters = yield* Counter;
|
|
258
|
+
* const client = yield* counters.getByName("global");
|
|
259
|
+
* yield* client.setTitle({ title: "Hello" });
|
|
260
|
+
* const title = yield* client.getTitle({});
|
|
261
|
+
* return title;
|
|
262
|
+
* }).pipe(Effect.scoped);
|
|
263
|
+
* ```
|
|
264
|
+
*
|
|
265
|
+
* @section Modular form: separate the class from its runtime
|
|
266
|
+
* @example Class declaration with no impl + `static make(impl)`
|
|
267
|
+
* The inline class form above bundles the runtime into the class
|
|
268
|
+
* declaration. The two-arg form `(name, { schema })` declares the
|
|
269
|
+
* class as a pure tagged identifier; provide the runtime separately
|
|
270
|
+
* via `Class.make(impl)`. Consumer Workers can import the class for
|
|
271
|
+
* binding (`Counter.from(HostWorker)`) without pulling the runtime
|
|
272
|
+
* into their bundle.
|
|
273
|
+
* ```typescript
|
|
274
|
+
* import * as Cloudflare from "alchemy/Cloudflare";
|
|
275
|
+
* import * as Effect from "effect/Effect";
|
|
276
|
+
* import * as Layer from "effect/Layer";
|
|
277
|
+
* import { RpcSerialization, RpcServer } from "effect/unstable/rpc";
|
|
278
|
+
* import { CounterRpcs } from "./rpcs.ts";
|
|
279
|
+
*
|
|
280
|
+
* export class Counter extends Cloudflare.RpcDurableObjectNamespace<Counter>()(
|
|
281
|
+
* "Counter",
|
|
282
|
+
* { schema: CounterRpcs },
|
|
283
|
+
* ) {}
|
|
284
|
+
*
|
|
285
|
+
* // Only the host script imports this default export.
|
|
286
|
+
* export default Counter.make(
|
|
287
|
+
* Effect.gen(function* () {
|
|
288
|
+
* return Effect.gen(function* () {
|
|
289
|
+
* const state = yield* Cloudflare.DurableObjectState;
|
|
290
|
+
* const handlers = CounterRpcs.toLayer({
|
|
291
|
+
* setTitle: ({ title }) => state.storage.put("title", title),
|
|
292
|
+
* getTitle: () =>
|
|
293
|
+
* Effect.map(state.storage.get<string>("title"), (t) => t ?? ""),
|
|
294
|
+
* });
|
|
295
|
+
* return RpcServer.toHttpEffect(CounterRpcs).pipe(
|
|
296
|
+
* Effect.provide(Layer.mergeAll(handlers, RpcSerialization.layerNdjson)),
|
|
297
|
+
* );
|
|
298
|
+
* });
|
|
299
|
+
* }),
|
|
300
|
+
* );
|
|
301
|
+
* ```
|
|
302
|
+
*
|
|
303
|
+
* @section Cross-script binding via `Counter.from(Worker)`
|
|
304
|
+
* @example Hosting on WorkerA, binding from WorkerB
|
|
305
|
+
* The host Worker declares `Counter` in its `Deps` (third type
|
|
306
|
+
* arg of `Worker<Self, Bindings, Deps>` or second of
|
|
307
|
+
* `RpcWorker<Self, Deps>`) and provides `CounterLive`. Any other
|
|
308
|
+
* Worker uses `Counter.from(HostWorker)` to bind to the same DO
|
|
309
|
+
* instances — writes through `HostWorker.getByName(name)` are
|
|
310
|
+
* visible from `Counter.from(HostWorker).getByName(name)`.
|
|
311
|
+
* ```typescript
|
|
312
|
+
* // host worker (declares + provides Counter)
|
|
313
|
+
* import CounterLive, { Counter } from "./counter.ts";
|
|
314
|
+
*
|
|
315
|
+
* export class WorkerA extends Cloudflare.Worker<WorkerA, {}, Counter>()(
|
|
316
|
+
* "WorkerA",
|
|
317
|
+
* { main: import.meta.filename },
|
|
318
|
+
* ) {}
|
|
319
|
+
*
|
|
320
|
+
* export default WorkerA.make(
|
|
321
|
+
* Effect.gen(function* () {
|
|
322
|
+
* const counters = yield* Counter; // local host binding
|
|
323
|
+
* // ... fetch handler ...
|
|
324
|
+
* }).pipe(Effect.provide(CounterLive)),
|
|
325
|
+
* );
|
|
326
|
+
*
|
|
327
|
+
* // consumer worker (binds via .from)
|
|
328
|
+
* export default class WorkerB extends Cloudflare.Worker<WorkerB>()(
|
|
329
|
+
* "WorkerB",
|
|
330
|
+
* { main: import.meta.filename },
|
|
331
|
+
* Effect.gen(function* () {
|
|
332
|
+
* const counters = yield* Counter.from(WorkerA);
|
|
333
|
+
* return {
|
|
334
|
+
* fetch: Effect.gen(function* () {
|
|
335
|
+
* const client = yield* counters.getByName("shared");
|
|
336
|
+
* yield* client.setTitle({ title: "via WorkerB" });
|
|
337
|
+
* return HttpServerResponse.text("ok");
|
|
338
|
+
* }).pipe(Effect.scoped),
|
|
339
|
+
* };
|
|
340
|
+
* }),
|
|
341
|
+
* ) {}
|
|
342
|
+
* ```
|
|
343
|
+
*
|
|
344
|
+
* @example Self-hosted isolated namespace
|
|
345
|
+
* A Worker that declares `Counter` in its own `Deps` and provides
|
|
346
|
+
* `CounterLive` hosts its own isolated namespace — instances under
|
|
347
|
+
* it are separate from any other host's. Use `Counter.from(Self)`
|
|
348
|
+
* inside the host to be explicit about which script's namespace
|
|
349
|
+
* you're binding to.
|
|
350
|
+
* ```typescript
|
|
351
|
+
* export class WorkerC extends Cloudflare.Worker<WorkerC, {}, Counter>()(
|
|
352
|
+
* "WorkerC",
|
|
353
|
+
* { main: import.meta.filename },
|
|
354
|
+
* ) {}
|
|
355
|
+
*
|
|
356
|
+
* export default WorkerC.make(
|
|
357
|
+
* Effect.gen(function* () {
|
|
358
|
+
* const counters = yield* Counter.from(WorkerC); // explicit self
|
|
359
|
+
* // ... fetch handler ...
|
|
360
|
+
* }).pipe(Effect.provide(CounterLive)),
|
|
361
|
+
* );
|
|
362
|
+
* ```
|
|
363
|
+
*
|
|
364
|
+
* @section Yielding the surrounding namespace from inside a DO
|
|
365
|
+
* @example `yield* RpcDurableObjectNamespace` inside the DO impl
|
|
366
|
+
* Lets a DO instance refer to its own namespace — e.g. to fan a call
|
|
367
|
+
* out to sibling instances. Mirrors `yield* DurableObjectNamespace`
|
|
368
|
+
* on the regular `DurableObjectNamespace`.
|
|
369
|
+
* ```typescript
|
|
370
|
+
* Effect.gen(function* () {
|
|
371
|
+
* const self = yield* Cloudflare.RpcDurableObjectNamespace;
|
|
372
|
+
* const peer = yield* self.getByName("peer-1");
|
|
373
|
+
* yield* peer.setTitle({ title: "Sibling call" });
|
|
374
|
+
* }).pipe(Effect.scoped);
|
|
375
|
+
* ```
|
|
376
|
+
*/
|
|
377
|
+
export const RpcDurableObjectNamespace: RpcDurableObjectNamespaceClass =
|
|
378
|
+
taggedFunction(RpcDurableObjectNamespaceScope, (...args: any[]) => {
|
|
379
|
+
// Class-form: zero args returns the inner builder. Inner-arg arity
|
|
380
|
+
// distinguishes modular (`(name, { schema })`, no impl — `static
|
|
381
|
+
// from`/`static make` provide the runtime) from inline-impl
|
|
382
|
+
// (`(name, { schema }, impl)`).
|
|
383
|
+
if (args.length === 0) {
|
|
384
|
+
return (...inner: any[]) => {
|
|
385
|
+
if (inner.length === 2) {
|
|
386
|
+
const [name, props] = inner as [
|
|
387
|
+
string,
|
|
388
|
+
{ readonly schema: RpcGroup.RpcGroup<any> },
|
|
389
|
+
];
|
|
390
|
+
return buildModular(name, props.schema);
|
|
391
|
+
}
|
|
392
|
+
const [name, props, impl] = inner as [
|
|
393
|
+
string,
|
|
394
|
+
{ readonly schema: RpcGroup.RpcGroup<any> },
|
|
395
|
+
Effect.Effect<Effect.Effect<any>>,
|
|
396
|
+
];
|
|
397
|
+
return build(name, props, impl);
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
// Descriptor-only form: `(name, { schema })` — no impl.
|
|
401
|
+
if (args.length === 2) {
|
|
402
|
+
const [name, props] = args as [
|
|
403
|
+
string,
|
|
404
|
+
{
|
|
405
|
+
readonly schema: RpcGroup.RpcGroup<any>;
|
|
406
|
+
} & Partial<DurableObjectNamespaceProps>,
|
|
407
|
+
];
|
|
408
|
+
return {
|
|
409
|
+
kind: "Cloudflare.DurableObjectNamespace" as const,
|
|
410
|
+
name,
|
|
411
|
+
className: props?.className,
|
|
412
|
+
} satisfies DurableObjectNamespaceLike<any>;
|
|
413
|
+
}
|
|
414
|
+
// Bare form: `(name, { schema }, impl)`.
|
|
415
|
+
const [name, props, impl] = args as [
|
|
416
|
+
string,
|
|
417
|
+
{ readonly schema: RpcGroup.RpcGroup<any> },
|
|
418
|
+
Effect.Effect<Effect.Effect<any>>,
|
|
419
|
+
];
|
|
420
|
+
return build(name, props, impl);
|
|
421
|
+
}) as any;
|
|
422
|
+
|
|
423
|
+
// Wrap a raw `DurableObjectNamespace` so its `getByName` returns a typed
|
|
424
|
+
// Effect `RpcClient` (via `bindEffectRpc`) instead of the built-in
|
|
425
|
+
// method-bridge stub. Used in every branch that produces a yieldable
|
|
426
|
+
// `RpcDurableObjectNamespace` value.
|
|
427
|
+
const rpcWrap = (
|
|
428
|
+
rawNs: DurableObjectNamespaceType<any>,
|
|
429
|
+
schema: RpcGroup.RpcGroup<any>,
|
|
430
|
+
): RpcDurableObjectNamespace<any> => {
|
|
431
|
+
const rpcView = bindEffectRpc(rawNs as any, schema);
|
|
432
|
+
return Object.assign({}, rawNs, {
|
|
433
|
+
getByName: rpcView.getByName,
|
|
434
|
+
}) as unknown as RpcDurableObjectNamespace<any>;
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
// The user's inner Effect resolves to `Effect<HttpEffect>`; the
|
|
438
|
+
// underlying `DurableObjectNamespace` expects `Effect<{ fetch:
|
|
439
|
+
// HttpEffect }>` (a `DurableObjectShape`). Map through both layers to
|
|
440
|
+
// box the http effect in the `{ fetch }` shape.
|
|
441
|
+
const wrapImpl = (impl: Effect.Effect<Effect.Effect<any>>) =>
|
|
442
|
+
impl.pipe(
|
|
443
|
+
Effect.map((inner) =>
|
|
444
|
+
inner.pipe(Effect.map((fetch: HttpEffect<any>) => ({ fetch }))),
|
|
445
|
+
),
|
|
446
|
+
) as Effect.Effect<Effect.Effect<any>>;
|
|
447
|
+
|
|
448
|
+
const build = (
|
|
449
|
+
name: string,
|
|
450
|
+
props: { readonly schema: RpcGroup.RpcGroup<any> },
|
|
451
|
+
impl: Effect.Effect<Effect.Effect<any>>,
|
|
452
|
+
) => {
|
|
453
|
+
// Inline-impl class form: delegate to `DurableObjectNamespace`'s
|
|
454
|
+
// inline class form, then expose the rpc-wrapped view at yield
|
|
455
|
+
// time. No `static from`/`static make` because the impl is provided
|
|
456
|
+
// eagerly here (consumers wanting cross-script binding use the
|
|
457
|
+
// modular form below).
|
|
458
|
+
const underlying = (DurableObjectNamespace as any)()(name, wrapImpl(impl));
|
|
459
|
+
const underlyingEff: Effect.Effect<
|
|
460
|
+
DurableObjectNamespaceType<any>,
|
|
461
|
+
never,
|
|
462
|
+
any
|
|
463
|
+
> = (underlying as { asEffect(): Effect.Effect<any, never, any> }).asEffect();
|
|
464
|
+
const rpcBound = underlyingEff.pipe(
|
|
465
|
+
Effect.map((rawNs) => rpcWrap(rawNs, props.schema)),
|
|
466
|
+
) as unknown as Effect.Effect<RpcDurableObjectNamespace<any>>;
|
|
467
|
+
return effectClass(rpcBound);
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
const buildModular = (name: string, schema: RpcGroup.RpcGroup<any>) => {
|
|
471
|
+
// Delegate to `DurableObjectNamespace<Self>()(name)` (no-impl class
|
|
472
|
+
// form) so we inherit its Self-tag plumbing for free:
|
|
473
|
+
// - yielding the class resolves to the live namespace via the tag
|
|
474
|
+
// (populated by `static make(impl)`'s Layer)
|
|
475
|
+
// - `static from(scriptName | Worker)` registers a foreign-script
|
|
476
|
+
// binding on the surrounding worker and yields a fresh handle
|
|
477
|
+
// We just rpc-wrap each output so consumers see a typed `getByName`.
|
|
478
|
+
const Underlying: any = (DurableObjectNamespace as any)()(name);
|
|
479
|
+
const underlyingEff: Effect.Effect<
|
|
480
|
+
DurableObjectNamespaceType<any>,
|
|
481
|
+
never,
|
|
482
|
+
any
|
|
483
|
+
> = (Underlying as { asEffect(): Effect.Effect<any, never, any> }).asEffect();
|
|
484
|
+
|
|
485
|
+
return class extends effectClass(
|
|
486
|
+
underlyingEff.pipe(
|
|
487
|
+
Effect.map((rawNs) => rpcWrap(rawNs, schema)),
|
|
488
|
+
) as unknown as Effect.Effect<RpcDurableObjectNamespace<any>>,
|
|
489
|
+
) {
|
|
490
|
+
static make = (impl: Effect.Effect<Effect.Effect<any>>) =>
|
|
491
|
+
Underlying.make(wrapImpl(impl));
|
|
492
|
+
|
|
493
|
+
static from = (
|
|
494
|
+
worker: string | object | Effect.Effect<any, any, any>,
|
|
495
|
+
): Effect.Effect<RpcDurableObjectNamespace<any>, any, any> =>
|
|
496
|
+
Underlying.from(worker).pipe(
|
|
497
|
+
Effect.map((rawNs: DurableObjectNamespaceType<any>) =>
|
|
498
|
+
rpcWrap(rawNs, schema),
|
|
499
|
+
),
|
|
500
|
+
);
|
|
501
|
+
};
|
|
502
|
+
};
|