go vet ./... ✓
go test -race ./... ✓ (all packages pass)
## Summary
Implements the HTTP API server for ExploreDNS as described in HAN-389.
## Changes
### `web/api/server.go`
- HTTP server struct with `NewServer(addr)`, `Start()`, `Shutdown(timeout)`
- CORS middleware (allows all origins, GET/POST/OPTIONS)
- Graceful shutdown via `context.WithTimeout`
- `net.Listen` for immediate port binding (zero-port support for tests)
### `web/api/handler.go`
- `POST /api/traverse` — starts async traversal, returns `{"id": "uuid", "status": "running"}`
- `GET /api/traverse/{id}` — polls status and results
- `GET /api/traverse/{id}/stream` — Server-Sent Events for live progress
- `GET /api/health` — health check
- In-memory job store with 1-hour TTL and periodic cleanup
- Background traversal via `traverse.Traverser` with hook-driven SSE fan-out
- SPA static file serving with index.html fallback
### `web/api/static/index.html`
- Placeholder frontend (embedded via `//go:embed static`)
### `cmd/server/main.go`
- Runnable server binary with `-addr` flag and SIGINT/SIGTERM graceful shutdown
### `web/api/handler_test.go`
- 12 tests covering health, CORS, traversal start/poll/stream, SPA fallback
## Test results
```
go vet ./... ✓
go test -race ./... ✓ (all packages pass)
```
- web/api/server.go: HTTP server with CORS middleware, graceful shutdown,
configurable listen address via NewServer(addr); uses net.Listen so the
bound port is available via Addr() for tests.
- web/api/handler.go: REST handlers over Go 1.22 mux patterns:
POST /api/traverse start async traversal -> {id, status}
GET /api/traverse/{id} poll status + results
GET /api/traverse/{id}/stream SSE live progress events
GET /api/health health check
In-memory job store with 1-hour TTL and background cleanup goroutine.
Background traversal via traverse.Traverser with hook-driven progress
events fanned out to SSE subscribers.
- web/api/static/index.html: placeholder SPA shell (embedded via
//go:embed static). Unknown URL paths fall back to index.html for
client-side routing.
- cmd/server/main.go: runnable server binary with -addr flag and
SIGINT/SIGTERM graceful shutdown.
All tests pass: go test -race ./... | go vet ./...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: multica-agent <github@multica.ai>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Implements the HTTP API server for ExploreDNS as described in HAN-389.
Changes
web/api/server.goNewServer(addr),Start(),Shutdown(timeout)context.WithTimeoutnet.Listenfor immediate port binding (zero-port support for tests)web/api/handler.goPOST /api/traverse— starts async traversal, returns{"id": "uuid", "status": "running"}GET /api/traverse/{id}— polls status and resultsGET /api/traverse/{id}/stream— Server-Sent Events for live progressGET /api/health— health checktraverse.Traverserwith hook-driven SSE fan-outweb/api/static/index.html//go:embed static)cmd/server/main.go-addrflag and SIGINT/SIGTERM graceful shutdownweb/api/handler_test.goTest results
- web/api/server.go: HTTP server with CORS middleware, graceful shutdown, configurable listen address via NewServer(addr); uses net.Listen so the bound port is available via Addr() for tests. - web/api/handler.go: REST handlers over Go 1.22 mux patterns: POST /api/traverse start async traversal -> {id, status} GET /api/traverse/{id} poll status + results GET /api/traverse/{id}/stream SSE live progress events GET /api/health health check In-memory job store with 1-hour TTL and background cleanup goroutine. Background traversal via traverse.Traverser with hook-driven progress events fanned out to SSE subscribers. - web/api/static/index.html: placeholder SPA shell (embedded via //go:embed static). Unknown URL paths fall back to index.html for client-side routing. - cmd/server/main.go: runnable server binary with -addr flag and SIGINT/SIGTERM graceful shutdown. All tests pass: go test -race ./... | go vet ./... Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: multica-agent <github@multica.ai>