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,137 @@
|
|
|
1
|
+
# Configuration & Deployment
|
|
2
|
+
|
|
3
|
+
## Dashboard Setup
|
|
4
|
+
|
|
5
|
+
1. Navigate to https://dash.cloudflare.com/?to=/:account/calls
|
|
6
|
+
2. Click "Create Application" (or use existing app)
|
|
7
|
+
3. Copy `CALLS_APP_ID` from dashboard
|
|
8
|
+
4. Generate and copy `CALLS_APP_SECRET` (treat as sensitive credential)
|
|
9
|
+
5. Use credentials in Wrangler config or environment variables below
|
|
10
|
+
|
|
11
|
+
## Dependencies
|
|
12
|
+
|
|
13
|
+
**Backend (Workers):** Built-in fetch API, no additional packages required
|
|
14
|
+
|
|
15
|
+
**Client (PartyTracks):**
|
|
16
|
+
```bash
|
|
17
|
+
npm install partytracks @cloudflare/calls
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Client (React + PartyTracks):**
|
|
21
|
+
```bash
|
|
22
|
+
npm install partytracks @cloudflare/calls observable-hooks
|
|
23
|
+
# Observable hooks: useObservableAsValue, useValueAsObservable
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Client (Raw API):** Native browser WebRTC API only
|
|
27
|
+
|
|
28
|
+
## Wrangler Setup
|
|
29
|
+
|
|
30
|
+
```jsonc
|
|
31
|
+
{
|
|
32
|
+
"name": "my-calls-app",
|
|
33
|
+
"main": "src/index.ts",
|
|
34
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
35
|
+
"vars": {
|
|
36
|
+
"CALLS_APP_ID": "your-app-id",
|
|
37
|
+
"MAX_WEBCAM_BITRATE": "1200000",
|
|
38
|
+
"MAX_WEBCAM_FRAMERATE": "24",
|
|
39
|
+
"MAX_WEBCAM_QUALITY_LEVEL": "1080"
|
|
40
|
+
},
|
|
41
|
+
// Set secret: wrangler secret put CALLS_APP_SECRET
|
|
42
|
+
"durable_objects": {
|
|
43
|
+
"bindings": [
|
|
44
|
+
{
|
|
45
|
+
"name": "ROOM",
|
|
46
|
+
"class_name": "Room"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Deploy
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
wrangler login
|
|
57
|
+
wrangler secret put CALLS_APP_SECRET
|
|
58
|
+
wrangler deploy
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Environment Variables
|
|
62
|
+
|
|
63
|
+
**Required:**
|
|
64
|
+
- `CALLS_APP_ID`: From dashboard
|
|
65
|
+
- `CALLS_APP_SECRET`: From dashboard (secret)
|
|
66
|
+
|
|
67
|
+
**Optional:**
|
|
68
|
+
- `MAX_WEBCAM_BITRATE` (default: 1200000)
|
|
69
|
+
- `MAX_WEBCAM_FRAMERATE` (default: 24)
|
|
70
|
+
- `MAX_WEBCAM_QUALITY_LEVEL` (default: 1080)
|
|
71
|
+
- `TURN_SERVICE_ID`: TURN service
|
|
72
|
+
- `TURN_SERVICE_TOKEN`: TURN auth (secret)
|
|
73
|
+
|
|
74
|
+
## TURN Configuration
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
const pc = new RTCPeerConnection({
|
|
78
|
+
iceServers: [
|
|
79
|
+
{ urls: 'stun:stun.cloudflare.com:3478' },
|
|
80
|
+
{
|
|
81
|
+
urls: [
|
|
82
|
+
'turn:turn.cloudflare.com:3478?transport=udp',
|
|
83
|
+
'turn:turn.cloudflare.com:3478?transport=tcp',
|
|
84
|
+
'turns:turn.cloudflare.com:5349?transport=tcp'
|
|
85
|
+
],
|
|
86
|
+
username: turnUsername,
|
|
87
|
+
credential: turnCredential
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
bundlePolicy: 'max-bundle', // Recommended: reduces overhead
|
|
91
|
+
iceTransportPolicy: 'all' // Use 'relay' to force TURN (testing only)
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Ports:** 3478 (UDP/TCP), 53 (UDP), 80 (TCP), 443 (TLS), 5349 (TLS)
|
|
96
|
+
|
|
97
|
+
**When to use TURN:** Required for restrictive corporate firewalls/networks that block UDP. ~5-10% of connections fallback to TURN. STUN works for most users.
|
|
98
|
+
|
|
99
|
+
**ICE candidate filtering:** Cloudflare handles candidate filtering automatically. No need to manually filter candidates.
|
|
100
|
+
|
|
101
|
+
## Durable Object Boilerplate
|
|
102
|
+
|
|
103
|
+
Minimal presence system:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
export class Room {
|
|
107
|
+
private sessions = new Map<string, {userId: string, tracks: string[]}>();
|
|
108
|
+
|
|
109
|
+
async fetch(req: Request) {
|
|
110
|
+
const {pathname} = new URL(req.url);
|
|
111
|
+
const body = await req.json();
|
|
112
|
+
|
|
113
|
+
if (pathname === '/join') {
|
|
114
|
+
this.sessions.set(body.sessionId, {userId: body.userId, tracks: []});
|
|
115
|
+
return Response.json({participants: this.sessions.size});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (pathname === '/publish') {
|
|
119
|
+
this.sessions.get(body.sessionId)?.tracks.push(...body.tracks);
|
|
120
|
+
// Broadcast to others via WebSocket (not shown)
|
|
121
|
+
return new Response('OK');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return new Response('Not found', {status: 404});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Environment Validation
|
|
130
|
+
|
|
131
|
+
Check credentials before first API call:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
if (!env.CALLS_APP_ID || !env.CALLS_APP_SECRET) {
|
|
135
|
+
throw new Error('CALLS_APP_ID and CALLS_APP_SECRET required');
|
|
136
|
+
}
|
|
137
|
+
```
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Gotchas & Troubleshooting
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Slow initial connect (~1.8s)"
|
|
6
|
+
|
|
7
|
+
**Cause:** First STUN delayed during consensus forming (normal behavior)
|
|
8
|
+
**Solution:** Subsequent connections are faster. CF detects DTLS ClientHello early to compensate.
|
|
9
|
+
|
|
10
|
+
### "No media flow"
|
|
11
|
+
|
|
12
|
+
**Cause:** SDP exchange incomplete, connection not established, tracks not added before offer, browser permissions missing
|
|
13
|
+
**Solution:**
|
|
14
|
+
1. Verify SDP exchange complete
|
|
15
|
+
2. Check `pc.connectionState === 'connected'`
|
|
16
|
+
3. Ensure tracks added before creating offer
|
|
17
|
+
4. Confirm browser permissions granted
|
|
18
|
+
5. Use `chrome://webrtc-internals` for debugging
|
|
19
|
+
|
|
20
|
+
### "Track not receiving"
|
|
21
|
+
|
|
22
|
+
**Cause:** Track not published, track ID not shared, session IDs mismatch, `pc.ontrack` not set, renegotiation needed
|
|
23
|
+
**Solution:**
|
|
24
|
+
1. Verify track published successfully
|
|
25
|
+
2. Confirm track ID shared between peers
|
|
26
|
+
3. Check session IDs match
|
|
27
|
+
4. Set `pc.ontrack` handler before answer
|
|
28
|
+
5. Trigger renegotiation if needed
|
|
29
|
+
|
|
30
|
+
### "ICE connection failed"
|
|
31
|
+
|
|
32
|
+
**Cause:** Network changed, firewall blocked UDP, TURN needed, transient network issue
|
|
33
|
+
**Solution:**
|
|
34
|
+
```typescript
|
|
35
|
+
pc.oniceconnectionstatechange = async () => {
|
|
36
|
+
if (pc.iceConnectionState === 'failed') {
|
|
37
|
+
console.warn('ICE failed, attempting restart');
|
|
38
|
+
await pc.restartIce(); // Triggers new ICE gathering
|
|
39
|
+
|
|
40
|
+
// Create new offer with ICE restart flag
|
|
41
|
+
const offer = await pc.createOffer({iceRestart: true});
|
|
42
|
+
await pc.setLocalDescription(offer);
|
|
43
|
+
|
|
44
|
+
// Send to backend → Cloudflare API
|
|
45
|
+
await fetch(`/api/sessions/${sessionId}/renegotiate`, {
|
|
46
|
+
method: 'PUT',
|
|
47
|
+
body: JSON.stringify({sdp: offer.sdp})
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### "Track stuck/frozen"
|
|
54
|
+
|
|
55
|
+
**Cause:** Sender paused track, network congestion, codec mismatch, mobile browser backgrounded
|
|
56
|
+
**Solution:**
|
|
57
|
+
1. Check `track.enabled` and `track.readyState === 'live'`
|
|
58
|
+
2. Verify sender active: `pc.getSenders().find(s => s.track === track)`
|
|
59
|
+
3. Check stats for packet loss/jitter (see patterns.md)
|
|
60
|
+
4. On mobile: Re-acquire tracks when app foregrounded
|
|
61
|
+
5. Test with different codecs if persistent
|
|
62
|
+
|
|
63
|
+
### "Network change disconnects call"
|
|
64
|
+
|
|
65
|
+
**Cause:** Mobile switching WiFi↔cellular, laptop changing networks
|
|
66
|
+
**Solution:**
|
|
67
|
+
```typescript
|
|
68
|
+
// Listen for network changes
|
|
69
|
+
if ('connection' in navigator) {
|
|
70
|
+
(navigator as any).connection.addEventListener('change', async () => {
|
|
71
|
+
console.log('Network changed');
|
|
72
|
+
await pc.restartIce(); // Use ICE restart pattern above
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Or use PartyTracks (handles automatically)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Retry with Exponential Backoff
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
async function fetchWithRetry(url: string, options: RequestInit, maxRetries = 3) {
|
|
83
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
84
|
+
try {
|
|
85
|
+
const res = await fetch(url, options);
|
|
86
|
+
if (res.ok) return res;
|
|
87
|
+
if (res.status >= 500) throw new Error('Server error');
|
|
88
|
+
return res; // Client error, don't retry
|
|
89
|
+
} catch (err) {
|
|
90
|
+
if (i === maxRetries - 1) throw err;
|
|
91
|
+
const delay = Math.min(1000 * 2 ** i, 10000); // Cap at 10s
|
|
92
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Debugging with chrome://webrtc-internals
|
|
99
|
+
|
|
100
|
+
1. Open `chrome://webrtc-internals` in Chrome/Edge
|
|
101
|
+
2. Find your PeerConnection in the list
|
|
102
|
+
3. Check **Stats graphs** for packet loss, jitter, bandwidth
|
|
103
|
+
4. Check **ICE candidate pairs**: Look for `succeeded` state, relay vs host candidates
|
|
104
|
+
5. Check **getStats**: Raw metrics for inbound/outbound RTP
|
|
105
|
+
6. Look for errors in **Event log**: `iceConnectionState`, `connectionState` changes
|
|
106
|
+
7. Export data with "Download the PeerConnection updates and stats data" button
|
|
107
|
+
8. Common issues visible here: ICE failures, high packet loss, bitrate drops
|
|
108
|
+
|
|
109
|
+
## Limits
|
|
110
|
+
|
|
111
|
+
| Resource/Limit | Value | Notes |
|
|
112
|
+
|----------------|-------|-------|
|
|
113
|
+
| Egress (Free) | 1TB/month | Per account |
|
|
114
|
+
| Egress (Paid) | $0.05/GB | After free tier |
|
|
115
|
+
| Inbound traffic | Free | All plans |
|
|
116
|
+
| TURN service | Free | Included with SFU |
|
|
117
|
+
| Participants | No hard limit | Client bandwidth/CPU bound (typically 10-50 tracks) |
|
|
118
|
+
| Tracks per session | No hard limit | Client resources limited |
|
|
119
|
+
| Session duration | No hard limit | Production calls run for hours |
|
|
120
|
+
| WebRTC ports | UDP 1024-65535 | Outbound only, required for media |
|
|
121
|
+
| API rate limit | 600 req/min | Per app, burst allowed |
|
|
122
|
+
|
|
123
|
+
## Security Checklist
|
|
124
|
+
|
|
125
|
+
- ✅ **Never expose** `CALLS_APP_SECRET` to client
|
|
126
|
+
- ✅ **Validate user identity** in backend before creating sessions
|
|
127
|
+
- ✅ **Implement auth tokens** for session access (JWT in custom header)
|
|
128
|
+
- ✅ **Rate limit** session creation endpoints
|
|
129
|
+
- ✅ **Expire sessions** server-side after inactivity
|
|
130
|
+
- ✅ **Validate track IDs** before subscribing (prevent unauthorized access)
|
|
131
|
+
- ✅ **Use HTTPS** for all signaling (API calls)
|
|
132
|
+
- ✅ **Enable DTLS-SRTP** (automatic with Cloudflare, encrypts media)
|
|
133
|
+
- ⚠️ **Consider E2EE** for sensitive content (implement client-side with Insertable Streams API)
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Patterns & Use Cases
|
|
2
|
+
|
|
3
|
+
## Architecture
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Client (WebRTC) <---> CF Edge <---> Backend (HTTP)
|
|
7
|
+
|
|
|
8
|
+
CF Backbone (310+ DCs)
|
|
9
|
+
|
|
|
10
|
+
Other Edges <---> Other Clients
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Anycast: Last-mile <50ms (95%), no region select, NACK shield, distributed consensus
|
|
14
|
+
|
|
15
|
+
Cascading trees auto-scale to millions:
|
|
16
|
+
```
|
|
17
|
+
Publisher -> Edge A -> Edge B -> Sub1
|
|
18
|
+
\-> Edge C -> Sub2,3
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Use Cases
|
|
22
|
+
|
|
23
|
+
**1:1:** A creates session+publishes, B creates+subscribes to A+publishes, A subscribes to B
|
|
24
|
+
**N:N:** All create session+publish, backend broadcasts track IDs, all subscribe to others
|
|
25
|
+
**1:N:** Publisher creates+publishes, viewers each create+subscribe (no fan-out limit)
|
|
26
|
+
**Breakout:** Same PeerConnection! Backend closes/adds tracks, no recreation
|
|
27
|
+
|
|
28
|
+
## PartyTracks (Recommended)
|
|
29
|
+
|
|
30
|
+
Observable-based client with automatic device/network handling:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import {PartyTracks} from 'partytracks';
|
|
34
|
+
|
|
35
|
+
// Create client
|
|
36
|
+
const pt = new PartyTracks({
|
|
37
|
+
apiUrl: '/api/calls',
|
|
38
|
+
sessionId: 'my-session',
|
|
39
|
+
onTrack: (track, peer) => {
|
|
40
|
+
const video = document.getElementById(`video-${peer.id}`) as HTMLVideoElement;
|
|
41
|
+
video.srcObject = new MediaStream([track]);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Publish camera (push API)
|
|
46
|
+
const camera = await pt.getCamera(); // Auto-requests permissions, handles device changes
|
|
47
|
+
await pt.publishTrack(camera, {trackName: 'my-camera'});
|
|
48
|
+
|
|
49
|
+
// Subscribe to remote track (pull API)
|
|
50
|
+
await pt.subscribeToTrack({trackName: 'remote-camera', sessionId: 'other-session'});
|
|
51
|
+
|
|
52
|
+
// React hook example
|
|
53
|
+
import {useObservableAsValue} from 'observable-hooks';
|
|
54
|
+
|
|
55
|
+
function VideoCall() {
|
|
56
|
+
const localTracks = useObservableAsValue(pt.localTracks$);
|
|
57
|
+
const remoteTracks = useObservableAsValue(pt.remoteTracks$);
|
|
58
|
+
|
|
59
|
+
return <div>{/* Render tracks */}</div>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Screenshare
|
|
63
|
+
const screen = await pt.getScreenshare();
|
|
64
|
+
await pt.publishTrack(screen, {trackName: 'my-screen'});
|
|
65
|
+
|
|
66
|
+
// Handle device changes (automatic)
|
|
67
|
+
// PartyTracks detects device changes (e.g., Bluetooth headset) and renegotiates
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Backend
|
|
71
|
+
|
|
72
|
+
Express:
|
|
73
|
+
```js
|
|
74
|
+
app.post('/api/new-session', async (req, res) => {
|
|
75
|
+
const r = await fetch(`${CALLS_API}/apps/${process.env.CALLS_APP_ID}/sessions/new`,
|
|
76
|
+
{method: 'POST', headers: {'Authorization': `Bearer ${process.env.CALLS_APP_SECRET}`}});
|
|
77
|
+
res.json(await r.json());
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Workers: Same pattern, use `env.CALLS_APP_ID` and `env.CALLS_APP_SECRET`
|
|
82
|
+
|
|
83
|
+
DO Presence: See configuration.md for boilerplate
|
|
84
|
+
|
|
85
|
+
## Audio Level Detection
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Attach analyzer to audio track
|
|
89
|
+
function attachAudioLevelDetector(track: MediaStreamTrack) {
|
|
90
|
+
const ctx = new AudioContext();
|
|
91
|
+
const analyzer = ctx.createAnalyser();
|
|
92
|
+
const src = ctx.createMediaStreamSource(new MediaStream([track]));
|
|
93
|
+
src.connect(analyzer);
|
|
94
|
+
|
|
95
|
+
const data = new Uint8Array(analyzer.frequencyBinCount);
|
|
96
|
+
const checkLevel = () => {
|
|
97
|
+
analyzer.getByteFrequencyData(data);
|
|
98
|
+
const level = data.reduce((a, b) => a + b) / data.length;
|
|
99
|
+
if (level > 30) console.log('Speaking:', level); // Trigger UI update
|
|
100
|
+
requestAnimationFrame(checkLevel);
|
|
101
|
+
};
|
|
102
|
+
checkLevel();
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Connection Quality Monitoring
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
pc.getStats().then(stats => {
|
|
110
|
+
stats.forEach(report => {
|
|
111
|
+
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
112
|
+
const {packetsLost, packetsReceived, jitter} = report;
|
|
113
|
+
const lossRate = packetsLost / (packetsLost + packetsReceived);
|
|
114
|
+
if (lossRate > 0.05) console.warn('High packet loss:', lossRate);
|
|
115
|
+
if (jitter > 100) console.warn('High jitter:', jitter);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Stage Management (Limit Visible Participants)
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Subscribe to top 6 active speakers only
|
|
125
|
+
let activeSubscriptions = new Set<string>();
|
|
126
|
+
|
|
127
|
+
function updateStage(topSpeakers: string[]) {
|
|
128
|
+
const toAdd = topSpeakers.filter(id => !activeSubscriptions.has(id)).slice(0, 6);
|
|
129
|
+
const toRemove = [...activeSubscriptions].filter(id => !topSpeakers.includes(id));
|
|
130
|
+
|
|
131
|
+
toRemove.forEach(id => {
|
|
132
|
+
pc.getSenders().find(s => s.track?.id === id)?.track?.stop();
|
|
133
|
+
activeSubscriptions.delete(id);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
toAdd.forEach(async id => {
|
|
137
|
+
await fetch(`/api/subscribe`, {method: 'POST', body: JSON.stringify({trackId: id})});
|
|
138
|
+
activeSubscriptions.add(id);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Advanced
|
|
144
|
+
|
|
145
|
+
Bandwidth mgmt:
|
|
146
|
+
```ts
|
|
147
|
+
const s = pc.getSenders().find(s => s.track?.kind === 'video');
|
|
148
|
+
const p = s.getParameters();
|
|
149
|
+
if (!p.encodings) p.encodings = [{}];
|
|
150
|
+
p.encodings[0].maxBitrate = 1200000; p.encodings[0].maxFramerate = 24;
|
|
151
|
+
await s.setParameters(p);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Simulcast (CF auto-forwards best layer):
|
|
155
|
+
```ts
|
|
156
|
+
pc.addTransceiver('video', {direction: 'sendonly', sendEncodings: [
|
|
157
|
+
{rid: 'high', maxBitrate: 1200000},
|
|
158
|
+
{rid: 'med', maxBitrate: 600000, scaleResolutionDownBy: 2},
|
|
159
|
+
{rid: 'low', maxBitrate: 200000, scaleResolutionDownBy: 4}
|
|
160
|
+
]});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
DataChannel:
|
|
164
|
+
```ts
|
|
165
|
+
const dc = pc.createDataChannel('chat', {ordered: true, maxRetransmits: 3});
|
|
166
|
+
dc.onopen = () => dc.send(JSON.stringify({type: 'chat', text: 'Hi'}));
|
|
167
|
+
dc.onmessage = (e) => console.log('RX:', JSON.parse(e.data));
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**WHIP/WHEP:** For streaming interop (OBS → SFU, SFU → video players), use WHIP (ingest) and WHEP (egress) protocols. See Cloudflare Stream integration docs.
|
|
171
|
+
|
|
172
|
+
Integrations: R2 for recording `env.R2_BUCKET.put(...)`, Queues for analytics
|
|
173
|
+
|
|
174
|
+
Perf: 100-250ms connect, ~50ms latency (95%), 200-400ms glass-to-glass, no participant limit (client: 10-50 tracks)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Cloudflare RealtimeKit
|
|
2
|
+
|
|
3
|
+
Expert guidance for building real-time video and audio applications using **Cloudflare RealtimeKit** - a comprehensive SDK suite for adding customizable live video and voice to web or mobile applications.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
RealtimeKit is Cloudflare's SDK suite built on Realtime SFU, abstracting WebRTC complexity with fast integration, pre-built UI components, global performance (300+ cities), and production features (recording, transcription, chat, polls).
|
|
8
|
+
|
|
9
|
+
**Use cases**: Team meetings, webinars, social video, audio calls, interactive plugins
|
|
10
|
+
|
|
11
|
+
## Core Concepts
|
|
12
|
+
|
|
13
|
+
- **App**: Workspace grouping meetings, participants, presets, recordings. Use separate Apps for staging/production
|
|
14
|
+
- **Meeting**: Re-usable virtual room. Each join creates new **Session**
|
|
15
|
+
- **Session**: Live meeting instance. Created on first join, ends after last leave
|
|
16
|
+
- **Participant**: User added via REST API. Returns `authToken` for client SDK. **Do not reuse tokens**
|
|
17
|
+
- **Preset**: Reusable permission/UI template (permissions, meeting type, theme). Applied at participant creation
|
|
18
|
+
- **Peer ID** (`id`): Unique per session, changes on rejoin
|
|
19
|
+
- **Participant ID** (`userId`): Persistent across sessions
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### 1. Create App & Meeting (Backend)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Create app
|
|
27
|
+
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/apps' \
|
|
28
|
+
-H 'Authorization: Bearer <api_token>' \
|
|
29
|
+
-d '{"name": "My RealtimeKit App"}'
|
|
30
|
+
|
|
31
|
+
# Create meeting
|
|
32
|
+
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/meetings' \
|
|
33
|
+
-H 'Authorization: Bearer <api_token>' \
|
|
34
|
+
-d '{"title": "Team Standup"}'
|
|
35
|
+
|
|
36
|
+
# Add participant
|
|
37
|
+
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<account_id>/realtime/kit/<app_id>/meetings/<meeting_id>/participants' \
|
|
38
|
+
-H 'Authorization: Bearer <api_token>' \
|
|
39
|
+
-d '{"name": "Alice", "preset_name": "host"}'
|
|
40
|
+
# Returns: { authToken }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 2. Client Integration
|
|
44
|
+
|
|
45
|
+
**React**:
|
|
46
|
+
```tsx
|
|
47
|
+
import { RtkMeeting } from '@cloudflare/realtimekit-react-ui';
|
|
48
|
+
|
|
49
|
+
function App() {
|
|
50
|
+
return <RtkMeeting authToken="<participant_auth_token>" onLeave={() => {}} />;
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Core SDK**:
|
|
55
|
+
```typescript
|
|
56
|
+
import RealtimeKitClient from '@cloudflare/realtimekit';
|
|
57
|
+
|
|
58
|
+
const meeting = new RealtimeKitClient({ authToken: '<token>', video: true, audio: true });
|
|
59
|
+
await meeting.join();
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Reading Order
|
|
63
|
+
|
|
64
|
+
| Task | Files |
|
|
65
|
+
|------|-------|
|
|
66
|
+
| Quick integration | README only |
|
|
67
|
+
| Custom UI | README → patterns → api |
|
|
68
|
+
| Backend setup | README → configuration |
|
|
69
|
+
| Debug issues | gotchas |
|
|
70
|
+
| Advanced features | patterns → api |
|
|
71
|
+
|
|
72
|
+
## RealtimeKit vs Realtime SFU
|
|
73
|
+
|
|
74
|
+
| Choose | When |
|
|
75
|
+
|--------|------|
|
|
76
|
+
| **RealtimeKit** | Need pre-built UI, fast integration, React/Angular/HTML |
|
|
77
|
+
| **Realtime SFU** | Building from scratch, custom WebRTC, full control |
|
|
78
|
+
|
|
79
|
+
RealtimeKit is built on Realtime SFU but abstracts WebRTC complexity with UI components and SDKs.
|
|
80
|
+
|
|
81
|
+
## Which Package?
|
|
82
|
+
|
|
83
|
+
Need pre-built meeting UI?
|
|
84
|
+
- React → `@cloudflare/realtimekit-react-ui` (`<RtkMeeting>`)
|
|
85
|
+
- Angular → `@cloudflare/realtimekit-angular-ui`
|
|
86
|
+
- HTML/Vanilla → `@cloudflare/realtimekit-ui`
|
|
87
|
+
|
|
88
|
+
Need custom UI?
|
|
89
|
+
- Core SDK → `@cloudflare/realtimekit` (RealtimeKitClient) - full control
|
|
90
|
+
|
|
91
|
+
Need raw WebRTC control?
|
|
92
|
+
- See `realtime-sfu/` reference
|
|
93
|
+
|
|
94
|
+
## In This Reference
|
|
95
|
+
|
|
96
|
+
- [Configuration](./configuration.md) - Setup, installation, wrangler config
|
|
97
|
+
- [API](./api.md) - Meeting object, REST API, SDK methods
|
|
98
|
+
- [Patterns](./patterns.md) - Common workflows, code examples
|
|
99
|
+
- [Gotchas](./gotchas.md) - Common issues, troubleshooting
|
|
100
|
+
|
|
101
|
+
## See Also
|
|
102
|
+
|
|
103
|
+
- [Workers](../workers/) - Backend integration
|
|
104
|
+
- [D1](../d1/) - Meeting metadata storage
|
|
105
|
+
- [R2](../r2/) - Recording storage
|
|
106
|
+
- [KV](../kv/) - Session management
|
|
107
|
+
|
|
108
|
+
## Reference Links
|
|
109
|
+
|
|
110
|
+
- **Official Docs**: https://developers.cloudflare.com/realtime/realtimekit/
|
|
111
|
+
- **API Reference**: https://developers.cloudflare.com/api/resources/realtime_kit/
|
|
112
|
+
- **Examples**: https://github.com/cloudflare/realtimekit-web-examples
|
|
113
|
+
- **Dashboard**: https://dash.cloudflare.com/?to=/:account/realtime/kit
|