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,192 @@
|
|
|
1
|
+
# Tunnel Patterns
|
|
2
|
+
|
|
3
|
+
## Docker Deployment
|
|
4
|
+
|
|
5
|
+
### Token-Based (Recommended)
|
|
6
|
+
```yaml
|
|
7
|
+
services:
|
|
8
|
+
cloudflared:
|
|
9
|
+
image: cloudflare/cloudflared:latest
|
|
10
|
+
command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}
|
|
11
|
+
restart: unless-stopped
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### Local Config
|
|
15
|
+
```yaml
|
|
16
|
+
services:
|
|
17
|
+
cloudflared:
|
|
18
|
+
image: cloudflare/cloudflared:latest
|
|
19
|
+
volumes:
|
|
20
|
+
- ./config.yml:/etc/cloudflared/config.yml:ro
|
|
21
|
+
- ./credentials.json:/etc/cloudflared/credentials.json:ro
|
|
22
|
+
command: tunnel run
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Kubernetes Deployment
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
apiVersion: apps/v1
|
|
29
|
+
kind: Deployment
|
|
30
|
+
metadata:
|
|
31
|
+
name: cloudflared
|
|
32
|
+
spec:
|
|
33
|
+
replicas: 2
|
|
34
|
+
selector:
|
|
35
|
+
matchLabels:
|
|
36
|
+
app: cloudflared
|
|
37
|
+
template:
|
|
38
|
+
metadata:
|
|
39
|
+
labels:
|
|
40
|
+
app: cloudflared
|
|
41
|
+
spec:
|
|
42
|
+
containers:
|
|
43
|
+
- name: cloudflared
|
|
44
|
+
image: cloudflare/cloudflared:latest
|
|
45
|
+
args:
|
|
46
|
+
- tunnel
|
|
47
|
+
- --no-autoupdate
|
|
48
|
+
- run
|
|
49
|
+
- --token
|
|
50
|
+
- $(TUNNEL_TOKEN)
|
|
51
|
+
env:
|
|
52
|
+
- name: TUNNEL_TOKEN
|
|
53
|
+
valueFrom:
|
|
54
|
+
secretKeyRef:
|
|
55
|
+
name: tunnel-credentials
|
|
56
|
+
key: token
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## High Availability
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
# Same config on multiple servers
|
|
63
|
+
tunnel: <UUID>
|
|
64
|
+
credentials-file: /path/to/creds.json
|
|
65
|
+
|
|
66
|
+
ingress:
|
|
67
|
+
- hostname: app.example.com
|
|
68
|
+
service: http://localhost:8000
|
|
69
|
+
- service: http_status:404
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Run same config on multiple machines. Cloudflare automatically load balances. Long-lived connections (WebSocket, SSH) may drop during updates.
|
|
73
|
+
|
|
74
|
+
## Use Cases
|
|
75
|
+
|
|
76
|
+
### Web Application
|
|
77
|
+
```yaml
|
|
78
|
+
ingress:
|
|
79
|
+
- hostname: myapp.example.com
|
|
80
|
+
service: http://localhost:3000
|
|
81
|
+
- service: http_status:404
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### SSH Access
|
|
85
|
+
```yaml
|
|
86
|
+
ingress:
|
|
87
|
+
- hostname: ssh.example.com
|
|
88
|
+
service: ssh://localhost:22
|
|
89
|
+
- service: http_status:404
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Client: `cloudflared access ssh --hostname ssh.example.com`
|
|
93
|
+
|
|
94
|
+
### gRPC Service
|
|
95
|
+
```yaml
|
|
96
|
+
ingress:
|
|
97
|
+
- hostname: grpc.example.com
|
|
98
|
+
service: http://localhost:50051
|
|
99
|
+
originRequest:
|
|
100
|
+
http2Origin: true
|
|
101
|
+
- service: http_status:404
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Infrastructure as Code
|
|
105
|
+
|
|
106
|
+
### Terraform
|
|
107
|
+
|
|
108
|
+
```hcl
|
|
109
|
+
resource "random_id" "tunnel_secret" {
|
|
110
|
+
byte_length = 32
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
resource "cloudflare_tunnel" "app" {
|
|
114
|
+
account_id = var.cloudflare_account_id
|
|
115
|
+
name = "app-tunnel"
|
|
116
|
+
secret = random_id.tunnel_secret.b64_std
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
resource "cloudflare_tunnel_config" "app" {
|
|
120
|
+
account_id = var.cloudflare_account_id
|
|
121
|
+
tunnel_id = cloudflare_tunnel.app.id
|
|
122
|
+
config {
|
|
123
|
+
ingress_rule {
|
|
124
|
+
hostname = "app.example.com"
|
|
125
|
+
service = "http://localhost:8000"
|
|
126
|
+
}
|
|
127
|
+
ingress_rule { service = "http_status:404" }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
resource "cloudflare_record" "app" {
|
|
132
|
+
zone_id = var.cloudflare_zone_id
|
|
133
|
+
name = "app"
|
|
134
|
+
value = cloudflare_tunnel.app.cname
|
|
135
|
+
type = "CNAME"
|
|
136
|
+
proxied = true
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
output "tunnel_token" {
|
|
140
|
+
value = cloudflare_tunnel.app.tunnel_token
|
|
141
|
+
sensitive = true
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Pulumi
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import * as cloudflare from "@pulumi/cloudflare";
|
|
149
|
+
import * as random from "@pulumi/random";
|
|
150
|
+
|
|
151
|
+
const secret = new random.RandomId("secret", { byteLength: 32 });
|
|
152
|
+
|
|
153
|
+
const tunnel = new cloudflare.ZeroTrustTunnelCloudflared("tunnel", {
|
|
154
|
+
accountId: accountId,
|
|
155
|
+
name: "app-tunnel",
|
|
156
|
+
secret: secret.b64Std,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const config = new cloudflare.ZeroTrustTunnelCloudflaredConfig("config", {
|
|
160
|
+
accountId: accountId,
|
|
161
|
+
tunnelId: tunnel.id,
|
|
162
|
+
config: {
|
|
163
|
+
ingressRules: [
|
|
164
|
+
{ hostname: "app.example.com", service: "http://localhost:8000" },
|
|
165
|
+
{ service: "http_status:404" },
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
new cloudflare.Record("dns", {
|
|
171
|
+
zoneId: zoneId,
|
|
172
|
+
name: "app",
|
|
173
|
+
value: tunnel.cname,
|
|
174
|
+
type: "CNAME",
|
|
175
|
+
proxied: true,
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Service Installation
|
|
180
|
+
|
|
181
|
+
### Linux systemd
|
|
182
|
+
```bash
|
|
183
|
+
cloudflared service install
|
|
184
|
+
systemctl start cloudflared && systemctl enable cloudflared
|
|
185
|
+
journalctl -u cloudflared -f # Logs
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### macOS launchd
|
|
189
|
+
```bash
|
|
190
|
+
sudo cloudflared service install
|
|
191
|
+
sudo launchctl start com.cloudflare.cloudflared
|
|
192
|
+
```
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Cloudflare TURN Service
|
|
2
|
+
|
|
3
|
+
Expert guidance for implementing Cloudflare TURN Service in WebRTC applications.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Cloudflare TURN (Traversal Using Relays around NAT) Service is a managed relay service for WebRTC applications. TURN acts as a relay point for traffic between WebRTC clients and SFUs, particularly when direct peer-to-peer communication is obstructed by NATs or firewalls. The service runs on Cloudflare's global anycast network across 310+ cities.
|
|
8
|
+
|
|
9
|
+
## Key Characteristics
|
|
10
|
+
|
|
11
|
+
- **Anycast Architecture**: Automatically connects clients to the closest Cloudflare location
|
|
12
|
+
- **Global Network**: Available across Cloudflare's entire network (excluding China Network)
|
|
13
|
+
- **Zero Configuration**: No need to manually select regions or servers
|
|
14
|
+
- **Protocol Support**: STUN/TURN over UDP, TCP, and TLS
|
|
15
|
+
- **Free Tier**: Free when used with Cloudflare Calls SFU, otherwise $0.05/GB outbound
|
|
16
|
+
|
|
17
|
+
## In This Reference
|
|
18
|
+
|
|
19
|
+
| File | Purpose |
|
|
20
|
+
|------|---------|
|
|
21
|
+
| [api.md](./api.md) | Credentials API, TURN key management, types, constraints |
|
|
22
|
+
| [configuration.md](./configuration.md) | Worker setup, wrangler.jsonc, env vars, IP allowlisting |
|
|
23
|
+
| [patterns.md](./patterns.md) | Implementation patterns, use cases, integration examples |
|
|
24
|
+
| [gotchas.md](./gotchas.md) | Troubleshooting, limits, security, common mistakes |
|
|
25
|
+
|
|
26
|
+
## Reading Order
|
|
27
|
+
|
|
28
|
+
| Task | Files to Read | Est. Tokens |
|
|
29
|
+
|------|---------------|-------------|
|
|
30
|
+
| Quick start | README only | ~500 |
|
|
31
|
+
| Generate credentials | README → api | ~1300 |
|
|
32
|
+
| Worker integration | README → configuration → patterns | ~2000 |
|
|
33
|
+
| Debug connection | gotchas | ~700 |
|
|
34
|
+
| Security review | api → gotchas | ~1500 |
|
|
35
|
+
| Enterprise firewall | configuration | ~600 |
|
|
36
|
+
|
|
37
|
+
## Service Addresses and Ports
|
|
38
|
+
|
|
39
|
+
### STUN over UDP
|
|
40
|
+
- **Primary**: `stun.cloudflare.com:3478/udp`
|
|
41
|
+
- **Alternate**: `stun.cloudflare.com:53/udp` (blocked by browsers, not recommended)
|
|
42
|
+
|
|
43
|
+
### TURN over UDP
|
|
44
|
+
- **Primary**: `turn.cloudflare.com:3478/udp`
|
|
45
|
+
- **Alternate**: `turn.cloudflare.com:53/udp` (blocked by browsers)
|
|
46
|
+
|
|
47
|
+
### TURN over TCP
|
|
48
|
+
- **Primary**: `turn.cloudflare.com:3478/tcp`
|
|
49
|
+
- **Alternate**: `turn.cloudflare.com:80/tcp`
|
|
50
|
+
|
|
51
|
+
### TURN over TLS
|
|
52
|
+
- **Primary**: `turn.cloudflare.com:5349/tcp`
|
|
53
|
+
- **Alternate**: `turn.cloudflare.com:443/tcp`
|
|
54
|
+
|
|
55
|
+
## Quick Start
|
|
56
|
+
|
|
57
|
+
1. **Create TURN key via API**: see [api.md#create-turn-key](./api.md#create-turn-key)
|
|
58
|
+
2. **Generate credentials**: see [api.md#generate-temporary-credentials](./api.md#generate-temporary-credentials)
|
|
59
|
+
3. **Configure Worker**: see [configuration.md#cloudflare-worker-integration](./configuration.md#cloudflare-worker-integration)
|
|
60
|
+
4. **Implement client**: see [patterns.md#basic-turn-configuration-browser](./patterns.md#basic-turn-configuration-browser)
|
|
61
|
+
|
|
62
|
+
## When to Use TURN
|
|
63
|
+
|
|
64
|
+
- **Restrictive NATs**: Symmetric NATs that block direct connections
|
|
65
|
+
- **Corporate firewalls**: Environments blocking WebRTC ports
|
|
66
|
+
- **Mobile networks**: Carrier-grade NAT scenarios
|
|
67
|
+
- **Predictable connectivity**: When reliability > efficiency
|
|
68
|
+
|
|
69
|
+
## Related Cloudflare Services
|
|
70
|
+
|
|
71
|
+
- **Cloudflare Calls SFU**: Managed Selective Forwarding Unit (TURN free when used with SFU)
|
|
72
|
+
- **Cloudflare Stream**: Video streaming with WHIP/WHEP support
|
|
73
|
+
- **Cloudflare Workers**: Backend for credential generation
|
|
74
|
+
- **Cloudflare KV**: Credential caching
|
|
75
|
+
- **Cloudflare Durable Objects**: Session state management
|
|
76
|
+
|
|
77
|
+
## Additional Resources
|
|
78
|
+
|
|
79
|
+
- [Cloudflare Calls Documentation](https://developers.cloudflare.com/calls/)
|
|
80
|
+
- [Cloudflare TURN Service Docs](https://developers.cloudflare.com/realtime/turn/)
|
|
81
|
+
- [Cloudflare API Reference](https://developers.cloudflare.com/api/resources/calls/subresources/turn/)
|
|
82
|
+
- [Orange Meets (Open Source Example)](https://github.com/cloudflare/orange)
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# TURN API Reference
|
|
2
|
+
|
|
3
|
+
Complete API documentation for Cloudflare TURN service credentials and key management.
|
|
4
|
+
|
|
5
|
+
## Authentication
|
|
6
|
+
|
|
7
|
+
All endpoints require Cloudflare API token with "Calls Write" permission.
|
|
8
|
+
|
|
9
|
+
Base URL: `https://api.cloudflare.com/client/v4`
|
|
10
|
+
|
|
11
|
+
## TURN Key Management
|
|
12
|
+
|
|
13
|
+
### List TURN Keys
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
GET /accounts/{account_id}/calls/turn_keys
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Get TURN Key Details
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
GET /accounts/{account_id}/calls/turn_keys/{key_id}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Create TURN Key
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
POST /accounts/{account_id}/calls/turn_keys
|
|
29
|
+
Content-Type: application/json
|
|
30
|
+
|
|
31
|
+
{
|
|
32
|
+
"name": "my-turn-key"
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Response includes**:
|
|
37
|
+
- `uid`: Key identifier
|
|
38
|
+
- `key`: The actual secret key (only returned on creation—save immediately)
|
|
39
|
+
- `name`: Human-readable name
|
|
40
|
+
- `created`: ISO 8601 timestamp
|
|
41
|
+
- `modified`: ISO 8601 timestamp
|
|
42
|
+
|
|
43
|
+
### Update TURN Key
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
PUT /accounts/{account_id}/calls/turn_keys/{key_id}
|
|
47
|
+
Content-Type: application/json
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
"name": "updated-name"
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Delete TURN Key
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
DELETE /accounts/{account_id}/calls/turn_keys/{key_id}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Generate Temporary Credentials
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
POST https://rtc.live.cloudflare.com/v1/turn/keys/{key_id}/credentials/generate
|
|
64
|
+
Authorization: Bearer {key_secret}
|
|
65
|
+
Content-Type: application/json
|
|
66
|
+
|
|
67
|
+
{
|
|
68
|
+
"ttl": 86400
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Credential Constraints
|
|
73
|
+
|
|
74
|
+
| Parameter | Min | Max | Default | Notes |
|
|
75
|
+
|-----------|-----|-----|---------|-------|
|
|
76
|
+
| ttl | 1 | 172800 (48hrs) | varies | API rejects values >172800 |
|
|
77
|
+
|
|
78
|
+
**CRITICAL**: Maximum TTL is 48 hours (172800 seconds). API will reject requests exceeding this limit.
|
|
79
|
+
|
|
80
|
+
### Response Schema
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"iceServers": {
|
|
85
|
+
"urls": [
|
|
86
|
+
"stun:stun.cloudflare.com:3478",
|
|
87
|
+
"turn:turn.cloudflare.com:3478?transport=udp",
|
|
88
|
+
"turn:turn.cloudflare.com:3478?transport=tcp",
|
|
89
|
+
"turn:turn.cloudflare.com:53?transport=udp",
|
|
90
|
+
"turn:turn.cloudflare.com:80?transport=tcp",
|
|
91
|
+
"turns:turn.cloudflare.com:5349?transport=tcp",
|
|
92
|
+
"turns:turn.cloudflare.com:443?transport=tcp"
|
|
93
|
+
],
|
|
94
|
+
"username": "1738035200:user123",
|
|
95
|
+
"credential": "base64encodedhmac=="
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Port 53 Warning**: Filter port 53 URLs for browser clients—blocked by Chrome/Firefox. See [gotchas.md](./gotchas.md#using-port-53-in-browsers).
|
|
101
|
+
|
|
102
|
+
## Revoke Credentials
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
POST https://rtc.live.cloudflare.com/v1/turn/keys/{key_id}/credentials/revoke
|
|
106
|
+
Authorization: Bearer {key_secret}
|
|
107
|
+
Content-Type: application/json
|
|
108
|
+
|
|
109
|
+
{
|
|
110
|
+
"username": "1738035200:user123"
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Response**: 204 No Content
|
|
115
|
+
|
|
116
|
+
Billing stops immediately. Active connection drops after short delay (~seconds).
|
|
117
|
+
|
|
118
|
+
## TypeScript Types
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
interface CloudflareTURNConfig {
|
|
122
|
+
keyId: string;
|
|
123
|
+
keySecret: string;
|
|
124
|
+
ttl?: number; // Max 172800 (48 hours)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
interface TURNCredentialsRequest {
|
|
128
|
+
ttl?: number; // Max 172800 seconds
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
interface TURNCredentialsResponse {
|
|
132
|
+
iceServers: {
|
|
133
|
+
urls: string[];
|
|
134
|
+
username: string;
|
|
135
|
+
credential: string;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
interface RTCIceServer {
|
|
140
|
+
urls: string | string[];
|
|
141
|
+
username?: string;
|
|
142
|
+
credential?: string;
|
|
143
|
+
credentialType?: "password";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
interface TURNKeyResponse {
|
|
147
|
+
uid: string;
|
|
148
|
+
key: string; // Only present on creation
|
|
149
|
+
name: string;
|
|
150
|
+
created: string;
|
|
151
|
+
modified: string;
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Validation Function
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
function validateRTCIceServer(obj: unknown): obj is RTCIceServer {
|
|
159
|
+
if (!obj || typeof obj !== 'object') {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const server = obj as Record<string, unknown>;
|
|
164
|
+
|
|
165
|
+
if (typeof server.urls !== 'string' && !Array.isArray(server.urls)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (server.username && typeof server.username !== 'string') {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (server.credential && typeof server.credential !== 'string') {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Type-Safe Credential Generation
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
async function fetchTURNServers(
|
|
185
|
+
config: CloudflareTURNConfig
|
|
186
|
+
): Promise<RTCIceServer[]> {
|
|
187
|
+
// Validate TTL constraint
|
|
188
|
+
const ttl = config.ttl ?? 3600;
|
|
189
|
+
if (ttl > 172800) {
|
|
190
|
+
throw new Error('TTL cannot exceed 172800 seconds (48 hours)');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const response = await fetch(
|
|
194
|
+
`https://rtc.live.cloudflare.com/v1/turn/keys/${config.keyId}/credentials/generate`,
|
|
195
|
+
{
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Authorization': `Bearer ${config.keySecret}`,
|
|
199
|
+
'Content-Type': 'application/json'
|
|
200
|
+
},
|
|
201
|
+
body: JSON.stringify({ ttl })
|
|
202
|
+
}
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
if (!response.ok) {
|
|
206
|
+
throw new Error(`TURN credential generation failed: ${response.status}`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const data = await response.json();
|
|
210
|
+
|
|
211
|
+
// Filter port 53 for browser clients
|
|
212
|
+
const filteredUrls = data.iceServers.urls.filter(
|
|
213
|
+
(url: string) => !url.includes(':53')
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
const iceServers = [
|
|
217
|
+
{ urls: 'stun:stun.cloudflare.com:3478' },
|
|
218
|
+
{
|
|
219
|
+
urls: filteredUrls,
|
|
220
|
+
username: data.iceServers.username,
|
|
221
|
+
credential: data.iceServers.credential,
|
|
222
|
+
credentialType: 'password' as const
|
|
223
|
+
}
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
// Validate before returning
|
|
227
|
+
if (!iceServers.every(validateRTCIceServer)) {
|
|
228
|
+
throw new Error('Invalid ICE server configuration received');
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return iceServers;
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## See Also
|
|
236
|
+
|
|
237
|
+
- [configuration.md](./configuration.md) - Worker setup, environment variables
|
|
238
|
+
- [patterns.md](./patterns.md) - Implementation examples using these APIs
|
|
239
|
+
- [gotchas.md](./gotchas.md) - Security best practices, common mistakes
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# TURN Configuration
|
|
2
|
+
|
|
3
|
+
Setup and configuration for Cloudflare TURN service in Workers and applications.
|
|
4
|
+
|
|
5
|
+
## Environment Variables
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# .env
|
|
9
|
+
CLOUDFLARE_ACCOUNT_ID=your_account_id
|
|
10
|
+
CLOUDFLARE_API_TOKEN=your_api_token
|
|
11
|
+
TURN_KEY_ID=your_turn_key_id
|
|
12
|
+
TURN_KEY_SECRET=your_turn_key_secret
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Validate with zod:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
|
|
20
|
+
const envSchema = z.object({
|
|
21
|
+
CLOUDFLARE_ACCOUNT_ID: z.string().min(1),
|
|
22
|
+
CLOUDFLARE_API_TOKEN: z.string().min(1),
|
|
23
|
+
TURN_KEY_ID: z.string().min(1),
|
|
24
|
+
TURN_KEY_SECRET: z.string().min(1)
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export const config = envSchema.parse(process.env);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## wrangler.jsonc
|
|
31
|
+
|
|
32
|
+
```jsonc
|
|
33
|
+
{
|
|
34
|
+
"name": "turn-credentials-api",
|
|
35
|
+
"main": "src/index.ts",
|
|
36
|
+
"compatibility_date": "2025-01-01",
|
|
37
|
+
"vars": {
|
|
38
|
+
"TURN_KEY_ID": "your-turn-key-id" // Non-sensitive, can be in vars
|
|
39
|
+
},
|
|
40
|
+
"env": {
|
|
41
|
+
"production": {
|
|
42
|
+
"kv_namespaces": [
|
|
43
|
+
{
|
|
44
|
+
"binding": "CREDENTIALS_CACHE",
|
|
45
|
+
"id": "your-kv-namespace-id"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Store secrets separately**:
|
|
54
|
+
```bash
|
|
55
|
+
wrangler secret put TURN_KEY_SECRET
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Cloudflare Worker Integration
|
|
59
|
+
|
|
60
|
+
### Worker Binding Types
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface Env {
|
|
64
|
+
TURN_KEY_ID: string;
|
|
65
|
+
TURN_KEY_SECRET: string;
|
|
66
|
+
CREDENTIALS_CACHE?: KVNamespace;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default {
|
|
70
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
71
|
+
// See patterns.md for implementation
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Basic Worker Example
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
export default {
|
|
80
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
81
|
+
if (request.url.endsWith('/turn-credentials')) {
|
|
82
|
+
// Validate client auth
|
|
83
|
+
const authHeader = request.headers.get('Authorization');
|
|
84
|
+
if (!authHeader) {
|
|
85
|
+
return new Response('Unauthorized', { status: 401 });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const response = await fetch(
|
|
89
|
+
`https://rtc.live.cloudflare.com/v1/turn/keys/${env.TURN_KEY_ID}/credentials/generate`,
|
|
90
|
+
{
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'Authorization': `Bearer ${env.TURN_KEY_SECRET}`,
|
|
94
|
+
'Content-Type': 'application/json'
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ ttl: 3600 })
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
return new Response('Failed to generate credentials', { status: 500 });
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const data = await response.json();
|
|
105
|
+
|
|
106
|
+
// Filter port 53 for browser clients
|
|
107
|
+
const filteredUrls = data.iceServers.urls.filter(
|
|
108
|
+
(url: string) => !url.includes(':53')
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
return Response.json({
|
|
112
|
+
iceServers: [
|
|
113
|
+
{ urls: 'stun:stun.cloudflare.com:3478' },
|
|
114
|
+
{
|
|
115
|
+
urls: filteredUrls,
|
|
116
|
+
username: data.iceServers.username,
|
|
117
|
+
credential: data.iceServers.credential
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return new Response('Not found', { status: 404 });
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## IP Allowlisting (Enterprise/Firewall)
|
|
129
|
+
|
|
130
|
+
For strict firewalls, allowlist these IPs for `turn.cloudflare.com`:
|
|
131
|
+
|
|
132
|
+
| Type | Address | Protocol |
|
|
133
|
+
|------|---------|----------|
|
|
134
|
+
| IPv4 | 141.101.90.1/32 | All |
|
|
135
|
+
| IPv4 | 162.159.207.1/32 | All |
|
|
136
|
+
| IPv6 | 2a06:98c1:3200::1/128 | All |
|
|
137
|
+
| IPv6 | 2606:4700:48::1/128 | All |
|
|
138
|
+
|
|
139
|
+
**IMPORTANT**: These IPs may change with 14-day notice. Monitor DNS:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Check A and AAAA records
|
|
143
|
+
dig turn.cloudflare.com A
|
|
144
|
+
dig turn.cloudflare.com AAAA
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Set up automated monitoring to detect IP changes and update allowlists within 14 days.
|
|
148
|
+
|
|
149
|
+
## IPv6 Support
|
|
150
|
+
|
|
151
|
+
- **Client-to-TURN**: Both IPv4 and IPv6 supported
|
|
152
|
+
- **Relay addresses**: IPv4 only (no RFC 6156 support)
|
|
153
|
+
- **TCP relaying**: Not supported (RFC 6062)
|
|
154
|
+
|
|
155
|
+
Clients can connect via IPv6, but relayed traffic uses IPv4 addresses.
|
|
156
|
+
|
|
157
|
+
## TLS Configuration
|
|
158
|
+
|
|
159
|
+
### Supported TLS Versions
|
|
160
|
+
- TLS 1.1
|
|
161
|
+
- TLS 1.2
|
|
162
|
+
- TLS 1.3
|
|
163
|
+
|
|
164
|
+
### Recommended Ciphers (TLS 1.3)
|
|
165
|
+
- AEAD-AES128-GCM-SHA256
|
|
166
|
+
- AEAD-AES256-GCM-SHA384
|
|
167
|
+
- AEAD-CHACHA20-POLY1305-SHA256
|
|
168
|
+
|
|
169
|
+
### Recommended Ciphers (TLS 1.2)
|
|
170
|
+
- ECDHE-ECDSA-AES128-GCM-SHA256
|
|
171
|
+
- ECDHE-RSA-AES128-GCM-SHA256
|
|
172
|
+
- ECDHE-RSA-AES128-SHA (also TLS 1.1)
|
|
173
|
+
- AES128-GCM-SHA256
|
|
174
|
+
|
|
175
|
+
## See Also
|
|
176
|
+
|
|
177
|
+
- [api.md](./api.md) - TURN key creation, credential generation API
|
|
178
|
+
- [patterns.md](./patterns.md) - Full Worker implementation patterns
|
|
179
|
+
- [gotchas.md](./gotchas.md) - Security best practices, troubleshooting
|