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,185 @@
|
|
|
1
|
+
# Workers Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.jsonc (Recommended)
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
8
|
+
"name": "my-worker",
|
|
9
|
+
"main": "src/index.ts",
|
|
10
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
11
|
+
|
|
12
|
+
// Bindings (non-inheritable)
|
|
13
|
+
"vars": { "ENVIRONMENT": "production" },
|
|
14
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "abc123" }],
|
|
15
|
+
"r2_buckets": [{ "binding": "MY_BUCKET", "bucket_name": "my-bucket" }],
|
|
16
|
+
"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "xyz789" }],
|
|
17
|
+
|
|
18
|
+
// Environments
|
|
19
|
+
"env": {
|
|
20
|
+
"staging": {
|
|
21
|
+
"vars": { "ENVIRONMENT": "staging" },
|
|
22
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "staging-id" }]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Configuration Rules
|
|
29
|
+
|
|
30
|
+
**Inheritable**: `name`, `main`, `compatibility_date`, `routes`, `workers_dev`
|
|
31
|
+
**Non-inheritable**: All bindings (`vars`, `kv_namespaces`, `r2_buckets`, etc.)
|
|
32
|
+
**Top-level only**: `migrations`, `keep_vars`, `send_metrics`
|
|
33
|
+
|
|
34
|
+
**ALWAYS set `compatibility_date` to current date for new projects**
|
|
35
|
+
|
|
36
|
+
## Bindings
|
|
37
|
+
|
|
38
|
+
```jsonc
|
|
39
|
+
{
|
|
40
|
+
// Environment variables - access via env.VAR_NAME
|
|
41
|
+
"vars": { "ENVIRONMENT": "production" },
|
|
42
|
+
|
|
43
|
+
// KV (key-value storage)
|
|
44
|
+
"kv_namespaces": [{ "binding": "MY_KV", "id": "abc123" }],
|
|
45
|
+
|
|
46
|
+
// R2 (object storage)
|
|
47
|
+
"r2_buckets": [{ "binding": "MY_BUCKET", "bucket_name": "my-bucket" }],
|
|
48
|
+
|
|
49
|
+
// D1 (SQL database)
|
|
50
|
+
"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "xyz789" }],
|
|
51
|
+
|
|
52
|
+
// Durable Objects (stateful coordination)
|
|
53
|
+
"durable_objects": {
|
|
54
|
+
"bindings": [{ "name": "COUNTER", "class_name": "Counter" }]
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// Queues (message queues)
|
|
58
|
+
"queues": {
|
|
59
|
+
"producers": [{ "binding": "MY_QUEUE", "queue": "my-queue" }],
|
|
60
|
+
"consumers": [{ "queue": "my-queue", "max_batch_size": 10 }]
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Service bindings (worker-to-worker RPC)
|
|
64
|
+
"services": [{ "binding": "SERVICE_B", "service": "service-b" }],
|
|
65
|
+
|
|
66
|
+
// Analytics Engine
|
|
67
|
+
"analytics_engine_datasets": [{ "binding": "ANALYTICS" }]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Secrets
|
|
72
|
+
|
|
73
|
+
Set via CLI (never in config):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx wrangler secret put API_KEY
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Access: `env.API_KEY`
|
|
80
|
+
|
|
81
|
+
### Automatic Provisioning (Beta)
|
|
82
|
+
|
|
83
|
+
Bindings without IDs are auto-created:
|
|
84
|
+
|
|
85
|
+
```jsonc
|
|
86
|
+
{ "kv_namespaces": [{ "binding": "MY_KV" }] } // ID added on deploy
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Routes & Triggers
|
|
90
|
+
|
|
91
|
+
```jsonc
|
|
92
|
+
{
|
|
93
|
+
"routes": [
|
|
94
|
+
{ "pattern": "example.com/*", "zone_name": "example.com" }
|
|
95
|
+
],
|
|
96
|
+
"triggers": {
|
|
97
|
+
"crons": ["0 */6 * * *"] // Every 6 hours
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## TypeScript Setup
|
|
103
|
+
|
|
104
|
+
### Automatic Type Generation (Recommended)
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm install -D @cloudflare/workers-types
|
|
108
|
+
npx wrangler types # Generates .wrangler/types/runtime.d.ts from wrangler.jsonc
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`tsconfig.json`:
|
|
112
|
+
|
|
113
|
+
```jsonc
|
|
114
|
+
{
|
|
115
|
+
"compilerOptions": {
|
|
116
|
+
"target": "ES2022",
|
|
117
|
+
"lib": ["ES2022"],
|
|
118
|
+
"types": ["@cloudflare/workers-types"]
|
|
119
|
+
},
|
|
120
|
+
"include": [".wrangler/types/**/*.ts", "src/**/*"]
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Import generated types:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
import type { Env } from './.wrangler/types/runtime';
|
|
128
|
+
|
|
129
|
+
export default {
|
|
130
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
131
|
+
await env.MY_KV.get('key'); // Fully typed, autocomplete works
|
|
132
|
+
return new Response('OK');
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Re-run `npx wrangler types` after changing bindings in wrangler.jsonc
|
|
138
|
+
|
|
139
|
+
### Manual Type Definition (Legacy)
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
interface Env {
|
|
143
|
+
MY_KV: KVNamespace;
|
|
144
|
+
DB: D1Database;
|
|
145
|
+
API_KEY: string;
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Advanced Options
|
|
150
|
+
|
|
151
|
+
```jsonc
|
|
152
|
+
{
|
|
153
|
+
// Auto-locate compute near data sources
|
|
154
|
+
"placement": { "mode": "smart" },
|
|
155
|
+
|
|
156
|
+
// Enable Node.js built-ins (Buffer, process, path, etc.)
|
|
157
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
158
|
+
|
|
159
|
+
// Observability (10% sampling)
|
|
160
|
+
"observability": { "enabled": true, "head_sampling_rate": 0.1 }
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Node.js Compatibility
|
|
165
|
+
|
|
166
|
+
`nodejs_compat` enables:
|
|
167
|
+
- `Buffer`, `process.env`, `path`, `stream`
|
|
168
|
+
- CommonJS `require()` for Node modules
|
|
169
|
+
- `node:` imports (e.g., `import { Buffer } from 'node:buffer'`)
|
|
170
|
+
|
|
171
|
+
**Note:** Adds ~1-2ms cold start overhead. Use Workers APIs (R2, KV) when possible
|
|
172
|
+
|
|
173
|
+
## Deployment Commands
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx wrangler deploy # Production
|
|
177
|
+
npx wrangler deploy --env staging
|
|
178
|
+
npx wrangler deploy --dry-run # Validate only
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## See Also
|
|
182
|
+
|
|
183
|
+
- [API](./api.md) - Runtime APIs and bindings usage
|
|
184
|
+
- [Patterns](./patterns.md) - Deployment strategies
|
|
185
|
+
- [Wrangler](../wrangler/README.md) - CLI reference
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Workers Frameworks
|
|
2
|
+
|
|
3
|
+
## Hono (Recommended)
|
|
4
|
+
|
|
5
|
+
Workers-native web framework with excellent TypeScript support and middleware ecosystem.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install hono
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Basic Setup
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Hono } from 'hono';
|
|
15
|
+
|
|
16
|
+
const app = new Hono();
|
|
17
|
+
|
|
18
|
+
app.get('/', (c) => c.text('Hello World!'));
|
|
19
|
+
app.post('/api/users', async (c) => {
|
|
20
|
+
const body = await c.req.json();
|
|
21
|
+
return c.json({ id: 1, ...body }, 201);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export default app;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Typed Environment
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import type { Env } from './.wrangler/types/runtime';
|
|
31
|
+
|
|
32
|
+
const app = new Hono<{ Bindings: Env }>();
|
|
33
|
+
|
|
34
|
+
app.get('/data', async (c) => {
|
|
35
|
+
const value = await c.env.MY_KV.get('key'); // Fully typed
|
|
36
|
+
return c.text(value || 'Not found');
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Middleware
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { cors } from 'hono/cors';
|
|
44
|
+
import { logger } from 'hono/logger';
|
|
45
|
+
|
|
46
|
+
app.use('*', logger());
|
|
47
|
+
app.use('/api/*', cors({ origin: '*' }));
|
|
48
|
+
|
|
49
|
+
// Custom middleware
|
|
50
|
+
app.use('/protected/*', async (c, next) => {
|
|
51
|
+
const auth = c.req.header('Authorization');
|
|
52
|
+
if (!auth?.startsWith('Bearer ')) return c.text('Unauthorized', 401);
|
|
53
|
+
await next();
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Request Validation (Zod)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { zValidator } from '@hono/zod-validator';
|
|
61
|
+
import { z } from 'zod';
|
|
62
|
+
|
|
63
|
+
const schema = z.object({
|
|
64
|
+
name: z.string().min(1),
|
|
65
|
+
email: z.string().email(),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
app.post('/users', zValidator('json', schema), async (c) => {
|
|
69
|
+
const validated = c.req.valid('json'); // Type-safe, validated data
|
|
70
|
+
return c.json({ id: 1, ...validated });
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Error handling**: Automatic 400 response with validation errors
|
|
75
|
+
|
|
76
|
+
### Route Groups
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
const api = new Hono().basePath('/api');
|
|
80
|
+
|
|
81
|
+
api.get('/users', (c) => c.json([]));
|
|
82
|
+
api.post('/users', (c) => c.json({ id: 1 }));
|
|
83
|
+
|
|
84
|
+
app.route('/', api); // Mounts at /api/*
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Error Handling
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
app.onError((err, c) => {
|
|
91
|
+
console.error(err);
|
|
92
|
+
return c.json({ error: err.message }, 500);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
app.notFound((c) => c.json({ error: 'Not Found' }, 404));
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Accessing ExecutionContext
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
export default {
|
|
102
|
+
fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
103
|
+
return app.fetch(request, env, ctx);
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// In route handlers:
|
|
108
|
+
app.get('/log', (c) => {
|
|
109
|
+
c.executionCtx.waitUntil(logRequest(c.req));
|
|
110
|
+
return c.text('OK');
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### OpenAPI/Swagger (Hono OpenAPI)
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { OpenAPIHono, createRoute, z } from '@hono/zod-openapi';
|
|
118
|
+
|
|
119
|
+
const app = new OpenAPIHono();
|
|
120
|
+
|
|
121
|
+
const route = createRoute({
|
|
122
|
+
method: 'get',
|
|
123
|
+
path: '/users/{id}',
|
|
124
|
+
request: { params: z.object({ id: z.string() }) },
|
|
125
|
+
responses: {
|
|
126
|
+
200: { description: 'User found', content: { 'application/json': { schema: z.object({ id: z.string() }) } } },
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
app.openapi(route, (c) => {
|
|
131
|
+
const { id } = c.req.valid('param');
|
|
132
|
+
return c.json({ id });
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
app.doc('/openapi.json', { openapi: '3.0.0', info: { version: '1.0.0', title: 'API' } });
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Testing with Hono
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { describe, it, expect } from 'vitest';
|
|
142
|
+
import app from '../src/index';
|
|
143
|
+
|
|
144
|
+
describe('API', () => {
|
|
145
|
+
it('GET /', async () => {
|
|
146
|
+
const res = await app.request('/');
|
|
147
|
+
expect(res.status).toBe(200);
|
|
148
|
+
expect(await res.text()).toBe('Hello World!');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Other Frameworks
|
|
154
|
+
|
|
155
|
+
### itty-router (Minimalist)
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { Router } from 'itty-router';
|
|
159
|
+
|
|
160
|
+
const router = Router();
|
|
161
|
+
|
|
162
|
+
router.get('/users/:id', ({ params }) => new Response(params.id));
|
|
163
|
+
|
|
164
|
+
export default { fetch: router.handle };
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Use case**: Tiny bundle size (~500 bytes), simple routing needs
|
|
168
|
+
|
|
169
|
+
### Worktop (Advanced)
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
import { Router } from 'worktop';
|
|
173
|
+
|
|
174
|
+
const router = new Router();
|
|
175
|
+
|
|
176
|
+
router.add('GET', '/users/:id', (req, res) => {
|
|
177
|
+
res.send(200, { id: req.params.id });
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
router.listen();
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Use case**: Advanced routing, built-in CORS/cache utilities
|
|
184
|
+
|
|
185
|
+
## Framework Comparison
|
|
186
|
+
|
|
187
|
+
| Framework | Bundle Size | TypeScript | Middleware | Validation | Best For |
|
|
188
|
+
|-----------|-------------|------------|------------|------------|----------|
|
|
189
|
+
| Hono | ~12KB | Excellent | Rich | Zod | Production apps |
|
|
190
|
+
| itty-router | ~500B | Good | Basic | Manual | Minimal APIs |
|
|
191
|
+
| Worktop | ~8KB | Good | Advanced | Manual | Complex routing |
|
|
192
|
+
|
|
193
|
+
## See Also
|
|
194
|
+
|
|
195
|
+
- [Patterns](./patterns.md) - Common workflows
|
|
196
|
+
- [API](./api.md) - Runtime APIs
|
|
197
|
+
- [Gotchas](./gotchas.md) - Framework-specific issues
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Workers Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Too much CPU time used"
|
|
6
|
+
|
|
7
|
+
**Cause:** Worker exceeded CPU time limit (10ms on Free plan, 30s default / 5min max on Paid)
|
|
8
|
+
**Solution:** Use `ctx.waitUntil()` for background work, offload heavy compute to Durable Objects, or consider Workers AI for ML workloads
|
|
9
|
+
|
|
10
|
+
### "Module-Level State Lost"
|
|
11
|
+
|
|
12
|
+
**Cause:** Workers are stateless between requests; module-level variables reset unpredictably
|
|
13
|
+
**Solution:** Use KV, D1, or Durable Objects for persistent state; don't rely on module-level variables
|
|
14
|
+
|
|
15
|
+
### "Body has already been used"
|
|
16
|
+
|
|
17
|
+
**Cause:** Attempting to read response body twice (bodies are streams)
|
|
18
|
+
**Solution:** Clone response before reading: `response.clone()` or read once and create new Response with the text
|
|
19
|
+
|
|
20
|
+
### "Node.js module not found"
|
|
21
|
+
|
|
22
|
+
**Cause:** Node.js built-ins not available by default
|
|
23
|
+
**Solution:** Use Workers APIs (e.g., R2 for file storage) or enable Node.js compat with `"compatibility_flags": ["nodejs_compat"]`
|
|
24
|
+
|
|
25
|
+
### "Cannot fetch in global scope"
|
|
26
|
+
|
|
27
|
+
**Cause:** Attempting to use fetch during module initialization
|
|
28
|
+
**Solution:** Move fetch calls inside handler functions (fetch, scheduled, etc.) where they're allowed
|
|
29
|
+
|
|
30
|
+
### "Subrequest depth limit exceeded"
|
|
31
|
+
|
|
32
|
+
**Cause:** Too many nested subrequests creating deep call chain
|
|
33
|
+
**Solution:** Flatten request chain or use service bindings for direct Worker-to-Worker communication
|
|
34
|
+
|
|
35
|
+
### "D1 read-after-write inconsistency"
|
|
36
|
+
|
|
37
|
+
**Cause:** D1 is eventually consistent; reads may not reflect recent writes
|
|
38
|
+
**Solution:** Use D1 Sessions (2024+) to guarantee read-after-write consistency within a session:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
const session = env.DB.withSession();
|
|
42
|
+
await session.prepare('INSERT INTO users (name) VALUES (?)').bind('Alice').run();
|
|
43
|
+
const user = await session.prepare('SELECT * FROM users WHERE name = ?').bind('Alice').first(); // Guaranteed to see Alice
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**When to use sessions:** Write → Read patterns, transactions requiring consistency
|
|
47
|
+
|
|
48
|
+
### "wrangler types not generating TypeScript definitions"
|
|
49
|
+
|
|
50
|
+
**Cause:** Type generation not configured or outdated
|
|
51
|
+
**Solution:** Run `npx wrangler types` after changing bindings in wrangler.jsonc:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx wrangler types # Generates .wrangler/types/runtime.d.ts
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Add to `tsconfig.json`: `"include": [".wrangler/types/**/*.ts"]`
|
|
58
|
+
|
|
59
|
+
Then import: `import type { Env } from './.wrangler/types/runtime';`
|
|
60
|
+
|
|
61
|
+
### "Durable Object RPC errors with deprecated fetch pattern"
|
|
62
|
+
|
|
63
|
+
**Cause:** Using old `stub.fetch()` pattern instead of RPC (2024+)
|
|
64
|
+
**Solution:** Export methods directly, call via RPC:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// ❌ Old fetch pattern
|
|
68
|
+
export class MyDO {
|
|
69
|
+
async fetch(request: Request) {
|
|
70
|
+
const { method } = await request.json();
|
|
71
|
+
if (method === 'increment') return new Response(String(await this.increment()));
|
|
72
|
+
}
|
|
73
|
+
async increment() { return ++this.value; }
|
|
74
|
+
}
|
|
75
|
+
const stub = env.DO.get(id);
|
|
76
|
+
const res = await stub.fetch('http://x', { method: 'POST', body: JSON.stringify({ method: 'increment' }) });
|
|
77
|
+
|
|
78
|
+
// ✅ RPC pattern (type-safe, no serialization overhead)
|
|
79
|
+
export class MyDO {
|
|
80
|
+
async increment() { return ++this.value; }
|
|
81
|
+
}
|
|
82
|
+
const stub = env.DO.get(id);
|
|
83
|
+
const count = await stub.increment(); // Direct method call
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### "WebSocket connection closes unexpectedly"
|
|
87
|
+
|
|
88
|
+
**Cause:** Worker reaches CPU limit while maintaining WebSocket connection
|
|
89
|
+
**Solution:** Use WebSocket hibernation (2024+) to offload idle connections:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
export class WebSocketDO {
|
|
93
|
+
async webSocketMessage(ws: WebSocket, message: string) {
|
|
94
|
+
// Handle message
|
|
95
|
+
}
|
|
96
|
+
async webSocketClose(ws: WebSocket, code: number) {
|
|
97
|
+
// Cleanup
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Hibernation automatically suspends inactive connections, wakes on events
|
|
103
|
+
|
|
104
|
+
### "Framework middleware not working with Workers"
|
|
105
|
+
|
|
106
|
+
**Cause:** Framework expects Node.js primitives (e.g., Express uses Node streams)
|
|
107
|
+
**Solution:** Use Workers-native frameworks (Hono, itty-router, Worktop) or adapt middleware:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// ✅ Hono (Workers-native)
|
|
111
|
+
import { Hono } from 'hono';
|
|
112
|
+
const app = new Hono();
|
|
113
|
+
app.use('*', async (c, next) => { /* middleware */ await next(); });
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
See [frameworks.md](./frameworks.md) for full patterns
|
|
117
|
+
|
|
118
|
+
## Limits
|
|
119
|
+
|
|
120
|
+
| Limit | Value | Notes |
|
|
121
|
+
|-------|-------|-------|
|
|
122
|
+
| Request size | 100 MB | Maximum incoming request size |
|
|
123
|
+
| Response size | Unlimited | Supports streaming |
|
|
124
|
+
| CPU time (Free) | 10ms | Free plan |
|
|
125
|
+
| CPU time (Paid) | 30s default / 5min max | Configurable via `limits.cpu_ms` |
|
|
126
|
+
| Subrequests (Free) | 50 | Per invocation |
|
|
127
|
+
| Subrequests (Paid) | 10,000 | Per invocation |
|
|
128
|
+
| Subrequest operations (KV, R2, Cache API) | 1,000 | Shared across KV reads, R2 ops, Cache API calls per request |
|
|
129
|
+
| KV value size | 25 MiB | Maximum per key |
|
|
130
|
+
| Environment variable size | 5 KB | Per variable |
|
|
131
|
+
|
|
132
|
+
## See Also
|
|
133
|
+
|
|
134
|
+
- [Patterns](./patterns.md) - Best practices
|
|
135
|
+
- [API](./api.md) - Runtime APIs
|
|
136
|
+
- [Configuration](./configuration.md) - Setup
|
|
137
|
+
- [Frameworks](./frameworks.md) - Hono, routing, validation
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Workers Patterns
|
|
2
|
+
|
|
3
|
+
## Error Handling
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
class HTTPError extends Error {
|
|
7
|
+
constructor(public status: number, message: string) { super(message); }
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
12
|
+
try {
|
|
13
|
+
return await handleRequest(request, env);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
if (error instanceof HTTPError) {
|
|
16
|
+
return new Response(JSON.stringify({ error: error.message }), {
|
|
17
|
+
status: error.status, headers: { 'Content-Type': 'application/json' }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## CORS
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS' };
|
|
30
|
+
if (request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Routing
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const router = { 'GET /api/users': handleGetUsers, 'POST /api/users': handleCreateUser };
|
|
37
|
+
|
|
38
|
+
const handler = router[`${request.method} ${url.pathname}`];
|
|
39
|
+
return handler ? handler(request, env) : new Response('Not Found', { status: 404 });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Production**: Use Hono, itty-router, or Worktop (see [frameworks.md](./frameworks.md))
|
|
43
|
+
|
|
44
|
+
## Request Validation (Zod)
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { z } from 'zod';
|
|
48
|
+
|
|
49
|
+
const userSchema = z.object({
|
|
50
|
+
name: z.string().min(1).max(100),
|
|
51
|
+
email: z.string().email(),
|
|
52
|
+
age: z.number().int().positive().optional(),
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
async function handleCreateUser(request: Request) {
|
|
56
|
+
try {
|
|
57
|
+
const body = await request.json();
|
|
58
|
+
const validated = userSchema.parse(body); // Throws on invalid data
|
|
59
|
+
return new Response(JSON.stringify({ id: 1, ...validated }), {
|
|
60
|
+
status: 201,
|
|
61
|
+
headers: { 'Content-Type': 'application/json' },
|
|
62
|
+
});
|
|
63
|
+
} catch (err) {
|
|
64
|
+
if (err instanceof z.ZodError) {
|
|
65
|
+
return new Response(JSON.stringify({ errors: err.errors }), { status: 400 });
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**With Hono**: Use `@hono/zod-validator` for automatic validation (see [frameworks.md](./frameworks.md))
|
|
73
|
+
|
|
74
|
+
## Performance
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// ❌ Sequential
|
|
78
|
+
const user = await fetch('/api/user/1');
|
|
79
|
+
const posts = await fetch('/api/posts?user=1');
|
|
80
|
+
|
|
81
|
+
// ✅ Parallel
|
|
82
|
+
const [user, posts] = await Promise.all([fetch('/api/user/1'), fetch('/api/posts?user=1')]);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Streaming
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
const stream = new ReadableStream({
|
|
89
|
+
async start(controller) {
|
|
90
|
+
for (let i = 0; i < 1000; i++) {
|
|
91
|
+
controller.enqueue(new TextEncoder().encode(`Item ${i}\n`));
|
|
92
|
+
if (i % 100 === 0) await new Promise(r => setTimeout(r, 0));
|
|
93
|
+
}
|
|
94
|
+
controller.close();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Transform Streams
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
response.body.pipeThrough(new TextDecoderStream()).pipeThrough(
|
|
103
|
+
new TransformStream({ transform(chunk, c) { c.enqueue(chunk.toUpperCase()); } })
|
|
104
|
+
).pipeThrough(new TextEncoderStream());
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Testing
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
import { describe, it, expect } from 'vitest';
|
|
111
|
+
import worker from '../src/index';
|
|
112
|
+
|
|
113
|
+
describe('Worker', () => {
|
|
114
|
+
it('returns 200', async () => {
|
|
115
|
+
const req = new Request('http://localhost/');
|
|
116
|
+
const env = { MY_VAR: 'test' };
|
|
117
|
+
const ctx = { waitUntil: () => {}, passThroughOnException: () => {} };
|
|
118
|
+
expect((await worker.fetch(req, env, ctx)).status).toBe(200);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Deployment
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npx wrangler deploy # production
|
|
127
|
+
npx wrangler deploy --env staging
|
|
128
|
+
npx wrangler versions upload --message "Add feature"
|
|
129
|
+
npx wrangler rollback
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Monitoring
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const start = Date.now();
|
|
136
|
+
const response = await handleRequest(request, env);
|
|
137
|
+
ctx.waitUntil(env.ANALYTICS.writeDataPoint({
|
|
138
|
+
doubles: [Date.now() - start], blobs: [request.url, String(response.status)]
|
|
139
|
+
}));
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Security & Rate Limiting
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
// Security headers
|
|
146
|
+
const security = { 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY' };
|
|
147
|
+
|
|
148
|
+
// Auth
|
|
149
|
+
const auth = request.headers.get('Authorization');
|
|
150
|
+
if (!auth?.startsWith('Bearer ')) return new Response('Unauthorized', { status: 401 });
|
|
151
|
+
|
|
152
|
+
// Gradual rollouts (deterministic user bucketing)
|
|
153
|
+
const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(userId));
|
|
154
|
+
if (new Uint8Array(hash)[0] % 100 < rolloutPercent) return newFeature(request);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Rate limiting: See [Durable Objects](../durable-objects/README.md)
|
|
158
|
+
|
|
159
|
+
## R2 Multipart Upload
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// For files > 100MB
|
|
163
|
+
const upload = await env.MY_BUCKET.createMultipartUpload('large-file.bin');
|
|
164
|
+
try {
|
|
165
|
+
const parts = [];
|
|
166
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
167
|
+
parts.push(await upload.uploadPart(i + 1, chunks[i]));
|
|
168
|
+
}
|
|
169
|
+
await upload.complete(parts);
|
|
170
|
+
} catch (err) { await upload.abort(); throw err; }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Parallel uploads, resume on failure, handle files > 5GB
|
|
174
|
+
|
|
175
|
+
## Workflows (Step Orchestration)
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';
|
|
179
|
+
|
|
180
|
+
export class MyWorkflow extends WorkflowEntrypoint {
|
|
181
|
+
async run(event: WorkflowEvent<{ userId: string }>, step: WorkflowStep) {
|
|
182
|
+
const user = await step.do('fetch-user', async () =>
|
|
183
|
+
fetch(`/api/users/${event.payload.userId}`).then(r => r.json())
|
|
184
|
+
);
|
|
185
|
+
await step.sleep('wait', '1 hour');
|
|
186
|
+
await step.do('notify', async () => sendEmail(user.email));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Multi-step jobs with automatic retries, state persistence, resume from failure
|
|
192
|
+
|
|
193
|
+
## See Also
|
|
194
|
+
|
|
195
|
+
- [API](./api.md) - Runtime APIs
|
|
196
|
+
- [Gotchas](./gotchas.md) - Common issues
|
|
197
|
+
- [Configuration](./configuration.md) - Setup
|
|
198
|
+
- [Frameworks](./frameworks.md) - Hono, routing, validation
|