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,195 @@
|
|
|
1
|
+
# Stream Live Streaming API
|
|
2
|
+
|
|
3
|
+
Live input creation, status checking, simulcast, and WebRTC streaming.
|
|
4
|
+
|
|
5
|
+
## Create Live Input
|
|
6
|
+
|
|
7
|
+
### Using Cloudflare SDK
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import Cloudflare from 'cloudflare';
|
|
11
|
+
|
|
12
|
+
const client = new Cloudflare({ apiToken: env.CF_API_TOKEN });
|
|
13
|
+
|
|
14
|
+
const liveInput = await client.stream.liveInputs.create({
|
|
15
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
16
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
17
|
+
deleteRecordingAfterDays: 30
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Returns: { uid, rtmps, srt, webRTC }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Raw fetch API
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
async function createLiveInput(accountId: string, apiToken: string) {
|
|
27
|
+
const response = await fetch(
|
|
28
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs`,
|
|
29
|
+
{
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
32
|
+
body: JSON.stringify({
|
|
33
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
34
|
+
deleteRecordingAfterDays: 30
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
const { result } = await response.json();
|
|
39
|
+
return {
|
|
40
|
+
uid: result.uid,
|
|
41
|
+
rtmps: { url: result.rtmps.url, streamKey: result.rtmps.streamKey },
|
|
42
|
+
srt: { url: result.srt.url, streamId: result.srt.streamId, passphrase: result.srt.passphrase },
|
|
43
|
+
webRTC: result.webRTC
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Check Live Status
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
async function getLiveStatus(accountId: string, liveInputId: string, apiToken: string) {
|
|
52
|
+
const response = await fetch(
|
|
53
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs/${liveInputId}`,
|
|
54
|
+
{ headers: { 'Authorization': `Bearer ${apiToken}` } }
|
|
55
|
+
);
|
|
56
|
+
const { result } = await response.json();
|
|
57
|
+
return {
|
|
58
|
+
isLive: result.status?.current?.state === 'connected',
|
|
59
|
+
recording: result.recording,
|
|
60
|
+
status: result.status
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Simulcast (Live Outputs)
|
|
66
|
+
|
|
67
|
+
### Create Output
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
async function createLiveOutput(
|
|
71
|
+
accountId: string, liveInputId: string, apiToken: string,
|
|
72
|
+
outputUrl: string, streamKey: string
|
|
73
|
+
) {
|
|
74
|
+
return fetch(
|
|
75
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/live_inputs/${liveInputId}/outputs`,
|
|
76
|
+
{
|
|
77
|
+
method: 'POST',
|
|
78
|
+
headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
79
|
+
body: JSON.stringify({
|
|
80
|
+
url: `${outputUrl}/${streamKey}`,
|
|
81
|
+
enabled: true,
|
|
82
|
+
streamKey // For platforms like YouTube, Twitch
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
).then(r => r.json());
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Example: Simulcast to YouTube + Twitch
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
const liveInput = await createLiveInput(accountId, apiToken);
|
|
93
|
+
|
|
94
|
+
// Add YouTube output
|
|
95
|
+
await createLiveOutput(
|
|
96
|
+
accountId, liveInput.uid, apiToken,
|
|
97
|
+
'rtmp://a.rtmp.youtube.com/live2',
|
|
98
|
+
'your-youtube-stream-key'
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// Add Twitch output
|
|
102
|
+
await createLiveOutput(
|
|
103
|
+
accountId, liveInput.uid, apiToken,
|
|
104
|
+
'rtmp://live.twitch.tv/app',
|
|
105
|
+
'your-twitch-stream-key'
|
|
106
|
+
);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## WebRTC Streaming (WHIP/WHEP)
|
|
110
|
+
|
|
111
|
+
### Browser to Stream (WHIP)
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
async function startWebRTCBroadcast(liveInputId: string) {
|
|
115
|
+
const pc = new RTCPeerConnection();
|
|
116
|
+
|
|
117
|
+
// Add local media tracks
|
|
118
|
+
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
|
|
119
|
+
stream.getTracks().forEach(track => pc.addTrack(track, stream));
|
|
120
|
+
|
|
121
|
+
// Create offer
|
|
122
|
+
const offer = await pc.createOffer();
|
|
123
|
+
await pc.setLocalDescription(offer);
|
|
124
|
+
|
|
125
|
+
// Send to Stream via WHIP
|
|
126
|
+
const response = await fetch(
|
|
127
|
+
`https://customer-<CODE>.cloudflarestream.com/${liveInputId}/webRTC/publish`,
|
|
128
|
+
{
|
|
129
|
+
method: 'POST',
|
|
130
|
+
headers: { 'Content-Type': 'application/sdp' },
|
|
131
|
+
body: offer.sdp
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const answer = await response.text();
|
|
136
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: answer });
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Stream to Browser (WHEP)
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
async function playWebRTCStream(videoId: string) {
|
|
144
|
+
const pc = new RTCPeerConnection();
|
|
145
|
+
|
|
146
|
+
pc.addTransceiver('video', { direction: 'recvonly' });
|
|
147
|
+
pc.addTransceiver('audio', { direction: 'recvonly' });
|
|
148
|
+
|
|
149
|
+
const offer = await pc.createOffer();
|
|
150
|
+
await pc.setLocalDescription(offer);
|
|
151
|
+
|
|
152
|
+
const response = await fetch(
|
|
153
|
+
`https://customer-<CODE>.cloudflarestream.com/${videoId}/webRTC/play`,
|
|
154
|
+
{
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: { 'Content-Type': 'application/sdp' },
|
|
157
|
+
body: offer.sdp
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
const answer = await response.text();
|
|
162
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: answer });
|
|
163
|
+
|
|
164
|
+
return pc;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Recording Settings
|
|
169
|
+
|
|
170
|
+
| Mode | Behavior |
|
|
171
|
+
|------|----------|
|
|
172
|
+
| `automatic` | Record all live streams |
|
|
173
|
+
| `off` | No recording |
|
|
174
|
+
| `timeoutSeconds` | Stop recording after N seconds of inactivity |
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
const recordingConfig = {
|
|
178
|
+
mode: 'automatic',
|
|
179
|
+
timeoutSeconds: 30, // Auto-stop 30s after stream ends
|
|
180
|
+
requireSignedURLs: true, // Require token for VOD playback
|
|
181
|
+
allowedOrigins: ['https://yourdomain.com']
|
|
182
|
+
};
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## In This Reference
|
|
186
|
+
|
|
187
|
+
- [README.md](./README.md) - Overview and quick start
|
|
188
|
+
- [api.md](./api.md) - On-demand video APIs
|
|
189
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
190
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
191
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
192
|
+
|
|
193
|
+
## See Also
|
|
194
|
+
|
|
195
|
+
- [workers](../workers/) - Deploy live APIs in Workers
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Stream API Reference
|
|
2
|
+
|
|
3
|
+
Upload, playback, live streaming, and management APIs.
|
|
4
|
+
|
|
5
|
+
## Upload APIs
|
|
6
|
+
|
|
7
|
+
### Direct Creator Upload (Recommended)
|
|
8
|
+
|
|
9
|
+
**Backend: Create upload URL (SDK)**
|
|
10
|
+
```typescript
|
|
11
|
+
import Cloudflare from 'cloudflare';
|
|
12
|
+
|
|
13
|
+
const client = new Cloudflare({ apiToken: env.CF_API_TOKEN });
|
|
14
|
+
|
|
15
|
+
const uploadData = await client.stream.directUpload.create({
|
|
16
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
17
|
+
maxDurationSeconds: 3600,
|
|
18
|
+
requireSignedURLs: true,
|
|
19
|
+
meta: { creator: 'user-123' }
|
|
20
|
+
});
|
|
21
|
+
// Returns: { uploadURL: string, uid: string }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Frontend: Upload file**
|
|
25
|
+
```typescript
|
|
26
|
+
async function uploadVideo(file: File, uploadURL: string) {
|
|
27
|
+
const formData = new FormData();
|
|
28
|
+
formData.append('file', file);
|
|
29
|
+
return fetch(uploadURL, { method: 'POST', body: formData }).then(r => r.json());
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Upload from URL
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const video = await client.stream.copy.create({
|
|
37
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
38
|
+
url: 'https://example.com/video.mp4',
|
|
39
|
+
meta: { name: 'My Video' },
|
|
40
|
+
requireSignedURLs: false
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Playback APIs
|
|
45
|
+
|
|
46
|
+
### Embed Player (iframe)
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<iframe
|
|
50
|
+
src="https://customer-<CODE>.cloudflarestream.com/<VIDEO_ID>/iframe?autoplay=true&muted=true"
|
|
51
|
+
style="border: none;" height="720" width="1280"
|
|
52
|
+
allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;"
|
|
53
|
+
allowfullscreen="true"
|
|
54
|
+
></iframe>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### HLS/DASH Manifest URLs
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// HLS
|
|
61
|
+
const hlsUrl = `https://customer-<CODE>.cloudflarestream.com/${videoId}/manifest/video.m3u8`;
|
|
62
|
+
|
|
63
|
+
// DASH
|
|
64
|
+
const dashUrl = `https://customer-<CODE>.cloudflarestream.com/${videoId}/manifest/video.mpd`;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Thumbnails
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// At specific time (seconds)
|
|
71
|
+
const thumb = `https://customer-<CODE>.cloudflarestream.com/${videoId}/thumbnails/thumbnail.jpg?time=10s`;
|
|
72
|
+
|
|
73
|
+
// By percentage
|
|
74
|
+
const thumbPct = `https://customer-<CODE>.cloudflarestream.com/${videoId}/thumbnails/thumbnail.jpg?time=50%`;
|
|
75
|
+
|
|
76
|
+
// Animated GIF
|
|
77
|
+
const gif = `https://customer-<CODE>.cloudflarestream.com/${videoId}/thumbnails/thumbnail.gif`;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Signed URLs
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// Low volume (<1k/day): Use API
|
|
84
|
+
async function getSignedToken(accountId: string, videoId: string, apiToken: string) {
|
|
85
|
+
const response = await fetch(
|
|
86
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/${videoId}/token`,
|
|
87
|
+
{
|
|
88
|
+
method: 'POST',
|
|
89
|
+
headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
90
|
+
body: JSON.stringify({
|
|
91
|
+
exp: Math.floor(Date.now() / 1000) + 3600,
|
|
92
|
+
accessRules: [{ type: 'ip.geoip.country', action: 'allow', country: ['US'] }]
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
return (await response.json()).result.token;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// High volume: Self-sign with RS256 JWT (see "Self-Sign JWT" in patterns.md)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Captions & Clips
|
|
103
|
+
|
|
104
|
+
### Upload Captions
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
async function uploadCaption(
|
|
108
|
+
accountId: string, videoId: string, apiToken: string,
|
|
109
|
+
language: string, captionFile: File
|
|
110
|
+
) {
|
|
111
|
+
const formData = new FormData();
|
|
112
|
+
formData.append('file', captionFile);
|
|
113
|
+
return fetch(
|
|
114
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/${videoId}/captions/${language}`,
|
|
115
|
+
{
|
|
116
|
+
method: 'PUT',
|
|
117
|
+
headers: { 'Authorization': `Bearer ${apiToken}` },
|
|
118
|
+
body: formData
|
|
119
|
+
}
|
|
120
|
+
).then(r => r.json());
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Generate AI Captions
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
// TODO: Requires Workers AI integration - see workers-ai reference
|
|
128
|
+
async function generateAICaptions(accountId: string, videoId: string, apiToken: string) {
|
|
129
|
+
return fetch(
|
|
130
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/${videoId}/captions/generate`,
|
|
131
|
+
{
|
|
132
|
+
method: 'POST',
|
|
133
|
+
headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
134
|
+
body: JSON.stringify({ language: 'en' })
|
|
135
|
+
}
|
|
136
|
+
).then(r => r.json());
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Clip Video
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
async function clipVideo(
|
|
144
|
+
accountId: string, videoId: string, apiToken: string,
|
|
145
|
+
startTime: number, endTime: number
|
|
146
|
+
) {
|
|
147
|
+
return fetch(
|
|
148
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/clip`,
|
|
149
|
+
{
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: { 'Authorization': `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
152
|
+
body: JSON.stringify({
|
|
153
|
+
clippedFromVideoUID: videoId,
|
|
154
|
+
startTimeSeconds: startTime,
|
|
155
|
+
endTimeSeconds: endTime
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
).then(r => r.json());
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Video Management
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// List videos
|
|
166
|
+
const videos = await client.stream.videos.list({
|
|
167
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
168
|
+
search: 'keyword' // optional
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Get video details
|
|
172
|
+
const video = await client.stream.videos.get(videoId, {
|
|
173
|
+
account_id: env.CF_ACCOUNT_ID
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Update video
|
|
177
|
+
await client.stream.videos.update(videoId, {
|
|
178
|
+
account_id: env.CF_ACCOUNT_ID,
|
|
179
|
+
meta: { title: 'New Title' },
|
|
180
|
+
requireSignedURLs: true
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Delete video
|
|
184
|
+
await client.stream.videos.delete(videoId, {
|
|
185
|
+
account_id: env.CF_ACCOUNT_ID
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## In This Reference
|
|
190
|
+
|
|
191
|
+
- [README.md](./README.md) - Overview and quick start
|
|
192
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
193
|
+
- [api-live.md](./api-live.md) - Live streaming APIs (RTMPS/SRT/WebRTC)
|
|
194
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
195
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
196
|
+
|
|
197
|
+
## See Also
|
|
198
|
+
|
|
199
|
+
- [workers](../workers/) - Deploy Stream APIs in Workers
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Stream Configuration
|
|
2
|
+
|
|
3
|
+
Setup, environment variables, and wrangler configuration.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Official Cloudflare SDK (Node.js, Workers, Pages)
|
|
9
|
+
npm install cloudflare
|
|
10
|
+
|
|
11
|
+
# React component library
|
|
12
|
+
npm install @cloudflare/stream-react
|
|
13
|
+
|
|
14
|
+
# TUS resumable uploads (large files)
|
|
15
|
+
npm install tus-js-client
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Environment Variables
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Required
|
|
22
|
+
CF_ACCOUNT_ID=your-account-id
|
|
23
|
+
CF_API_TOKEN=your-api-token
|
|
24
|
+
|
|
25
|
+
# For signed URLs (high volume)
|
|
26
|
+
STREAM_KEY_ID=your-key-id
|
|
27
|
+
STREAM_JWK=base64-encoded-jwk
|
|
28
|
+
|
|
29
|
+
# For webhooks
|
|
30
|
+
WEBHOOK_SECRET=your-webhook-secret
|
|
31
|
+
|
|
32
|
+
# Customer subdomain (from dashboard)
|
|
33
|
+
STREAM_CUSTOMER_CODE=your-customer-code
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Wrangler Configuration
|
|
37
|
+
|
|
38
|
+
```jsonc
|
|
39
|
+
{
|
|
40
|
+
"name": "stream-worker",
|
|
41
|
+
"main": "src/index.ts",
|
|
42
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
43
|
+
"vars": {
|
|
44
|
+
"CF_ACCOUNT_ID": "your-account-id"
|
|
45
|
+
}
|
|
46
|
+
// Store secrets: wrangler secret put CF_API_TOKEN
|
|
47
|
+
// wrangler secret put STREAM_KEY_ID
|
|
48
|
+
// wrangler secret put STREAM_JWK
|
|
49
|
+
// wrangler secret put WEBHOOK_SECRET
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Signing Keys (High Volume)
|
|
54
|
+
|
|
55
|
+
Create once for self-signing tokens (thousands of daily users).
|
|
56
|
+
|
|
57
|
+
**Create key**
|
|
58
|
+
```bash
|
|
59
|
+
curl -X POST \
|
|
60
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/keys" \
|
|
61
|
+
-H "Authorization: Bearer <API_TOKEN>"
|
|
62
|
+
|
|
63
|
+
# Save `id` and `jwk` (base64) from response
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Store in secrets**
|
|
67
|
+
```bash
|
|
68
|
+
wrangler secret put STREAM_KEY_ID
|
|
69
|
+
wrangler secret put STREAM_JWK
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Webhooks
|
|
73
|
+
|
|
74
|
+
**Setup webhook URL**
|
|
75
|
+
```bash
|
|
76
|
+
curl -X PUT \
|
|
77
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/webhook" \
|
|
78
|
+
-H "Authorization: Bearer <API_TOKEN>" \
|
|
79
|
+
-H "Content-Type: application/json" \
|
|
80
|
+
-d '{"notificationUrl": "https://your-worker.workers.dev/webhook"}'
|
|
81
|
+
|
|
82
|
+
# Save the returned `secret` for signature verification
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Store secret**
|
|
86
|
+
```bash
|
|
87
|
+
wrangler secret put WEBHOOK_SECRET
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Direct Upload / Live / Watermark Config
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// Direct upload
|
|
94
|
+
const uploadConfig = {
|
|
95
|
+
maxDurationSeconds: 3600,
|
|
96
|
+
expiry: new Date(Date.now() + 3600000).toISOString(),
|
|
97
|
+
requireSignedURLs: true,
|
|
98
|
+
allowedOrigins: ['https://yourdomain.com'],
|
|
99
|
+
meta: { creator: 'user-123' }
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Live input
|
|
103
|
+
const liveConfig = {
|
|
104
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
105
|
+
deleteRecordingAfterDays: 30
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Watermark
|
|
109
|
+
const watermark = {
|
|
110
|
+
name: 'Logo', opacity: 0.7, padding: 20,
|
|
111
|
+
position: 'lowerRight', scale: 0.15
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Access Rules & Player Config
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// Access rules: allow US/CA, block CN/RU, or IP allowlist
|
|
119
|
+
const geoRestrict = [
|
|
120
|
+
{ type: 'ip.geoip.country', action: 'allow', country: ['US', 'CA'] },
|
|
121
|
+
{ type: 'any', action: 'block' }
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
// Player params for iframe
|
|
125
|
+
const playerParams = new URLSearchParams({
|
|
126
|
+
autoplay: 'true', muted: 'true', preload: 'auto', defaultTextTrack: 'en'
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## In This Reference
|
|
131
|
+
|
|
132
|
+
- [README.md](./README.md) - Overview and quick start
|
|
133
|
+
- [api.md](./api.md) - On-demand video APIs
|
|
134
|
+
- [api-live.md](./api-live.md) - Live streaming APIs
|
|
135
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
136
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
137
|
+
|
|
138
|
+
## See Also
|
|
139
|
+
|
|
140
|
+
- [wrangler](../wrangler/) - Wrangler CLI and configuration
|
|
141
|
+
- [workers](../workers/) - Deploy Stream APIs in Workers
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Stream Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "ERR_NON_VIDEO"
|
|
6
|
+
|
|
7
|
+
**Cause:** Uploaded file is not a valid video format
|
|
8
|
+
**Solution:** Ensure file is in supported format (MP4, MKV, MOV, AVI, FLV, MPEG-2 TS/PS, MXF, LXF, GXF, 3GP, WebM, MPG, QuickTime)
|
|
9
|
+
|
|
10
|
+
### "ERR_DURATION_EXCEED_CONSTRAINT"
|
|
11
|
+
|
|
12
|
+
**Cause:** Video duration exceeds `maxDurationSeconds` constraint
|
|
13
|
+
**Solution:** Increase `maxDurationSeconds` in direct upload config or trim video before upload
|
|
14
|
+
|
|
15
|
+
### "ERR_FETCH_ORIGIN_ERROR"
|
|
16
|
+
|
|
17
|
+
**Cause:** Failed to download video from URL (upload from URL)
|
|
18
|
+
**Solution:** Ensure URL is publicly accessible, uses HTTPS, and video file is available
|
|
19
|
+
|
|
20
|
+
### "ERR_MALFORMED_VIDEO"
|
|
21
|
+
|
|
22
|
+
**Cause:** Video file is corrupted or improperly encoded
|
|
23
|
+
**Solution:** Re-encode video using FFmpeg or check source file integrity
|
|
24
|
+
|
|
25
|
+
### "ERR_DURATION_TOO_SHORT"
|
|
26
|
+
|
|
27
|
+
**Cause:** Video must be at least 0.1 seconds long
|
|
28
|
+
**Solution:** Ensure video has valid duration (not a single frame)
|
|
29
|
+
|
|
30
|
+
## Troubleshooting
|
|
31
|
+
|
|
32
|
+
### Video stuck in "inprogress" state
|
|
33
|
+
- **Cause**: Processing large/complex video
|
|
34
|
+
- **Solution**: Wait up to 5 minutes for processing; use webhooks instead of polling
|
|
35
|
+
|
|
36
|
+
### Signed URL returns 403
|
|
37
|
+
- **Cause**: Token expired or invalid signature
|
|
38
|
+
- **Solution**: Check expiration timestamp, verify JWK is correct, ensure clock sync
|
|
39
|
+
|
|
40
|
+
### Live stream not connecting
|
|
41
|
+
- **Cause**: Invalid RTMPS URL or stream key
|
|
42
|
+
- **Solution**: Use exact URL/key from API, ensure firewall allows outbound 443
|
|
43
|
+
|
|
44
|
+
### Webhook signature verification fails
|
|
45
|
+
- **Cause**: Incorrect secret or timestamp window
|
|
46
|
+
- **Solution**: Use exact secret from webhook setup, allow 5-minute timestamp drift
|
|
47
|
+
|
|
48
|
+
### Video uploads but isn't visible
|
|
49
|
+
- **Cause**: `requireSignedURLs` enabled without providing token
|
|
50
|
+
- **Solution**: Generate signed token or set `requireSignedURLs: false` for public videos
|
|
51
|
+
|
|
52
|
+
### Player shows infinite loading
|
|
53
|
+
- **Cause**: CORS issue with allowedOrigins
|
|
54
|
+
- **Solution**: Add your domain to `allowedOrigins` array
|
|
55
|
+
|
|
56
|
+
## Limits
|
|
57
|
+
|
|
58
|
+
| Resource | Limit |
|
|
59
|
+
|----------|-------|
|
|
60
|
+
| Max file size | 30 GB |
|
|
61
|
+
| Max frame rate | 60 fps (recommended) |
|
|
62
|
+
| Max duration per direct upload | Configurable via `maxDurationSeconds` |
|
|
63
|
+
| Token generation (API endpoint) | 1,000/day recommended (use signing keys for higher) |
|
|
64
|
+
| Live input outputs (simulcast) | 5 per live input |
|
|
65
|
+
| Webhook retry attempts | 5 (exponential backoff) |
|
|
66
|
+
| Webhook timeout | 30 seconds |
|
|
67
|
+
| Caption file size | 5 MB |
|
|
68
|
+
| Watermark image size | 2 MB |
|
|
69
|
+
| Metadata keys per video | Unlimited |
|
|
70
|
+
| Search results per page | Max 1,000 |
|
|
71
|
+
|
|
72
|
+
## Performance Issues
|
|
73
|
+
|
|
74
|
+
### Upload is slow
|
|
75
|
+
- **Cause**: Large file size or network constraints
|
|
76
|
+
- **Solution**: Use TUS resumable upload, compress video before upload, check bandwidth
|
|
77
|
+
|
|
78
|
+
### Playback buffering
|
|
79
|
+
- **Cause**: Network congestion or low bandwidth
|
|
80
|
+
- **Solution**: Use ABR (adaptive bitrate) with HLS/DASH, reduce max bitrate
|
|
81
|
+
|
|
82
|
+
### High processing time
|
|
83
|
+
- **Cause**: Complex video codec, high resolution
|
|
84
|
+
- **Solution**: Pre-encode with H.264 (most efficient), reduce resolution
|
|
85
|
+
|
|
86
|
+
## Type Safety
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// Error response type
|
|
90
|
+
interface StreamError {
|
|
91
|
+
success: false;
|
|
92
|
+
errors: Array<{
|
|
93
|
+
code: number;
|
|
94
|
+
message: string;
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle errors
|
|
99
|
+
async function uploadWithErrorHandling(url: string, file: File) {
|
|
100
|
+
const formData = new FormData();
|
|
101
|
+
formData.append('file', file);
|
|
102
|
+
const response = await fetch(url, { method: 'POST', body: formData });
|
|
103
|
+
const result = await response.json();
|
|
104
|
+
|
|
105
|
+
if (!result.success) {
|
|
106
|
+
throw new Error(result.errors[0]?.message || 'Upload failed');
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Security Gotchas
|
|
113
|
+
|
|
114
|
+
1. **Never expose API token in frontend** - Use direct creator uploads
|
|
115
|
+
2. **Always verify webhook signatures** - Prevent spoofed notifications
|
|
116
|
+
3. **Set appropriate token expiration** - Short-lived for security
|
|
117
|
+
4. **Use requireSignedURLs for private content** - Prevent unauthorized access
|
|
118
|
+
5. **Whitelist allowedOrigins** - Prevent hotlinking/embedding on unauthorized sites
|
|
119
|
+
|
|
120
|
+
## In This Reference
|
|
121
|
+
|
|
122
|
+
- [README.md](./README.md) - Overview and quick start
|
|
123
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
124
|
+
- [api.md](./api.md) - On-demand video APIs
|
|
125
|
+
- [api-live.md](./api-live.md) - Live streaming APIs
|
|
126
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
127
|
+
|
|
128
|
+
## See Also
|
|
129
|
+
|
|
130
|
+
- [workers](../workers/) - Deploy Stream APIs securely
|