# Workers Playground API

## Handler

```javascript
export default {
  async fetch(request, env, ctx) {
    // request: Request, env: {} (empty in playground), ctx: ExecutionContext
    return new Response("Hello");
  },
};
```

## Request

```javascript
const method = request.method; // "GET", "POST"
const url = new URL(request.url); // Parse URL
const headers = request.headers; // Headers object
const body = await request.json(); // Read body (consumes stream)
const clone = request.clone(); // Clone before reading body

// Query params
url.searchParams.get("page"); // Single value
url.searchParams.getAll("tag"); // Array

// Cloudflare metadata
request.cf.country; // "US"
request.cf.colo; // "SFO"
```

## Response

```javascript
// Text
return new Response('Hello', { status: 200 });

// JSON
return Response.json({ data }, { status: 200, headers: {...} });

// Redirect
return Response.redirect('/new-path', 301);

// Modify existing
const modified = new Response(response.body, response);
modified.headers.set('X-Custom', 'value');
```

## ExecutionContext

```javascript
// Background work (after response sent)
ctx.waitUntil(fetch("https://logs.example.com", { method: "POST", body: "..." }));
return new Response("OK"); // Returns immediately
```

## Fetch

```javascript
const response = await fetch("https://api.example.com");
const data = await response.json();

// With options
await fetch(url, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ name: "Alice" }),
});
```

## Cache

```javascript
const cache = caches.default;

// Check cache
let response = await cache.match(request);
if (!response) {
  response = await fetch(origin);
  await cache.put(request, response.clone()); // Clone before put!
}
return response;
```

## Crypto

```javascript
crypto.randomUUID(); // UUID v4
crypto.getRandomValues(new Uint8Array(16));

// SHA-256 hash
const hash = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(data));
```

## Limits (Playground = Free Plan)

| Resource    | Limit  |
| ----------- | ------ |
| CPU time    | 10ms   |
| Subrequests | 50     |
| Memory      | 128 MB |
