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,41 @@
|
|
|
1
|
+
# Cloudflare DDoS Protection
|
|
2
|
+
|
|
3
|
+
Autonomous, always-on protection against DDoS attacks across L3/4 and L7.
|
|
4
|
+
|
|
5
|
+
## Protection Types
|
|
6
|
+
|
|
7
|
+
- **HTTP DDoS (L7)**: Protects HTTP/HTTPS traffic, phase `ddos_l7`, zone/account level
|
|
8
|
+
- **Network DDoS (L3/4)**: UDP/SYN/DNS floods, phase `ddos_l4`, account level only
|
|
9
|
+
- **Adaptive DDoS**: Learns 7-day baseline, detects deviations, 4 profile types (Origins, User-Agents, Locations, Protocols)
|
|
10
|
+
|
|
11
|
+
## Plan Availability
|
|
12
|
+
|
|
13
|
+
| Feature | Free | Pro | Business | Enterprise | Enterprise Advanced |
|
|
14
|
+
|---------|------|-----|----------|------------|---------------------|
|
|
15
|
+
| HTTP DDoS (L7) | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
16
|
+
| Network DDoS (L3/4) | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
17
|
+
| Override rules | 1 | 1 | 1 | 1 | 10 |
|
|
18
|
+
| Custom expressions | ✗ | ✗ | ✗ | ✗ | ✓ |
|
|
19
|
+
| Log action | ✗ | ✗ | ✗ | ✗ | ✓ |
|
|
20
|
+
| Adaptive DDoS | ✗ | ✗ | ✗ | ✓ | ✓ |
|
|
21
|
+
| Alert filters | Basic | Basic | Basic | Advanced | Advanced |
|
|
22
|
+
|
|
23
|
+
## Actions & Sensitivity
|
|
24
|
+
|
|
25
|
+
- **Actions**: `block`, `managed_challenge`, `challenge`, `log` (Enterprise Advanced only)
|
|
26
|
+
- **Sensitivity**: `default` (high), `medium`, `low`, `eoff` (essentially off)
|
|
27
|
+
- **Override**: By category/tag or individual rule ID
|
|
28
|
+
- **Scope**: Zone-level overrides take precedence over account-level
|
|
29
|
+
|
|
30
|
+
## Reading Order
|
|
31
|
+
|
|
32
|
+
| File | Purpose | Start Here If... |
|
|
33
|
+
|------|---------|------------------|
|
|
34
|
+
| [configuration.md](./configuration.md) | Dashboard setup, rule structure, adaptive profiles | You're setting up DDoS protection for the first time |
|
|
35
|
+
| [api.md](./api.md) | API endpoints, SDK usage, ruleset ID discovery | You're automating configuration or need programmatic access |
|
|
36
|
+
| [patterns.md](./patterns.md) | Protection strategies, defense-in-depth, dynamic response | You need implementation patterns or layered security |
|
|
37
|
+
| [gotchas.md](./gotchas.md) | False positives, tuning, error handling | You're troubleshooting or optimizing existing protection |
|
|
38
|
+
|
|
39
|
+
## See Also
|
|
40
|
+
- [waf](../waf/) - Application-layer security rules
|
|
41
|
+
- [bot-management](../bot-management/) - Bot detection and mitigation
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# DDoS API
|
|
2
|
+
|
|
3
|
+
## Endpoints
|
|
4
|
+
|
|
5
|
+
### HTTP DDoS (L7)
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Zone-level
|
|
9
|
+
PUT /zones/{zoneId}/rulesets/phases/ddos_l7/entrypoint
|
|
10
|
+
GET /zones/{zoneId}/rulesets/phases/ddos_l7/entrypoint
|
|
11
|
+
|
|
12
|
+
// Account-level (Enterprise Advanced)
|
|
13
|
+
PUT /accounts/{accountId}/rulesets/phases/ddos_l7/entrypoint
|
|
14
|
+
GET /accounts/{accountId}/rulesets/phases/ddos_l7/entrypoint
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Network DDoS (L3/4)
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// Account-level only
|
|
21
|
+
PUT /accounts/{accountId}/rulesets/phases/ddos_l4/entrypoint
|
|
22
|
+
GET /accounts/{accountId}/rulesets/phases/ddos_l4/entrypoint
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## TypeScript SDK
|
|
26
|
+
|
|
27
|
+
**SDK Version**: Requires `cloudflare` >= 3.0.0 for ruleset phase methods.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import Cloudflare from "cloudflare";
|
|
31
|
+
|
|
32
|
+
const client = new Cloudflare({ apiToken: process.env.CLOUDFLARE_API_TOKEN });
|
|
33
|
+
|
|
34
|
+
// STEP 1: Discover managed ruleset ID (required for overrides)
|
|
35
|
+
const allRulesets = await client.rulesets.list({ zone_id: zoneId });
|
|
36
|
+
const ddosRuleset = allRulesets.result.find(
|
|
37
|
+
(r) => r.kind === "managed" && r.phase === "ddos_l7"
|
|
38
|
+
);
|
|
39
|
+
if (!ddosRuleset) throw new Error("DDoS managed ruleset not found");
|
|
40
|
+
const managedRulesetId = ddosRuleset.id;
|
|
41
|
+
|
|
42
|
+
// STEP 2: Get current HTTP DDoS configuration
|
|
43
|
+
const entrypointRuleset = await client.zones.rulesets.phases.entrypoint.get("ddos_l7", {
|
|
44
|
+
zone_id: zoneId,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// STEP 3: Update HTTP DDoS ruleset with overrides
|
|
48
|
+
await client.zones.rulesets.phases.entrypoint.update("ddos_l7", {
|
|
49
|
+
zone_id: zoneId,
|
|
50
|
+
rules: [
|
|
51
|
+
{
|
|
52
|
+
action: "execute",
|
|
53
|
+
expression: "true",
|
|
54
|
+
action_parameters: {
|
|
55
|
+
id: managedRulesetId, // From discovery step
|
|
56
|
+
overrides: {
|
|
57
|
+
sensitivity_level: "medium",
|
|
58
|
+
action: "managed_challenge",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Network DDoS (account level, L3/4)
|
|
66
|
+
const l4Rulesets = await client.rulesets.list({ account_id: accountId });
|
|
67
|
+
const l4DdosRuleset = l4Rulesets.result.find(
|
|
68
|
+
(r) => r.kind === "managed" && r.phase === "ddos_l4"
|
|
69
|
+
);
|
|
70
|
+
const l4Ruleset = await client.accounts.rulesets.phases.entrypoint.get("ddos_l4", {
|
|
71
|
+
account_id: accountId,
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Alert Configuration
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
interface DDoSAlertConfig {
|
|
79
|
+
name: string;
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
alert_type: "http_ddos_attack_alert" | "layer_3_4_ddos_attack_alert"
|
|
82
|
+
| "advanced_http_ddos_attack_alert" | "advanced_layer_3_4_ddos_attack_alert";
|
|
83
|
+
filters?: {
|
|
84
|
+
zones?: string[];
|
|
85
|
+
hostnames?: string[];
|
|
86
|
+
requests_per_second?: number;
|
|
87
|
+
packets_per_second?: number;
|
|
88
|
+
megabits_per_second?: number;
|
|
89
|
+
ip_prefixes?: string[]; // CIDR
|
|
90
|
+
ip_addresses?: string[];
|
|
91
|
+
protocols?: string[];
|
|
92
|
+
};
|
|
93
|
+
mechanisms: {
|
|
94
|
+
email?: Array<{ id: string }>;
|
|
95
|
+
webhooks?: Array<{ id: string }>;
|
|
96
|
+
pagerduty?: Array<{ id: string }>;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Create alert
|
|
101
|
+
await fetch(
|
|
102
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/alerting/v3/policies`,
|
|
103
|
+
{
|
|
104
|
+
method: "POST",
|
|
105
|
+
headers: {
|
|
106
|
+
Authorization: `Bearer ${apiToken}`,
|
|
107
|
+
"Content-Type": "application/json",
|
|
108
|
+
},
|
|
109
|
+
body: JSON.stringify(alertConfig),
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Typed Override Examples
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Override by category
|
|
118
|
+
interface CategoryOverride {
|
|
119
|
+
action: "execute";
|
|
120
|
+
expression: string;
|
|
121
|
+
action_parameters: {
|
|
122
|
+
id: string;
|
|
123
|
+
overrides: {
|
|
124
|
+
categories?: Array<{
|
|
125
|
+
category: "http-flood" | "http-anomaly" | "udp-flood" | "syn-flood";
|
|
126
|
+
sensitivity_level?: "default" | "medium" | "low" | "eoff";
|
|
127
|
+
action?: "block" | "managed_challenge" | "challenge" | "log";
|
|
128
|
+
}>;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Override by rule ID
|
|
134
|
+
interface RuleOverride {
|
|
135
|
+
action: "execute";
|
|
136
|
+
expression: string;
|
|
137
|
+
action_parameters: {
|
|
138
|
+
id: string;
|
|
139
|
+
overrides: {
|
|
140
|
+
rules?: Array<{
|
|
141
|
+
id: string;
|
|
142
|
+
action?: "block" | "managed_challenge" | "challenge" | "log";
|
|
143
|
+
sensitivity_level?: "default" | "medium" | "low" | "eoff";
|
|
144
|
+
}>;
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Example: Override specific adaptive rule
|
|
150
|
+
const adaptiveOverride: RuleOverride = {
|
|
151
|
+
action: "execute",
|
|
152
|
+
expression: "true",
|
|
153
|
+
action_parameters: {
|
|
154
|
+
id: managedRulesetId,
|
|
155
|
+
overrides: {
|
|
156
|
+
rules: [
|
|
157
|
+
{ id: "...adaptive-origins-rule-id...", sensitivity_level: "low" },
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
See [patterns.md](./patterns.md) for complete implementation patterns.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# DDoS Configuration
|
|
2
|
+
|
|
3
|
+
## Dashboard Setup
|
|
4
|
+
|
|
5
|
+
1. Navigate to Security > DDoS
|
|
6
|
+
2. Select HTTP DDoS or Network-layer DDoS
|
|
7
|
+
3. Configure sensitivity & action per ruleset/category/rule
|
|
8
|
+
4. Apply overrides with optional expressions (Enterprise Advanced)
|
|
9
|
+
5. Enable Adaptive DDoS toggle (Enterprise/Enterprise Advanced, requires 7 days traffic history)
|
|
10
|
+
|
|
11
|
+
## Rule Structure
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface DDoSOverride {
|
|
15
|
+
description: string;
|
|
16
|
+
rules: Array<{
|
|
17
|
+
action: "execute";
|
|
18
|
+
expression: string; // Custom expression (Enterprise Advanced) or "true" for all
|
|
19
|
+
action_parameters: {
|
|
20
|
+
id: string; // Managed ruleset ID (discover via api.md)
|
|
21
|
+
overrides: {
|
|
22
|
+
sensitivity_level?: "default" | "medium" | "low" | "eoff";
|
|
23
|
+
action?: "block" | "managed_challenge" | "challenge" | "log"; // log = Enterprise Advanced only
|
|
24
|
+
categories?: Array<{
|
|
25
|
+
category: string; // e.g., "http-flood", "udp-flood"
|
|
26
|
+
sensitivity_level?: string;
|
|
27
|
+
}>;
|
|
28
|
+
rules?: Array<{
|
|
29
|
+
id: string;
|
|
30
|
+
action?: string;
|
|
31
|
+
sensitivity_level?: string;
|
|
32
|
+
}>;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Expression Availability
|
|
40
|
+
|
|
41
|
+
| Plan | Custom Expressions | Example |
|
|
42
|
+
|------|-------------------|---------|
|
|
43
|
+
| Free/Pro/Business | ✗ | Use `"true"` only |
|
|
44
|
+
| Enterprise | ✗ | Use `"true"` only |
|
|
45
|
+
| Enterprise Advanced | ✓ | `ip.src in {...}`, `http.request.uri.path matches "..."` |
|
|
46
|
+
|
|
47
|
+
## Sensitivity Mapping
|
|
48
|
+
|
|
49
|
+
| UI | API | Threshold |
|
|
50
|
+
|----|-----|-----------|
|
|
51
|
+
| High | `default` | Most aggressive |
|
|
52
|
+
| Medium | `medium` | Balanced |
|
|
53
|
+
| Low | `low` | Less aggressive |
|
|
54
|
+
| Essentially Off | `eoff` | Minimal mitigation |
|
|
55
|
+
|
|
56
|
+
## Common Categories
|
|
57
|
+
|
|
58
|
+
- `http-flood`, `http-anomaly` (L7)
|
|
59
|
+
- `udp-flood`, `syn-flood`, `dns-flood` (L3/4)
|
|
60
|
+
|
|
61
|
+
## Override Precedence
|
|
62
|
+
|
|
63
|
+
Multiple override layers apply in this order (higher precedence wins):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Zone-level > Account-level
|
|
67
|
+
Individual Rule > Category > Global sensitivity/action
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Example**: Zone rule for `/api/*` overrides account-level global settings.
|
|
71
|
+
|
|
72
|
+
## Adaptive DDoS Profiles
|
|
73
|
+
|
|
74
|
+
**Availability**: Enterprise, Enterprise Advanced
|
|
75
|
+
**Learning period**: 7 days of traffic history required
|
|
76
|
+
|
|
77
|
+
| Profile Type | Description | Detects |
|
|
78
|
+
|--------------|-------------|---------|
|
|
79
|
+
| **Origins** | Traffic patterns per origin server | Anomalous requests to specific origins |
|
|
80
|
+
| **User-Agents** | Traffic patterns per User-Agent | Malicious/anomalous user agent strings |
|
|
81
|
+
| **Locations** | Traffic patterns per geo-location | Attacks from specific countries/regions |
|
|
82
|
+
| **Protocols** | Traffic patterns per protocol (L3/4) | Protocol-specific flood attacks |
|
|
83
|
+
|
|
84
|
+
Configure by targeting specific adaptive rule IDs via API (see api.md#typed-override-examples).
|
|
85
|
+
|
|
86
|
+
## Alerting
|
|
87
|
+
|
|
88
|
+
Configure via Notifications:
|
|
89
|
+
- Alert types: `http_ddos_attack_alert`, `layer_3_4_ddos_attack_alert`, `advanced_*` variants
|
|
90
|
+
- Filters: zones, hostnames, RPS/PPS/Mbps thresholds, IPs, protocols
|
|
91
|
+
- Mechanisms: email, webhooks, PagerDuty
|
|
92
|
+
|
|
93
|
+
See [api.md](./api.md#alert-configuration) for API examples.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# DDoS Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "False positives blocking legitimate traffic"
|
|
6
|
+
|
|
7
|
+
**Cause**: Sensitivity too high, wrong action, or missing exceptions
|
|
8
|
+
**Solution**:
|
|
9
|
+
1. Lower sensitivity for specific rule/category
|
|
10
|
+
2. Use `log` action first to validate (Enterprise Advanced)
|
|
11
|
+
3. Add exception with custom expression (e.g., allowlist IPs)
|
|
12
|
+
4. Query flagged requests via GraphQL Analytics API to identify patterns
|
|
13
|
+
|
|
14
|
+
### "Attacks getting through"
|
|
15
|
+
|
|
16
|
+
**Cause**: Sensitivity too low or wrong action
|
|
17
|
+
**Solution**: Increase to `default` sensitivity and use `block` action:
|
|
18
|
+
```typescript
|
|
19
|
+
const config = {
|
|
20
|
+
rules: [{
|
|
21
|
+
expression: "true",
|
|
22
|
+
action: "execute",
|
|
23
|
+
action_parameters: { id: managedRulesetId, overrides: { sensitivity_level: "default", action: "block" } },
|
|
24
|
+
}],
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### "Adaptive rules not working"
|
|
29
|
+
|
|
30
|
+
**Cause**: Insufficient traffic history (needs 7 days)
|
|
31
|
+
**Solution**: Wait for baseline to establish, check dashboard for adaptive rule status
|
|
32
|
+
|
|
33
|
+
### "Zone override ignored"
|
|
34
|
+
|
|
35
|
+
**Cause**: Account overrides conflict with zone overrides
|
|
36
|
+
**Solution**: Configure at zone level OR remove zone overrides to use account-level
|
|
37
|
+
|
|
38
|
+
### "Log action not available"
|
|
39
|
+
|
|
40
|
+
**Cause**: Not on Enterprise Advanced DDoS plan
|
|
41
|
+
**Solution**: Use `managed_challenge` with low sensitivity for testing
|
|
42
|
+
|
|
43
|
+
### "Rule limit exceeded"
|
|
44
|
+
|
|
45
|
+
**Cause**: Too many override rules (Free/Pro/Business: 1, Enterprise Advanced: 10)
|
|
46
|
+
**Solution**: Combine conditions in single expression using `and`/`or`
|
|
47
|
+
|
|
48
|
+
### "Cannot override rule"
|
|
49
|
+
|
|
50
|
+
**Cause**: Rule is read-only
|
|
51
|
+
**Solution**: Check API response for read-only indicator, use different rule
|
|
52
|
+
|
|
53
|
+
### "Cannot disable DDoS protection"
|
|
54
|
+
|
|
55
|
+
**Cause**: DDoS managed rulesets cannot be fully disabled (always-on protection)
|
|
56
|
+
**Solution**: Set `sensitivity_level: "eoff"` for minimal mitigation
|
|
57
|
+
|
|
58
|
+
### "Expression not allowed"
|
|
59
|
+
|
|
60
|
+
**Cause**: Custom expressions require Enterprise Advanced plan
|
|
61
|
+
**Solution**: Use `expression: "true"` for all traffic, or upgrade plan
|
|
62
|
+
|
|
63
|
+
### "Managed ruleset not found"
|
|
64
|
+
|
|
65
|
+
**Cause**: Zone/account doesn't have DDoS managed ruleset, or incorrect phase
|
|
66
|
+
**Solution**: Verify ruleset exists via `client.rulesets.list()`, check phase name (`ddos_l7` or `ddos_l4`)
|
|
67
|
+
|
|
68
|
+
## API Error Codes
|
|
69
|
+
|
|
70
|
+
| Error Code | Message | Cause | Solution |
|
|
71
|
+
|------------|---------|-------|----------|
|
|
72
|
+
| 10000 | Authentication error | Invalid/missing API token | Check token has DDoS permissions |
|
|
73
|
+
| 81000 | Ruleset validation failed | Invalid rule structure | Verify `action_parameters.id` is managed ruleset ID |
|
|
74
|
+
| 81020 | Expression not allowed | Custom expressions on wrong plan | Use `"true"` or upgrade to Enterprise Advanced |
|
|
75
|
+
| 81021 | Rule limit exceeded | Too many override rules | Reduce rules or upgrade (Enterprise Advanced: 10) |
|
|
76
|
+
| 81022 | Invalid sensitivity level | Wrong sensitivity value | Use: `default`, `medium`, `low`, `eoff` |
|
|
77
|
+
| 81023 | Invalid action | Wrong action for plan | Enterprise Advanced only: `log` action |
|
|
78
|
+
|
|
79
|
+
## Limits
|
|
80
|
+
|
|
81
|
+
| Resource/Limit | Free/Pro/Business | Enterprise | Enterprise Advanced |
|
|
82
|
+
|----------------|-------------------|------------|---------------------|
|
|
83
|
+
| Override rules per zone | 1 | 1 | 10 |
|
|
84
|
+
| Custom expressions | ✗ | ✗ | ✓ |
|
|
85
|
+
| Log action | ✗ | ✗ | ✓ |
|
|
86
|
+
| Adaptive DDoS | ✗ | ✓ | ✓ |
|
|
87
|
+
| Traffic history required | - | 7 days | 7 days |
|
|
88
|
+
|
|
89
|
+
## Tuning Strategy
|
|
90
|
+
|
|
91
|
+
1. Start with `log` action + `medium` sensitivity
|
|
92
|
+
2. Monitor for 24-48 hours
|
|
93
|
+
3. Identify false positives, add exceptions
|
|
94
|
+
4. Gradually increase to `default` sensitivity
|
|
95
|
+
5. Change action from `log` → `managed_challenge` → `block`
|
|
96
|
+
6. Document all adjustments
|
|
97
|
+
|
|
98
|
+
## Best Practices
|
|
99
|
+
|
|
100
|
+
- Test during low-traffic periods
|
|
101
|
+
- Use zone-level for per-site tuning
|
|
102
|
+
- Reference IP lists for easier management
|
|
103
|
+
- Set appropriate alert thresholds (avoid noise)
|
|
104
|
+
- Combine with WAF for layered defense
|
|
105
|
+
- Avoid over-tuning (keep config simple)
|
|
106
|
+
|
|
107
|
+
See [patterns.md](./patterns.md) for progressive rollout examples.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# DDoS Protection Patterns
|
|
2
|
+
|
|
3
|
+
## Allowlist Trusted IPs
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const config = {
|
|
7
|
+
description: "Allowlist trusted IPs",
|
|
8
|
+
rules: [{
|
|
9
|
+
expression: "ip.src in { 203.0.113.0/24 192.0.2.1 }",
|
|
10
|
+
action: "execute",
|
|
11
|
+
action_parameters: {
|
|
12
|
+
id: managedRulesetId,
|
|
13
|
+
overrides: { sensitivity_level: "eoff" },
|
|
14
|
+
},
|
|
15
|
+
}],
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
await client.accounts.rulesets.phases.entrypoint.update("ddos_l7", {
|
|
19
|
+
account_id: accountId,
|
|
20
|
+
...config,
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Route-specific Sensitivity
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
const config = {
|
|
28
|
+
description: "Route-specific protection",
|
|
29
|
+
rules: [
|
|
30
|
+
{
|
|
31
|
+
expression: "not http.request.uri.path matches \"^/api/\"",
|
|
32
|
+
action: "execute",
|
|
33
|
+
action_parameters: {
|
|
34
|
+
id: managedRulesetId,
|
|
35
|
+
overrides: { sensitivity_level: "default", action: "block" },
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
expression: "http.request.uri.path matches \"^/api/\"",
|
|
40
|
+
action: "execute",
|
|
41
|
+
action_parameters: {
|
|
42
|
+
id: managedRulesetId,
|
|
43
|
+
overrides: { sensitivity_level: "low", action: "managed_challenge" },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Progressive Enhancement
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
enum ProtectionLevel { MONITORING = "monitoring", LOW = "low", MEDIUM = "medium", HIGH = "high" }
|
|
54
|
+
|
|
55
|
+
const levelConfig = {
|
|
56
|
+
[ProtectionLevel.MONITORING]: { action: "log", sensitivity: "eoff" },
|
|
57
|
+
[ProtectionLevel.LOW]: { action: "managed_challenge", sensitivity: "low" },
|
|
58
|
+
[ProtectionLevel.MEDIUM]: { action: "managed_challenge", sensitivity: "medium" },
|
|
59
|
+
[ProtectionLevel.HIGH]: { action: "block", sensitivity: "default" },
|
|
60
|
+
} as const;
|
|
61
|
+
|
|
62
|
+
async function setProtectionLevel(zoneId: string, level: ProtectionLevel, rulesetId: string, client: Cloudflare) {
|
|
63
|
+
const settings = levelConfig[level];
|
|
64
|
+
return client.zones.rulesets.phases.entrypoint.update("ddos_l7", {
|
|
65
|
+
zone_id: zoneId,
|
|
66
|
+
rules: [{
|
|
67
|
+
expression: "true",
|
|
68
|
+
action: "execute",
|
|
69
|
+
action_parameters: { id: rulesetId, overrides: { action: settings.action, sensitivity_level: settings.sensitivity } },
|
|
70
|
+
}],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Dynamic Response to Attacks
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
interface Env { CLOUDFLARE_API_TOKEN: string; ZONE_ID: string; KV: KVNamespace; }
|
|
79
|
+
|
|
80
|
+
export default {
|
|
81
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
82
|
+
if (request.url.includes("/attack-detected")) {
|
|
83
|
+
const attackData = await request.json();
|
|
84
|
+
await env.KV.put(`attack:${Date.now()}`, JSON.stringify(attackData), { expirationTtl: 86400 });
|
|
85
|
+
const recentAttacks = await getRecentAttacks(env.KV);
|
|
86
|
+
if (recentAttacks.length > 5) {
|
|
87
|
+
await setProtectionLevel(env.ZONE_ID, ProtectionLevel.HIGH, managedRulesetId, client);
|
|
88
|
+
return new Response("Protection increased");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return new Response("OK");
|
|
92
|
+
},
|
|
93
|
+
async scheduled(event: ScheduledEvent, env: Env): Promise<void> {
|
|
94
|
+
const recentAttacks = await getRecentAttacks(env.KV);
|
|
95
|
+
if (recentAttacks.length === 0) await setProtectionLevel(env.ZONE_ID, ProtectionLevel.MEDIUM, managedRulesetId, client);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Multi-rule Tiered Protection (Enterprise Advanced)
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
const config = {
|
|
104
|
+
description: "Multi-tier DDoS protection",
|
|
105
|
+
rules: [
|
|
106
|
+
{
|
|
107
|
+
expression: "not ip.src in $known_ips and not cf.bot_management.score gt 30",
|
|
108
|
+
action: "execute",
|
|
109
|
+
action_parameters: { id: managedRulesetId, overrides: { sensitivity_level: "default", action: "block" } },
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
expression: "cf.bot_management.verified_bot",
|
|
113
|
+
action: "execute",
|
|
114
|
+
action_parameters: { id: managedRulesetId, overrides: { sensitivity_level: "medium", action: "managed_challenge" } },
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
expression: "ip.src in $trusted_ips",
|
|
118
|
+
action: "execute",
|
|
119
|
+
action_parameters: { id: managedRulesetId, overrides: { sensitivity_level: "low" } },
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Defense in Depth
|
|
126
|
+
|
|
127
|
+
Layered security stack: DDoS + WAF + Rate Limiting + Bot Management.
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// Layer 1: DDoS (volumetric attacks)
|
|
131
|
+
await client.zones.rulesets.phases.entrypoint.update("ddos_l7", {
|
|
132
|
+
zone_id: zoneId,
|
|
133
|
+
rules: [{ expression: "true", action: "execute", action_parameters: { id: ddosRulesetId, overrides: { sensitivity_level: "medium" } } }],
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Layer 2: WAF (exploit protection)
|
|
137
|
+
await client.zones.rulesets.phases.entrypoint.update("http_request_firewall_managed", {
|
|
138
|
+
zone_id: zoneId,
|
|
139
|
+
rules: [{ expression: "true", action: "execute", action_parameters: { id: wafRulesetId } }],
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Layer 3: Rate Limiting (abuse prevention)
|
|
143
|
+
await client.zones.rulesets.phases.entrypoint.update("http_ratelimit", {
|
|
144
|
+
zone_id: zoneId,
|
|
145
|
+
rules: [{ expression: "http.request.uri.path eq \"/api/login\"", action: "block", ratelimit: { characteristics: ["ip.src"], period: 60, requests_per_period: 5 } }],
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Layer 4: Bot Management (automation detection)
|
|
149
|
+
await client.zones.rulesets.phases.entrypoint.update("http_request_sbfm", {
|
|
150
|
+
zone_id: zoneId,
|
|
151
|
+
rules: [{ expression: "cf.bot_management.score lt 30", action: "managed_challenge" }],
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Cache Strategy for DDoS Mitigation
|
|
156
|
+
|
|
157
|
+
Exclude query strings from cache key to counter randomized query parameter attacks.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
const cacheRule = {
|
|
161
|
+
expression: "http.request.uri.path matches \"^/api/\"",
|
|
162
|
+
action: "set_cache_settings",
|
|
163
|
+
action_parameters: {
|
|
164
|
+
cache: true,
|
|
165
|
+
cache_key: { ignore_query_strings_order: true, custom_key: { query_string: { exclude: { all: true } } } },
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
await client.zones.rulesets.phases.entrypoint.update("http_request_cache_settings", { zone_id: zoneId, rules: [cacheRule] });
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Rationale**: Attackers randomize query strings (`?random=123456`) to bypass cache. Excluding query params ensures cache hits absorb attack traffic.
|
|
173
|
+
|
|
174
|
+
See [configuration.md](./configuration.md) for rule structure details.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Cloudflare Durable Objects Storage
|
|
2
|
+
|
|
3
|
+
Persistent storage API for Durable Objects with SQLite and KV backends, PITR, and automatic concurrency control.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
DO Storage provides:
|
|
8
|
+
- SQLite-backed (recommended) or KV-backed
|
|
9
|
+
- SQL API + synchronous/async KV APIs
|
|
10
|
+
- Automatic input/output gates (race-free)
|
|
11
|
+
- 30-day point-in-time recovery (PITR)
|
|
12
|
+
- Transactions and alarms
|
|
13
|
+
|
|
14
|
+
**Use cases:** Stateful coordination, real-time collaboration, counters, sessions, rate limiters
|
|
15
|
+
|
|
16
|
+
**Billing:** Charged by request, GB-month storage, and rowsRead/rowsWritten for SQL operations
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
export class Counter extends DurableObject {
|
|
22
|
+
sql: SqlStorage;
|
|
23
|
+
|
|
24
|
+
constructor(ctx: DurableObjectState, env: Env) {
|
|
25
|
+
super(ctx, env);
|
|
26
|
+
this.sql = ctx.storage.sql;
|
|
27
|
+
this.sql.exec('CREATE TABLE IF NOT EXISTS data(key TEXT PRIMARY KEY, value INTEGER)');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async increment(): Promise<number> {
|
|
31
|
+
const result = this.sql.exec(
|
|
32
|
+
'INSERT INTO data VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = value + 1 RETURNING value',
|
|
33
|
+
'counter', 1
|
|
34
|
+
).one();
|
|
35
|
+
return result?.value || 1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Storage Backends
|
|
41
|
+
|
|
42
|
+
| Backend | Create Method | APIs | PITR |
|
|
43
|
+
|---------|---------------|------|------|
|
|
44
|
+
| SQLite (recommended) | `new_sqlite_classes` | SQL + sync KV + async KV | ✅ |
|
|
45
|
+
| KV (legacy) | `new_classes` | async KV only | ❌ |
|
|
46
|
+
|
|
47
|
+
## Core APIs
|
|
48
|
+
|
|
49
|
+
- **SQL API** (`ctx.storage.sql`): Full SQLite with extensions (FTS5, JSON, math)
|
|
50
|
+
- **Sync KV** (`ctx.storage.kv`): Synchronous key-value (SQLite only)
|
|
51
|
+
- **Async KV** (`ctx.storage`): Asynchronous key-value (both backends)
|
|
52
|
+
- **Transactions** (`transactionSync()`, `transaction()`)
|
|
53
|
+
- **PITR** (`getBookmarkForTime()`, `onNextSessionRestoreBookmark()`)
|
|
54
|
+
- **Alarms** (`setAlarm()`, `alarm()` handler)
|
|
55
|
+
|
|
56
|
+
## Reading Order
|
|
57
|
+
|
|
58
|
+
**New to DO storage:** configuration.md → api.md → patterns.md → gotchas.md
|
|
59
|
+
**Building features:** patterns.md → api.md → gotchas.md
|
|
60
|
+
**Debugging issues:** gotchas.md → api.md
|
|
61
|
+
**Writing tests:** testing.md
|
|
62
|
+
|
|
63
|
+
## In This Reference
|
|
64
|
+
|
|
65
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc migrations, SQLite vs KV setup, RPC binding
|
|
66
|
+
- [api.md](./api.md) - SQL exec/cursors, KV methods, storage options, transactions, alarms, PITR
|
|
67
|
+
- [patterns.md](./patterns.md) - Schema migrations, caching, rate limiting, batch processing, parent-child coordination
|
|
68
|
+
- [gotchas.md](./gotchas.md) - Concurrency gates, INTEGER precision, transaction rules, SQL limits
|
|
69
|
+
- [testing.md](./testing.md) - vitest-pool-workers setup, testing DOs with SQL/alarms/PITR
|
|
70
|
+
|
|
71
|
+
## See Also
|
|
72
|
+
|
|
73
|
+
- [durable-objects](../durable-objects/) - DO fundamentals and coordination patterns
|
|
74
|
+
- [workers](../workers/) - Worker runtime for DO stubs
|
|
75
|
+
- [d1](../d1/) - Shared database alternative to per-DO storage
|