pi-cloudflare 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Common Patterns
|
|
2
|
+
|
|
3
|
+
## 1. Allowlist/Blocklist
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Allowlist
|
|
7
|
+
const allowed = ["user@example.com", "trusted@corp.com"];
|
|
8
|
+
if (!allowed.includes(message.from)) {
|
|
9
|
+
message.setReject("Not allowed");
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
await message.forward("inbox@corp.com");
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 2. Parse Email Body
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import PostalMime from 'postal-mime';
|
|
19
|
+
|
|
20
|
+
export default {
|
|
21
|
+
async email(message, env, ctx) {
|
|
22
|
+
// CRITICAL: Consume stream immediately
|
|
23
|
+
const raw = await message.raw.arrayBuffer();
|
|
24
|
+
|
|
25
|
+
const parser = new PostalMime();
|
|
26
|
+
const email = await parser.parse(raw);
|
|
27
|
+
|
|
28
|
+
console.log({
|
|
29
|
+
subject: email.subject,
|
|
30
|
+
text: email.text,
|
|
31
|
+
html: email.html,
|
|
32
|
+
from: email.from.address,
|
|
33
|
+
attachments: email.attachments.length
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
await message.forward("inbox@corp.com");
|
|
37
|
+
}
|
|
38
|
+
} satisfies ExportedHandler;
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 3. Spam Filter
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
const score = parseFloat(message.headers.get("x-cf-spamh-score") || "0");
|
|
45
|
+
if (score > 5) {
|
|
46
|
+
message.setReject("Spam detected");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
await message.forward("inbox@corp.com");
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 4. Archive to R2
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
interface Env { R2: R2Bucket; }
|
|
56
|
+
|
|
57
|
+
export default {
|
|
58
|
+
async email(message, env, ctx) {
|
|
59
|
+
const raw = await message.raw.arrayBuffer();
|
|
60
|
+
|
|
61
|
+
const key = `${new Date().toISOString()}-${message.from}.eml`;
|
|
62
|
+
await env.R2.put(key, raw, {
|
|
63
|
+
httpMetadata: { contentType: "message/rfc822" }
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await message.forward("inbox@corp.com");
|
|
67
|
+
}
|
|
68
|
+
} satisfies ExportedHandler<Env>;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 5. Store Metadata in KV
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import PostalMime from 'postal-mime';
|
|
75
|
+
|
|
76
|
+
interface Env { KV: KVNamespace; }
|
|
77
|
+
|
|
78
|
+
export default {
|
|
79
|
+
async email(message, env, ctx) {
|
|
80
|
+
const raw = await message.raw.arrayBuffer();
|
|
81
|
+
const parser = new PostalMime();
|
|
82
|
+
const email = await parser.parse(raw);
|
|
83
|
+
|
|
84
|
+
const metadata = {
|
|
85
|
+
from: email.from.address,
|
|
86
|
+
subject: email.subject,
|
|
87
|
+
timestamp: new Date().toISOString(),
|
|
88
|
+
size: raw.byteLength
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
await env.KV.put(`email:${Date.now()}`, JSON.stringify(metadata));
|
|
92
|
+
await message.forward("inbox@corp.com");
|
|
93
|
+
}
|
|
94
|
+
} satisfies ExportedHandler<Env>;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 6. Subject-Based Routing
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
export default {
|
|
101
|
+
async email(message, env, ctx) {
|
|
102
|
+
const subject = message.headers.get("subject")?.toLowerCase() || "";
|
|
103
|
+
|
|
104
|
+
if (subject.includes("[urgent]")) {
|
|
105
|
+
await message.forward("oncall@corp.com");
|
|
106
|
+
} else if (subject.includes("[billing]")) {
|
|
107
|
+
await message.forward("billing@corp.com");
|
|
108
|
+
} else if (subject.includes("[support]")) {
|
|
109
|
+
await message.forward("support@corp.com");
|
|
110
|
+
} else {
|
|
111
|
+
await message.forward("general@corp.com");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
} satisfies ExportedHandler;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## 7. Auto-Reply
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
interface Env {
|
|
121
|
+
EMAIL: SendEmail;
|
|
122
|
+
REPLIED: KVNamespace;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export default {
|
|
126
|
+
async email(message, env, ctx) {
|
|
127
|
+
const msgId = message.headers.get("message-id");
|
|
128
|
+
|
|
129
|
+
if (msgId && await env.REPLIED.get(msgId)) {
|
|
130
|
+
await message.forward("archive@corp.com");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
ctx.waitUntil((async () => {
|
|
135
|
+
await env.EMAIL.send({
|
|
136
|
+
from: "noreply@yourdomain.com",
|
|
137
|
+
to: message.from,
|
|
138
|
+
subject: "Re: " + (message.headers.get("subject") || ""),
|
|
139
|
+
text: "Thank you. We'll respond within 24h."
|
|
140
|
+
});
|
|
141
|
+
if (msgId) await env.REPLIED.put(msgId, "1", { expirationTtl: 604800 });
|
|
142
|
+
})());
|
|
143
|
+
|
|
144
|
+
await message.forward("support@corp.com");
|
|
145
|
+
}
|
|
146
|
+
} satisfies ExportedHandler<Env>;
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 8. Extract Attachments
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import PostalMime from 'postal-mime';
|
|
153
|
+
|
|
154
|
+
interface Env { ATTACHMENTS: R2Bucket; }
|
|
155
|
+
|
|
156
|
+
export default {
|
|
157
|
+
async email(message, env, ctx) {
|
|
158
|
+
const parser = new PostalMime();
|
|
159
|
+
const email = await parser.parse(await message.raw.arrayBuffer());
|
|
160
|
+
|
|
161
|
+
for (const att of email.attachments) {
|
|
162
|
+
const key = `${Date.now()}-${att.filename}`;
|
|
163
|
+
await env.ATTACHMENTS.put(key, att.content, {
|
|
164
|
+
httpMetadata: { contentType: att.mimeType }
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
await message.forward("inbox@corp.com");
|
|
169
|
+
}
|
|
170
|
+
} satisfies ExportedHandler<Env>;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 9. Log to D1
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
import PostalMime from 'postal-mime';
|
|
177
|
+
|
|
178
|
+
interface Env { DB: D1Database; }
|
|
179
|
+
|
|
180
|
+
export default {
|
|
181
|
+
async email(message, env, ctx) {
|
|
182
|
+
const parser = new PostalMime();
|
|
183
|
+
const email = await parser.parse(await message.raw.arrayBuffer());
|
|
184
|
+
|
|
185
|
+
ctx.waitUntil(
|
|
186
|
+
env.DB.prepare("INSERT INTO log (ts, from_addr, subj) VALUES (?, ?, ?)")
|
|
187
|
+
.bind(new Date().toISOString(), email.from.address, email.subject || "")
|
|
188
|
+
.run()
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
await message.forward("inbox@corp.com");
|
|
192
|
+
}
|
|
193
|
+
} satisfies ExportedHandler<Env>;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 10. Multi-Tenant
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
interface Env { TENANTS: KVNamespace; }
|
|
200
|
+
|
|
201
|
+
export default {
|
|
202
|
+
async email(message, env, ctx) {
|
|
203
|
+
const subdomain = message.to.split("@")[1].split(".")[0];
|
|
204
|
+
const config = await env.TENANTS.get(subdomain, "json") as { forward: string } | null;
|
|
205
|
+
|
|
206
|
+
if (!config) {
|
|
207
|
+
message.setReject("Unknown tenant");
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
await message.forward(config.forward);
|
|
212
|
+
}
|
|
213
|
+
} satisfies ExportedHandler<Env>;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Summary
|
|
217
|
+
|
|
218
|
+
| Pattern | Use Case | Storage |
|
|
219
|
+
|---------|----------|---------|
|
|
220
|
+
| Allowlist | Security | None |
|
|
221
|
+
| Parse | Body/attachments | None |
|
|
222
|
+
| Spam Filter | Reduce spam | None |
|
|
223
|
+
| R2 Archive | Email storage | R2 |
|
|
224
|
+
| KV Meta | Analytics | KV |
|
|
225
|
+
| Subject Route | Dept routing | None |
|
|
226
|
+
| Auto-Reply | Support | KV |
|
|
227
|
+
| Attachments | Doc mgmt | R2 |
|
|
228
|
+
| D1 Log | Audit trail | D1 |
|
|
229
|
+
| Multi-Tenant | SaaS | KV |
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Cloudflare Email Workers
|
|
2
|
+
|
|
3
|
+
Process incoming emails programmatically using Cloudflare Workers runtime.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Email Workers enable custom email processing logic at the edge. Build spam filters, auto-responders, ticket systems, notification handlers, and more using the same Workers runtime you use for HTTP requests.
|
|
8
|
+
|
|
9
|
+
**Key capabilities**:
|
|
10
|
+
- Process inbound emails with full message access
|
|
11
|
+
- Forward to verified destinations
|
|
12
|
+
- Send replies with proper threading
|
|
13
|
+
- Parse MIME content and attachments
|
|
14
|
+
- Integrate with KV, R2, D1, and external APIs
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
### Minimal ES Modules Handler
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
export default {
|
|
22
|
+
async email(message, env, ctx) {
|
|
23
|
+
// Reject spam
|
|
24
|
+
if (message.from.includes('spam.com')) {
|
|
25
|
+
message.setReject('Blocked');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Forward to inbox
|
|
30
|
+
await message.forward('inbox@example.com');
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Core Operations
|
|
36
|
+
|
|
37
|
+
| Operation | Method | Use Case |
|
|
38
|
+
|-----------|--------|----------|
|
|
39
|
+
| Forward | `message.forward(to, headers?)` | Route to verified destination |
|
|
40
|
+
| Reject | `message.setReject(reason)` | Block with SMTP error |
|
|
41
|
+
| Reply | `message.reply(emailMessage)` | Auto-respond with threading |
|
|
42
|
+
| Parse | postal-mime library | Extract subject, body, attachments |
|
|
43
|
+
|
|
44
|
+
## Reading Order
|
|
45
|
+
|
|
46
|
+
For comprehensive understanding, read files in this order:
|
|
47
|
+
|
|
48
|
+
1. **README.md** (this file) - Overview and quick start
|
|
49
|
+
2. **configuration.md** - Setup, deployment, bindings
|
|
50
|
+
3. **api.md** - Complete API reference
|
|
51
|
+
4. **patterns.md** - Real-world implementation examples
|
|
52
|
+
5. **gotchas.md** - Critical pitfalls and debugging
|
|
53
|
+
|
|
54
|
+
## In This Reference
|
|
55
|
+
|
|
56
|
+
| File | Description | Key Topics |
|
|
57
|
+
|------|-------------|------------|
|
|
58
|
+
| [api.md](./api.md) | Complete API reference | ForwardableEmailMessage, SendEmail bindings, reply() method, postal-mime/mimetext APIs |
|
|
59
|
+
| [configuration.md](./configuration.md) | Setup and configuration | wrangler.jsonc, bindings, deployment, dependencies |
|
|
60
|
+
| [patterns.md](./patterns.md) | Real-world examples | Allowlists from KV, auto-reply with threading, attachment extraction, webhook notifications |
|
|
61
|
+
| [gotchas.md](./gotchas.md) | Pitfalls and debugging | Stream consumption, ctx.waitUntil errors, security, limits |
|
|
62
|
+
|
|
63
|
+
## Architecture
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Incoming Email → Email Routing → Email Worker
|
|
67
|
+
↓
|
|
68
|
+
Process + Decide
|
|
69
|
+
↓
|
|
70
|
+
┌───────────────┼───────────────┐
|
|
71
|
+
↓ ↓ ↓
|
|
72
|
+
Forward Reply Reject
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Event flow**:
|
|
76
|
+
1. Email arrives at your domain
|
|
77
|
+
2. Email Routing matches route (e.g., `support@example.com`)
|
|
78
|
+
3. Bound Email Worker receives `ForwardableEmailMessage`
|
|
79
|
+
4. Worker processes and takes action (forward/reply/reject)
|
|
80
|
+
5. Email delivered or rejected based on worker logic
|
|
81
|
+
|
|
82
|
+
## Key Concepts
|
|
83
|
+
|
|
84
|
+
### Envelope vs Headers
|
|
85
|
+
|
|
86
|
+
- **Envelope addresses** (`message.from`, `message.to`): SMTP transport addresses (trusted)
|
|
87
|
+
- **Header addresses** (parsed from body): Display addresses (can be spoofed)
|
|
88
|
+
|
|
89
|
+
Use envelope addresses for security decisions.
|
|
90
|
+
|
|
91
|
+
### Single-Use Streams
|
|
92
|
+
|
|
93
|
+
`message.raw` is a ReadableStream that can only be read once. Buffer to ArrayBuffer for multiple uses.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// Buffer first
|
|
97
|
+
const buffer = await new Response(message.raw).arrayBuffer();
|
|
98
|
+
const email = await PostalMime.parse(buffer);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
See [gotchas.md](./gotchas.md#readablestream-can-only-be-consumed-once) for details.
|
|
102
|
+
|
|
103
|
+
### Verified Destinations
|
|
104
|
+
|
|
105
|
+
`forward()` only works with addresses verified in the Cloudflare Email Routing dashboard. Add destinations before deployment.
|
|
106
|
+
|
|
107
|
+
## Use Cases
|
|
108
|
+
|
|
109
|
+
- **Spam filtering**: Block based on sender, content, or reputation
|
|
110
|
+
- **Auto-responders**: Send acknowledgment replies with threading
|
|
111
|
+
- **Ticket creation**: Parse emails and create support tickets
|
|
112
|
+
- **Email archival**: Store in KV, R2, or D1
|
|
113
|
+
- **Notification routing**: Forward to Slack, Discord, or webhooks
|
|
114
|
+
- **Attachment processing**: Extract files to R2 storage
|
|
115
|
+
- **Multi-tenant routing**: Route based on recipient subdomain
|
|
116
|
+
- **Size filtering**: Reject oversized attachments
|
|
117
|
+
|
|
118
|
+
## Limits
|
|
119
|
+
|
|
120
|
+
| Limit | Value |
|
|
121
|
+
|-------|-------|
|
|
122
|
+
| Max message size | 25 MiB |
|
|
123
|
+
| Max routing rules | 200 |
|
|
124
|
+
| Max destinations | 200 |
|
|
125
|
+
| CPU time (free tier) | 10ms |
|
|
126
|
+
| CPU time (paid tier) | 30s (default), 5min (max) |
|
|
127
|
+
|
|
128
|
+
See [gotchas.md](./gotchas.md#limits-reference) for complete limits table.
|
|
129
|
+
|
|
130
|
+
## Prerequisites
|
|
131
|
+
|
|
132
|
+
Before deploying Email Workers:
|
|
133
|
+
|
|
134
|
+
1. **Enable Email Routing** in Cloudflare dashboard for your domain
|
|
135
|
+
2. **Verify destination addresses** for forwarding
|
|
136
|
+
3. **Configure DMARC/SPF** for sending domains (required for replies)
|
|
137
|
+
4. **Set up wrangler.jsonc** with SendEmail binding
|
|
138
|
+
|
|
139
|
+
See [configuration.md](./configuration.md) for detailed setup.
|
|
140
|
+
|
|
141
|
+
## Service Worker Syntax (Deprecated)
|
|
142
|
+
|
|
143
|
+
Modern projects should use ES modules format shown above. Service Worker syntax (`addEventListener('email', ...)`) is deprecated but still supported.
|
|
144
|
+
|
|
145
|
+
## See Also
|
|
146
|
+
|
|
147
|
+
- [Email Routing Documentation](https://developers.cloudflare.com/email-routing/)
|
|
148
|
+
- [Workers Platform](https://developers.cloudflare.com/workers/)
|
|
149
|
+
- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)
|
|
150
|
+
- [postal-mime on npm](https://www.npmjs.com/package/postal-mime)
|
|
151
|
+
- [mimetext on npm](https://www.npmjs.com/package/mimetext)
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Email Workers API Reference
|
|
2
|
+
|
|
3
|
+
Complete API reference for Cloudflare Email Workers runtime.
|
|
4
|
+
|
|
5
|
+
## ForwardableEmailMessage Interface
|
|
6
|
+
|
|
7
|
+
The main interface passed to email handlers.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
interface ForwardableEmailMessage {
|
|
11
|
+
readonly from: string; // Envelope MAIL FROM (SMTP sender)
|
|
12
|
+
readonly to: string; // Envelope RCPT TO (SMTP recipient)
|
|
13
|
+
readonly headers: Headers; // Web-standard Headers object
|
|
14
|
+
readonly raw: ReadableStream; // Raw MIME message (single-use stream)
|
|
15
|
+
readonly rawSize: number; // Total message size in bytes
|
|
16
|
+
|
|
17
|
+
setReject(reason: string): void;
|
|
18
|
+
forward(rcptTo: string, headers?: Headers): Promise<void>;
|
|
19
|
+
reply(message: EmailMessage): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Properties
|
|
24
|
+
|
|
25
|
+
| Property | Type | Description |
|
|
26
|
+
|----------|------|-------------|
|
|
27
|
+
| `from` | string | Envelope sender (SMTP MAIL FROM) - use for security |
|
|
28
|
+
| `to` | string | Envelope recipient (SMTP RCPT TO) |
|
|
29
|
+
| `headers` | Headers | Message headers (Subject, Message-ID, etc.) |
|
|
30
|
+
| `raw` | ReadableStream | Raw MIME message (**single-use**, buffer first) |
|
|
31
|
+
| `rawSize` | number | Message size in bytes |
|
|
32
|
+
|
|
33
|
+
### Methods
|
|
34
|
+
|
|
35
|
+
#### setReject(reason: string): void
|
|
36
|
+
|
|
37
|
+
Reject with permanent SMTP 5xx error. Email not delivered, sender may receive bounce.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
if (blockList.includes(message.from)) {
|
|
41
|
+
message.setReject('Sender blocked');
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
#### forward(rcptTo: string, headers?: Headers): Promise<void>
|
|
46
|
+
|
|
47
|
+
Forward to verified destination. Only `X-*` custom headers allowed.
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
await message.forward('inbox@example.com');
|
|
51
|
+
|
|
52
|
+
// With custom headers
|
|
53
|
+
const h = new Headers();
|
|
54
|
+
h.set('X-Processed-By', 'worker');
|
|
55
|
+
await message.forward('inbox@example.com', h);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### reply(message: EmailMessage): Promise<void>
|
|
59
|
+
|
|
60
|
+
Send a reply to the original sender (March 2025 feature).
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { EmailMessage } from 'cloudflare:email';
|
|
64
|
+
import { createMimeMessage } from 'mimetext';
|
|
65
|
+
|
|
66
|
+
const msg = createMimeMessage();
|
|
67
|
+
msg.setSender({ name: 'Support', addr: 'support@example.com' });
|
|
68
|
+
msg.setRecipient(message.from);
|
|
69
|
+
msg.setSubject(`Re: ${message.headers.get('Subject')}`);
|
|
70
|
+
msg.setHeader('In-Reply-To', message.headers.get('Message-ID'));
|
|
71
|
+
msg.setHeader('References', message.headers.get('References') || '');
|
|
72
|
+
msg.addMessage({
|
|
73
|
+
contentType: 'text/plain',
|
|
74
|
+
data: 'Thank you for your message.'
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await message.reply(new EmailMessage(
|
|
78
|
+
'support@example.com',
|
|
79
|
+
message.from,
|
|
80
|
+
msg.asRaw()
|
|
81
|
+
));
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Requirements**:
|
|
85
|
+
- Incoming email needs valid DMARC
|
|
86
|
+
- Reply once per event, recipient = `message.from`
|
|
87
|
+
- Sender domain = receiving domain, with DMARC/SPF/DKIM
|
|
88
|
+
- Max 100 `References` entries
|
|
89
|
+
- Threading: `In-Reply-To` (original Message-ID), `References`, new `Message-ID`
|
|
90
|
+
|
|
91
|
+
## EmailMessage Constructor
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { EmailMessage } from 'cloudflare:email';
|
|
95
|
+
|
|
96
|
+
new EmailMessage(from: string, to: string, raw: ReadableStream | string)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Used for sending emails (replies or via SendEmail binding). Domain must be verified.
|
|
100
|
+
|
|
101
|
+
## SendEmail Interface
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
interface SendEmail {
|
|
105
|
+
send(message: EmailMessage): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Usage
|
|
109
|
+
await env.EMAIL.send(new EmailMessage(from, to, mimeContent));
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## SendEmail Binding Types
|
|
113
|
+
|
|
114
|
+
```jsonc
|
|
115
|
+
{
|
|
116
|
+
"send_email": [
|
|
117
|
+
{ "name": "EMAIL" }, // Type 1: Any verified address
|
|
118
|
+
{ "name": "LOGS", "destination_address": "logs@example.com" }, // Type 2: Single dest
|
|
119
|
+
{ "name": "TEAM", "allowed_destination_addresses": ["a@ex.com", "b@ex.com"] }, // Type 3: Dest allowlist
|
|
120
|
+
{ "name": "NOREPLY", "allowed_sender_addresses": ["noreply@ex.com"] } // Type 4: Sender allowlist
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## postal-mime Parsed Output
|
|
126
|
+
|
|
127
|
+
postal-mime v2.7.3 parses incoming emails into structured data.
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
interface ParsedEmail {
|
|
131
|
+
headers: Array<{ key: string; value: string }>;
|
|
132
|
+
from: { name: string; address: string } | null;
|
|
133
|
+
to: Array<{ name: string; address: string }> | { name: string; address: string } | null;
|
|
134
|
+
cc: Array<{ name: string; address: string }> | null;
|
|
135
|
+
bcc: Array<{ name: string; address: string }> | null;
|
|
136
|
+
subject: string;
|
|
137
|
+
messageId: string | null;
|
|
138
|
+
inReplyTo: string | null;
|
|
139
|
+
references: string | null;
|
|
140
|
+
date: string | null;
|
|
141
|
+
html: string | null;
|
|
142
|
+
text: string | null;
|
|
143
|
+
attachments: Array<{
|
|
144
|
+
filename: string;
|
|
145
|
+
mimeType: string;
|
|
146
|
+
disposition: string | null;
|
|
147
|
+
related: boolean;
|
|
148
|
+
contentId: string | null;
|
|
149
|
+
content: Uint8Array;
|
|
150
|
+
}>;
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Usage
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
import PostalMime from 'postal-mime';
|
|
158
|
+
|
|
159
|
+
const buffer = await new Response(message.raw).arrayBuffer();
|
|
160
|
+
const email = await PostalMime.parse(buffer);
|
|
161
|
+
|
|
162
|
+
console.log(email.subject);
|
|
163
|
+
console.log(email.from?.address);
|
|
164
|
+
console.log(email.text);
|
|
165
|
+
console.log(email.attachments.length);
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## mimetext API Quick Reference
|
|
169
|
+
|
|
170
|
+
mimetext v3.0.27 composes outgoing emails.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import { createMimeMessage } from 'mimetext';
|
|
174
|
+
|
|
175
|
+
const msg = createMimeMessage();
|
|
176
|
+
|
|
177
|
+
// Sender
|
|
178
|
+
msg.setSender({ name: 'John Doe', addr: 'john@example.com' });
|
|
179
|
+
|
|
180
|
+
// Recipients
|
|
181
|
+
msg.setRecipient('alice@example.com');
|
|
182
|
+
msg.setRecipients(['bob@example.com', 'carol@example.com']);
|
|
183
|
+
msg.setCc('manager@example.com');
|
|
184
|
+
msg.setBcc(['audit@example.com']);
|
|
185
|
+
|
|
186
|
+
// Headers
|
|
187
|
+
msg.setSubject('Meeting Notes');
|
|
188
|
+
msg.setHeader('In-Reply-To', '<previous-message-id>');
|
|
189
|
+
msg.setHeader('References', '<msg1> <msg2>');
|
|
190
|
+
msg.setHeader('Message-ID', `<${crypto.randomUUID()}@example.com>`);
|
|
191
|
+
|
|
192
|
+
// Content
|
|
193
|
+
msg.addMessage({
|
|
194
|
+
contentType: 'text/plain',
|
|
195
|
+
data: 'Plain text content'
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
msg.addMessage({
|
|
199
|
+
contentType: 'text/html',
|
|
200
|
+
data: '<p>HTML content</p>'
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Attachments
|
|
204
|
+
msg.addAttachment({
|
|
205
|
+
filename: 'report.pdf',
|
|
206
|
+
contentType: 'application/pdf',
|
|
207
|
+
data: pdfBuffer // Uint8Array or base64 string
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Generate raw MIME
|
|
211
|
+
const raw = msg.asRaw(); // Returns string
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## TypeScript Types
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import {
|
|
218
|
+
ForwardableEmailMessage,
|
|
219
|
+
EmailMessage
|
|
220
|
+
} from 'cloudflare:email';
|
|
221
|
+
|
|
222
|
+
interface Env {
|
|
223
|
+
EMAIL: SendEmail;
|
|
224
|
+
EMAIL_ARCHIVE: KVNamespace;
|
|
225
|
+
ALLOWED_SENDERS: KVNamespace;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export default {
|
|
229
|
+
async email(
|
|
230
|
+
message: ForwardableEmailMessage,
|
|
231
|
+
env: Env,
|
|
232
|
+
ctx: ExecutionContext
|
|
233
|
+
): Promise<void> {
|
|
234
|
+
// Fully typed
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
```
|