cloudflare-expert
Included with Lifetime
$97 forever
Expert-level Cloudflare Workers, CDN, edge computing, and security services
cloudcloudflareedge-computingcdnworkerswaf
What this skill does
# Cloudflare Expert
Expert guidance for Cloudflare Workers, edge computing, CDN optimization, and Cloudflare security services.
## Core Concepts
### Cloudflare Services
- Cloudflare Workers (serverless edge computing)
- CDN and caching
- DDoS protection
- Web Application Firewall (WAF)
- DNS management
- Load balancing
- Workers KV (key-value storage)
- Durable Objects
### Edge Computing
- Deploy code globally
- Reduce latency
- Process at the edge
- Distributed state
- Real-time applications
### Developer Tools
- Wrangler CLI
- Workers Playground
- Edge APIs
- Analytics and logs
## Cloudflare Workers
```javascript
// Basic Worker
export default {
async fetch(request, env, ctx) {
return new Response('Hello from Cloudflare Workers!', {
headers: { 'Content-Type': 'text/plain' }
});
}
};
// Advanced routing
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// Route based on path
switch (url.pathname) {
case '/api/users':
return handleUsers(request, env);
case '/api/posts':
return handlePosts(request, env);
default:
return new Response('Not Found', { status: 404 });
}
}
};
// API endpoint with JSON
async function handleUsers(request, env) {
if (request.method === 'GET') {
const users = await env.USERS_KV.get('users', { type: 'json' });
return new Response(JSON.stringify(users), {
headers: { 'Content-Type': 'application/json' }
});
}
if (request.method === 'POST') {
const body = await request.json();
await env.USERS_KV.put('users', JSON.stringify(body));
return new Response('Created', { status: 201 });
}
return new Response('Method Not Allowed', { status: 405 });
}
```
## Workers KV Storage
```javascript
// Workers KV operations
export default {
async fetch(request, env, ctx) {
// Write
await env.MY_KV.put('key', 'value');
// Write with metadata and expiration
await env.MY_KV.put('key', 'value', {
metadata: { userId: '123' },
expirationTtl: 3600 // 1 hour
});
// Read
const value = await env.MY_KV.get('key');
// Read as JSON
const jsonValue = await env.MY_KV.get('key', { type: 'json' });
// Read with metadata
const { value, metadata } = await env.MY_KV.getWithMetadata('key');
// Delete
await env.MY_KV.delete('key');
// List keys
const keys = await env.MY_KV.list({ prefix: 'user:' });
return new Response(JSON.stringify({ value, keys }));
}
};
// Caching pattern
class CachedAPI {
constructor(kv) {
this.kv = kv;
}
async get(key, fetcher, ttl = 3600) {
// Try cache first
const cached = await this.kv.get(key, { type: 'json' });
if (cached) return cached;
// Fetch and cache
const data = await fetcher();
await this.kv.put(key, JSON.stringify(data), {
expirationTtl: ttl
});
return data;
}
}
export default {
async fetch(request, env, ctx) {
const cache = new CachedAPI(env.MY_KV);
const data = await cache.get('api:users', async () => {
const response = await fetch('https://api.example.com/users');
return response.json();
}, 3600);
return new Response(JSON.stringify(data));
}
};
```
## Durable Objects
```javascript
// Durable Object for stateful logic
export class Counter {
constructor(state, env) {
this.state = state;
this.value = 0;
}
async initialize() {
this.value = await this.state.storage.get('value') || 0;
}
async fetch(request) {
await this.initialize();
const url = new URL(request.url);
if (url.pathname === '/increment') {
this.value++;
await this.state.storage.put('value', this.value);
return new Response(String(this.value));
}
if (url.pathname === '/decrement') {
this.value--;
await this.state.storage.put('value', this.value);
return new Response(String(this.value));
}
return new Response(String(this.value));
}
}
// WebSocket chat room with Durable Objects
export class ChatRoom {
constructor(state, env) {
this.state = state;
this.sessions = [];
}
async fetch(request) {
if (request.headers.get('Upgrade') !== 'websocket') {
return new Response('Expected WebSocket', { status: 426 });
}
const pair = new WebSocketPair();
const [client, server] = Object.values(pair);
await this.handleSession(server);
return new Response(null, {
status: 101,
webSocket: client
});
}
async handleSession(websocket) {
websocket.accept();
this.sessions.push(websocket);
websocket.addEventListener('message', async (msg) => {
// Broadcast to all sessions
for (const session of this.sessions) {
try {
session.send(msg.data);
} catch (err) {
// Remove closed sessions
this.sessions = this.sessions.filter(s => s !== session);
}
}
});
}
}
// Worker that uses Durable Object
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
const roomId = url.pathname.slice(1);
// Get or create Durable Object
const id = env.CHAT_ROOM.idFromName(roomId);
const stub = env.CHAT_ROOM.get(id);
return stub.fetch(request);
}
};
```
## Request/Response Handling
```javascript
// CORS handling
function handleCORS(request) {
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
};
// Handle preflight
if (request.method === 'OPTIONS') {
return new Response(null, { headers: corsHeaders });
}
return corsHeaders;
}
// Authentication middleware
async function authenticate(request, env) {
const token = request.headers.get('Authorization')?.replace('Bearer ', '');
if (!token) {
return new Response('Unauthorized', { status: 401 });
}
// Verify token (example using JWT)
try {
const payload = await verifyJWT(token, env.JWT_SECRET);
return payload;
} catch (err) {
return new Response('Invalid token', { status: 401 });
}
}
// Rate limiting
class RateLimiter {
constructor(kv) {
this.kv = kv;
}
async checkLimit(identifier, maxRequests, windowSeconds) {
const key = `rate_limit:${identifier}`;
const now = Date.now();
const windowMs = windowSeconds * 1000;
// Get current count
const data = await this.kv.get(key, { type: 'json' });
if (!data || now - data.timestamp > windowMs) {
// New window
await this.kv.put(key, JSON.stringify({
count: 1,
timestamp: now
}), { expirationTtl: windowSeconds });
return true;
}
if (data.count >= maxRequests) {
return false; // Rate limit exceeded
}
// Increment count
data.count++;
await this.kv.put(key, JSON.stringify(data), {
expirationTtl: windowSeconds
});
return true;
}
}
export default {
async fetch(request, env, ctx) {
const corsHeaders = handleCORS(request);
if (request.method === 'OPTIONS') return corsHeaders;
// Rate limiting
const rateLimiter = new RateLimiter(env.RATE_LIMIT_KV);
const clientIP = request.headers.get('CF-Connecting-IP');
const allowed = await rateLimiter.checkLimit(clientIP, 100, 60);
if (!allowed) {
return new Response('Rate limit exceeded', {
status: 429,
headers: corsHeaders
});
}
// Authentication
const user = await authenticate(request, env);
if (user instanceof Response) {
return user; // Error response
}
// Process request
const response = await handleRequest(request, env, user);
// Add CORS headers to response
Object.entries(corsHeaders).forEach(([key, value]) => {
response.headers.set(key, value);
});
return response;
}
};
```
## Caching Strategies
```javascript
// Cache API
async functiRelated in cloud
aws-expert
IncludedExpert-level AWS cloud architecture, services, security, cost optimization, and best practices
cloud
azure-expert
IncludedExpert-level Microsoft Azure cloud platform, services, and architecture
cloud
gcp-expert
IncludedExpert-level Google Cloud Platform, services, and cloud architecture
cloud