memory-journal-mcp 7.7.0 → 8.0.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/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -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 +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -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 +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -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 +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -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 +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -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 +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -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 +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Authentication
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
curl -X POST 'https://rtc.live/v1/apps/${CALLS_APP_ID}/sessions/new' \
|
|
7
|
+
-H "Authorization: Bearer ${CALLS_APP_SECRET}"
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Core Concepts
|
|
11
|
+
|
|
12
|
+
**Sessions:** PeerConnection to Cloudflare edge
|
|
13
|
+
**Tracks:** Media/data channels (audio/video/datachannel)
|
|
14
|
+
**No rooms:** Build presence via track sharing
|
|
15
|
+
|
|
16
|
+
## Client Libraries
|
|
17
|
+
|
|
18
|
+
**PartyTracks (Recommended):** Observable-based client library for production use. Handles device changes, network switches, ICE restarts automatically. Push/pull API with React hooks. See patterns.md for full examples.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install partytracks @cloudflare/calls
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Raw API:** Direct HTTP + WebRTC for custom requirements (documented below).
|
|
25
|
+
|
|
26
|
+
## Endpoints
|
|
27
|
+
|
|
28
|
+
### Create Session
|
|
29
|
+
|
|
30
|
+
```http
|
|
31
|
+
POST /v1/apps/{appId}/sessions/new
|
|
32
|
+
→ {sessionId, sessionDescription}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Add Track (Publish)
|
|
36
|
+
|
|
37
|
+
```http
|
|
38
|
+
POST /v1/apps/{appId}/sessions/{sessionId}/tracks/new
|
|
39
|
+
Body: {
|
|
40
|
+
sessionDescription: {sdp, type: "offer"},
|
|
41
|
+
tracks: [{location: "local", trackName: "my-video"}]
|
|
42
|
+
}
|
|
43
|
+
→ {sessionDescription, tracks: [{trackName}]}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Add Track (Subscribe)
|
|
47
|
+
|
|
48
|
+
```http
|
|
49
|
+
POST /v1/apps/{appId}/sessions/{sessionId}/tracks/new
|
|
50
|
+
Body: {
|
|
51
|
+
tracks: [{
|
|
52
|
+
location: "remote",
|
|
53
|
+
trackName: "remote-track-id",
|
|
54
|
+
sessionId: "other-session-id"
|
|
55
|
+
}]
|
|
56
|
+
}
|
|
57
|
+
→ {sessionDescription} (server offer)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Renegotiate
|
|
61
|
+
|
|
62
|
+
```http
|
|
63
|
+
PUT /v1/apps/{appId}/sessions/{sessionId}/renegotiate
|
|
64
|
+
Body: {sessionDescription: {sdp, type: "answer"}}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Close Tracks
|
|
68
|
+
|
|
69
|
+
```http
|
|
70
|
+
PUT /v1/apps/{appId}/sessions/{sessionId}/tracks/close
|
|
71
|
+
Body: {tracks: [{trackName}]}
|
|
72
|
+
→ {requiresImmediateRenegotiation: boolean}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Get Session
|
|
76
|
+
|
|
77
|
+
```http
|
|
78
|
+
GET /v1/apps/{appId}/sessions/{sessionId}
|
|
79
|
+
→ {sessionId, tracks: TrackMetadata[]}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## TypeScript Types
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
interface TrackMetadata {
|
|
86
|
+
trackName: string
|
|
87
|
+
location: 'local' | 'remote'
|
|
88
|
+
sessionId?: string // For remote tracks
|
|
89
|
+
mid?: string // WebRTC mid
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## WebRTC Flow
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// 1. Create PeerConnection
|
|
97
|
+
const pc = new RTCPeerConnection({
|
|
98
|
+
iceServers: [{ urls: 'stun:stun.cloudflare.com:3478' }],
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
// 2. Add tracks
|
|
102
|
+
const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true })
|
|
103
|
+
stream.getTracks().forEach((track) => pc.addTrack(track, stream))
|
|
104
|
+
|
|
105
|
+
// 3. Create offer
|
|
106
|
+
const offer = await pc.createOffer()
|
|
107
|
+
await pc.setLocalDescription(offer)
|
|
108
|
+
|
|
109
|
+
// 4. Send to backend → Cloudflare API
|
|
110
|
+
const response = await fetch('/api/new-session', {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
body: JSON.stringify({ sdp: offer.sdp }),
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
// 5. Set remote answer
|
|
116
|
+
const { sessionDescription } = await response.json()
|
|
117
|
+
await pc.setRemoteDescription(sessionDescription)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Publishing
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const offer = await pc.createOffer()
|
|
124
|
+
await pc.setLocalDescription(offer)
|
|
125
|
+
|
|
126
|
+
const res = await fetch(`/api/sessions/${sessionId}/tracks`, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
body: JSON.stringify({
|
|
129
|
+
sdp: offer.sdp,
|
|
130
|
+
tracks: [{ location: 'local', trackName: 'my-video' }],
|
|
131
|
+
}),
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
const { sessionDescription, tracks } = await res.json()
|
|
135
|
+
await pc.setRemoteDescription(sessionDescription)
|
|
136
|
+
const publishedTrackId = tracks[0].trackName // Share with others
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Subscribing
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const res = await fetch(`/api/sessions/${sessionId}/tracks`, {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
body: JSON.stringify({
|
|
145
|
+
tracks: [{ location: 'remote', trackName: remoteTrackId, sessionId: remoteSessionId }],
|
|
146
|
+
}),
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
const { sessionDescription } = await res.json()
|
|
150
|
+
await pc.setRemoteDescription(sessionDescription)
|
|
151
|
+
|
|
152
|
+
const answer = await pc.createAnswer()
|
|
153
|
+
await pc.setLocalDescription(answer)
|
|
154
|
+
|
|
155
|
+
await fetch(`/api/sessions/${sessionId}/renegotiate`, {
|
|
156
|
+
method: 'PUT',
|
|
157
|
+
body: JSON.stringify({ sdp: answer.sdp }),
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
pc.ontrack = (event) => {
|
|
161
|
+
const [remoteStream] = event.streams
|
|
162
|
+
videoElement.srcObject = remoteStream
|
|
163
|
+
}
|
|
164
|
+
```
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Configuration & Deployment
|
|
2
|
+
|
|
3
|
+
## Dashboard Setup
|
|
4
|
+
|
|
5
|
+
1. Navigate to https://dash.cloudflare.com/?to=/:account/calls
|
|
6
|
+
2. Click "Create Application" (or use existing app)
|
|
7
|
+
3. Copy `CALLS_APP_ID` from dashboard
|
|
8
|
+
4. Generate and copy `CALLS_APP_SECRET` (treat as sensitive credential)
|
|
9
|
+
5. Use credentials in Wrangler config or environment variables below
|
|
10
|
+
|
|
11
|
+
## Dependencies
|
|
12
|
+
|
|
13
|
+
**Backend (Workers):** Built-in fetch API, no additional packages required
|
|
14
|
+
|
|
15
|
+
**Client (PartyTracks):**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install partytracks @cloudflare/calls
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Client (React + PartyTracks):**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install partytracks @cloudflare/calls observable-hooks
|
|
25
|
+
# Observable hooks: useObservableAsValue, useValueAsObservable
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Client (Raw API):** Native browser WebRTC API only
|
|
29
|
+
|
|
30
|
+
## Wrangler Setup
|
|
31
|
+
|
|
32
|
+
```jsonc
|
|
33
|
+
{
|
|
34
|
+
"name": "my-calls-app",
|
|
35
|
+
"main": "src/index.ts",
|
|
36
|
+
"compatibility_date": "2025-01-01", // Use current date for new projects
|
|
37
|
+
"vars": {
|
|
38
|
+
"CALLS_APP_ID": "your-app-id",
|
|
39
|
+
"MAX_WEBCAM_BITRATE": "1200000",
|
|
40
|
+
"MAX_WEBCAM_FRAMERATE": "24",
|
|
41
|
+
"MAX_WEBCAM_QUALITY_LEVEL": "1080",
|
|
42
|
+
},
|
|
43
|
+
// Set secret: wrangler secret put CALLS_APP_SECRET
|
|
44
|
+
"durable_objects": {
|
|
45
|
+
"bindings": [
|
|
46
|
+
{
|
|
47
|
+
"name": "ROOM",
|
|
48
|
+
"class_name": "Room",
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Deploy
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
wrangler login
|
|
59
|
+
wrangler secret put CALLS_APP_SECRET
|
|
60
|
+
wrangler deploy
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Environment Variables
|
|
64
|
+
|
|
65
|
+
**Required:**
|
|
66
|
+
|
|
67
|
+
- `CALLS_APP_ID`: From dashboard
|
|
68
|
+
- `CALLS_APP_SECRET`: From dashboard (secret)
|
|
69
|
+
|
|
70
|
+
**Optional:**
|
|
71
|
+
|
|
72
|
+
- `MAX_WEBCAM_BITRATE` (default: 1200000)
|
|
73
|
+
- `MAX_WEBCAM_FRAMERATE` (default: 24)
|
|
74
|
+
- `MAX_WEBCAM_QUALITY_LEVEL` (default: 1080)
|
|
75
|
+
- `TURN_SERVICE_ID`: TURN service
|
|
76
|
+
- `TURN_SERVICE_TOKEN`: TURN auth (secret)
|
|
77
|
+
|
|
78
|
+
## TURN Configuration
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
const pc = new RTCPeerConnection({
|
|
82
|
+
iceServers: [
|
|
83
|
+
{ urls: 'stun:stun.cloudflare.com:3478' },
|
|
84
|
+
{
|
|
85
|
+
urls: [
|
|
86
|
+
'turn:turn.cloudflare.com:3478?transport=udp',
|
|
87
|
+
'turn:turn.cloudflare.com:3478?transport=tcp',
|
|
88
|
+
'turns:turn.cloudflare.com:5349?transport=tcp',
|
|
89
|
+
],
|
|
90
|
+
username: turnUsername,
|
|
91
|
+
credential: turnCredential,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
bundlePolicy: 'max-bundle', // Recommended: reduces overhead
|
|
95
|
+
iceTransportPolicy: 'all', // Use 'relay' to force TURN (testing only)
|
|
96
|
+
})
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Ports:** 3478 (UDP/TCP), 53 (UDP), 80 (TCP), 443 (TLS), 5349 (TLS)
|
|
100
|
+
|
|
101
|
+
**When to use TURN:** Required for restrictive corporate firewalls/networks that block UDP. ~5-10% of connections fallback to TURN. STUN works for most users.
|
|
102
|
+
|
|
103
|
+
**ICE candidate filtering:** Cloudflare handles candidate filtering automatically. No need to manually filter candidates.
|
|
104
|
+
|
|
105
|
+
## Durable Object Boilerplate
|
|
106
|
+
|
|
107
|
+
Minimal presence system:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
export class Room {
|
|
111
|
+
private sessions = new Map<string, { userId: string; tracks: string[] }>()
|
|
112
|
+
|
|
113
|
+
async fetch(req: Request) {
|
|
114
|
+
const { pathname } = new URL(req.url)
|
|
115
|
+
const body = await req.json()
|
|
116
|
+
|
|
117
|
+
if (pathname === '/join') {
|
|
118
|
+
this.sessions.set(body.sessionId, { userId: body.userId, tracks: [] })
|
|
119
|
+
return Response.json({ participants: this.sessions.size })
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (pathname === '/publish') {
|
|
123
|
+
this.sessions.get(body.sessionId)?.tracks.push(...body.tracks)
|
|
124
|
+
// Broadcast to others via WebSocket (not shown)
|
|
125
|
+
return new Response('OK')
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return new Response('Not found', { status: 404 })
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Environment Validation
|
|
134
|
+
|
|
135
|
+
Check credentials before first API call:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
if (!env.CALLS_APP_ID || !env.CALLS_APP_SECRET) {
|
|
139
|
+
throw new Error('CALLS_APP_ID and CALLS_APP_SECRET required')
|
|
140
|
+
}
|
|
141
|
+
```
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Gotchas & Troubleshooting
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Slow initial connect (~1.8s)"
|
|
6
|
+
|
|
7
|
+
**Cause:** First STUN delayed during consensus forming (normal behavior)
|
|
8
|
+
**Solution:** Subsequent connections are faster. CF detects DTLS ClientHello early to compensate.
|
|
9
|
+
|
|
10
|
+
### "No media flow"
|
|
11
|
+
|
|
12
|
+
**Cause:** SDP exchange incomplete, connection not established, tracks not added before offer, browser permissions missing
|
|
13
|
+
**Solution:**
|
|
14
|
+
|
|
15
|
+
1. Verify SDP exchange complete
|
|
16
|
+
2. Check `pc.connectionState === 'connected'`
|
|
17
|
+
3. Ensure tracks added before creating offer
|
|
18
|
+
4. Confirm browser permissions granted
|
|
19
|
+
5. Use `chrome://webrtc-internals` for debugging
|
|
20
|
+
|
|
21
|
+
### "Track not receiving"
|
|
22
|
+
|
|
23
|
+
**Cause:** Track not published, track ID not shared, session IDs mismatch, `pc.ontrack` not set, renegotiation needed
|
|
24
|
+
**Solution:**
|
|
25
|
+
|
|
26
|
+
1. Verify track published successfully
|
|
27
|
+
2. Confirm track ID shared between peers
|
|
28
|
+
3. Check session IDs match
|
|
29
|
+
4. Set `pc.ontrack` handler before answer
|
|
30
|
+
5. Trigger renegotiation if needed
|
|
31
|
+
|
|
32
|
+
### "ICE connection failed"
|
|
33
|
+
|
|
34
|
+
**Cause:** Network changed, firewall blocked UDP, TURN needed, transient network issue
|
|
35
|
+
**Solution:**
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
pc.oniceconnectionstatechange = async () => {
|
|
39
|
+
if (pc.iceConnectionState === 'failed') {
|
|
40
|
+
console.warn('ICE failed, attempting restart')
|
|
41
|
+
await pc.restartIce() // Triggers new ICE gathering
|
|
42
|
+
|
|
43
|
+
// Create new offer with ICE restart flag
|
|
44
|
+
const offer = await pc.createOffer({ iceRestart: true })
|
|
45
|
+
await pc.setLocalDescription(offer)
|
|
46
|
+
|
|
47
|
+
// Send to backend → Cloudflare API
|
|
48
|
+
await fetch(`/api/sessions/${sessionId}/renegotiate`, {
|
|
49
|
+
method: 'PUT',
|
|
50
|
+
body: JSON.stringify({ sdp: offer.sdp }),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### "Track stuck/frozen"
|
|
57
|
+
|
|
58
|
+
**Cause:** Sender paused track, network congestion, codec mismatch, mobile browser backgrounded
|
|
59
|
+
**Solution:**
|
|
60
|
+
|
|
61
|
+
1. Check `track.enabled` and `track.readyState === 'live'`
|
|
62
|
+
2. Verify sender active: `pc.getSenders().find(s => s.track === track)`
|
|
63
|
+
3. Check stats for packet loss/jitter (see patterns.md)
|
|
64
|
+
4. On mobile: Re-acquire tracks when app foregrounded
|
|
65
|
+
5. Test with different codecs if persistent
|
|
66
|
+
|
|
67
|
+
### "Network change disconnects call"
|
|
68
|
+
|
|
69
|
+
**Cause:** Mobile switching WiFi↔cellular, laptop changing networks
|
|
70
|
+
**Solution:**
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Listen for network changes
|
|
74
|
+
if ('connection' in navigator) {
|
|
75
|
+
;(navigator as any).connection.addEventListener('change', async () => {
|
|
76
|
+
console.log('Network changed')
|
|
77
|
+
await pc.restartIce() // Use ICE restart pattern above
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Or use PartyTracks (handles automatically)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Retry with Exponential Backoff
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
async function fetchWithRetry(url: string, options: RequestInit, maxRetries = 3) {
|
|
88
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetch(url, options)
|
|
91
|
+
if (res.ok) return res
|
|
92
|
+
if (res.status >= 500) throw new Error('Server error')
|
|
93
|
+
return res // Client error, don't retry
|
|
94
|
+
} catch (err) {
|
|
95
|
+
if (i === maxRetries - 1) throw err
|
|
96
|
+
const delay = Math.min(1000 * 2 ** i, 10000) // Cap at 10s
|
|
97
|
+
await new Promise((resolve) => setTimeout(resolve, delay))
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Debugging with chrome://webrtc-internals
|
|
104
|
+
|
|
105
|
+
1. Open `chrome://webrtc-internals` in Chrome/Edge
|
|
106
|
+
2. Find your PeerConnection in the list
|
|
107
|
+
3. Check **Stats graphs** for packet loss, jitter, bandwidth
|
|
108
|
+
4. Check **ICE candidate pairs**: Look for `succeeded` state, relay vs host candidates
|
|
109
|
+
5. Check **getStats**: Raw metrics for inbound/outbound RTP
|
|
110
|
+
6. Look for errors in **Event log**: `iceConnectionState`, `connectionState` changes
|
|
111
|
+
7. Export data with "Download the PeerConnection updates and stats data" button
|
|
112
|
+
8. Common issues visible here: ICE failures, high packet loss, bitrate drops
|
|
113
|
+
|
|
114
|
+
## Limits
|
|
115
|
+
|
|
116
|
+
| Resource/Limit | Value | Notes |
|
|
117
|
+
| ------------------ | -------------- | --------------------------------------------------- |
|
|
118
|
+
| Egress (Free) | 1TB/month | Per account |
|
|
119
|
+
| Egress (Paid) | $0.05/GB | After free tier |
|
|
120
|
+
| Inbound traffic | Free | All plans |
|
|
121
|
+
| TURN service | Free | Included with SFU |
|
|
122
|
+
| Participants | No hard limit | Client bandwidth/CPU bound (typically 10-50 tracks) |
|
|
123
|
+
| Tracks per session | No hard limit | Client resources limited |
|
|
124
|
+
| Session duration | No hard limit | Production calls run for hours |
|
|
125
|
+
| WebRTC ports | UDP 1024-65535 | Outbound only, required for media |
|
|
126
|
+
| API rate limit | 600 req/min | Per app, burst allowed |
|
|
127
|
+
|
|
128
|
+
## Security Checklist
|
|
129
|
+
|
|
130
|
+
- ✅ **Never expose** `CALLS_APP_SECRET` to client
|
|
131
|
+
- ✅ **Validate user identity** in backend before creating sessions
|
|
132
|
+
- ✅ **Implement auth tokens** for session access (JWT in custom header)
|
|
133
|
+
- ✅ **Rate limit** session creation endpoints
|
|
134
|
+
- ✅ **Expire sessions** server-side after inactivity
|
|
135
|
+
- ✅ **Validate track IDs** before subscribing (prevent unauthorized access)
|
|
136
|
+
- ✅ **Use HTTPS** for all signaling (API calls)
|
|
137
|
+
- ✅ **Enable DTLS-SRTP** (automatic with Cloudflare, encrypts media)
|
|
138
|
+
- ⚠️ **Consider E2EE** for sensitive content (implement client-side with Insertable Streams API)
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Patterns & Use Cases
|
|
2
|
+
|
|
3
|
+
## Architecture
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Client (WebRTC) <---> CF Edge <---> Backend (HTTP)
|
|
7
|
+
|
|
|
8
|
+
CF Backbone (310+ DCs)
|
|
9
|
+
|
|
|
10
|
+
Other Edges <---> Other Clients
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Anycast: Last-mile <50ms (95%), no region select, NACK shield, distributed consensus
|
|
14
|
+
|
|
15
|
+
Cascading trees auto-scale to millions:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Publisher -> Edge A -> Edge B -> Sub1
|
|
19
|
+
\-> Edge C -> Sub2,3
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Use Cases
|
|
23
|
+
|
|
24
|
+
**1:1:** A creates session+publishes, B creates+subscribes to A+publishes, A subscribes to B
|
|
25
|
+
**N:N:** All create session+publish, backend broadcasts track IDs, all subscribe to others
|
|
26
|
+
**1:N:** Publisher creates+publishes, viewers each create+subscribe (no fan-out limit)
|
|
27
|
+
**Breakout:** Same PeerConnection! Backend closes/adds tracks, no recreation
|
|
28
|
+
|
|
29
|
+
## PartyTracks (Recommended)
|
|
30
|
+
|
|
31
|
+
Observable-based client with automatic device/network handling:
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import {PartyTracks} from 'partytracks';
|
|
35
|
+
|
|
36
|
+
// Create client
|
|
37
|
+
const pt = new PartyTracks({
|
|
38
|
+
apiUrl: '/api/calls',
|
|
39
|
+
sessionId: 'my-session',
|
|
40
|
+
onTrack: (track, peer) => {
|
|
41
|
+
const video = document.getElementById(`video-${peer.id}`) as HTMLVideoElement;
|
|
42
|
+
video.srcObject = new MediaStream([track]);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Publish camera (push API)
|
|
47
|
+
const camera = await pt.getCamera(); // Auto-requests permissions, handles device changes
|
|
48
|
+
await pt.publishTrack(camera, {trackName: 'my-camera'});
|
|
49
|
+
|
|
50
|
+
// Subscribe to remote track (pull API)
|
|
51
|
+
await pt.subscribeToTrack({trackName: 'remote-camera', sessionId: 'other-session'});
|
|
52
|
+
|
|
53
|
+
// React hook example
|
|
54
|
+
import {useObservableAsValue} from 'observable-hooks';
|
|
55
|
+
|
|
56
|
+
function VideoCall() {
|
|
57
|
+
const localTracks = useObservableAsValue(pt.localTracks$);
|
|
58
|
+
const remoteTracks = useObservableAsValue(pt.remoteTracks$);
|
|
59
|
+
|
|
60
|
+
return <div>{/* Render tracks */}</div>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Screenshare
|
|
64
|
+
const screen = await pt.getScreenshare();
|
|
65
|
+
await pt.publishTrack(screen, {trackName: 'my-screen'});
|
|
66
|
+
|
|
67
|
+
// Handle device changes (automatic)
|
|
68
|
+
// PartyTracks detects device changes (e.g., Bluetooth headset) and renegotiates
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Backend
|
|
72
|
+
|
|
73
|
+
Express:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
app.post('/api/new-session', async (req, res) => {
|
|
77
|
+
const r = await fetch(`${CALLS_API}/apps/${process.env.CALLS_APP_ID}/sessions/new`, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: { Authorization: `Bearer ${process.env.CALLS_APP_SECRET}` },
|
|
80
|
+
})
|
|
81
|
+
res.json(await r.json())
|
|
82
|
+
})
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Workers: Same pattern, use `env.CALLS_APP_ID` and `env.CALLS_APP_SECRET`
|
|
86
|
+
|
|
87
|
+
DO Presence: See configuration.md for boilerplate
|
|
88
|
+
|
|
89
|
+
## Audio Level Detection
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Attach analyzer to audio track
|
|
93
|
+
function attachAudioLevelDetector(track: MediaStreamTrack) {
|
|
94
|
+
const ctx = new AudioContext()
|
|
95
|
+
const analyzer = ctx.createAnalyser()
|
|
96
|
+
const src = ctx.createMediaStreamSource(new MediaStream([track]))
|
|
97
|
+
src.connect(analyzer)
|
|
98
|
+
|
|
99
|
+
const data = new Uint8Array(analyzer.frequencyBinCount)
|
|
100
|
+
const checkLevel = () => {
|
|
101
|
+
analyzer.getByteFrequencyData(data)
|
|
102
|
+
const level = data.reduce((a, b) => a + b) / data.length
|
|
103
|
+
if (level > 30) console.log('Speaking:', level) // Trigger UI update
|
|
104
|
+
requestAnimationFrame(checkLevel)
|
|
105
|
+
}
|
|
106
|
+
checkLevel()
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Connection Quality Monitoring
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
pc.getStats().then((stats) => {
|
|
114
|
+
stats.forEach((report) => {
|
|
115
|
+
if (report.type === 'inbound-rtp' && report.kind === 'video') {
|
|
116
|
+
const { packetsLost, packetsReceived, jitter } = report
|
|
117
|
+
const lossRate = packetsLost / (packetsLost + packetsReceived)
|
|
118
|
+
if (lossRate > 0.05) console.warn('High packet loss:', lossRate)
|
|
119
|
+
if (jitter > 100) console.warn('High jitter:', jitter)
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Stage Management (Limit Visible Participants)
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Subscribe to top 6 active speakers only
|
|
129
|
+
let activeSubscriptions = new Set<string>()
|
|
130
|
+
|
|
131
|
+
function updateStage(topSpeakers: string[]) {
|
|
132
|
+
const toAdd = topSpeakers.filter((id) => !activeSubscriptions.has(id)).slice(0, 6)
|
|
133
|
+
const toRemove = [...activeSubscriptions].filter((id) => !topSpeakers.includes(id))
|
|
134
|
+
|
|
135
|
+
toRemove.forEach((id) => {
|
|
136
|
+
pc.getSenders()
|
|
137
|
+
.find((s) => s.track?.id === id)
|
|
138
|
+
?.track?.stop()
|
|
139
|
+
activeSubscriptions.delete(id)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
toAdd.forEach(async (id) => {
|
|
143
|
+
await fetch(`/api/subscribe`, { method: 'POST', body: JSON.stringify({ trackId: id }) })
|
|
144
|
+
activeSubscriptions.add(id)
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Advanced
|
|
150
|
+
|
|
151
|
+
Bandwidth mgmt:
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
const s = pc.getSenders().find((s) => s.track?.kind === 'video')
|
|
155
|
+
const p = s.getParameters()
|
|
156
|
+
if (!p.encodings) p.encodings = [{}]
|
|
157
|
+
p.encodings[0].maxBitrate = 1200000
|
|
158
|
+
p.encodings[0].maxFramerate = 24
|
|
159
|
+
await s.setParameters(p)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Simulcast (CF auto-forwards best layer):
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
pc.addTransceiver('video', {
|
|
166
|
+
direction: 'sendonly',
|
|
167
|
+
sendEncodings: [
|
|
168
|
+
{ rid: 'high', maxBitrate: 1200000 },
|
|
169
|
+
{ rid: 'med', maxBitrate: 600000, scaleResolutionDownBy: 2 },
|
|
170
|
+
{ rid: 'low', maxBitrate: 200000, scaleResolutionDownBy: 4 },
|
|
171
|
+
],
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
DataChannel:
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
const dc = pc.createDataChannel('chat', { ordered: true, maxRetransmits: 3 })
|
|
179
|
+
dc.onopen = () => dc.send(JSON.stringify({ type: 'chat', text: 'Hi' }))
|
|
180
|
+
dc.onmessage = (e) => console.log('RX:', JSON.parse(e.data))
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**WHIP/WHEP:** For streaming interop (OBS → SFU, SFU → video players), use WHIP (ingest) and WHEP (egress) protocols. See Cloudflare Stream integration docs.
|
|
184
|
+
|
|
185
|
+
Integrations: R2 for recording `env.R2_BUCKET.put(...)`, Queues for analytics
|
|
186
|
+
|
|
187
|
+
Perf: 100-250ms connect, ~50ms latency (95%), 200-400ms glass-to-glass, no participant limit (client: 10-50 tracks)
|