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,143 @@
|
|
|
1
|
+
# Function API
|
|
2
|
+
|
|
3
|
+
## EventContext
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface EventContext<Env = any> {
|
|
7
|
+
request: Request; // Incoming request
|
|
8
|
+
functionPath: string; // Request path
|
|
9
|
+
waitUntil(promise: Promise<any>): void; // Background tasks (non-blocking)
|
|
10
|
+
passThroughOnException(): void; // Fallback to static on error
|
|
11
|
+
next(input?: Request | string, init?: RequestInit): Promise<Response>;
|
|
12
|
+
env: Env; // Bindings, vars, secrets
|
|
13
|
+
params: Record<string, string | string[]>; // Route params ([user] or [[catchall]])
|
|
14
|
+
data: any; // Middleware shared state
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**TypeScript:** See [configuration.md](./configuration.md) for `wrangler types` setup
|
|
19
|
+
|
|
20
|
+
## Handlers
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// Generic (fallback for any method)
|
|
24
|
+
export async function onRequest(ctx: EventContext): Promise<Response> {
|
|
25
|
+
return new Response('Any method');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Method-specific (takes precedence over generic)
|
|
29
|
+
export async function onRequestGet(ctx: EventContext): Promise<Response> {
|
|
30
|
+
return Response.json({ message: 'GET' });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function onRequestPost(ctx: EventContext): Promise<Response> {
|
|
34
|
+
const body = await ctx.request.json();
|
|
35
|
+
return Response.json({ received: body });
|
|
36
|
+
}
|
|
37
|
+
// Also: onRequestPut, onRequestPatch, onRequestDelete, onRequestHead, onRequestOptions
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Bindings Reference
|
|
41
|
+
|
|
42
|
+
| Binding Type | Interface | Config Key | Use Case |
|
|
43
|
+
|--------------|-----------|------------|----------|
|
|
44
|
+
| KV | `KVNamespace` | `kv_namespaces` | Key-value cache, sessions, config |
|
|
45
|
+
| D1 | `D1Database` | `d1_databases` | Relational data, SQL queries |
|
|
46
|
+
| R2 | `R2Bucket` | `r2_buckets` | Large files, user uploads, assets |
|
|
47
|
+
| Durable Objects | `DurableObjectNamespace` | `durable_objects.bindings` | Stateful coordination, websockets |
|
|
48
|
+
| Workers AI | `Ai` | `ai.binding` | LLM inference, embeddings |
|
|
49
|
+
| Vectorize | `VectorizeIndex` | `vectorize` | Vector search, embeddings |
|
|
50
|
+
| Service Binding | `Fetcher` | `services` | Worker-to-worker RPC |
|
|
51
|
+
| Analytics Engine | `AnalyticsEngineDataset` | `analytics_engine_datasets` | Event logging, metrics |
|
|
52
|
+
| Environment Vars | `string` | `vars` | Non-sensitive config |
|
|
53
|
+
|
|
54
|
+
See [configuration.md](./configuration.md) for wrangler.jsonc examples.
|
|
55
|
+
|
|
56
|
+
## Bindings
|
|
57
|
+
|
|
58
|
+
### KV
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
interface Env { KV: KVNamespace; }
|
|
62
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
63
|
+
await ctx.env.KV.put('key', 'value', { expirationTtl: 3600 });
|
|
64
|
+
const val = await ctx.env.KV.get('key', { type: 'json' });
|
|
65
|
+
const keys = await ctx.env.KV.list({ prefix: 'user:' });
|
|
66
|
+
return Response.json({ val });
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### D1
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
interface Env { DB: D1Database; }
|
|
74
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
75
|
+
const user = await ctx.env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(123).first();
|
|
76
|
+
return Response.json(user);
|
|
77
|
+
};
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### R2
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
interface Env { BUCKET: R2Bucket; }
|
|
84
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
85
|
+
const obj = await ctx.env.BUCKET.get('file.txt');
|
|
86
|
+
if (!obj) return new Response('Not found', { status: 404 });
|
|
87
|
+
await ctx.env.BUCKET.put('file.txt', ctx.request.body);
|
|
88
|
+
return new Response(obj.body);
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Durable Objects
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
interface Env { COUNTER: DurableObjectNamespace; }
|
|
96
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
97
|
+
const stub = ctx.env.COUNTER.get(ctx.env.COUNTER.idFromName('global'));
|
|
98
|
+
return stub.fetch(ctx.request);
|
|
99
|
+
};
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Workers AI
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
interface Env { AI: Ai; }
|
|
106
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
107
|
+
const resp = await ctx.env.AI.run('@cf/meta/llama-3.1-8b-instruct', { prompt: 'Hello' });
|
|
108
|
+
return Response.json(resp);
|
|
109
|
+
};
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Service Bindings & Env Vars
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
interface Env { AUTH: Fetcher; API_KEY: string; }
|
|
116
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
117
|
+
// Service binding: forward to another Worker
|
|
118
|
+
return ctx.env.AUTH.fetch(ctx.request);
|
|
119
|
+
|
|
120
|
+
// Environment variable
|
|
121
|
+
return Response.json({ key: ctx.env.API_KEY });
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Advanced Mode (env.ASSETS)
|
|
126
|
+
|
|
127
|
+
When using `_worker.js`, access static assets via `env.ASSETS.fetch()`:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
interface Env { ASSETS: Fetcher; KV: KVNamespace; }
|
|
131
|
+
|
|
132
|
+
export default {
|
|
133
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
134
|
+
const url = new URL(request.url);
|
|
135
|
+
if (url.pathname.startsWith('/api/')) {
|
|
136
|
+
return Response.json({ data: await env.KV.get('key') });
|
|
137
|
+
}
|
|
138
|
+
return env.ASSETS.fetch(request); // Fallback to static
|
|
139
|
+
}
|
|
140
|
+
} satisfies ExportedHandler<Env>;
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**See also:** [configuration.md](./configuration.md) for TypeScript setup and wrangler.jsonc | [patterns.md](./patterns.md) for middleware and auth patterns
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## TypeScript Setup
|
|
4
|
+
|
|
5
|
+
**Generate types from wrangler.jsonc** (replaces deprecated `@cloudflare/workers-types`):
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx wrangler types
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Creates `worker-configuration.d.ts` with typed `Env` interface based on your bindings.
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// functions/api.ts
|
|
15
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => {
|
|
16
|
+
// ctx.env.KV, ctx.env.DB, etc. are fully typed
|
|
17
|
+
return Response.json({ ok: true });
|
|
18
|
+
};
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Manual types** (if not using wrangler types):
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
interface Env {
|
|
25
|
+
KV: KVNamespace;
|
|
26
|
+
DB: D1Database;
|
|
27
|
+
API_KEY: string;
|
|
28
|
+
}
|
|
29
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => { /* ... */ };
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## wrangler.jsonc
|
|
33
|
+
|
|
34
|
+
```jsonc
|
|
35
|
+
{
|
|
36
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
37
|
+
"name": "my-pages-app",
|
|
38
|
+
"pages_build_output_dir": "./dist",
|
|
39
|
+
"compatibility_date": "2025-01-01",
|
|
40
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
41
|
+
|
|
42
|
+
"vars": { "API_URL": "https://api.example.com" },
|
|
43
|
+
"kv_namespaces": [{ "binding": "KV", "id": "abc123" }],
|
|
44
|
+
"d1_databases": [{ "binding": "DB", "database_name": "prod-db", "database_id": "xyz789" }],
|
|
45
|
+
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }],
|
|
46
|
+
"durable_objects": { "bindings": [{ "name": "COUNTER", "class_name": "Counter", "script_name": "counter-worker" }] },
|
|
47
|
+
"services": [{ "binding": "AUTH", "service": "auth-worker" }],
|
|
48
|
+
"ai": { "binding": "AI" },
|
|
49
|
+
"vectorize": [{ "binding": "VECTORIZE", "index_name": "my-index" }],
|
|
50
|
+
"analytics_engine_datasets": [{ "binding": "ANALYTICS" }]
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Environment Overrides
|
|
55
|
+
|
|
56
|
+
Top-level → local dev, `env.preview` → preview, `env.production` → production
|
|
57
|
+
|
|
58
|
+
```jsonc
|
|
59
|
+
{
|
|
60
|
+
"vars": { "API_URL": "http://localhost:8787" },
|
|
61
|
+
"env": {
|
|
62
|
+
"production": { "vars": { "API_URL": "https://api.example.com" } }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Note:** If overriding `vars`, `kv_namespaces`, `d1_databases`, etc., ALL must be redefined (non-inheritable)
|
|
68
|
+
|
|
69
|
+
## Local Secrets (.dev.vars)
|
|
70
|
+
|
|
71
|
+
**Local dev only** - NOT deployed:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# .dev.vars (add to .gitignore)
|
|
75
|
+
SECRET_KEY="my-secret-value"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Accessed via `ctx.env.SECRET_KEY`. Set production secrets:
|
|
79
|
+
```bash
|
|
80
|
+
echo "value" | npx wrangler pages secret put SECRET_KEY --project-name=my-app
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Static Config Files
|
|
84
|
+
|
|
85
|
+
**_routes.json** - Custom routing:
|
|
86
|
+
```json
|
|
87
|
+
{ "version": 1, "include": ["/api/*"], "exclude": ["/static/*"] }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**_headers** - Static headers:
|
|
91
|
+
```
|
|
92
|
+
/static/*
|
|
93
|
+
Cache-Control: public, max-age=31536000
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**_redirects** - Redirects:
|
|
97
|
+
```
|
|
98
|
+
/old /new 301
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Local Dev & Deployment
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Dev server
|
|
105
|
+
npx wrangler pages dev ./dist
|
|
106
|
+
|
|
107
|
+
# With bindings
|
|
108
|
+
npx wrangler pages dev ./dist --kv=KV --d1=DB=db-id --r2=BUCKET
|
|
109
|
+
|
|
110
|
+
# Durable Objects (2 terminals)
|
|
111
|
+
cd do-worker && npx wrangler dev
|
|
112
|
+
cd pages-project && npx wrangler pages dev ./dist --do COUNTER=Counter@do-worker
|
|
113
|
+
|
|
114
|
+
# Deploy
|
|
115
|
+
npx wrangler pages deploy ./dist
|
|
116
|
+
npx wrangler pages deploy ./dist --branch preview
|
|
117
|
+
|
|
118
|
+
# Download config
|
|
119
|
+
npx wrangler pages download config my-project
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**See also:** [api.md](./api.md) for binding usage examples
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Gotchas & Debugging
|
|
2
|
+
|
|
3
|
+
## Error Diagnosis
|
|
4
|
+
|
|
5
|
+
| Symptom | Likely Cause | Solution |
|
|
6
|
+
|---------|--------------|----------|
|
|
7
|
+
| **Function not invoking** | Wrong `/functions` location, wrong extension, or `_routes.json` excludes path | Check `pages_build_output_dir`, use `.js`/`.ts`, verify `_routes.json` |
|
|
8
|
+
| **`ctx.env.BINDING` undefined** | Binding not configured or name mismatch | Add to `wrangler.jsonc`, verify exact name (case-sensitive), redeploy |
|
|
9
|
+
| **TypeScript errors on `ctx.env`** | Missing type definition | Run `wrangler types` or define `interface Env {}` |
|
|
10
|
+
| **Middleware not running** | Wrong filename/location or missing `ctx.next()` | Name exactly `_middleware.js`, export `onRequest`, call `ctx.next()` |
|
|
11
|
+
| **Secrets missing in production** | `.dev.vars` not deployed | `.dev.vars` is local only - set production secrets via dashboard or `wrangler secret put` |
|
|
12
|
+
| **Type mismatch on binding** | Wrong interface type | See [api.md](./api.md) bindings table for correct types |
|
|
13
|
+
| **"KV key not found" but exists** | Key in wrong namespace or env | Verify namespace binding, check preview vs production env |
|
|
14
|
+
| **Function times out** | Synchronous wait or missing `await` | All I/O must be async/await, use `ctx.waitUntil()` for background tasks |
|
|
15
|
+
|
|
16
|
+
## Common Errors
|
|
17
|
+
|
|
18
|
+
### TypeScript type errors
|
|
19
|
+
|
|
20
|
+
**Problem:** `ctx.env.MY_BINDING` shows type error
|
|
21
|
+
**Cause:** No type definition for `Env`
|
|
22
|
+
**Solution:** Run `npx wrangler types` or manually define:
|
|
23
|
+
```typescript
|
|
24
|
+
interface Env { MY_BINDING: KVNamespace; }
|
|
25
|
+
export const onRequest: PagesFunction<Env> = async (ctx) => { /* ... */ };
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Secrets not available in production
|
|
29
|
+
|
|
30
|
+
**Problem:** `ctx.env.SECRET_KEY` is undefined in production
|
|
31
|
+
**Cause:** `.dev.vars` is local-only, not deployed
|
|
32
|
+
**Solution:** Set production secrets:
|
|
33
|
+
```bash
|
|
34
|
+
echo "value" | npx wrangler pages secret put SECRET_KEY --project-name=my-app
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Debugging
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// Console logging
|
|
41
|
+
export async function onRequest(ctx) {
|
|
42
|
+
console.log('Request:', ctx.request.method, ctx.request.url);
|
|
43
|
+
const res = await ctx.next();
|
|
44
|
+
console.log('Status:', res.status);
|
|
45
|
+
return res;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Stream real-time logs
|
|
51
|
+
npx wrangler pages deployment tail
|
|
52
|
+
npx wrangler pages deployment tail --status error
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
// Source maps (wrangler.jsonc)
|
|
57
|
+
{ "upload_source_maps": true }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Limits
|
|
61
|
+
|
|
62
|
+
| Resource | Free | Paid |
|
|
63
|
+
|----------|------|------|
|
|
64
|
+
| CPU time | 10ms | 30s (default), 5min (max) |
|
|
65
|
+
| Memory | 128 MB | 128 MB |
|
|
66
|
+
| Script size | 10 MB compressed | 10 MB compressed |
|
|
67
|
+
| Env vars | 5 KB per var, 64 max | 5 KB per var, 64 max |
|
|
68
|
+
| Requests | 100k/day | Unlimited ($0.50/million) |
|
|
69
|
+
|
|
70
|
+
## Best Practices
|
|
71
|
+
|
|
72
|
+
**Performance:** Minimize deps (cold start), use KV for cache/D1 for relational/R2 for large files, set `Cache-Control` headers, batch DB ops, handle errors gracefully
|
|
73
|
+
|
|
74
|
+
**Security:** Never commit secrets (use `.dev.vars` + gitignore), validate input, sanitize before DB, implement auth middleware, set CORS headers, rate limit per-IP
|
|
75
|
+
|
|
76
|
+
## Migration
|
|
77
|
+
|
|
78
|
+
**Workers → Pages Functions:**
|
|
79
|
+
- `export default { fetch(req, env) {} }` → `export function onRequest(ctx) { const { request, env } = ctx; }`
|
|
80
|
+
- Use `_worker.js` for complex routing: `env.ASSETS.fetch(request)` for static files
|
|
81
|
+
|
|
82
|
+
**Other platforms → Pages:**
|
|
83
|
+
- File-based routing: `/functions/api/users.js` → `/api/users`
|
|
84
|
+
- Dynamic routes: `[param]` not `:param`
|
|
85
|
+
- Replace Node.js deps with Workers APIs or add `nodejs_compat` flag
|
|
86
|
+
|
|
87
|
+
## Resources
|
|
88
|
+
|
|
89
|
+
- [Official Docs](https://developers.cloudflare.com/pages/functions/)
|
|
90
|
+
- [Workers APIs](https://developers.cloudflare.com/workers/runtime-apis/)
|
|
91
|
+
- [Examples](https://github.com/cloudflare/pages-example-projects)
|
|
92
|
+
- [Discord](https://discord.gg/cloudflaredev)
|
|
93
|
+
|
|
94
|
+
**See also:** [configuration.md](./configuration.md) for TypeScript setup | [patterns.md](./patterns.md) for middleware/auth | [api.md](./api.md) for bindings
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Common Patterns
|
|
2
|
+
|
|
3
|
+
## Background Tasks (waitUntil)
|
|
4
|
+
|
|
5
|
+
Non-blocking tasks after response sent (analytics, cleanup, webhooks):
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
export async function onRequest(ctx: EventContext<Env>) {
|
|
9
|
+
const res = Response.json({ success: true });
|
|
10
|
+
|
|
11
|
+
ctx.waitUntil(ctx.env.KV.put('last-visit', new Date().toISOString()));
|
|
12
|
+
ctx.waitUntil(Promise.all([
|
|
13
|
+
ctx.env.ANALYTICS.writeDataPoint({ event: 'view' }),
|
|
14
|
+
fetch('https://webhook.site/...', { method: 'POST' })
|
|
15
|
+
]));
|
|
16
|
+
|
|
17
|
+
return res; // Returned immediately
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Middleware & Auth
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// functions/_middleware.js (global) or functions/users/_middleware.js (scoped)
|
|
25
|
+
export async function onRequest(ctx) {
|
|
26
|
+
try { return await ctx.next(); }
|
|
27
|
+
catch (err) { return new Response(err.message, { status: 500 }); }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Chained: export const onRequest = [errorHandler, auth, logger];
|
|
31
|
+
|
|
32
|
+
// Auth
|
|
33
|
+
async function auth(ctx: EventContext<Env>) {
|
|
34
|
+
const token = ctx.request.headers.get('authorization')?.replace('Bearer ', '');
|
|
35
|
+
if (!token) return new Response('Unauthorized', { status: 401 });
|
|
36
|
+
const session = await ctx.env.KV.get(`session:${token}`);
|
|
37
|
+
if (!session) return new Response('Invalid', { status: 401 });
|
|
38
|
+
ctx.data.user = JSON.parse(session);
|
|
39
|
+
return ctx.next();
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## CORS & Rate Limiting
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// CORS middleware
|
|
47
|
+
const cors = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST' };
|
|
48
|
+
export async function onRequestOptions() { return new Response(null, { headers: cors }); }
|
|
49
|
+
export async function onRequest(ctx) {
|
|
50
|
+
const res = await ctx.next();
|
|
51
|
+
Object.entries(cors).forEach(([k, v]) => res.headers.set(k, v));
|
|
52
|
+
return res;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Rate limiting (KV-based)
|
|
56
|
+
async function rateLimit(ctx: EventContext<Env>) {
|
|
57
|
+
const ip = ctx.request.headers.get('CF-Connecting-IP') || 'unknown';
|
|
58
|
+
const count = parseInt(await ctx.env.KV.get(`rate:${ip}`) || '0');
|
|
59
|
+
if (count >= 100) return new Response('Rate limited', { status: 429 });
|
|
60
|
+
await ctx.env.KV.put(`rate:${ip}`, (count + 1).toString(), { expirationTtl: 3600 });
|
|
61
|
+
return ctx.next();
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Forms, Caching, Redirects
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// JSON & file upload
|
|
69
|
+
export async function onRequestPost(ctx) {
|
|
70
|
+
const ct = ctx.request.headers.get('content-type') || '';
|
|
71
|
+
if (ct.includes('application/json')) return Response.json(await ctx.request.json());
|
|
72
|
+
if (ct.includes('multipart/form-data')) {
|
|
73
|
+
const file = (await ctx.request.formData()).get('file') as File;
|
|
74
|
+
await ctx.env.BUCKET.put(file.name, file.stream());
|
|
75
|
+
return Response.json({ uploaded: file.name });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Cache API
|
|
80
|
+
export async function onRequest(ctx) {
|
|
81
|
+
let res = await caches.default.match(ctx.request);
|
|
82
|
+
if (!res) {
|
|
83
|
+
res = new Response('Data');
|
|
84
|
+
res.headers.set('Cache-Control', 'public, max-age=3600');
|
|
85
|
+
ctx.waitUntil(caches.default.put(ctx.request, res.clone()));
|
|
86
|
+
}
|
|
87
|
+
return res;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Redirects
|
|
91
|
+
export async function onRequest(ctx) {
|
|
92
|
+
if (new URL(ctx.request.url).pathname === '/old') {
|
|
93
|
+
return Response.redirect(new URL('/new', ctx.request.url), 301);
|
|
94
|
+
}
|
|
95
|
+
return ctx.next();
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Testing
|
|
100
|
+
|
|
101
|
+
**Unit tests** (Vitest + cloudflare:test):
|
|
102
|
+
```typescript
|
|
103
|
+
import { env } from 'cloudflare:test';
|
|
104
|
+
import { it, expect } from 'vitest';
|
|
105
|
+
import { onRequest } from '../functions/api';
|
|
106
|
+
|
|
107
|
+
it('returns JSON', async () => {
|
|
108
|
+
const req = new Request('http://localhost/api');
|
|
109
|
+
const ctx = { request: req, env, params: {}, data: {} } as EventContext;
|
|
110
|
+
const res = await onRequest(ctx);
|
|
111
|
+
expect(res.status).toBe(200);
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Integration:** `wrangler pages dev` + Playwright/Cypress
|
|
116
|
+
|
|
117
|
+
## Advanced Mode (_worker.js)
|
|
118
|
+
|
|
119
|
+
Use `_worker.js` for complex routing (replaces `/functions`):
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
interface Env { ASSETS: Fetcher; KV: KVNamespace; }
|
|
123
|
+
|
|
124
|
+
export default {
|
|
125
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
126
|
+
const url = new URL(request.url);
|
|
127
|
+
if (url.pathname.startsWith('/api/')) {
|
|
128
|
+
return Response.json({ data: await env.KV.get('key') });
|
|
129
|
+
}
|
|
130
|
+
return env.ASSETS.fetch(request); // Static files
|
|
131
|
+
}
|
|
132
|
+
} satisfies ExportedHandler<Env>;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**When:** Existing Worker, framework-generated (Next.js/SvelteKit), custom routing logic
|
|
136
|
+
|
|
137
|
+
**See also:** [api.md](./api.md) for `env.ASSETS.fetch()` | [gotchas.md](./gotchas.md) for debugging
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Cloudflare Pipelines
|
|
2
|
+
|
|
3
|
+
Streaming ingest: receive events over HTTP/Workers/Logpush, transform with SQL, write to R2 as Iceberg tables or Parquet/JSON files.
|
|
4
|
+
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
This reference is a fast-start with verified code and gotchas. For limits, settings, full SQL syntax, and pricing, **retrieve the live docs** — use the Cloudflare MCP `docs` tool if available, otherwise `webfetch` the URL. Docs are source of truth over this file.
|
|
8
|
+
|
|
9
|
+
| Topic | URL |
|
|
10
|
+
|-------|-----|
|
|
11
|
+
| Overview / getting started | `https://developers.cloudflare.com/pipelines/getting-started/` |
|
|
12
|
+
| Streams (write, manage, Logpush) | `https://developers.cloudflare.com/pipelines/streams/` |
|
|
13
|
+
| Sinks | `https://developers.cloudflare.com/pipelines/sinks/` |
|
|
14
|
+
| Pipelines & SQL transforms | `https://developers.cloudflare.com/pipelines/pipelines/` |
|
|
15
|
+
| SQL reference (statements, types) | `https://developers.cloudflare.com/pipelines/sql-reference/` |
|
|
16
|
+
| Wrangler commands | `https://developers.cloudflare.com/pipelines/reference/wrangler-commands/` |
|
|
17
|
+
| Terraform | `https://developers.cloudflare.com/pipelines/reference/terraform/` |
|
|
18
|
+
| Limits | `https://developers.cloudflare.com/pipelines/platform/limits/` |
|
|
19
|
+
| Pricing | `https://developers.cloudflare.com/pipelines/platform/pricing/` |
|
|
20
|
+
| Metrics (GraphQL) | `https://developers.cloudflare.com/pipelines/observability/metrics/` |
|
|
21
|
+
|
|
22
|
+
## Three Components
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Sources → Stream → Pipeline (SQL) → Sink → R2
|
|
26
|
+
↑ ↓ ↓
|
|
27
|
+
HTTP / Workers / Transform Iceberg (Data Catalog)
|
|
28
|
+
Logpush (row-level) or Parquet/JSON files
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Component | Purpose |
|
|
32
|
+
|-----------|---------|
|
|
33
|
+
| **Stream** | Receives events (HTTP endpoint, Worker binding, or Logpush). Structured (schema-validated) or unstructured. |
|
|
34
|
+
| **Pipeline** | SQL connecting a stream to a sink. Row-level transforms only — no GROUP BY/aggregation. |
|
|
35
|
+
| **Sink** | Writes to R2 — Iceberg via Data Catalog, or raw Parquet/JSON. |
|
|
36
|
+
|
|
37
|
+
**Status:** Open beta (Workers Paid for production). Pricing announced; verify billing status in docs.
|
|
38
|
+
|
|
39
|
+
## Quick Start
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Interactive — creates stream + sink + pipeline, optionally bucket + catalog
|
|
43
|
+
npx wrangler pipelines setup
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Minimal Worker producer:
|
|
47
|
+
```typescript
|
|
48
|
+
interface Env { MY_STREAM: Pipeline; }
|
|
49
|
+
|
|
50
|
+
export default {
|
|
51
|
+
async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
52
|
+
ctx.waitUntil(env.MY_STREAM.send([{ event_id: crypto.randomUUID(), amount: 29.99 }]));
|
|
53
|
+
return new Response("OK");
|
|
54
|
+
}
|
|
55
|
+
} satisfies ExportedHandler<Env>;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Which Sink Type?
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Need SQL queries / ACID / time-travel on the data?
|
|
62
|
+
→ R2 Data Catalog (Iceberg) ✅ R2 SQL, schema evolution ❌ more setup
|
|
63
|
+
|
|
64
|
+
Just archival / external tools (Spark, Athena)?
|
|
65
|
+
→ R2 raw files (Parquet/JSON) ✅ simple, partitioned files ❌ no built-in SQL
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Critical Behaviors (read before building)
|
|
69
|
+
|
|
70
|
+
These are non-obvious and prevent most failures — see [gotchas.md](gotchas.md) for detail.
|
|
71
|
+
|
|
72
|
+
- **Everything is immutable after creation** — stream schema, pipeline SQL, sink config. To change, delete and recreate.
|
|
73
|
+
- **Sinks create their own table** — they cannot target an existing Iceberg table.
|
|
74
|
+
- **`__ingest_ts` is added automatically** (TIMESTAMP, partitioned by day). Don't define it in your schema.
|
|
75
|
+
- **Data isn't queryable immediately** — first flush takes **3–7 minutes** (warm-up + table creation) even with a short roll interval.
|
|
76
|
+
- **Schema validation is deferred** — invalid events are accepted then silently dropped. Monitor via GraphQL error metrics.
|
|
77
|
+
- **Binding field renamed `pipeline` → `stream`** (June 2026); old field still accepted.
|
|
78
|
+
|
|
79
|
+
## Reading Order
|
|
80
|
+
|
|
81
|
+
1. [configuration.md](configuration.md) — schema, streams, sinks, pipelines (CLI + REST + Terraform), bindings
|
|
82
|
+
2. [api.md](api.md) — `send()`, HTTP ingest, REST API, pipeline SQL, lifecycle states
|
|
83
|
+
3. [patterns.md](patterns.md) — fire-and-forget, validation, Logpush, observability, end-to-end
|
|
84
|
+
4. [gotchas.md](gotchas.md) — silent drops, immutability, REST≠CLI field names
|
|
85
|
+
|
|
86
|
+
## See Also
|
|
87
|
+
|
|
88
|
+
- [r2-data-catalog](../r2-data-catalog/) — Iceberg sink destination
|
|
89
|
+
- [r2-sql](../r2-sql/) — query the ingested data
|
|
90
|
+
- [r2](../r2/) · [queues](../queues/) · [workers](../workers/)
|