59 lines
3.1 KiB
Markdown
59 lines
3.1 KiB
Markdown
# Tasks: drive-mesh-port
|
|
|
|
> Blocked on: `drive-plugin-chunks-port`, at least one `drive-transport-*-port`.
|
|
|
|
## 1. Scaffold
|
|
|
|
- [ ] 1.1 `packages/drive/drive-mesh/` with `package.json` (`@suaveplan/drive-mesh@0.0.0`), `tsconfig.json`, `vitest.config.ts`, `README.md`.
|
|
- [ ] 1.2 Workspace deps: `@suaveplan/drive-plugin-chunks` (interface only), `@suaveplan/error`, `@suaveplan/types`, `@suaveplan/events`, `@suaveplan/streams`, `@opentelemetry/api`, `zod`.
|
|
|
|
## 2. Types
|
|
|
|
- [ ] 2.1 `src/types/mesh.types.ts` — `DriveMeshOptions`, `PeerInfo`, `PeerScore`, `ChunkRequest`, `SchedulerConfig`, `PeerPolicy`.
|
|
- [ ] 2.2 `src/types/transport.types.ts` — `DriveTransport` interface (consumed by mesh, implemented by transport packages): `requestChunk(peerId, fileId, chunkId): AsyncIterable<Uint8Array>`, `advertise(peerId, fileId, bitset)`, `onAdvertisement(handler)`, `peers(): Iterable<PeerInfo>`.
|
|
- [ ] 2.3 `src/error-codes.ts` — `defineCodes("MESH", [...])`.
|
|
|
|
## 3. Peer registry
|
|
|
|
- [ ] 3.1 `src/registry/peer-registry.ts` — `addPeer`, `removePeer`, `peersFor(fileId, chunkId)`, score updates.
|
|
- [ ] 3.2 `src/registry/availability-index.ts` — `BitSet`-per-file index, gzip wire encoding.
|
|
|
|
## 4. Scheduler
|
|
|
|
- [ ] 4.1 `src/scheduler/scheduler.ts` — concurrency cap, racing window, per-chunk timeout, server fallback.
|
|
- [ ] 4.2 `src/scheduler/peer-score.ts` — EMA latency, success/error rates, sig-fail = -∞.
|
|
|
|
## 5. Upload governor
|
|
|
|
- [ ] 5.1 `src/upload/governor.ts` — per-peer concurrency cap, datachannel buffer watermark.
|
|
|
|
## 6. Manifest bootstrap
|
|
|
|
- [ ] 6.1 `src/bootstrap/fetch-manifest.ts` — peer-first then server fallback, sig-verify gate.
|
|
- [ ] 6.2 `src/bootstrap/fetch-file.ts` — resolves manifest → diffs chunks → schedules missing.
|
|
|
|
## 7. DriveMesh class
|
|
|
|
- [ ] 7.1 `src/mesh.ts` — `start`, `stop`, `fetchFile`, `fetchChunks`, event emitter.
|
|
- [ ] 7.2 Lifecycle: opens transports on `start`, closes on `stop`; idempotent.
|
|
|
|
## 8. Spec
|
|
|
|
- [ ] 8.1 `openspec/specs/drive-mesh/spec.md` — `MESH-01` … `MESH-NN` with `**Verified by:**` lines.
|
|
|
|
## 9. Conformance tests
|
|
|
|
- [ ] 9.1 `src/scheduler/scheduler.spec-conformance.test.ts` — racing window, parallel pull, server fallback (`MESH-SCHED-01`, `-02`, `-03`).
|
|
- [ ] 9.2 `src/scheduler/peer-score.spec-conformance.test.ts` — bad-sig blocks peer, score updates (`MESH-SCORE-01`, `-02`).
|
|
- [ ] 9.3 `src/registry/availability-index.spec-conformance.test.ts` — bitset advertise/receive, gzip round-trip (`MESH-GOSSIP-01`).
|
|
- [ ] 9.4 `src/bootstrap/fetch-manifest.spec-conformance.test.ts` — peer-first then fallback (`MESH-BOOTSTRAP-01`).
|
|
- [ ] 9.5 `src/bootstrap/fetch-file.spec-conformance.test.ts` — end-to-end happy path with fake transports (`MESH-FETCH-FILE-01`).
|
|
- [ ] 9.6 `src/upload/governor.spec-conformance.test.ts` — per-peer cap, watermark pause (`MESH-UPLOAD-01`).
|
|
- [ ] 9.7 `src/error-codes.spec-conformance.test.ts` — frozen registry (`MESH-CODES-01`).
|
|
|
|
## 10. Verify
|
|
|
|
- [ ] 10.1 `bunx turbo lint typecheck test --filter=@suaveplan/drive-mesh` green.
|
|
- [ ] 10.2 `bunx turbo test:coverage --filter=@suaveplan/drive-mesh` 100/100/100/100.
|
|
- [ ] 10.3 `bun scripts/openspec-conformance.ts @suaveplan/drive-mesh` PASS.
|