2026-05-07 18:42:09 +07:00
|
|
|
# Edge Relay
|
|
|
|
|
|
|
|
|
|
HTTP proxy untuk Vercel Edge Runtime.
|
|
|
|
|
|
2026-05-07 22:47:49 +07:00
|
|
|
## Live Deployment
|
|
|
|
|
|
2026-05-07 23:25:58 +07:00
|
|
|
- **Docs/Tester**: `https://proxy-bun.vercel.app/docs`
|
2026-05-07 23:26:17 +07:00
|
|
|
- **Utama**: `https://proxy-bun.vercel.app`
|
|
|
|
|
- **Alternatif**: `https://vercel-relay-alpha-umber.vercel.app`
|
2026-05-07 23:25:58 +07:00
|
|
|
- **Alternatif**: `https://proxy-bun-mytheclipse8647-orfq73fe.apn.leapcell.dev`
|
2026-05-08 17:32:56 +07:00
|
|
|
- **Alternatif**: `https://opennext-app.superaseph.workers.dev`
|
2026-05-07 22:55:23 +07:00
|
|
|
|
2026-05-07 18:42:09 +07:00
|
|
|
## Cara Pakai
|
|
|
|
|
|
|
|
|
|
### Header yang Dibutuhkan
|
|
|
|
|
|
|
|
|
|
| Header | Required | Default | Deskripsi |
|
|
|
|
|
|--------|----------|---------|-----------|
|
|
|
|
|
| `x-relay-target` | Yes | - | URL target yang ingin di-proxy |
|
|
|
|
|
| `x-relay-path` | No | `/` | Path yang ditambahkan ke target |
|
|
|
|
|
|
|
|
|
|
### Contoh
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-07 22:55:23 +07:00
|
|
|
curl -H "x-relay-target: https://jsonplaceholder.typicode.com/posts/1" https://proxy-bun.vercel.app/
|
2026-05-07 23:45:00 +07:00
|
|
|
```
|
|
|
|
|
```bash
|
2026-05-07 18:42:09 +07:00
|
|
|
curl -H "x-relay-target: https://api.example.com" \
|
|
|
|
|
-H "x-relay-path: /v1/users" \
|
2026-05-07 22:55:23 +07:00
|
|
|
https://proxy-bun.vercel.app/
|
2026-05-07 18:42:09 +07:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### HTTP Methods
|
|
|
|
|
|
|
|
|
|
Mendukung semua HTTP methods:
|
|
|
|
|
- `GET`, `HEAD` - tanpa body
|
|
|
|
|
- `POST`, `PUT`, `PATCH`, `DELETE` - dengan body
|
|
|
|
|
|
|
|
|
|
### Header Handling
|
|
|
|
|
|
|
|
|
|
Relay headers yang di-strip sebelum forwarded:
|
|
|
|
|
- `x-relay-target`
|
|
|
|
|
- `x-relay-path`
|
|
|
|
|
- `host`
|
|
|
|
|
|
|
|
|
|
Headers lain tetap di-pass.
|
|
|
|
|
|
|
|
|
|
### Error Handling
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"error": "Missing x-relay-target header"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
HTTP 400 jika `x-relay-target` tidak ada.
|
|
|
|
|
|
|
|
|
|
## Struktur Kode
|
|
|
|
|
|
|
|
|
|
```
|
2026-05-07 22:47:49 +07:00
|
|
|
proxy-bun/
|
|
|
|
|
├── src/
|
|
|
|
|
│ ├── app/
|
2026-05-07 22:55:23 +07:00
|
|
|
│ │ ├── docs/page.tsx # UI / Documentation
|
|
|
|
|
│ │ └── route.ts # Edge API handler
|
2026-05-07 22:47:49 +07:00
|
|
|
│ └── lib/
|
|
|
|
|
│ ├── relay-utils.ts # Pure functions untuk relay logic
|
|
|
|
|
│ └── relay-utils.test.ts # Unit tests
|
2026-05-07 18:42:09 +07:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### relay-utils.ts
|
|
|
|
|
|
|
|
|
|
| Function | Deskripsi |
|
|
|
|
|
|----------|-----------|
|
|
|
|
|
| `normalizeTargetUrl(target, path)` | Gabung target + path, hapus trailing slash |
|
2026-05-07 22:47:49 +07:00
|
|
|
| `filterHeaders(headers)` | Filter relay & security headers |
|
2026-05-07 18:42:09 +07:00
|
|
|
| `shouldSendBody(method)` | Cek apakah method butuh body |
|
|
|
|
|
| `buildRelayRequest(req, url, headers)` | Bangun RequestInit untuk fetch |
|
|
|
|
|
| `createRelayResponse(response)` | Buat Response dari fetch result |
|
|
|
|
|
|
|
|
|
|
## Development
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-05-07 22:47:49 +07:00
|
|
|
bun test # Run tests
|
|
|
|
|
bun run dev # Start local Next.js server
|
2026-05-07 18:42:09 +07:00
|
|
|
```
|