opencodekit 0.15.4 → 0.15.5
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/dist/index.js +1 -1
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Stream Configuration
|
|
2
|
+
|
|
3
|
+
Setup, environment variables, and wrangler configuration.
|
|
4
|
+
|
|
5
|
+
## Environment Variables
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Required
|
|
9
|
+
CF_ACCOUNT_ID=your-account-id
|
|
10
|
+
CF_API_TOKEN=your-api-token
|
|
11
|
+
|
|
12
|
+
# For signed URLs (high volume)
|
|
13
|
+
STREAM_KEY_ID=your-key-id
|
|
14
|
+
STREAM_JWK=base64-encoded-jwk
|
|
15
|
+
|
|
16
|
+
# For webhooks
|
|
17
|
+
WEBHOOK_SECRET=your-webhook-secret
|
|
18
|
+
|
|
19
|
+
# Customer subdomain (from dashboard)
|
|
20
|
+
STREAM_CUSTOMER_CODE=your-customer-code
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Wrangler Configuration
|
|
24
|
+
|
|
25
|
+
```jsonc
|
|
26
|
+
{
|
|
27
|
+
"name": "stream-worker",
|
|
28
|
+
"main": "src/index.ts",
|
|
29
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
30
|
+
"vars": {
|
|
31
|
+
"CF_ACCOUNT_ID": "your-account-id"
|
|
32
|
+
}
|
|
33
|
+
// Store secrets: wrangler secret put CF_API_TOKEN
|
|
34
|
+
// wrangler secret put STREAM_KEY_ID
|
|
35
|
+
// wrangler secret put STREAM_JWK
|
|
36
|
+
// wrangler secret put WEBHOOK_SECRET
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Signing Keys (High Volume)
|
|
41
|
+
|
|
42
|
+
Create once for self-signing tokens (thousands of daily users).
|
|
43
|
+
|
|
44
|
+
**Create key**
|
|
45
|
+
```bash
|
|
46
|
+
curl -X POST \
|
|
47
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/keys" \
|
|
48
|
+
-H "Authorization: Bearer <API_TOKEN>"
|
|
49
|
+
|
|
50
|
+
# Save `id` and `jwk` (base64) from response
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Store in secrets**
|
|
54
|
+
```bash
|
|
55
|
+
wrangler secret put STREAM_KEY_ID
|
|
56
|
+
wrangler secret put STREAM_JWK
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Webhooks
|
|
60
|
+
|
|
61
|
+
**Setup webhook URL**
|
|
62
|
+
```bash
|
|
63
|
+
curl -X PUT \
|
|
64
|
+
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/webhook" \
|
|
65
|
+
-H "Authorization: Bearer <API_TOKEN>" \
|
|
66
|
+
-H "Content-Type: application/json" \
|
|
67
|
+
-d '{"notificationUrl": "https://your-worker.workers.dev/webhook"}'
|
|
68
|
+
|
|
69
|
+
# Save the returned `secret` for signature verification
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Store secret**
|
|
73
|
+
```bash
|
|
74
|
+
wrangler secret put WEBHOOK_SECRET
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Direct Upload / Live / Watermark Config
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Direct upload
|
|
81
|
+
const uploadConfig = {
|
|
82
|
+
maxDurationSeconds: 3600,
|
|
83
|
+
expiry: new Date(Date.now() + 3600000).toISOString(),
|
|
84
|
+
requireSignedURLs: true,
|
|
85
|
+
allowedOrigins: ['https://yourdomain.com'],
|
|
86
|
+
meta: { creator: 'user-123' }
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// Live input
|
|
90
|
+
const liveConfig = {
|
|
91
|
+
recording: { mode: 'automatic', timeoutSeconds: 30 },
|
|
92
|
+
deleteRecordingAfterDays: 30
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Watermark
|
|
96
|
+
const watermark = {
|
|
97
|
+
name: 'Logo', opacity: 0.7, padding: 20,
|
|
98
|
+
position: 'lowerRight', scale: 0.15
|
|
99
|
+
};
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Access Rules & Player Config
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// Access rules: allow US/CA, block CN/RU, or IP allowlist
|
|
106
|
+
const geoRestrict = [
|
|
107
|
+
{ type: 'ip.geoip.country', action: 'allow', country: ['US', 'CA'] },
|
|
108
|
+
{ type: 'any', action: 'block' }
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
// Player params for iframe
|
|
112
|
+
const playerParams = new URLSearchParams({
|
|
113
|
+
autoplay: 'true', muted: 'true', preload: 'auto', defaultTextTrack: 'en'
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## In This Reference
|
|
118
|
+
|
|
119
|
+
- [README.md](./README.md) - Overview and quick start
|
|
120
|
+
- [api.md](./api.md) - Upload, playback, live streaming APIs
|
|
121
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
122
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
123
|
+
|
|
124
|
+
## See Also
|
|
125
|
+
|
|
126
|
+
- [wrangler](../wrangler/) - Wrangler CLI and configuration
|
|
127
|
+
- [workers](../workers/) - Deploy Stream APIs in Workers
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Stream Gotchas
|
|
2
|
+
|
|
3
|
+
Common issues, troubleshooting, and limits.
|
|
4
|
+
|
|
5
|
+
## Common Errors
|
|
6
|
+
|
|
7
|
+
### ERR_NON_VIDEO
|
|
8
|
+
**Cause**: Uploaded file is not a valid video format
|
|
9
|
+
|
|
10
|
+
**Solution**: Ensure file is in supported format (MP4, MKV, MOV, AVI, FLV, MPEG-2 TS/PS, MXF, LXF, GXF, 3GP, WebM, MPG, QuickTime)
|
|
11
|
+
|
|
12
|
+
### ERR_DURATION_EXCEED_CONSTRAINT
|
|
13
|
+
**Cause**: Video duration exceeds `maxDurationSeconds` constraint
|
|
14
|
+
|
|
15
|
+
**Solution**: Increase `maxDurationSeconds` in direct upload config or trim video before upload
|
|
16
|
+
|
|
17
|
+
### ERR_FETCH_ORIGIN_ERROR
|
|
18
|
+
**Cause**: Failed to download video from URL (upload from URL)
|
|
19
|
+
|
|
20
|
+
**Solution**: Ensure URL is publicly accessible, uses HTTPS, and video file is available
|
|
21
|
+
|
|
22
|
+
### ERR_MALFORMED_VIDEO
|
|
23
|
+
**Cause**: Video file is corrupted or improperly encoded
|
|
24
|
+
|
|
25
|
+
**Solution**: Re-encode video using FFmpeg or check source file integrity
|
|
26
|
+
|
|
27
|
+
### ERR_DURATION_TOO_SHORT
|
|
28
|
+
**Cause**: Video must be at least 0.1 seconds long
|
|
29
|
+
|
|
30
|
+
**Solution**: Ensure video has valid duration (not a single frame)
|
|
31
|
+
|
|
32
|
+
## Troubleshooting
|
|
33
|
+
|
|
34
|
+
### Video stuck in "inprogress" state
|
|
35
|
+
- **Cause**: Processing large/complex video
|
|
36
|
+
- **Solution**: Wait up to 5 minutes for processing; use webhooks instead of polling
|
|
37
|
+
|
|
38
|
+
### Signed URL returns 403
|
|
39
|
+
- **Cause**: Token expired or invalid signature
|
|
40
|
+
- **Solution**: Check expiration timestamp, verify JWK is correct, ensure clock sync
|
|
41
|
+
|
|
42
|
+
### Live stream not connecting
|
|
43
|
+
- **Cause**: Invalid RTMPS URL or stream key
|
|
44
|
+
- **Solution**: Use exact URL/key from API, ensure firewall allows outbound 443
|
|
45
|
+
|
|
46
|
+
### Webhook signature verification fails
|
|
47
|
+
- **Cause**: Incorrect secret or timestamp window
|
|
48
|
+
- **Solution**: Use exact secret from webhook setup, allow 5-minute timestamp drift
|
|
49
|
+
|
|
50
|
+
### Video uploads but isn't visible
|
|
51
|
+
- **Cause**: `requireSignedURLs` enabled without providing token
|
|
52
|
+
- **Solution**: Generate signed token or set `requireSignedURLs: false` for public videos
|
|
53
|
+
|
|
54
|
+
### Player shows infinite loading
|
|
55
|
+
- **Cause**: CORS issue with allowedOrigins
|
|
56
|
+
- **Solution**: Add your domain to `allowedOrigins` array
|
|
57
|
+
|
|
58
|
+
## Limits
|
|
59
|
+
|
|
60
|
+
| Resource | Limit |
|
|
61
|
+
|----------|-------|
|
|
62
|
+
| Max file size | 30 GB |
|
|
63
|
+
| Max frame rate | 60 fps (recommended) |
|
|
64
|
+
| Max duration per direct upload | Configurable via `maxDurationSeconds` |
|
|
65
|
+
| Token generation (API endpoint) | 1,000/day recommended (use signing keys for higher) |
|
|
66
|
+
| Live input outputs (simulcast) | 5 per live input |
|
|
67
|
+
| Webhook retry attempts | 5 (exponential backoff) |
|
|
68
|
+
| Webhook timeout | 30 seconds |
|
|
69
|
+
| Caption file size | 5 MB |
|
|
70
|
+
| Watermark image size | 2 MB |
|
|
71
|
+
| Metadata keys per video | Unlimited |
|
|
72
|
+
| Search results per page | Max 1,000 |
|
|
73
|
+
|
|
74
|
+
## Performance Issues
|
|
75
|
+
|
|
76
|
+
### Upload is slow
|
|
77
|
+
- **Cause**: Large file size or network constraints
|
|
78
|
+
- **Solution**: Use TUS resumable upload, compress video before upload, check bandwidth
|
|
79
|
+
|
|
80
|
+
### Playback buffering
|
|
81
|
+
- **Cause**: Network congestion or low bandwidth
|
|
82
|
+
- **Solution**: Use ABR (adaptive bitrate) with HLS/DASH, reduce max bitrate
|
|
83
|
+
|
|
84
|
+
### High processing time
|
|
85
|
+
- **Cause**: Complex video codec, high resolution
|
|
86
|
+
- **Solution**: Pre-encode with H.264 (most efficient), reduce resolution
|
|
87
|
+
|
|
88
|
+
## Type Safety
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Error response type
|
|
92
|
+
interface StreamError {
|
|
93
|
+
success: false;
|
|
94
|
+
errors: Array<{
|
|
95
|
+
code: number;
|
|
96
|
+
message: string;
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Handle errors
|
|
101
|
+
async function uploadWithErrorHandling(url: string, file: File) {
|
|
102
|
+
const formData = new FormData();
|
|
103
|
+
formData.append('file', file);
|
|
104
|
+
const response = await fetch(url, { method: 'POST', body: formData });
|
|
105
|
+
const result = await response.json();
|
|
106
|
+
|
|
107
|
+
if (!result.success) {
|
|
108
|
+
throw new Error(result.errors[0]?.message || 'Upload failed');
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Security Gotchas
|
|
115
|
+
|
|
116
|
+
1. **Never expose API token in frontend** - Use direct creator uploads
|
|
117
|
+
2. **Always verify webhook signatures** - Prevent spoofed notifications
|
|
118
|
+
3. **Set appropriate token expiration** - Short-lived for security
|
|
119
|
+
4. **Use requireSignedURLs for private content** - Prevent unauthorized access
|
|
120
|
+
5. **Whitelist allowedOrigins** - Prevent hotlinking/embedding on unauthorized sites
|
|
121
|
+
|
|
122
|
+
## In This Reference
|
|
123
|
+
|
|
124
|
+
- [README.md](./README.md) - Overview and quick start
|
|
125
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
126
|
+
- [api.md](./api.md) - Upload, playback, live streaming APIs
|
|
127
|
+
- [patterns.md](./patterns.md) - Full-stack flows, best practices
|
|
128
|
+
|
|
129
|
+
## See Also
|
|
130
|
+
|
|
131
|
+
- [workers](../workers/) - Deploy Stream APIs securely
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Stream Patterns
|
|
2
|
+
|
|
3
|
+
Common workflows, full-stack flows, and best practices.
|
|
4
|
+
|
|
5
|
+
## Full-Stack Upload Flow
|
|
6
|
+
|
|
7
|
+
**Backend API (Next.js route)**
|
|
8
|
+
```typescript
|
|
9
|
+
// app/api/upload-url/route.ts
|
|
10
|
+
export async function POST(req: Request) {
|
|
11
|
+
const { userId, videoName } = await req.json();
|
|
12
|
+
|
|
13
|
+
const response = await fetch(
|
|
14
|
+
`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_ACCOUNT_ID}/stream/direct_upload`,
|
|
15
|
+
{
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: {
|
|
18
|
+
'Authorization': `Bearer ${process.env.CF_API_TOKEN}`,
|
|
19
|
+
'Content-Type': 'application/json'
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
maxDurationSeconds: 3600,
|
|
23
|
+
requireSignedURLs: true,
|
|
24
|
+
meta: { creator: userId, name: videoName }
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
const data = await response.json();
|
|
29
|
+
return Response.json({ uploadURL: data.result.uploadURL, uid: data.result.uid });
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Frontend component**
|
|
34
|
+
```tsx
|
|
35
|
+
'use client';
|
|
36
|
+
import { useState } from 'react';
|
|
37
|
+
|
|
38
|
+
export function VideoUploader() {
|
|
39
|
+
const [uploading, setUploading] = useState(false);
|
|
40
|
+
const [progress, setProgress] = useState(0);
|
|
41
|
+
|
|
42
|
+
async function handleUpload(file: File) {
|
|
43
|
+
setUploading(true);
|
|
44
|
+
const { uploadURL, uid } = await fetch('/api/upload-url', {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: { 'Content-Type': 'application/json' },
|
|
47
|
+
body: JSON.stringify({ videoName: file.name })
|
|
48
|
+
}).then(r => r.json());
|
|
49
|
+
|
|
50
|
+
const formData = new FormData();
|
|
51
|
+
formData.append('file', file);
|
|
52
|
+
|
|
53
|
+
const xhr = new XMLHttpRequest();
|
|
54
|
+
xhr.upload.addEventListener('progress', (e) => {
|
|
55
|
+
if (e.lengthComputable) setProgress((e.loaded / e.total) * 100);
|
|
56
|
+
});
|
|
57
|
+
xhr.addEventListener('load', () => {
|
|
58
|
+
setUploading(false);
|
|
59
|
+
window.location.href = `/videos/${uid}`;
|
|
60
|
+
});
|
|
61
|
+
xhr.open('POST', uploadURL);
|
|
62
|
+
xhr.send(formData);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<div>
|
|
67
|
+
<input type="file" accept="video/*"
|
|
68
|
+
onChange={(e) => e.target.files?.[0] && handleUpload(e.target.files[0])}
|
|
69
|
+
disabled={uploading} />
|
|
70
|
+
{uploading && <progress value={progress} max={100} />}
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Video State Management
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
interface VideoState {
|
|
80
|
+
uid: string;
|
|
81
|
+
readyToStream: boolean;
|
|
82
|
+
status: { state: 'queued' | 'inprogress' | 'ready' | 'error'; pctComplete?: string };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function waitForVideoReady(
|
|
86
|
+
accountId: string, videoId: string, apiToken: string,
|
|
87
|
+
maxAttempts = 60, intervalMs = 5000
|
|
88
|
+
): Promise<VideoState> {
|
|
89
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
90
|
+
const response = await fetch(
|
|
91
|
+
`https://api.cloudflare.com/client/v4/accounts/${accountId}/stream/${videoId}`,
|
|
92
|
+
{ headers: { 'Authorization': `Bearer ${apiToken}` } }
|
|
93
|
+
);
|
|
94
|
+
const { result } = await response.json();
|
|
95
|
+
if (result.readyToStream || result.status.state === 'error') return result;
|
|
96
|
+
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
97
|
+
}
|
|
98
|
+
throw new Error('Video processing timeout');
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Webhook Handler (Workers)
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
export default {
|
|
106
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
107
|
+
const signature = request.headers.get('Webhook-Signature');
|
|
108
|
+
if (!signature) return new Response('No signature', { status: 401 });
|
|
109
|
+
|
|
110
|
+
const body = await request.text();
|
|
111
|
+
// Verify HMAC-SHA256: parse time/sig1, check 5min window, compare signature
|
|
112
|
+
const isValid = await verifySignature(signature, body, env.WEBHOOK_SECRET);
|
|
113
|
+
if (!isValid) return new Response('Invalid', { status: 401 });
|
|
114
|
+
|
|
115
|
+
const payload = JSON.parse(body);
|
|
116
|
+
if (payload.readyToStream) console.log(`Video ${payload.uid} ready`);
|
|
117
|
+
return new Response('OK');
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
// Full verifySignature impl in gotchas.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Live Streaming Setup
|
|
124
|
+
|
|
125
|
+
**OBS**: Server `rtmps://live.cloudflare.com:443/live/`, Stream Key from API
|
|
126
|
+
|
|
127
|
+
**FFmpeg**: `ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 3000k -c:a aac -f flv rtmps://live.cloudflare.com:443/live/<KEY>`
|
|
128
|
+
|
|
129
|
+
## Best Practices
|
|
130
|
+
|
|
131
|
+
1. **Use Direct Creator Uploads** - Avoid proxying video through servers
|
|
132
|
+
2. **Enable requireSignedURLs** - Control access to private content
|
|
133
|
+
3. **Use signing keys for high volume** - Self-sign tokens instead of API calls
|
|
134
|
+
4. **Set allowedOrigins** - Prevent hotlinking
|
|
135
|
+
5. **Use webhooks over polling** - Efficient status updates
|
|
136
|
+
6. **Cache video metadata** - Reduce API calls
|
|
137
|
+
7. **Set maxDurationSeconds** - Prevent abuse on direct uploads
|
|
138
|
+
8. **Use creator metadata** - Enable per-user filtering/analytics
|
|
139
|
+
9. **Enable recordings for live** - Automatic VOD after stream ends
|
|
140
|
+
10. **Monitor with GraphQL analytics** - Track views, watch time, geo
|
|
141
|
+
|
|
142
|
+
## In This Reference
|
|
143
|
+
|
|
144
|
+
- [README.md](./README.md) - Overview and quick start
|
|
145
|
+
- [configuration.md](./configuration.md) - Setup and config
|
|
146
|
+
- [api.md](./api.md) - Upload, playback, live streaming APIs
|
|
147
|
+
- [gotchas.md](./gotchas.md) - Error codes, troubleshooting
|
|
148
|
+
|
|
149
|
+
## See Also
|
|
150
|
+
|
|
151
|
+
- [workers](../workers/) - Deploy Stream APIs in Workers
|
|
152
|
+
- [pages](../pages/) - Integrate Stream with Pages
|