pi-cloudflare 0.1.0
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 +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Gotchas & Best Practices
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Container running indefinitely"
|
|
6
|
+
|
|
7
|
+
**Cause:** `keepAlive: true` without calling `destroy()`
|
|
8
|
+
**Solution:** Always call `destroy()` when done with keepAlive containers
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
const sandbox = getSandbox(env.Sandbox, 'temp', { keepAlive: true });
|
|
12
|
+
try {
|
|
13
|
+
const result = await sandbox.exec('python script.py');
|
|
14
|
+
return result.stdout;
|
|
15
|
+
} finally {
|
|
16
|
+
await sandbox.destroy(); // REQUIRED to free resources
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### "CONTAINER_NOT_READY"
|
|
21
|
+
|
|
22
|
+
**Cause:** Container still provisioning (first request or after sleep)
|
|
23
|
+
**Solution:** Retry after 2-3s
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
async function execWithRetry(sandbox, cmd) {
|
|
27
|
+
for (let i = 0; i < 3; i++) {
|
|
28
|
+
try {
|
|
29
|
+
return await sandbox.exec(cmd);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
if (e.code === 'CONTAINER_NOT_READY') {
|
|
32
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
throw e;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### "Connection refused: container port not found"
|
|
42
|
+
|
|
43
|
+
**Cause:** Missing `EXPOSE` directive in Dockerfile
|
|
44
|
+
**Solution:** Add `EXPOSE <port>` to Dockerfile (only needed for `wrangler dev`, production auto-exposes)
|
|
45
|
+
|
|
46
|
+
### "Preview URLs not working"
|
|
47
|
+
|
|
48
|
+
**Cause:** Custom domain not configured, wildcard DNS missing, `normalizeId` not set, or `proxyToSandbox()` not called
|
|
49
|
+
**Solution:** Check:
|
|
50
|
+
1. Custom domain configured? (not `.workers.dev`)
|
|
51
|
+
2. Wildcard DNS set up? (`*.domain.com → worker.domain.com`)
|
|
52
|
+
3. `normalizeId: true` in getSandbox?
|
|
53
|
+
4. `proxyToSandbox()` called first in fetch?
|
|
54
|
+
|
|
55
|
+
### "Slow first request"
|
|
56
|
+
|
|
57
|
+
**Cause:** Cold start (container provisioning)
|
|
58
|
+
**Solution:**
|
|
59
|
+
- Use `sleepAfter` instead of creating new sandboxes
|
|
60
|
+
- Pre-warm with cron triggers
|
|
61
|
+
- Set `keepAlive: true` for critical sandboxes
|
|
62
|
+
|
|
63
|
+
### "File not persisting"
|
|
64
|
+
|
|
65
|
+
**Cause:** Files in `/tmp` or other ephemeral paths
|
|
66
|
+
**Solution:** Use `/workspace` for persistent files
|
|
67
|
+
|
|
68
|
+
### "Bucket mounting doesn't work locally"
|
|
69
|
+
|
|
70
|
+
**Cause:** Bucket mounting requires FUSE, not available in `wrangler dev`
|
|
71
|
+
**Solution:** Test bucket mounting in production only. Use mock data locally.
|
|
72
|
+
|
|
73
|
+
### "Different normalizeId = different sandbox"
|
|
74
|
+
|
|
75
|
+
**Cause:** Changing `normalizeId` option changes Durable Object ID
|
|
76
|
+
**Solution:** Set `normalizeId` consistently. `normalizeId: true` lowercases the ID.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// These create DIFFERENT sandboxes:
|
|
80
|
+
getSandbox(env.Sandbox, 'MyApp'); // DO ID: hash('MyApp')
|
|
81
|
+
getSandbox(env.Sandbox, 'MyApp', { normalizeId: true }); // DO ID: hash('myapp')
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### "Code context variables disappeared"
|
|
85
|
+
|
|
86
|
+
**Cause:** Container restart clears code context state
|
|
87
|
+
**Solution:** Code contexts are ephemeral. Recreate context after container sleep/wake.
|
|
88
|
+
|
|
89
|
+
## Performance Optimization
|
|
90
|
+
|
|
91
|
+
### Sandbox ID Strategy
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// ❌ BAD: New sandbox every time (slow)
|
|
95
|
+
const sandbox = getSandbox(env.Sandbox, `user-${Date.now()}`);
|
|
96
|
+
|
|
97
|
+
// ✅ GOOD: Reuse per user
|
|
98
|
+
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Sleep & Traffic Config
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// Cost-optimized
|
|
105
|
+
getSandbox(env.Sandbox, 'id', { sleepAfter: '30m', keepAlive: false });
|
|
106
|
+
|
|
107
|
+
// Always-on (requires destroy())
|
|
108
|
+
getSandbox(env.Sandbox, 'id', { keepAlive: true });
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```jsonc
|
|
112
|
+
// High traffic: increase max_instances
|
|
113
|
+
{ "containers": [{ "class_name": "Sandbox", "max_instances": 50 }] }
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Security Best Practices
|
|
117
|
+
|
|
118
|
+
### Sandbox Isolation
|
|
119
|
+
- Each sandbox = isolated container (filesystem, network, processes)
|
|
120
|
+
- Use unique sandbox IDs per tenant for multi-tenant apps
|
|
121
|
+
- Sandboxes cannot communicate directly
|
|
122
|
+
|
|
123
|
+
### Input Validation
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// ❌ DANGEROUS: Command injection
|
|
127
|
+
const result = await sandbox.exec(`python3 -c "${userCode}"`);
|
|
128
|
+
|
|
129
|
+
// ✅ SAFE: Write to file, execute file
|
|
130
|
+
await sandbox.writeFile('/workspace/user_code.py', userCode);
|
|
131
|
+
const result = await sandbox.exec('python3 /workspace/user_code.py');
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Resource Limits
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// Timeout long-running commands
|
|
138
|
+
const result = await sandbox.exec('python3 script.py', {
|
|
139
|
+
timeout: 30000 // 30 seconds
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Secrets Management
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// ❌ NEVER hardcode secrets
|
|
147
|
+
const token = 'ghp_abc123';
|
|
148
|
+
|
|
149
|
+
// ✅ Use environment secrets
|
|
150
|
+
const token = env.GITHUB_TOKEN;
|
|
151
|
+
|
|
152
|
+
// Pass to sandbox via exec env
|
|
153
|
+
const result = await sandbox.exec('git clone ...', {
|
|
154
|
+
env: { GIT_TOKEN: token }
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Preview URL Security
|
|
159
|
+
Preview URLs include auto-generated tokens:
|
|
160
|
+
```
|
|
161
|
+
https://8080-sandbox-abc123def456.yourdomain.com
|
|
162
|
+
```
|
|
163
|
+
Token changes on each expose operation, preventing unauthorized access.
|
|
164
|
+
|
|
165
|
+
## Limits
|
|
166
|
+
|
|
167
|
+
| Resource | Lite | Standard | Heavy |
|
|
168
|
+
|----------|------|----------|-------|
|
|
169
|
+
| RAM | 256MB | 512MB | 1GB |
|
|
170
|
+
| vCPU | 0.5 | 1 | 2 |
|
|
171
|
+
|
|
172
|
+
| Operation | Default Timeout | Override |
|
|
173
|
+
|-----------|----------------|----------|
|
|
174
|
+
| Container provisioning | 30s | `SANDBOX_INSTANCE_TIMEOUT_MS` |
|
|
175
|
+
| Port readiness | 90s | `SANDBOX_PORT_TIMEOUT_MS` |
|
|
176
|
+
| exec() | None (no default) | `timeout` option |
|
|
177
|
+
| sleepAfter | 10m | `sleepAfter` option |
|
|
178
|
+
|
|
179
|
+
**Performance**:
|
|
180
|
+
- **First deploy**: 2-3 min for container build
|
|
181
|
+
- **Cold start**: 2-3s when waking from sleep
|
|
182
|
+
- **Bucket mounting**: Production only (FUSE not in dev)
|
|
183
|
+
|
|
184
|
+
## Production Guide
|
|
185
|
+
|
|
186
|
+
See: https://developers.cloudflare.com/sandbox/guides/production-deployment/
|
|
187
|
+
|
|
188
|
+
## Resources
|
|
189
|
+
|
|
190
|
+
- [Official Docs](https://developers.cloudflare.com/sandbox/)
|
|
191
|
+
- [API Reference](https://developers.cloudflare.com/sandbox/api/)
|
|
192
|
+
- [Examples](https://github.com/cloudflare/sandbox-sdk/tree/main/examples)
|
|
193
|
+
- [npm Package](https://www.npmjs.com/package/@cloudflare/sandbox)
|
|
194
|
+
- [Discord Support](https://discord.cloudflare.com)
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Common Patterns
|
|
2
|
+
|
|
3
|
+
## AI Code Execution with Code Context
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export default {
|
|
7
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
8
|
+
const { code, variables } = await request.json();
|
|
9
|
+
const sandbox = getSandbox(env.Sandbox, 'ai-agent');
|
|
10
|
+
|
|
11
|
+
// Create context with persistent variables
|
|
12
|
+
const ctx = await sandbox.createCodeContext({
|
|
13
|
+
language: 'python',
|
|
14
|
+
variables: variables || {}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Execute with rich outputs (text, images, HTML)
|
|
18
|
+
const result = await sandbox.runCode(code, { context: ctx });
|
|
19
|
+
|
|
20
|
+
return Response.json({
|
|
21
|
+
results: result.results, // RichOutput[] (text, html, png, json, etc.)
|
|
22
|
+
error: result.error,
|
|
23
|
+
success: !result.error
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Interactive Dev Environment
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
export default {
|
|
33
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
34
|
+
const proxyResponse = await proxyToSandbox(request, env);
|
|
35
|
+
if (proxyResponse) return proxyResponse;
|
|
36
|
+
|
|
37
|
+
const sandbox = getSandbox(env.Sandbox, 'ide', { normalizeId: true });
|
|
38
|
+
|
|
39
|
+
if (request.url.endsWith('/start')) {
|
|
40
|
+
await sandbox.exec('curl -fsSL https://code-server.dev/install.sh | sh');
|
|
41
|
+
await sandbox.startProcess('code-server --bind-addr 0.0.0.0:8080', {
|
|
42
|
+
processId: 'vscode'
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const exposed = await sandbox.exposePort(8080);
|
|
46
|
+
return Response.json({ url: exposed.url });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return new Response('Try /start');
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## WebSocket Real-Time Service
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
export default {
|
|
58
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
59
|
+
const proxyResponse = await proxyToSandbox(request, env);
|
|
60
|
+
if (proxyResponse) return proxyResponse;
|
|
61
|
+
|
|
62
|
+
if (request.headers.get('Upgrade')?.toLowerCase() === 'websocket') {
|
|
63
|
+
const sandbox = getSandbox(env.Sandbox, 'realtime-service');
|
|
64
|
+
return await sandbox.wsConnect(request, 8080);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Non-WebSocket: expose preview URL
|
|
68
|
+
const sandbox = getSandbox(env.Sandbox, 'realtime-service');
|
|
69
|
+
const { url } = await sandbox.exposePort(8080, {
|
|
70
|
+
hostname: new URL(request.url).hostname
|
|
71
|
+
});
|
|
72
|
+
return Response.json({ wsUrl: url.replace('https', 'wss') });
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Dockerfile**:
|
|
78
|
+
```dockerfile
|
|
79
|
+
FROM docker.io/cloudflare/sandbox:0.7.0
|
|
80
|
+
RUN npm install -g ws
|
|
81
|
+
EXPOSE 8080
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Process Readiness Pattern
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export default {
|
|
88
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
89
|
+
const sandbox = getSandbox(env.Sandbox, 'app-server');
|
|
90
|
+
|
|
91
|
+
// Start server
|
|
92
|
+
const process = await sandbox.startProcess(
|
|
93
|
+
'node server.js',
|
|
94
|
+
{ processId: 'server' }
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
// Wait for server to be ready
|
|
98
|
+
await process.waitForPort(8080); // Wait for port listening
|
|
99
|
+
|
|
100
|
+
// Now safe to expose
|
|
101
|
+
const { url } = await sandbox.exposePort(8080);
|
|
102
|
+
return Response.json({ url });
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Persistent Data with Bucket Mounting
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
export default {
|
|
111
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
112
|
+
const sandbox = getSandbox(env.Sandbox, 'data-processor');
|
|
113
|
+
|
|
114
|
+
// Mount R2 bucket (production only)
|
|
115
|
+
await sandbox.mountBucket(env.DATA_BUCKET, '/data', {
|
|
116
|
+
readOnly: false
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Process files in bucket
|
|
120
|
+
const result = await sandbox.exec('python3 /workspace/process.py', {
|
|
121
|
+
env: { DATA_DIR: '/data/input' }
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Results written to /data/output are persisted in R2
|
|
125
|
+
return Response.json({ success: result.success });
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## CI/CD Pipeline
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
export default {
|
|
134
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
135
|
+
const { repo, branch } = await request.json();
|
|
136
|
+
const sandbox = getSandbox(env.Sandbox, `ci-${repo}-${Date.now()}`);
|
|
137
|
+
|
|
138
|
+
await sandbox.exec(`git clone -b ${branch} ${repo} /workspace/repo`);
|
|
139
|
+
|
|
140
|
+
const install = await sandbox.exec('npm install', {
|
|
141
|
+
cwd: '/workspace/repo',
|
|
142
|
+
stream: true,
|
|
143
|
+
onOutput: (stream, data) => console.log(data)
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
if (!install.success) {
|
|
147
|
+
return Response.json({ success: false, error: 'Install failed' });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const test = await sandbox.exec('npm test', { cwd: '/workspace/repo' });
|
|
151
|
+
|
|
152
|
+
return Response.json({
|
|
153
|
+
success: test.success,
|
|
154
|
+
output: test.stdout,
|
|
155
|
+
exitCode: test.exitCode
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
## Multi-Tenant Pattern
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
export default {
|
|
169
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
170
|
+
const userId = request.headers.get('X-User-ID');
|
|
171
|
+
const sandbox = getSandbox(env.Sandbox, 'multi-tenant');
|
|
172
|
+
|
|
173
|
+
// Each user gets isolated session
|
|
174
|
+
let session;
|
|
175
|
+
try {
|
|
176
|
+
session = await sandbox.getSession(userId);
|
|
177
|
+
} catch {
|
|
178
|
+
session = await sandbox.createSession({
|
|
179
|
+
id: userId,
|
|
180
|
+
cwd: `/workspace/users/${userId}`,
|
|
181
|
+
env: { USER_ID: userId }
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const code = await request.text();
|
|
186
|
+
const result = await session.exec(`python3 -c "${code}"`);
|
|
187
|
+
|
|
188
|
+
return Response.json({ output: result.stdout });
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Git Operations
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
// Clone repo
|
|
197
|
+
await sandbox.exec('git clone https://github.com/user/repo.git /workspace/repo');
|
|
198
|
+
|
|
199
|
+
// Authenticated (use env secrets)
|
|
200
|
+
await sandbox.exec(`git clone https://${env.GITHUB_TOKEN}@github.com/user/repo.git`);
|
|
201
|
+
```
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Cloudflare Secrets Store
|
|
2
|
+
|
|
3
|
+
Account-level encrypted secret management for Workers and AI Gateway.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
**Secrets Store**: Centralized, account-level secrets, reusable across Workers
|
|
8
|
+
**Worker Secrets**: Per-Worker secrets (`wrangler secret put`)
|
|
9
|
+
|
|
10
|
+
### Architecture
|
|
11
|
+
|
|
12
|
+
- **Store**: Container (1/account in beta)
|
|
13
|
+
- **Secret**: String ≤1024 bytes
|
|
14
|
+
- **Scopes**: Permission boundaries controlling access
|
|
15
|
+
- `workers`: For Workers runtime access
|
|
16
|
+
- `ai-gateway`: For AI Gateway access
|
|
17
|
+
- Secrets must have correct scope for binding to work
|
|
18
|
+
- **Bindings**: Connect secrets via `env` object
|
|
19
|
+
|
|
20
|
+
**Regional Availability**: Global except China Network (unavailable)
|
|
21
|
+
|
|
22
|
+
### Access Control
|
|
23
|
+
|
|
24
|
+
- **Super Admin**: Full access
|
|
25
|
+
- **Admin**: Create/edit/delete secrets, view metadata
|
|
26
|
+
- **Deployer**: View metadata + bindings
|
|
27
|
+
- **Reporter**: View metadata only
|
|
28
|
+
|
|
29
|
+
API Token permissions: `Account Secrets Store Edit/Read`
|
|
30
|
+
|
|
31
|
+
### Limits (Beta)
|
|
32
|
+
|
|
33
|
+
- 100 secrets/account
|
|
34
|
+
- 1 store/account
|
|
35
|
+
- 1024 bytes max/secret
|
|
36
|
+
- Production secrets count toward limit
|
|
37
|
+
|
|
38
|
+
## When to Use
|
|
39
|
+
|
|
40
|
+
**Use Secrets Store when:**
|
|
41
|
+
- Multiple Workers share same credential
|
|
42
|
+
- Centralized management needed
|
|
43
|
+
- Compliance requires audit trail
|
|
44
|
+
- Team collaboration on secrets
|
|
45
|
+
|
|
46
|
+
**Use Worker Secrets when:**
|
|
47
|
+
- Secret unique to one Worker
|
|
48
|
+
- Simple single-Worker project
|
|
49
|
+
- No cross-Worker sharing needed
|
|
50
|
+
|
|
51
|
+
## In This Reference
|
|
52
|
+
|
|
53
|
+
### Reading Order by Task
|
|
54
|
+
|
|
55
|
+
| Task | Start Here | Then Read |
|
|
56
|
+
|------|------------|-----------|
|
|
57
|
+
| Quick overview | README.md | - |
|
|
58
|
+
| First-time setup | README.md → configuration.md | api.md |
|
|
59
|
+
| Add secret to Worker | configuration.md | api.md |
|
|
60
|
+
| Implement access pattern | api.md | patterns.md |
|
|
61
|
+
| Debug errors | gotchas.md | api.md |
|
|
62
|
+
| Secret rotation | patterns.md | configuration.md |
|
|
63
|
+
| Best practices | gotchas.md | patterns.md |
|
|
64
|
+
|
|
65
|
+
### Files
|
|
66
|
+
|
|
67
|
+
- [configuration.md](./configuration.md) - Wrangler commands, binding config
|
|
68
|
+
- [api.md](./api.md) - Binding API, get/put/delete operations
|
|
69
|
+
- [patterns.md](./patterns.md) - Rotation, encryption, access control
|
|
70
|
+
- [gotchas.md](./gotchas.md) - Security issues, limits, best practices
|
|
71
|
+
|
|
72
|
+
## See Also
|
|
73
|
+
- [workers](../workers/) - Worker bindings integration
|
|
74
|
+
- [wrangler](../wrangler/) - CLI secret management commands
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Binding API
|
|
4
|
+
|
|
5
|
+
### Basic Access
|
|
6
|
+
|
|
7
|
+
**CRITICAL**: Async `.get()` required - secrets NOT directly available.
|
|
8
|
+
|
|
9
|
+
**`.get()` throws on error** - does NOT return null. Always use try/catch.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
interface Env {
|
|
13
|
+
API_KEY: { get(): Promise<string> };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default {
|
|
17
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
18
|
+
const apiKey = await env.API_KEY.get();
|
|
19
|
+
return fetch("https://api.example.com", {
|
|
20
|
+
headers: { "Authorization": `Bearer ${apiKey}` }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Error Handling
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
export default {
|
|
30
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
31
|
+
try {
|
|
32
|
+
const apiKey = await env.API_KEY.get();
|
|
33
|
+
return fetch("https://api.example.com", {
|
|
34
|
+
headers: { "Authorization": `Bearer ${apiKey}` }
|
|
35
|
+
});
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error("Secret access failed:", error);
|
|
38
|
+
return new Response("Configuration error", { status: 500 });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Multiple Secrets & Patterns
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Parallel fetch
|
|
48
|
+
const [stripeKey, sendgridKey] = await Promise.all([
|
|
49
|
+
env.STRIPE_KEY.get(),
|
|
50
|
+
env.SENDGRID_KEY.get()
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
// ❌ Missing .get()
|
|
54
|
+
const key = env.API_KEY;
|
|
55
|
+
|
|
56
|
+
// ❌ Module-level cache
|
|
57
|
+
const CACHED_KEY = await env.API_KEY.get(); // Fails
|
|
58
|
+
|
|
59
|
+
// ✅ Request-scope cache
|
|
60
|
+
const key = await env.API_KEY.get(); // OK - reuse within request
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## REST API
|
|
64
|
+
|
|
65
|
+
Base: `https://api.cloudflare.com/client/v4`
|
|
66
|
+
|
|
67
|
+
### Auth
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
curl -H "Authorization: Bearer $CF_TOKEN" \
|
|
71
|
+
https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/secrets_store/stores
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Store Operations
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# List
|
|
78
|
+
GET /accounts/{account_id}/secrets_store/stores
|
|
79
|
+
|
|
80
|
+
# Create
|
|
81
|
+
POST /accounts/{account_id}/secrets_store/stores
|
|
82
|
+
{"name": "my-store"}
|
|
83
|
+
|
|
84
|
+
# Delete
|
|
85
|
+
DELETE /accounts/{account_id}/secrets_store/stores/{store_id}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Secret Operations
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# List
|
|
92
|
+
GET /accounts/{account_id}/secrets_store/stores/{store_id}/secrets
|
|
93
|
+
|
|
94
|
+
# Create (single)
|
|
95
|
+
POST /accounts/{account_id}/secrets_store/stores/{store_id}/secrets
|
|
96
|
+
{
|
|
97
|
+
"name": "my_secret",
|
|
98
|
+
"value": "secret_value",
|
|
99
|
+
"scopes": ["workers"],
|
|
100
|
+
"comment": "Optional"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Create (batch)
|
|
104
|
+
POST /accounts/{account_id}/secrets_store/stores/{store_id}/secrets
|
|
105
|
+
[
|
|
106
|
+
{"name": "secret_one", "value": "val1", "scopes": ["workers"]},
|
|
107
|
+
{"name": "secret_two", "value": "val2", "scopes": ["workers", "ai-gateway"]}
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
# Get metadata
|
|
111
|
+
GET /accounts/{account_id}/secrets_store/stores/{store_id}/secrets/{secret_id}
|
|
112
|
+
|
|
113
|
+
# Update
|
|
114
|
+
PATCH /accounts/{account_id}/secrets_store/stores/{store_id}/secrets/{secret_id}
|
|
115
|
+
{"value": "new_value", "comment": "Updated"}
|
|
116
|
+
|
|
117
|
+
# Delete (single)
|
|
118
|
+
DELETE /accounts/{account_id}/secrets_store/stores/{store_id}/secrets/{secret_id}
|
|
119
|
+
|
|
120
|
+
# Delete (batch)
|
|
121
|
+
DELETE /accounts/{account_id}/secrets_store/stores/{store_id}/secrets
|
|
122
|
+
{"secret_ids": ["id-1", "id-2"]}
|
|
123
|
+
|
|
124
|
+
# Duplicate
|
|
125
|
+
POST /accounts/{account_id}/secrets_store/stores/{store_id}/secrets/{secret_id}/duplicate
|
|
126
|
+
{"name": "new_name"}
|
|
127
|
+
|
|
128
|
+
# Quota
|
|
129
|
+
GET /accounts/{account_id}/secrets_store/quota
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Responses
|
|
133
|
+
|
|
134
|
+
Success:
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"success": true,
|
|
138
|
+
"result": {
|
|
139
|
+
"id": "secret-id-123",
|
|
140
|
+
"name": "my_secret",
|
|
141
|
+
"created": "2025-01-11T12:00:00Z",
|
|
142
|
+
"scopes": ["workers"]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Error:
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"success": false,
|
|
151
|
+
"errors": [{"code": 10000, "message": "Name exists"}]
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## TypeScript Helpers
|
|
156
|
+
|
|
157
|
+
Official types available via `@cloudflare/workers-types`:
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
import type { SecretsStoreSecret } from "@cloudflare/workers-types";
|
|
161
|
+
|
|
162
|
+
interface Env {
|
|
163
|
+
STRIPE_API_KEY: SecretsStoreSecret;
|
|
164
|
+
DATABASE_URL: SecretsStoreSecret;
|
|
165
|
+
WORKER_SECRET: string; // Regular Worker secret (direct access)
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Custom helper type:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
interface SecretsStoreBinding {
|
|
173
|
+
get(): Promise<string>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Fallback helper
|
|
177
|
+
async function getSecretWithFallback(
|
|
178
|
+
primary: SecretsStoreBinding,
|
|
179
|
+
fallback?: SecretsStoreBinding
|
|
180
|
+
): Promise<string> {
|
|
181
|
+
try {
|
|
182
|
+
return await primary.get();
|
|
183
|
+
} catch (error) {
|
|
184
|
+
if (fallback) return await fallback.get();
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Batch helper
|
|
190
|
+
async function getAllSecrets(
|
|
191
|
+
secrets: Record<string, SecretsStoreBinding>
|
|
192
|
+
): Promise<Record<string, string>> {
|
|
193
|
+
const entries = await Promise.all(
|
|
194
|
+
Object.entries(secrets).map(async ([k, v]) => [k, await v.get()])
|
|
195
|
+
);
|
|
196
|
+
return Object.fromEntries(entries);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
See: [configuration.md](./configuration.md), [patterns.md](./patterns.md), [gotchas.md](./gotchas.md)
|