M8: HTTP driver (framework-agnostic handler + HttpKVDriver client) passing conformance end-to-end

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qxbkp4tA7G5SCWjzWuxmE
This commit is contained in:
Claude
2026-10-23 07:21:09 +00:00
parent f6541507ac
commit 76f791f54b
7 changed files with 384 additions and 0 deletions
+23
View File
@@ -566,6 +566,29 @@ Decisions taken where the brief was silent. Each is the simplest option consiste
- **Type tests** live in `test/types.test-d.ts` and are enforced by `tsc --noEmit` (part of `npm test`),
including the `@ts-expect-error` negative cases from section 7.
### M8 — HTTP driver
- **Extra endpoints** beyond the brief's list: `POST /deleteRange {gte, lt}` and
`GET /capabilities`. Unsupported optional operations return `501`, driver errors `500`, and unknown
routes `404`.
- **Missing vs `null`**: `/getMany` returns `{ values, missing }`, where `missing` lists the indices of
absent keys, because `null` is a legitimate stored value.
- **Codec scope**: the codec serialises whole request/response bodies and each NDJSON scan line
(`[key]` or `[key, value]`), so it must not emit newlines. The default is JSON.
- **Capabilities on the client**: `HttpKVDriver` defines `setIfAbsent`/`batch` only when the server
supports them, so stores' feature detection (e.g. unique indexes requiring `setIfAbsent`, atomic
index writes using `batch`) behaves as it would locally. `HttpKVDriver.connect()` discovers them via
`/capabilities`. The constructor takes them explicitly (default: all). Without native
`deleteRange` the client falls back to `BaseKVDriver`'s chunked delete.
- **Scan streaming**: the server pulls the driver iterator in chunks that grow from 16 to 256
entries, so short reads (skip-scan re-seeks) don't make it run far ahead. Cancelling the client
iterator cancels the response body, which calls `return()` on the server-side iterator.
- **Optional `headers`** (e.g. auth) and an injectable `fetch` on the client; an optional `basePath` on
the handler.
- The conformance suite runs end-to-end in-process (fetch → handler), over a real `node:http`
socket, and against a minimal server driver with discovered capabilities. A smoke test runs KV
indexes, events and unique-indexed documents over HTTP.
<!-- decisions appended per milestone -->
## 13. Benchmark baselines