mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-21 06:11:27 -07:00
102 lines
2.2 KiB
Markdown
102 lines
2.2 KiB
Markdown
# 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 |
|